diff --git a/.github/workflows/run_test.yaml b/.github/workflows/run_test.yaml index e7bd13a3d..008f483eb 100644 --- a/.github/workflows/run_test.yaml +++ b/.github/workflows/run_test.yaml @@ -4,6 +4,7 @@ on: push: branches: - master + - ombott-dev pull_request: branches: - master @@ -14,7 +15,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.7, 3.8, 3.9] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v2 @@ -22,16 +23,13 @@ jobs: uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - - name: Install dependencies + - name: Install Everything run: | sudo apt-get install memcached libmemcached-tools python -m pip install --upgrade pip - python3 -m pip install -r requirements.txt - python3 -m pip install -r test-requirements.txt - - name: build - run: | - python3 setup.py install - - name: Test with pytest + ls -l + python -m pip install -e ./ + python -m pip install -r test-requirements.txt + - name: Test run: | python3 -m pytest --cov=py4web --cov-report html:cov.html -v -s tests/ - diff --git a/.gitignore b/.gitignore index be3495bf1..12a89d84e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ *.1 *.bak *.bak2 +.envrc *.svn *.w2p *.class @@ -22,9 +23,9 @@ Thumbs.db ./*.zip apps/_documentation/static/*/*.pdf apps/_documentation/static/*/*.epub -apps/* +apps*/*/* !apps/todo/* -!apps/examples/* +!apps/showcase/* !apps/_dashboard/* !apps/_scaffold/* !apps/_minimal/* @@ -32,7 +33,7 @@ apps/* !apps/_default/* !apps/_documentation/* !apps/superheroes/* -!apps/myfeed/* +!apps/fadebook/* apps/*/databases/* apps/*/uploads/* **/*.py[co] @@ -43,6 +44,11 @@ deployment_tools/gae/lib deployment_tools/gae/apps deployment_tools/gae/requirements.txt py4web/assets +pyproject.toml +poetry.lock workspace.code-workspace venv docs/_build +py4web.egg-info/ +build/ +tmp/ diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 4944b5857..000000000 --- a/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -dist: bionic -sudo: required -cache: pip -language: python - -python: - - "3.6" - - "3.7" - - "3.8" - -script: - - make test diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..d813ccdc7 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Python: py4web", + "type": "python", + "request": "launch", + "program": "py4web.py", + "args": [ + "run", "--errorlog=:stdout", "-L", "20", + "apps" + ], + "console": "integratedTerminal", + "justMyCode": true + }, + { + "name": "Python: File", + "type": "python", + "request": "launch", + "program": "${file}", + "justMyCode": true + } + ] +} diff --git a/Makefile b/Makefile index 7af45d886..753b97a86 100644 --- a/Makefile +++ b/Makefile @@ -1,45 +1,40 @@ -.PHONY: clean build docs clean-assets assets install test deploy -asset-apps := _dashboard _default _scaffold _minimal _documentation examples +.PHONY: clean docs clean-assets assets tests setup run build deploy +asset-apps := _dashboard _default _scaffold _minimal _documentation showcase asset-zips := $(asset-apps:%=py4web/assets/py4web.app.%.zip) clean: find . -name '*.pyc' -delete find . -name '*~' -delete find . -name '#*' -delete rm -rf dist/* - python3 setup.py clean -docs: - cd docs; ./updateDocs.sh all -clean-assets: +clean-assets: clean rm -f py4web/assets/* mkdir -p py4web/assets assets: clean-assets $(asset-zips) py4web/assets/py4web.app.%.zip: apps/% cd $< && find . | \ - egrep "\.(py|html|css|js|png|jpg|gif|json|yaml|md|txt|mm)$$" | \ + egrep "\.(py|html|css|js|png|jpg|gif|json|yaml|md|txt|mm|ico)$$" | \ zip -@ $(addprefix ../../, $@) -build: clean assets - python3 setup.py build -install: build - python3 setup.py install -test: build - python3 -m pip install -r requirements.txt - python3 -m pip install -r test-requirements.txt - python3 -m pytest --cov=py4web --cov-report html:cov.html -v -s tests/ -push: test - git push origin master -deploy: test - python2.7 setup.py sdist - twine upload dist/* +docs: + pip install -U -r docs/requirements.txt + cd docs; ./updateDocs.sh html +tests: + pip install -U -r test-requirements.txt + python -m pytest --cov=py4web --cov-report html:cov.html -v tests/ setup: - ./py4web.py setup apps - ./py4web.py set_password + python py4web.py setup apps + python py4web.py set_password run: - ./py4web.py run -p password.txt apps + python py4web.py run -p password.txt apps -L20 upgrade-utils: find apps -name "utils.js" -exec cp apps/_dashboard/static/js/utils.js {} \; -upgrade-axios: - curl -L https://unpkg.com/axios/dist/axios.min.js > apps/_dashboard/static/js/axios.min.js - find apps -name "axios.min.js" -exec cp apps/_dashboard/static/js/axios.min.js {} \; upgrade-vue: curl -L https://unpkg.com/vue/dist/vue.min.js > apps/_dashboard/static/js/vue.min.js find apps -name "vue.min.js" -exec cp apps/_dashboard/static/js/vue.min.js {} \; +build: clean assets + pip install --upgrade build + pip install --upgrade twine + python -m build +deploy: build + python -m twine upload dist/* +install: + python -m pip install . diff --git a/apps/examples/static/components-bulma/starrater/starrater.css b/README.md similarity index 100% rename from apps/examples/static/components-bulma/starrater/starrater.css rename to README.md diff --git a/README.rst b/README.rst index 32aa56ca8..a133d70ab 100644 --- a/README.rst +++ b/README.rst @@ -1,14 +1,13 @@ -What is py4web? -=============== - -.. image:: https://travis-ci.com/web2py/py4web.svg?branch=master - :target: https://travis-ci.com/web2py/py4web +PY4WEB +====== .. image:: https://img.shields.io/pypi/v/py4web.svg :target: https://pypi.org/project/py4web/ -PY4WEB is a web framework for rapid development of efficient database driven web applications. It is an evolution of the popular web2py framework but much faster and slicker. +.. image:: https://github.com/web2py/py4web/actions/workflows/run_test.yaml/badge.svg + :target: https://github.com/web2py/py4web/actions/workflows/run_test.yaml +PY4WEB is a web framework for the rapid development of efficient database driven web applications. It is an evolution of the popular web2py framework but much faster and slicker. - Main web site: https://py4web.com - GitHub repository: https://github.com/web2py/py4web @@ -16,43 +15,42 @@ PY4WEB is a web framework for rapid development of efficient database driven web - License: `BSD-3-Clause License `__ - Screenshots ########### Running py4web -.. image:: docs/images/first_run.png +.. image:: https://py4web.com/_documentation/static/en/_images/first_run.png The main Dashboard -.. image:: docs/images/dashboard_main.png +.. image:: https://py4web.com/_documentation/static/en/_images/dashboard_main.png Editing a file in the Dashboard -.. image:: docs/images/dashboard_edit.png +.. image:: https://py4web.com/_documentation/static/en/_images/dashboard_edit.png Editing a database in the Dashboard -.. image:: docs/images/dashboard_restapi.png +.. image:: https://py4web.com/_documentation/static/en/_images/dashboard_restapi.png Installation ############ -PY4WEB runs fine on Windows, MacOS and Linux. There are many installation procedures (see the official documentation for details) but only two of them are summarized here. +PY4WEB runs fine on Windows, MacOS and Linux. There are many installation procedures `(see the official documentation for details) `__ but only two of them are summarized here. The **simplest way** to install py4web is using binaries, but it's only available for Windows and MacOS. It's meant especially for newbies or students, because it does not require Python pre-installed on your system nor administrative rights. You just need to download the latest Windows or MacOS ZIP file from `this external repository `__. Unzip it on a local folder and open a command line there. Finally run the commands (omit './' if you're using Windows) .. code:: bash - ./py4web-start set_password - ./py4web-start run apps + ./py4web set_password + ./py4web run apps -The **standard installation procedure** for py4web on Windows, MacOS and Linux is using pip. Its only prerequisite is Python 3.6+. +The **standard installation procedure** for py4web on Windows, MacOS and Linux is using pip. Its only prerequisite is Python 3.7+. .. code:: bash @@ -78,29 +76,42 @@ Launch Arguments # py4web run -h - Usage: py4web.py run [OPTIONS] [APPS_FOLDER] + Usage: py4web.py run [OPTIONS] APPS_FOLDER Run all the applications on apps_folder Options: - -Y, --yes No prompt, assume yes to questions [default: - False] - -H, --host TEXT Host name [default: 127.0.0.1] - -P, --port INTEGER Port number [default: 8000] - -p, --password_file TEXT File for the encrypted password [default: - password.txt] - -s, --server [default|wsgiref|tornado|gunicorn|gevent|waitress| - geventWebSocketServer|wsgirefThreadingServer|rocketServer] - server to use [default: default] - -w, --number_workers INTEGER Number of workers [default: 0] - -d, --dashboard_mode TEXT Dashboard mode: demo, readonly, full, - none [default: full] - --watch [off|sync|lazy] Watch python changes and reload apps - automatically, modes: off, sync, lazy - [default: lazy] - --ssl_cert PATH SSL certificate file for HTTPS - --ssl_key PATH SSL key file for HTTPS - -help, -h, --help Show this message and exit. + -Y, --yes No prompt, assume yes to questions + -H, --host TEXT Host listening IP [default: 127.0.0.1] + -P, --port INTEGER Port number [default: 8000] + -A, --app_names TEXT List of apps to run, comma separated (all if + omitted or empty) + -p, --password_file TEXT File for the encrypted password [default: + password.txt] + -Q, --quiet Suppress server output + -R, --routes Write apps routes to file + -s, --server [default|wsgiref|tornado|gunicorn|gevent|waitress|gunicorn|gunicornGevent| + gevent|geventWebSocketServer|geventWs| + wsgirefThreadingServer|wsgiTh|rocketServer] + Web server to use + -w, --number_workers INTEGER Number of workers [default: 0] + -d, --dashboard_mode TEXT Dashboard mode: demo, readonly, full, none + [default: full] + --watch [off|sync|lazy] Watch python changes and reload apps + automatically, modes: off, sync, lazy + [default: lazy] + --ssl_cert PATH SSL certificate file for HTTPS + --ssl_key PATH SSL key file for HTTPS + --errorlog TEXT Where to send error logs + (:stdout|:stderr|tickets_only|{filename}) + [default: :stderr] + -L, --logging_level INTEGER The log level (0 - 50) [default: 30 + (=WARNING)] + -D, --debug Debug switch + -U, --url_prefix TEXT Prefix to add to all URLs in and out + -m, --mode TEXT default or development [default: default] + -h, -help, --help Show this message and exit. + @@ -124,13 +135,14 @@ Tell me more ############ - it is 10-20x faster than web2py -- python3.6+ only +- python3.7+ only - uses https://github.com/web2py/pydal (same DAL as web2py) for database connection - uses the same validators as web2py (they are in pyDAL) - uses `yatl `__ (same as web2py but defaults to [[...]] instead of {{...}} delimiters) and `Renoir `__ for html templates - uses the very similar html helpers to web2py (A, DIV, SPAN, etc.) - uses https://github.com/web2py/pluralize for i18n and pluralization -- request, response, abort are from https://bottlepy.org +- request, response, abort are from https://bottlepy.org, using `ombott (One More BOTTle) `__, + which is a fast bottlepy spin-off - HTTP and redirect are our own objects - like web2py, it supports static asset management /{appname}/static/_0.0.0/{path} - implements sessions in cookies (jwt encrypted), db, memcache, redis and custom @@ -173,4 +185,5 @@ Many thanks to everyone who has contributed to the project, and especially: - `sugizo `__ - `valq7711 `__ - `Kevin Keller `__ -- `Sam de Alfaro `__ (logo design) +- `Krzysztof Socha `__ +- Sam de Alfaro sam@dealfaro.com (logo design) diff --git a/apps/_dashboard/__init__.py b/apps/_dashboard/__init__.py index 035b1c54f..fcab85dce 100644 --- a/apps/_dashboard/__init__.py +++ b/apps/_dashboard/__init__.py @@ -2,6 +2,7 @@ import copy import datetime import io +import json import os import shutil import subprocess @@ -10,21 +11,14 @@ import zipfile import requests +from pydal.restapi import Policy, RestAPI from pydal.validators import CRYPT import py4web -from py4web import ( - HTTP, - URL, - Translator, - __version__, - abort, - action, - redirect, - request, - response, -) -from py4web.core import Fixture, Reloader, Session, dumps, error_logger, safely +from py4web import (HTTP, URL, Translator, __version__, abort, action, + redirect, request, response) +from py4web.core import (DAL, Fixture, Reloader, Session, dumps, error_logger, + safely) from py4web.utils.factories import ActionFactory from .diff2kryten import diff2kryten @@ -32,6 +26,7 @@ MODE = os.environ.get("PY4WEB_DASHBOARD_MODE", "none") FOLDER = os.environ["PY4WEB_APPS_FOLDER"] +APP_NAMES = os.environ.get("PY4WEB_APP_NAMES") APP_FOLDER = os.path.dirname(__file__) T_FOLDER = os.path.join(APP_FOLDER, "translations") T = Translator(T_FOLDER) @@ -39,11 +34,29 @@ session = Session() +def make_safe(db): + def make_safe_field(func): + def wrapper(): + try: + return func() + except Exception as exp: + print(exp) + print("Warning: _dashboard trying to access a forbidden method of app") + return None + + for table in db: + for field in table: + if callable(field.default): + field.default = make_safe_field(field.default) + if callable(field.update): + field.update = make_safe_field(field.update) + + def run(command, project): """for runing git commands inside an app (project)""" return subprocess.check_output( command.split(), cwd=os.path.join(FOLDER, project) - ).decode() + ).decode(errors="ignore") def get_commits(project): @@ -86,7 +99,7 @@ def __init__(self, session): self.__prerequisites__ = [session] self.session = session - def on_request(self): + def on_request(self, context): user = self.session.get("user") if not user or not user.get("id"): abort(403) @@ -158,24 +171,30 @@ def info(): @session_secured def routes(): """Returns current registered routes""" - return {"payload": Reloader.ROUTES, "status": "success"} + sorted_routes = { + name: list(sorted(routes, key=lambda route: route["rule"])) + for name, routes in Reloader.ROUTES.items() + } + return {"payload": sorted_routes, "status": "success"} @action("apps") @session_secured def apps(): """Returns a list of installed apps""" apps = os.listdir(FOLDER) + exposed_names = APP_NAMES and APP_NAMES.split(",") apps = [ {"name": app, "error": Reloader.ERRORS.get(app)} for app in apps if os.path.isdir(os.path.join(FOLDER, app)) and not app.startswith("__") and not app.startswith(".") + and (not exposed_names or app in exposed_names) ] apps.sort(key=lambda item: item["name"]) return {"payload": apps, "status": "success"} - @action("delete_app/", method="POST") + @action("delete_app/", method="POST") @session_secured def delete_app(name): """delete the app""" @@ -190,10 +209,10 @@ def delete_app(name): return {"status": "success", "payload": "Deleted"} return {"status": "success", "payload": "App does not exist"} - @action("new_file//", method="POST") + @action("new_file//", method="POST") @session_secured def new_file(name, file_name): - """asign an sanitize inputs""" + """creates a new file""" path = os.path.join(FOLDER, name) form = request.json if not os.path.exists(path): @@ -250,7 +269,7 @@ def walk(path): def load(path): """Loads a text file""" path = safe_join(FOLDER, path) or abort() - content = open(path, "rb").read().decode("utf8") + content = open(path, "rb").read().decode("utf8", errors="ignore") return {"payload": content, "status": "success"} @action("load_bytes/") @@ -265,8 +284,10 @@ def load_bytes(path): def packed(path): """Packs an app""" appname = path.split(".")[-2] - appname = sanitize(appname) + # some security app_dir = os.path.join(FOLDER, appname) + if "/" in path or appname.startswith(".") or not os.path.exists(app_dir): + raise HTTP(400) store = io.BytesIO() zip = zipfile.ZipFile(store, mode="w", compression=zipfile.ZIP_DEFLATED) for root, dirs, files in os.walk(app_dir, topdown=False): @@ -277,7 +298,6 @@ def packed(path): ): filename = os.path.join(root, name) short = filename[len(app_dir + os.path.sep) :] - print("added", filename, short) zip.write(filename, short) zip.close() data = store.getvalue() @@ -316,12 +336,12 @@ def api(path): # this is not final, requires pydal 19.5 args = path.split("/") app_name = args[0] - from py4web.core import Reloader, DAL - from pydal.restapi import RestAPI, Policy - if MODE != "full": raise HTTP(403) - module = Reloader.MODULES[app_name] + module = Reloader.MODULES.get(app_name) + + if not module: + raise HTTP(404) def url(*args): return request.url + "/" + "/".join(args) @@ -333,6 +353,7 @@ def url(*args): def tables(name): db = getattr(module, name) + make_safe(db) return [ { "name": t._tablename, @@ -349,6 +370,7 @@ def tables(name): } elif len(args) > 2 and args[1] in databases: db = getattr(module, args[1]) + make_safe(db) id = args[3] if len(args) == 4 else None policy = Policy() for table in db: @@ -365,7 +387,9 @@ def tables(name): table._tablename, "POST", authorize=True, fields=table.fields ) policy.set(table._tablename, "DELETE", authorize=True) - data = action.uses(db, T)( + + # must wrap into action uses to make sure it closes transactions + data = action.uses(db)( lambda: RestAPI(db, policy)( request.method, args[2], id, request.query, request.json ) @@ -376,6 +400,7 @@ def tables(name): response.status = data["code"] return data + if MODE == "full": @action("reload") @@ -384,7 +409,7 @@ def tables(name): def reload(name=None): """Reloads installed apps""" Reloader.import_app(name) if name else Reloader.import_apps() - return "ok" + return {"status": "ok"} @action("save/", method="POST") @session_secured @@ -393,7 +418,8 @@ def save(path, reload_app=True): app_name = path.split("/")[0] path = safe_join(FOLDER, path) or abort() with open(path, "wb") as myfile: - myfile.write(request.body.read()) + body = json.load(request.body) + myfile.write(body.encode("utf8")) if reload_app: Reloader.import_app(app_name) return {"status": "success"} @@ -463,7 +489,6 @@ def new_app(): if process.returncode != 0: abort(500) elif form["type"] == "upload": - print(request.files.keys()) prepare_target_dir(form, target_dir) source_stream = io.BytesIO(base64.b64decode(form["file"])) zfile = zipfile.ZipFile(source_stream, "r") @@ -478,7 +503,10 @@ def new_app(): data = data.replace("", str(uuid.uuid4())) with open(settings, "w") as fp: fp.write(data) - Reloader.import_app(app_name) + try: + Reloader.import_app(app_name) + except Exception: + pass return {"status": "success"} # @@ -530,16 +558,22 @@ def gitshow(project, commit): patch = run("git show " + commit + opt, project) return diff2kryten(patch) + # handle internationalization & pluralization files # + @action("translations/", method="GET") @action.uses(Logged(session), "translations.html") def translations(name): """returns a json with all translations for all languages""" - t = Translator(os.path.join(FOLDER, name, "translations")) + folder = os.path.join(FOLDER, name, "translations") + if not os.path.exists(folder): + os.makedirs(folder) + t = Translator(folder) return t.languages + @action("api/translations/", method="GET") @action.uses(Logged(session)) def get_translations(name): @@ -547,6 +581,7 @@ def get_translations(name): t = Translator(os.path.join(FOLDER, name, "translations")) return t.languages + @action("api/translations/", method="POST") @action.uses(Logged(session)) def post_translations(name): @@ -566,4 +601,4 @@ def update_translations(name): """find all T(...) decorated strings in the code and returns them""" app_folder = os.path.join(FOLDER, name) strings = Translator.find_matches(app_folder) - return {'strings': strings} + return {"strings": strings} diff --git a/apps/_dashboard/diff2kryten.py b/apps/_dashboard/diff2kryten.py index 8ce9332bc..22866c692 100644 --- a/apps/_dashboard/diff2kryten.py +++ b/apps/_dashboard/diff2kryten.py @@ -1,6 +1,5 @@ import sys - # Note, when changing the Highlight.js css, # the background color of .file .diff should match the # background in the .hljs class in gitlog.min.css diff --git a/apps/_dashboard/static/components/mtable.html b/apps/_dashboard/static/components/mtable.html index ed1b7b26b..5a69f5455 100644 --- a/apps/_dashboard/static/components/mtable.html +++ b/apps/_dashboard/static/components/mtable.html @@ -2,7 +2,7 @@ - -``TEXTAREA`` -~~~~~~~~~~~~ - -This helper makes a ```` tag. - -.. code:: python - - >>> print(TEXTAREA('', XML('world'), _class='test', - ... _cols="40", _rows="10")) - - -``TH`` -~~~~~~ - -This is used instead of ``TD`` in table headers. - -.. code:: python - - >>> print(TH('', XML('world'), _class='test', _id=0)) - - -``THEAD`` -~~~~~~~~~ - -This is used to tag table header rows. - -.. code:: python - - >>> print(THEAD(TR(TH('')), _class='test', _id=0)) - - -``TITLE`` -~~~~~~~~~ - -This is used to tag the title of a page in an HTML header. - -.. code:: python - - >>> print(TITLE('', XML('world'))) - <hello><strong>world</strong> - -``TT`` -~~~~~~ - -Tags text as typewriter (monospaced) text. - -.. code:: python - - >>> print(TT('', XML('world'), _class='test', _id=0)) - <hello>world - -``UL`` -~~~~~~ - -It stands for unordered list. The list should contain LI tags. - -.. code:: python - - >>> print(UL(LI(''), LI(XML('world')), _class='test', _id=0)) -
  • <hello>
  • world
- -``URL`` -~~~~~~~ - -.. FIXME: maybe this section should go in another chapter - -The URL helper is not part of yatl package, instead it is provided by py4web. - -Custom helpers --------------- - -.. _TAG: - -``TAG`` -~~~~~~~ - -Sometimes you need to generate **custom XML tags***. For this purpose py4web -provides ``TAG``, a universal tag generator. - -:: - - [[=TAG.name('a', 'b', _c='d')]] - -generates the following XML: - -.. code:: xml - - ab - -Arguments “a”, “b”, and “d” are automatically escaped; use the ``XML`` -helper to suppress this behavior. Using ``TAG`` you can generate -HTML/XML tags not already provided by the API. TAGs can be nested, and -are serialized with ``str().`` An equivalent syntax is: - -:: - - [[=TAG['name']('a', 'b', _c='d')]] - -Self-closing tags can be generated with the TAG helper. The tag name -must end with a “/”. - -:: - - [[=TAG['link/'](_href='http://py4web.com')]] - -generates the following XML: - -.. code:: xml - - - -Notice that ``TAG`` is an object, and ``TAG.name`` or ``TAG['name']`` is -a function that returns an helper instance. - -``BEAUTIFY`` -~~~~~~~~~~~~ - -``BEAUTIFY`` is used to build HTML representations of compound objects, -including lists, tuples and dictionaries: - -:: - - [[=BEAUTIFY({"a": ["hello", STRONG("world")], "b": (1, 2)})]] - -``BEAUTIFY`` returns an XML-like object serializable to XML, with a nice -looking representation of its constructor argument. In this case, the -XML representation of: - -.. code:: python - - {"a": ["hello", STRONG("world")], "b": (1, 2)} - -will render as: - -.. code:: html - -
- + @@ -24,24 +24,24 @@
{{field.label}} - - + + True False None - - - - - - - - - - - + + + + + + + + + + + - -It defines, stores and returns a ``Table`` object called “person” -containing a field (column) “name”. This object can also be accessed via -``db.person``, so you do not need to catch the value returned by -define_table. - -``id``: Notes about the primary key -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Do not declare a field called “id”, because one is created by py4web -anyway. Every table has a field called “id” by default. It is an -auto-increment integer field (usually starting at 1) used for -cross-reference and for making every record unique, so “id” is a primary -key. (Note: the id counter starting at 1 is back-end specific. For -example, this does not apply to the Google App Engine NoSQL.) - -Optionally you can define a field of ``type='id'`` and py4web will use -this field as auto-increment id field. This is not recommended except -when accessing legacy database tables which have a primary key under a -different name. With some limitation, you can also use different primary -keys using the ``primarykey`` parameter. - -``plural`` and ``singular`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -As pyDAL is a general DAL, it includes plural and singular attributes to -refer to the table names so that external elements can use the proper -name for a table. - -``redefine`` -~~~~~~~~~~~~ - -Tables can be defined only once but you can force py4web to redefine an -existing table: - -.. code:: python - - db.define_table('person', Field('name')) - db.define_table('person', Field('name'), redefine=True) - -The redefinition may trigger a migration if table definition changes. - -``format``: Record representation -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It is optional but recommended to specify a format representation for -records with the ``format`` parameter. - -.. code:: python - - db.define_table('person', Field('name'), format='%(name)s') - -or - -.. code:: python - - db.define_table('person', Field('name'), format='%(name)s %(id)s') - -or even more complex ones using a function: - -.. code:: python - - db.define_table('person', Field('name'), - format=lambda r: r.name or 'anonymous') - -The format attribute will be used for two purposes: - -- To represent referenced records in select/option drop-downs. -- To set the ``db.othertable.otherfield.represent`` attribute for all fields - referencing this table. This means that the ``Form`` constructor will - not show references by id but will use the preferred format - representation instead. - -``rname``: Real name -~~~~~~~~~~~~~~~~~~~~ - -``rname`` sets a database backend name for the table. This makes the -py4web table name an alias, and ``rname`` is the real name used when -constructing the query for the backend. To illustrate just one use, -``rname`` can be used to provide MSSQL fully qualified table names -accessing tables belonging to other databases on the server: -``rname = 'db1.dbo.table1'`` - -``primarykey``: Support for legacy tables -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -``primarykey`` helps support legacy tables with existing primary keys, -even multi-part. See `Legacy databases and keyed tables`_. - -``migrate``, ``fake_migrate`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -``migrate`` sets migration options for the table. Refer to -`Migrations`_ for details. - -``table_class`` -~~~~~~~~~~~~~~~ - -If you define your own table class as a sub-class of -pydal.objects.Table, you can provide it here; this allows you to extend -and override methods. Example: - -.. code:: python - - from pydal.objects import Table - - class MyTable(Table): - ... - - db.define_table(..., table_class=MyTable) - -``sequence_name`` -~~~~~~~~~~~~~~~~~ - -The name of a custom table sequence (if supported by the database). Can -create a SEQUENCE (starting at 1 and incrementing by 1) or use this for -legacy tables with custom sequences. - - Note that when necessary, py4web will create sequences automatically - by default. - -``trigger_name`` -~~~~~~~~~~~~~~~~ - -Relates to ``sequence_name``. Relevant for some backends which do not -support auto-increment numeric fields. - -``polymodel`` -~~~~~~~~~~~~~ - -For use with Google App Engine. - -``on_define`` -~~~~~~~~~~~~~ - -``on_define`` is a callback triggered when a lazy_table is instantiated, -although it is called anyway if the table is not lazy. This allows -dynamic changes to the table without losing the advantages of delayed -instantiation. - -Example: - -.. code:: python - - db = DAL(lazy_tables=True) - db.define_table('person', - Field('name'), - Field('age', 'integer'), - on_define=lambda table: [ - table.name.set_attributes(requires=IS_NOT_EMPTY(), default=''), - table.age.set_attributes(requires=IS_INT_IN_RANGE(0, 120), default=30) ]) - -Note this example shows how to use ``on_define`` but it is not actually -necessary. The simple ``requires`` values could be added to the Field -definitions and the table would still be lazy. However, ``requires`` -which take a Set object as the first argument, such as IS_IN_DB, will -make a query like ``db.sometable.somefield == some_value`` which would -cause ``sometable`` to be defined early. This is the situation saved by -``on_define``. - -Adding attributes to fields and tables -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you need to add custom attributes to fields, you can simply do this: -``db.table.field.extra = {}`` - -“extra” is not a keyword; it’s a custom attribute now attached to the -field object. You can do it with tables too but they must be preceded by -an underscore to avoid naming conflicts with fields: - -.. code:: python - - db.table._extra = {} - -Legacy databases and keyed tables -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -py4web can connect to legacy databases under some conditions. - -The easiest way is when these conditions are met: - -- Each table must have a unique auto-increment integer field called “id”. -- Records must be referenced exclusively using the “id” field. - -When accessing an existing table, i.e., a table not created by py4web in -the current application, always set ``migrate=False``. - -If the legacy table has an auto-increment integer field but it is not -called “id”, py4web can still access it but the table definition must -declare the auto-increment field with ‘id’ type (that is using -``FIeld('...', 'id')``). - -Finally if the legacy table uses a primary key that is not an -auto-increment id field it is possible to use a “keyed table”, for -example: - -.. code:: python - - db.define_table('account', - Field('accnum', 'integer'), - Field('acctype'), - Field('accdesc'), - primarykey=['accnum', 'acctype'], - migrate=False) - -- ``primarykey`` is a list of the field names that make up the primary - key. -- All primarykey fields have a ``NOT NULL`` set even if not specified. -- Keyed tables can only reference other keyed tables. -- Referencing fields must use the ``reference tablename.fieldname`` - format. -- The ``update_record`` function is not available for Rows of keyed - tables. - -.. - - Currently keyed tables are only supported for DB2, MSSQL, Ingres and - Informix, but others engines will be added. - -At the time of writing, we cannot guarantee that the ``primarykey`` -attribute works with every existing legacy table and every supported -database backend. For simplicity, we recommend, if possible, creating a -database view that has an auto-increment id field. - - -Field constructor ------------------ - -These are the default values of a Field constructor: - -.. code:: python - - Field(fieldname, type='string', length=None, default=DEFAULT, - required=False, requires=DEFAULT, - ondelete='CASCADE', notnull=False, unique=False, - uploadfield=True, widget=None, label=None, comment=None, - writable=True, readable=True, searchable=True, listable=True, - update=None, authorize=None, autodelete=False, represent=None, - uploadfolder=None, uploadseparate=None, uploadfs=None, - compute=None, filter_in=None, filter_out=None, - custom_qualifier=None, map_none=None, rname=None) - -where DEFAULT is a special value used to allow the value None for a -parameter. - -Not all of them are relevant for every field. ``length`` is relevant -only for fields of type “string”. ``uploadfield``, ``authorize``, and -``autodelete`` are relevant only for fields of type “upload”. -``ondelete`` is relevant only for fields of type “reference” and -“upload”. - -- ``length`` sets the maximum length of a “string”, “password” or - “upload” field. If ``length`` is not specified a default value is - used but the default value is not guaranteed to be backward - compatible. *To avoid unwanted migrations on upgrades, we recommend - that you always specify the length for string, password and upload - fields.* -- ``default`` sets the default value for the field. The default value - is used when performing an insert if a value is not explicitly - specified. It is also used to pre-populate forms built from the table - using ``Form``. Note, rather than being a fixed value, the default - can instead be a function (including a lambda function) that returns - a value of the appropriate type for the field. In that case, the - function is called once for each record inserted, even when multiple - records are inserted in a single transaction. -- ``required`` tells the DAL that no insert should be allowed on this - table if a value for this field is not explicitly specified. -- ``requires`` is a **validator** or a list of validators. This is not used - by the DAL, but instead it is used by ``Form`` (this will be explained - better on the :ref:`Forms` chapter). The default validators for - the given types are shown in the next section - :ref:`Field types and validators`. - - .. note:: - - while ``requires=...`` is enforced at the level of forms, - ``required=True`` is enforced at the level of the DAL (insert). In - addition, ``notnull``, ``unique`` and ``ondelete`` are enforced at - the level of the database. While they sometimes may seem redundant, - it is important to maintain the distinction when programming with the - DAL. - -- ``rname`` provides the field with a “real name”, a name for the field - known to the database adapter; when the field is used, it is the - rname value which is sent to the database. The py4web name for the - field is then effectively an alias. - -- ``ondelete`` translates into the “ON DELETE” SQL statement. By - default it is set to “CASCADE”. This tells the database that when it - deletes a record, it should also delete all records that refer to it. - To disable this feature, set ``ondelete`` to “NO ACTION” or “SET - NULL”. - -- ``notnull=True`` translates into the “NOT NULL” SQL statement. It - prevents the database from inserting null values for the field. - -- ``unique=True`` translates into the “UNIQUE” SQL statement and it - makes sure that values of this field are unique within the table. It - is enforced at the database level. - -- ``uploadfield`` applies only to fields of type “upload”. A field of - type “upload” stores the name of a file saved somewhere else, by - default on the filesystem under the application “uploads/” folder. If - ``uploadfield`` is set to True, then the file is stored in a blob - field within the same table and the value of ``uploadfield`` is the - name of the blob field. This will be discussed in more detail later - in `More on uploads`_. -- ``uploadfolder`` must be set to a location where to store uploaded files. - The scaffolding app defines a folder ``settings.UPLOAD_FOLDER`` - which points to ``apps/{app_name}/uploads`` so you can - set, for example, ``Field(... uploadfolder=settings.UPLOAD_FOLDER)``. -- ``uploadseparate`` if set to True will upload files under different - subfolders of the *uploadfolder* folder. This is optimized to avoid - too many files under the same folder/subfolder. ATTENTION: You cannot - change the value of ``uploadseparate`` from True to False without - breaking links to existing uploads. pydal either uses the separate - subfolders or it does not. Changing the behavior after files have - been uploaded will prevent pydal from being able to retrieve those - files. If this happens it is possible to move files and fix the - problem but this is not described here. -- ``uploadfs`` allows you specify a different file system where to - upload files, including an Amazon S3 storage or a remote SFTP - storage. - -.. - - You need to have PyFileSystem installed for this to work. - ``uploadfs`` must point to PyFileSystem. - -- ``autodelete`` determines if the corresponding uploaded file should - be deleted when the record referencing the file is deleted. For - “upload” fields only. However, records deleted by the database itself - due to a CASCADE operation will not trigger py4web’s autodelete. - -- ``label`` is a string (or a helper or something that can be - serialized to a string) that contains the label to be used for this - field in auto-generated forms. - serialized to a string) that contains a comment associated with this - field, and will be displayed to the right of the input field in the - autogenerated forms. -- ``writable`` declares whether a field is writable in forms. -- ``readable`` declares whether a field is readable in forms. If a - field is neither readable nor writable, it will not be displayed in - create and update forms. -- ``update`` contains the default value for this field when the record - is updated. -- ``compute`` is an optional function. If a record is inserted or - updated, the compute function will be executed and the field will be - populated with the function result. The record is passed to the - compute function as a ``dict``, and the dict will not include the - current value of that, or any other compute field. -- ``authorize`` can be used to require access control on the - corresponding field, for “upload” fields only. It will be discussed - more in detail in the context of Authentication and Authorization. -- ``represent`` can be None or can point to a function that takes a - field value and returns an alternate representation for the field - value. Examples: - -Note not all the attributes are thread safe and most of them -should only be set globally for an app. The following are guaranteed to be -thread safe and be set/reset in any action: -``default``, ``update``, ``readable``, ``writable``, ``requires``. - - -Field types and validators -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -========================== ================================================== -Type Default validators -========================== ================================================== -``string`` ``IS_LENGTH(length)`` default length is 512 -``text`` ``IS_LENGTH(length)`` default length is 32768 -``blob`` ``None`` default length is 2**31 (2 GiB) -``boolean`` ``None`` -``integer`` ``IS_INT_IN_RANGE(-2**31, 2**31)`` -``double`` ``IS_FLOAT_IN_RANGE(-1e100, 1e100)`` -``decimal(n,m)`` ``IS_DECIMAL_IN_RANGE(-10**10, 10**10)`` -``date`` ``IS_DATE()`` -``time`` ``IS_TIME()`` -``datetime`` ``IS_DATETIME()`` -``password`` ``IS_LENGTH(length)`` default length is 512 -``upload`` ``None`` default length is 512 -``reference
`` ``IS_IN_DB(db, table.field, format)`` -``list:string`` ``None`` -``list:integer`` ``None`` -``list:reference
`` ``IS_IN_DB(db, table._id, format, multiple=True)`` -``json`` ``IS_EMPTY_OR(IS_JSON())`` default length is 512 -``bigint`` ``IS_INT_IN_RANGE(-2**63, 2**63)`` -``big-id`` ``None`` -``big-reference`` ``None`` -========================== ================================================== - -Decimal requires and returns values as ``Decimal`` objects, as defined -in the Python ``decimal`` module. SQLite does not handle the ``decimal`` -type so internally we treat it as a ``double``. The (n,m) are the number -of digits in total and the number of digits after the decimal point -respectively. - -The ``big-id`` and, ``big-reference`` are only supported by some of the -database engines and are experimental. They are not normally used as -field types unless for legacy tables, however, the DAL constructor has a -``bigint_id`` argument that when set to ``True`` makes the ``id`` fields -and ``reference`` fields ``big-id`` and ``big-reference`` respectively. - -The ``list:`` fields are special because they are designed to take -advantage of certain denormalization features on NoSQL (in the case of -Google App Engine NoSQL, the field types ``ListProperty`` and -``StringListProperty``) and back-port them all the other supported -relational databases. On relational databases lists are stored as a -``text`` field. The items are separated by a ``|`` and each ``|`` in -string item is escaped as a ``||``. They are discussed in -:ref:`list_type and contains`. - -The ``json`` field type is pretty much explanatory. It can store any -JSON serializable object. It is designed to work specifically for -MongoDB and backported to the other database adapters for portability. - -``blob`` fields are also special. By default, binary data is encoded in -base64 before being stored into the actual database field, and it is -decoded when extracted. This has the negative effect of using 33% more -storage space than necessary in blob fields, but has the advantage of -making the communication independent of the back-end specific escaping -conventions. - -Run-time field and table modification -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Most attributes of fields and tables can be modified after they are -defined: - -.. code:: python - - >>> db.define_table('person', Field('name', default=''), format='%(name)s') -
- >>> db.person._format = '%(name)s/%(id)s' - >>> db.person.name.default = 'anonymous' - -notice that attributes of tables are usually prefixed by an underscore -to avoid conflict with possible field names. - -You can list the tables that have been defined for a given database -connection: - -.. code:: python - - >>> db.tables - ['person'] - -You can query for the type of a table: - -.. code:: python - - >>> type(db.person) - - -You can access a table using different syntaxes: - -.. code:: python - - >>> db.person is db['person'] - True - -You can also list the fields that have been defined for a given table: - -.. code:: python - - >>> db.person.fields - ['id', 'name'] - -Similarly you can access fields from their name in multiple equivalent -ways: - -.. code:: python - - >>> type(db.person.name) - - >>> db.person.name is db.person['name'] - True - -Given a field, you can access the attributes set in its definition: - -.. code:: python - - >>> db.person.name.type - string - >>> db.person.name.unique - False - >>> db.person.name.notnull - False - >>> db.person.name.length - 32 - -including its parent table, tablename, and parent connection: - -.. code:: python - - >>> db.person.name._table == db.person - True - >>> db.person.name._tablename == 'person' - True - >>> db.person.name._db == db - True - -A field also has methods. Some of them are used to build queries and we -will see them later. A special method of the field object is -``validate`` and it calls the validators for the field. - -.. code:: python - - >>> db.person.name.validate('John') - ('John', None) - -which returns a tuple ``(value, error)``. ``error`` is ``None`` if the -input passes validation. - -More on uploads -~~~~~~~~~~~~~~~ - -.. FIXME: review needed - -Consider the following model: - -.. code:: python - - db.define_table('myfile', - Field('image', 'upload', default='path/to/file')) - -In the case of an “upload” field, the default value can optionally be -set to a path (an absolute path or a path relative to the current app -folder), the default value is then assigned to each new record that does -not specify an image. - -Notice that this way multiple records may end to reference the same -default image file and this could be a problem on a Field having -``autodelete`` enabled. When you do not want to allow duplicates for the -image field (i.e. multiple records referencing the same file) but still -want to set a default value for the “upload” then you need a way to copy -the default file for each new record that does not specify an image. -This can be obtained using a file-like object referencing the default -file as the ``default`` argument to Field, or even with: - -.. code:: python - - Field('image', 'upload', default=dict(data='', filename='')) - -Normally an insert is handled automatically via a ``Form`` but -occasionally you already have the file on the filesystem and want to -upload it programmatically. This can be done in this way: - -.. code:: python - - with open(filename, 'rb') as stream: - db.myfile.insert(image=db.myfile.image.store(stream, filename)) - -It is also possible to insert a file in a simpler way and have the -insert method call ``store`` automatically: - -.. code:: python - - with open(filename, 'rb') as stream: - db.myfile.insert(image=stream) - -In this case the filename is obtained from the stream object if -available. - -The ``store`` method of the upload field object takes a file stream and -a filename. It uses the filename to determine the extension (type) of -the file, creates a new temp name for the file (according to py4web -upload mechanism) and loads the file content in this new temp file -(under the uploads folder unless specified otherwise). It returns the -new temp name, which is then stored in the ``image`` field of the -``db.myfile`` table. - -Note, if the file is to be stored in an associated blob field rather -than the file system, the ``store`` method will not insert the file in -the blob field (because ``store`` is called before the insert), so the -file must be explicitly inserted into the blob field: - -.. code:: python - - db.define_table('myfile', - Field('image', 'upload', uploadfield='image_file'), - Field('image_file', 'blob')) - with open(filename, 'rb') as stream: - db.myfile.insert(image=db.myfile.image.store(stream, filename), - image_file=stream.read()) - -The ``retrieve`` method does the opposite of ``store``. - -When uploaded files are stored on filesystem (as in the case of a plain -``Field('image', 'upload')``) the code: - -.. code:: python - - row = db(db.myfile).select().first() - (filename, fullname) = db.myfile.image.retrieve(row.image, nameonly=True) - -retrieves the original file name (filename) as seen by the user at -upload time and the name of stored file (fullname, with path relative to -application folder). While in general the call: - -.. code:: python - - (filename, stream) = db.myfile.image.retrieve(row.image) - -retrieves the original file name (filename) and a file-like object ready -to access uploaded file data (stream). - - Notice that the stream returned by ``retrieve`` is a real file object - in the case that uploaded files are stored on filesystem. In that - case remember to close the file when you are done, calling - ``stream.close()``. - -Here is an example of safe usage of ``retrieve``: - -.. code:: python - - from contextlib import closing - import shutil - row = db(db.myfile).select().first() - (filename, stream) = db.myfile.image.retrieve(row.image) - with closing(stream) as src, closing(open(filename, 'wb')) as dest: - shutil.copyfileobj(src, dest) - - -Migrations ----------- - -With our example table definition: - -.. code:: python - - db.define_table('person') - -``define_table`` checks whether or not the corresponding table exists. -If it does not, it generates the SQL to create it and executes the SQL. -If the table does exist but differs from the one being defined, it -generates the SQL to alter the table and executes it. If a field has -changed type but not name, it will try to convert the data (If you do -not want this, you need to redefine the table twice, the first time, -letting py4web drop the field by removing it, and the second time adding -the newly defined field so that py4web can create it). If the table -exists and matches the current definition, it will leave it alone. In -all cases it will create the ``db.person`` object that represents the -table. - -We refer to this behavior as a “migration”. py4web logs all migrations -and migration attempts in the file “sql.log”. - -.. note:: - - by default py4web uses the “app/databases” folder for the - log file and all other migration files it needs. You can change this - setting by changing the ``folder`` argument to DAL. To set a different - log file name, for example “migrate.log” you can do - ``db = DAL(..., adapter_args=dict(logfile='migrate.log'))`` - -The first argument of ``define_table`` is always the table name. The -other unnamed arguments are the fields. The function also takes -an optional keyword argument called “migrate”: - -.. code:: python - - db.define_table('person', ..., migrate='person.table') - -The value of migrate is the filename where py4web stores internal -migration information for this table. These files are very important and -should never be removed while the corresponding tables exist. In cases -where a table has been dropped and the corresponding file still exist, -it can be removed manually. By default, migrate is set to True. This -causes py4web to generate the filename from a hash of the connection -string. If migrate is set to False, the migration is not performed, and -py4web assumes that the table exists in the datastore and it contains -(at least) the fields listed in ``define_table``. - -There may not be two tables in the same application with the same -migrate filename. - -The DAL class also takes a “migrate” argument, which determines the -default value of migrate for calls to ``define_table``. For example, - -.. code:: python - - db = DAL('sqlite://storage.sqlite', migrate=False) - -will set the default value of migrate to False whenever -``db.define_table`` is called without a migrate argument. - -.. note:: - - py4web only migrates new columns, removed columns, and - changes in column type (except in SQLite). py4web does not migrate - changes in attributes such as changes in the values of ``default``, - ``unique``, ``notnull``, and ``ondelete``. - -Migrations can be disabled for all tables at once: - -.. code:: python - - db = DAL(..., migrate_enabled=False) - -This is the recommended behavior when two apps share the same database. -Only one of the two apps should perform migrations, the other should -disable them. - -Fixing broken migrations -~~~~~~~~~~~~~~~~~~~~~~~~ - -There are two common problems with migrations and there are ways to -recover from them. - -One problem is specific with SQLite. SQLite does not enforce column -types and cannot drop columns. This means that if you have a column of -type string and you remove it, it is not really removed. If you add the -column again with a different type (for example datetime) you end up -with a datetime column that contains strings (junk for practical -purposes). py4web does not complain about this because it does not know -what is in the database, until it tries to retrieve records and fails. - -If py4web returns an error in some parse function when selecting -records, most likely this is due to corrupted data in a column because -of the above issue. - -The solution consists in updating all records of the table and updating -the values in the column in question with None. - -The other problem is more generic but typical with MySQL. MySQL does not -allow more than one ALTER TABLE in a transaction. This means that py4web -must break complex transactions into smaller ones (one ALTER TABLE at -the time) and commit one piece at the time. It is therefore possible -that part of a complex transaction gets committed and one part fails, -leaving py4web in a corrupted state. Why would part of a transaction -fail? Because, for example, it involves altering a table and converting -a string column into a datetime column, py4web tries to convert the -data, but the data cannot be converted. What happens to py4web? It gets -confused about what exactly is the table structure actually stored in -the database. - -The solution consists of enabling fake migrations: - -.. code:: python - - db.define_table(...., migrate=True, fake_migrate=True) - -This will rebuild py4web metadata about the table according to the table -definition. Try multiple table definitions to see which one works (the -one before the failed migration and the one after the failed migration). -Once successful remove the ``fake_migrate=True`` parameter. - -Before attempting to fix migration problems it is prudent to make a copy -of “yourapp/databases/\*.table” files. - -Migration problems can also be fixed for all tables at once: - -.. code:: python - - db = DAL(..., fake_migrate_all=True) - -This also fails if the model describes tables that do not exist in the -database, but it can help narrowing down the problem. - -Migration control summary -~~~~~~~~~~~~~~~~~~~~~~~~~ - -The logic of the various migration arguments are summarized in this -pseudo-code: - -.. code:: python - - if DAL.migrate_enabled and table.migrate: - if DAL.fake_migrate_all or table.fake_migrate: - perform fake migration - else: - perform migration - - -Table methods -------------- - -``insert`` -~~~~~~~~~~ - -Given a table, you can insert records - -.. code:: python - - >>> db.person.insert(name="Alex") - 1 - >>> db.person.insert(name="Bob") - 2 - -Insert returns the unique “id” value of each record inserted. - -You can truncate the table, i.e., delete all records and reset the -counter of the id. - -.. code:: python - - >>> db.person.truncate() - -Now, if you insert a record again, the counter starts again at 1 (this -is back-end specific and does not apply to Google NoSQL): - -.. code:: python - - >>> db.person.insert(name="Alex") - 1 - -Notice you can pass a parameter to ``truncate``, for example you can -tell SQLite to restart the id counter. - -.. code:: python - - >>> db.person.truncate('RESTART IDENTITY CASCADE') - -The argument is in raw SQL and therefore engine specific. - -py4web also provides a bulk_insert method - -.. code:: python - - >>> db.person.bulk_insert([{'name': 'Alex'}, {'name': 'John'}, {'name': 'Tim'}]) - [3, 4, 5] - -It takes a list of dictionaries of fields to be inserted and performs -multiple inserts at once. It returns the list of “id” values of the -inserted records. On the supported relational databases there is no -advantage in using this function as opposed to looping and performing -individual inserts but on Google App Engine NoSQL, there is a major -speed advantage. - -``Query``, ``Set``, ``Rows`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Let’s consider again the table defined (and dropped) previously and -insert three records: - -.. code:: python - - >>> db.define_table('person', Field('name')) -
- >>> db.person.insert(name="Alex") - 1 - >>> db.person.insert(name="Bob") - 2 - >>> db.person.insert(name="Carl") - 3 - -You can store the table in a variable. For example, with variable -``person``, you could do: - -.. code:: python - - >>> person = db.person - -You can also store a field in a variable such as ``name``. For example, -you could also do: - -.. code:: python - - >>> name = person.name - -You can even build a query (using operators like ==, !=, <, >, <=, >=, -like, belongs) and store the query in a variable ``q`` such as in: - -.. code:: python - - >>> q = name == 'Alex' - -When you call ``db`` with a query, you define a set of records. You can -store it in a variable ``s`` and write: - -.. code:: python - - >>> s = db(q) - -Notice that no database query has been performed so far. DAL + Query -simply define a set of records in this db that match the query. py4web -determines from the query which table (or tables) are involved and, in -fact, there is no need to specify that. - -``update_or_insert`` -~~~~~~~~~~~~~~~~~~~~ - -Some times you need to perform an insert only if there is no record with -the same values as those being inserted. This can be done with - -.. code:: python - - db.define_table('person', - Field('name'), - Field('birthplace')) - - db.person.update_or_insert(name='John', birthplace='Chicago') - -The record will be inserted only if there is no other user called John -born in Chicago. - -You can specify which values to use as a key to determine if the record -exists. For example: - -.. code:: python - - db.person.update_or_insert(db.person.name == 'John', - name='John', - birthplace='Chicago') - -and if there is John his birthplace will be updated else a new record -will be created. - -The selection criteria in the example above is a single field. It can -also be a query, such as - -.. code:: python - - db.person.update_or_insert((db.person.name == 'John') & (db.person.birthplace == 'Chicago'), - name='John', - birthplace='Chicago', - pet='Rover') - -``validate_and_insert``, ``validate_and_update`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The function - -.. code:: python - - ret = db.mytable.validate_and_insert(field='value') - -works very much like - -.. code:: python - - id = db.mytable.insert(field='value') - -except that it calls the validators for the fields before performing the -insert and bails out if the validation does not pass. If validation does -not pass the errors can be found in ``ret.errors``. ``ret.errors`` holds -a key-value mapping where each key is the field name whose validation -failed, and the value of the key is the result from the validation error -(much like ``form.errors``). If it passes, the id of the new record is -in ``ret.id``. Mind that normally validation is done by the form -processing logic so this function is rarely needed. - -Similarly - -.. code:: python - - ret = db(query).validate_and_update(field='value') - -works very much the same as - -.. code:: python - - num = db(query).update(field='value') - -except that it calls the validators for the fields before performing the -update. Notice that it only works if query involves a single table. The -number of updated records can be found in ``ret.updated`` and errors -will be in ``ret.errors``. - -``drop`` -~~~~~~~~ - -Finally, you can drop tables and all data will be lost: - -.. code:: python - - db.person.drop() - -Tagging records -~~~~~~~~~~~~~~~ - -Tags allows to add or find properties attached to records in your -database. - -.. code:: python - - from py4web import DAL, Field - from pydal.tools.tags import Tags - - db = DAL("sqlite:memory") - db.define_table("thing", Field("name")) - properties = Tags(db.thing) - id1 = db.thing.insert(name="chair") - id2 = db.thing.insert(name="table") - properties.add(id1, "color/red") - properties.add(id1, "style/modern") - properties.add(id2, "color/green") - properties.add(id2, "material/wood") - - assert properties.get(id1) == ["color/red", "style/modern"] - assert properties.get(id2) == ["color/green", "material/wood"] - - rows = db(properties.find(["style/modern"])).select() - assert rows.first().id == id1 - - rows = db(properties.find(["material/wood"])).select() - assert rows.first().id == id2 - - rows = db(properties.find(["color"])).select() - assert len(rows) == 2 - -It is internally implemented as a table, which in -this example would be db.thing_tags_default, because no tail was -specified on the Tags(table, tail=“default”) constructor. - -The ``find`` method is doing a search by ``startswith`` of the -parameter. Then find([“color”]) would return id1 and id2 -because both records have tags starting with “color”. py4web uses tags as a -flexible mechanism to manage permissions. - - -Raw SQL -------- - -``executesql`` -~~~~~~~~~~~~~~ - -The DAL allows you to explicitly issue SQL statements. - -.. code:: python - - >>> db.executesql('SELECT * FROM person;') - [(1, u'Massimo'), (2, u'Massimo')] - -In this case, the return values are not parsed or transformed by the -DAL, and the format depends on the specific database driver. This usage -with selects is normally not needed, but it is more common with indexes. - -``executesql`` takes five optional arguments: ``placeholders``, -``as_dict``, ``fields``, ``colnames``, and ``as_ordered_dict``. - -``placeholders`` is an optional sequence of values to be substituted in -or, if supported by the DB driver, a dictionary with keys matching named -placeholders in your SQL. - -If ``as_dict`` is set to True, the results cursor returned by the DB -driver will be converted to a sequence of dictionaries keyed with the db -field names. Results returned with ``as_dict = True`` are the same as -those returned when applying as_list() to a normal select: - -.. code:: python - - [{'field1': val1_row1, 'field2': val2_row1}, {'field1': val1_row2, 'field2': val2_row2}] - -``as_ordered_dict`` is pretty much like ``as_dict`` but the former -ensures that the order of resulting fields (OrderedDict keys) reflect -the order on which they are returned from DB driver: - -.. code:: python - - [OrderedDict([('field1', val1_row1), ('field2', val2_row1)]), - OrderedDict([('field1', val1_row2), ('field2', val2_row2)])] - -The ``fields`` argument is a list of DAL Field objects that match the -fields returned from the DB. The Field objects should be part of one or -more Table objects defined on the DAL object. The ``fields`` list can -include one or more DAL Table objects in addition to or instead of -including Field objects, or it can be just a single table (not in a -list). In that case, the Field objects will be extracted from the -table(s). - -Instead of specifying the ``fields`` argument, the ``colnames`` argument -can be specified as a list of field names in tablename.fieldname format. -Again, these should represent tables and fields defined on the DAL -object. - -It is also possible to specify both ``fields`` and the associated -``colnames``. In that case, ``fields`` can also include DAL Expression -objects in addition to Field objects. For Field objects in “fields”, the -associated ``colnames`` must still be in tablename.fieldname format. For -Expression objects in ``fields``, the associated ``colnames`` can be any -arbitrary labels. - -Notice, the DAL Table objects referred to by ``fields`` or ``colnames`` -can be dummy tables and do not have to represent any real tables in the -database. Also, note that the ``fields`` and ``colnames`` must be in the -same order as the fields in the results cursor returned from the DB. - -``_lastsql`` -~~~~~~~~~~~~ - -Whether SQL was executed manually using executesql or was SQL generated -by the DAL, you can always find the SQL code in ``db._lastsql``. This is -useful for debugging purposes: - -.. code:: python - - >>> rows = db().select(db.person.ALL) - >>> db._lastsql - SELECT person.id, person.name FROM person; - -.. - - py4web never generates queries using the “*” operator. py4web is - always explicit when selecting fields. - -Timing queries -~~~~~~~~~~~~~~ - -All queries are automatically timed by py4web. The variable -``db._timings`` is a list of tuples. Each tuple contains the raw SQL -query as passed to the database driver and the time it took to execute -in seconds. - -Indexes -~~~~~~~ - -Currently the DAL API does not provide a command to create indexes on -tables, but this can be done using the ``executesql`` command. This is -because the existence of indexes can make migrations complex, and it is -better to deal with them explicitly. Indexes may be needed for those -fields that are used in recurrent queries. - -Here is an example of how to: - -.. code:: python - - db = DAL('sqlite://storage.sqlite') - db.define_table('person', Field('name')) - db.executesql('CREATE INDEX IF NOT EXISTS myidx ON person (name);') - -Other database dialects have very similar syntaxes but may not support -the optional “IF NOT EXISTS” directive. - -Generating raw SQL -~~~~~~~~~~~~~~~~~~ - -Sometimes you need to generate the SQL but not execute it. This is easy -to do with py4web since every command that performs database IO has an -equivalent command that does not, and simply returns the SQL that would -have been executed. These commands have the same names and syntax as the -functional ones, but they start with an underscore: - -Here is ``_insert`` - -.. code:: python - - >>> print(db.person._insert(name='Alex')) - INSERT INTO "person"("name") VALUES ('Alex'); - -Here is ``_count`` - -.. code:: python - - >>> print(db(db.person.name == 'Alex')._count()) - SELECT COUNT(*) FROM "person" WHERE ("person"."name" = 'Alex'); - -Here is ``_select`` - -.. code:: python - - >>> print(db(db.person.name == 'Alex')._select()) - SELECT "person"."id", "person"."name" FROM "person" WHERE ("person"."name" = 'Alex'); - -Here is ``_delete`` - -.. code:: python - - >>> print(db(db.person.name == 'Alex')._delete()) - DELETE FROM "person" WHERE ("person"."name" = 'Alex'); - -And finally, here is ``_update`` - -.. code:: python - - >>> print(db(db.person.name == 'Alex')._update(name='Susan')) - UPDATE "person" SET "name"='Susan' WHERE ("person"."name" = 'Alex'); - -.. - - Moreover you can always use ``db._lastsql`` to return the most recent - SQL code, whether it was executed manually using executesql or was - SQL generated by the DAL. - - -``select`` command ------------------- - -Given a Set, ``s``, you can fetch the records with the command -``select``: - -.. code:: python - - >>> rows = s.select() - -It returns an iterable object of class ``pydal.objects.Rows`` whose -elements are Row objects. ``pydal.objects.Row`` objects act like -dictionaries, but their elements can also be accessed as attributes. -The former differ from the latter because -its values are read-only. - -The Rows object allows looping over the result of the select and -printing the selected field values for each row: - -.. code:: python - - >>> for row in rows: - ... print(row.id, row.name) - ... - 1 Alex - -You can do all the steps in one statement: - -.. code:: python - - >>> for row in db(db.person.name == 'Alex').select(): - ... print(row.name) - ... - Alex - -The select command can take arguments. All unnamed arguments are -interpreted as the names of the fields that you want to fetch. For -example, you can be explicit on fetching field “id” and field “name”: - -.. code:: python - - >>> for row in db().select(db.person.id, db.person.name): - ... print(row.name) - ... - Alex - Bob - Carl - -The table attribute ALL allows you to specify all fields: - -.. code:: python - - >>> for row in db().select(db.person.ALL): - ... print(row.id, row.name) - ... - 1 Alex - 2 Bob - 3 Carl - -Notice that there is no query string passed to db. py4web understands -that if you want all fields of the table person without additional -information then you want all records of the table person. - -An equivalent alternative syntax is the following: - -.. code:: python - - >>> for row in db(db.person).select(): - ... print(row.id, row.name) - ... - 1 Alex - 2 Bob - 3 Carl - -and py4web understands that if you ask for all records of the table -person without additional information, then you want all the fields of -table person. - -Given one row - -.. code:: python - - >>> row = rows[0] - -you can extract its values using multiple equivalent expressions: - -.. code:: python - - >>> row.name - Alex - >>> row['name'] - Alex - >>> row('person.name') - Alex - -The latter syntax is particularly handy when selecting an expression -instead of a column. We will show this later. - -You can also do - -.. code:: python - - rows.compact = False - -to disable the notation - -.. code:: python - - rows[i].name - -and enable, instead, the less compact notation: - -.. code:: python - - rows[i].person.name - -Yes this is unusual and rarely needed. - -Row objects also have two important methods: - -.. code:: python - - row.delete_record() - -and - -.. code:: python - - row.update_record(name="new value") - -Using an iterator-based select for lower memory use -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Python “iterators” are a type of “lazy-evaluation”. They ‘feed’ data one -step at time; traditional Python loops create the entire set of data in -memory before looping. - -The traditional use of select is: - -.. code:: python - - for row in db(db.table).select(): - ... - -but for large numbers of rows, using an iterator-based alternative has -dramatically lower memory use: - -.. code:: python - - for row in db(db.table).iterselect(): - ... - -Testing shows this is around 10% faster as well, even on machines with -large RAM. - -Rendering rows using represent -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You may wish to rewrite rows returned by select to take advantage of -formatting information contained in the represents setting of the -fields. - -.. code:: python - - rows = db(query).select() - repr_row = rows.render(0) - -If you don’t specify an index, you get a generator to iterate over all -the rows: - -.. code:: python - - for row in rows.render(): - print(row.myfield) - -Can also be applied to slices: - -.. code:: python - - for row in rows[0:10].render(): - print(row.myfield) - -If you only want to transform selected fields via their “represent” -attribute, you can list them in the “fields” argument: - -.. code:: python - - repr_row = row.render(0, fields=[db.mytable.myfield]) - -Note, it returns a transformed copy of the original Row, so there’s no -update_record (which you wouldn't want anyway) or delete_record. - -Shortcuts -~~~~~~~~~ - -The DAL supports various code-simplifying shortcuts. In particular: - -.. code:: python - - myrecord = db.mytable[id] - -returns the record with the given ``id`` if it exists. If the ``id`` -does not exist, it returns ``None``. The above statement is equivalent -to - -.. code:: python - - myrecord = db(db.mytable.id == id).select().first() - -You can delete records by id: - -.. code:: python - - del db.mytable[id] - -and this is equivalent to - -.. code:: python - - db(db.mytable.id == id).delete() - -and deletes the record with the given ``id``, if it exists. - -Note: this delete shortcut syntax does not currently work if -*versioning* is activated - -You can insert records: - -.. code:: python - - db.mytable[None] = dict(myfield='somevalue') - -It is equivalent to - -.. code:: python - - db.mytable.insert(myfield='somevalue') - -and it creates a new record with field values specified by the -dictionary on the right hand side. - -Note: insert shortcut was previously ``db.table[0] = ...``. It has -changed in pyDAL 19.02 to permit normal usage of id 0. - -.. FIXME: maybe this is happened before py4web born, - so do we still need this note? - -You can update records: - -.. code:: python - - db.mytable[id] = dict(myfield='somevalue') - -which is equivalent to - -.. code:: python - - db(db.mytable.id == id).update(myfield='somevalue') - -and it updates an existing record with field values specified by the -dictionary on the right hand side. - -Fetching a ``Row`` -~~~~~~~~~~~~~~~~~~ - -Yet another convenient syntax is the following: - -.. code:: python - - record = db.mytable(id) - record = db.mytable(db.mytable.id == id) - record = db.mytable(id, myfield='somevalue') - -Apparently similar to ``db.mytable[id]`` the above syntax is more -flexible and safer. First of all it checks whether ``id`` is an int (or -``str(id)`` is an int) and returns ``None`` if not (it never raises an -exception). It also allows to specify multiple conditions that the -record must meet. If they are not met, it also returns ``None``. - -Recursive ``select``\ s -~~~~~~~~~~~~~~~~~~~~~~~ - -Consider the previous table person and a new table “thing” referencing a -“person”: - -.. code:: python - - db.define_table('thing', - Field('name'), - Field('owner_id', 'reference person')) - -and a simple select from this table: - -.. code:: python - - things = db(db.thing).select() - -which is equivalent to - -.. code:: python - - things = db(db.thing._id != None).select() - -where ``_id`` is a reference to the primary key of the table. Normally -``db.thing._id`` is the same as ``db.thing.id`` and we will assume that -in most of this book. - -For each Row of things it is possible to fetch not just fields from the -selected table (thing) but also from linked tables (recursively): - -.. code:: python - - for thing in things: - print(thing.name, thing.owner_id.name) - -Here ``thing.owner_id.name`` requires one database select for each thing -in things and it is therefore inefficient. We suggest using joins -whenever possible instead of recursive selects, nevertheless this is -convenient and practical when accessing individual records. - -You can also do it backwards, by selecting the things referenced by a -person: - -.. code:: python - - person = db.person(id) - for thing in person.thing.select(orderby=db.thing.name): - print(person.name, 'owns', thing.name) - -In this last expression ``person.thing`` is a shortcut for - -.. code:: python - - db(db.thing.owner_id == person.id) - -i.e. the Set of ``thing``\ s referenced by the current ``person``. This -syntax breaks down if the referencing table has multiple references to -the referenced table. In this case one needs to be more explicit and use -a full Query. - -.. _orderby, groupby, limitby: - -``orderby``, ``groupby``, ``limitby``, ``distinct``, ``having``, ``orderby_on_limitby``, ``join``, ``left``, ``cache`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The ``select`` command takes a number of optional arguments. - -orderby -^^^^^^^ - -You can fetch the records sorted by name: - -.. code:: python - - >>> for row in db().select(db.person.ALL, orderby=db.person.name): - ... print(row.name) - ... - Alex - Bob - Carl - -You can fetch the records sorted by name in reverse order (notice the -tilde): - -.. code:: python - - >>> for row in db().select(db.person.ALL, orderby=~db.person.name): - ... print(row.name) - ... - Carl - Bob - Alex - -You can have the fetched records appear in random order: - -.. code:: python - - >>> for row in db().select(db.person.ALL, orderby=''): - ... print(row.name) - ... - Carl - Alex - Bob - -.. - - The use of ``orderby=''`` is not supported on Google NoSQL. - However, to overcome this limit, sorting can be accomplished on - selected rows: - -.. code:: python - - import random - rows = db(...).select().sort(lambda row: random.random()) - -You can sort the records according to multiple fields by concatenating -them with a “\|”: - -.. code:: python - - >>> for row in db().select(db.person.name, orderby=db.person.name|db.person.id): - ... print(row.name) - ... - Alex - Bob - Carl - -groupby, having -^^^^^^^^^^^^^^^ - -Using ``groupby`` together with ``orderby``, you can group records with -the same value for the specified field (this is back-end specific, and -is not on the Google NoSQL): - -.. code:: python - - >>> for row in db().select(db.person.ALL, - ... orderby=db.person.name, - ... groupby=db.person.name): - ... print(row.name) - ... - Alex - Bob - Carl - -You can use ``having`` in conjunction with ``groupby`` to group -conditionally (only those ``having`` the condition are grouped). - -.. code:: python - - db(query1).select(db.person.ALL, groupby=db.person.name, having=query2) - -Notice that query1 filters records to be displayed, query2 filters -records to be grouped. - -distinct -^^^^^^^^ - -With the argument ``distinct=True``, you can specify that you only want -to select distinct records. This has the same effect as grouping using -all specified fields except that it does not require sorting. When using -distinct it is important not to select ALL fields, and in particular not -to select the “id” field, else all records will always be distinct. - -Here is an example: - -.. code:: python - - >>> for row in db().select(db.person.name, distinct=True): - ... print(row.name) - ... - Alex - Bob - Carl - -Notice that ``distinct`` can also be an expression, for example: - -.. code:: python - - >>> for row in db().select(db.person.name, distinct=db.person.name): - ... print(row.name) - ... - Alex - Bob - Carl - -limitby -^^^^^^^ - -With ``limitby=(min, max)``, you can select a subset of the records from -offset=min to but not including offset=max. In the next example we -select the first two records starting at zero: - -.. code:: python - - >>> for row in db().select(db.person.ALL, limitby=(0, 2)): - ... print(row.name) - ... - Alex - Bob - -orderby_on_limitby -^^^^^^^^^^^^^^^^^^ - -Note that the DAL defaults to implicitly adding an orderby when using a -limitby. This ensures the same query returns the same results each time, -important for pagination. But it can cause performance problems. use -``orderby_on_limitby = False`` to change this (this defaults to True). - -join, left -^^^^^^^^^^ - -These are involved in managing `One to many relation`_. They are -described in `Inner join`_ and `Left outer join`_ sections respectively. - -cache, cacheable -^^^^^^^^^^^^^^^^ - -An example use which gives much faster selects is: - -.. code:: python - - rows = db(query).select(cache=(cache.ram, 3600), cacheable=True) - -Look at `Caching selects`_, to understand what the trade-offs are. - -Logical operators -~~~~~~~~~~~~~~~~~ - -Queries can be combined using the binary AND operator “``&``”: - -.. code:: python - - >>> rows = db((db.person.name=='Alex') & (db.person.id > 3)).select() - >>> for row in rows: print row.id, row.name - >>> len(rows) - 0 - -and the binary OR operator “``|``”: - -.. code:: python - - >>> rows = db((db.person.name == 'Alex') | (db.person.id > 3)).select() - >>> for row in rows: print row.id, row.name - 1 Alex - -You can negate a sub-query inverting its operator: - -.. code:: python - - >>> rows = db((db.person.name != 'Alex') | (db.person.id > 3)).select() - >>> for row in rows: print row.id, row.name - 2 Bob - 3 Carl - -or by explicit negation with the “``~``” unary operator: - -.. code:: python - - >>> rows = db(~(db.person.name == 'Alex') | (db.person.id > 3)).select() - >>> for row in rows: print row.id, row.name - 2 Bob - 3 Carl - -.. - - Due to Python restrictions in overloading “``and``” and “``or``” - operators, these cannot be used in forming queries. The binary - operators “``&``” and “``|``” must be used instead. Note that these - operators (unlike “``and``” and “``or``”) have higher precedence than - comparison operators, so the “extra” parentheses in the above - examples are mandatory. Similarly, the unary operator “``~``” has - higher precedence than comparison operators, so ``~``-negated - comparisons must also be parenthesized. - -It is also possible to build queries using in-place logical operators: - -.. code:: python - - >>> query = db.person.name != 'Alex' - >>> query &= db.person.id > 3 - >>> query |= db.person.name == 'John' - -``count``, ``isempty``, ``delete``, ``update`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can count records in a set: - -.. code:: python - - >>> db(db.person.name != 'William').count() - 3 - -Notice that ``count`` takes an optional ``distinct`` argument which -defaults to False, and it works very much like the same argument for -``select``. ``count`` has also a ``cache`` argument that works very much -like the equivalent argument of the ``select`` method. - -Sometimes you may need to check if a table is empty. A more efficient -way than counting is using the ``isempty`` method: - -.. code:: python - - >>> db(db.person).isempty() - False - -You can delete records in a set: - -.. code:: python - - >>> db(db.person.id > 3).delete() - 0 - -The ``delete`` method returns the number of records that were deleted. - -And you can update all records in a set by passing named arguments -corresponding to the fields that need to be updated: - -.. code:: python - - >>> db(db.person.id > 2).update(name='Ken') - 1 - -The ``update`` method returns the number of records that were updated. - -Expressions -~~~~~~~~~~~ - -The value assigned an update statement can be an expression. For example -consider this model - -.. code:: python - - db.define_table('person', - Field('name'), - Field('visits', 'integer', default=0)) - - db(db.person.name == 'Massimo').update(visits = db.person.visits + 1) - -The values used in queries can also be expressions - -.. code:: python - - db.define_table('person', - Field('name'), - Field('visits', 'integer', default=0), - Field('clicks', 'integer', default=0)) - - db(db.person.visits == db.person.clicks + 1).delete() - -``case`` -~~~~~~~~ - -An expression can contain a case clause for example: - -.. code:: python - - >>> condition = db.person.name.startswith('B') - >>> yes_or_no = condition.case('Yes', 'No') - >>> for row in db().select(db.person.name, yes_or_no): - ... print(row.person.name, row[yes_or_no]) # could be row(yes_or_no) too - ... - Alex No - Bob Yes - Ken No - -``update_record`` -~~~~~~~~~~~~~~~~~ - -py4web also allows updating a single record that is already in memory -using ``update_record`` - -.. code:: python - - >>> row = db(db.person.id == 2).select().first() - >>> row.update_record(name='Curt') - - -``update_record`` should not be confused with - -.. code:: python - - >>> row.update(name='Curt') - -because for a single row, the method ``update`` updates the row object -but not the database record, as in the case of ``update_record``. - -It is also possible to change the attributes of a row (one at a time) -and then call ``update_record()`` without arguments to save the changes: - -.. code:: python - - >>> row = db(db.person.id > 2).select().first() - >>> row.name = 'Philip' - >>> row.update_record() # saves above change - - -.. - - Note, you should avoid using ``row.update_record()`` with no - arguments when the ``row`` object contains fields that have an - ``update`` attribute (e.g., - ``Field('modified_on', update=datetime.datetime.utcnow)``). Calling - ``row.update_record()`` will retain *all* of the existing values in - the ``row`` object, so any fields with ``update`` attributes will - have no effect in this case. Be particularly mindful of this with - tables that include ``auth.signature``. - -The ``update_record`` method is available only if the table’s ``id`` -field is included in the select, and ``cacheable`` is not set to -``True``. - -Inserting and updating from a dictionary -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A common issue consists of needing to insert or update records in a -table where the name of the table, the field to be updated, and the -value for the field are all stored in variables. For example: -``tablename``, ``fieldname``, and ``value``. - -The insert can be done using the following syntax: - -.. code:: python - - db[tablename].insert(**{fieldname:value}) - -The update of record with given id can be done with: - -.. code:: python - - db(db[tablename]._id == id).update(**{fieldname:value}) - -Notice we used ``table._id`` instead of ``table.id``. In this way the -query works even for tables with a primary key field with type other -than “id”. - -``first`` and ``last`` -~~~~~~~~~~~~~~~~~~~~~~ - -Given a Rows object containing records: - -.. code:: python - - rows = db(query).select() - first_row = rows.first() - last_row = rows.last() - -are equivalent to - -.. code:: python - - first_row = rows[0] if len(rows) else None - last_row = rows[-1] if len(rows) else None - -Notice, ``first()`` and ``last()`` allow you to obtain obviously the -first and last record present in your query, but this won’t mean that -these records are going to be the first or last inserted records. In -case you want the first or last record inputted in a given table don’t -forget to use ``orderby=db.table_name.id``. If you forget you will only -get the first and last record returned by your query which are often in -a random order determined by the backend query optimiser. - -``as_dict`` and ``as_list`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A Row object can be serialized into a regular dictionary using the -``as_dict()`` method and a Rows object can be serialized into a list of -dictionaries using the ``as_list()`` method. Here are some examples: - -.. code:: python - - rows = db(query).select() - rows_list = rows.as_list() - first_row_dict = rows.first().as_dict() - -These methods are convenient for passing Rows to generic views and or to -store Rows in sessions (Rows objects themselves cannot be -serialized because they contain a reference to an open DB connection): - -.. code:: python - - rows = db(query).select() - session.rows = rows # not allowed! - session.rows = rows.as_list() # allowed! - -Combining rows -~~~~~~~~~~~~~~ - -Rows objects can be combined at the Python level. Here we assume: - -.. code:: python - - >>> print(rows1) - person.name - Max - Tim - - >>> print(rows2) - person.name - John - Tim - -You can do union of the records in two sets of rows: - -.. code:: python - - >>> rows3 = rows1 + rows2 - >>> print(rows3) - person.name - Max - Tim - John - Tim - -You can do union of the records removing duplicates: - -.. code:: python - - >>> rows3 = rows1 | rows2 - >>> print(rows3) - person.name - Max - Tim - John - -You can do intersection of the records in two sets of rows: - -.. code:: python - - >>> rows3 = rows1 & rows2 - >>> print(rows3) - person.name - Tim - -``find``, ``exclude``, ``sort`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Some times you need to perform two selects and one contains a subset of -a previous select. In this case it is pointless to access the database -again. The ``find``, ``exclude`` and ``sort`` objects allow you to -manipulate a Rows object and generate another one without accessing the -database. More specifically: - ``find`` returns a new set of Rows -filtered by a condition and leaves the original unchanged. - ``exclude`` -returns a new set of Rows filtered by a condition and removes them from -the original Rows. - ``sort`` returns a new set of Rows sorted by a -condition and leaves the original unchanged. - -All these methods take a single argument, a function that acts on each -individual row. - -Here is an example of usage: - -.. code:: python - - >>> db.define_table('person', Field('name')) -
- >>> db.person.insert(name='John') - 1 - >>> db.person.insert(name='Max') - 2 - >>> db.person.insert(name='Alex') - 3 - >>> rows = db(db.person).select() - >>> for row in rows.find(lambda row: row.name[0]=='M'): - ... print(row.name) - ... - Max - >>> len(rows) - 3 - >>> for row in rows.exclude(lambda row: row.name[0]=='M'): - ... print(row.name) - ... - Max - >>> len(rows) - 2 - >>> for row in rows.sort(lambda row: row.name): - ... print(row.name) - ... - Alex - John - -They can be combined: - -.. code:: python - - >>> rows = db(db.person).select() - >>> rows = rows.find(lambda row: 'x' in row.name).sort(lambda row: row.name) - >>> for row in rows: - ... print(row.name) - ... - Alex - Max - -Sort takes an optional argument ``reverse=True`` with the obvious -meaning. - -The ``find`` method has an optional ``limitby`` argument with the same -syntax and functionality as the Set ``select`` method. - -Caching selects -~~~~~~~~~~~~~~~ - -The select method also takes a ``cache`` argument, which defaults to -None. For caching purposes, it should be set to a tuple where the first -element is the cache model (``cache.ram``, ``cache.disk``, etc.), and -the second element is the expiration time in seconds. - -In the following example, you see a controller that caches a select on -the previously defined db.log table. The actual select fetches data from -the back-end database no more frequently than once every 60 seconds and -stores the result in memory. If the next call to this controller occurs -in less than 60 seconds since the last database IO, it simply fetches -the previous data from memory. - -.. code:: python - - def cache_db_select(): - logs = db().select(db.log.ALL, cache=(cache.ram, 60)) - return dict(logs=logs) - -The ``select`` method has an optional ``cacheable`` argument, normally -set to False. When ``cacheable=True`` the resulting ``Rows`` is -serializable but The ``Row``\ s lack ``update_record`` and -``delete_record`` methods. - -If you do not need these methods you can speed up selects a lot by -setting the ``cacheable`` attribute: - -.. code:: python - - rows = db(query).select(cacheable=True) - -When the ``cache`` argument is set but ``cacheable=False`` (default) -only the database results are cached, not the actual Rows object. When -the ``cache`` argument is used in conjunction with ``cacheable=True`` -the entire Rows object is cached and this results in much faster -caching: - -.. code:: python - - rows = db(query).select(cache=(cache.ram, 3600), cacheable=True) - - -Computed and Virtual fields ---------------------------- - -Computed fields -~~~~~~~~~~~~~~~ - -DAL fields may have a ``compute`` attribute. This must be a function (or -lambda) that takes a Row object and returns a value for the field. When -a new record is modified, including both insertions and updates, if a -value for the field is not provided, py4web tries to compute from the -other field values using the ``compute`` function. Here is an example: - -.. code:: python - - >>> db.define_table('item', - ... Field('unit_price', 'double'), - ... Field('quantity', 'integer'), - ... Field('total_price', - ... compute=lambda r: r['unit_price'] * r['quantity'])) -
- >>> rid = db.item.insert(unit_price=1.99, quantity=5) - >>> db.item[rid] - - -Notice that the computed value is stored in the db and it is not -computed on retrieval, as in the case of virtual fields, described next. -Two typical applications of computed fields are: - -- in wiki applications, to store the processed input wiki text as HTML, to - avoid re-processing on every request -- for searching, to compute normalized values for a field, to be used for searching. - -Computed fields are evaluated in the order in which they are defined in -the table definition. A computed field can refer to previously defined -computed fields. - -Virtual fields -~~~~~~~~~~~~~~ - -Virtual fields are also computed fields (as in the previous subsection) -but they differ from those because they are *virtual* in the sense that -they are not stored in the db and they are computed each time records -are extracted from the database. They can be used to simplify the user’s -code without using additional storage but they cannot be used for -searching. - -New style virtual fields (experimental) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -py4web provides a new and easier way to define virtual fields and lazy -virtual fields. This section is marked experimental because the APIs may -still change a little from what is described here. - -Here we will consider the same example as in the previous subsection. In -particular we consider the following model: - -.. code:: python - - db.define_table('item', - Field('unit_price', 'double'), - Field('quantity', 'integer')) - -One can define a ``total_price`` virtual field as - -.. code:: python - - db.item.total_price = Field.Virtual(lambda row: row.item.unit_price * row.item.quantity) - -i.e. by simply defining a new field ``total_price`` to be a -``Field.Virtual``. The only argument of the constructor is a function -that takes a row and returns the computed values. - -A virtual field defined as the one above is automatically computed for -all records when the records are selected: - -.. code:: python - - for row in db(db.item).select(): - print(row.total_price) - -It is also possible to define method fields which are calculated -on-demand, when called. For example: - -.. code:: python - - db.item.discounted_total = \ - Field.Method(lambda row, discount=0.0: - row.item.unit_price * row.item.quantity * (100.0 - discount / 100)) - -In this case ``row.discounted_total`` is not a value but a function. The -function takes the same arguments as the function passed to the -``Method`` constructor except for ``row`` which is implicit (think of it -as ``self`` for objects). - -The lazy field in the example above allows one to compute the total -price for each ``item``: - -.. code:: python - - for row in db(db.item).select(): print(row.discounted_total()) - -And it also allows to pass an optional ``discount`` percentage (say -15%): - -.. code:: python - - for row in db(db.item).select(): print(row.discounted_total(15)) - -Virtual and Method fields can also be defined in place when a table is -defined: - -.. code:: python - - db.define_table('item', - Field('unit_price', 'double'), - Field('quantity', 'integer'), - Field.Virtual('total_price', lambda row: ...), - Field.Method('discounted_total', lambda row, discount=0.0: ...)) - -.. - - Mind that virtual fields do not have the same attributes as regular - fields (length, default, required, etc). They do not appear in the - list of ``db.table.fields``. - -Old style virtual fields -~~~~~~~~~~~~~~~~~~~~~~~~ - -In order to define one or more virtual fields, you can also define a -container class, instantiate it and link it to a table or to a select. -For example, consider the following table: - -.. code:: python - - db.define_table('item', - Field('unit_price', 'double'), - Field('quantity', 'integer')) - -One can define a ``total_price`` virtual field as - -.. code:: python - - class MyVirtualFields: - def total_price(self): - return self.item.unit_price * self.item.quantity - - db.item.virtualfields.append(MyVirtualFields()) - -Notice that each method of the class that takes a single argument (self) -is a new virtual field. ``self`` refers to each one row of the select. -Field values are referred by full path as in ``self.item.unit_price``. -The table is linked to the virtual fields by appending an instance of -the class to the table’s ``virtualfields`` attribute. - -Virtual fields can also access recursive fields as in - -.. code:: python - - db.define_table('item', - Field('unit_price', 'double')) - - db.define_table('order_item', - Field('item', 'reference item'), - Field('quantity', 'integer')) - - class MyVirtualFields: - def total_price(self): - return self.order_item.item.unit_price * self.order_item.quantity - - db.order_item.virtualfields.append(MyVirtualFields()) - -Notice the recursive field access ``self.order_item.item.unit_price`` -where ``self`` is the looping record. - -They can also act on the result of a JOIN - -.. code:: python - - rows = db(db.order_item.item == db.item.id).select() - - class MyVirtualFields: - def total_price(self): - return self.item.unit_price * self.order_item.quantity - - rows.setvirtualfields(order_item=MyVirtualFields()) - - for row in rows: - print(row.order_item.total_price) - -Notice how in this case the syntax is different. The virtual field -accesses both ``self.item.unit_price`` and ``self.order_item.quantity`` -which belong to the join select. The virtual field is attached to the -rows of the table using the ``setvirtualfields`` method of the rows -object. This method takes an arbitrary number of named arguments and can -be used to set multiple virtual fields, defined in multiple classes, and -attach them to multiple tables: - -.. code:: python - - class MyVirtualFields1: - def discounted_unit_price(self): - return self.item.unit_price * 0.90 - - class MyVirtualFields2: - def total_price(self): - return self.item.unit_price * self.order_item.quantity - def discounted_total_price(self): - return self.item.discounted_unit_price * self.order_item.quantity - - rows.setvirtualfields(item=MyVirtualFields1(), - order_item=MyVirtualFields2()) - - for row in rows: - print(row.order_item.discounted_total_price) - -Virtual fields can be *lazy*; all they need to do is return a function -and access it by calling the function: - -.. code:: python - - db.define_table('item', - Field('unit_price', 'double'), - Field('quantity', 'integer')) - - class MyVirtualFields: - def lazy_total_price(self): - def lazy(self=self): - return self.item.unit_price * self.item.quantity - return lazy - - db.item.virtualfields.append(MyVirtualFields()) - - for item in db(db.item).select(): - print(item.lazy_total_price()) - -or shorter using a lambda function: - -.. code:: python - - class MyVirtualFields: - def lazy_total_price(self): - return lambda self=self: self.item.unit_price * self.item.quantity - - -Joins and Relations -------------------- - -One to many relation -~~~~~~~~~~~~~~~~~~~~ - -To illustrate how to implement one to many relations with the DAL, -define another table “thing” that refers to the table “person” which we -redefine here: - -.. code:: python - - >>> db.define_table('person', - ... Field('name')) -
- >>> db.person.insert(name='Alex') - 1 - >>> db.person.insert(name='Bob') - 2 - >>> db.person.insert(name='Carl') - 3 - >>> db.define_table('thing', - ... Field('name'), - ... Field('owner_id', 'reference person')) -
- -Table “thing” has two fields, the name of the thing and the owner of the -thing. The “owner_id” field is a reference field, it is intended that -the field reference the other table by its id. A reference type can be -specified in two equivalent ways, either: -``Field('owner_id', 'reference person')`` or: -``Field('owner_id', db.person)``. - -The latter is always converted to the former. They are equivalent except -in the case of lazy tables, self references or other types of cyclic -references where the former notation is the only allowed notation. - -Now, insert three things, two owned by Alex and one by Bob: - -.. code:: python - - >>> db.thing.insert(name='Boat', owner_id=1) - 1 - >>> db.thing.insert(name='Chair', owner_id=1) - 2 - >>> db.thing.insert(name='Shoes', owner_id=2) - 3 - -You can select as you did for any other table: - -.. code:: python - - >>> for row in db(db.thing.owner_id == 1).select(): - ... print(row.name) - ... - Boat - Chair - -Because a thing has a reference to a person, a person can have many -things, so a record of table person now acquires a new attribute thing, -which is a Set, that defines the things of that person. This allows -looping over all persons and fetching their things easily: - -.. code:: python - - >>> for person in db().select(db.person.ALL): - ... print(person.name) - ... for thing in person.thing.select(): - ... print(' ', thing.name) - ... - Alex - Boat - Chair - Bob - Shoes - Carl - -Inner join -~~~~~~~~~~ - -Another way to achieve a similar result is by using a join, specifically -an INNER JOIN. py4web performs joins automatically and transparently -when the query links two or more tables as in the following example: - -.. code:: python - - >>> rows = db(db.person.id == db.thing.owner_id).select() - >>> for row in rows: - ... print(row.person.name, 'has', row.thing.name) - ... - Alex has Boat - Alex has Chair - Bob has Shoes - -Observe that py4web did a join, so the rows now contain two records, one -from each table, linked together. Because the two records may have -fields with conflicting names, you need to specify the table when -extracting a field value from a row. This means that while before you -could do: - -.. code:: python - - row.name - -and it was obvious whether this was the name of a person or a thing, in -the result of a join you have to be more explicit and say: - -.. code:: python - - row.person.name - -or: - -.. code:: python - - row.thing.name - -There is an alternative syntax for INNER JOINS: - -.. code:: python - - >>> rows = db(db.person).select(join=db.thing.on(db.person.id == db.thing.owner_id)) - >>> for row in rows: - ... print(row.person.name, 'has', row.thing.name) - ... - Alex has Boat - Alex has Chair - Bob has Shoes - -While the output is the same, the generated SQL in the two cases can be -different. The latter syntax removes possible ambiguities when the same -table is joined twice and aliased: - -.. code:: python - - db.define_table('thing', - Field('name'), - Field('owner_id1', 'reference person'), - Field('owner_id2', 'reference person')) - - rows = db(db.person).select( - join=[db.person.with_alias('owner_id1').on(db.person.id == db.thing.owner_id1), - db.person.with_alias('owner_id2').on(db.person.id == db.thing.owner_id2)]) - -The value of ``join`` can be list of ``db.table.on(...)`` to join. - -Left outer join -~~~~~~~~~~~~~~~ - -Notice that Carl did not appear in the list above because he has no -things. If you intend to select on persons (whether they have things or -not) and their things (if they have any), then you need to perform a -LEFT OUTER JOIN. This is done using the argument “left” of the select. -Here is an example: - -.. code:: python - - >>> rows = db().select(db.person.ALL, db.thing.ALL, - ... left=db.thing.on(db.person.id == db.thing.owner_id)) - >>> for row in rows: - ... print(row.person.name, 'has', row.thing.name) - ... - Alex has Boat - Alex has Chair - Bob has Shoes - Carl has None - -where: - -.. code:: python - - left = db.thing.on(...) - -does the left join query. Here the argument of ``db.thing.on`` is the -condition required for the join (the same used above for the inner -join). In the case of a left join, it is necessary to be explicit about -which fields to select. - -Multiple left joins can be combined by passing a list or tuple of -``db.mytable.on(...)`` to the ``left`` parameter. - -Grouping and counting -~~~~~~~~~~~~~~~~~~~~~ - -When doing joins, sometimes you want to group rows according to certain -criteria and count them. For example, count the number of things owned -by every person. py4web allows this as well. First, you need a count -operator. Second, you want to join the person table with the thing table -by owner. Third, you want to select all rows (person + thing), group -them by person, and count them while grouping: - -.. code:: python - - >>> count = db.person.id.count() - >>> for row in db(db.person.id == db.thing.owner_id - ... ).select(db.person.name, count, groupby=db.person.name): - ... print(row.person.name, row[count]) - ... - Alex 2 - Bob 1 - -Notice the ``count`` operator (which is built-in) is used as a field. -The only issue here is in how to retrieve the information. Each row -clearly contains a person and the count, but the count is not a field of -a person nor is it a table. So where does it go? It goes into the -storage object representing the record with a key equal to the query -expression itself. - -The ``count`` method of the Field object has an optional ``distinct`` -argument. When set to ``True`` it specifies that only distinct values of -the field in question are to be counted. - -Many to many relation -~~~~~~~~~~~~~~~~~~~~~ - -In the previous examples, we allowed a thing to have one owner but one -person could have many things. What if Boat was owned by Alex and Curt? -This requires a many-to-many relation, and it is realized via an -intermediate table that links a person to a thing via an ownership -relation. - -Here is how to do it: - -.. code:: python - - >>> db.define_table('person', - ... Field('name')) -
- >>> db.person.bulk_insert([dict(name='Alex'), dict(name='Bob'), dict(name='Carl')]) - [1, 2, 3] - >>> db.define_table('thing', - ... Field('name')) -
- >>> db.thing.bulk_insert([dict(name='Boat'), dict(name='Chair'), dict(name='Shoes')]) - [1, 2, 3] - >>> db.define_table('ownership', - ... Field('person', 'reference person'), - ... Field('thing', 'reference thing')) -
- -the existing ownership relationship can now be rewritten as: - -.. code:: python - - >>> db.ownership.insert(person=1, thing=1) # Alex owns Boat - 1 - >>> db.ownership.insert(person=1, thing=2) # Alex owns Chair - 2 - >>> db.ownership.insert(person=2, thing=3) # Bob owns Shoes - 3 - -Now you can add the new relation that Curt co-owns Boat: - -.. code:: python - - >>> db.ownership.insert(person=3, thing=1) # Curt owns Boat too - 4 - -Because you now have a three-way relation between tables, it may be -convenient to define a new set on which to perform operations: - -.. code:: python - - >>> persons_and_things = db((db.person.id == db.ownership.person) & - ... (db.thing.id == db.ownership.thing)) - -Now it is easy to select all persons and their things from the new Set: - -.. code:: python - - >>> for row in persons_and_things.select(): - ... print(row.person.name, 'has', row.thing.name) - ... - Alex has Boat - Alex has Chair - Bob has Shoes - Curt has Boat - -Similarly, you can search for all things owned by Alex: - -.. code:: python - - >>> for row in persons_and_things(db.person.name == 'Alex').select(): - ... print(row.thing.name) - ... - Boat - Chair - -and all owners of Boat: - -.. code:: python - - >>> for row in persons_and_things(db.thing.name == 'Boat').select(): - ... print(row.person.name) - ... - Alex - Curt - -A lighter alternative to many-to-many relations is tagging, you can -found an example of this in the next section. Tagging works even on -database backends that do not support JOINs like the Google App Engine -NoSQL. - -Self-Reference and aliases -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It is possible to define tables with fields that refer to themselves, -here is an example: - -.. code:: python - - db.define_table('person', - Field('name'), - Field('father_id', 'reference person'), - Field('mother_id', 'reference person')) - -Notice that the alternative notation of using a table object as field -type will fail in this case, because it uses a table before it is -defined: - -.. code:: python - - db.define_table('person', - Field('name'), - Field('father_id', db.person), # wrong! - Field('mother_id', db['person'])) # wrong! - -In general ``db.tablename`` and ``'reference tablename'`` are equivalent -field types, but the latter is the only one allowed for self-references. - -When a table has a self-reference and you have to do join, for example -to select a person and its father, you need an alias for the table. In -SQL an alias is a temporary alternate name you can use to reference a -table/column into a query (or other SQL statement). - -With py4web you can make an alias for a table using the ``with_alias`` -method. This works also for expressions, which means also for fields -since ``Field`` is derived from ``Expression``. - -Here is an example: - -.. code:: python - - >>> fid, mid = db.person.bulk_insert([dict(name='Massimo'), dict(name='Claudia')]) - >>> db.person.insert(name='Marco', father_id=fid, mother_id=mid) - 3 - >>> Father = db.person.with_alias('father') - >>> Mother = db.person.with_alias('mother') - >>> type(Father) - - >>> str(Father) - 'person AS father' - >>> rows = db().select(db.person.name, Father.name, Mother.name, - ... left=(Father.on(Father.id == db.person.father_id), - ... Mother.on(Mother.id == db.person.mother_id))) - >>> for row in rows: - ... print(row.person.name, row.father.name, row.mother.name) - ... - Massimo None None - Claudia None None - Marco Massimo Claudia - -Notice that we have chosen to make a distinction between: - “father_id”: -the field name used in the table “person”; - “father”: the alias we want -to use for the table referenced by the above field; this is communicated -to the database; - “Father”: the variable used by py4web to refer to -that alias. - -The difference is subtle, and there is nothing wrong in using the same -name for the three of them: - -.. code:: python - - >>> db.define_table('person', - ... Field('name'), - ... Field('father', 'reference person'), - ... Field('mother', 'reference person')) -
- >>> fid, mid = db.person.bulk_insert([dict(name='Massimo'), dict(name='Claudia')]) - >>> db.person.insert(name='Marco', father=fid, mother=mid) - 3 - >>> father = db.person.with_alias('father') - >>> mother = db.person.with_alias('mother') - >>> rows = db().select(db.person.name, father.name, mother.name, - ... left=(father.on(father.id==db.person.father), - ... mother.on(mother.id==db.person.mother))) - >>> for row in rows: - ... print(row.person.name, row.father.name, row.mother.name) - ... - Massimo None None - Claudia None None - Marco Massimo Claudia - -But it is important to have the distinction clear in order to build -correct queries. - - -Other operators ---------------- - -py4web has other operators that provide an API to access equivalent SQL -operators. Let’s define another table “log” to store security events, -their event_time and severity, where the severity is an integer number. - -.. code:: python - - >>> db.define_table('log', Field('event'), - ... Field('event_time', 'datetime'), - ... Field('severity', 'integer')) -
- -As before, insert a few events, a “port scan”, an “xss injection” and an -“unauthorized login”. For the sake of the example, you can log events -with the same event_time but with different severities (1, 2, and 3 -respectively). - -.. code:: python - - >>> import datetime - >>> now = datetime.datetime.now() - >>> db.log.insert(event='port scan', event_time=now, severity=1) - 1 - >>> db.log.insert(event='xss injection', event_time=now, severity=2) - 2 - >>> db.log.insert(event='unauthorized login', event_time=now, severity=3) - 3 - -``like``, ``ilike``, ``regexp``, ``startswith``, ``endswith``, ``contains``, ``upper``, ``lower`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Fields have a ``like`` operator that you can use to match strings: - -.. code:: python - - >>> for row in db(db.log.event.like('port%')).select(): - ... print(row.event) - ... - port scan - -Here “port%” indicates a string starting with “port”. The percent sign -character, “%”, is a wild-card character that means “any sequence of -characters”. - -The ``like`` operator maps to the LIKE word in ANSI-SQL. LIKE is -case-sensitive in most databases, and depends on the collation of the -database itself. The ``like`` method is hence case-sensitive but it can -be made case-insensitive with - -.. code:: python - - db.mytable.myfield.like('value', case_sensitive=False) - -which is the same as using ``ilike`` - -.. code:: python - - db.mytable.myfield.ilike('value') - -py4web also provides some shortcuts: - -.. code:: python - - db.mytable.myfield.startswith('value') - db.mytable.myfield.endswith('value') - db.mytable.myfield.contains('value') - -which are roughly equivalent respectively to - -.. code:: python - - db.mytable.myfield.like('value%') - db.mytable.myfield.like('%value') - db.mytable.myfield.like('%value%') - -Remember that ``contains`` has a special meaning for ``list:`` -fields, as discussed in :ref:`list_type and contains`. - -The ``contains`` method can also be passed a list of values and an -optional boolean argument ``all`` to search for records that contain all -values: - -.. code:: python - - db.mytable.myfield.contains(['value1', 'value2'], all=True) - -or any value from the list - -.. code:: python - - db.mytable.myfield.contains(['value1', 'value2'], all=False) - -There is a also a ``regexp`` method that works like the ``like`` method -but allows regular expression syntax for the look-up expression. It is -only supported by MySQL, Oracle, PostgreSQL, SQLite, and MongoDB (with -different degree of support). - -The ``upper`` and ``lower`` methods allow you to convert the value of -the field to upper or lower case, and you can also combine them with the -like operator: - -.. code:: python - - >>> for row in db(db.log.event.upper().like('PORT%')).select(): - ... print(row.event) - ... - port scan - -``year``, ``month``, ``day``, ``hour``, ``minutes``, ``seconds`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The date and datetime fields have ``day``, ``month`` and ``year`` -methods. The datetime and time fields have ``hour``, ``minutes`` and -``seconds`` methods. Here is an example: - -.. code:: python - - >>> for row in db(db.log.event_time.year() > 2018).select(): - ... print(row.event) - ... - port scan - xss injection - unauthorized login - -``belongs`` -~~~~~~~~~~~ - -The SQL IN operator is realized via the ``belongs`` method which returns -true when the field value belongs to the specified set (list or tuples): - -.. code:: python - - >>> for row in db(db.log.severity.belongs((1, 2))).select(): - ... print(row.event) - ... - port scan - xss injection - -The DAL also allows a nested select as the argument of the belongs -operator. The only caveat is that the nested select has to be a -``_select``, not a ``select``, and only one field has to be selected -explicitly, the one that defines the set. - -.. code:: python - - >>> bad_days = db(db.log.severity == 3)._select(db.log.event_time) - >>> for row in db(db.log.event_time.belongs(bad_days)).select(): - ... print(row.severity, row.event) - ... - 1 port scan - 2 xss injection - 3 unauthorized login - -In those cases where a nested select is required and the look-up field -is a reference we can also use a query as argument. For example: - -.. code:: python - - db.define_table('person', Field('name')) - db.define_table('thing', - Field('name'), - Field('owner_id', 'reference person')) - - db(db.thing.owner_id.belongs(db.person.name == 'Jonathan')).select() - -In this case it is obvious that the nested select only needs the field -referenced by the ``db.thing.owner_id`` field so we do not need the more -verbose ``_select`` notation. - -A nested select can also be used as insert/update value but in this case -the syntax is different: - -.. code:: python - - lazy = db(db.person.name == 'Jonathan').nested_select(db.person.id) - - db(db.thing.id == 1).update(owner_id = lazy) - -In this case ``lazy`` is a nested expression that computes the ``id`` of -person “Jonathan”. The two lines result in one single SQL query. - -``sum``, ``avg``, ``min``, ``max`` and ``len`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Previously, you have used the ``count`` operator to count records. -Similarly, you can use the ``sum`` operator to add (sum) the values of a -specific field from a group of records. As in the case of count, the -result of a sum is retrieved via the storage object: - -.. code:: python - - >>> sum = db.log.severity.sum() - >>> print(db().select(sum).first()[sum]) - 6 - -You can also use ``avg``, ``min``, and ``max`` to the average, minimum, -and maximum value respectively for the selected records. For example: - -.. code:: python - - >>> max = db.log.severity.max() - >>> print(db().select(max).first()[max]) - 3 - -``len`` computes the length of field’s value. It is generally used on -string or text fields but depending on the back-end it may still work -for other types too (boolean, integer, etc). - -.. code:: python - - >>> for row in db(db.log.event.len() > 13).select(): - ... print(row.event) - ... - unauthorized login - -Expressions can be combined to form more complex expressions. For -example here we are computing the sum of the length of the event strings -in the logs plus one: - -.. code:: python - - >>> exp = (db.log.event.len() + 1).sum() - >>> db().select(exp).first()[exp] - 43 - -Substrings -~~~~~~~~~~ - -One can build an expression to refer to a substring. For example, we can -group things whose name starts with the same three characters and select -only one from each group: - -.. code:: python - - db(db.thing).select(distinct = db.thing.name[:3]) - -Default values with ``coalesce`` and ``coalesce_zero`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -There are times when you need to pull a value from database but also -need a default values if the value for a record is set to NULL. In SQL -there is a function, ``COALESCE``, for this. py4web has an equivalent -``coalesce`` method: - -.. code:: python - - >>> db.define_table('sysuser', Field('username'), Field('fullname')) -
- >>> db.sysuser.insert(username='max', fullname='Max Power') - 1 - >>> db.sysuser.insert(username='tim', fullname=None) - 2 - >>> coa = db.sysuser.fullname.coalesce(db.sysuser.username) - >>> for row in db().select(coa): - ... print(row[coa]) - ... - Max Power - tim - -Other times you need to compute a mathematical expression but some -fields have a value set to None while it should be zero. -``coalesce_zero`` comes to the rescue by defaulting None to zero in the -query: - -.. code:: python - - >>> db.define_table('sysuser', Field('username'), Field('points')) -
- >>> db.sysuser.insert(username='max', points=10) - 1 - >>> db.sysuser.insert(username='tim', points=None) - 2 - >>> exp = db.sysuser.points.coalesce_zero().sum() - >>> db().select(exp).first()[exp] - 10 - >>> type(exp) - - >>> print(exp) - SUM(COALESCE("sysuser"."points",'0')) - - -Exporting and importing data ----------------------------- - -CSV (one Table at a time) -~~~~~~~~~~~~~~~~~~~~~~~~~ - -When a Rows object is converted to a string it is automatically -serialized in CSV: - -.. code:: python - - >>> rows = db(db.person.id == db.thing.owner_id).select() - >>> print(rows) - person.id,person.name,thing.id,thing.name,thing.owner_id - 1,Alex,1,Boat,1 - 1,Alex,2,Chair,1 - 2,Bob,3,Shoes,2 - -You can serialize a single table in CSV and store it in a file -“test.csv”: - -.. code:: python - - with open('test.csv', 'wb') as dumpfile: - dumpfile.write(str(db(db.person).select())) - - -Converting a ``Rows`` object into a string produces an encoded binary string -and it's better to be explicit with the encoding used: - -.. code:: python - - with open('test.csv', 'w', encoding='utf-8', newline='') as dumpfile: - dumpfile.write(str(db(db.person).select())) - -This is equivalent to - -.. code:: python - - rows = db(db.person).select() - with open('test.csv', 'wb') as dumpfile: - rows.export_to_csv_file(dumpfile) - -You can read the CSV file back with: - -.. code:: python - - with open('test.csv', 'rb') as dumpfile: - db.person.import_from_csv_file(dumpfile) - -Again, you can be explict about the encoding for -the exporting file: - -.. code:: python - - rows = db(db.person).select() - with open('test.csv', 'w', encoding='utf-8', newline='') as dumpfile: - rows.export_to_csv_file(dumpfile) - -and the importing one: - -.. code:: python - - with open('test.csv', 'r', encoding='utf-8', newline='') as dumpfile: - db.person.import_from_csv_file(dumpfile) - -When importing, py4web looks for the field names in the CSV header. In -this example, it finds two columns: “person.id” and “person.name”. It -ignores the “person.” prefix, and it ignores the “id” fields. Then all -records are appended and assigned new ids. - -CSV (all tables at once) -~~~~~~~~~~~~~~~~~~~~~~~~ - -In py4web, you can backup/restore an entire database with two commands: - -To export: - -.. code:: python - - with open('somefile.csv', 'w', encoding='utf-8', newline='') as dumpfile: - db.export_to_csv_file(dumpfile) - -To import: - -.. code:: python - - with open('somefile.csv', 'r', encoding='utf-8', newline='') as dumpfile: - db.import_from_csv_file(dumpfile) - -This mechanism can be used even if the importing database is of a -different type than the exporting database. - -The data is stored in “somefile.csv” as a CSV file where each table -starts with one line that indicates the tablename, and another line with -the fieldnames: - -:: - - TABLE tablename - field1,field2,field3,... - -Two tables are separated by ``\r\n\r\n`` (that is two empty lines). The -file ends with the line - -:: - - END - -The file does not include uploaded files if these are not stored in the -database. The upload files stored on filesystem must be dumped -separately, a zip of the “uploads” folder may suffice in most cases. - -When importing, the new records will be appended to the database if it -is not empty. In general the new imported records will not have the same -record id as the original (saved) records but py4web will restore -references so they are not broken, even if the id values may change. - -If a table contains a field called ``uuid``, this field will be used to -identify duplicates. Also, if an imported record has the same ``uuid`` -as an existing record, the previous record will be updated. - -CSV and remote database synchronization -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Consider once again the following model: - -.. code:: python - - db.define_table('person', - Field('name')) - - db.define_table('thing', - Field('name'), - Field('owner_id', 'reference person')) - - # usage example - if db(db.person).isempty(): - nid = db.person.insert(name='Massimo') - db.thing.insert(name='Chair', owner_id=nid) - -Each record is identified by an identifier and referenced by that id. If -you have two copies of the database used by distinct py4web -installations, the id is unique only within each database and not across -the databases. This is a problem when merging records from different -databases. - -In order to make records uniquely identifiable across databases, they -must: - have a unique id (UUID), - have a last modification time to -track the most recent among multiple copies, - reference the UUID -instead of the id. - -This can be achieved changing the above model into: - -.. code:: python - - import datetime - import uuid - - now = datetime.datetime.utcnow - - db.define_table('person', - Field('uuid', length=64), - Field('modified_on', 'datetime', default=now, update=now), - Field('name')) - - db.define_table('thing', - Field('uuid', length=64), - Field('modified_on', 'datetime', default=now, update=now), - Field('name'), - Field('owner_id', length=64)) - - db.person.uuid.default = db.thing.uuid.default = lambda:str(uuid.uuid4()) - - db.thing.owner_id.requires = IS_IN_DB(db, 'person.uuid', '%(name)s') - - # usage example - if db(db.person).isempty(): - nid = str(uuid.uuid4()) - db.person.insert(uuid=nid, name='Massimo') - db.thing.insert(name='Chair', owner_id=nid) - -.. - - Notice that in the above table definitions, the default value for the - two ``uuid`` fields is set to a lambda function, which returns a UUID - (converted to a string). The lambda function is called once for each - record inserted, ensuring that each record gets a unique UUID, even - if multiple records are inserted in a single transaction. - -Create a controller action to export the database: - -.. code:: python - - from py4web import response - - def export(): - s = StringIO.StringIO() - db.export_to_csv_file(s) - response.set_header('Content-Type', 'text/csv') - return s.getvalue() - -Create a controller action to import a saved copy of the other database -and sync records: - -.. FIXME: from yatl.helpers? review needed on whole next example - -.. code:: python - - from yatl.helpers import FORM, INPUT - - def import_and_sync(): - form = FORM(INPUT(_type='file', _name='data'), INPUT(_type='submit')) - if form.process().accepted: - db.import_from_csv_file(form.vars.data.file, unique=False) - # for every table - for tablename in db.tables: - table = db[tablename] - # for every uuid, delete all but the latest - items = db(table).select(table.id, table.uuid, - orderby=~table.modified_on, - groupby=table.uuid) - for item in items: - db((table.uuid == item.uuid) & (table.id != item.id)).delete() - return dict(form=form) - -Optionally you should create an index manually to make the search by -uuid faster. - -Alternatively, you can use XML-RPC to export/import the file. - -If the records reference uploaded files, you also need to export/import -the content of the uploads folder. Notice that files therein are already -labeled by UUIDs so you do not need to worry about naming conflicts and -references. - -HTML and XML (one Table at a time) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Rows objects also have an ``xml`` method (like helpers) that serializes -it to XML/HTML: - -.. code:: python - - >>> rows = db(db.person.id == db.thing.owner_id).select() - >>> print(rows.xml()) - -.. code:: html - -
- - - - - - - - - - - - - - - - - - - - - - - - -
person.idperson.namething.idthing.namething.owner_id
1Alex1Boat1
1Alex2Chair1
2Bob3Shoes2
- -If you need to serialize the Rows in any other XML format with custom -tags, you can easily do that using the universal :ref:`TAG` helper -that we'll see later and the Python syntax -``*`` allowed in function calls: - -.. code:: python - - >>> rows = db(db.person).select() - >>> print(TAG.result(*[TAG.row(*[TAG.field(r[f], _name=f) for f in db.person.fields]) for r in rows])) - -.. code:: xml - - - 1Alex - 2Bob - 3Carl - - -Data representation -~~~~~~~~~~~~~~~~~~~ - -The ``Rows.export_to_csv_file`` method accepts a keyword argument named -``represent``. When ``True`` it will use the columns ``represent`` -function while exporting the data instead of the raw data. - -The function also accepts a keyword argument named ``colnames`` that -should contain a list of column names one wish to export. It defaults to -all columns. - -Both ``export_to_csv_file`` and ``import_from_csv_file`` accept keyword -arguments that tell the csv parser the format to save/load the files: - -``delimiter``: delimiter to separate values (default ‘,’) - -``quotechar``: character to use to quote string values (default to -double quotes) - ``quoting``: quote system (default -``csv.QUOTE_MINIMAL``) - -Here is some example usage: - -.. code:: python - - import csv - rows = db(query).select() - with open('/tmp/test.txt', 'wb') as oufile: - rows.export_to_csv_file(oufile, - delimiter='|', - quotechar='"', - quoting=csv.QUOTE_NONNUMERIC) - -Which would render something similar to - -:: - - "hello"|35|"this is the text description"|"2013-03-03" - -For more information consult the official Python documentation - - -Advanced features ------------------ - -.. _list_type and contains: - -``list:`` and ``contains`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -py4web provides the following special field types: - -.. code:: python - - list:string - list:integer - list:reference - -They can contain lists of strings, of integers and of references -respectively. - -On Google App Engine NoSQL ``list:string`` is mapped into -``StringListProperty``, the other two are mapped into -``ListProperty(int)``. On relational databases they are mapped into text -fields which contain the list of items separated by ``|``. For example -``[1, 2, 3]`` is mapped into ``|1|2|3|``. - -For lists of string the items are escaped so that any ``|`` in the item -is replaced by a ``||``. Anyway this is an internal representation and -it is transparent to the user. - -You can use ``list:string``, for example, in the following way: - -.. code:: python - - >>> db.define_table('product', - ... Field('name'), - ... Field('colors', 'list:string')) -
- >>> db.product.colors.requires = IS_IN_SET(('red', 'blue', 'green')) - >>> db.product.insert(name='Toy Car', colors=['red', 'green']) - 1 - >>> products = db(db.product.colors.contains('red')).select() - >>> for item in products: - ... print(item.name, item.colors) - ... - Toy Car ['red', 'green'] - -``list:integer`` works in the same way but the items must be integers. - -As usual the requirements are enforced at the level of forms, not at the -level of ``insert``. - - For ``list:`` fields the ``contains(value)`` operator maps into - a non trivial query that checks for lists containing the ``value``. - The ``contains`` operator also works for regular ``string`` and - ``text`` fields and it maps into a ``LIKE '%value%'``. - -The ``list:reference`` and the ``contains(value)`` operator are -particularly useful to de-normalize many-to-many relations. Here is an -example: - -.. code:: python - - >>> db.define_table('tag', - ... Field('name'), - ... format='%(name)s') -
- >>> db.define_table('product', - ... Field('name'), - ... Field('tags', 'list:reference tag')) -
- >>> a = db.tag.insert(name='red') - >>> b = db.tag.insert(name='green') - >>> c = db.tag.insert(name='blue') - >>> db.product.insert(name='Toy Car', tags=[a, b, c]) - 1 - >>> products = db(db.product.tags.contains(b)).select() - >>> for item in products: - ... print(item.name, item.tags) - ... - Toy Car [1, 2, 3] - >>> for item in products: - ... print(item.name, db.product.tags.represent(item.tags)) - ... - Toy Car red, green, blue - -Notice that a ``list:reference tag`` field get a default constraint - -.. code:: python - - requires = IS_IN_DB(db, db.tag._id, db.tag._format, multiple=True) - -that produces a ``SELECT/OPTION`` multiple drop-box in forms. - -Also notice that this field gets a default ``represent`` attribute which -represents the list of references as a comma-separated list of formatted -references. This is used in read ``forms``. - - While ``list:reference`` has a default validator and a default - representation, ``list:integer`` and ``list:string`` do not. So these - two need an ``IS_IN_SET`` or an ``IS_IN_DB`` validator if you want to - use them in forms. - - -Table inheritance -~~~~~~~~~~~~~~~~~ - -It is possible to create a table that contains all the fields from -another table. It is sufficient to pass the other table in place of a -field to ``define_table``. For example - -.. code:: python - - >>> db.define_table('person', Field('name'), Field('gender')) -
- >>> db.define_table('doctor', db.person, Field('specialization')) -
- -It is also possible to define a dummy table that is not stored in a -database in order to reuse it in multiple other places. For example: - -.. code:: python - - now = datetime.datetime.utcnow - - signature = db.Table(db, 'signature', - Field('is_active', 'boolean', default=True), - Field('created_on', 'datetime', default=now), - Field('created_by', db.auth_user, default=auth.user_id), - Field('modified_on', 'datetime', update=now), - Field('modified_by', db.auth_user, update=auth.user_id)) - - db.define_table('payment', Field('amount', 'double'), signature) - -This example assumes that standard py4web authentication is enabled. - -Notice that if you use ``Auth`` py4web already creates one such table -for you: - -.. code:: python - - auth = Auth(db) - db.define_table('payment', Field('amount', 'double'), auth.signature) - -When using table inheritance, if you want the inheriting table to -inherit validators, be sure to define the validators of the parent table -before defining the inheriting table. - -.. _filter_in and filter_out: - -``filter_in`` and ``filter_out`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It is possible to define a filter for each field to be called before a -value is inserted into the database for that field and after a value is -retrieved from the database. - -Imagine for example that you want to store a serializable Python data -structure in a field in the JSON format. Here is how it could be -accomplished: - -.. code:: python - - >>> import json - >>> db.define_table('anyobj', - ... Field('name'), - ... Field('data', 'text')) -
- >>> db.anyobj.data.filter_in = lambda obj: json.dumps(obj) - >>> db.anyobj.data.filter_out = lambda txt: json.loads(txt) - >>> myobj = ['hello', 'world', 1, {2: 3}] - >>> aid = db.anyobj.insert(name='myobjname', data=myobj) - >>> row = db.anyobj[aid] - >>> row.data - ['hello', 'world', 1, {'2': 3}] - -Another way to accomplish the same is by using a Field of type -``SQLCustomType``, as discussed in :ref:`Custom Field types`. - -callbacks on record insert, delete and update -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -PY4WEB provides a mechanism to register callbacks to be called before -and/or after insert, update and delete of records. - -Each table stores six lists of callbacks: - -:: - - db.mytable._before_insert - db.mytable._after_insert - db.mytable._before_update - db.mytable._after_update - db.mytable._before_delete - db.mytable._after_delete - -You can register a callback function by appending it to the -corresponding list. The caveat is that depending on the functionality, -the callback has different signature. - -This is best explained by examples. - -.. code:: python - - >>> db.define_table('person', Field('name')) -
- >>> def pprint(callback, *args): - ... print("%s%s" % (callback, args)) - ... - >>> db.person._before_insert.append(lambda f: pprint('before_insert', f)) - >>> db.person._after_insert.append(lambda f, i: pprint('after_insert', f, i)) - >>> db.person.insert(name='John') - before_insert(,) - after_insert(, 1) - 1 - >>> db.person._before_update.append(lambda s, f: pprint('before_update', s, f)) - >>> db.person._after_update.append(lambda s, f: pprint('after_update', s, f)) - >>> db(db.person.id == 1).update(name='Tim') - before_update(, ) - after_update(, ) - 1 - >>> db.person._before_delete.append(lambda s: pprint('before_delete', s)) - >>> db.person._after_delete.append(lambda s: pprint('after_delete', s)) - >>> db(db.person.id == 1).delete() - before_delete(,) - after_delete(,) - 1 - -As you can see: - ``f`` gets passed the ``OpRow`` object with data for -insert or update. - ``i`` gets passed the id of the newly inserted -record. - ``s`` gets passed the ``Set`` object used for update or -delete. ``OpRow`` is an helper object specialized in storing (field, -value) pairs, you can think of it as a normal dictionary that you can -use even with the syntax of attribute notation (that is ``f.name`` and -``f['name']`` are equivalent). - -The return values of these callback should be ``None`` or ``False``. If -any of the ``_before_*`` callback returns a ``True`` value it will abort -the actual insert/update/delete operation. - -Some times a callback may need to perform an update in the same or a -different table and one wants to avoid firing other callbacks, which -could cause an infinite loop. - -For this purpose there the ``Set`` objects have an ``update_naive`` -method that works like ``update`` but ignores before and after -callbacks. - -Database cascades -^^^^^^^^^^^^^^^^^ - -Database schema can define relationships which trigger deletions of -related records, known as cascading. The DAL is not informed when a -record is deleted due to a cascade. So no \*_delete callback will ever -be called as consequence of a cascade-deletion. - -Record versioning -~~~~~~~~~~~~~~~~~ - -It is possible to ask py4web to save every copy of a record when the -record is individually modified. There are different ways to do it and -it can be done for all tables at once using the syntax: - -.. code:: python - - auth.enable_record_versioning(db) - -this requires ``Auth``. It can also be done for each individual table as -discussed below. - -Consider the following table: - -.. code:: python - - db.define_table('stored_item', - Field('name'), - Field('quantity', 'integer'), - Field('is_active', 'boolean', - writable=False, readable=False, default=True)) - -Notice the hidden boolean field called ``is_active`` and defaulting to -True. - -We can tell py4web to create a new table (in the same or a different -database) and store all previous versions of each record in the table, -when modified. - -This is done in the following way: - -.. code:: python - - db.stored_item._enable_record_versioning() - -or in a more verbose syntax: - -.. code:: python - - db.stored_item._enable_record_versioning(archive_db=db, - archive_name='stored_item_archive', - current_record='current_record', - is_active='is_active') - -The ``archive_db=db`` tells py4web to store the archive table in the -same database as the ``stored_item`` table. The ``archive_name`` sets -the name for the archive table. The archive table has the same fields as -the original table ``stored_item`` except that unique fields are no -longer unique (because it needs to store multiple versions) and has an -extra field which name is specified by ``current_record`` and which is a -reference to the current record in the ``stored_item`` table. - -When records are deleted, they are not really deleted. A deleted record -is copied in the ``stored_item_archive`` table (like when it is -modified) and the ``is_active`` field is set to False. By enabling -record versioning py4web sets a ``common_filter`` on this table that -hides all records in table ``stored_item`` where the ``is_active`` field -is set to False. The ``is_active`` parameter in the -``_enable_record_versioning`` method allows to specify the name of the -field used by the ``common_filter`` to determine if the field was -deleted or not. - -Common filters -~~~~~~~~~~~~~~ - -A common filter is a generalization of the above multi-tenancy idea. It -provides an easy way to prevent repeating of the same query. Consider -for example the following table: - -.. code:: python - - db.define_table('blog_post', - Field('subject'), - Field('post_text', 'text'), - Field('is_public', 'boolean'), - common_filter = lambda query: db.blog_post.is_public == True) - -Any select, delete or update in this table, will include only public -blog posts. The attribute can also be modified at runtime: - -.. code:: python - - db.blog_post._common_filter = lambda query: ... - -It serves both as a way to avoid repeating the -“db.blog_post.is_public==True” phrase in each blog post search, and also -as a security enhancement, that prevents you from forgetting to disallow -viewing of non-public posts. - -In case you actually do want items left out by the common filter (for -example, allowing the admin to see non-public posts), you can either -remove the filter: - -.. code:: python - - db.blog_post._common_filter = None - -or ignore it: - -.. code:: python - - db(query, ignore_common_filters=True) - -.. - - Note that common_filters are ignored by the appadmin interface. - -.. _Custom Field types: - -Custom ``Field`` types -~~~~~~~~~~~~~~~~~~~~~~ - -Aside for using ``filter_in`` and ``filter_out``, it is possible to -define new/custom field types. For example, suppose that you want to -define a custom type to store an IP address: - -.. code:: python - - >>> def ip2int(sv): - ... "Convert an IPV4 to an integer." - ... sp = sv.split('.'); assert len(sp) == 4 # IPV4 only - ... iip = 0 - ... for i in map(int, sp): iip = (iip<<8) + i - ... return iip - ... - >>> def int2ip(iv): - ... "Convert an integer to an IPV4." - ... assert iv > 0 - ... iv = (iv,); ov = [] - ... for i in range(3): - ... iv = divmod(iv[0], 256) - ... ov.insert(0, iv[1]) - ... ov.insert(0, iv[0]) - ... return '.'.join(map(str, ov)) - ... - >>> from pydal import SQLCustomType - >>> ipv4 = SQLCustomType(type='string', native='integer', - ... encoder=lambda x : str(ip2int(x)), decoder=int2ip) - >>> db.define_table('website', - ... Field('name'), - ... Field('ipaddr', type=ipv4)) -
- >>> db.website.insert(name='wikipedia', ipaddr='91.198.174.192') - 1 - >>> db.website.insert(name='google', ipaddr='172.217.11.174') - 2 - >>> db.website.insert(name='youtube', ipaddr='74.125.65.91') - 3 - >>> db.website.insert(name='github', ipaddr='207.97.227.239') - 4 - >>> rows = db(db.website.ipaddr > '100.0.0.0').select(orderby=~db.website.ipaddr) - >>> for row in rows: - ... print(row.name, row.ipaddr) - ... - github 207.97.227.239 - google 172.217.11.174 - -``SQLCustomType`` is a field type factory. Its ``type`` argument must be -one of the standard py4web types. It tells py4web how to treat the field -values at the py4web level. ``native`` is the type of the field as far -as the database is concerned. Allowed names depend on the database -engine. ``encoder`` is an optional transformation function applied when -the data is stored and ``decoder`` is the optional reverse -transformation function. - - This feature is marked as experimental because can make your code not - portable across database engines. - -It does not work on Google App Engine NoSQL. - -Using DAL without define tables -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The DAL can be used from any Python program simply by doing this: - -.. code:: python - - from pydal import DAL, Field - db = DAL('sqlite://storage.sqlite', folder='path/to/app/databases') - -i.e. import the DAL, connect and specify the folder which contains the -.table files (the app/databases folder). - -To access the data and its attributes we still have to define all the -tables we are going to access with ``db.define_table``. - -If we just need access to the data but not to the py4web table -attributes, we get away without re-defining the tables but simply asking -py4web to read the necessary info from the metadata in the .table files: - -.. code:: python - - from py4web import DAL, Field - db = DAL('sqlite://storage.sqlite', folder='path/to/app/databases', auto_import=True) - -This allows us to access any db.table without need to re-define it. - -Distributed transaction -~~~~~~~~~~~~~~~~~~~~~~~ - - At the time of writing this feature is only supported by PostgreSQL, - MySQL and Firebird, since they expose API for two-phase commits. - -Assuming you have two (or more) connections to distinct PostgreSQL -databases, for example: - -.. code:: python - - db_a = DAL('postgres://...') - db_b = DAL('postgres://...') - -In your models or controllers, you can commit them concurrently with: - -.. code:: python - - DAL.distributed_transaction_commit(db_a, db_b) - -On failure, this function rolls back and raises an ``Exception``. - -In controllers, when one action returns, if you have two distinct -connections and you do not call the above function, py4web commits them -separately. This means there is a possibility that one of the commits -succeeds and one fails. The distributed transaction prevents this from -happening. - - -Copy data from one db into another -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Consider the situation in which you have been using the following -database: - -.. code:: python - - db = DAL('sqlite://storage.sqlite') - -and you wish to move to another database using a different connection -string: - -.. code:: python - - db = DAL('postgres://username:password@localhost/mydb') - -Before you switch, you want to move the data and rebuild all the -metadata for the new database. We assume the new database to exist but -we also assume it is empty. - - -Gotchas -------- - -Note on new DAL and adapters -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. FIXME: review needed - -The source code of the Database Abstraction Layer was completely -rewritten in 2010. While it stays backward compatible, the rewrite made -it more modular and easier to extend. Here we explain the main logic. - -The module “dal.py” defines, among other, the following classes. - -:: - - ConnectionPool - BaseAdapter extends ConnectionPool - Row - DAL - Reference - Table - Expression - Field - Query - Set - Rows - -Their use has been explained in the previous sections, except for -``BaseAdapter``. When the methods of a ``Table`` or ``Set`` object need -to communicate with the database they delegate to methods of the adapter -the task to generate the SQL and or the function call. - -For example: - -.. code:: python - - db.mytable.insert(myfield='myvalue') - -calls - -.. code:: python - - Table.insert(myfield='myvalue') - -which delegates the adapter by returning: - -.. code:: python - - db._adapter.insert(db.mytable, db.mytable._listify(dict(myfield='myvalue'))) - -Here ``db.mytable._listify`` converts the dict of arguments into a list -of ``(field,value)`` and calls the ``insert`` method of the ``adapter``. -``db._adapter`` does more or less the following: - -.. code:: python - - query = db._adapter._insert(db.mytable, list_of_fields) - db._adapter.execute(query) - -where the first line builds the query and the second executes it. - -``BaseAdapter`` defines the interface for all adapters. - -pyDAL at the moment of writing this book, contains the -following adapters: - -:: - - SQLiteAdapter extends BaseAdapter - JDBCSQLiteAdapter extends SQLiteAdapter - MySQLAdapter extends BaseAdapter - PostgreSQLAdapter extends BaseAdapter - JDBCPostgreSQLAdapter extends PostgreSQLAdapter - OracleAdapter extends BaseAdapter - MSSQLAdapter extends BaseAdapter - MSSQL2Adapter extends MSSQLAdapter - MSSQL3Adapter extends MSSQLAdapter - MSSQL4Adapter extends MSSQLAdapter - FireBirdAdapter extends BaseAdapter - FireBirdEmbeddedAdapter extends FireBirdAdapter - InformixAdapter extends BaseAdapter - DB2Adapter extends BaseAdapter - IngresAdapter extends BaseAdapter - IngresUnicodeAdapter extends IngresAdapter - GoogleSQLAdapter extends MySQLAdapter - NoSQLAdapter extends BaseAdapter - GoogleDatastoreAdapter extends NoSQLAdapter - CubridAdapter extends MySQLAdapter (experimental) - TeradataAdapter extends DB2Adapter (experimental) - SAPDBAdapter extends BaseAdapter (experimental) - CouchDBAdapter extends NoSQLAdapter (experimental) - IMAPAdapter extends NoSQLAdapter (experimental) - MongoDBAdapter extends NoSQLAdapter (experimental) - VerticaAdapter extends MSSQLAdapter (experimental) - SybaseAdapter extends MSSQLAdapter (experimental) - -which override the behavior of the ``BaseAdapter``. - -Each adapter has more or less this structure: - -.. code:: python - - class MySQLAdapter(BaseAdapter): - - # specify a driver to use - driver = globals().get('pymysql', None) - - # map py4web types into database types - types = { - 'boolean': 'CHAR(1)', - 'string': 'VARCHAR(%(length)s)', - 'text': 'LONGTEXT', - ... - } - - # connect to the database using driver - def __init__(self, db, uri, pool_size=0, folder=None, db_codec ='UTF-8', - credential_decoder=lambda x:x, driver_args={}, - adapter_args={}): - # parse uri string and store parameters in driver_args - ... - # define a connection function - def connect(driver_args=driver_args): - return self.driver.connect(**driver_args) - # place it in the pool - self.pool_connection(connect) - # set optional parameters (after connection) - self.execute('SET FOREIGN_KEY_CHECKS=1;') - self.execute("SET sql_mode='NO_BACKSLASH_ESCAPES';") - - # override BaseAdapter methods as needed - def lastrowid(self, table): - self.execute('select last_insert_id();') - return int(self.cursor.fetchone()[0]) - -Looking at the various adapters as example should be easy to write new -ones. - -When ``db`` instance is created: - -.. code:: python - - db = DAL('mysql://...') - -the prefix in the uri string defines the adapter. The mapping is defined -in the following dictionary also in “dal.py”: - -.. FIXME: “dal.py” has gone! adpaters are now in pydal.adapters (not a dict) - -.. list-table:: - - * - couchdb - - pydal.adapters.couchdb.CouchDB - * - cubrid - - pydal.adapters.mysql.Cubrid - * - db2:ibm_db_dbi - - pydal.adapters.db2.DB2IBM - * - db2:pyodbc - - pydal.adapters.db2.DB2Pyodbc - * - firebird - - pydal.adapters.firebird.FireBird - * - firebird_embedded - - pydal.adapters.firebird.FireBirdEmbedded - * - google:MySQLdb - - pydal.adapters.google.GoogleMySQL - * - google:datastore - - pydal.adapters.google.GoogleDatastore - * - google:datastore+ndb - - pydal.adapters.google.GoogleDatastore - * - google:psycopg2 - - pydal.adapters.google.GooglePostgres - * - google:sql - - pydal.adapters.google.GoogleSQL - * - informix - - pydal.adapters.informix.Informix - * - informix-se - - pydal.adapters.informix.InformixSE - * - ingres - - pydal.adapters.ingres.Ingres - * - ingresu - - pydal.adapters.ingres.IngresUnicode - * - jdbc:postgres - - pydal.adapters.postgres.JDBCPostgre - * - jdbc:sqlite - - pydal.adapters.sqlite.JDBCSQLite - * - jdbc:sqlite:memory - - pydal.adapters.sqlite.JDBCSQLite - * - mongodb - - pydal.adapters.mongo.Mongo - * - mssql - - pydal.adapters.mssql.MSSQL1 - * - mssql2 - - pydal.adapters.mssql.MSSQL1N - * - mssql3 - - pydal.adapters.mssql.MSSQL3 - * - mssql3n - - pydal.adapters.mssql.MSSQL3N - * - mssql4 - - pydal.adapters.mssql.MSSQL4 - * - mssql4n - - pydal.adapters.mssql.MSSQL4N - * - mssqln - - pydal.adapters.mssql.MSSQL1N - * - mysql - - pydal.adapters.mysql.MySQL - * - oracle - - pydal.adapters.oracle.Oracle - * - postgres - - pydal.adapters.postgres.Postgre - * - postgres2 - - pydal.adapters.postgres.PostgreNew - * - postgres2:psycopg2 - - pydal.adapters.postgres.PostgrePsycoNew - * - postgres3 - - pydal.adapters.postgres.PostgreBoolean - * - postgres3:psycopg2 - - pydal.adapters.postgres.PostgrePsycoBoolean - * - postgres:psycopg2 - - pydal.adapters.postgres.PostgrePsyco - * - pytds - - pydal.adapters.mssql.PyTDS - * - sapdb - - pydal.adapters.sap.SAPDB - * - spatialite - - pydal.adapters.sqlite.Spatialite - * - spatialite:memory - - pydal.adapters.sqlite.Spatialite - * - sqlite - - pydal.adapters.sqlite.SQLite - * - sqlite:memory - - pydal.adapters.sqlite.SQLite - * - sybase - - pydal.adapters.mssql.Sybase - * - teradata - - pydal.adapters.teradata.Teradata - * - vertica - - pydal.adapters.mssql.Vertica - -the uri string is then parsed in more detail by the adapter itself. -An updated list of adapters can be obtained as dictionary with - -.. code: python - - from pydal.adapters import adapters - ADAPTERS = adapters.__dict__['_registry_'] - -For any adapter you can replace the driver with a different one -globally (not thread safe): - -.. code:: python - - import MySQLdb as mysqldb - from pydal.adapters.mysql import SQLAdapter - SQLAdapter.driver = mysqldb - -i.e. ``mysqldb`` has to be *that module* with a .connect() method. You -can specify optional driver arguments and adapter arguments: - -.. code:: python - - db = DAL(..., driver_args={}, adapter_args={}) - -For recognized adapters you can also simply specify the name in the -``adapter_args``: - -.. code:: python - - from pydal.adapters.mysql import MySQL - assert "mysqldv" in MySQL.drivers - db = DAL(..., driver_args={}, adapter_args={"driver": "mysqldb"}) - - -SQLite -~~~~~~ - -SQLite does not support dropping and altering columns. That means that -py4web migrations will work up to a point. If you delete a field from a -table, the column will remain in the database but will be invisible to -py4web. If you decide to reinstate the column, py4web will try re-create -it and fail. In this case you must set ``fake_migrate=True`` so that -metadata is rebuilt without attempting to add the column again. Also, -for the same reason, SQLite is not aware of any change of column -type. If you insert a number in a string field, it will be stored as -string. If you later change the model and replace the type “string” with -type “integer”, SQLite will continue to keep the number as a string and -this may cause problem when you try to extract the data. - -SQLite doesn’t have a boolean type. py4web internally maps booleans to a -1 character string, with ‘T’ and ‘F’ representing True and False. The -DAL handles this completely; the abstraction of a true boolean value -works well. But if you are updating the SQLite table with SQL directly, -be aware of the py4web implementation, and avoid using 0 and 1 values. - -MySQL -~~~~~ - -MySQL does not support multiple ALTER TABLE within a single transaction. -This means that any migration process is broken into multiple commits. -If something happens that causes a failure it is possible to break a -migration (the py4web metadata are no longer in sync with the actual -table structure in the database). This is unfortunate but it can be -prevented (migrate one table at the time) or it can be fixed in the -aftermath (revert the py4web model to what corresponds to the table -structure in database, set ``fake_migrate=True`` and after the metadata -has been rebuilt, set ``fake_migrate=False`` and migrate the table -again). - -Google SQL -~~~~~~~~~~ - -Google SQL has the same problems as MySQL and more. In particular table -metadata itself must be stored in the database in a table that is not -migrated by py4web. This is because Google App Engine has a read-only -file system. PY4WEB migrations in Google SQL combined with the MySQL -issue described above can result in metadata corruption. Again, this can -be prevented (by migrating the table at once and then setting -migrate=False so that the metadata table is not accessed any more) or it -can fixed in the aftermath (by accessing the database using the Google -dashboard and deleting any corrupted entry from the table called -``py4web_filesystem``. - -MSSQL (Microsoft SQL Server) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -MSSQL < 2012 does not support the SQL OFFSET keyword. Therefore the -database cannot do pagination. When doing a ``limitby=(a, b)`` py4web -will fetch the first ``a + b`` rows and discard the first ``a``. This -may result in a considerable overhead when compared with other database -engines. If you’re using MSSQL >= 2005, the recommended prefix to use is -``mssql3://`` which provides a method to avoid the issue of fetching the -entire non-paginated resultset. If you’re on MSSQL >= 2012, use -``mssql4://`` that uses the -``OFFSET ... ROWS ... FETCH NEXT ... ROWS ONLY`` construct to support -natively pagination without performance hits like other backends. The -``mssql://`` uri also enforces (for historical reasons) the use of -``text`` columns, that are superseeded in more recent versions (from -2005 onwards) by ``varchar(max)``. ``mssql3://`` and ``mssql4://`` -should be used if you don’t want to face some limitations of the - -officially deprecated - ``text`` columns. - -MSSQL has problems with circular references in tables that have ONDELETE -CASCADE. This is an MSSQL bug and you work around it by setting the -ondelete attribute for all reference fields to “NO ACTION”. You can also -do it once and for all before you define tables: - -.. code:: python - - db = DAL('mssql://....') - for key in db._adapter.types: - if ' ON DELETE %(on_delete_action)s' in db._adapter.types[key]: - db._adapter.types[key] = db._adapter.types[key].replace('%(on_delete_action)s', 'NO ACTION') - -MSSQL also has problems with arguments passed to the DISTINCT keyword -and therefore while this works, - -.. code:: python - - db(query).select(distinct=True) - -this does not - -.. code:: python - - db(query).select(distinct=db.mytable.myfield) - -Oracle -~~~~~~ - -Oracle also does not support pagination. It does not support neither the -OFFSET nor the LIMIT keywords. PY4WEB achieves pagination by translating -a ``db(...).select(limitby=(a, b))`` into a complex three-way nested -select (as suggested by official Oracle documentation). This works for -simple select but may break for complex selects involving aliased fields -and or joins. - -Google NoSQL (Datastore) -~~~~~~~~~~~~~~~~~~~~~~~~ - -Google NoSQL (Datastore) does not allow joins, left joins, aggregates, -expression, OR involving more than one table, the ‘like’ operator -searches in “text” fields. - -Transactions are limited and not provided automatically by py4web (you -need to use the Google API ``run_in_transaction`` which you can look up -in the Google App Engine documentation online). - -Google also limits the number of records you can retrieve in each one -query (1000 at the time of writing). On the Google datastore record IDs -are integer but they are not sequential. While on SQL the “list:string” -type is mapped into a “text” type, on the Google Datastore it is mapped -into a ``ListStringProperty``. Similarly “list:integer” and -“list:reference” are mapped into ``ListProperty``. This makes searches -for content inside these fields types more efficient on Google NoSQL -than on SQL databases. diff --git a/apps/_documentation/static/en/_sources/chapter-08.rst.txt b/apps/_documentation/static/en/_sources/chapter-08.rst.txt deleted file mode 100644 index cefb66bbc..000000000 --- a/apps/_documentation/static/en/_sources/chapter-08.rst.txt +++ /dev/null @@ -1,1043 +0,0 @@ -=========== -The RESTAPI -=========== - -Since version 19.5.10 pyDAL includes a restful API called RestAPI. It is -inspired by GraphQL and while it’s not quite the same due to it being less -powerful, it is in the spirit of py4web where it's more practical and easier to use. -Like GraphQL RestAPI allows a client to query for information using the -GET method and allows to specify some details about the format of the -response (which references to follow, and how to denormalize the data). -Unlike GraphQL it allows the server to specify a policy and restrict -which queries are allowed and which one are not. They can be evaluated -dynamically per request based on the user and the state of the server. -As the name implied RestAPI allows all standard methods: GET, POST, PUT, -and DELETE. Each of them can be enabled or disabled based on the policy, -for individual tables and individual fields. - -.. note:: - - Specifications might be subject to changes since this is a new feature. - -In the examples below we assume an app called “superheroes” and the -following model: - -.. code:: python - - db.define_table( - 'person', - Field('name'), - Field('job')) - - db.define_table( - 'superhero', - Field('name'), - Field('real_identity', 'reference person')) - - db.define_table( - 'superpower', - Field('description')) - - db.define_table( - 'tag', - Field('superhero', 'reference superhero'), - Field('superpower', 'reference superpower'), - Field('strength', 'integer')) - -We also assume the following controller: - -.. code:: python - - from py4web import action, request - from .common import db - from pydal.restapi import RestAPI, Policy - - policy = Policy() - policy.set('superhero', 'GET', authorize=True, allowed_patterns=['*']) - policy.set('*', 'GET', authorize=True, allowed_patterns=['*']) - - # for security reasons we disabled here all methods but GET at the policy level, to enable any of them just set authorize = True - policy.set('*', 'PUT', authorize=False) - policy.set('*', 'POST', authorize=False) - policy.set('*', 'DELETE', authorize=False) - - @action('api//', method = ['GET', 'POST']) - @action('api//', method = ['GET', 'PUT', 'DELETE']) - @action.uses(db) - def api(tablename, rec_id=None): - return RestAPI(db, policy)(request.method, - tablename, - rec_id, - request.GET, - request.POST - ) - -The policy is per table (or \* for all tables and per method. authorize -can be True (allow), False (deny) or a function with the signature -(method, tablename, record_id, get_vars, post_vars) which returns -True/False. For the GET policy one can specify a list of allowed query -patterns (\* for all). A query pattern will be matched against the keys -in the query string. - -The above action is exposed as: - -:: - - /superheroes/api/{tablename} - /superheroes/api/{tablename}/{rec_id} - -.. note:: - - Keep in mind that **request.POST** only contains the form data - that is posted using a **regular HTML-form** or **JavaScript - FormData** object. If you post just plain object - (e.g. ``axios.post('path/to/api', {field:'some'})``) you should pass - **request.json** instead of request.POST, since the latter will contain - just raw request-body which is string, not JSON. See `Bottle - `__ documentation about ``request`` object. - - -RestAPI GET ------------ - -The general query has the form ``{something}.eq=value`` where ``eq=`` -stands for “equal”, ``gt=`` stands for “greater than”, etc. The -expression can be prepended by ``not.``. - -``{something}`` can be the name of a field in the table being queried as -in: - -**All superheroes called “Superman”** - -:: - - /superheroes/api/superhero?name.eq=Superman - -It can be the name of a field of a table referred by the table being -queried as in: - -**All superheroes with real identity “Clark Kent”** - -:: - - /superheroes/api/superhero?real_identity.name.eq=Clark Kent - -It can be the name of a field of a table that refers to the table being -queried as in: - -**All superheroes with any tag superpower with strength > 90** - -:: - - /superheroes/api/superhero?superhero.tag.strength.gt=90 - -(here ``tag`` is the name of the link table, the preceding ``superhero`` is -the name of the field that refers to the selected table and ``strength`` -is the name of the field used to filter) - -It can also be a field of the table referenced by a many-to-many linked -table as in: - -**All superheroes with the flight power** - -:: - - /superheroes/api/superhero?superhero.tag.superpower.description.eq=Flight - -The key to understand the syntax above is to break it as follows: - -:: - - superhero?superhero.tag.superpower.description.eq=Flight - -and read it as: - - select records of table **superhero** referred by field **superhero** - of table **tag** when the **superpower** field of said table points - to a record with **description** **eq**\ ual to “Flight”. - -The query allows additional modifiers for example - -:: - - @offset=10 - @limit=10 - @order=name - @model=true - @lookup=real_identity - -The first 3 are obvious. ``@model`` returns a JSON description of database -model. ``@lookup`` denormalizes the linked field. - -Here are some practical examples: - -URL: - -:: - - /superheroes/api/superhero - -OUTPUT: - -.. code:: json - - { - "count": 3, - "status": "success", - "code": 200, - "items": [ - { - "real_identity": 1, - "name": "Superman", - "id": 1 - }, - { - "real_identity": 2, - "name": "Spiderman", - "id": 2 - }, - { - "real_identity": 3, - "name": "Batman", - "id": 3 - } - ], - "timestamp": "2019-05-19T05:38:00.132635", - "api_version": "0.1" - } - -URL: - -:: - - /superheroes/api/superhero?@model=true - -OUTPUT: - -.. code:: json - - { - "count": 3, - "status": "success", - "code": 200, - "items": [ - { - "real_identity": 1, - "name": "Superman", - "id": 1 - }, - { - "real_identity": 2, - "name": "Spiderman", - "id": 2 - }, - { - "real_identity": 3, - "name": "Batman", - "id": 3 - } - ], - "timestamp": "2021-01-04T07:03:38.466030", - "model": [ - { - "regex": "[1-9]\\d*", - "name": "id", - "default": null, - "required": false, - "label": "Id", - "post_writable": true, - "referenced_by": [ - "tag.superhero" - ], - "unique": false, - "type": "id", - "options": null, - "put_writable": true - }, - { - "regex": null, - "name": "name", - "default": null, - "required": false, - "label": "Name", - "post_writable": true, - "unique": false, - "type": "string", - "options": null, - "put_writable": true - }, - { - "regex": null, - "name": "real_identity", - "default": null, - "required": false, - "label": "Real Identity", - "post_writable": true, - "references": "person", - "unique": false, - "type": "reference", - "options": null, - "put_writable": true - } - ], - "api_version": "0.1" - } - -URL: - -:: - - /superheroes/api/superhero?@lookup=real_identity - -OUTPUT: - -.. code:: json - - { - "count": 3, - "status": "success", - "code": 200, - "items": [ - { - "real_identity": { - "name": "Clark Kent", - "job": "Journalist", - "id": 1 - }, - "name": "Superman", - "id": 1 - }, - { - "real_identity": { - "name": "Peter Park", - "job": "Photographer", - "id": 2 - }, - "name": "Spiderman", - "id": 2 - }, - { - "real_identity": { - "name": "Bruce Wayne", - "job": "CEO", - "id": 3 - }, - "name": "Batman", - "id": 3 - } - ], - "timestamp": "2019-05-19T05:38:00.178974", - "api_version": "0.1" - } - -URL: - -:: - - /superheroes/api/superhero?@lookup=identity:real_identity - -(denormalize the real_identity and rename it identity) - -OUTPUT: - -.. code:: json - - { - "count": 3, - "status": "success", - "code": 200, - "items": [ - { - "real_identity": 1, - "name": "Superman", - "id": 1, - "identity": { - "name": "Clark Kent", - "job": "Journalist", - "id": 1 - } - }, - { - "real_identity": 2, - "name": "Spiderman", - "id": 2, - "identity": { - "name": "Peter Park", - "job": "Photographer", - "id": 2 - } - }, - { - "real_identity": 3, - "name": "Batman", - "id": 3, - "identity": { - "name": "Bruce Wayne", - "job": "CEO", - "id": 3 - } - } - ], - "timestamp": "2019-05-19T05:38:00.123218", - "api_version": "0.1" - } - -URL: - -:: - - /superheroes/api/superhero?@lookup=identity!:real_identity[name,job] - -(denormalize the real_identity [but only fields name and job], collapse -the with the identity prefix) - -OUTPUT: - -.. code:: json - - { - "count": 3, - "status": "success", - "code": 200, - "items": [ - { - "name": "Superman", - "identity.job": "Journalist", - "identity.name": "Clark Kent", - "id": 1 - }, - { - "name": "Spiderman", - "identity.job": "Photographer", - "identity.name": "Peter Park", - "id": 2 - }, - { - "name": "Batman", - "identity.job": "CEO", - "identity.name": "Bruce Wayne", - "id": 3 - } - ], - "timestamp": "2021-01-04T07:03:38.559918", - "api_version": "0.1" - } - -URL: - -:: - - /superheroes/api/superhero?@lookup=superhero.tag - -OUTPUT: - -.. code:: json - - { - "count": 3, - "status": "success", - "code": 200, - "items": [ - { - "real_identity": 1, - "name": "Superman", - "superhero.tag": [ - { - "strength": 100, - "superhero": 1, - "id": 1, - "superpower": 1 - }, - { - "strength": 100, - "superhero": 1, - "id": 2, - "superpower": 2 - }, - { - "strength": 100, - "superhero": 1, - "id": 3, - "superpower": 3 - }, - { - "strength": 100, - "superhero": 1, - "id": 4, - "superpower": 4 - } - ], - "id": 1 - }, - { - "real_identity": 2, - "name": "Spiderman", - "superhero.tag": [ - { - "strength": 50, - "superhero": 2, - "id": 5, - "superpower": 2 - }, - { - "strength": 75, - "superhero": 2, - "id": 6, - "superpower": 3 - }, - { - "strength": 10, - "superhero": 2, - "id": 7, - "superpower": 4 - } - ], - "id": 2 - }, - { - "real_identity": 3, - "name": "Batman", - "superhero.tag": [ - { - "strength": 80, - "superhero": 3, - "id": 8, - "superpower": 2 - }, - { - "strength": 20, - "superhero": 3, - "id": 9, - "superpower": 3 - }, - { - "strength": 70, - "superhero": 3, - "id": 10, - "superpower": 4 - } - ], - "id": 3 - } - ], - "timestamp": "2019-05-19T05:38:00.201988", - "api_version": "0.1" - } - -URL: - -:: - - /superheroes/api/superhero?@lookup=superhero.tag.superpower - -OUTPUT: - -.. code:: json - - { - "count": 3, - "status": "success", - "code": 200, - "items": [ - { - "real_identity": 1, - "name": "Superman", - "superhero.tag.superpower": [ - { - "strength": 100, - "superhero": 1, - "id": 1, - "superpower": { - "id": 1, - "description": "Flight" - } - }, - { - "strength": 100, - "superhero": 1, - "id": 2, - "superpower": { - "id": 2, - "description": "Strength" - } - }, - { - "strength": 100, - "superhero": 1, - "id": 3, - "superpower": { - "id": 3, - "description": "Speed" - } - }, - { - "strength": 100, - "superhero": 1, - "id": 4, - "superpower": { - "id": 4, - "description": "Durability" - } - } - ], - "id": 1 - }, - { - "real_identity": 2, - "name": "Spiderman", - "superhero.tag.superpower": [ - { - "strength": 50, - "superhero": 2, - "id": 5, - "superpower": { - "id": 2, - "description": "Strength" - } - }, - { - "strength": 75, - "superhero": 2, - "id": 6, - "superpower": { - "id": 3, - "description": "Speed" - } - }, - { - "strength": 10, - "superhero": 2, - "id": 7, - "superpower": { - "id": 4, - "description": "Durability" - } - } - ], - "id": 2 - }, - { - "real_identity": 3, - "name": "Batman", - "superhero.tag.superpower": [ - { - "strength": 80, - "superhero": 3, - "id": 8, - "superpower": { - "id": 2, - "description": "Strength" - } - }, - { - "strength": 20, - "superhero": 3, - "id": 9, - "superpower": { - "id": 3, - "description": "Speed" - } - }, - { - "strength": 70, - "superhero": 3, - "id": 10, - "superpower": { - "id": 4, - "description": "Durability" - } - } - ], - "id": 3 - } - ], - "timestamp": "2019-05-19T05:38:00.322494", - "api_version": "0.1" - } - -URL (it's a single line, split for readability): - -:: - - /superheroes/api/superhero? - @lookup=powers:superhero.tag[strength].superpower[description] - -OUTPUT: - -.. code:: json - - { - "count": 3, - "status": "success", - "code": 200, - "items": [ - { - "real_identity": 1, - "name": "Superman", - "powers": [ - { - "strength": 100, - "superpower": { - "description": "Flight" - } - }, - { - "strength": 100, - "superpower": { - "description": "Strength" - } - }, - { - "strength": 100, - "superpower": { - "description": "Speed" - } - }, - { - "strength": 100, - "superpower": { - "description": "Durability" - } - } - ], - "id": 1 - }, - { - "real_identity": 2, - "name": "Spiderman", - "powers": [ - { - "strength": 50, - "superpower": { - "description": "Strength" - } - }, - { - "strength": 75, - "superpower": { - "description": "Speed" - } - }, - { - "strength": 10, - "superpower": { - "description": "Durability" - } - } - ], - "id": 2 - }, - { - "real_identity": 3, - "name": "Batman", - "powers": [ - { - "strength": 80, - "superpower": { - "description": "Strength" - } - }, - { - "strength": 20, - "superpower": { - "description": "Speed" - } - }, - { - "strength": 70, - "superpower": { - "description": "Durability" - } - } - ], - "id": 3 - } - ], - "timestamp": "2019-05-19T05:38:00.309903", - "api_version": "0.1" - } - -URL (it's a single line, split for readability): - -:: - - /superheroes/api/superhero? - @lookup=powers!:superhero.tag[strength].superpower[description] - -OUTPUT: - -.. code:: json - - { - "count": 3, - "status": "success", - "code": 200, - "items": [ - { - "real_identity": 1, - "name": "Superman", - "powers": [ - { - "strength": 100, - "description": "Flight" - }, - { - "strength": 100, - "description": "Strength" - }, - { - "strength": 100, - "description": "Speed" - }, - { - "strength": 100, - "description": "Durability" - } - ], - "id": 1 - }, - { - "real_identity": 2, - "name": "Spiderman", - "powers": [ - { - "strength": 50, - "description": "Strength" - }, - { - "strength": 75, - "description": "Speed" - }, - { - "strength": 10, - "description": "Durability" - } - ], - "id": 2 - }, - { - "real_identity": 3, - "name": "Batman", - "powers": [ - { - "strength": 80, - "description": "Strength" - }, - { - "strength": 20, - "description": "Speed" - }, - { - "strength": 70, - "description": "Durability" - } - ], - "id": 3 - } - ], - "timestamp": "2019-05-19T05:38:00.355181", - "api_version": "0.1" - } - -URL (it's a single line, split for readability): - -:: - - /superheroes/api/superhero? - @lookup=powers!:superhero.tag[strength].superpower[description], - identity!:real_identity[name] - -OUTPUT: - -.. code:: json - - { - "count": 3, - "status": "success", - "code": 200, - "items": [ - { - "name": "Superman", - "identity.name": "Clark Kent", - "powers": [ - { - "strength": 100, - "description": "Flight" - }, - { - "strength": 100, - "description": "Strength" - }, - { - "strength": 100, - "description": "Speed" - }, - { - "strength": 100, - "description": "Durability" - } - ], - "id": 1 - }, - { - "name": "Spiderman", - "identity.name": "Peter Park", - "powers": [ - { - "strength": 50, - "description": "Strength" - }, - { - "strength": 75, - "description": "Speed" - }, - { - "strength": 10, - "description": "Durability" - } - ], - "id": 2 - }, - { - "name": "Batman", - "identity.name": "Bruce Wayne", - "powers": [ - { - "strength": 80, - "description": "Strength" - }, - { - "strength": 20, - "description": "Speed" - }, - { - "strength": 70, - "description": "Durability" - } - ], - "id": 3 - } - ], - "timestamp": "2021-01-04T07:31:34.974953", - "api_version": "0.1" - } - -URL: - -:: - - /superheroes/api/superhero?name.eq=Superman - -OUTPUT: - -.. code:: json - - { - "count": 1, - "status": "success", - "code": 200, - "items": [ - { - "real_identity": 1, - "name": "Superman", - "id": 1 - } - ], - "timestamp": "2019-05-19T05:38:00.405515", - "api_version": "0.1" - } - -URL: - -:: - - /superheroes/api/superhero?real_identity.name.eq=Clark Kent - -OUTPUT: - -.. code:: json - - { - "count": 1, - "status": "success", - "code": 200, - "items": [ - { - "real_identity": 1, - "name": "Superman", - "id": 1 - } - ], - "timestamp": "2019-05-19T05:38:00.366288", - "api_version": "0.1" - } - -URL: - -:: - - /superheroes/api/superhero?not.real_identity.name.eq=Clark Kent - -OUTPUT: - -.. code:: json - - { - "count": 2, - "status": "success", - "code": 200, - "items": [ - { - "real_identity": 2, - "name": "Spiderman", - "id": 2 - }, - { - "real_identity": 3, - "name": "Batman", - "id": 3 - } - ], - "timestamp": "2019-05-19T05:38:00.451907", - "api_version": "0.1" - } - -URL: - -:: - - /superheroes/api/superhero?superhero.tag.superpower.description=Flight - -OUTPUT: - -.. code:: json - - { - "count": 1, - "status": "success", - "code": 200, - "items": [ - { - "real_identity": 1, - "name": "Superman", - "id": 1 - } - ], - "timestamp": "2019-05-19T05:38:00.453020", - "api_version": "0.1" - } - -All RestAPI response have the fields: - -:api_version: RestAPI version. -:timestamp: Datetime in ISO 8601 format. -:status: RestAPI status (i.e. "success" or "error"). -:code: HTTP status. - -Other optional fields are: - -:count: Total matching (not total returned), for GET. -:items: In response to a GET. -:errors: Usually a validation error. -:models: Usually if status != "success". -:message: For error details. diff --git a/apps/_documentation/static/en/_sources/chapter-09.rst.txt b/apps/_documentation/static/en/_sources/chapter-09.rst.txt deleted file mode 100644 index 929f981b2..000000000 --- a/apps/_documentation/static/en/_sources/chapter-09.rst.txt +++ /dev/null @@ -1,721 +0,0 @@ -====================== -YATL Template Language -====================== - -py4web uses an external Python module called **YATL** (Yet Another Template -Language, see `here `__) for rendering dynamic HTML -pages that contain Python code. - -py4web uses double square brackets ``[[ ... ]]`` to escape Python code embedded in HTML. The -advantage of using square brackets instead of angle brackets is that -it’s transparent to all common HTML editors. This allows the developer -to use those editors to create py4web templates. - -.. warning:: - Be careful not to mix Python code square brackets with other square brackets! - For example, you'll soon see syntax like this: - - .. code:: html - - [[items = ['a', 'b', 'c']]] # this gives "Internal Server Error" - [[items = ['a', 'b', 'c'] ]] # this works - - - It's mandatory to add a space after the first closed bracket for - separating the list from the Python code square brackets. - -Since the developer is embedding Python code into HTML, the document -should be indented according to HTML rules, and not Python rules. -Therefore, we allow un-indented Python inside the ``[[ ... ]]`` tags. -But since Python normally uses indentation to delimit blocks of code, we -need a different way to delimit them; this is why the py4web template -language makes use of the Python keyword ``pass``. - -A **code block** starts with a line ending with a colon and ends with a -line beginning with ``pass``. The keyword ``pass`` is not necessary -when the end of the block is obvious from the context. - -Here is an example: - -.. code:: html - - [[ - if i == 0: - response.write('i is 0') - else: - response.write('i is not 0') - pass - ]] - -Note that ``pass`` is a Python keyword, not a py4web keyword. Some -Python editors, such as Emacs, use the keyword ``pass`` to signify the -division of blocks and use it to re-indent code automatically. - -The py4web template language does exactly the same. When it finds -something like: - -.. code:: html - - - [[for x in range(10):]][[=x]] hello
[[pass]] - - -it translates it into a program: - -.. code:: html - - response.write("""""", escape=False) - for x in range(10): - response.write(x) - response.write(""" hello
""", escape=False) - response.write("""""", escape=False) - -``response.write`` writes to the response body. - -When there is an error in a py4web template, the error report shows the -generated template code, not the actual template as written by the developer. -This helps the developer debug the code by highlighting the actual code -that is executed (which is something that can be debugged with an HTML -editor or the DOM inspector of the browser). - -Also note that: - -.. code:: html - - [[=x]] - -generates - -.. code:: python - - response.write(x) - -Variables injected into the HTML in this way are escaped by default. The -escaping is ignored if ``x`` is an ``XML`` object, even if escape is set -to ``True`` (see :ref:`XML` later for details). - -Here is an example that introduces the ``H1`` helper: - -.. code:: html - - [[=H1(i)]] - -which is translated to: - -.. code:: python - - response.write(H1(i)) - -upon evaluation, the ``H1`` object and its components are recursively -serialized, escaped and written to the response body. The tags generated -by ``H1`` and inner HTML are not escaped. This mechanism guarantees that -all text — and only text — displayed on the web page is always escaped, -thus preventing XSS vulnerabilities. At the same time, the code is -simple and easy to debug. - -The method ``response.write(obj, escape=True)`` takes two arguments, the -object to be written and whether it has to be escaped (set to ``True`` -by default). If ``obj`` has an ``.xml()`` method, it is called and the -result written to the response body (the ``escape`` argument is -ignored). Otherwise it uses the object’s ``__str__`` method to serialize -it and, if the escape argument is ``True``, escapes it. All built-in -helper objects (``H1`` in the example) are objects that know how to -serialize themselves via the ``.xml()`` method. - -This is all done transparently. - - -.. Note:: - While the response object used inside the controllers is a - full ``bottle.response`` object, inside the yatl templates it is - replaced by a dummy object (``yatl.template.DummyResponse``). - This object is quite different, and much simpler: it only has a write method! - Also, you never need to (and never should) call the ``response.write`` - method explicitly. - - -Basic syntax ------------- - -The py4web template language supports all Python control structures. -Here we provide some examples of each of them. They can be nested -according to usual programming practice. -You can easily test them by copying the _scaffold app (see -:ref:`copying-the-scaffold-app`) and then editing the file -``new_app/template/index.html``. - -``for...in`` -~~~~~~~~~~~~ - -In templates you can loop over any iterable object: - -.. code:: html - - [[items = ['a', 'b', 'c'] ]] -
    - [[for item in items:]]
  • [[=item]]
  • [[pass]] -
- -which produces: - -.. code:: html - -
    -
  • a
  • -
  • b
  • -
  • c
  • -
- -Here ``items`` is any iterable object such as a Python list, Python -tuple, or Rows object, or any object that is implemented as an iterator. -The elements displayed are first serialized and escaped. - -``while`` -~~~~~~~~~ - -You can create a loop using the while keyword: - -.. code:: html - - [[k = 3]] -
    - [[while k > 0:]]
  • [[=k]][[k = k - 1]]
  • [[pass]] -
- -which produces: - -.. code:: html - -
    -
  • 3
  • -
  • 2
  • -
  • 1
  • -
- -``if...elif...else`` -~~~~~~~~~~~~~~~~~~~~ - -You can use conditional clauses: - -.. code:: html - - [[ - import random - k = random.randint(0, 100) - ]] -

- [[=k]] - [[if k % 2:]]is odd[[else:]]is even[[pass]] -

- -which produces: - -.. code:: html - -

- 45 is odd -

- -Since it is obvious that ``else`` closes the first ``if`` block, there -is no need for a ``pass`` statement, and using one would be incorrect. -However, you must explicitly close the ``else`` block with a ``pass``. - -Recall that in Python “else if” is written ``elif`` as in the following -example: - -.. code:: html - - [[ - import random - k = random.randint(0, 100) - ]] -

- [[=k]] - [[if k % 4 == 0:]]is divisible by 4 - [[elif k % 2 == 0:]]is even - [[else:]]is odd - [[pass]] -

- -It produces: - -.. code:: html - -

- 64 is divisible by 4 -

- -``try...except...else...finally`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It is also possible to use ``try...except`` statements in templates with one -caveat. Consider the following example: - -.. code:: html - - [[try:]] - Hello [[= 1 / 0]] - [[except:]] - division by zero - [[else:]] - no division by zero - [[finally:]] -
- [[pass]] - -It will produce the following output: - -.. code:: html - - Hello division by zero -
- -This example illustrates that all output generated before an exception -occurs is rendered (including output that preceded the exception) inside -the try block. “Hello” is written because it precedes the exception. - -``def...return`` -~~~~~~~~~~~~~~~~ - -The py4web template language allows the developer to define and -implement functions that can return any Python object or a text/html -string. Here we consider two examples: - -.. code:: html - - [[def itemize1(link): return LI(A(link, _href="http://" + link))]] -
    - [[=itemize1('www.google.com')]] -
- -produces the following output: - -.. code:: html - - - -The function ``itemize1`` returns a helper object that is inserted at -the location where the function is called. - -Consider now the following code: - -.. code:: html - - [[def itemize2(link):]] -
  • [[=link]]
  • - [[return]] -
      - [[itemize2('www.google.com')]] -
    - -It produces exactly the same output as above. In this case, the function -``itemize2`` represents a piece of HTML that is going to replace the -py4web tag where the function is called. Notice that there is no ‘=’ in -front of the call to ``itemize2``, since the function does not return -the text, but it writes it directly into the response. - -There is one caveat: functions defined inside a template must terminate with -a ``return`` statement, or the automatic indentation will fail. - -Information workflow --------------------- - -For dynamically modifying the workflow of the information there are custom commands available: -``extend``, ``include``, ``block`` and ``super``. Note that they are special template -directives, not Python commands. - -In addition, you can use normal Python functions inside templates. - - -``extend`` and ``include`` -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Templates can extend and include other templates in a tree-like structure. - -For example, we can think of a template “index.html” that extends -“layout.html” and includes “body.html”. At the same time, “layout.html” -may include “header.html” and “footer.html”. - -The root of the tree is what we call a **layout template**. Just like any other -HTML template file, you can edit it from the command line or using the py4web Dashboard. -The file name “layout.html” is just a convention. - -Here is a minimalist page that extends the “layout.html” template and -includes the “page.html” template: - -.. code:: html - - - [[extend 'layout.html']] -

    Hello World

    - [[include 'page.html']] - -The extended layout file must contain an ``[[include]]`` directive, -something like: - -.. code:: html - - - - - Page Title - - - [[include]] - - - -When the template is called, the extended (layout) template is loaded, and the -calling template replaces the ``[[include]]`` directive inside the layout. -If you don't write the ``[[include]]`` directive inside the layout, then it will -be included at the beginning of the file. Also, if you use multiple ``[[extend]]`` -directives only the last one will be processed. -Processing continues recursively until all ``extend`` and ``include`` -directives have been processed. The resulting template is then -translated into Python code. - -Note, when an application is bytecode -compiled, it is this Python code that is compiled, not the original template -files themselves. So, the bytecode compiled version of a given template is a -single .pyc file that includes the Python code not just for the original -template file, but for its entire tree of extended and included templates. - -Any content or code that **precedes** the ``[[extend ...]]`` directive will -be inserted (and therefore executed) before the beginning of the -extended template's content/code. Although this is not typically used to -insert actual HTML content before the extended template's content, it can be -useful as a means to define variables or functions that you want to make -available to the extended template. For example, consider a template -“index.html”: - -.. code:: html - - - [[sidebar_enabled=True]] - [[extend 'layout.html']] -

    Home Page

    - -and an excerpt from “layout.html”: - -.. code:: html - - - [[include]] - [[if sidebar_enabled:]] - - [[pass]] - -Because the ``sidebar_enabled`` assignment in “index.html” comes before -the ``extend``, that line gets inserted before the beginning of -“layout.html”, making ``sidebar_enabled`` available anywhere within the -“layout.html” code. - -It is also worth pointing out that the variables returned by the -controller function are available not only in the function’s main template, -but in all of its extended and included templates as well. - -Extending using variables -~~~~~~~~~~~~~~~~~~~~~~~~~ - -The argument of an ``extend`` or ``include`` (i.e., the extended or -included template name) can be a Python variable (though not a Python -expression). However, this imposes a limitation – templates that use -variables in ``extend`` or ``include`` statements cannot be bytecode -compiled. As noted above, bytecode-compiled templates include the entire -tree of extended and included templates, so the specific extended and -included templates must be known at compile time, which is not possible if -the template names are variables (whose values are not determined until run -time). Because bytecode compiling templates can provide a significant speed -boost, using variables in ``extend`` and ``include`` should generally be -avoided if possible. - -In some cases, an alternative to using a variable in an ``include`` is -simply to place regular ``[[include ...]]`` directives inside an -``if...else`` block. - -.. code:: html - - [[if some_condition:]] - [[include 'this_template.html']] - [[else:]] - [[include 'that_template.html']] - [[pass]] - -The above code does not present any problem for bytecode compilation -because no variables are involved. Note, however, that the bytecode -compiled template will actually include the Python code for both -“this_template.html” and “that_template.html”, though only the code for one of -those templates will be executed, depending on the value of -``some_condition``. - -Keep in mind, this only works for ``include`` – you cannot place -``[[extend ...]]`` directives inside ``if...else`` blocks. - -Layouts are used to encapsulate page commonality (headers, footers, -menus), and though they are not mandatory, they will make your -application easier to write and maintain. - -Template Functions -~~~~~~~~~~~~~~~~~~ - -Consider this “layout.html”: - -.. code:: html - - - - - [[include]] - - - - -and this extending template - -.. code:: html - - [[def mysidebar():]] - my new sidebar!!! - [[return]] - [[extend 'layout.html']] - Hello World!!! - -Notice the function is defined before the ``[[extend...]]`` statement – -this results in the function being created before the “layout.html” code -is executed, so the function can be called anywhere within -“layout.html”, even before the ``[[include]]``. Also notice the function -is included in the extended template without the ``=`` prefix. - -The code generates the following output: - -.. code:: html - - - - Hello World!!! - - - - -Notice that the function is defined in HTML (although it could also -contain Python code) so that ``response.write`` is used to write its -content (the function does not return the content). This is why the -layout calls the template function using ``[[mysidebar()]]`` rather than -``[[=mysidebar()]]``. Functions defined in this way can take arguments. - -``block`` and ``super`` -~~~~~~~~~~~~~~~~~~~~~~~ - -The main way to make a template more modular is by using -``[[block ...]]``\ s and this mechanism is an alternative to the -mechanism discussed in the previous section. - -To understand how this works, consider apps based on the scaffolding app -welcome, which has a template layout.html. This template is extended by the template -``default/index.html`` via ``[[extend 'layout.html']]``. The contents of -layout.html predefine certain blocks with certain default content, and -these are therefore included into default/index.html. - -You can override these default content blocks by enclosing your new -content inside the same block name. The location of the block in the -layout.html is not changed, but the contents is. - -Here is a simplified version. Imagine this is “layout.html”: - -.. code:: html - - - - [[include]] - - - - -and this is a simple extending template ``default/index.html``: - -.. code:: html - - [[extend 'layout.html']] - Hello World!!! - [[block mysidebar]] - my new sidebar!!! - [[end]] - -It generates the following output, where the content is provided by the -over-riding block in the extending template, yet the enclosing DIV and class -comes from layout.html. This allows consistency across templates: - -.. code:: html - - - - Hello World!!! - - - - -The real layout.html defines a number of useful blocks, and you can -easily add more to match the layout your desire. - -You can have many blocks, and if a block is present in the extended template -but not in the extending template, the content of the extended template is used. -Also, notice that unlike with functions, it is not necessary to define -blocks before the ``[[extend ...]]`` – even if defined after the -``extend``, they can be used to make substitutions anywhere in the -extended template. - -Inside a block, you can use the expression ``[[super]]`` to include the -content of the parent. For example, if we replace the above extending -template with: - -.. code:: html - - [[extend 'layout.html']] - Hello World!!! - [[block mysidebar]] - [[super]] - my new sidebar!!! - [[end]] - -we get: - -.. code:: html - - - - Hello World!!! - - - - - - - -Page layout standard structure ------------------------------- - - -Default page layout -~~~~~~~~~~~~~~~~~~~ - -The “templates/layout.html” that currently ships with the py4web **_scaffold** -application is quite complex but it has the following structure: - -.. code-block:: html - :linenos: - - - - - - - - - - - [[block page_head]][[end]] - - -
    - - -
    - -
    -
    - - -
    -
    - - [[include]] -
    -
    - -
    -

    - Made with py4web -

    -
    - - - - [[block page_scripts]][[end]] - - - -There are a few features of this default layout that make it very easy -to use and customize: - -- it is written in HTML5 -- on line 7 it's used the ``no.css`` stylesheet, see - `here `__ -- on line 58 ``[[include]]`` is replaced by the content of the extending template when - the page is rendered -- it contains the following blocks: page_head, page_left_menu, page_scripts -- on line 30 it checks if the user is logged on and changes the menu accordingly -- on line 54 it checks for flash alert messages - - -Of course you can also completely replace the “layout.html” and -the stylesheet with your own. - - -Mobile development -~~~~~~~~~~~~~~~~~~ - -Although the default layout.html is designed to be mobile-friendly, one -may sometimes need to use different templates when a page is visited by a -mobile device. diff --git a/apps/_documentation/static/en/_sources/chapter-10.rst.txt b/apps/_documentation/static/en/_sources/chapter-10.rst.txt deleted file mode 100644 index bef65eb7b..000000000 --- a/apps/_documentation/static/en/_sources/chapter-10.rst.txt +++ /dev/null @@ -1,802 +0,0 @@ -============ -YATL helpers -============ - -Helpers overview ----------------- - -Consider the following code in a template: - -:: - - [[=DIV('this', 'is', 'a', 'test', _id='123', _class='myclass')]] - -it is rendered as: - -.. code:: html - -
    thisisatest
    - -You can easily test the rendering of these commands by copying the _scaffold app (see -:ref:`copying-the-scaffold-app`) and then editing the file -``new_app/template/index.html``. - -``DIV`` is a **helper class**, i.e., something that can be used to build -HTML programmatically. It corresponds to the HTML ``
    `` tag. - -Helpers can have: - -- **positional arguments** interpreted as objects contained between the - open and close tags, like ``thisisatest`` in the previous example -- **named arguments** (start with an underscore) - interpreted as HTML tag attributes (without the underscore), like ``_class`` - and ``_id`` in the previous example -- **named arguments** (start without an underscore), in this case these - arguments are tag-specific - - -Instead of a set of unnamed arguments, a helper can also take a single -list or tuple as its set of components using the ``*`` notation and it -can take a single dictionary as its set of attributes using the ``**``, -for example: - -:: - - [[ - contents = ['this', 'is', 'a', 'test'] - attributes = {'_id':'123', '_class':'myclass'} - =DIV(*contents, **attributes) - ]] - -(produces the same output as before). - -The following are the current set of helpers available within the YATL -module: - -``A``, ``BEAUTIFY``, ``BODY``, ``CAT``, ``CODE``, ``DIV``, ``EM``, -``FORM``, ``H1``, ``H2``, ``H3``, ``H4``, ``H5``, ``H6``, ``HEAD``, -``HTML``, ``IMG``, ``INPUT``, ``LABEL``, ``LI``, ``METATAG``, -``OL``, ``OPTION``, ``P``, ``PRE``, ``SELECT``, ``SPAN``, ``STRONG``, -``TABLE``, ``TAG``, ``TAGGER``, ``THEAD``, ``TBODY``, ``TD``, -``TEXTAREA``, ``TH``, ``TT``, ``TR``, ``UL``, ``XML``, ``xmlescape``, -``I``, ``META``, ``LINK``, ``TITLE``, ``STYLE``, ``SCRIPT`` - -Helpers can be used to build complex expressions, that can then be serialized to -XML. For example: - -:: - - [[=DIV(STRONG(I("hello ", "")), _class="myclass")]] - -is rendered: - -.. code:: html - -
    hello <world>
    - -Helpers can also be serialized into strings, equivalently, with the -``__str__`` and the ``xml`` methods. This can be manually tested directly -with a Python shell or by using the :ref:`shell command option` of py4web -and then: - -.. code:: python - - >>> from yatl.helpers import * - >>> - >>> str(DIV("hello world")) - '
    hello world
    ' - >>> DIV("hello world").xml() - '
    hello world
    ' - - -The helpers mechanism in py4web is more than a system to generate HTML -without concatenating strings. It provides a server-side representation -of the document object model (DOM). - -Components of helpers can be referenced via their position, and helpers -act as lists with respect to their components: - -.. code:: python - - >>> a = DIV(SPAN('a', 'b'), 'c') - >>> print(a) -
    abc
    - >>> del a[1] - >>> a.append(STRONG('x')) - >>> a[0][0] = 'y' - >>> print(a) -
    ybx
    - -Attributes of helpers can be referenced by name, and helpers act as -dictionaries with respect to their attributes: - -.. code:: python - - >>> a = DIV(SPAN('a', 'b'), 'c') - >>> a['_class'] = 's' - >>> a[0]['_class'] = 't' - >>> print(a) -
    abc
    - -Note, the complete set of components can be accessed via a list called -``a.children``, and the complete set of attributes can be accessed via -a dictionary called ``a.attributes``. So, ``a[i]`` is equivalent to -``a.children[i]`` when ``i`` is an integer, and ``a[s]`` is equivalent -to ``a.attributes[s]`` when ``s`` is a string. - -Notice that helper attributes are passed as keyword arguments to the -helper. In some cases, however, attribute names include special -characters that are not allowed in Python identifiers (e.g., hyphens) -and therefore cannot be used as keyword argument names. For example: - -.. code:: python - - DIV('text', _data-role='collapsible') - -will not work because “_data-role” includes a hyphen, which will produce -a Python syntax error. - -In such cases you can pass the attributes as a dictionary and make use -of Python’s ``**`` function arguments notation, which maps a dictionary -of (key:value) pairs into a set of keyword arguments: - -.. code:: python - - >>> print(DIV('text', **{'_data-role': 'collapsible'})) -
    text
    - -You can also dynamically create special TAGs: - -.. code:: python - - >>> print(TAG['soap:Body']('whatever', **{'_xmlns:m':'http://www.example.org'})) - whatever - - -Built-in helpers ----------------- - -.. _XML: - -``XML`` -~~~~~~~ - -``XML`` is an helper object used to encapsulate text that should **not** be -escaped. The text may or may not contain valid XML; for example it -could contain JavaScript. - -The text in this example is escaped: - -.. code:: python - - >>> print(DIV("hello")) -
    <strong>hello</strong>
    - -by using ``XML`` you can prevent escaping: - -.. code:: python - - >>> print(DIV(XML("hello"))) -
    hello
    - -Sometimes you want to render HTML stored in a variable, but the HTML may -contain unsafe tags such as scripts: - -.. code:: python - - >>> print(XML('')) - - -Un-escaped executable input such as this (for example, entered in the -body of a comment in a blog) is unsafe, because it can be used to -generate cross site scripting (XSS) attacks against other visitors to -the page. -In this case the py4web ``XML`` helper can sanitize our text to prevent injections -and escape all tags except those that you explicitly allow. Here is an -example: - -.. code:: python - - >>> print(XML('', sanitize=True)) - <script>alert("unsafe!")</script> - -The ``XML`` constructors, by default, consider the content of some tags -and some of their attributes safe. You can override the defaults using -the optional ``permitted_tags`` and ``allowed_attributes`` arguments. -Here are the default values of the optional arguments of the ``XML`` -helper. - -.. code:: python - - XML(text, sanitize=False, - permitted_tags=['a', 'b', 'blockquote', 'br/', 'i', 'li', - 'ol', 'ul', 'p', 'cite', 'code', 'pre', 'img/', - 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'table', 'tr', 'td', - 'div', 'strong', 'span'], - allowed_attributes={'a': ['href', 'title', 'target'], - 'img': ['src', 'alt'], 'blockquote': ['type'], 'td': ['colspan']}) - - -``A`` -~~~~~ - -This helper is used to build links. - -.. code:: python - - >>> print(A('', XML('me'), - _href='http://www.py4web.com')) - <click>me - -``BODY`` -~~~~~~~~ - -This helper makes the body of a page. - -.. code:: python - - >>> print(BODY('', XML('world'), _bgcolor='red')) - <hello>world - -``CAT`` -~~~~~~~ - -This helper concatenates other helpers. - -.. code:: python - - >>> print(CAT('Here is a ', A('link', _href='target'), ', and here is some ', STRONG('bold text'), '.')) - Here is a link, and here is some bold text. - -``DIV`` -~~~~~~~ - -This is the content division element. - -.. code:: python - - >>> print(DIV('', XML('world'), _class='test', _id=0)) -
    <hello>world
    - -``EM`` -~~~~~~ - -Emphasizes its content. - -.. code:: python - - >>> print(EM('', XML('world'), _class='test', _id=0)) - <hello>world - -``FORM`` -~~~~~~~~ - -Use this helper to make a FORM for user input. Forms will be later discussed -in detail in the dedicated :ref:`Forms` chapter. - -.. code:: python - - >>> print(FORM(INPUT(_type='submit'), _action='', _method='post')) -
    - -``H1``, ``H2``, ``H3``, ``H4``, ``H5``, ``H6`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -These helpers are for paragraph headings and subheadings. - -.. code:: python - - >>> print(H1('', XML('world'), _class='test', _id=0)) -

    <hello>world

    - -``HEAD`` -~~~~~~~~ - -For tagging the HEAD of an HTML page. - -.. code:: python - - >>> print(HEAD(TITLE('', XML('world')))) - <hello><strong>world</strong> - -``HTML`` -~~~~~~~~ - -For tagging an HTML page. - -.. code:: python - - >>> print(HTML(BODY('', XML('world')))) - <hello>world - -``I`` -~~~~~ - -This helper makes its contents italic. - -.. code:: python - - >>> print(I('', XML('world'), _class='test', _id=0)) - <hello>world - -``IMG`` -~~~~~~~ - -It can be used to embed images into HTML. - -.. code:: python - - >>> print(IMG(_src='http://example.com/image.png', _alt='test')) - test - -Here is a combination of A, IMG, and URL helpers for including a static -image with a link: - -.. code:: python - - >>> print(A(IMG(_src=URL('static', 'logo.png'), _alt="My Logo"), - ... _href=URL('default', 'index'))) - My Logo - -``INPUT`` -~~~~~~~~~ - -Creates an ```` tag. An input tag may not contain other tags, -and is closed by ``/>`` instead of ``>``. The input tag has an optional -attribute ``_type`` that can be set to “text” (the default), “submit”, -“checkbox”, or “radio”. - -.. code:: python - - >>> print(INPUT(_name='test', _value='a')) - - -For radio buttons use the ``_checked`` attribute: - -.. code:: python - - >>> for v in ['a', 'b', 'c']: - ... print(INPUT(_type='radio', _name='test', _value=v, _checked=v=='b'), v) - ... - a - b - c - -and similarly for checkboxes: - -.. code:: python - - >>> print(INPUT(_type='checkbox', _name='test', _value='a', _checked=True)) - - >>> print(INPUT(_type='checkbox', _name='test', _value='a', _checked=False)) - - -``LABEL`` -~~~~~~~~~ - -It is used to create a LABEL tag for an INPUT field. - -.. code:: python - - >>> print(LABEL('', XML('world'), _class='test', _id=0)) - - -``LI`` -~~~~~~ - -It makes a list item and should be contained in a ``UL`` or ``OL`` tag. - -.. code:: python - - >>> print(LI('', XML('world'), _class='test', _id=0)) -
  • <hello>world
  • - -``OL`` -~~~~~~ - -It stands for ordered list. The list should contain LI tags. - -.. code:: python - - >>> print(OL(LI(''), LI(XML('world')), _class='test', _id=0)) -
    1. <hello>
    2. world
    - -``OPTION`` -~~~~~~~~~~ - -This should only be used as argument of a ``SELECT``. - -.. code:: python - - >>> print(OPTION('', XML('world'), _value='a')) - - -For selected options use the ``_selected`` attribute: - -.. code:: python - - >>> print(OPTION('Thank You', _value='ok', _selected=True)) - - -``P`` -~~~~~ - -This is for tagging a paragraph. - -.. code:: python - - >>> print(P('', XML('world'), _class='test', _id=0)) -

    <hello>world

    - -``PRE`` -~~~~~~~ - -Generates a ``
    ...
    `` tag for displaying pre-formatted text. -The ``CODE`` helper is generally preferable for code listings. - -.. code:: python - - >>> print(SELECT(OPTION('first', _value='1'), OPTION('second', _value='2'), _class='test', _id=0)) -
    <hello>world
    - -``SCRIPT`` -~~~~~~~~~~ - -This is for include or link a script, such as JavaScript. - -.. code:: python - - >>> print(SCRIPT('console.log("hello world");', _type='text/javascript')) - - -``SELECT`` -~~~~~~~~~~ - -Makes a ```` tag. This is used with the ``OPTION`` -helper. - -.. code:: python - - >>> print(SELECT(OPTION('first', _value='1'), OPTION('second', _value='2'), - ... _class='test', _id=0)) - - -``SPAN`` -~~~~~~~~ - -Similar to ``DIV`` but used to tag inline (rather than block) content. - -.. code:: python - - >>> print(SPAN('', XML('world'), _class='test', _id=0)) - <hello>world - -``STYLE`` -~~~~~~~~~ - -Similar to script, but used to either include or link CSS code. Here the -CSS is included: - -.. code:: python - - >>> print(STYLE(XML('body {color: white}'))) - - -and here it is linked: - -.. code:: python - - >>> print(STYLE(_src='style.css')) - - -``TABLE``, ``TR``, ``TD`` -~~~~~~~~~~~~~~~~~~~~~~~~~ - -These tags (along with the optional ``THEAD`` and ``TBODY`` helpers) are -used to build HTML tables. - -.. code:: python - - >>> print(TABLE(TR(TD('a'), TD('b')), TR(TD('c'), TD('d')))) -
    ab
    cd
    - -``TR`` expects ``TD`` content. - -It is easy to convert a Python array into an HTML table using Python’s -``*`` function arguments notation, which maps list elements to -positional function arguments. - -Here, we will do it line by line: - -.. code:: python - - >>> table = [['a', 'b'], ['c', 'd']] - >>> print(TABLE(TR(*map(TD, table[0])), TR(*map(TD, table[1])))) -
    ab
    cd
    - -Here we do all lines at once: - -.. code:: python - - >>> table = [['a', 'b'], ['c', 'd']] - >>> print(TABLE(*[TR(*map(TD, rows)) for rows in table])) -
    ab
    cd
    - -``TBODY`` -~~~~~~~~~ - -This is used to tag rows contained in the table body, as opposed to -header or footer rows. It is optional. - -.. code:: python - - >>> print(TBODY(TR(TD('')), _class='test', _id=0)) -
    <hello>
    <hello>world
    <hello>
    - - -
    a
    • hello
    • world
    b(1, 2)
    - -Server-side *DOM* ------------------ - -As we've already seen the helpers mechanism in py4web also provides a server-side representation of the document object model (DOM). - -``children`` -~~~~~~~~~~~~ - -Each helper object keep the list of its components into the ``children`` -attribute. - -.. code:: python - - >>> CAT('hello', STRONG('world')).children - ['hello', ] - -``find`` -~~~~~~~~ - -To help searching into the DOM, all helpers have a ``find`` method with -the following signature: - -.. code:: python - - def find(self, query=None, **kargs) - -that returns all the components matching supplied arguments. - -A very simple ``query`` can be a tag name: - -.. code:: python - - >>> a = DIV(DIV(SPAN('x'), 3, DIV(SPAN('y')))) - >>> for c in a.find('span', first_only=True): c[0]='z' - >>> print(a) # We should .xml() here instead of print -
    z3
    y
    - >>> for c in a.find('span'): c[0]='z' - >>> print(a) -
    z3
    z
    - -It also supports a syntax compatible with `jQuery `__, -accepting the following expressions: - -- `jQuery Multiple Selector `__, - e.g. “selector1, selector2, selectorN”, -- `jQuery Descendant Selector `__, - e.g. “ancestor descendant”, -- `jQuery ID Selector `__, e.g. “#id”, -- `jQuery Class Selector `__, - e.g. “.class”, and -- `jQuery Attribute Equals Selector `__, - e.g. “[name=value]”, notice that here the value must be unquoted. - -Here are some examples: - -.. code:: python - - >>> a = DIV(SPAN(A('hello', **{'_id': '1-1', '_u:v': '$'})), P('world', _class='this is a test')) - >>> for e in a.find('div a#1-1, p.is'): print(e) - hello -

    world

    - >>> for e in a.find('#1-1'): print(e) - hello - >>> a.find('a[u:v=$]')[0].xml() - 'hello' - >>> a = FORM(INPUT(_type='text'), SELECT(OPTION(0)), TEXTAREA()) - >>> for c in a.find('input, select, textarea'): c['_disabled'] = True - >>> a.xml() - '
    ' - >>> for c in a.find('input, select, textarea'): c['_disabled'] = False - >>> a.xml() - '
    ' - -Elements that are matched can also be replaced or removed by specifying -a ``replace`` argument (note, a list of the original matching elements -is still returned as usual). - -.. code:: python - - >>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='abc'), SPAN('z', _class='abc')))) - >>> b = a.find('span.abc', replace=P('x', _class='xyz')) - >>> print(a) -

    x

    x

    x

    - -``replace`` can be a callable, which will be passed the original element and -should return a new element to replace it. - -.. code:: python - - >>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='abc'), SPAN('z', _class='abc')))) - >>> b = a.find('span.abc', replace=lambda el: P(el[0], _class='xyz')) - >>> print(a) -

    x

    y

    z

    - -If ``replace=None``, matching elements will be removed completely. - -.. code:: python - - >>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='abc'), SPAN('z', _class='abc')))) - >>> b = a.find('span', text='y', replace=None) - >>> print(a) -
    x
    z
    - -If a ``text`` argument is specified, elements will be searched for text -components that match text, and any matching text components will be -replaced (``text`` is ignored if ``replace`` is not also specified, use -a ``find`` argument when you only need searching for textual elements). - -Like the ``find`` argument, ``text`` can be a string or a compiled regex. - -.. code:: python - - >>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='abc'), SPAN('z', _class='abc')))) - >>> b = a.find(text=re.compile('x|y|z'), replace='hello') - >>> print(a) -
    hello
    hellohello
    - -If other attributes are specified along with ``text``, then only components -that match the specified attributes will be searched for text. - -.. code:: python - - >>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='efg'), SPAN('z', _class='abc')))) - >>> b = a.find('span.efg', text=re.compile('x|y|z'), replace='hello') - >>> print(a) -
    x
    helloz
    diff --git a/apps/_documentation/static/en/_sources/chapter-11.rst.txt b/apps/_documentation/static/en/_sources/chapter-11.rst.txt deleted file mode 100644 index a0c98ca77..000000000 --- a/apps/_documentation/static/en/_sources/chapter-11.rst.txt +++ /dev/null @@ -1,106 +0,0 @@ -==================== -Internationalization -==================== - -Pluralize ---------- - -Pluralize is a Python library for Internationalization (i18n) and -Pluralization (p10n). - -The library assumes a folder (for example “translations”) that contains -files like: - -:: - - it.json - it-IT.json - fr.json - fr-FR.json - (etc) - -Each file has the following structure, for example for Italian -(it.json): - -:: - - {"dog": {"0": "no cane", "1": "un cane", "2": "{n} cani", "10": "tantissimi cani"}} - -The top level keys are the expressions to be translated and the -associated value/dictionary maps a number to a translation. Different -translations correspond to different plural forms of the expression, - -Here is another example for the word “bed” in Czech - -:: - - {"bed": {"0": "no postel", "1": "postel", "2": "postele", "5": "postelí"}} - -To translate and pluralize a string “dog” one simply warps the string in -the T operator as follows: - -:: - - >>> from pluralize import Translator - >>> T = Translator('translations') - >>> dog = T("dog") - >>> print(dog) - dog - >>> T.select('it') - >>> print(dog) - un cane - >>> print(dog.format(n=0)) - no cane - >>> print(dog.format(n=1)) - un cane - >>> print(dog.format(n=5)) - 5 cani - >>> print(dog.format(n=20)) - tantissimi cani - -The string can contain multiple placeholders but the {n} placeholder is -special because the variable called “n” is used to determine the -pluralization by best match (max dict key <= n). - -T(…) objects can be added together with each other and with string, like -regular strings. - -T.select(s) can parse a string s following the HTTP accept language -format. - -Update the translation files ----------------------------- - -Find all strings wrapped in T(…) in .py, .html, and .js files: - -:: - - matches = T.find_matches('path/to/app/folder') - -Add newly discovered entries in all supported languages - -:: - - T.update_languages(matches) - -Add a new supported language (for example German, “de”) - -:: - - T.languages['de'] = {} - -Make sure all languages contain the same origin expressions - -:: - - known_expressions = set() - for language in T.languages.values(): - for expression in language: - known_expressions.add(expression) - T.update_languages(known_expressions)) - -Finally save the changes: - -:: - - T.save('translations') diff --git a/apps/_documentation/static/en/_sources/chapter-12.rst.txt b/apps/_documentation/static/en/_sources/chapter-12.rst.txt deleted file mode 100644 index f1290556c..000000000 --- a/apps/_documentation/static/en/_sources/chapter-12.rst.txt +++ /dev/null @@ -1,1500 +0,0 @@ -===== -Forms -===== - -The Form class provides a high-level API for quickly building CRUD (create, update and delete) forms, -especially for working on an existing database table. It is a pretty much equivalent to web2py’s ``SQLFORM``. - - -The Form constructor --------------------- - -The ``Form`` constructor accepts the following arguments: - -.. code:: python - - Form(self, - table, - record=None, - readonly=False, - deletable=True, - formstyle=FormStyleDefault, - dbio=True, - keep_values=False, - form_name=False, - hidden=None, - validation=None, - csrf_session=None, - csrf_protection=True, - lifespan=None, - signing_info=None, - ): - -Where: - -- ``table``: a DAL table or a list of fields -- ``record``: a DAL record or record id -- ``readonly``: set to True to make a readonly form -- ``deletable``: set to False to disallow deletion of record -- ``formstyle``: a function that renders the form using helpers. Can be FormStyleDefault (default), - FormStyleBulma or FormStyleBootstrap4 -- ``dbio``: set to False to prevent any DB writes -- ``keep_values``: if set to true, it remembers the values of the previously submitted form -- ``form_name``: the optional name of this form -- ``hidden``: a dictionary of hidden fields that is added to the form -- ``validation``: an optional validator, see :ref:`Validation functions` -- ``csrf_session``: if None, no csrf token is added. If a session, then a CSRF token is added and verified -- ``lifespan``: lifespan of CSRF token in seconds, to limit form validity -- ``signing_info``: information that should not change between when the CSRF token is signed and verified - - -A minimal form example ----------------------- - -Let's start with a minimal working form example. Create a new minimal app called ``form_minimal`` : - -.. code:: python - - # in form_minimal/__init__.py - from py4web import action, Field, redirect, URL - from py4web.utils.form import Form - from pydal.validators import IS_NOT_EMPTY - - - @action('index', method=['GET', 'POST']) - @action.uses('form_minimal.html') - def index(): - form = Form([ - Field('product_name'), - Field('product_quantity', 'integer', requires=IS_NOT_EMPTY()), - ]) - if form.accepted: - # Do something with form.vars['product_name'] and form.vars['product_quantity'] - redirect(URL('accepted')) - if form.errors: - # display message error - redirect(URL('not_accepted')) - return dict(form=form) - - @action("accepted") - def accepted(): - return "form_example accepted" - - - @action("not_accepted") - def not_accepted(): - return "form_example NOT accepted" - - -Also, you need to create a file inside the app called ``templates/form_minimal.html`` -that just contains the line: - -.. code:: html - - [[=form]] - - -Then reload py4web and visit http://127.0.0.1:8000/form_minimal - you'll get the Form page: - -.. image:: images/form1.png - -Note that: - - -- ``Form`` is a class contained in the ``py4web.utils.form`` module -- it's possible to use **form validators** like ``IS_NOT_EMPTY``, see :ref:`Form validation` later. - They are imported from the ``pydal.validators`` module -- it's normally important to use both the **GET** and the **POST** methods in the action where - the form is contained - - -This example is not so useful because it's not using a database, a template or the session management. -But it works, and if you try to fill the form with an empty product_quantity, the form will trigger an error -and the corresponding error page will be shown. - - - -Form basic example ------------------- - -Let's continue with a basic example of a form for adding data to a database. Create a new minimal app called ``form_basic`` : - - -.. code-block:: python - :linenos: - - # in form_basic/__init__.py - import os - from py4web import action, Field, DAL - from py4web.utils.form import Form, FormStyleDefault - - DB_FOLDER = os.path.join(os.path.dirname(__file__), 'databases') - if not os.path.isdir(DB_FOLDER): - os.mkdir(DB_FOLDER) - db = DAL('sqlite://storage.sqlite', folder=DB_FOLDER) - db.define_table( - 'person', - Field('name'), - Field('job', requires=IS_NOT_EMPTY()), - ) - - @action("index", method=["GET", "POST"]) - @action.uses(db, "form_basic.html") - def index(id=None): - form = Form(db.person, id, deletable=False, formstyle=FormStyleDefault) - rows = db(db.person).select() - return dict(form=form, rows=rows) - - -After the required import instructions and sqlite database definition, -on line 16 we declare an endpoint ``form_basic/index``, -which will be used both for the GET and for the POST of the form. - -Also, create a new template file inside the app called ``templates/form_basic.html`` that -contains the following code: - -.. code:: html - -

    Form Superhero Identity

    - - [[=form]] - -

    Rows

    - -
      - [[for row in rows:]] -
    • [[=row.id]]: [[=row.name]] ([[=row.job]])
    • - [[pass]] -
    - - - -Reload py4web and visit http://127.0.0.1:8000/form_basic : -the result is an input form on the top of the page, and the list of all the -previously added entries on the bottom: - -.. image:: images/form2.png - - -The database content can also be fully seen and changed with the Dashboard app. - -Form Structure Manipulation ---------------------------- - -Like in web2py, in py4web a form is rendered by helpers. Unlike web2py, it uses yatl helpers. This means the -tree structure of a form can be manipulated before the form is serialized in HTML. For example: - -.. code:: python - - db.define_table('paint', Field('color')) - form = Form(db.paint) - form.structure.find('[name=color]')[0]['_class'] = 'my-class' - -Notice that a form does not make an HTML tree until form structure is accessed. Once accessed you can use `.find(...)` -to find matching elements. The argument of `find` is a string following the filter syntax of jQuery. In the above case -there is a single match `[0]` and we modify the `_class` attribute of that element. Attribute names of HTML elements -must be preceded by an underscore. - -Form validation ---------------- - -Validators are classes used to validate input fields (including forms generated from database tables). -They are normally assigned using the ``requires`` attribute of a table ``Field`` object, as already -shown on the :ref:`Field constructor` paragraph of the DAL chapter. Also, you can use advanced validators -in order to create widgets such as drop-down menus, radio buttons and even lookups from other tables. -Last but not least, you can even explicitly define a validation function. - - -Here is a simple example of how to require a validator for a table field: - -.. code:: python - - db.define_table( - 'person', - Field('name',requires=IS_NOT_EMPTY(), - Field('job') - ) - -The validator is frequently - written explicitly outside the table definition in this equivalent manner: - -.. code:: python - - db.define_table( - 'person', - Field('name'), - Field('job') - ) - db.person.name.requires = IS_NOT_EMPTY() - - -A field can have a single validator or multiple validators. Multiple validators are made part of a list: - -.. code:: python - - db.person.name.requires = [IS_NOT_EMPTY(), - IS_NOT_IN_DB(db, 'person.name')] - -Mind that the only validators that can be used with ``list:`` type fields are: - -- ``IS_IN_DB(..., multiple=True)`` -- ``IS_IN_SET(..., multiple=True)`` -- ``IS_NOT_EMPTY()`` -- ``IS_LIST_OF_EMAILS()`` -- ``IS_LIST_OF(...)`` - -The latter can be used to apply any validator to the individual items in the list. ``multiple=(1, 1000)`` requires a selection of between 1 and 1000 items. This enforces selection of at least one choice. - - -Built-in validators have constructors that take an ``error_message`` argument: - -.. code:: python - - IS_NOT_EMPTY(error_message='cannot be empty!') - - -It's optional and it allows you to override the default error message for any validator. -Also, it's the usually fist option of the constructors and you can normally avoid to name it. Hence -the following syntax is equivalent: - -.. code:: python - - IS_NOT_EMPTY('cannot be empty!') - -Here is an example of a validator on a database table: - -.. code:: python - - db.person.name.requires = IS_NOT_EMPTY(error_message=T('fill this!')) - - -where we have used the translation operator ``T`` to allow for internationalization. Notice that default error messages are not translated. - -One can also call validators explicitly for a field: - -.. code:: python - - db.person.name.validate(value) - - -which returns a tuple ``(value, error)`` and ``error`` is ``None`` if the value validates. - -You can easily test most of the following validators directly using python only. -For example: - -.. code:: python - - >>> from pydal.validators import * - >>> IS_ALPHANUMERIC()('test') - ('test', None) - >>> IS_ALPHANUMERIC()('test!') - ('test!', 'Enter only letters, numbers, and underscore') - >>> IS_ALPHANUMERIC('this is not alphanumeric')('test!') - ('test!', 'this is not alphanumeric') - >>> IS_ALPHANUMERIC(error_message='this is not alphanumeric')('test!') - ('test!', 'this is not alphanumeric') - -.. hint:: - - The DAL validators are well documented inside the python source code. You can easily check it by yourself for all the details! - - .. code:: python - - from pydal import validators - dir(validators) # get the list of all validators - help(validators.IS_URL) # get specific help for the IS_URL validator - - -Text format validators -~~~~~~~~~~~~~~~~~~~~~~ - - -``IS_ALPHANUMERIC`` -^^^^^^^^^^^^^^^^^^^ - -This validator checks that a field value contains only characters in the ranges a-z, A-Z, or 0-9. - -.. code:: python - - requires = IS_ALPHANUMERIC(error_message='must be alphanumeric!') - - -``IS_LOWER`` -^^^^^^^^^^^^ - -This validator never returns an error. It just converts the value to lower case. - -.. code:: python - - requires = IS_LOWER() - - -``IS_UPPER`` -^^^^^^^^^^^^ - -This validator never returns an error. It converts the value to upper case. - -.. code:: python - - requires = IS_UPPER() - - - -``IS_EMAIL`` -^^^^^^^^^^^^ - -It checks that the field value looks like an email address. It does not try to send email to confirm. - -.. code:: python - - requires = IS_EMAIL(error_message='invalid email!') - - -``IS_MATCH`` -^^^^^^^^^^^^ - -This validator matches the value against a regular expression and returns an error if it does not match. -Here is an example of usage to validate a US zip code: - -.. code:: python - - requires = IS_MATCH('^\d{5}(-\d{4})?$', - error_message='not a zip code') - -Here is an example of usage to validate an IPv4 address (note: the IS_IPV4 validator is more appropriate for this purpose): - -.. code:: python - - requires = IS_MATCH('^\d{1,3}(\.\d{1,3}){3}$', - error_message='not an IP address') - - -Here is an example of usage to validate a US phone number: - -.. code:: python - - requires = IS_MATCH('^1?((-)\d{3}-?|\(\d{3}\))\d{3}-?\d{4}$', - error_message='not a phone number') - - -For more information on Python regular expressions, refer to the official Python documentation. - -``IS_MATCH`` takes an optional argument ``strict`` which defaults to ``False``. When set to ``True`` it only matches the whole string (from the beginning to the end): - - -.. code:: python - - >>> IS_MATCH('ab', strict=False)('abc') - ('abc', None) - >>> IS_MATCH('ab', strict=True)('abc') - ('abc', 'Invalid expression') - - - -``IS_MATCH`` takes an other optional argument ``search`` which defaults to ``False``. When set to ``True``, it uses regex method ``search`` instead of method ``match`` to validate the string. - -``IS_MATCH('...', extract=True)`` filters and extract only the first matching -substring rather than the original value. - -``IS_LENGTH`` -^^^^^^^^^^^^^ - -Checks if length of field's value fits between given boundaries. Works -for both text and file inputs. - -Its arguments are: - -- maxsize: the maximum allowed length / size (has default = 255) -- minsize: the minimum allowed length / size - -Examples: -Check if text string is shorter than 16 characters: - -.. code:: python - - >>> IS_LENGTH(15)('example string') - ('example string', None) - >>> IS_LENGTH(15)('example long string') - ('example long string', 'Enter from 0 to 15 characters') - >>> IS_LENGTH(15)('33') - ('33', None) - >>> IS_LENGTH(15)(33) - ('33', None) - - -Check if uploaded file has size between 1KB and 1MB: - -.. code:: python - - INPUT(_type='file', _name='name', requires=IS_LENGTH(1048576, 1024)) - - -For all field types except for files, it checks the length of the value. -In the case of files, the value is a ``cgi.FieldStorage``, so it validates the -length of the data in the file, which is the behavior one might intuitively expect. - -``IS_URL`` -^^^^^^^^^^ - -Rejects a URL string if any of the following is true: - -- The string is empty or None -- The string uses characters that are not allowed in a URL -- The string breaks any of the HTTP syntactic rules -- The URL scheme specified (if one is specified) is not 'http' or 'https' -- The top-level domain (if a host name is specified) does not exist - -(These rules are based on ``RFC 2616``) - -This function only checks the URL's syntax. It does not check that the URL points to a real document, -for example, or that it otherwise makes semantic sense. This function does automatically prepend -'http://' in front of a URL in the case of an abbreviated URL (e.g. 'google.ca'). -If the parameter ``mode='generic'`` is used, then this function's behavior changes. It then rejects a URL -string if any of the following is true: - -- The string is empty or None -- The string uses characters that are not allowed in a URL -- The URL scheme specified (if one is specified) is not valid - -(These rules are based on ``RFC 2396``) - -The list of allowed schemes is customizable with the allowed_schemes parameter. If you exclude None from -the list, then abbreviated URLs (lacking a scheme such as 'http') will be rejected. - -The default prepended scheme is customizable with the prepend_scheme parameter. If you set prepend_scheme -to None, then prepending will be disabled. URLs that require prepending to parse will still be accepted, -but the return value will not be modified. - -IS_URL is compatible with the Internationalized Domain Name (IDN) standard specified in ``RFC 3490``). -As a result, URLs can be regular strings or unicode strings. -If the URL's domain component (e.g. google.ca) contains non-US-ASCII letters, then the domain will -be converted into Punycode (defined in ``RFC 3492``). IS_URL goes a -bit beyond the standards, and allows non-US-ASCII characters to be present in the path -and query components of the URL as well. These non-US-ASCII characters will be encoded. -For example, space will be encoded as'%20'. The unicode character with hex code 0x4e86 -will become '%4e%86'. - -Examples: - -.. code:: python - - requires = IS_URL()) - requires = IS_URL(mode='generic') - requires = IS_URL(allowed_schemes=['https']) - requires = IS_URL(prepend_scheme='https') - requires = IS_URL(mode='generic', - allowed_schemes=['ftps', 'https'], - prepend_scheme='https') - - -``IS_SLUG`` -^^^^^^^^^^^ - -.. code:: python - - requires = IS_SLUG(maxlen=80, check=False, error_message='must be slug') - - -If ``check`` is set to ``True`` it check whether the validated value is a slug (allowing only alphanumeric characters and non-repeated dashes). - -If ``check`` is set to ``False`` (default) it converts the input value to a slug. - -``IS_JSON`` -^^^^^^^^^^^ - -.. code:: python - - requires = IS_JSON(error_message='Invalid json', native_json=False) - - -This validator checks that a field value is in JSON format. - -If ``native_json`` is set to ``False`` (default) it converts the input value to the serialized value otherwise the input value is left unchanged. - -Date and time validators -~~~~~~~~~~~~~~~~~~~~~~~~ - -``IS_TIME`` -^^^^^^^^^^^ - -This validator checks that a field value contains a valid time in the specified format. - -.. code:: python - - requires = IS_TIME(error_message='must be HH:MM:SS!') - - -``IS_DATE`` -^^^^^^^^^^^ - -This validator checks that a field value contains a valid date in the specified format. It is good practice to specify the format using the translation operator, in order to support different formats in different locales. - -.. code:: python - - requires = IS_DATE(format=T('%Y-%m-%d'), - error_message='must be YYYY-MM-DD!') - - -For the full description on % directives look under the IS_DATETIME validator. - -``IS_DATETIME`` -^^^^^^^^^^^^^^^ - -This validator checks that a field value contains a valid datetime in the specified format. It is good practice to specify the format using the translation operator, in order to support different formats in different locales. - -.. code:: python - - requires = IS_DATETIME(format=T('%Y-%m-%d %H:%M:%S'), - error_message='must be YYYY-MM-DD HH:MM:SS!') - - -The following symbols can be used for the format string (this shows the symbol, their meaning, and an example string): - -.. code:: - - %Y year with century (e.g. '1963') - %y year without century (e.g. '63') - %d day of the month (e.g. '28') - %m month (e.g '08') - %b abbreviated month name (e.g.'Aug') - %B full month name (e.g. 'August') - %H hour (24-hour clock, e.g. '14') - %I hour (12-hour clock, e.g. '02') - %p either 'AM' or 'PM' - %M minute (e.g. '30') - %S second (e.g. '59') - - -``IS_DATE_IN_RANGE`` -^^^^^^^^^^^^^^^^^^^^ - -Works very much like the previous validator but allows to specify a range: - -.. code:: python - - requires = IS_DATE_IN_RANGE(format=T('%Y-%m-%d'), - minimum=datetime.date(2008, 1, 1), - maximum=datetime.date(2009, 12, 31), - error_message='must be YYYY-MM-DD!') - - -For the full description on % directives look under the IS_DATETIME validator. - -``IS_DATETIME_IN_RANGE`` -^^^^^^^^^^^^^^^^^^^^^^^^ - -Works very much like the previous validator but allows to specify a range: - -.. code:: python - - requires = IS_DATETIME_IN_RANGE(format=T('%Y-%m-%d %H:%M:%S'), - minimum=datetime.datetime(2008, 1, 1, 10, 30), - maximum=datetime.datetime(2009, 12, 31, 11, 45), - error_message='must be YYYY-MM-DD HH:MM::SS!') - - -For the full description on % directives look under the IS_DATETIME validator. - -Range, set and equality validators -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -``IS_EQUAL_TO`` -^^^^^^^^^^^^^^^ - -Checks whether the validated value is equal to a given value (which can be a variable): - -.. code:: python - - requires = IS_EQUAL_TO(request.vars.password, - error_message='passwords do not match') - - -``IS_NOT_EMPTY`` -^^^^^^^^^^^^^^^^ - -This validator checks that the content of the field value is neither None nor an empty string nor an empty list. A string value is checked for after a ``.strip()``. - -.. code:: python - - requires = IS_NOT_EMPTY(error_message='cannot be empty!') - - -You can provide a regular expression for the matching of the empty string. - -.. code:: python - - requires = IS_NOT_EMPTY(error_message='Enter a value', empty_regex='NULL(?i)') - - -``IS_NULL_OR`` -^^^^^^^^^^^^^^ - -Deprecated, an alias for ``IS_EMPTY_OR`` described below. - -``IS_EMPTY_OR`` -^^^^^^^^^^^^^^^ - -Sometimes you need to allow empty values on a field along with other requirements. For example a field may be a date but it can also be empty. -The ``IS_EMPTY_OR`` validator allows this: - -.. code:: python - - requires = IS_EMPTY_OR(IS_DATE()) - - -An empty value is either None or an empty string or an empty list. A string value is checked for after a ``.strip()``. - -You can provide a regular expression for the matching of the empty string with the ``empty_regex`` argument (like for IS_NOT_EMPTY validator). - -You may also specify a value to be used for the empty case. - -.. code:: python - - requires = IS_EMPTY_OR(IS_ALPHANUMERIC(), null='anonymous') - - -``IS_EXPR`` -^^^^^^^^^^^ - -This validator let you express a general condition by means of a callable which takes a value to validate and returns the error message or ``None`` to accept the input value. - -.. code:: python - - requires = IS_EXPR(lambda v: T('not divisible by 3') if int(v) % 3 else None) - - - -**Notice** that returned message will not be translated if you do not arrange otherwise. - - -For backward compatibility the condition may be expressed as a string containing a logical expression in terms of a variable value. It validates a field value if the expression evaluates to ``True``. - -.. code:: python - - requires = IS_EXPR('int(value) % 3 == 0', - error_message='not divisible by 3') - - -One should first check that the value is an integer so that an exception will not occur. - -.. code:: python - - requires = [IS_INT_IN_RANGE(0, None), - IS_EXPR(lambda v: T('not divisible by 3') if v % 3 else None)] - - - -``IS_DECIMAL_IN_RANGE`` -^^^^^^^^^^^^^^^^^^^^^^^ - -.. code:: python - - INPUT(_type='text', _name='name', requires=IS_DECIMAL_IN_RANGE(0, 10, dot=".")) - - -It converts the input into a Python Decimal or generates an error if -the decimal does not fall within the specified inclusive range. -The comparison is made with Python Decimal arithmetic. - -The minimum and maximum limits can be None, meaning no lower or upper limit, -respectively. - -The ``dot`` argument is optional and allows you to internationalize the symbol used to separate the decimals. - -``IS_FLOAT_IN_RANGE`` -^^^^^^^^^^^^^^^^^^^^^ - -Checks that the field value is a floating point number within a definite range, ``0 <= value <= 100`` in the following example: - -.. code:: python - - requires = IS_FLOAT_IN_RANGE(0, 100, dot=".", - error_message='negative or too large!') - - -The ``dot`` argument is optional and allows you to internationalize the symbol used to separate the decimals. - -``IS_INT_IN_RANGE`` -^^^^^^^^^^^^^^^^^^^ - -Checks that the field value is an integer number within a definite range, - ``0 <= value < 100`` in the following example: - - .. code:: python - - requires = IS_INT_IN_RANGE(0, 100, - error_message='negative or too large!') - - -``IS_IN_SET`` -^^^^^^^^^^^^^ - -This validator will automatically set the form field to an option field (ie, with a drop-down menu). - -``IS_IN_SET`` checks that the field values are in a set: - -.. code:: python - - requires = IS_IN_SET(['a', 'b', 'c'], zero=T('choose one'), - error_message='must be a or b or c') - - -The zero argument is optional and it determines the text of the option selected by default, an option which -is not accepted by the ``IS_IN_SET`` validator itself. If you do not want a "choose one" option, set ``zero=None``. - -The elements of the set can be combined with a numerical validator, as long as IS_IN_SET is first in the list. -Doing so will force conversion by the last validator to the numerical type. So, IS_IN_SET can be followed by -``IS_INT_IN_RANGE`` (which converts the value to int) or ``IS_FLOAT_IN_RANGE`` (which converts the value to float). For example: - -.. code:: python - - requires = [ IS_IN_SET([2, 3, 5, 7], error_message='must be prime and less than 10'), - IS_INT_IN_RANGE(0, None) ] - - - -Checkbox validation -^^^^^^^^^^^^^^^^^^^ -To force a filled-in form checkbox (such as an acceptance of terms and conditions), use this: - -.. code:: python - - requires=IS_IN_SET(['on']) - - -Dictionaries and tuples with IS_IN_SET -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You may also use a dictionary or a list of tuples to make the drop down list more descriptive: - -.. code:: python - - # Dictionary example: - requires = IS_IN_SET({'A':'Apple', 'B':'Banana', 'C':'Cherry'}, zero=None) - - # List of tuples example: - requires = IS_IN_SET([('A', 'Apple'), ('B', 'Banana'), ('C', 'Cherry')]) - - -Sorted options -^^^^^^^^^^^^^^ - -To keep the options alphabetically sorted by their labels into the drop down list, use the ``sort`` argument with IS_IN_SET. - -.. code:: python - - IS_IN_SET([('H', 'Hulk'), ('S', 'Superman'), ('B', 'Batman')], sort=True) - - -``IS_IN_SET`` and Tagging -^^^^^^^^^^^^^^^^^^^^^^^^^ - -The ``IS_IN_SET`` validator has an optional attribute ``multiple=False``. If set to True, multiple values can be stored in one -field. The field should be of type ``list:integer`` or ``list:string`` as discussed in [[Chapter 6 ../06#list-type-and-contains]]. -An explicit example of tagging is discussed there. We strongly suggest using the jQuery multiselect plugin to render multiple fields. - -**Note** that when ``multiple=True``, ``IS_IN_SET`` will accept zero or more values, i.e. it will accept the field when nothing has been selected. -``multiple`` can also be a tuple of the form ``(a, b)`` where ``a`` and ``b`` are the minimum and (exclusive) maximum number of items -that can be selected respectively. - - - -Complexity and security validators -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -``IS_STRONG`` -^^^^^^^^^^^^^ - -Enforces complexity requirements on a field (usually a password field). - -Example: - -.. code:: python - - requires = IS_STRONG(min=10, special=2, upper=2) - - -where: - -- ``min`` is minimum length of the value -- ``special`` is the minimum number of required special characters, by default special characters are any of the following - ``^!!@#$%^&*()_+-=?<>,.:;{}[]|`` (you can customize these using ``specials = '...'``) -- ``upper`` is the minimum number of upper case characters - -other accepted arguments are: - -- ``invalid`` for the list of forbidden characters, by default ``invalid=' "'`` -- ``max`` for the maximum length of the value -- ``lower`` for the minimum number of lower case characters -- ``number`` for the minimum number of digit characters - -Obviously you can provide an ``error_message`` as for any other validator, although IS_STRONG is clever enough to provide a clear message to describe the validation failure. - -A special argument you can use is ``entropy``, that is a minimum value for the complexity of the value to accept (a number), experiment this with: - -.. code:: python - - >>> IS_STRONG(entropy=100.0)('hello') - ('hello', Entropy (24.53) less than required (100.0)) - - -**Notice** that if the argument ``entropy`` is not given then IS_STRONG implicitly sets the following defaults: ``min = 8, upper = 1, lower = 1, -number = 1, special = 1`` which otherwise are all sets to ``None``. - - -``CRYPT`` -^^^^^^^^^ - -This is also a filter. It performs a secure hash on the input and it is used to prevent passwords from being passed in the clear to the database. - -.. code:: python - - requires = CRYPT() - - -By default, CRYPT uses 1000 iterations of the pbkdf2 algorithm combined with SHA512 to produce a 20-byte-long hash. -Old versions of web2py used md5 or HMAC+SHA512 depending on whether a key was specified or not. - -If a key is specified, CRYPT uses the HMAC algorithm. The key may contain a prefix that determines the algorithm to use with HMAC, for example SHA512: - -.. code:: python - - requires = CRYPT(key='sha512:thisisthekey') - - -This is the recommended syntax. The key must be a unique string associated with the database used. The key can never be changed. If you lose the key, the previously hashed values become useless. -By default, CRYPT uses random salt, such that each result is different. To use a constant salt value, specify its value: - -.. code:: python - - requires = CRYPT(salt='mysaltvalue') - - -Or, to use no salt: - -.. code:: python - - requires = CRYPT(salt=False) - - -The CRYPT validator hashes its input, and this makes it somewhat special. If you need to validate a password field before it -is hashed, you can use CRYPT in a list of validators, but must make sure it is the last of the list, so that it is called last. For example: - -.. code:: python - - requires = [IS_STRONG(), CRYPT(key='sha512:thisisthekey')] - - -``CRYPT`` also takes a ``min_length`` argument, which defaults to zero. - -The resulting hash takes the form ``alg$salt$hash``, where ``alg`` is the hash algorithm used, ``salt`` is the salt string (which can be empty), -and ``hash`` is the algorithm's output. Consequently, the hash is self-identifying, allowing, for example, the algorithm to be changed without -invalidating previous hashes. The key, however, must remain the same. - - -Special type validators -~~~~~~~~~~~~~~~~~~~~~~~ - -``IS_LIST_OF`` -^^^^^^^^^^^^^^ - -This validator helps you to ensure length limits on values of type list, for this purpose use its ``minimum``, ``maximum``, and ``error_message`` -arguments, for example: - -.. code:: python - - requires = IS_LIST_OF(minimum=2) - - -A list value may comes from a form containing multiple fields with the same name or a multiple selection box. -Note that this validator automatically converts a non-list value into a single valued list: - -.. code:: python - - >>> IS_LIST_OF()('hello') - (['hello'], None) - - -If the first argument of IS_LIST_OF is another validator, then it applies the other validator to each element of the list. -A typical usage is validation of a ``list:`` type field, for example: - -.. code:: python - - Field('emails', 'list:string', requires=IS_LIST_OF(IS_EMAIL()), ...) - - -``IS_LIST_OF_EMAILS`` -^^^^^^^^^^^^^^^^^^^^^ - -This validator is specifically designed to work with the following field: - -.. code:: python - - Field('emails', 'list:string', - widget=SQLFORM.widgets.text.widget, - requires=IS_LIST_OF_EMAILS(), - filter_in=lambda l: \\ - IS_LIST_OF_EMAILS.split_emails.findall(l[0]) if l else l, - represent=lambda v, r: \\ - XML(', '.join([A(x, _href='mailto:'+x).xml() for x in (v or [])])) - ) - -Notice that due to the ``widget`` customization this field will be rendered by a textarea in SQLFORMs (see next [[Widgets #Widgets]] -section). This let you insert and edit multiple emails in a single input field (very much like normal mail client programs do), -separating each email address with ``,``, ``;``, and blanks (space, newline, and tab characters). -As a consequence now we need a validator which is able to operate on a single value input and a way to split the validated value into -a list to be next processed by DAL, these are what the ``requires`` and ``filter_in`` arguments stand for. -As alternative to ``filter_in``, you can pass the following function to the ``onvalidation`` argument of form ``accepts``, ``process``, -or ``validate`` method: - -.. code:: python - - def emails_onvalidation(form): - form.vars.emails = IS_LIST_OF_EMAILS.split_emails.findall(form.vars.emails) - - -The effect of the ``represent`` argument (at lines 6 and 7) is to add a "mailto:..." link to each email address when the record is rendered in HTML pages. - -``ANY_OF`` -^^^^^^^^^^ - -This validator takes a list of validators and accepts a value if any of the validators in the list does (i.e. it acts like a logical -OR with respect to given validators). - -.. code:: python - - requires = ANY_OF([IS_ALPHANUMERIC(), IS_EMAIL()]) - - -When none of the validators accepts the value you get the error message form the last attempted one (the last in the list), you -can customize the error message as usual: - -.. code:: python - - >>> ANY_OF([IS_ALPHANUMERIC(), IS_EMAIL()])('@ab.co') - ('@ab.co', 'Enter a valid email address') - >>> ANY_OF([IS_ALPHANUMERIC(), IS_EMAIL()], - ... error_message='Enter login or email')('@ab.co') - ('@ab.co', 'Enter login or email') - - -``IS_IMAGE`` -^^^^^^^^^^^^ - -This validator checks if a file uploaded through the file input was saved in one of the selected image formats and has dimensions (width and height) -within given limits. - -It does not check for maximum file size (use IS_LENGTH for that). It returns -a validation failure if no data was uploaded. It supports the file formats BMP, GIF, JPEG, PNG, and it does not require the Python Imaging Library. - -Code parts taken from ref.``source1``:cite - -It takes the following arguments: -- extensions: iterable containing allowed image file extensions in lowercase -- maxsize: iterable containing maximum width and height of the image -- minsize: iterable containing minimum width and height of the image - -Use (-1, -1) as minsize to bypass the image-size check. - -Here are some Examples: -- Check if uploaded file is in any of supported image formats: - -.. code:: python - - requires = IS_IMAGE() - -- Check if uploaded file is either JPEG or PNG: - -.. code:: python - - requires = IS_IMAGE(extensions=('jpeg', 'png')) - - -- Check if uploaded file is PNG with maximum size of 200x200 pixels: - -.. code:: python - - requires = IS_IMAGE(extensions=('png'), maxsize=(200, 200)) - - -Note: on displaying an edit form for a table including ``requires = IS_IMAGE()``, a ``delete`` checkbox will NOT appear because to delete the file -would cause the validation to fail. To display the ``delete`` checkbox use this validation: - -.. code:: python - - requires = IS_EMPTY_OR(IS_IMAGE()) - - -``IS_FILE`` -^^^^^^^^^^^ - -Checks if name and extension of file uploaded through file input matches given criteria. - -Does *not* ensure the file type in any way. Returns validation failure if no data was uploaded. - -Its arguments are: - -- filename: string/compiled regex or a list of strings/regex of valid filenames -- extension: string/compiled regex or a list of strings/regex of valid extensions -- lastdot: which dot should be used as a filename / extension separator: ``True`` indicates last dot (e.g., "file.tar.gz" - will be broken in "file.tar" + "gz") while ``False`` means first dot (e.g., "file.tar.gz" will be broken into "file" + "tar.gz"). -- case: 0 means keep the case; 1 means transform the string into lowercase (default); 2 means transform the string into uppercase. - -If there is no dot present, extension checks will be done against empty string and filename checks against whole value. - -Examples: -Check if file has a pdf extension (case insensitive): - -.. code:: python - - INPUT(_type='file', _name='name', - requires=IS_FILE(extension='pdf')) - - -Check if file is called 'thumbnail' and has a jpg or png extension -(case insensitive): - -.. code:: python - - INPUT(_type='file', _name='name', - requires=IS_FILE(filename='thumbnail', - extension=['jpg', 'png'])) - - -Check if file has a tar.gz extension and name starting with backup: - -.. code:: python - - INPUT(_type='file', _name='name', - requires=IS_FILE(filename=re.compile('backup.*'), - extension='tar.gz', lastdot=False)) - - -Check if file has no extension and name matching README -(case sensitive): - -.. code:: python - - INPUT(_type='file', _name='name', - requires=IS_FILE(filename='README', - extension='', case=0) - - -``IS_UPLOAD_FILENAME`` -^^^^^^^^^^^^^^^^^^^^^^ - -This is the older implementation for checking files, included for backwards compatibility. For new applications, use ``IS_FILE()``. - -This validator checks if the name and extension of a file uploaded through the file input matches the given criteria. - -It does not ensure the file type in any way. Returns validation failure -if no data was uploaded. - -Its arguments are: - -- filename: filename (before dot) regex. -- extension: extension (after dot) regex. -- lastdot: which dot should be used as a filename / extension separator: ``True`` indicates last dot (e.g., "file.tar.gz" will be - broken in "file.tar" + "gz") while ``False`` means first dot (e.g., "file.tar.gz" will be broken into "file" + "tar.gz"). -- case: 0 means keep the case; 1 means transform the string into lowercase (default); 2 means transform the string into uppercase. - -If there is no dot present, extension checks will be done against an empty string and filename checks will be done against the whole value. - -Examples: - -Check if file has a pdf extension (case insensitive): - -.. code:: python - - requires = IS_UPLOAD_FILENAME(extension='pdf') - - -Check if file has a tar.gz extension and name starting with backup: - -.. code:: python - - requires = IS_UPLOAD_FILENAME(filename='backup.*', extension='tar.gz', lastdot=False) - - -Check if file has no extension and name matching README (case sensitive): - -.. code:: python - - requires = IS_UPLOAD_FILENAME(filename='^README$', extension='^$', case=0) - - -``IS_IPV4`` -^^^^^^^^^^^ - -This validator checks if a field's value is an IP version 4 address in decimal form. Can -be set to force addresses from a certain range. - -IPv4 regex taken from ``regexlib``. The signature for the ``IS_IPV4`` constructor is the following: - -.. code:: python - - IS_IPV4(minip='0.0.0.0', maxip='255.255.255.255', invert=False, - is_localhost=None, is_private=None, is_automatic=None, - error_message='Enter valid IPv4 address') - -Where: - -- ``minip`` is the lowest allowed address -- ``maxip`` is the highest allowed address -- ``invert`` is a flag to invert allowed address range, i.e. if set to True allows addresses only from outside - of given range; note that range boundaries are not matched this way - -You can pass an IP address either as a string (e.g. '192.168.0.1') or as a list or tuple of 4 integers (e.g. [192, 168, 0, 1]). - -To check for multiple address ranges pass to ``minip`` and ``maxip`` a list or tuple of boundary addresses, for example -to allow only addresses between '192.168.20.10' and '192.168.20.19' or between '192.168.30.100' and '192.168.30.199' use: - -.. code:: python - - requires = IS_IPV4(minip=('192.168.20.10', '192.168.30.100'), - maxip=('192.168.20.19', '192.168.30.199')) - - -**Notice** that only a range for which both lower and upper limits are set is configured, that is the number of configured ranges -is determined by the shorter of the iterables passed to ``minip`` and ``maxip``. - - -The arguments ``is_localhost``, ``is_private``, and ``is_automatic`` accept the following values: - -- ``None`` to ignore the option -- ``True`` to force the option -- ``False`` to forbid the option - -The option meanings are: - -- ``is_localhost``: match localhost address (127.0.0.1) -- ``is_private``: match address in 172.16.0.0 - 172.31.255.255 and 192.168.0.0 - 192.168.255.255 ranges -- ``is_automatic``: match address in 169.254.0.0 - 169.254.255.255 range - -Examples: - -Check for valid IPv4 address: - -.. code:: python - - requires = IS_IPV4() - - -Check for valid private network IPv4 address: - -.. code:: python - - requires = IS_IPV4(minip='192.168.0.1', maxip='192.168.255.255') - - -``IS_IPV6`` -^^^^^^^^^^^ - -This validator checks if a field's value is an IP version 6 address. - -The signature for the ``IS_IPV6`` constructor is the following: - -.. code:: python - - IS_IPV6(is_private=None, - is_link_local=None, - is_reserved=None, - is_multicast=None, - is_routeable=None, - is_6to4=None, - is_teredo=None, - subnets=None, - error_message='Enter valid IPv6 address') - - -The arguments ``is_private``, ``is_link_local``, ``is_reserved``, ``is_multicast``, ``is_routeable``, ``is_6to4``, -and ``is_teredo`` accept the following values: - -- ``None`` to ignore the option -- ``True`` to force the option -- ``False`` to forbid the option, this does not work for ``is_routeable`` - -The option meanings are: - -- ``is_private``: match an address allocated for private networks -- ``is_link_local``: match an address reserved for link-local (i.e. in fe80::/10 range), this is a private network too (also matched by ``is_private`` above) -- ``is_reserved``: match an address otherwise IETF reserved -- ``is_multicast``: match an address reserved for multicast use (i.e. in ff00::/8 range) -- ``is_6to4``: match an address that appear to contain a 6to4 embedded address (i.e. in 2002::/16 range) -- ``is_teredo``: match a teredo address (i.e. in 2001::/32 range) - -Forcing ``is_routeable`` (setting to True) is a shortcut to forbid (setting to False) ``is_private``, ``is_reserved``, and ``is_multicast`` all. - -Use the ``subnets`` argument to pass a subnet or list of subnets to check for address membership, this way an address must be a subnet member to validate. - -Examples: - -Check for valid IPv6 address: - -.. code:: python - - requires = IS_IPV6() - - -Check for valid private network IPv6 address: - -.. code:: python - - requires = IS_IPV6(is_link_local=True) - - -Check for valid IPv6 address in subnet: - -.. code:: python - - requires = IS_IPV6(subnets='fb00::/8') - - -``IS_IPADDRESS`` -^^^^^^^^^^^^^^^^ - -This validator checks if a field's value is an IP address (either version 4 or version 6). -Can be set to force addresses from within a specific range. -Checks are done using the appropriate ``IS_IPV4`` or ``IS_IPV6`` validator. - -The signature for the ``IS_IPADDRESS`` constructor is the following: - -.. code:: python - - IS_IPADDRESS(minip='0.0.0.0', maxip='255.255.255.255', invert=False, - is_localhost=None, is_private=None, is_automatic=None, - is_ipv4=None, - is_link_local=None, is_reserved=None, is_multicast=None, - is_routeable=None, is_6to4=None, is_teredo=None, - subnets=None, is_ipv6=None, - error_message='Enter valid IP address') - - -With respect to ``IS_IPV4`` and ``IS_IPV6`` validators the only added arguments are: - -- ``is_ipv4``, set to True to force version 4 or set to False to forbid version 4 -- ``is_ipv6``, set to True to force version 6 or set to False to forbid version 6 - -Refer to IS_IPV4 and IS_IPV6 validators for the meaning of other arguments. - -Examples: - -Check for valid IP address (both IPv4 and IPv6): - -.. code:: python - - requires = IS_IPADDRESS() - - -Check for valid IP address (IPv6 only): - -.. code:: python - - requires = IS_IPADDRESS(is_ipv6=True) - - -Other validators -~~~~~~~~~~~~~~~~ - - -``CLEANUP`` -^^^^^^^^^^^ - -This is a filter. It never fails. By default it just removes all characters whose decimal ASCII codes -are not in the list [10, 13, 32-127]. It always perform an initial strip (i.e. heading and trailing blank characters removal) on the value. - -.. code:: python - - requires = CLEANUP() - - -You can pass a regular expression to decide what has to be removed, for example to clear all non-digit characters use: - -.. code:: python - - >>> CLEANUP('[^\\d]')('Hello 123 world 456') - ('123456', None) - - -Database validators -~~~~~~~~~~~~~~~~~~~ - -``IS_NOT_IN_DB`` -^^^^^^^^^^^^^^^^ - -Synopsis: -``IS_NOT_IN_DB(db|set, 'table.field')`` - -Consider the following example: - -.. code:: python - - db.define_table('person', Field('name')) - db.person.name.requires = IS_NOT_IN_DB(db, 'person.name') - - -It requires that when you insert a new person, his/her name is not already in the database, ``db``, in the field ``person.name``. - -A set can be used instead of ``db``. - -As with all other validators this requirement is enforced at the form processing level, not at the database level. -This means that there is a small probability that, if two visitors try to concurrently insert records with the same person.name, -this results in a race condition and both records are accepted. It is therefore safer to also inform the database that this field should have a unique value: - -.. code:: python - - db.define_table('person', Field('name', unique=True)) - db.person.name.requires = IS_NOT_IN_DB(db, 'person.name') - - -Now if a race condition occurs, the database raises an OperationalError and one of the two inserts is rejected. - -The first argument of ``IS_NOT_IN_DB`` can be a database connection or a Set. In the latter case, you would be checking only the set defined by the Set. - -A complete argument list for ``IS_NOT_IN_DB()`` is as follows: - -.. code:: python - - IS_NOT_IN_DB(dbset, field, error_message='value already in database or empty', - allowed_override=[], ignore_common_filters=True) - - -The following code, for example, does not allow registration of two persons with the same name within 10 days of each other: - -.. code:: python - - import datetime - now = datetime.datetime.today() - db.define_table('person', - Field('name'), - Field('registration_stamp', 'datetime', default=now)) - recent = db(db.person.registration_stamp > now-datetime.timedelta(10)) - db.person.name.requires = IS_NOT_IN_DB(recent, 'person.name') - - -``IS_IN_DB`` -^^^^^^^^^^^^ - -Synopsis: -``IS_IN_DB(db|set, 'table.value_field', '%(representing_field)s', zero='choose one')`` -where the third and fourth arguments are optional. - -``multiple=`` is also possible if the field type is a list. The default is False. It can be set to True or to a tuple (min, max) -to restrict the number of values selected. So ``multiple=(1, 10)`` enforces at least one and at most ten selections. - -Other optional arguments are discussed below. - -Example -Consider the following tables and requirement: - -.. code:: python - - db.define_table('person', Field('name', unique=True)) - db.define_table('dog', Field('name'), Field('owner', db.person)) - db.dog.owner.requires = IS_IN_DB(db, 'person.id', '%(name)s', - zero=T('choose one')) - -the IS_IN_DB requirement could also be written to use a Set instead of db - -.. code:: python - - db.dog.owner.requires = IS_IN_DB(db(db.person.id > 10), 'person.id', '%(name)s', - zero=T('choose one')) - - -It is enforced at the level of dog INSERT/UPDATE/DELETE forms. This example requires that a ``dog.owner`` be a valid id -in the field ``person.id`` in the database ``db``. Because of this validator, the ``dog.owner`` field is represented -as a drop-down list. The third argument of the validator is a string that describes the elements in the drop-down list, -this is passed to the ``label`` argument of the validator. In the example you want to see the person ``%(name)s`` instead -of the person ``%(id)s``. ``%(...)s`` is replaced by the value of the field in brackets for each record. Other accepted -values for the ``label`` are a Field instance (e.g. you could use db.person.name instead of '%(name)s') or even a callable -that takes a row and returns the description for the option. - -The ``zero`` option works very much like for the ``IS_IN_SET`` validator. - -Other optional arguments accepted by ``IS_IN_DB`` are: ``orderby``, ``groupby``, ``distinct``, ``cache``, and ``left``; -these are passed to the db select (see :ref:`their description ` on the DAL chapter). - - -**Notice** that ``groupby``, ``distinct``, and ``left`` do not apply to Google App Engine. - - -To alphabetically sort the options listed in the drop-down list you can set the ``sort`` argument to ``True`` (sorting is case-insensitive), -this may be usefull when no ``orderby`` is feasible or practical. - -The first argument of the validator can be a database connection or a DAL Set, as in ``IS_NOT_IN_DB``. This can be useful for example when -wishing to limit the records in the drop-down list. In this example, we use ``IS_IN_DB`` in a controller to limit the records dynamically -each time the controller is called: - -.. code:: python - - def index(): - (...) - query = (db.table.field == 'xyz') # in practice 'xyz' would be a variable - db.table.field.requires = IS_IN_DB(db(query), ...) - form = Form(...) - if form.process().accepted: ... - (...) - - -If you want the field validated, but you do not want a drop-down, you must put the validator in a list. - -.. code:: python - - db.dog.owner.requires = [IS_IN_DB(db, 'person.id', '%(name)s')] - - - -Occasionally you want the drop-down (so you do not want to use the list syntax above) yet you want to use additional validators. -For this purpose the ``IS_IN_DB`` validator takes an extra argument ``_and`` that can point to a list of other validators applied -if the validated value passes the ``IS_IN_DB`` validation. For example to validate all dog owners in db that are not in a subset: - -.. code:: python - - subset = db(db.person.id > 100) - db.dog.owner.requires = IS_IN_DB(db, 'person.id', '%(name)s', - _and=IS_NOT_IN_DB(subset, 'person.id')) - - - -``IS_IN_DB`` and Tagging -^^^^^^^^^^^^^^^^^^^^^^^^ - -The ``IS_IN_DB`` validator has an optional attribute ``multiple=False``. If set to ``True`` multiple values can be stored in one field. -This field should be of type ``list:reference`` as discussed in :ref:`list_type and contains`. An explicit example of -tagging is discussed there. Multiple references are handled automatically in create and update forms, but they are transparent to -the DAL. We strongly suggest using the jQuery multiselect plugin to render multiple fields. - - -Validation functions -~~~~~~~~~~~~~~~~~~~~ - -In order to explicitly define a validation function, we pass to the ``validation`` parameter a -function that takes the form and returns a dictionary, mapping field -names to errors. If the dictionary is non-empty, the errors will be -displayed to the user, and no database I/O will take place. - -Here is an example: - -.. code:: python - - from py4web import Field - from py4web.utils.form import Form, FormStyleBulma - from pydal.validators import IS_INT_IN_RANGE - - def check_nonnegative_quantity(form): - if not form.errors and form.vars['product_quantity'] % 2: - form.errors['product_quantity'] = T('The product quantity must be even') - - @action('form_example', method=['GET', 'POST']) - @action.uses(session, 'form_example.html') - def form_example(): - form = Form([ - Field('product_name'), - Field('product_quantity', 'integer', requires=IS_INT_IN_RANGE(0,100))], - validation=check_nonnegative_quantity, - formstyle=FormStyleBulma) - if form.accepted: - # Do something with form.vars['product_name'] and form.vars['product_quantity'] - redirect(URL('index')) - return dict(form=form) \ No newline at end of file diff --git a/apps/_documentation/static/en/_sources/chapter-13.rst.txt b/apps/_documentation/static/en/_sources/chapter-13.rst.txt deleted file mode 100644 index d61aa4386..000000000 --- a/apps/_documentation/static/en/_sources/chapter-13.rst.txt +++ /dev/null @@ -1,326 +0,0 @@ -================================= -Authentication and Access control -================================= - -**Warning: the API described in this chapter is new and subject to -changes. Make sure you keep your code up to date** - -py4web comes with a an object Auth and a system of plugins for user -authentication and access control. It has the same name as the -corresponding web2py one and serves the same purpose but the API and -internal design is very different. - -To use it, first of all you need to import it, instantiate it, configure -it, and enable it. - -.. code:: python - - from py4web.utils.auth import Auth - auth = Auth(session, db) - # (configure here) - auth.enable() - -The import step is obvious. The second step does not perform any -operation other than telling the Auth object which session object to use -and which database to use. Auth data is stored in ``session['user']`` -and, if a user is logged in, the user id is stored in -session[‘user’][‘id’]. The db object is used to store persistent info -about the user in a table ``auth_user`` with the following fields: - -- username -- email -- password -- first_name -- last_name -- sso_id (used for single sign on, see later) -- action_token (used to verify email, block users, and other tasks, - also see later). - -If the ``auth_user`` table does not exist it is created. - -The configuration step is optional and discussed later. - -The ``auth.enable()`` step creates and exposes the following RESTful -APIs: - -- {appname}/auth/api/register (POST) -- {appname}/auth/api/login (POST) -- {appname}/auth/api/request_reset_password (POST) -- {appname}/auth/api/reset_password (POST) -- {appname}/auth/api/verify_email (GET, POST) -- {appname}/auth/api/logout (GET, POST) (+) -- {appname}/auth/api/profile (GET, POST) (+) -- {appname}/auth/api/change_password (POST) (+) -- {appname}/auth/api/change_email (POST) (+) - -Those marked with a (+) require a logged in user. - -Auth UI -------- - -You can create your own web UI to login users using the above APIs but -py4web provides one as an example, implemented in the following files: - -- \_scaffold/templates/auth.html -- \_scaffold/static/components/auth.js -- \_scaffold/static/components/auth.html - -The component files (js/html) define a Vue component ```` which -is used in the template file auth.html as follows: - -.. code:: html - - [[extend "layout.html"]] -
    -
    -
    - -
    -
    -
    - [[block page_scripts]] - - - - [[end]] - -You can pretty much use this file un-modified. It extends the current -layout and embeds the ```` component into the page. It then uses -``utils.app().start();`` (py4web magic) to render the content of -``
    ...
    `` using Vue.js. ``components/auth.js`` also -automatically loads ``components/auth.html`` into the component -placeholder (more py4web magic). The component is responsible for -rendering the login/register/etc forms using reactive html and -GETing/POSTing data to the Auth service APIs. - -If you need to change the style of the component you can edit -“components/auth.html” to suit your needs. It is mostly HTML with some -special Vue ``v-*`` tags. - -Using Auth ----------- - -There two ways to use the Auth object in an action: - -.. code:: python - - @action('index') - @action.uses(auth) - def index(): - user = auth.get_user() - return 'hello {first_name}'.format(**user) if user else 'not logged in' - -With ``@action.uses(auth)`` we tell py4web that this action needs to -have information about the user, then try to parse the session for a -user session. - -.. code:: python - - @action('index') - @action.uses(auth.user) - def index(): - user = auth.get_user() - return 'hello {first_name}'.format(**user)' - -Here ``@action.uses(auth.user)`` tells py4web that this action requires -a logged in user and should redirect to login if no user is logged in. - -Auth Plugins ------------- - -Plugins are defined in “py4web/utils/auth_plugins” and they have a -hierarchical structure. Some are exclusive and some are not. For example, -default, LDAP, PAM, and SAML are exclusive (the developer has to pick -one). Default, Google, Facebook, and Twitter OAuth are not exclusive -(the developer can pick them all and the user gets to choose using the -UI). - -The ```` components will automatically adapt to display login -forms as required by the installed plugins. - -**At this time we cannot guarantee that the following plugins work well. -They have been ported from web2py where they do work but testing is -still needed** - -PAM -~~~ - -Configuring PAM is the easiest: - -.. code:: python - - from py4web.utils.auth_plugins.pam_plugin import PamPlugin - auth.register_plugin(PamPlugin()) - -This one like all plugins must be imported and registered. Once -registered the UI (components/auth) and the RESTful APIs know how to -handle it. The constructor of this plugins does not require any -arguments (where other plugins do). - -The ``auth.register_plugin(...)`` **must** come before the -``auth.enable()`` since it makes no sense to expose APIs before desired -plugins are mounted. - -LDAP -~~~~ - -.. code:: python - - from py4web.utils.auth_plugins.ldap_plugin import LDAPPlugin - LDAP_SETTING = { - 'mode': 'ad', - 'server': 'my.domain.controller', - 'base_dn': 'ou=Users,dc=domain,dc=com' - } - auth.register_plugin(LDAPPlugin(**LDAP_SETTINGS)) - -OAuth2 with Google (tested OK) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code:: python - - from py4web.utils.auth_plugins.oauth2google import OAuth2Google # TESTED - auth.register_plugin(OAuth2Google( - client_id=CLIENT_ID, - client_secret=CLIENT_SECRET, - callback_url='auth/plugin/oauth2google/callback')) - -The client id and client secret must be provided by Google. - -OAuth2 with Facebook (tested OK) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code:: python - - from py4web.utils.auth_plugins.oauth2facebook import OAuth2Facebook # UNTESTED - auth.register_plugin(OAuth2Facebook( - client_id=CLIENT_ID, - client_secret=CLIENT_SECRET, - callback_url='auth/plugin/oauth2google/callback')) - -The client id and client secret must be provided by Facebook. - -Tags and Permissions --------------------- - -Py4web does not have the concept of groups as web2py does. Experience -showed that while that mechanism is powerful it suffers from two -problems: it is overkill for most apps, and it is not flexible enough -for very complex apps. Py4web provides a general purpose tagging -mechanism that allows the developer to tag any record of any table, -check for the existence of tags, as well as checking for records -containing a tag. Group membership can be thought of a type of tag that -we apply to users. Permissions can also be tags. Developer are free to -create their own logic on top of the tagging system. - -To use the tagging system you need to create an object to tag a table: - -.. code:: python - - groups = Tags(db.auth_user) - -Then you can add one or more tags to records of the table as well as -remove existing tags: - -.. code:: python - - groups.add(user.id, 'manager') - groups.add(user.id, ['dancer', 'teacher']) - groups.remove(user.id, 'dancer') - -Here the use case is group based access control where the developer -first checks if a user is a member of the ``'manager'`` group, if the -user is not a manager (or no one is logged in) py4web redirects to the -``'not authorized url'``. If the user is in the correct group then -py4web displays ‘hello manager’: - -.. code:: python - - @action('index') - @action.uses(auth.user) - def index(): - if not 'manager' in groups.get(auth.get_user()['id']): - redirect(URL('not_authorized')) - return 'hello manager' - -Here the developer queries the db for all records having the desired -tag(s): - -.. code:: python - - @action('find_by_tag/{group_name}') - @action.uses(db) - def find(group_name): - users = db(groups.find([group_name])).select(orderby=db.auth_user.first_name | db.auth_user.last_name) - return {'users': users} - -We leave it to you as an exercise to create a fixture ``has_membership`` -to enable the following syntax: - -.. code:: python - - @action('index') - @action.uses(has_membership(groups, 'teacher')) - def index(): - return 'hello teacher' - -**Important:** ``Tags`` are automatically hierarchical. For example, if -a user has a group tag ‘teacher/high-school/physics’, then all the -following searches will return the user: - -- ``groups.find('teacher/high-school/physics')`` -- ``groups.find('teacher/high-school')`` -- ``groups.find('teacher')`` - -This means that slashes have a special meaning for tags. Slashes at the -beginning or the end of a tag are optional. All other chars are allowed -on equal footing. - -Notice that one table can have multiple associated ``Tags`` objects. The -name groups here is completely arbitrary but has a specific semantic -meaning. Different ``Tags`` objects are orthogonal to each other. The -limit to their use is your creativity. - -For example you could create a table groups: - -.. code:: python - - db.define_table('auth_group', Field('name'), Field('description')) - -and to Tags: - -.. code:: python - - groups = Tags(db.auth_user) - permissions = Tags(db.auth_groups) - -Then create a zapper group, give it a permission, and make a user member -of the group: - -.. code:: python - - zap_id = db.auth_group.insert(name='zapper', description='can zap database') - permissions.add(zap_id, 'zap database') - groups.add(user.id, 'zapper') - -And you can check for a user permission via an explicit join: - -.. code:: python - - @action('zap') - @action.uses(auth.user) - def zap(): - user = auth.get_user() - permission = 'zap database' - if db(permissions.find(permission))( - db.auth_group.name.belongs(groups.get(user['id'])) - ).count(): - # zap db - return 'database zapped' - else: - return 'you do not belong to any group with permission to zap db' - -Notice here ``permissions.find(permission)`` generates a query for all -groups with the permission and we further filter those groups for those -the current user is member of. We count them and if we find any, then -the user has the permission. diff --git a/apps/_documentation/static/en/_sources/chapter-14.rst.txt b/apps/_documentation/static/en/_sources/chapter-14.rst.txt deleted file mode 100644 index 93d4f08bb..000000000 --- a/apps/_documentation/static/en/_sources/chapter-14.rst.txt +++ /dev/null @@ -1,479 +0,0 @@ -==== -Grid -==== - -py4web comes with a Grid object providing simple grid and CRUD -capabilities. - -Key Features ------------- - -- Click column heads for sorting - click again for DESC -- Pagination control -- Built in Search (can use search_queries OR search_form) -- Action Buttons - with or without text -- Full CRUD with Delete Confirmation -- Pre and Post Action (add your own buttons to each row) -- Grid dates in local format -- Default formatting by type plus user overrides - -Basic Example -------------- - -In this simple example we will make a grid over the company table. - -controllers.py - -.. code:: python - - from functools import reduce - from py4web.utils.grid import Grid - from py4web import action - from .common import db, session, auth - - @action('companies', method=['POST', 'GET']) - @action('companies/', method=['POST', 'GET']) - @action.uses(session, db, auth, 'grid.html') - def companies(path=None): - grid = Grid(path, - query=reduce(lambda a, b: (a & b), [db.company.id > 0]), - orderby=[db.company.name], - search_queries=[['Search by Name', lambda val: db.company.name.contains(val)]]) - - return dict(grid=grid) - -grid.html - -:: - - [[extend 'layout.html']] - [[=grid.render()]] - -Signature ---------- - -.. code:: python - - class Grid: - def __init__( - self, - path, - query, - search_form=None, - search_queries=None, - fields=None, - show_id=False, - orderby=None, - left=None, - headings=None, - create=True, - details=True, - editable=True, - deletable=True, - pre_action_buttons=None, - post_action_buttons=None, - auto_process=True, - rows_per_page=15, - include_action_button_text=True, - search_button_text="Filter", - formstyle=FormStyleDefault, - grid_class_style=GridClassStyle, - ): - -- path: the route of this request -- query: pydal query to be processed -- search_form: py4web FORM to be included as the search form. If - search_form is passed in then the developer is responsible for - applying the filter to the query passed in. This differs from - search_queries. -- search_queries: list of query lists to use to build the search form. - Ignored if search_form is used. Format is -- fields: list of fields to display on the list page, if blank, glean - tablename from first query and use all fields of that table -- show_id: show the record id field on list page - default = False -- orderby: pydal orderby field or list of fields -- left: if joining other tables, specify the pydal left expression here -- headings: list of headings to be used for list page - if not provided - use the field label -- details: URL to redirect to for displaying records - set to True to - automatically generate the URL - set to False to not display the - button -- create: URL to redirect to for creating records - set to True to - automatically generate the URL - set to False to not display the - button -- editable: URL to redirect to for editing records - set to True to - automatically generate the URL - set to False to not display the - button -- deletable: URL to redirect to for deleting records - set to True to - automatically generate the URL - set to False to not display the - button -- pre_action_buttons: list of action_button instances to include before - the standard action buttons -- post_action_buttons: list of action_button instances to include after - the standard action buttons -- auto_process: Boolean - whether or not the grid should be processed - immediately. If False, developer must call grid.process() once all - params are setup -- rows_per_page: number of rows to display per page. Default 15 -- include_action_button_text: boolean telling the grid whether or not - you want text on action buttons within your grid -- search_button_text: text to appear on the submit button on your - search form -- formstyle: py4web Form formstyle used to style your form when - automatically building CRUD forms -- grid_class_style: GridClassStyle object used to override defaults for - styling your rendered grid. Allows you to specify classes or styles - to apply at certain points in the grid. - -Searching / Filtering ---------------------- - -There are two ways to build a search form. - -- Provide a search_queries list -- Build your own custom search form - -If you provide a search_queries list to grid, it will: - -- build a search form. If more than one search query in the list, it - will also generate a dropdown to select which search field to search - against -- gather filter values and filter the grid - -However, if this doesn’t give you enough flexibility you can provide -your own search form and handle all the filtering (building the queries) -by yourself. - -CRUD ----- - -The grid provides CRUD (create, read, update and delete) capabilities -utilizing py4web Form. - -You can turn off CRUD features by setting -create/details/editable/deletable during grid instantiation. - -Additionally, you can provide a separate URL to the -create/details/editable/deletable parameters to bypass the -auto-generated CRUD pages and handle the detail pages yourself. - -Using templates ---------------- - -Use the following to render your grid or CRUD forms in your templates. - -Display the grid or a CRUD Form - -:: - - [[=grid.render()]] - -To allow for customizing CRUD form layout (like with web2py) you can use -the following - -:: - - [[form = grid.render() ]] - [[form.custom["begin"] ]] - ... - [[form.custom["submit"] - [[form.custom["end"] - -When handling custom form layouts you need to know if you are displaying -the grid or a form. Use the following to decide - -:: - - [[if request.query.get('action') in ('details', 'edit'):]] - # Display the custom form - [[form = grid.render() ]] - [[form.custom["begin"] ]] - ... - [[form.custom["submit"] - [[form.custom["end"] - [[else:]] - [[grid.render() ]] - [[pass]] - -Customizing Style ------------------ - -You can provide your own formstyle or grid classes and style to grid. - -- formstyle is the same as a Form formstyle, used to style the CRUD - forms. -- grid_class_style is a class that provides the classes and/or styles - used for certain portions of the grid. - -The default GridClassStyle - based on no.css, primarily uses styles to -modify the layout of the grid - -.. code:: python - - class GridClassStyle: - - """ - Default grid style - Internal element names match default class name, other classes can be added - Style use should be minimized since it cannot be overridden by CSS - """ - - classes = { - "grid-wrapper": "grid-wrapper", - "grid-header": "grid-header", - "grid-new-button": "grid-new-button info", - "grid-search": "grid-search", - "grid-table-wrapper": "grid-table-wrapper", - "grid-table": "grid-table", - "grid-sorter-icon-up": "grid-sort-icon-up fas fa-sort-up", - "grid-sorter-icon-down": "grid-sort-icon-down fas fa-sort-down", - "grid-th-action-button": "grid-col-action-button", - "grid-td-action-button": "grid-col-action-button", - "grid-tr": "", - "grid-th": "", - "grid-td": "", - "grid-details-button": "grid-details-button info", - "grid-edit-button": "grid-edit-button info", - "grid-delete-button": "grid-delete-button info", - "grid-footer": "grid-footer", - "grid-info": "grid-info", - "grid-pagination": "grid-pagination", - "grid-pagination-button": "grid-pagination-button info", - "grid-pagination-button-current": "grid-pagination-button-current default", - "grid-cell-type-string": "grid-cell-type-string", - "grid-cell-type-text": "grid-cell-type-text", - "grid-cell-type-boolean": "grid-cell-type-boolean", - "grid-cell-type-float": "grid-cell-type-float", - "grid-cell-type-int": "grid-cell-type-int", - "grid-cell-type-date": "grid-cell-type-date", - "grid-cell-type-time": "grid-cell-type-time", - "grid-cell-type-datetime": "grid-cell-type-datetime", - "grid-cell-type-upload": "grid-cell-type-upload", - "grid-cell-type-list": "grid-cell-type-list", - # specific for custom form - "search_form": "search-form", - "search_form_table": "search-form-table", - "search_form_tr": "search-form-tr", - "search_form_td": "search-form-td", - } - - styles = { - "grid-wrapper": "", - "grid-header": "display: table; width: 100%", - "grid-new-button": "display: table-cell;", - "grid-search": "display: table-cell; float:right", - "grid-table-wrapper": "overflow-x: auto; width:100%", - "grid-table": "", - "grid-sorter-icon-up": "", - "grid-sorter-icon-down": "", - "grid-th-action-button": "", - "grid-td-action-button": "", - "grid-tr": "", - "grid-th": "white-space: nowrap; vertical-align: middle", - "grid-td": "white-space: nowrap; vertical-align: middle", - "grid-details-button": "margin-bottom: 0", - "grid-edit-button": "margin-bottom: 0", - "grid-delete-button": "margin-bottom: 0", - "grid-footer": "display: table; width:100%", - "grid-info": "display: table-cell;", - "grid-pagination": "display: table-cell; text-align:right", - "grid-pagination-button": "min-width: 20px", - "grid-pagination-button-current": "min-width: 20px; pointer-events:none; opacity: 0.7", - "grid-cell-type-string": "white-space: nowrap; vertical-align: middle; text-align: left; text-overflow: ellipsis; max-width: 200px", - "grid-cell-type-text": "vertical-align: middle; text-align: left; text-overflow: ellipsis; max-width: 200px", - "grid-cell-type-boolean": "white-space: nowrap; vertical-align: middle; text-align: center", - "grid-cell-type-float": "white-space: nowrap; vertical-align: middle; text-align: right", - "grid-cell-type-int": "white-space: nowrap; vertical-align: middle; text-align: right", - "grid-cell-type-date": "white-space: nowrap; vertical-align: middle; text-align: right", - "grid-cell-type-time": "white-space: nowrap; vertical-align: middle; text-align: right", - "grid-cell-type-datetime": "white-space: nowrap; vertical-align: middle; text-align: right", - "grid-cell-type-upload": "white-space: nowrap; vertical-align: middle; text-align: center", - "grid-cell-type-list": "white-space: nowrap; vertical-align: middle; text-align: left", - # specific for custom form - "search_form": "", - "search_form_table": "", - "search_form_tr": "", - "search_form_td": "", - } - - @classmethod - def get(cls, element): - """returns a dict with _class and _style for the element name""" - return { - "_class": cls.classes.get(element), - "_style": cls.styles.get(element), - } - -GridClassStyleBulma - bulma implementation - -.. code:: python - - class GridClassStyleBulma(GridClassStyle): - classes = { - "grid-wrapper": "grid-wrapper field", - "grid-header": "grid-header pb-2", - "grid-new-button": "grid-new-button button", - "grid-search": "grid-search is-pulled-right pb-2", - "grid-table-wrapper": "grid-table-wrapper table_wrapper", - "grid-table": "grid-table table is-bordered is-striped is-hoverable is-fullwidth", - "grid-sorter-icon-up": "grid-sort-icon-up fas fa-sort-up is-pulled-right", - "grid-sorter-icon-down": "grid-sort-icon-down fas fa-sort-down is-pulled-right", - "grid-th-action-button": "grid-col-action-button is-narrow", - "grid-td-action-button": "grid-col-action-button is-narrow", - "grid-tr": "", - "grid-th": "", - "grid-td": "", - "grid-details-button": "grid-details-button button is-small", - "grid-edit-button": "grid-edit-button button is-small", - "grid-delete-button": "grid-delete-button button is-small", - "grid-footer": "grid-footer", - "grid-info": "grid-info is-pulled-left", - "grid-pagination": "grid-pagination is-pulled-right", - "grid-pagination-button": "grid-pagination-button button is-small", - "grid-pagination-button-current": "grid-pagination-button-current button is-primary is-small", - "grid-cell-type-string": "grid-cell-type-string", - "grid-cell-type-text": "grid-cell-type-text", - "grid-cell-type-boolean": "grid-cell-type-boolean has-text-centered", - "grid-cell-type-float": "grid-cell-type-float", - "grid-cell-type-int": "grid-cell-type-int", - "grid-cell-type-date": "grid-cell-type-date", - "grid-cell-type-time": "grid-cell-type-time", - "grid-cell-type-datetime": "grid-cell-type-datetime", - "grid-cell-type-upload": "grid-cell-type-upload", - "grid-cell-type-list": "grid-cell-type-list", - # specific for custom form - "search_form": "search-form is-pulled-right pb-2", - "search_form_table": "search-form-table", - "search_form_tr": "search-form-tr", - "search_form_td": "search-form-td pr-1", - } - - styles = { - "grid-wrapper": "", - "grid-header": "", - "grid-new-button": "", - "grid-search": "", - "grid-table-wrapper": "", - "grid-table": "", - "grid-sorter-icon-up": "", - "grid-sorter-icon-down": "", - "grid-th-action-button": "", - "grid-td-action-button": "", - "grid-tr": "", - "grid-th": "text-align: center; text-transform: uppercase;", - "grid-td": "", - "grid-details-button": "", - "grid-edit-button": "", - "grid-delete-button": "", - "grid-footer": "padding-top: .5em;", - "grid-info": "", - "grid-pagination": "", - "grid-pagination-button": "margin-left: .25em;", - "grid-pagination-button-current": "margin-left: .25em;", - "grid-cell-type-string": "", - "grid-cell-type-text": "", - "grid-cell-type-boolean": "", - "grid-cell-type-float": "", - "grid-cell-type-int": "", - "grid-cell-type-date": "", - "grid-cell-type-time": "", - "grid-cell-type-datetime": "", - "grid-cell-type-upload": "", - "grid-cell-type-list": "", - # specific for custom form - "search_form": "", - "search_form_table": "", - "search_form_tr": "", - "search_form_td": "", - } - -You can build your own class_style to be used with the css framework of -your choice. - -Custom Action Buttons ---------------------- - -As with web2py, you can add additional buttons to each row in your grid. -You do this by providing pre_action_buttons or post_action_buttons to -the Grid **init** method. - -- pre_action_buttons - list of action_button instances to include - before the standard action buttons -- post_action_buttons - list of action_button instances to include - after the standard action buttons - -You can build your own Action Button class to pass to pre/post action -buttons based on the template below (this is not provided with py4web) - -Sample Action Button Class --------------------------- - -.. code:: python - - def __init__(self, - url, - text, - icon="fa-calendar", - additional_classes=None, - message=None, - append_id=False): - -- url: the page to navigate to when the button is clicked -- text: text to display on the button -- icon: the font-awesome icon to display before the text -- additional_classes: a space-separated list of classes to include on - the button element -- message: confirmation message to display if ‘confirmation’ class is - added to additional classes -- append_id: if True, add id_field_name=id_value to the url querystring - for the button - -Reference Fields ----------------- - -When displaying fields in a PyDAL table, you sometimes want to display a -more descriptive field than a foreign key value. There are a couple of -ways to handle that with the py4web grid. - -filter_out on PyDAL field definition - here is an example of a foreign -key field - -.. code:: python - - Field('company', 'reference company', - requires=IS_NULL_OR(IS_IN_DB(db, 'company.id', - '%(name)s', - zero='..')), - filter_out=lambda x: x.name if x else ''), - -This will display the company name in the grid instead of the company ID - -The downfall of using this method is that sorting and filtering are -based on the company field in the employee table and not the name of the -company - -left join and specify fields from joined table - specified on the left -parameter of Grid instantiation - -.. code:: python - - db.company.on(db.employee.company == db.company.id) - -You can specify a standard PyDAL left join, including a list of joins to -consider. - -Now the company name field can be included in your fields list can be -clicked on and sorted. - -Now you can also specify a query such as: - -.. code:: python - - queries.append((db.employee.last_name.contains(search_text)) | (db.employee.first_name.contains(search_text)) | db.company.name.contains(search_text))) - -This method allows you to sort and filter, but doesn’t allow you to -combine fields to be displayed together as the filter_out method would - -You need to determine which method is best for your use case -understanding the different grids in the same application may need to -behave differently. diff --git a/apps/_documentation/static/en/_sources/chapter-15.rst.txt b/apps/_documentation/static/en/_sources/chapter-15.rst.txt deleted file mode 100644 index 87e35b3bd..000000000 --- a/apps/_documentation/static/en/_sources/chapter-15.rst.txt +++ /dev/null @@ -1,316 +0,0 @@ -===================== -From web2py to py4web -===================== - -This chapter is dedicated to help users for porting old web2py applications to py4web. - -Web2py and py4web share many similarities and some differences. For example they share the same -database abstraction layer (pyDAL) which means pydal table definitions and queries are identical -between the two frameworks. They also share the same template language with the minor caveat that -web2py defaults to `{{...}}` delimiters while py4web defaults to `[[...]]` delimiters. They also -share the same validators, part of pyDAL, and very similar helpers. The py4web ones are a -lighter/faster/minimalist re-implementation but they serve the same purpose and support a very -similar syntax. They both provide a `Form` object (equivalent to `SQLFORM` in web2py) and a `Grid` -object (equivalent to `SQLFORM.grid` in web2py). They both provide a `XML` object that can sanitize -HTML and `URL` helper to generate URL. They both can raise `HTTP` to return non-200 OK pages. They -both provide an `Auth` object that can generate register/login/change password/lost password/edit -profile forms. Both web2py and py4web track and log all errors. - -Some of the main differences are the following: - -- web2py works with both Python 2.6+ and 3.6+, while py4web runs on Python 3.6+ only. So, if your - old web2py application is still using Python 2, your first step involves migrating it to at - least Python 3.6, better if the latest 3.8. - -- web2py apps consist of collection of files which are executed at every HTTP request (using a - custom importer, in a predetermined order). In py4web apps are regular python modules that are - imported automatically by the frameworks. By the way, this makes possible the use of standard - python debuggers (even inside the most used IDEs). - -- In web2py every app has a fixed folder structure. A function is an action if and only if it is - defined in a ``controllers/*.py`` file. py4web is much less constraining. In py4web an app must - have an entry point ``__init__.py`` and a ``static`` folder. Every other convention such as the - location of templates, uploaded files, translation files, sessions, etc. is user specified. - -- In web2py the scaffolding app (the blue print for creating new apps) is called “welcome”. In - py4web it is called “_scaffold”. _scaffold contains a “settings.py” file and a “common.py”. - The latter provides an example of how to enable Auth and configure all the options for the - specific app. _scaffold has also a “model.py” file and a “controller.py” file but, unlike - web2py, those files are not treated in any special manner. Their names follow a convention - (not enforced by the framework) and they are imported by the `__init__.py` file as for any - regular python module. - -- In web2py every function in ``controllers/*.py`` is an action. In py4web a function is an action - if it has the ``@action("...")`` decorator. That means that actions can be defined anywhere. The - admin interface will help you locate where a particular action is defined. - -- In web2py the mapping between URLs and file/function names is automatic but it can be - overwritten in “routes.py” (like in Django). In py4web the mapping is specified in the decorator - as in `@action('my_url_path')` (like in Bottle and Flask). Notice that if the path starts with - “/” it is assumed to be an absolute path. If not, it is assumed to be relative and prepended by - the “/{appname}/” prefix. Also, if the path ends with “/index”, the latter postfix is assumed - to be optional. - -- In web2py the path extension matters and “http://*.html” is expected to return HTML while - “http://*.json” is expected to return JSON, etc. In py4web there is no such convention. If the - action returns a dict() and has a template, the dict() will be rendered by the template, else it - will be rendered in JSON. More complex behavior can be accomplished using decorators. - -- In web2py there are many wrappers around each action and, for example, they could handle sessions, - pluralization, database connections, and more whether the action needs it or not. This makes - web2py performances hard to compare with other frameworks. In py4web everything is optional and - features must be enabled and configured for each action using the ``@action.uses(...)`` decorator. - The arguments of ``@action.uses(...)`` are called fixtures in analogy with the fixtures in a - house. They add functionality by providing preprocessing and postprocessing to the action. For - example ``@action.uses(session, T, db, flash)`` indicates that the action needs to use session, - internationalization/pluralization (T), the database (db), and carry on state for flash messages - upon redirection. - -- web2py uses its own request/response objects. py4web uses the request/response objects from the - underlying Bottle framework. While this may change in the future we are committed to keep them - compatible with Bottle because of its excellent documentation. Bottle also handles for py4web - the interface with the web server, routing, partial requests, if modified since, and file - streaming. - -- Both web2py and py4web use the same pyDAL therefore tables are defined using the same exact - syntax, and so do queries. In web2py tables are re-defined at every HTTP - request, when the entire models are executed. In py4web only the action is executed for every - HTTP request, while the code defined outside of actions is only executed at startup. That makes - py4web much faster, in particular when there are many tables. The downside of this approach is - that the developer should be careful to never override pyDAL variables inside action or in any - way that depends on the content of the request object, else the code is not thread safe. The - only variables that can be changed at will are the following field attributes: readable, - writable, requires, update, default. All the others are for practical purposes to be - considered global and non thread safe. This is also the reason that makes using - :ref:`Lazy Tables` with py4web useless and even dangerous. - -- Both web2py and pyweb have an Auth object which serve the same purpose. Both objects have the - ability to generate forms pretty much in the same manner. The py4web ones is defined to be more - modular and extensible and support both Forms and APIs, but it lacks the `auth.requires_*` - decorators and group membership/permissions. This does not mean that the feature is not - available. In fact py4web is even more powerful and that is why the syntax is different. While - the web2py Auth objects tries to do everything, the corresponding py4web object is only in - charge of establishing the identity of a user, not what the user can do. The latter can be - achieved by attaching Tags to users. So group membership is assigned by labeling users with - the Tags of the groups they belong to and checking permissions based on the user tags. Py4web - provides a mechanism for assigning and checking tags efficiently to any object, including but - not limited to, users. - -- Web2py comes with the Rocket web server. py4web at the time of writing defaults to the Tornado - web server but this may change. - - -Simple conversion examples --------------------------- - -“Hello world” example -~~~~~~~~~~~~~~~~~~~~~ - -**web2py** - -.. code:: python - - # in controllers/default.py - def index(): - return "hello world" - ---> **py4web** - - -.. code:: python - - # file imported by __init__.py - @action('index') - def index(): - return "hello world" - -“Redirect with variables” example -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**web2py** - -.. code:: python - - request.get_vars.name - request.post_vars.name - request.env.name - raise HTTP(301) - redirect(url) - URL('c','f',args=[1,2],vars={}) - ---> **py4web** - -.. code:: python - - request.query.get('name') - request.forms.get('name') or request.json.get('name') - request.environ.get('name') - raise HTTP(301) - redirect(url) - URL('c', 'f', 1, 2, vars={}) - -“Returning variables” example -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**web2py** - -.. code:: python - - def index(): - a = request.get_vars.a - return locals() - ---> **py4web** - -.. code:: python - - @action("index") - def index(): - a = request.query.get('a') - return locals() - -“Returning args” example -~~~~~~~~~~~~~~~~~~~~~~~~ - -**web2py** - -.. code:: python - - def index(): - a, b, c = request.args - b, c = int(b), int(c) - return locals() - ---> **py4web** - -.. code:: python - - @action("index///") - def index(a,b,c): - return locals() - -“Return calling methods” example -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**web2py** - -.. code:: python - - def index(): - if request.method == "GET": - return "GET" - if request.method == "POST": - return "POST" - raise HTTP(400) - ---> **py4web** - -.. code:: python - - @action("index", method="GET") - def index(): - return "GET" - - @action("index", method="POST") - def index(): - return "POST" - -“Setting up a counter” example -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**web2py** - -.. code:: python - - def counter(): - session.counter = (session.counter or 0) + 1 - return str(session.counter) - ---> **py4web** - -.. code:: python - - def counter(): - session['counter'] = session.get('counter', 0) + 1 - return str(session['counter']) - -“View” example -~~~~~~~~~~~~~~ - -**web2py** - -.. code:: html - - {{ extend 'layout.html' }} -
    - {{ for k in range(1): }} - {{= k }} - {{ pass }} -
    - ---> **py4web** - -.. code:: html - - [[ extend 'layout.html' ]] -
    - [[ for k in range(1): ]] - [[= k ]] - [[ pass ]] -
    - -“Form and flash” example -~~~~~~~~~~~~~~~~~~~~~~~~ - -**web2py** - -.. code:: python - - db.define_table('thing', Field('name')) - - def index(): - form = SQLFORM(db.thing) - form.process() - if form.accepted: - flash = 'Done!' - rows = db(db.thing).select() - return locals() - ---> **py4web** - -.. code:: python - - db.define_table('thing', Field('name')) - - @action("index") - @action.uses(db, flash) - def index(): - form = Form(db.thing) - if form.accepted: - flash.set("Done!", "green") - rows = db(db.thing).select() - return locals() - -“grid” example -~~~~~~~~~~~~~~ - -**web2py** - -.. code:: python - - def index(): - grid = SQLFORM.grid(db.thing, editable=True) - return locals() - - ---> **py4web** - - -.. code:: python - - @action("index") - @action.uses(db, flash) - def index(): - grid = Grid(db.thing) - form.param.editable = True - return locals() diff --git a/apps/_documentation/static/en/_sources/index.rst.txt b/apps/_documentation/static/en/_sources/index.rst.txt deleted file mode 100644 index 4621c6122..000000000 --- a/apps/_documentation/static/en/_sources/index.rst.txt +++ /dev/null @@ -1,32 +0,0 @@ - -py4web: the reference Manual -============================ - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - chapter-01 - chapter-02 - chapter-03 - chapter-04 - chapter-05 - chapter-06 - chapter-07 - chapter-08 - chapter-09 - chapter-10 - chapter-11 - chapter-12 - chapter-13 - chapter-14 - chapter-15 - chapter-16 - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/apps/_documentation/static/en/_static/_sphinx_javascript_frameworks_compat.js b/apps/_documentation/static/en/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/apps/_documentation/static/en/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/apps/_documentation/static/en/_static/basic.css b/apps/_documentation/static/en/_static/basic.css index aa9df316d..7ebbd6d07 100644 --- a/apps/_documentation/static/en/_static/basic.css +++ b/apps/_documentation/static/en/_static/basic.css @@ -1,12 +1,5 @@ /* - * basic.css - * ~~~~~~~~~ - * * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ /* -- main layout ----------------------------------------------------------- */ @@ -115,15 +108,11 @@ img { /* -- search page ----------------------------------------------------------- */ ul.search { - margin: 10px 0 0 20px; - padding: 0; + margin-top: 10px; } ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; + padding: 5px 0; } ul.search li a { @@ -222,7 +211,7 @@ table.modindextable td { /* -- general body styles --------------------------------------------------- */ div.body { - min-width: 450px; + min-width: 360px; max-width: 800px; } @@ -237,14 +226,8 @@ a.headerlink { visibility: hidden; } -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; +a:visited { + color: #551A8B; } h1:hover > a.headerlink, @@ -335,12 +318,16 @@ p.sidebar-title { font-weight: bold; } +nav.contents, +aside.topic, div.admonition, div.topic, blockquote { clear: left; } /* -- topics ---------------------------------------------------------------- */ +nav.contents, +aside.topic, div.topic { border: 1px solid #ccc; padding: 7px; @@ -379,6 +366,8 @@ div.body p.centered { div.sidebar > :last-child, aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, div.topic > :last-child, div.admonition > :last-child { margin-bottom: 0; @@ -386,6 +375,8 @@ div.admonition > :last-child { div.sidebar::after, aside.sidebar::after, +nav.contents::after, +aside.topic::after, div.topic::after, div.admonition::after, blockquote::after { @@ -428,10 +419,6 @@ table.docutils td, table.docutils th { border-bottom: 1px solid #aaa; } -table.footnote td, table.footnote th { - border: 0 !important; -} - th { text-align: left; padding-right: 5px; @@ -615,19 +602,26 @@ ul.simple p { margin-bottom: 0; } -dl.footnote > dt, -dl.citation > dt { +aside.footnote > span, +div.citation > span { float: left; - margin-right: 0.5em; } - -dl.footnote > dd, -dl.citation > dd { +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { margin-bottom: 0em; } - -dl.footnote > dd:after, -dl.citation > dd:after { +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { content: ""; clear: both; } @@ -644,10 +638,6 @@ dl.field-list > dt { padding-right: 5px; } -dl.field-list > dt:after { - content: ":"; -} - dl.field-list > dd { padding-left: 0.5em; margin-top: 0em; @@ -673,6 +663,16 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -731,8 +731,9 @@ dl.glossary dt { .classifier:before { font-style: normal; - margin: 0.5em; + margin: 0 0.5em; content: ":"; + display: inline-block; } abbr, acronym { @@ -740,6 +741,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { @@ -756,6 +765,7 @@ span.pre { -ms-hyphens: none; -webkit-hyphens: none; hyphens: none; + white-space: nowrap; } div[class*="highlight-"] { @@ -819,7 +829,7 @@ div.code-block-caption code { table.highlighttable td.linenos, span.linenos, -div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ +div.highlight span.gp { /* gp: Generic.Prompt */ user-select: none; -webkit-user-select: text; /* Safari fallback only */ -webkit-user-select: none; /* Chrome/Safari */ diff --git a/apps/_documentation/static/en/_static/css/badge_only.css b/apps/_documentation/static/en/_static/css/badge_only.css index e380325bc..88ba55b96 100644 --- a/apps/_documentation/static/en/_static/css/badge_only.css +++ b/apps/_documentation/static/en/_static/css/badge_only.css @@ -1 +1 @@ -.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/apps/_documentation/static/en/_static/css/theme.css b/apps/_documentation/static/en/_static/css/theme.css index 8cd4f101a..0f14f1064 100644 --- a/apps/_documentation/static/en/_static/css/theme.css +++ b/apps/_documentation/static/en/_static/css/theme.css @@ -1,4 +1,4 @@ -html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li span.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p.caption .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li span.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p.caption .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li span.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li span.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li span.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li span.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li span.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p.caption .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.btn .wy-menu-vertical li span.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p.caption .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.nav .wy-menu-vertical li span.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p.caption .btn .headerlink,.rst-content p.caption .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li span.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol li,.rst-content ol.arabic li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content ol.arabic li p:last-child,.rst-content ol.arabic li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover span.toctree-expand,.wy-menu-vertical li.on a:hover span.toctree-expand{color:grey}.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand{display:block;font-size:.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover span.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content img{max-width:100%;height:auto}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp{user-select:none;pointer-events:none}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink{visibility:hidden;font-size:14px}.rst-content .code-block-caption .headerlink:after,.rst-content .toctree-wrapper>p.caption .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content p.caption .headerlink:after,.rst-content table>caption .headerlink:after{content:"\f0c1";font-family:FontAwesome}.rst-content .code-block-caption:hover .headerlink:after,.rst-content .toctree-wrapper>p.caption:hover .headerlink:after,.rst-content dl dt:hover .headerlink:after,.rst-content h1:hover .headerlink:after,.rst-content h2:hover .headerlink:after,.rst-content h3:hover .headerlink:after,.rst-content h4:hover .headerlink:after,.rst-content h5:hover .headerlink:after,.rst-content h6:hover .headerlink:after,.rst-content p.caption:hover .headerlink:after,.rst-content table>caption:hover .headerlink:after{visibility:visible}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl dt span.classifier:before{content:" : "}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code,html.writer-html4 .rst-content dl:not(.docutils) tt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/apps/_documentation/static/en/_static/doctools.js b/apps/_documentation/static/en/_static/doctools.js index 61ac9d266..0398ebb9f 100644 --- a/apps/_documentation/static/en/_static/doctools.js +++ b/apps/_documentation/static/en/_static/doctools.js @@ -1,321 +1,149 @@ /* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * + * Base JavaScript utilities for all Sphinx HTML documentation. */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); } - return result; }; -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - /** * Small JavaScript module for the documentation. */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { - this.initOnKeyListeners(); - } +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); }, /** * i18n support */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } }, - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; }, - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; }, /** - * add context elements like header anchor links + * helper function to focus on search bar */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('
    \u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); }, /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + * Initialise the domain index toggle buttons */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, + }; - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); }, - initOnKeyListeners: function() { - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box, textarea, dropdown or button - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey - && !event.shiftKey) { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); } - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); } + break; } } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } }); - } + }, }; // quick alias for translations -_ = Documentation.gettext; +const _ = Documentation.gettext; -$(document).ready(function() { - Documentation.init(); -}); +_ready(Documentation.init); diff --git a/apps/_documentation/static/en/_static/documentation_options.js b/apps/_documentation/static/en/_static/documentation_options.js index 78beb9bbf..c11cf27cd 100644 --- a/apps/_documentation/static/en/_static/documentation_options.js +++ b/apps/_documentation/static/en/_static/documentation_options.js @@ -1,6 +1,5 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.20210619.1', +const DOCUMENTATION_OPTIONS = { + VERSION: '20250125', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', @@ -8,5 +7,7 @@ var DOCUMENTATION_OPTIONS = { LINK_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, }; \ No newline at end of file diff --git a/apps/_documentation/static/en/_static/jquery-3.5.1.js b/apps/_documentation/static/en/_static/jquery-3.5.1.js deleted file mode 100644 index 50937333b..000000000 --- a/apps/_documentation/static/en/_static/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
    " ], - col: [ 2, "", "
    " ], - tr: [ 2, "", "
    " ], - td: [ 3, "", "
    " ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - + + + + + + + - - - +
    - -
    - - -
    - -
    - - - @@ -358,7 +253,7 @@

    Acknowledgments - v: 1.20210619.1 + v: 20250125
    @@ -401,18 +296,11 @@

    Acknowledgments + - - - - - + - - - - - - + \ No newline at end of file diff --git a/apps/_documentation/static/en/genindex.html b/apps/_documentation/static/en/genindex.html index 45dcfb361..a3d984c8f 100644 --- a/apps/_documentation/static/en/genindex.html +++ b/apps/_documentation/static/en/genindex.html @@ -1,190 +1,92 @@ - + - - - Index — py4web 1.20210619.1 documentation - - - - - - - - - + Index — py4web 20250125 documentation + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - +
    - -
    - - -
    @@ -234,7 +127,7 @@

    Index

    - v: 1.20210619.1 + v: 20250125
    @@ -277,18 +170,11 @@

    Index

    - - - - - - - - + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-02.html b/apps/_documentation/static/pt/chapter-02.html new file mode 100644 index 000000000..c58af6789 --- /dev/null +++ b/apps/_documentation/static/pt/chapter-02.html @@ -0,0 +1,313 @@ + + + + + + + + + Ajuda, recursos e dicas — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Ajuda, recursos e dicas

    +

    Nós fizemos o nosso melhor para tornar simples PY4WEB e limpo. Mas você sabe, moderno programação web é uma tarefa difícil. Ela exige uma mente aberta, capaz de saltar com frequência (sem ser perdida!) De python para HTML para javascript para css e gestão de banco de dados mesmo. Mas não tenha medo, neste manual vamos ajudá-lo lado a lado nesta jornada. E há muitos outros recursos valiosos que nós vamos mostrar-lhe.

    +
    +

    Recursos

    +
    +

    Este manual

    +

    This manual is the Reference Manual for py4web. It’s available online at https://py4web.com/_documentation/static/index.html, where you’ll also find the +PDF and EBOOK version, in multiple languages. It written in RestructuredText and generated using Sphinx.

    +
    +
    +

    O grupo Google

    +

    Existe uma lista de discussão dedicado hospedado no Google Groups, consulte https://groups.google.com/g/py4web. Esta é a principal fonte de discussões para desenvolvedores e usuários simples. Para qualquer problema que você deve enfrentar, este é o lugar certo para procurar uma dica ou uma solução.

    +
    +
    +

    The Discord server

    +

    For quick questions and chats you can also use the free Discord server dedicated to py4web. You could usually find +many py4web developers hanging out in the channel.

    +
    +
    +

    Tutoriais e vídeo

    +

    There are many tutorials and videos available. Here are some of them:

    + +
    +
    +

    As fontes no GitHub

    +

    Last but not least, py4web is Open Source, with a BSD v3 license, hosted on GitHub at https://github.com/web2py/py4web. This means that you can read, +study and experiment with all of its internal details by yourself.

    +
    +
    +
    +

    Dicas e sugestões

    +

    Este parágrafo é dedicado a dicas preliminares, sugestões e dicas que podem ser úteis para saber antes de começar a aprender py4web.

    +
    +

    Pré-requisitos

    +

    A fim de compreender py4web você precisa de pelo menos um conhecimento básico python. Há muitos livros, cursos e tutoriais disponíveis na Web - escolher o que é melhor para você. decoradores do Python, em particular, são um marco de qualquer quadro python web e você tem que compreendê-lo totalmente.

    +
    +
    +

    Um local de trabalho python moderna

    +

    In the following chapters you will start coding on your computer. We suggest you to setup a modern python workplace if you plan to do it efficiently +and safely. Even for running simple examples and experimenting a little, we strongly suggest to use an Integrated Development Environment (IDE). +This will make your programming experience much better, allowing syntax checking, linting and visual debugging. +Nowadays there are two free and multi-platform main choices: Microsoft Visual Studio Code aka VScode and +JetBrains PyCharm.

    +

    Quando você vai começar a lidar com programas mais complexos e confiabilidade necessidade, sugerimos também para:

    +
      +
    • use virtual environments (also called virtualenv, see +here for an +introduction). In a complex workplace this will avoid to be messed up +with other python programs and modules

    • +
    • use git to keep track of your program’s changes and save +your changes in a safe place online (GitHub, GitLat, or Bitbucket).

    • +
    • use an editor with Syntax Highlighting. We highly recommend +Visual Studio Code (VScode) or PyCharm.

    • +
    +
    +
    +

    Depuração py4web com VScode

    +

    It’s quite simple to run and debug py4web within VScode.

    +

    If you have installed py4web from source, you just need to open the main py4web folder (not the apps folder!) with VScode and add:

    +
    "args": ["run", "apps"],
    +"program": "your_full_path_to_py4web.py",
    +
    +
    +

    to the vscode launch.json configuration file. Note that if you’re using Windows the «your_full_path_to_py4web.py» parameter must be written using +forward slash only, like +«C:/Users/your_name/py4web/py4web.py».

    +

    If you have instead installed py4web from pip, you need to set the launch.json file to run py4web as a module

    +
    {
    +  "name": "py4web apps",
    +  "type": "debugpy",
    +  "request": "launch",
    +  "module": "py4web",
    +  "args": ["run", "apps", "-D", "--watch", "lazy"]
    +}
    +
    +
    +

    Adjust the args to match your apps folder. For example, replace apps with . if you opened the apps folder itself in VSCode.

    +
    +

    Dica

    +

    In both cases, if you should get gevent errors you have to also add "gevent": true on the launch.json configuration file.

    +
    +
    +
    +

    Depuração py4web com PyCharm

    +

    In PyCharm, if you should get gevent errors you need to enable Settings | Build, Execution, Deployment | Python Debugger | Gevent compatible.

    +
    +
    +
    +

    Como contribuir

    +

    We need help from everyone: support our efforts! You can just participate in the Google group trying to answer other’s questions, submit bugs using or +create pull requests on the GitHub repository.

    +

    Se você deseja corrigir e ampliar este manual, ou mesmo traduzi-lo em uma nova língua estrangeira, você pode ler todas as informações necessárias diretamente no `README específica <https://github.com/web2py/py4web/blob/master/ docs / README.md> `__ no GitHub.

    +

    It’s really simple! Just change the .RST files in the /doc folder and create a Pull Request on +the GitHub repository at https://github.com/web2py/py4web - you can even do it within your browser. +Once the PR is accepted, your changes will be written on the master branch, and will be reflected on the web pages / pdf / epub at the next output +generation on the branch.

    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-03.html b/apps/_documentation/static/pt/chapter-03.html new file mode 100644 index 000000000..8e9203486 --- /dev/null +++ b/apps/_documentation/static/pt/chapter-03.html @@ -0,0 +1,748 @@ + + + + + + + + + Instalação e colocação em funcionamento — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Instalação e colocação em funcionamento

    +
    +

    Understanding the design

    +

    Before everything else it is important to understand that unlike other web frameworks, +is not only a python module that can be imported by apps. It is also a program that +is in charge of starting some apps. For this reason you need two things:

    +
      +
    • The py4web module (which you download from our web site, from pypi or from github)

    • +
    • One or more folders containing collections of apps you want to run.

    • +
    +

    py4web has command line options to create a folder with some example apps, +to initialize an existing folder, and to add scaffolding apps to that folder. +Once installed you can have multiple apps under the same folder running concurrently +and served by the same py4web process at the same address and port. +An apps folder is a python module, and each app is also a python module.

    +
    +
    +

    Plataformas e pré-requisitos suportados

    +

    py4web runs fine on Windows, MacOS and Linux. Its only prerequisite is +Python 3.7+, which must be installed in advance (except if you use binaries).

    +
    +
    +

    Procedimentos de configuração

    +

    There are four alternative ways of installing py4web, we will guide +you through each of them and if you get stuck, reach +out to us.

    +
    +

    Installing from pip, using a virtual environment

    +

    A instalação completa de qualquer aplicação python complexo como py4web certamente irá modificar o ambiente python do seu sistema. A fim de evitar qualquer alteração indesejada, é um bom hábito de usar um ambiente virtual python (também chamado ** virtualenv **, veja aqui <https://docs.python.org/3.7/tutorial/venv.html> __ para uma introdução). Este é um recurso padrão do Python; se você ainda não sabe virtualenv é um bom momento para começar a sua descoberta!

    +

    Here are the instructions for creating the virtual environment, activating it, +and installing py4web in it:

    +
    +
    python3 -m venv venv
    +. venv/bin/activate
    +python -m pip install --upgrade py4web --no-cache-dir
    +python py4web setup apps
    +python py4web set_password
    +python py4web run apps
    +
    +
    +

    Starting py4web is same with or without a virtual environment +python py4web run apps

    +
    +
    +
    +

    Installing from pip, without virtual environment

    +

    pip is the basic installation procedure for py4web, it will +quickly install the latest stable release of py4web.

    +

    From the command line

    +
    python3 -m pip install --upgrade py4web --no-cache-dir --user
    +
    +
    +

    Also, if python3 does not work, try specify a full version as in python3.8.

    +

    Isto irá instalar py4web e todas as suas dependências em único caminho do sistema. A pasta de ativos (que contém os aplicativos do sistema do py4web) também será criado. Após a instalação, você será capaz de começar a py4web em qualquer pasta de trabalho com

    +
    py4web setup apps
    +py4web set_password
    +py4web run apps
    +
    +
    +

    If the command py4web is not accepted, it means it’s not in the system’s +path. On Windows, a special py4web.exe file (pointing to py4web.py) will +be created by pip on the system’s path, but not if you type the +–user option by mistake, then you can run the needed commands like this

    +
    python3 py4web.py setup apps
    +python3 py4web.py set_password
    +python3 py4web.py run apps
    +
    +
    +
    +
    +

    Instalação de fonte (globalmente)

    +

    This is the traditional way for installing a program, but it works only +on Linux and MacOS (Windows does not normally support the make utility). +All the requirements will be installed on the +system’s path along with links to the py4web.py program on the local +folder

    +
    git clone https://github.com/web2py/py4web.git
    +cd py4web
    +make assets
    +make test
    +make install
    +py4web setup apps
    +py4web set_password
    +py4web run apps
    +
    +
    +

    Also notice that when installing in this way the content of +py4web/assets folder is missing at first but it is manually created +later with the make assets command.

    +

    Notice that you also (and should) install py4web from source inside a virtual environment.

    +
    +
    +

    Instalando a partir de fonte (localmente)

    +

    In this way all the requirements will be installed or upgraded on the +system’s path, but py4web itself will only be copied +on a local folder. This is especially useful if you already have a +working py4web installation but you want to test a different +one. Also, installing from sources (locally or globally) will +install all the latest changes present on the master branch of py4web - hence +you will gain the latest (but potentially untested) code.

    +

    From the command line, go to a given working folder and then run

    +
    git clone https://github.com/web2py/py4web.git
    +cd py4web
    +python3 -m pip install  --upgrade -r requirements.txt
    +
    +
    +

    Once installed, you should always start it from there with:

    +
    +
    ./py4web.py setup apps
    +./py4web.py set_password
    +./py4web.py run apps
    +
    +
    +

    If you have installed py4web both globally and locally, notice the +./ ; it forces the run of the local folder’s py4web and not the +globally installed one.

    +
    +
    +
    +

    Instalando a partir de binários

    +

    This is not a real installation, because you just copy a bunch of files +on your system without modifying it anyhow. Hence this is the simplest +solution, especially for beginners or students, because it does not +require Python pre-installed on your system nor administrative rights. +On the other hand, it’s experimental, it could contain an old py4web +release, DAL support is limited and it is quite difficult to add other functionalities to it.

    +

    A fim de usá-lo você só precisa fazer o download do arquivo mais recente do Windows ou MacOS zip do este repositório externo <https://github.com/nicozanf/py4web-pyinstaller> __. Descompacte-o em uma pasta local e abrir uma linha de comando lá. finalmente executar

    +
    ./py4web set_password
    +./py4web run apps
    +
    +
    +

    (omit “./” if you’re using Windows).

    +

    Notice: the binaries many not correspond to the latest master +or the latest stable branch of py4web although we do our best to +keep them up to date.

    +
    +
    +
    +

    Melhoramento

    +

    Se você instalou py4web de pip você pode simples atualizá-lo com

    +
    python3 -m pip install --upgrade py4web
    +
    +
    +
    +

    Aviso

    +

    Isto não irá atualizar automaticamente os aplicativos padrão, como o Dashboard ** ** e padrão ** **. Você tem que remover manualmente esses aplicativos e execute

    +
    py4web setup <path to apps_folder>
    +
    +
    +

    a fim de re-instalá-los. Esta é uma precaução de segurança, no caso de você fez alterações para esses aplicativos.

    +
    +

    If you installed py4web in any other way, you must upgrade it manually. +First you have to make a backup of any personal py4web work you’ve done, +then delete the old installation folder and re-install the framework +again.

    +
    +
    +

    Primeira corrida

    +

    Correndo py4web utilizando qualquer um procedimento anterior deve produzir uma saída como esta:

    +_images/first_run.png +

    Generally apps is the name of the folder where you keep all your +apps, and can be explicitly set wit the run command. +(Yet nothing prevents you from grouping apps in multiple folders with +different names.) If that +folder does not exist, it is created. PY4WEB expects to find at least +two apps in this folder: Dashboard (_dashboard) and Default +(_default). If it does not find them, it installs them.

    +

    ** Painel ** é um baseado na web IDE. Ele será descrito no próximo capítulo.

    +

    ** Padrão ** é um aplicativo que não faz nada diferente de boas-vindas ao usuário.

    +
    +

    Nota

    +

    Alguns aplicativos - como o Dashboard ** ** e padrão ** ** - têm um papel especial na py4web e, portanto, seus começos nome real com `` _`` para evitar conflitos com aplicativos criados por você.

    +
    +

    Once py4web is running you can access a specific app at the following +urls from the local machine:

    +
    http://localhost:8000
    +http://localhost:8000/_dashboard
    +http://localhost:8000/{yourappname}/index
    +
    +
    +

    A fim de py4web stop, você precisa acertar: kbd: Control-C na janela onde você executá-lo.

    +
    +

    Nota

    +

    Somente o padrão ** ** aplicativo é especial porque se não exige que o “{AppName} /” prefixo no caminho, como todos os outros aplicativos fazer. Em geral, você pode querer ligar simbolicamente `` apps / _default`` ao seu aplicativo padrão.

    +
    +

    For all apps the trailing /index is also optional.

    +
    +

    Aviso

    +

    For Windows: it could be that Ctrl-C does not work in order to stop py4web. +In this case, try with Ctrl-Break or Ctrl-Fn-Pause.

    +
    +
    +
    +

    Opções de linha de comando

    +

    py4web fornece várias opções de linha de comando que podem ser listados por executá-lo sem qualquer argumento

    +
    # py4web
    +
    +
    +_images/command.png +

    Você pode ter ajuda adicional para uma opção de linha de comando específico, executando-o com o ** - ajuda ** ou ** - h ** argumento.

    +
    +

    Opção `` comando call``

    +
    # py4web call -h
    +Usage: py4web.py call [OPTIONS] APPS_FOLDER FUNC
    +
    +  Call a function inside apps_folder
    +
    +Options:
    +  -Y, --yes          No prompt, assume yes to questions  [default: False]
    +  --args TEXT        Arguments passed to the program/function  [default: {}]
    +  -help, -h, --help  Show this message and exit.
    +
    +
    +

    For example:

    +
    # py4web call apps examples.test.myfunction --args '{"x": 100}'
    +
    +
    +

    where myfunction is the function you want to call in apps/examples/test.py. Note +that you have to use the single and double quotes just as shown for parameters to +work.

    +
    +
    +

    Opção `` comando new_app``

    +
    # py4web new_app -h
    +Usage: py4web.py new_app [OPTIONS] APPS_FOLDER APP_NAME
    +
    +  Create a new app copying the scaffolding one
    +
    +Options:
    +  -Y, --yes                No prompt, assume yes to questions  [default:
    +                           False]
    +
    +  -s, --scaffold_zip TEXT  Path to the zip with the scaffolding app
    +  -help, -h, --help        Show this message and exit.
    +
    +
    +

    Presentemente, dá um erro em instalações binários e de instalação de origem (no local), porque eles perdem o arquivo zip de ativos.

    +
    +
    +

    Opção `` comando run``

    +
    # py4web run -h
    +Usage: py4web.py run [OPTIONS] APPS_FOLDER
    +
    +  Run the applications on apps_folder
    +
    +Options:
    +   -Y, --yes                       No prompt, assume yes to questions
    +   -H, --host TEXT                 Host listening IP  [default: 127.0.0.1]
    +   -P, --port INTEGER              Port number  [default: 8000]
    +   -A, --app_names TEXT            List of apps to run, comma separated (all if
    +                                    omitted or empty)
    +   -p, --password_file TEXT        File for the encrypted password  [default:
    +                                    password.txt]
    +   -Q, --quiet                     Suppress server output
    +   -R, --routes                    Write apps routes to file
    +   -s, --server [default|wsgiref|tornado|wsgiref+threaded|rocket|waitress|gunicorn|gevent|gunicorn+gevent|gevent+websockets]
    +                                    Web server to use (unavailable: waitress,
    +                                    gunicorn, gevent, gunicorn+gevent,
    +                                    gevent+websockets)
    +   -w, --number_workers INTEGER    Number of workers  [default: 0]
    +   -d, --dashboard_mode TEXT       Dashboard mode: demo, readonly, full, none
    +                                    [default: full]
    +   --watch [off|sync|lazy]         Watch python changes and reload apps
    +                                    automatically, modes: off, sync, lazy
    +                                    [default: lazy]
    +   --ssl_cert PATH                 SSL certificate file for HTTPS
    +   --ssl_key PATH                  SSL key file for HTTPS
    +   --errorlog TEXT                 Where to send error logs
    +                                    (:stdout|:stderr|tickets_only|{filename})
    +                                    [default: :stderr]
    +   -L, --logging_level INTEGER     The log level (0 - 50) [default: 30
    +                                    (=WARNING)]
    +   -D, --debug                     Debug switch
    +   -U, --url_prefix TEXT           Prefix to add to all URLs in and out
    +   -m, --mode TEXT                 default or development  [default: default]
    +   -help, -h, --help               Show this message and exit.
    +
    +
    +

    The app_names option lets you filter which specific apps you want to serve (comma separated). If absent or empty +all the apps in the APPS_FOLDER will be run.

    +

    By default (for security reasons) the py4web framework will listen only on 127.0.0.1, i.e. localhost. +If you need to reach it from other machines you must specify the host option, +like py4web run --host 0.0.0.0 apps.

    +

    The url_prefix option is useful for routing at the py4web level. It allows mapping to multiple versions of py4web +running on different ports as long as the url_prefix and port match the location. For example +py4web run --url_prefix=/abracadabra --port 8000 apps.

    +

    By default py4web will automatically reload an application upon any changes to the python files of that application. +The reloading will occur on any first incoming request to the application that has +been changed (lazy-mode). If you prefer an immediate reloading (sync-mode), use +py4web run --watch sync. For production servers, it’s better to use py4web run --watch off in order +to avoid unneded checks (but you will need to restart py4web for activating any change).

    +
    +

    Nota

    +

    The --watch directive looks for any changes occurring to the python files under the +/apps folder only. Any modifications to the standard py4web programs will always require a full +restart of the framework.

    +
    +

    The default web server used is currently rocketServer, but you can change this behaviour with the server option. +Rocket3 is the multi-threaded web server used by web2py stripped of all the +Python2 logic and dependencies.

    +

    The logging_level values are defined in the logging standard python module. The default value is 30 (it corresponds +to WARNING). Other common values are 0 (NOTSET), 10 (DEBUG), 20 (INFO), 40 (ERROR) and 50 (CRITICAL). +Using them, you’re telling the library you want to handle all events from that level on up.

    +

    The debug parameter automatically sets logging_level to 0 and logs all calls to fixture functions. It also logs when +a session is found, invalid, saved.

    +
    +
    +

    Opção `` comando set_password``

    +
    # py4web set_password -h
    +Usage: py4web.py set_password [OPTIONS]
    +
    +  Set administrator's password for the Dashboard
    +
    +Options:
    +  --password TEXT           Password value (asked if missing)
    +  -p, --password_file TEXT  File for the encrypted password  [default:
    +                            password.txt]
    +
    +  -h, -help, --help         Show this message and exit.
    +
    +
    +

    Se o `` –dashboard_mode`` não é `` demo`` ou `` None``, cada vez py4web é iniciado, ele pede uma senha de uso único para você acessar o painel. Isso é chato. Você pode evitá-lo, armazenando uma senha pdkdf2 hash em um arquivo (por padrão chamado password.txt) com o comando

    +
    py4web set_password
    +
    +
    +

    Não vou pedir de novo a menos que o arquivo é excluído. Você também pode usar um nome de arquivo personalizado com

    +
    py4web set_password my_password_file.txt
    +
    +
    +

    e depois pedir py4web para reutilização essa senha em tempo de execução com

    +
    py4web run -p my_password_file.txt apps
    +
    +
    +

    Finalmente, você pode criar manualmente o mesmo arquivo com:

    +
    python3 -c "from pydal.validators import CRYPT; open('password.txt','w').write(str(CRYPT()(input('password:'))[0]))"
    +password: *****
    +
    +
    +
    +
    +

    Opção `` comando setup``

    +
    # py4web setup -h
    +Usage: py4web.py setup [OPTIONS] APPS_FOLDER
    +
    +  Setup new apps folder or reinstall it
    +
    +Options:
    +  -Y, --yes          No prompt, assume yes to questions  [default: False]
    +  -help, -h, --help  Show this message and exit.
    +
    +
    +

    Esta opção criar uma nova pasta Aplicativos (ou reinstalá-lo). Se necessário, ele irá pedir a confirmação da criação da nova pasta e, em seguida, para copiar todos os aplicativos py4web padrão da pasta de ativos. Atualmente, não faz nada em instalações binários e de instalação de origem (localmente) - para eles você pode copiar manualmente a pasta de aplicações existentes para o novo.

    +
    +
    +

    Opção `` comando shell``

    +
    # py4web shell -h
    +Usage: py4web.py shell [OPTIONS] APPS_FOLDER
    +
    +  Open a python shell with apps_folder's parent added to the path
    +
    +Options:
    +  -Y, --yes          No prompt, assume yes to questions  [default: False]
    +  -h, -help, --help  Show this message and exit.
    +
    +
    +

    O shell de Py4web é apenas o shell python regular com aplicativos adicionados ao caminho de pesquisa. Note que o shell é para todos os aplicativos, não um único. Você pode então importar os módulos necessários a partir dos aplicativos que você precisa para acessar.

    +

    Por exemplo, dentro de uma concha que puder

    +
    from apps.myapp import db
    +from py4web import Session, Cache, Translator, DAL, Field
    +from py4web.utils.auth import Auth
    +
    +
    +
    +
    +

    Opção `` comando version``

    +
    # py4web version -h
    +Usage: py4web.py version [OPTIONS]
    +
    +  Show versions and exit
    +
    +Options:
    +  -a, --all          List version of all modules
    +  -h, -help, --help  Show this message and exit.
    +
    +
    +

    With the -all option you’ll get the version of all the available python +modules, too.

    +
    +
    +
    +

    Special installations

    +

    There are special cases in which you cannot or don’t want to use one of the generic installation +instructions we’ve already described. There is a special folder called deployment_tools in +the py4web repository that collects some special recipes. They are briefly described here, along +with some tips and tricks.

    +
    +

    HTTPS

    +

    To use https with the build-in web server (Rocket3) these are the steps:

    + +

    If you use VSCode to run py4web you may want to update the py4web launch.json file to contain:

    +
    "configurations": [
    +        {
    +            "name": "py4web",
    +            "type": "debugpy",
    +            "request": "launch",
    +            "module": "py4web",
    +            // or "program": "${workspaceFolder}/py4web.py", if you didn't install py4web as a package
    +            "args": [
    +                "run",
    +                "apps",
    +                "--ssl_cert", "/path_to/localhost.crt",
    +                "--ssl_key", "/path_to/localhost.key",
    +                "--server", "rocketServer",
    +            ]
    +        }
    +    ]
    +
    +
    +

    Notice that /path_to/ should be the absolute path to the location of your certificate.

    +
    +
    +

    WSGI

    +

    py4web is a standard WSGI application. So, if a full program installation it’s not +feasible you can simply run py4web as a WSGI app. For example, using gunicorn-cli, +create a python file:

    +
    # py4web_wsgi.py
    +from py4web.core import wsgi
    +application = wsgi(apps_folder="apps")
    +
    +
    +

    and then start the application using cli:

    +
    gunicorn -w 4 py4web_wsgi:application
    +
    +
    +

    The wsgi function takes arguments with the same name as the command line arguments.

    +
    +
    +

    Deployment on GCloud (aka GAE - Google App Engine)

    +

    Login into the Gcloud console and +create a new project. You will obtain a project id that looks like +“{project_name}-{number}”.

    +

    Em seu sistema de arquivos local fazer uma nova pasta de trabalho e cd para ele:

    +
    mkdir gae
    +cd gae
    +
    +
    +

    Copie os arquivos de exemplo de py4web (supondo que você tem a fonte de github)

    +
    cp /path/to/py4web/development_tools/gcloud/* ./
    +
    +
    +

    Copiar ou ligar simbolicamente o seu `` apps`` pasta para a pasta gae, ou talvez fazer novos aplicativos pasta que contém um `` __init vazio __. Py`` e ligar simbolicamente os aplicativos individuais que você deseja implantar. Você deve ver os seguintes arquivos / pastas:

    +
    Makefile
    +apps
    +  __init__.py
    +  ... your apps ...
    +lib
    +app.yaml
    +main.py
    +
    +
    +

    Instale o Google SDK, py4web e configure a pasta de trabalho:

    +
    make install-gcloud-linux
    +make setup
    +gcloud config set {your email}
    +gcloud config set {project id}
    +
    +
    +

    (Substitua {seu email} sua conta do Google e-mail e {id projeto} com o ID de projeto obtida de Google).

    +

    Agora cada vez que você deseja implantar seus aplicativos, basta fazer:

    +
    make deploy
    +
    +
    +

    Você pode querer personalizar o Makefile e app.yaml para atender às suas necessidades. Você não deve precisar editar `` main.py``.

    +
    +
    +

    Implantação em PythonAnywhere.com

    +

    Watch the YouTube video and follow the detailed +tutorial +. The bottle_app.py script is in +py4web/deployment_tools/pythonanywhere.com/bottle_app.py

    +
    +
    +

    Deployment on Docker/Podman

    +

    On deployment_tools/docker there is a simple Dockerfile for quickly running a py4web container. There is also +a docker-compose.yml file for setting up a more complex multi-container with PostgreSQL. +A ready docker example based on the Scaffold application can be cloned from this repository <https://github.com/macneiln/docker-py4web-scaffold>

    +

    Note that you can use them also with Podman, which has the advantage of does not requiring sudo and does not +running any background daemon.

    +
    +
    +

    Deployment on Ubuntu

    +

    On deployment_tools/ubuntu there is a bash script tested with Ubuntu Server 20.04.03 LTS. It uses nginx and self-signed +certificates. It optionally manage iptables, too.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-04.html b/apps/_documentation/static/pt/chapter-04.html new file mode 100644 index 000000000..4a68d073e --- /dev/null +++ b/apps/_documentation/static/pt/chapter-04.html @@ -0,0 +1,243 @@ + + + + + + + + + O Dashboard — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    O Dashboard

    +

    The Dashboard is the standard web based IDE; you will surely use it +extensively to manage the applications and check your databases. +Looking at its interface is a good way to start exploring py4web and +its components.

    +
    +

    A página Web principal

    +

    When you run the standard py4web program, it starts a web server with a +main web page listening on http://127.0.0.1:8000 (which means that it is +listening on the TCP port 8000 on your local PC, using the HTTP protocol).

    +

    You can connect to this main page only from your local PC, using a web +browser like Firefox or Google Chrome:

    +_images/main_page.png +

    Os botões são:

    + +
    +
    +

    Sessão no Dashboard

    +

    Pressionando o botão do painel irá transmitir-lhe para o login Dashboard. Aqui você deve inserir a senha que você já setup (veja: ref: option comando set_password). Se você não se lembre da senha, você tem que parar o programa com CTRL-C, configurar um novo e execute o py4web novamente.

    +_images/dashboard_login.png +

    Depois de inserir a senha do painel direito, será exibido com todas as abas comprimido.

    +_images/dashboard.png +

    Clique no título de um guia para expandir. As guias são dependentes do contexto. Por exemplo, aba aberta “Instalado Aplicativos” e clique em um aplicativo instalado para selecioná-lo.

    +

    Isto irá criar novas guias “Rotas”, “Arquivos” e “Modelo” para o aplicativo selecionado.

    +_images/dashboard_main.png +

    The “Files” tab allows you to browse the folder that contains the +selected app and edit any file that comprises the app. If you edit a +file by default it will be automatically reloaded at its first usage +(unless you’ve changed the watch option with the Opção `` comando run``; +in this case you must click on “Reload Apps” under the “Installed Applications” +tab for the change to take effect). +If an app fails to load, its corresponding button is displayed in red. +Click on it to see the corresponding error.

    +_images/dashboard_edit.png +

    O painel expõe o db de todas as aplicações que utilizam RESTAPI pydal. Ele também fornece uma interface web para realizar operações de busca e CRUD.

    +_images/dashboard_restapi.png +

    Se um usuário visita um aplicativo e desencadeia um erro, o usuário é emitido um bilhete.

    +_images/dashboard_error.png +

    O bilhete é registrado no banco de dados py4web. O painel exibe as edições recentes mais comuns e permite pesquisar bilhetes.

    +_images/dashboard_ticket.png +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-05.html b/apps/_documentation/static/pt/chapter-05.html new file mode 100644 index 000000000..e330b5f87 --- /dev/null +++ b/apps/_documentation/static/pt/chapter-05.html @@ -0,0 +1,612 @@ + + + + + + + + + Creating an app — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Creating an app

    +
    +

    Do princípio

    +

    Apps can be created using the dashboard or directly from the filesystem. +Here, we are going to do it manually, as the Dashboard is already described in +its own chapter.

    +

    Keep in mind that an app is a Python module; therefore it needs only a +folder and a __init__.py file in that folder.

    +
    +

    Nota

    +

    An empty __init__.py file is not strictly needed since +Python 3.3, but it will be useful later on.

    +
    +

    Open a command prompt and go to your main py4web folder. Enter the following +simple commands in order to create a new empty myapp app:

    +
    mkdir apps/myapp
    +echo '' > apps/myapp/__init__.py
    +
    +
    +
    +

    Dica

    +

    for Windows, you must use backslashes (i.e. \) instead of +slashes.

    +
    +

    If you now restart py4web or +press the “Reload Apps” in the Dashboard, py4web will find this module, +import it, and recognize it as an app, simply because of its location. +By default py4web runs in lazy watch mode (see the Opção `` comando run``) +for automatic reloading of the apps whenever it changes, which is very useful +in a development environment. +In production or debugging environment, it’s better to run py4web with a command like this:

    +
    py4web run apps --watch off
    +
    +
    +

    A py4web app is not required to do anything. It could just be a container for +static files or arbitrary code that other apps may want to import and +access. Yet typically most apps are designed to expose static or dynamic +web pages.

    +
    +
    +

    Páginas estáticas

    +

    Para expor páginas estáticas você simplesmente precisa para criar um `` subpasta static`` e qualquer arquivo lá será automaticamente publicado:

    +
    mkdir apps/myapp/static
    +echo 'Hello World' > apps/myapp/static/hello.txt
    +
    +
    +

    O arquivo recém-criado será acessível em

    +
    http://localhost:8000/myapp/static/hello.txt
    +
    +
    +

    Note que `` static`` é um caminho especial para py4web e arquivos somente sob o `` static`` pasta são servidos.

    +
    +

    Importante

    +

    Internally py4web uses the +ombott (One More BOTTle) web server, +which is a minimal and fast bottlepy spin-off. +It supports streaming, partial content, range requests, +and if-modified-since. This is all +handled automatically based on the HTTP request headers.

    +
    +
    +
    +

    Páginas web dinâmicas

    +

    Para criar uma página dinâmica, você deve criar uma função que retorna o conteúdo da página. . Por exemplo editar a `` novaaplicacao / __ __ Init py`` como se segue:

    +
    import datetime
    +from py4web import action
    +
    +@action('index')
    +def page():
    +    return "hello, now is %s" % datetime.datetime.now()
    +
    +
    +

    Reload the app, and this page will be accessible at

    +
    http://localhost:8000/myapp/index
    +
    +
    +

    ou

    +
    http://localhost:8000/myapp
    +
    +
    +

    (Note que o índice é opcional)

    +

    Ao contrário de outras estruturas, nós não importar ou iniciar o servidor web dentro do `` código myapp``. Isso ocorre porque py4web já está em execução, e pode servir vários aplicativos. py4web importa nossas funções de código e expõe decorados com `` @Action () . Note também que prepends py4web `` / myapp (ou seja, o nome do aplicativo) para o caminho url declarado na ação. Isso ocorre porque existem vários aplicativos, e eles podem definir rotas conflitantes. Antecedendo o nome do aplicativo remove a ambiguidade. Mas há uma exceção: se você chamar seu aplicativo `` _default``, ou se você criar um link simbólico do `` _default`` para `` myapp``, então py4web não irá anteceder qualquer prefixo para as rotas definidas dentro do aplicativo .

    +
    +

    Em valores de retorno

    +

    py4web actions should return a string or a dictionary. If they return a +dictionary you must tell py4web what to do with it. By default py4web +will serialize it into json. For example edit __init__.py again and +add at the end

    +
    @action('colors')
    +def colors():
    +    return {'colors': ['red', 'blue', 'green']}
    +
    +
    +

    Esta página será visível na

    +
    http://localhost:8000/myapp/colors
    +
    +
    +

    e retorna um objeto JSON `` { «cores»: [ «vermelho», «azul», «verde»]} ``. Observe que escolhemos nomear a função o mesmo que a rota. Isso não é necessário, mas é uma convenção que muitas vezes se seguirão.

    +

    Você pode usar qualquer linguagem de modelo para transformar seus dados em uma string. PY4WEB vem com yatl, um capítulo inteiro será dedicado mais tarde e iremos fornecer um exemplo em breve.

    +
    +
    +

    Rotas

    +

    É possível mapear padrões do URL em argumentos da função. Por exemplo:

    +
    @action('color/<name>')
    +def color(name):
    +    if name in ['red', 'blue', 'green']:
    +        return 'You picked color %s' % name
    +    return 'Unknown color %s' % name
    +
    +
    +

    Esta página será visível na

    +
    http://localhost:8000/myapp/color/red
    +
    +
    +

    A sintaxe dos padrões é o mesmo que os rotas Garrafa <https://bottlepy.org/docs/dev/tutorial.html#request-routing> __. Uma rota WildCard pode ser definida como

    +
      +
    • `` <Name> `` ou

    • +
    • `` <Name: filter> `` ou

    • +
    • <name:filter:config>

    • +
    +

    And these are possible filters (only :re has a config):

    +
      +
    • : Resultados int dígitos (assinatura) e converte o valor de número inteiro.

    • +
    • : Float semelhante a: int mas para números decimais.

    • +
    • : Path corresponde a todos os personagens, incluindo o caractere de barra de uma forma não-ganancioso, e pode ser usado para combinar mais de um segmento de caminho.

    • +
    • :re[:exp] allows you to specify a custom regular expression in +the config field. The matched value is not modified.

    • +
    +

    O padrão de harmonização o carácter universal é passado para a função sob a variável especificada `` name``.

    +

    Note that the routing is implemented in ombott as radix-tree hybrid +router. It is declaration-order-independent and it prioritizes static +route-fragment over dynamic one, since this is most expected behavior.

    +

    This results in some constraints, such as one cannot have more than one +route that has dynamic fragment of different types (int, path) in the +same place.. Hence something like this is incorrect and will result +in errors:

    +
    @action('color/<code:int>')
    +def color(code):
    +    return f'Color code: {code}'
    +
    +@action('color/<name:path>')
    +def color(name):
    +    return f'Color name: {name}'
    +
    +
    +

    Instead, to accomplish a simmilar result, one needs to handle all the +logic in one action:

    +
    @action('color/<color_identifier:path>')
    +def color(color_identifier):
    +   try:
    +      msg = f'Color code: {int(color_identifier)}'
    +   except:
    +      msg = f'Color name: {color_identifier}'
    +   return msg
    +
    +
    +

    Além disso, o decorador acção tem um argumento `` method`` opcional que pode ser um método HTTP ou uma lista de métodos:

    +
    @action('index', method=['GET','POST','DELETE'])
    +
    +
    +

    Você pode usar vários decoradores para expor a mesma função em várias rotas.

    +
    +
    +

    O objeto `` request``

    +

    De py4web você pode importar `` request``

    +
    from py4web import request
    +
    +@action('paint')
    +def paint():
    +    if 'color' in request.query:
    +       return 'Painting in %s' % request.query.get('color')
    +    return 'You did not specify a color'
    +
    +
    +

    Esta ação pode ser acessado em:

    +
    http://localhost:8000/myapp/paint?color=red
    +
    +
    +

    Notice that the request object is equivalent to a Bottle request object. +with one additional attribute:

    +
    request.app_name
    +
    +
    +

    Which you can use the code to identify the name and the folder used for the app.

    +
    +
    +

    Modelos

    +

    Para utilizar um yatl modelo que você deve declará-lo. Por exemplo, criar um arquivo `` apps / myapp / templates / paint.html`` que contém:

    +
    <html>
    + <head>
    +    <style>
    +      body {background:[[=color]]}
    +    </style>
    + </head>
    + <body>
    +    <h1>Color [[=color]]</h1>
    + </body>
    +</html>
    +
    +
    +

    em seguida, modificar a ação de tinta para usar o modelo e padrão para verde.

    +
    @action('paint')
    +@action.uses('paint.html')
    +def paint():
    +    return dict(color = request.query.get('color', 'green'))
    +
    +
    +

    A página irá agora mostrar o nome da cor em um fundo da cor correspondente.

    +

    O ingrediente chave aqui é o decorador `` @ action.uses (…) . Os argumentos de `` action.uses são chamados luminárias ** **. Você pode especificar vários dispositivos elétricos em um decorador ou você pode ter vários decoradores. Chaves são objectos que modificam o comportamento da acção, que podem precisar de ser inicializado por pedido, que podem realizar uma filtragem de entrada e de saída da acção, e que pode depender de cada-outro (eles são semelhantes no seu âmbito à garrafa encaixes, mas eles são declarados por ação, e eles têm uma árvore de dependência que será explicado mais tarde).

    +

    O tipo mais simples de acessório é um modelo. Você especifica que simplesmente dando o nome do arquivo a ser usado como modelo. Esse arquivo deve seguir a sintaxe yatl e deve estar localizado no diretório `` templates`` pasta do aplicativo. O objeto retornado pela ação serão processados ​​pelo modelo e se transformou em uma corda.

    +

    Você pode facilmente definir luminárias para outras linguagens de modelo. Isto é descrito mais tarde.

    +

    Alguns built-in luminárias são:

    +
      +
    • o objeto DAL (que diz py4web para obter uma conexão de banco de dados a partir da piscina a cada pedido, e comprometer-se em caso de sucesso ou reversão em caso de falha)

    • +
    • o objeto de sessão (que diz py4web para analisar o cookie e recuperar uma sessão a cada pedido, e para salvá-lo, se alterado)

    • +
    • o objeto Tradutor (que diz py4web para processar o cabeçalho Accept-Language e determinar óptima internacionalização / pluralização regras)

    • +
    • o objeto Auth (que diz py4web que as necessidades de aplicativos acessar às informações do usuário)

    • +
    +

    Eles podem depender um do outro. Por exemplo, a sessão pode precisar a DAL (ligação de base de dados), e Auth podem precisamos de ambos. As dependências são tratados automaticamente.

    +
    +
    +
    +

    The _scaffold app

    +

    Most of the times, you do not want to start writing code from scratch. +You also want to follow some sane conventions outlined here, like not +putting all your code into __init__.py. PY4WEB provides a +Scaffolding (_scaffold) app, where files are organized properly and many +useful objects are pre-defined. Also, it shows you how to manage users and +their registration. +Just like a real scaffolding in a building construction site, scaffolding +could give you some kind of a fast and simplified structure for your project, +on which you can rely to build your real project.

    +_images/_scaffold.png +

    Normalmente você vai encontrar o aplicativo andaime sob apps, mas você pode facilmente criar um novo clone de la manualmente ou usando o Dashboard.

    +

    Aqui está a estrutura da árvore do `` aplicativo _scaffold``:

    +_images/scaffold_tree.png +

    O aplicativo andaime contém um exemplo de uma ação mais complexa:

    +
    from py4web import action, request, response, abort, redirect, URL
    +from yatl.helpers import A
    +from . common import db, session, T, cache, auth
    +
    +
    +@action('welcome', method='GET')
    +@action.uses('generic.html', session, db, T, auth.user)
    +def index():
    +    user = auth.get_user()
    +    message = T('Hello {first_name}'.format(**user))
    +    return dict(message=message, user=user)
    +
    +
    +

    Observe o seguinte:

    +
      +
    • request, response, abort are defined by ombott.

    • +
    • redirect and URL are similar to their web2py counterparts.

    • +
    • helpers (A, DIV, SPAN, IMG, etc) must be imported +from yatl.helpers . They work pretty much as in web2py.

    • +
    • `` Db``, `` session``, `` T``, `` cache``, `` auth`` são Chaves. Eles devem ser definidos em `` common.py``.

    • +
    • `` @ Action.uses (auth.user) `` indica que esta acção espera um válido logado recuperáveis ​​usuário por `` auth.get_user () . Se isso não for o caso, esta ação redireciona para a página de login (definido também em `` common.py e usando o componente auth.html Vue.js).

    • +
    +

    Quando você começar a partir de andaime, você pode querer editar `` settings.py``, `` templates``, `` models.py`` e `` controllers.py`` mas provavelmente você não precisa mudar nada no `` common.py``.

    +

    Em seu HTML, você pode usar qualquer biblioteca JS que você quer, porque py4web é agnóstica para a sua escolha de JS e CSS, mas com algumas exceções. O `` auth.html`` que lida com registro / login / etc. usa um componente vue.js. Portanto, se você quiser usar isso, você não deve removê-lo.

    +
    +
    +

    Copying the _scaffold app

    +

    The scaffold app is really useful, and you will surely use it a lot as +a starting point for testing and even developing full features new apps.

    +

    It’s better not to work directly on it: always create new apps copying it. +You can do it in two ways:

    +
      +
    • using the command line: copy the whole apps/_scaffold folder to another one +(apps/my_app for example). Then reload py4web and it will be automatically loaded.

    • +
    • using the Dashboard: select the button Create/Upload App under the «Installed +Applications» upper section. Just give the new app a name and check that «Scaffold» +is selected as the source. +Finally press the Create button and the dashboard will be automatically reloaded, +along with the new app.

      +_images/dashboard_new_app.png +
    • +
    +
    +
    +

    Watch for files change

    +

    As described in the Opção `` comando run``, Py4web facilitates a +development server’s setup by automatically reloads an app when its +Python source files change (by default). +But in fact any other files inside an app can be watched by setting a +handler function using the @app_watch_handler decorator.

    +

    Two examples of this usage are reported now. Do not worry if you don’t +fully understand them: the key point here is that even non-python code +could be reloaded automatically if you explicit it with the +@app_watch_handler decorator.

    +

    Assista SASS arquivos e compilá-los quando editado:

    +
    from py4web.core import app_watch_handler
    +import sass # https://github.com/sass/libsass-python
    +
    +@app_watch_handler(
    +    ["static_dev/sass/all.sass",
    +     "static_dev/sass/main.sass",
    +     "static_dev/sass/overrides.sass"])
    +def sass_compile(changed_files):
    +    print(changed_files) # for info, files that changed, from a list of watched files above
    +    ## ...
    +    compiled_css = sass.compile(filename=filep, include_paths=includes, output_style="compressed")
    +    dest = os.path.join(app, "static/css/all.css")
    +    with open(dest, "w") as file:
    +        file.write(compiled)
    +
    +
    +

    Validar sintaxe javascript quando editado:

    +
    import esprima # Python implementation of Esprima from Node.js
    +
    +@app_watch_handler(
    +    ["static/js/index.js",
    +     "static/js/utils.js",
    +     "static/js/dbadmin.js"])
    +def validate_js(changed_files):
    +    for cf in changed_files:
    +        print("JS syntax validation: ", cf)
    +        with open(os.path.abspath(cf)) as code:
    +            esprima.parseModule(code.read())
    +
    +
    +

    Filepaths passed to @app_watch_handler decorator must be +relative to an app. Python files (i.e. «*.py») in a list passed to the +decorator are ignored since they are watched by default. Handler +function’s parameter is a list of filepaths that were changed. All +exceptions inside handlers are printed in terminal.

    +
    +
    +

    Domain-mapped apps

    +

    In production environments it is often required to have several apps being +served by a single py4web server, where different apps are mapped to +different domains.

    +

    py4web can easily handle running multiple apps, but there is no build-in +mechanism for mapping domains to specific applications. Such mapping needs +to be done externally to py4web – for instance using a web reverse-proxy, +such as nginx.

    +

    While nginx or other reverse-proxies are also useful in production +environments for handling SSL termination, caching and other uses, +we cover only the mapping of domains to py4web applications here.

    +

    An example nginx configuration for an application myapp mapped to +a domain myapp.example.com might look like that:

    +
    server {
    +   listen 80;
    +   server_name myapp.example.com;
    +   proxy_http_version 1.1;
    +   proxy_set_header Host $host;
    +   proxy_set_header X-PY4WEB-APPNAME /myapp;
    +   location / {
    +      proxy_pass http://127.0.0.1:8000/myapp$request_uri;
    +   }
    +}
    +
    +
    +

    This is an example server block of nginx configuration. One would have to create +a separate such block for each app/each domain being served by py4web server. Note some important aspects:

    +
      +
    • server_name defines the domain mapped to the app myapp,

    • +
    • +
      proxy_http_version 1.1; directive is optional, but highly recommended (otherwise nginx uses HTTP 1.0 to talk

      to the backend-server – here py4web – and it creates all kinds of issues with buffering and otherwise),

      +
      +
      +
    • +
    • proxy_set_header Host $host; directive ensures that the correct Host is passed to py4web – here myapp.example.com

    • +
    • +
      proxy_set_header X-PY4WEB-APPNAME /myapp; directive ensures that py4web (and ombott) knows which app to serve

      and also that this application is domain-mapped – pay specific attention to the slash (/) in front of the myapp +name – it is required to ensure correct parsing of URLs on ombott level,

      +
      +
      +
    • +
    • +
      finally proxy_pass http://127.0.0.1:8000/myapp$request_uri; ensures that the request is passed in its integrity ($request_uri)

      to py4web server (here: 127.0.0.1:8000) and the correct app (/myapp).

      +
      +
      +
    • +
    +

    Such configuration ensures that all URL manipulation inside ombott and py4web - especially in modules such as Auth, Form, +and Grid are done correctly using the domain to which the app is mapped to.

    +
    +
    +

    Custom error pages

    +

    py4web provides default error pages. For instance, if none of the routes +in an app matches the request, a default 404 error page will be shown. By +default all HTTP error codes are handled automatically by py4web.

    +

    It is however possible to override this behaviour. It can be done either +per HTTP error code, or even for all errors.

    +

    Here is an example for overriding HTTP code 404 (not found):

    +
    from py4web.core import ERROR_PAGES
    +ERROR_PAGES[404] = f"Page not found!"
    +
    +
    +

    If one wants to replace _all_ default error pages, a special qualifier +"*" should be used. Also, the returned value may contain HTML code as +well:

    +
    from py4web import URL
    +from py4web.core import ERROR_PAGES
    +from yatl.helpers import A
    +
    +ERROR_PAGES["*"] = f"We have encountered an error! (try: {A('Main Page', _href=URL("/",scheme=True))})"
    +
    +
    +

    Note that this setup is global. This means that it is defined once +for all apps on a given py4web instance. This is because, when an error +is encountered, it could be because the request has not matched any of +the apps. Hence, this configuration should only be done in one of the +apps.

    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-06.html b/apps/_documentation/static/pt/chapter-06.html new file mode 100644 index 000000000..5b471589a --- /dev/null +++ b/apps/_documentation/static/pt/chapter-06.html @@ -0,0 +1,1169 @@ + + + + + + + + + Fixures — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Fixures

    +

    Um fixture é definido como “uma peça de equipamento ou de mobiliário, que é fixa em posição num edifício ou veículo”. No nosso caso, um dispositivo elétrico é algo ligado à ação que processa um pedido HTTP, a fim de produzir uma resposta.

    +

    When processing any HTTP requests there are some optional operations we +may want to perform. For example parse the cookie to look for session +information, commit a database transaction, determine the preferred +language from the HTTP header and lookup proper internationalization, +etc. These operations are optional. Some actions need them and some +actions do not. They may also depend on each other. For example, if +sessions are stored in the database and our action needs it, we may need +to parse the session cookie from the HTTP header, pick up a connection from +the database connection pool, and - after the action has been executed - +save the session back in the database if data has changed.

    +

    PY4WEB fixtures provide a mechanism to specify what an action needs so +that py4web can accomplish the required tasks (and skip non required +ones) in the most efficient manner. Fixtures make the code efficient and +reduce the need for boilerplate code. Think of fixtures as per action +(as opposed to per app) middleware.

    +

    Fixtures PY4WEB são semelhantes aos middleware WSGI e BottlePy plug-in, exceto que eles se aplicam a ações individuais, não para todos eles, e pode dependem uns dos outros.

    +

    PY4WEB comes with some pre-defined fixtures: +sessions, url signing and flash messages will be fully +explained in this chapter. Database connections, internationalization, +authentication, and templates will instead be just outlined here since +they have dedicated chapters.

    +

    The developer is also free to add fixtures, for example, to handle a third +party template language or third party session logic; this is explained +later in the Fixtures personalizados paragraph.

    +
    +

    Using Fixtures

    +

    As we’ve seen in the previous chapter, fixtures are the arguments of the decorator +@action.uses(...). You can specify +multiple fixtures in one decorator or you can have multiple decorators.

    +

    Also, fixtures can be applied in groups. For example:

    +
    preferred = action.uses(session, auth, T, flash)
    +
    +
    +

    Then you can apply all of them at once with:

    +
    @action('index')
    +@preferred
    +def index():
    +    return dict()
    +
    +
    +

    Usually, it’s not important the order you use to specify the fixtures, because py4web +knows well how to manage them if they have explicit dependencies. For example auth +depends explicitly on db and session and flash, so you do not even needs to list them.

    +

    But there is an important exception: the Template fixture must always be the +first one. Otherwise, it will not have access to various things it should +need from the other fixtures, especially Inject() and Flash() that we’ll see later.

    +
    +
    +

    The Template fixture

    +

    PY4WEB by default uses the YATL template language and provides a +fixture for it.

    +
    from py4web import action
    +from py4web.core import Template
    +
    +@action('index')
    +@action.uses(Template('index.html', delimiters='[[ ]]'))
    +def index():
    +    return dict(message="Hello world")
    +
    +
    +

    Note: this example assumes that you created the application from the +scaffolding app, so that the template index.html is already created for +you.

    +

    O objeto template é um dispositivo elétrico. Ele transforma o `` dict () “ retornado pela ação em uma string usando o arquivo template index.html`. Em um capítulo posterior iremos fornecer um exemplo de como definir um fixture personalizado para usar uma linguagem de template diferente, por exemplo Jinja2.

    +

    Tenha em conta que uma vez que o uso de templates é muito comum e uma vez que, muito provavelmente, cada ação usa um template diferente, nós fornecemos um pouco de açúcar sintático, e as duas linhas a seguir são equivalentes:

    +
    @action.uses('index.html')
    +@action.uses(Template('index.html', delimiters='[[ ]]'))
    +
    +
    +

    Also notice that py4web template files are cached in RAM. The py4web caching +object is described later on Caching e Memoize.

    +
    +

    Aviso

    +

    If you use multiple fixtures, always place the template as the first one.

    +

    For example:

    +
    +
    @action.uses(session, db, 'index.html') # wrong
    +@action.uses('index.html', session, db) # right
    +
    +
    +
    +

    Be careful if you read old documentations that this need was exactly the +opposite in early py4web experimental versions (until February 2022)!

    +
    +

    As we’ve already seen in the last paragraph, you can combine many fixtures in +one decorator. But you can even extend this decorator by passing different +templates as needed. For example:

    +
    def preferred(template, *optional):
    +   return action.uses(template, session, auth, T, flash, *optional)
    +
    +
    +

    And then:

    +
    @action('index')
    +@preferred('index.html')
    +def index():
    +   return dict()
    +
    +
    +

    This syntax has no performance implications: it’s just for avoiding to replicate a decorator logic in multiple places. +In this way you’ll have cleaner code and if needed you’ll be able to change it later in one place only.

    +
    +
    +

    The Inject fixture

    +

    The Inject fixture is used for passing variables (and even python functions) to +templates. Here is a simple example:

    +
    from py4web.utils.factories import Inject
    +my_var = "Example variable to be passed to a Template"
    +
    +...
    +
    +@action.uses('index.html', Inject(my_var=my_var))
    +def index():
    +
    +   ...
    +
    +
    +

    It will be explained later on Using Inject in the YATL chapter.

    +
    +
    +

    The Translator fixture

    +

    Aqui está um exemplo de uso:

    +
    from py4web import action, Translator
    +import os
    +
    +T_FOLDER = os.path.join(os.path.dirname(__file__), 'translations')
    +T = Translator(T_FOLDER)
    +
    +@action('index')
    +@action.uses(T)
    +def index(): return str(T('Hello world'))
    +
    +
    +

    The string hello world will be translated based on the +internationalization file in the specified “translations” folder that +best matches the HTTP accept-language header.

    +

    Aqui `` Translator`` é uma classe py4web que se estende `` pluralize.Translator`` e também implementa a interface de `` Fixture``.

    +

    Podemos facilmente combinar vários Fixtures. Aqui, como exemplo, podemos tornar a acção com um contador que conta “visitas”.

    +
    from py4web import action, Session, Translator, DAL
    +from py4web.utils.dbstore import DBStore
    +import os
    +db = DAL('sqlite:memory')
    +session =  Session(storage=DBStore(db))
    +T_FOLDER = os.path.join(os.path.dirname(__file__), 'translations')
    +T = Translator(T_FOLDER)
    +
    +@action('index')
    +@action.uses(session, T)
    +def index():
    +    counter = session.get('counter', -1)
    +    counter += 1
    +    session['counter'] = counter
    +    return str(T("You have been here {n} times").format(n=counter))
    +
    +
    +

    If the T fixture is to be used from inside a template you may want to pass it to the template:

    +
    @action('index')
    +@action.uses("index.html", session, T)
    +def index():
    +    return dict(T=T)
    +
    +
    +

    Or perhaps inject (same effect as above)

    +
    from py4web.utils.factories import Inject
    +
    +@action('index')
    +@action.uses("index.html", session, Inject(T=T)
    +def index():
    +    return dict()
    +
    +
    +

    Agora crie o seguinte arquivo de tradução `` traduções / en.json``:

    +
    {"You have been here {n} times":
    +  {
    +    "0": "This your first time here",
    +    "1": "You have been here once before",
    +    "2": "You have been here twice before",
    +    "3": "You have been here {n} times",
    +    "6": "You have been here more than 5 times"
    +  }
    +}
    +
    +
    +

    When visiting this site with the browser language preference set to +English and reloading multiple times you will get the following +messages:

    +
    This your first time here
    +You have been here once before
    +You have been here twice before
    +You have been here 3 times
    +You have been here 4 times
    +You have been here 5 times
    +You have been here more than 5 times
    +
    +
    +

    Agora tente criar um arquivo chamado `` traduções / it.json`` que contém:

    +
    {"You have been here {n} times":
    +  {
    +    "0": "Non ti ho mai visto prima",
    +    "1": "Ti ho gia' visto",
    +    "2": "Ti ho gia' visto 2 volte",
    +    "3": "Ti ho visto {n} volte",
    +    "6": "Ti ho visto piu' di 5 volte"
    +  }
    +}
    +
    +
    +

    Set your browser preference to Italian: now the messages will be +automatically translated to Italian.

    +

    Notice there is an UI in the Dashboard for creating, updating, and updating translation files. +It can be easily reached via the button i18n+p11n:

    +_images/dashboard_i18n_btn.png +

    that leads to the following interface:

    +_images/dashboard_i18n_ui.png +

    More details can be found here: https://github.com/web2py/pluralize

    +

    If you want to force an action to use language defined somewhere else, for example from a session variable, you can do:

    +
    @action('index')
    +@action.uses("index.html", session, T)
    +def index():
    +    T.select(session.get("lang", "it"))
    +    return dict(T=T)
    +
    +
    +

    If you want all of your action to use the same pre-defined language and ignore browser preferences, +you have to redefine the select method for the T instance:

    +
    T.on_request = lambda *_: T.local.__dict__.update(tag="it", language=T.languages["it"])
    +
    +
    +

    This is to be done outside any action and will apply to all actions. Action will still need to declare +action.uses(T) else the behavior is undefined.

    +
    +
    +

    O fixture flash

    +

    It is common to want to display “alerts” to the users. Here we refer to +them as flash messages. There is a little more to it than just +displaying a message to the view, because flash messages:

    +
      +
    • can have state that must be preserved after redirection

    • +
    • can be generated both server side and client side

    • +
    • may have a type

    • +
    • should be dismissible

    • +
    +

    O auxiliar o Flash lida com o lado do servidor deles. Aqui está um exemplo:

    +
    from py4web import Flash
    +
    +flash = Flash()
    +
    +@action('index')
    +@action.uses(flash)
    +def index():
    +    flash.set("Hello World", _class="info", sanitize=True)
    +    return dict()
    +
    +
    +

    e no template:

    +
    <flash-alerts class="padded" data-alert="[[=globals().get('flash','')]]"></flash-alerts>
    +
    +
    +

    By setting the value of the message in the flash helper, a flash +variable is returned by the action and this triggers the JS in the +template to inject the message in the py4web-flash DIV which you +can position at your convenience. Also the optional class is applied to +the injected HTML.

    +

    If a page is redirected after a flash is set, the flash is remembered. +This is achieved by asking the browser to keep the message temporarily +in a one-time cookie. After redirection the message is sent back by the +browser to the server and the server sets it again automatically before +returning the content, unless it is overwritten by another set.

    +

    O cliente também pode definir / adicionar mensagens flash chamando:

    +
    Q.flash({'message': 'hello world', 'class': 'info'});
    +
    +
    +

    py4web defaults to an alert class called info and most CSS +frameworks define classes for alerts called success, error, +warning, default, and info. Yet, there is nothing in py4web +that hardcodes those names. You can use your own class names.

    +

    You can see the basic usage of flash messages in the examples app.

    +
    +
    +

    The Session fixture

    +

    Simply speaking, a session can be defined as a way to preserve information that is +desired to persist throughout the user’s interaction with the web site or web application. +In other words, sessions render the stateless HTTP connection a stateful one.

    +

    In py4web, the session object is also a fixture. Here is a simple example of its usage +to implement a counter.

    +
    from py4web import Session, action
    +session = Session(secret='my secret key')
    +
    +@action('index')
    +@action.uses(session)
    +def index():
    +    counter = session.get('counter', -1)
    +    counter += 1
    +    session['counter'] = counter
    +    return "counter = %i" % counter
    +
    +
    +

    The counter will start from 0; its value will be remembered and +increased every time you reload the page.

    +_images/simple_counter.png +

    Opening the page in a new browser tab will give you the updated +counter value. Closing and reopening the browser, or opening a +new private window, will instead restart the counter from 0.

    +

    Usually the information is saved in the session object are related +to the user - like its username, preferences, last pages visited, +shopping cart and so on. The session object has the same interface +as a Python dictionary but in py4web sessions are always stored using +JSON (JWT specifically, i.e. +JSON Web Token), +therefore you should only store objects that are JSON serializable. +If the object is not JSON serializable, it will be serialized using +the __str__ operator and some information may be lost.

    +

    The information composing the session object can be saved:

    +
      +
    • client-side, by only using cookies (default)

    • +
    • server-side, but you’ll still need minimal cookies for identifying +the clients

    • +
    +

    Por padrão sessões py4web nunca expiram (a menos que contenham informações de login, mas isso é outra história), mesmo se uma expiração pode ser definido. Outros parâmetros podem ser especificados, bem como:

    +
    session = Session(secret='my secret key',
    +                  expiration=3600,
    +                  algorithm='HS256',
    +                  storage=None,
    +                  same_site='Lax',
    +                  name="{app_name}_sesson")
    +
    +
    +

    Here:

    +
      +
    • secret is the passphrase used to sign the information

    • +
    • expiration is the maximum lifetime of the session, in seconds +(default = None, i.e. no timeout)

    • +
    • algorithm is the algorithm to be used for the JWT token +signature (“HS256” by default)

    • +
    • storage is a parameter that allows to specify an alternate +session storage method (for example Redis, or database). If not +specified, the default cookie method will be used

    • +
    • same_site is an option that prevents CSRF attacks (Cross-Site +Request Forgery) and is enabled by default with the “Lax” option. +You can read more about it +here

    • +
    • name is the format to use for the session cookie name.

    • +
    +

    If storage is not provided, session is stored in client-side jwt cookie. +Otherwise, we have server-side session: the jwt is stored in storage and +only its UUID key is stored in the cookie. This is the reason why the +secret is not required with server-side sessions.

    +
    +

    Client-side session in cookies

    +

    By default the session object is stored inside a cookie called +appname_session. It’s a JWT, hence encoded in a URL-friendly string +format and signed using the provided secret for preventing tampering.

    +
    +

    Aviso

    +

    Data embedded in cookies is signed, not encrypted! In fact it’s quite +trivial to read its content from http communications or from disk, so +do not place any sensitive information inside, and use a complex secret.

    +
    +

    If the secret changes existing sessions are invalidated. +If the user switches from HTTP to HTTPS or +vice versa, the user session is also invalidated. Session in cookies have a +small size limit (4 kbytes after being serialized and encoded) so do +not put too much into them.

    +
    +
    +

    Server-side session in memcache

    +

    Requires memcache installed and configured.

    +
    import memcache, time
    +conn = memcache.Client(['127.0.0.1:11211'], debug=0)
    +session = Session(storage=conn)
    +
    +
    +
    +
    +

    Server-side session in Redis

    +

    Requires Redis installed and configured.

    +
    import redis
    +conn = redis.Redis(host='localhost', port=6379)
    +conn.set = lambda k, v, e, cs=conn.set, ct=conn.ttl: (cs(k, v), e and ct(e))
    +session = Session(storage=conn)
    +
    +
    +

    Aviso: um objecto de armazenamento deve ter `` `` GET`` e métodos set`` e do método set` deve permitir especificar uma expiração. O objecto de ligação redis tem um método ttl` para especificar a expiração, remendo, portanto, que o macaco` método set` ter a assinatura esperada e funcionalidade.

    +
    +
    +

    Server-side session in database

    +
    from py4web import Session, DAL
    +from py4web.utils.dbstore import DBStore
    +db = DAL('sqlite:memory')
    +session =  Session(storage=DBStore(db))
    +
    +
    +
    +

    Aviso

    +

    the 'sqlite:memory' database used in this example +cannot be used in multiprocess environment; +the quirk is that your application will still work but in non-deterministic +and unsafe mode, since each process/worker will have its own independent +in-memory database.

    +
    +

    This is one case when a fixture (session) requires another +fixture (db). This is handled automatically by py4web and the following lines +are equivalent:

    +
    @action.uses(session)
    +@action.uses(db, session)
    +
    +
    +
    +
    +

    Server-side session anywhere

    +

    Você pode facilmente armazenar sessões em qualquer lugar que você quer. Tudo que você precisa fazer é fornecer ao objeto `` Session`` um objeto `` storage`` com ambos os `` GET`` e `` métodos set``. Por exemplo, imagine que você deseja armazenar sessões no seu sistema de arquivos local:

    +
    import os
    +import json
    +
    +class FSStorage:
    +   def __init__(self, folder):
    +       self.folder = folder
    +   def get(self, key):
    +       filename = os.path.join(self.folder, key)
    +       if os.path.exists(filename):
    +           with open(filename) as fp:
    +              return json.load(fp)
    +       return None
    +   def set(self, key, value, expiration=None):
    +       filename = os.path.join(self.folder, key)
    +       with open(filename, 'w') as fp:
    +           json.dump(value, fp)
    +
    +session = Session(storage=FSStorage('/tmp/sessions'))
    +
    +
    +

    We leave to you as an exercise to implement expiration, limit the number +of files per folder by using subfolders, and implement file locking. Yet +we do not recommend storing sessions on the filesystem: it is +inefficient and does not scale well.

    +
    +
    +

    Sharing sessions

    +

    Imagine you have an app «app1» which uses a session and an app «app2» that wants to share a session with app1. Assuming they use sessions in cookies, +«app2» would use:

    +
    session = Session(secret=settings.SESSION_SECRET_KEY,
    +                  name="app1_session")
    +
    +
    +

    The name tells app2 to use the cookie «app1_session» from app1. Notice it is important that the secret is the same as app1’s secret. If using a session +in db, then app2 must be using the same db as app1. It is up to the user to make sure that the data stored in the session and shared between the two apps +are consistent and we strongly recommend that only app1 writes to the session, unless the share one and the same database.

    +

    Notice that it is possible for one app to handle multiple sessions. For example one session may be its own, and another may be used exclusively to read +data from another app (app1) running on the same server:

    +
    session_app1 = Session(secret=settings.SESSION_SECRET_KEY,
    +                       name="app1_session")
    +...
    +@action.uses(session, session_app1)
    +...
    +
    +
    +
    +
    +
    +

    The Condition fixture

    +

    Sometimes you want to restrict access to an action based on a +given condition. For example to enforce a workflow:

    +
    @action("step1")
    +@action.uses(session)
    +def step1():
    +    session["step_completed"] = 1
    +    button = A("next", _href=URL("step2"))
    +    return locals()
    +
    +@action("step2")
    +@action.uses(session, Condition(lambda: session.get("step_completed") == 1))
    +def step2():
    +    session["step_completed"] = 2
    +    button = A("next", _href=URL("step3"))
    +    return locals()
    +
    +@action("step3")
    +@action.uses(session, Condition(lambda: session.get("step_completed") == 2))
    +def step3():
    +    session["step_completed"] = 3
    +    button = A("next", _href=URL("index"))
    +    return locals()
    +
    +
    +

    Notice that the Condition fixtures takes a function as first argument +which is called on_request and must evaluate to True or False.

    +

    Also notice that in the above example the Condition depends on the Session +therefore it must be listed after session in action.uses.

    +

    If False, by default, the Condition fixture raises 404. +It is possible to specify a different exception:

    +
    Condition(cond, exception=HTTP(400))
    +
    +
    +

    It is also possible to call a function before the exception is raised, +for example, to redirect to another page:

    +
    Condition(cond, on_false=lambda: redirect(URL('step1')))
    +
    +
    +

    You can use condition to check permissions. For example, if you +are giving group memberships to users using Tags (it will be explained +later on the Authorization using Tags chapter), then you can +require that users action have specific group membership:

    +
    groups = Tags(db.auth_user)
    +
    +@action("payroll")
    +@action.uses(auth,
    +             Condition(lambda: 'employees' in groups.get(auth.user_id), on_false=lambda: redirect('index')))
    +def payroll():
    +    return
    +
    +
    +
    +
    +

    The URLsigner fixture

    +

    A signed URL is a URL that provides limited permission and time to make an +HTTP request by containing authentication information in its query string. +The typical usage is as follows:

    +
    from py4web.utils import URLSigner
    +
    +# We build a URL signer.
    +url_signer = URLSigner(session)
    +
    +@action('/somepath')
    +@action.uses(url_signer)
    +def somepath():
    +   # This controller signs a URL.
    +   return dict(signed_url = URL('/anotherpath', signer=url_signer))
    +
    +@action('/anotherpath')
    +@action.uses(url_signer.verify())
    +def anotherpath():
    +   # The signature has been verified.
    +   return dict()
    +
    +
    +
    +
    +

    O fixture DAL

    +

    Nós já usou o `` dispositivo elétrico DAL`` no contexto das sessões, mas talvez você queira ter acesso direto ao objeto DAL com a finalidade de acessar o banco de dados, e não apenas sessões.

    +

    PY4WEB, by default, uses the PyDAL (Python Database Abstraction Layer) +which is documented in the next chapter. Here is an example, please +remember to create the databases folder under your project in case +it doesn’t exist:

    +
    from datetime import datetime
    +from py4web import action, request, DAL, Field
    +import os
    +
    +DB_FOLDER = os.path.join(os.path.dirname(__file__), 'databases')
    +db = DAL('sqlite://storage.db', folder=DB_FOLDER, pool_size=1)
    +db.define_table('visit_log', Field('client_ip'), Field('timestamp', 'datetime'))
    +db.commit()
    +
    +@action('index')
    +@action.uses(db)
    +def index():
    +    client_ip = request.environ.get('REMOTE_ADDR')
    +    db.visit_log.insert(client_ip=client_ip, timestamp=datetime.utcnow())
    +    return "Your visit was stored in database"
    +
    +
    +

    Notice that the database fixture defines (creates/re-creates) tables +automatically when py4web starts (and every time it reloads this app) +and picks a connection from the connection pool at every HTTP request. +Also each call to the index() action is wrapped into a transaction +and it commits on_success and rolls back on_error.

    +
    +
    +

    The Auth fixture

    +

    auth and auth.user are both fixtures that depend on +session and db. Their role is to provide the action with +authentication information.

    +

    Auth is used as follows:

    +
    from py4web import action, redirect, Session, DAL, URL
    +from py4web.utils.auth import Auth
    +import os
    +
    +session = Session(secret='my secret key')
    +DB_FOLDER = os.path.join(os.path.dirname(__file__), 'databases')
    +db = DAL('sqlite://storage.db', folder=DB_FOLDER, pool_size=1)
    +auth = Auth(session, db)
    +auth.enable()
    +
    +@action('index')
    +@action.uses(auth)
    +def index():
    +    user = auth.get_user() or redirect(URL('auth/login'))
    +    return 'Welcome %s' % user.get('first_name')
    +
    +
    +

    O construtor do objeto `` Auth`` define a tabela `` auth_user`` com os seguintes campos: nome de usuário, e-mail, senha, first_name, last_name, sso_id e action_token (os dois últimos são principalmente para uso interno).

    +

    If a auth_user table is defined before calling auth.enable() +the provided table will be used.

    +

    It is also possible to add extra_fields to the auth_user table, +for example:

    +
    extra_fields = [
    +   Field("favorite_color"),
    +]
    +auth = Auth(session, db, extra_fields=extra_fields)
    +
    +
    +

    In any case, we recommend not to pollute the auth_user table with +extra fields but, instead, to use one of more additional custom +tables that reference users and store the required information.

    +

    The auth object exposes the method:auth.enable() which +registers multiple actions including {appname}/auth/login. +It requires the presence of the auth.html template and the +auth value component provided by the +_scaffold app. It also exposes the method:

    +
    auth.get_user()
    +
    +
    +

    which returns a python dictionary containing the information of the +currently logged in user. If the user is not logged-in, it returns +None and in this case the code of the example redirects to the +auth/login page.

    +

    Desde essa verificação é muito comum, py4web fornece um fixture adicional `` auth.user``:

    +
    @action('index')
    +@action.uses(auth.user)
    +def index():
    +    user = auth.get_user()
    +    return 'Welcome %s' % user.get('first_name')
    +
    +
    +

    This fixture automatically redirects to the auth/login page if user +is not logged-in, hence this example is equivalent to the previous one.

    +

    The auth fixture is plugin based: it supports multiple plugin +methods including OAuth2 (Google, Facebook, Twitter), PAM and LDAP. +The Authentication and authorization chapter will show you +all the related details.

    +
    +
    +

    Caveats about fixtures

    +

    Desde fixtures são compartilhados por várias ações que você não tem permissão para alterar seu estado, porque não seria seguro para threads. Há uma exceção a esta regra. As ações podem alterar alguns atributos de campos de banco de dados:

    +
    from py4web import action, request, DAL, Field
    +from py4web.utils.form import Form
    +import os
    +
    +DB_FOLDER = os.path.join(os.path.dirname(__file__), 'databases')
    +db = DAL('sqlite://storage.db', folder=DB_FOLDER, pool_size=1)
    +db.define_table('thing', Field('name', writable=False))
    +
    +@action('index')
    +@action.uses('generic.html', db)
    +def index():
    +    db.thing.name.writable = True
    +    form = Form(db.thing)
    +    return dict(form=form)
    +
    +
    +

    Note that this code will only be able to display a form, to process it +after submit, additional code needs to be added, as we will see later +on. This example is assuming that you created the application from the +scaffolding app, so that a generic.html is already created for you.

    +

    A `` readable``, `` writable``, `` default``, `` update``, e atributos `` `` require`` de db. {Tabela}. {Campo} `` são objectos especiais de classe `` ThreadSafeVariable`` definido a `` threadsafevariable`` módulo. Esses objetos são muito parecidos com Python rosca objetos locais, mas eles estão em todos os pedidos utilizando o valor fora da ação especificada inicializado-re. Isto significa que as ações podem mudar com segurança os valores desses atributos.

    +
    +
    +

    Fixtures personalizados

    +

    Um fixture é um objecto com a seguinte estrutura mínima:

    +
    from py4web.core import Fixture
    +
    +class MyFixture(Fixture):
    +    def on_request(self, context): pass
    +    def on_success(self, context): pass
    +    def on_error(self, context) pass
    +
    +
    +

    For example in the DAL fixture case, on_request starts a transaction, +on_success commits it, and on_error rolls it back.

    +

    In the case of a template, on_request and on_error do nothing but +on_success transforms the output.

    +

    In the case of auth.user fixtures, on_request does all the work of +determining if the user is logged in (from the dependent session fixture) +and eventually preventing the request from accessing the inner layers.

    +

    Now imagine a request coming in calling an action with three fixtures A, B, and C. +Under normal circumstances above methods are executed in this order:

    +
    request  -> A.on_request -> B.on_request -> C.on_request -> action
    +response <- A.on_success <- B.on_success <- C.on_success <-
    +
    +
    +

    i.e. the first fixture (A) is the first one to call on_request +and the last one to call on_success. You can think of them as layers of +an onion with the action (user code) at the center. on_success is called +when entering a layer from the outside and on_success is called when +exiting a layer from the inside (like WSGI middleware).

    +

    If any point an exception is raised inner layers are not called +and outer layers will call on_error instead of on_success.

    +

    Context is a shared object which contains:

    +
      +
    • content[“fixtures”]: the list of all the fixtures for the action.

    • +
    • context[“processed”]: the list of fixtures that called on_request previously within the request.

    • +
    • context[“exception”]: the exception raised by the action or any previous fixture logic (usually None)

    • +
    • context[“output”]: the action output.

    • +
    +

    on_success and on_error can see the current context['exception'] and +transform it. They can see the current context['output'] and transform it as well.

    +

    For example here is a fixture that transforms the output text to upper case:

    +
    class UpperCase(Fixture):
    +    def on_success(self, context):
    +        context['output'] = context['output'].upper()
    +
    +upper_case = UpperCase()
    +
    +@action('index')
    +@action.uses(upper_case)
    +def index(): return "hello world"
    +
    +
    +

    Notice that this fixture assumes the context['output'] is a string +and therefore it must come before the template.

    +

    Here is a fixture that logs exceptions tracebacks to a file:

    +
    class LogErrors(Fixture):
    +    def __init__(self, filename):
    +        self.filename = filename
    +    def on_error(self, context):
    +        with open(self.filename, "a") as stream:
    +            stream.write(str(context['exception']) + '\n')
    +
    +errlog = LogErrors("myerrors.log")
    +
    +@action('index')
    +@action.uses(errlog)
    +def index(): return 1/0
    +
    +
    +

    Fixtures also have a __prerequisite__ attribute. If a fixture +takes another fixture as an argument, its value must be appended +to the list of __prerequisites__. This guarantees that they are +always executed in the proper order even if listed in the wrong order. +It also makes it optional to declare prerequisite fixtures in action.uses.

    +

    For example Auth depends on db, session, and flash. db and session +are indeed arguments. flash is a special singleton fixture declared within Auth. +This means that

    +
    action.uses(auth)
    +
    +
    +

    is equivalent to

    +
    action.uses(auth, session, db, flash)
    +
    +
    +

    Why are fixtures not simply functions that contain a try/except?

    +

    We considered the option but there are some special exceptions that should +not be considered errors but success (py4web.HTTP, bottle.HTTResponse) +while other exceptions are errors. The actual logic can be complicated +and individual fixtures do not need to know these details.

    +

    They all need to know what the context is and whether they are +processing a new request or a response and whether the response is a success +or an error. We believe this logic keeps the fixtures easy.

    +

    Fixtures should not in general communicate with each other but nothing +prevents one fixture to put data in the context and another fixture to +retrieve that data.

    +
    +

    Fixtures with dependencies

    +

    If a fixture depends on another fixture, it needs to be passed that fixture in the initializer, +and the fixture must be listed in the __prerequisites__ attribute. +For example, suppose we want to create a fixture that grants access to a controller only +to users whose email address is included in an ADMIN_EMAILS list. +We can write the following fixture:

    +
    class AdminAccess(Fixture):
    +
    +    def __init__(self, auth, admin_list, redirect_url=None):
    +        super().__init__()
    +        self.admin_list = admin_list
    +        self.auth = auth
    +        self.__prerequisites__ = [auth]
    +        # One thing to note here is that the URL function can only be called in a
    +        # request context (while serving a request).  Thus, we cannot store in the fixture
    +        # initialization the full URL to redirect, but only the path.
    +        self.redirect_url = redirect_url or 'index'
    +
    +    def on_request(self, context):
    +        if ((not self.auth.current_user)
    +            or self.auth.current_user.get('email') not in self.admin_list):
    +            redirect(URL(self.redirect_url))
    +
    +    def on_error(self, context):
    +        redirect(URL(self.redirect_url))
    +
    +
    +

    The fixture can be created and used as follows:

    +
    admin_access = AdminAccess(auth, ['a@example.com',], 'index')
    +
    +@action('/admin-only')
    +@action.uses('admin_only.html', admin_access)
    +def admin_only():
    +    return dict()
    +
    +
    +
    +
    +

    Using local storage

    +

    Fixtures can use a thread-local storage for data they need. +Here is an example:

    +
    class LocalStorageDemo(Fixture):
    +
    +   def __init__(self):
    +       super().__init__()
    +
    +   def on_request(self, context):
    +       Fixture.local_initialize(self)
    +       # We can check whether the local storage is valid.
    +       print(f"is_valid: {self.is_valid()}")
    +       content = str(uuid.uuid4())
    +       print(f"Storing content: {content}")
    +       self.local.my_content = content
    +
    +   def on_success(self, context):
    +       # The line below is used only to show that the thread-local object is in place.
    +       print(f"Retrieved: {self.local.my_content}")
    +
    +
    +

    Notably, the initializer should contain the line:

    +
    Fixture.local_initialize(self)
    +
    +
    +

    in order to initialize the thread-local storage. +Once this is done, the thread-local storage can be used to store and retrieve data +using the the self.local object.

    +
    +
    +
    +

    Multiple fixtures

    +

    As previously stated, it’s generally not important the order you use to specify the fixtures +but it’s mandatory that you always place the template as the first one. +Consider this:

    +
    @action("index")
    +@action.uses(A,B)
    +def func(): return "Hello world"
    +
    +
    +

    Pre-processing (on_request) in the fixtures happen in the sequence they are listed +and then the on_success or on_error methods will be executed in reverse order (as +an onion).

    +

    Hence the previous code can be explicitly transformed to:

    +
    A.on_request()
    +B.on_request()
    +func()
    +B.on_success()
    +A.on_success()
    +
    +
    +

    So if A.on_success() is a template and B is an inject fixture that allows you to add +some extra variables to your templates, then A must come first.

    +

    Notice that

    +
    @action.uses(A)
    +@action.uses(B)
    +
    +
    +

    is almost equivalent to

    +
    @action.uses(A,B)
    +
    +
    +

    but not quite. All fixtures declared in one action.uses share +the same context while fixtures in different action.uses use +different contexts and therefore they cannot communicate with each other. +This may change in the future. +For now we recommend using a single call to action.uses.

    +
    +
    +

    Caching e Memoize

    +

    py4web provides a cache in RAM object that implements the last recently +used (LRU) algorithm. It can be used to cache any function via a +decorator:

    +
    import uuid
    +from py4web import Cache, action
    +cache = Cache(size=1000)
    +
    +@action('hello/<name>')
    +@cache.memoize(expiration=60)
    +def hello(name):
    +    return "Hello %s your code is %s" % (name, uuid.uuid4())
    +
    +
    +

    It will cache (memoize) the return value of the hello function, as +function of the input name, for up to 60 seconds. It will store in +cache the 1000 most recently used values. The data is always stored in +RAM.

    +

    The cache object is not a fixture and it should not and cannot be +registered using the @action.uses decorator but we mention it here +because some of the fixtures use this object internally. For example, +template files are cached in RAM to avoid accessing the file system +every time a template needs to be rendered.

    +
    +
    +

    Decoradores de conveniência

    +

    The _scaffold application, in common.py defines two special +convenience decorators using ActionFactory:

    +
    @unauthenticated()
    +def index():
    +    return dict()
    +
    +
    +

    e

    +
    @authenticated()
    +def index():
    +    return dict()
    +
    +
    +

    They apply all of the decorators below (db, session, T, flash, auth), +use a template with the same name as the function (.html), and also +register a route with the name of action followed by the number of +arguments of the action separated by a slash (/).

    +
      +
    • @unauthenticated does not require the user to be logged in.

    • +
    • @authenticated required the user to be logged in.

    • +
    +
    +

    Aviso

    +

    ActionFactory decorators like these cannot be combined +with @action or @action.uses

    +
    +

    The decorators can be used directly as shown above, which enables +all HTTP methods (GET, POST, PUT, …) but you can also create separate +controllers for each HTTP method:

    +
    @authenticated.get()
    +def index():
    +    # only handle GET requests
    +    return dict()
    +
    +@authenticated.post(path="index")
    +def index_form():
    +    # only handle POST requests
    +    return dict()
    +
    +
    +

    The both decorator and its HTTP method calls have the following arguments:

    +
      +
    • +
      path overwrites the path built from the function name

      with the given string. Does not automatically handle arguments.

      +
      +
      +
    • +
    • +
      template specifies the template name, instead of using

      the function name.

      +
      +
      +
    • +
    • uses specify extra fixtures for this specific controllers.

    • +
    +
    @authenticated(
    +   path="test",
    +   template="generic.html",
    +   uses=[Inject(message="Hello World")])
    +def example():
    +    return dict()
    +
    +
    +

    As manual ordering of fixtures isn’t possible with uses, +make sure the fixtures define their dependencies. +See: Fixtures with dependencies

    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-07.html b/apps/_documentation/static/pt/chapter-07.html new file mode 100644 index 000000000..12b014766 --- /dev/null +++ b/apps/_documentation/static/pt/chapter-07.html @@ -0,0 +1,3932 @@ + + + + + + + + + The Database Abstraction Layer (DAL) — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    The Database Abstraction Layer (DAL)

    +
    +

    DAL introduction

    +

    py4web rely on a database abstraction layer (DAL), an API that maps +Python objects into database objects such as queries, tables, and +records. The DAL dynamically generates the SQL in real time using the +specified dialect for the database back end, so that you do not have to +write SQL code or learn different SQL dialects (the term SQL is used +generically), and the application will be portable among different types +of databases. +The DAL choosen is a pure Python one called pyDAL. +It was conceived in the web2py project but it’s a standard python module: +you can use it in any Python context.

    +
    +

    Nota

    +

    What makes pyDAL different from most of the other DALs is the syntax: it maps +records to python dictionaries, which is simpler and closer to SQL. +Other famous frameworks instead strictly rely on an Object Relational Mapping (ORM) +like the Django ORM or the SQL Alchemy ORM, that maps tables to Python classes +and rows to Objects.

    +
    +

    A little taste of pyDAL features:

    +
      +
    • Transactions

    • +
    • Aggregates

    • +
    • Inner & Outer Joins

    • +
    • Nested Selects

    • +
    +
    +

    py4web model

    +

    Even if web2py and py4web use the same pyDAL, there are important differences (see +De web2py para py4web for details). The main caveat is that in py4web only +the action is executed for every HTTP request, while the code defined outside of +actions is only executed at startup. That makes py4web much faster, in particular +when there are many tables. The downside of this approach is that the developer +should be careful to never override pyDAL variables inside action or in any way +that depends on the content of the request object, else the code is not thread safe. +The only variables that can be changed at will are the following field attributes: +readable, writable, requires, update, and default. +All the others are for practical purposes to be considered global and non thread safe.

    +
    +
    +

    Supported databases

    +

    A partial list of supported databases is show in the table +below. Please check on the py4web/pyDAL web site and mailing list for more +recent adapters.

    +
    +

    Nota

    +

    In any modern python distribution SQLite is actually built-in as a Python library. +The SQLite driver (sqlite3) is also included: you don’t need to install it. +Hence this is the most popular database for testing and development.

    +
    +

    The Windows and the Mac binary distribution work out of the box with SQLite and PostgreSQL only. +To use any other database back end, run a full py4web +distribution and install the appropriate driver for the required back +end. Once the proper driver is installed, start py4web and it +will automatically find the driver.

    +

    Here is a list of the drivers py4web can use:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Database

    Drivers (source)

    SQLite

    sqlite3 ou pySqlite2 ou zxJDBC (em Jython)

    PostgreSQL

    psycopg2 ou zxJDBC (em Jython)

    MySQL

    pymysql ou MySQLdb

    Oráculo

    cx_Oracle

    MSSQL

    pyodbc ou pypyodbc

    FireBird

    KInterbasDB ou FDB ou pyodbc

    DB2

    pyodbc

    Informix

    informixdb

    Ingres

    ingresdbi

    CUBRID

    cubriddb

    Sybase

    Sybase

    Teradata

    pyodbc

    SAPDB

    sapdb

    MongoDB

    pymongo

    IMAP

    imaplib

    +

    Support of MongoDB is experimental. Google NoSQL is treated as a particular case. +The Gotchas section at the end of this chapter has some more information +about specific databases.

    +
    +
    +

    The DAL: a quick tour

    +

    define py4web as seguintes classes que compõem o DAL:

    +
    +
    DAL

    represents a database connection. For example:

    +
    db = DAL('sqlite://storage.sqlite')
    +
    +
    +
    +
    Table

    represents a database table. You do not directly instantiate +Table; instead, DAL.define_table does.

    +
    db.define_table('mytable', Field('myfield'))
    +
    +
    +

    Os métodos mais importantes de uma tabela são:

    +

    `` Insert``, `` truncate``, `` drop``, e `` import_from_csv_file``.

    +
    +
    Field

    represents a database field. It can be instantiated and passed +as an argument to DAL.define_table.

    +
    +
    Rows

    is the object returned by a database select. It can be +thought of as a list of Row rows:

    +
    rows = db(db.mytable.myfield != None).select()
    +
    +
    +
    +
    Row

    contains field values:

    +
    for row in rows:
    +    print(row.myfield)
    +
    +
    +
    +
    Query

    is an object that represents a SQL “where” clause:

    +
    myquery = (db.mytable.myfield != None) | (db.mytable.myfield > 'A')
    +
    +
    +
    +
    Set

    is an object that represents a set of records. Its most +important methods are count, select, update, and delete. +For example:

    +
    myset = db(myquery)
    +rows = myset.select()
    +myset.update(myfield='somevalue')
    +myset.delete()
    +
    +
    +
    +
    Expression

    is something like an orderby or groupby +expression. The Field class is derived from the Expression. Here is an +example.

    +
    myorder = db.mytable.myfield.upper() | db.mytable.id
    +db().select(db.table.ALL, orderby=myorder)
    +
    +
    +
    +
    +
    +
    +

    Usando o DAL “stand-alone”

    +

    pyDAL is an independent python package. As such, it can be used +without the web2py/py4web environment; you just need to install +it with pip. Then import the pydal module when needed:

    +
    >>> from pydal import DAL, Field
    +
    +
    +
    +

    Nota

    +

    Even if you can import modules directly from pydal, this is not +advisable from within py4web applications. Remember that py4web.DAL +is a fixture, pydal.DAL is not. In this context, the last command +should better be:

    +
    >>> from py4web import DAL, Field
    +
    +
    +
    +
    +
    +

    Experimentar com o shell py4web

    +

    You can also experiment with the pyDAL API using the py4web shell, +that is available using the Opção `` comando shell``.

    +
    +

    Aviso

    +

    Mind that +database changes may be persistent. So be careful and do NOT hesitate +to create a new application for doing testing instead of tampering +with an existing one. The only exception is the showcase +db: in case of problems you can recreate it by simply deleting the +database folder and restarting py4web. This will re-create the +database with all the example data.

    +
    +

    Note that most of the code snippets that contain the python prompt +>>> are also directly executable via a py4web shell.

    +

    This is a simple example, using the provided showcase app:

    +
    >>> from apps.showcase.examples.models import db
    +>>> db.tables()
    +['auth_user', 'auth_user_tag_groups', 'person', 'superhero', 'superpower', 'tag', 'thing', 'user_token', 'dummy']
    +>>> rows = db(db.superhero.name != None).select()
    +>>> rows.first()
    +<Row {'id': 1, 'tag': <Set ("tag"."superhero" = 1)>, 'name': 'Superman', 'real_identity': 1}>
    +
    +
    +

    You can also start by creating a connection from zero. For the sake of simplicity, you +can use SQLite. Nothing in this discussion changes when you switch the back-end +engine.

    +
    +
    +
    +

    Using the dashboard app with databases

    +

    Generally you can use the dashboard app for viewing and modifying the databases +of a particular app. However this is not bulletproof, so for +security reason this by default is not applied to the showcase app. +But if your installation is local (not exposed to public networks), you can enable it +by simply adding to the file``apps/showcase/__init__.py`` the line:

    +
    from .examples.models import db
    +
    +
    +

    This allow you to look graphically inside the showcase application database:

    +_images/example_db.png +
    +
    +

    Construtor DAL

    +

    Uso básico:

    +
    >>> db = DAL('sqlite://storage.sqlite')
    +
    +
    +

    O banco de dados agora está conectado e a conexão é armazenado na variável global `` db``.

    +

    A qualquer momento você pode recuperar a string de conexão.

    +
    >>> db._uri
    +sqlite://storage.sqlite
    +
    +
    +

    e o nome do banco

    +
    >>> db._dbname
    +sqlite
    +
    +
    +

    The connection string is called _uri because it is an instance of +a uniform resource identifier.

    +

    A DAL permite várias ligações com o mesmo banco de dados ou com diferentes bases de dados, mesmo bases de dados de diferentes tipos. Por enquanto, vamos supor a presença de um único banco de dados uma vez que esta é a situação mais comum.

    +
    +

    Assinatura da DAL

    +
    DAL(uri='sqlite://dummy.db',
    +    pool_size=0,
    +    folder=None,
    +    db_codec='UTF-8',
    +    check_reserved=None,
    +    migrate=True,
    +    fake_migrate=False,
    +    migrate_enabled=True,
    +    fake_migrate_all=False,
    +    decode_credentials=False,
    +    driver_args=None,
    +    adapter_args=None,
    +    attempts=5,
    +    auto_import=False,
    +    bigint_id=False,
    +    debug=False,
    +    lazy_tables=False,
    +    db_uid=None,
    +    do_connect=True,
    +    after_connection=None,
    +    tables=None,
    +    ignore_field_case=True,
    +    entity_quoting=False,
    +    table_hash=None)
    +
    +
    +
    +
    +

    Strings de conexão (o parâmetro uri)

    +

    Uma ligação com o banco de dados é estabelecida através da criação de uma instância do objecto DAL:

    +
    db = DAL('sqlite://storage.sqlite')
    +
    +
    +

    `` Db`` não é uma palavra-chave; é uma variável local que armazena o objeto de conexão `` DAL``. Você é livre para dar-lhe um nome diferente. O construtor de `` DAL`` requer um único argumento, a string de conexão. A seqüência de conexão é o único código py4web que depende de um banco de dados específico back-end. Aqui estão alguns exemplos de strings de conexão para tipos específicos de bancos de dados de back-end suportados (em todos os cases, assumimos o banco de dados está sendo executado a partir de localhost na sua porta padrão e é chamado de “teste”):

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Database

    Connection string

    ** ** SQLite

    `` SQLite: // storage.sqlite``

    ** ** MySQL

    mysql://username:password@localhost/test?set_encoding=utf8mb4

    ** ** PostgreSQL

    postgres://username:password@localhost/test

    ** MSSQL (legado) **

    `` Mssql: // username: password @ localhost / test``

    ** MSSQL (> = 2005) **

    mssql3://username:password@localhost/test

    ** MSSQL (> = 2012) **

    mssql4://username:password@localhost/test

    ** ** FireBird

    firebird://username:password@localhost/test

    Oráculo

    `` Oracle: // username / password @ test``

    ** ** DB2

    `` Db2: // username: password @ test``

    ** ** Ingres

    ingres://username:password@localhost/test

    ** ** Sybase

    sybase://username:password@localhost/test

    ** ** Informix

    `` Informix: // username: password @ test``

    ** ** Teradata

    teradata://DSN=dsn;UID=user;PWD=pass;DATABASE=test

    ** ** CUBRID

    cubrid://username:password@localhost/test

    ** ** SAPDB

    `` Sapdb: // username: password @ localhost / test``

    ** ** IMAP

    `` Imap: // utilizador: senha @ servidor: port``

    ** ** MongoDB

    mongodb://username:password@localhost/test

    ** Google / SQL **

    `` Google: sql: // projecto: instance / database``

    ** Google / NoSQL **

    `` Google: datastore``

    ** Google / NoSQL / NDB **

    `` Google: armazenamento de dados + ndb``

    +
      +
    • in SQLite the database consists of a single file. If it does +not exist, it is created. This file is locked every time it is accessed. +In addition to the file “storage.sqlite” that contains the data, there will +be also a sql.log file plus one additional file called longhash_tablename.table +for every table definition. The table definition files are used during migrations; +in case of problems they could be deleted (they’ll be automatically recreated).

    • +
    • in the case of MySQL, PostgreSQL, MSSQL, FireBird, Oracle, DB2, Ingres +and Informix the database “test” must be created outside py4web. Once +the connection is established, py4web will create, alter, and drop +tables appropriately.

    • +
    • in the MySQL connection string, the ?set_encoding=utf8mb4 at the end +sets the encoding to UTF-8 and avoids an +Invalid utf8 character string: error on Unicode characters that +consist of four bytes, as by default, MySQL can only handle Unicode +characters that consist of one to three bytes.

    • +
    • in the Google/NoSQL case the +ndb option turns on NDB. NDB uses a +Memcache buffer to read data that is accessed often. This is completely +automatic and done at the datastore level, not at the py4web level.

    • +
    • it is also possible to set the connection string to None. In this +case DAL will not connect to any back-end database, but the API can +still be accessed for testing.

    • +
    +

    Some times you may also need to generate SQL as if you had a connection but +without actually connecting to the database. This can be done with

    +
    db = DAL('...', do_connect=False)
    +
    +
    +

    In this case you will be able to call _select, _insert, +_update, and _delete to generate SQL but not call select, +insert, update, and delete; see Generating raw SQL +for details. In most of the cases you can use +do_connect=False even without having the required database drivers.

    +

    Observe que, por padrão py4web usos utf8 codificação de caracteres para bancos de dados. Se você trabalha com bancos de dados que se comportam de forma diferente existente, você tem que mudá-lo com o parâmetro opcional `` db_codec`` como

    +
    db = DAL('...', db_codec='latin1')
    +
    +
    +

    Caso contrário, você vai ter bilhetes UnicodeDecodeError.

    +
    +
    +

    O pool de conexões

    +

    Um argumento comum do construtor DAL é a `` pool_size``; o padrão é zero.

    +

    As it is rather slow to establish a new database connection for each +request, py4web implements a mechanism for connection pooling. Once a +connection is established and the page has been served and the +transaction completed, the connection is not closed but goes into a +pool. When the next request arrives, py4web tries to recycle a +connection from the pool and use that for the new transaction. If there +are no available connections in the pool, a new connection is +established.

    +

    Quando py4web começa, a piscina é sempre vazio. A piscina cresce até o mínimo entre o valor de `` pool_size`` e o número máximo de solicitações simultâneas. Isto significa que se `` POOL_SIZE = 10`` mas o nosso servidor nunca recebe mais de 5 solicitações simultâneas, em seguida, o tamanho real piscina só vai crescer a 5. Se `` POOL_SIZE = 0`` então o pool de conexão não é usada.

    +

    Conexões nas piscinas são compartilhados sequencialmente entre threads, no sentido de que eles podem ser usados ​​por dois tópicos diferentes, mas não simultâneas. Há apenas uma piscina para cada processo py4web.

    +

    O parâmetro `` pool_size`` é ignorado pelo SQLite e Google App Engine. pool de conexão é ignorado para SQLite, uma vez que não daria qualquer benefício.

    +
    +
    +

    Falhas de conexão (parâmetro tentativas)

    +

    Se py4web não consegue se conectar ao banco de dados que espera 1 segundo e por tentativas padrão novamente até 5 vezes antes de declarar um fracasso. No case do pool de conexão, é possível que uma conexão em pool que permanece aberta, mas sem uso por algum tempo está fechado até o final de banco de dados. Graças à py4web recurso repetição tenta restabelecer essas ligações interrompidas. O número de tentativas é definido através do parâmetro tentativas.

    +
    +
    +

    Tabelas preguiçosos

    +

    Setting lazy_tables = True provides a major performance boost (but +not with py4web). It means that table creation is deferred until the +table is actually referenced.

    +
    +

    Aviso

    +

    You should never use lazy tables in py4web. There is no advantage, +no need, and possibly concurrency problems.

    +
    +
    +
    +

    Aplicativos de modelo-less

    +

    Normally in py4web the code that define DAL tables lives in the file +models.py, hence it’s only executed at startup because it’s outside of actions.

    +

    However, it is possible to define DAL tables on demand inside actions. +This is referred to as “model-less” development by the py4web community.

    +

    To use the “model-less” approach, you take responsibility for doing +all the housekeeping tasks. You call the table definitions when you +need them, and provide database connection passed as parameter. +Also, remember maintainability: other py4web developers expect to find +database definitions in the models.py file.

    +
    +
    +

    Bancos de dados replicados

    +

    The first argument of DAL(...) can be a list of URIs. In this case +py4web tries to connect to each of them. The main purpose for this is to +deal with multiple database servers and distribute the workload among +them. Here is a typical use case:

    +
    db = DAL(['mysql://...1', 'mysql://...2', 'mysql://...3'])
    +
    +
    +

    Neste case, as tentativas DAL para conectar-se a primeira e, em case de falha, ele vai tentar o segundo eo terceiro. Isto também pode ser utilizado para distribuir a carga em uma configuração de banco de dados mestre-escravo.

    +
    +
    +

    Palavras-chave reservadas

    +

    `` Check_reserved`` diz o construtor para verificar nomes de tabela e nomes de coluna contra palavras-chave reservada SQL em bancos de dados de back-end-alvo. `` padrões check_reserved`` a nenhum.

    +

    Esta é uma lista de strings que contêm os nomes de adaptador de banco de dados back-end.

    +

    The adapter name is the same as used in the DAL connection string. So if +you want to check against PostgreSQL and MSSQL then your db connection +would look as follows:

    +
    db = DAL('sqlite://storage.sqlite', check_reserved=['postgres', 'mssql'])
    +
    +
    +

    A DAL irá analisar as palavras-chave na mesma ordem da lista.

    +

    Existem duas opções extras “todos” e “comum”. Se você especificar tudo, ele irá verificar contra todas as palavras-chave SQL conhecidos. Se você especificar comum, ele só irá verificar contra palavras-chave SQL comuns, tais como `` SELECT``, `` INSERT``, `` update``, etc.

    +

    For supported back ends you may also specify if you would like to check +against the non-reserved SQL keywords as well. In this case you would +append _nonreserved to the name. For example:

    +
    check_reserved=['postgres', 'postgres_nonreserved']
    +
    +
    +

    Os seguintes backends de banco de dados suportar palavras reservadas verificação.

    + + + + + + + + + + + + + + + + + + + + + + + +

    Database

    check_reserved

    ** ** PostgreSQL

    `` Postgres (_nonreserved) ``

    ** ** MySQL

    `` Mysql``

    ** ** FireBird

    `` Firebird (_nonreserved) ``

    ** ** MSSQL

    `` mssql``

    Oráculo

    `` oracle``

    +
    +
    +

    Configurações de quoting e case e do banco de dados

    +

    Citando de entidades SQL são ativadas por padrão em DAL, isto é:

    +

    `` Entity_quoting = True``

    +

    Desta forma, os identificadores são automaticamente citado em SQL gerado pelo DAL. No SQL palavras-chave de nível e identificadores não cotadas são maiúsculas e minúsculas, quoting assim uma SQL identificador torna maiúsculas de minúsculas.

    +
    +

    Note-se que os identificadores não indicada deve sempre ser dobrado para minúsculas pelo motor de back-end acordo com a norma SQL, mas nem todos os motores estão em conformidade com o presente (por exemplo de dobragem PostgreSQL padrão é maiúsculas).

    +
    +

    Por DAL padrão ignora case de campo também, para mudar este uso:

    +

    `` Ignore_field_case = False``

    +

    Para ter certeza de usar os mesmos nomes em python e no esquema DB, você deve organizar para ambas as configurações acima. Aqui está um exemplo:

    +
    db = DAL(ignore_field_case=False)
    +db.define_table('table1', Field('column'), Field('COLUMN'))
    +query = db.table1.COLUMN != db.table1.column
    +
    +
    +
    +
    +

    Fazendo uma conexão segura

    +

    Às vezes é necessário (e recomendado) para se conectar ao seu banco de dados usando conexão segura, especialmente se o seu banco de dados não está no mesmo servidor como a sua aplicação. Neste case, você precisa passar parâmetros adicionais para o driver de banco de dados. Você deve consultar a documentação do driver de banco de dados para obter detalhes.

    +

    Para PostgreSQL com psycopg2 ele deve ser parecido com isto:

    +
    DAL('postgres://user_name:user_password@server_addr/db_name',
    +    driver_args={'sslmode': 'require', 'sslrootcert': 'root.crt',
    +                 'sslcert': 'postgresql.crt', 'sslkey': 'postgresql.key'})
    +
    +
    +

    onde os parâmetros `` sslrootcert``, `` sslcert`` e `` sslkey`` deve conter o caminho completo para os arquivos. Você deve consultar a documentação do PostgreSQL sobre como configurar o servidor PostgreSQL para aceitar conexões seguras.

    +
    +
    +

    Outros parâmetros do construtor DAL

    +
    +

    Local de pasta do banco de dados

    +

    folder sets the place where migration files will be created (see +Migrations for details). By default it’s automatically set within py4web on the same +folder of the database itself, but you have to specify it when using DAL outside py4web.

    +

    Note that for SQLite databases it’s normally necessary, +otherwise you’ll implicitly choose an in memory database (where folder and +migrations don’t have any sense). So these constructors have the same meaning:

    +
    db = DAL('sqlite://storage.sqlite') # folder parameter not specified
    +db = DAL('sqlite:memory')           # in memory database
    +
    +
    +
    +
    +

    Configurações padrão de migração

    +

    The DAL constructor migration settings are booleans affecting defaults +and global behaviour (again, see Migrations for details)

    +

    `` Migrar = True`` define o comportamento de migração padrão para todas as tabelas

    +

    `` Fake_migrate = False`` define o comportamento fake_migrate padrão para todas as tabelas

    +

    `` Migrate_enabled = True`` se definido como desativa falsas todas as migrações

    +

    `` Fake_migrate_all = False`` Se definido como falso migra Verdadeiros todas as tabelas

    +
    +
    +
    +

    `` `` commit`` e rollback``

    +

    The insert, truncate, delete, and update operations aren’t actually +committed until py4web issues the commit command. The create and drop +operations may be executed immediately, depending on the database +engine.

    +

    If you pass db in an action.uses decorator, you don’t need to call +commit in the controller, it is automatically done for you (also, if you use +authenticated or unauthenticated decorator.)

    +
    +

    Dica

    +

    always add db in an action.uses decorator (or use the +authenticated or unauthenticated decorator). +Otherwise you have to add db.commit() in every define_table and +in every table activities: insert(), update(), delete()

    +
    +

    So in actions there is normally no need to ever call +commit or rollback explicitly in py4web unless you need more +granular control.

    +

    But if you executed commands via the shell, you are required +to manually commit:

    +
    >>> db.commit()
    +
    +
    +

    Para verificar isso, vamos inserir um novo registro:

    +
    >>> db.person.insert(name="Bob")
    +2
    +
    +
    +

    and roll de volta, ou seja, ignorar todas as operações desde o último commit:

    +
    >>> db.rollback()
    +
    +
    +

    Se você agora inserir novamente, o contador voltará a ser definido para 2, desde a inserção anterior foi revertida.

    +
    >>> db.person.insert(name="Bob")
    +2
    +
    +
    +

    Code in models, views and controllers is enclosed in py4web code that +looks like this (pseudo code):

    +
    try:
    +    execute models, controller function and view
    +except:
    +    rollback all connections
    +    log the traceback
    +    send a ticket to the visitor
    +else:
    +    commit all connections
    +    save cookies, sessions and return the page
    +
    +
    +
    +
    +
    +

    Construtor Table

    +

    As tabelas são definidos na DAL via `` define_table``.

    +
    +

    assinatura define_table

    +

    A assinatura para o método define_table é:

    +
    define_table(tablename, *fields, **kwargs)
    +
    +
    +

    Ele aceita um nome de tabela de preenchimento obrigatório e um número opcional de `` cases Field`` (mesmo nenhum). Você também pode passar um Table`` objeto (ou subclasse) `` em vez de um `` Field`` um, este clones e adiciona todos os campos (mas o “id”) com a tabela de definição. Outros argumentos de palavra-chave opcionais são: `` rname``, `` redefine``, `` common_filter``, `` fake_migrate``, `` fields``, `` format``, `` migrate``, `` on_define``, `` plural``, `` polymodel``, `` primarykey``, `` sequence_name``, `` singular``, `` table_class``, e `` trigger_name``, que são discutidos abaixo.

    +

    Por exemplo:

    +
    >>> db.define_table('person', Field('name'))
    +<Table person (id, name)>
    +
    +
    +

    Ele define, lojas e retorna um objeto `` Table`` chamado “pessoa” contendo um campo (coluna) “nome”. Este objeto também pode ser acessado via `` db.person``, assim você não precisa pegar o valor retornado pelo define_table.

    +
    +
    +

    `` Id``: Notas sobre a chave primária

    +

    Não declare um campo chamado “id”, porque um é criado por py4web de qualquer maneira. Cada tabela tem um campo chamado “id” por padrão. É um campo inteiro de auto-incremento (geralmente a partir de 1) utilizados para referência cruzada e para fazer cada registro original, assim que “id” é uma chave primária. (Nota: o contador id a partir de 1 é específico back-end Por exemplo, isto não se aplica ao Google App Engine NoSQL..)

    +

    Opcionalmente, você pode definir um campo de “type =” id”`` e py4web usará este campo como campo id auto-incremento. Isso não é recomendado, exceto quando acessar as tabelas de banco de dados legado que têm uma chave primária com um nome diferente. Com alguma limitação, você também pode usar diferentes chaves primárias usando o parâmetro ` primarykey``.

    +
    +
    +

    `` `` Plural`` e singular``

    +

    As pyDAL is a general DAL, it includes plural and singular attributes to +refer to the table names so that external elements can use the proper +name for a table.

    +
    +
    +

    `` Redefine``

    +

    As tabelas podem ser definidas apenas uma vez, mas você pode forçar py4web redefinir uma tabela existente:

    +
    db.define_table('person', Field('name'))
    +db.define_table('person', Field('name'), redefine=True)
    +
    +
    +

    A redefinição pode provocar uma migração se definição tabela muda.

    +
    +
    +

    `` Format``: representação da ficha

    +

    É opcional, mas recomendado para especificar uma representação formato para registros com o parâmetro `` format``.

    +
    db.define_table('person', Field('name'), format='%(name)s')
    +
    +
    +

    ou

    +
    db.define_table('person', Field('name'), format='%(name)s %(id)s')
    +
    +
    +

    ou mesmo os mais complexos usando uma função:

    +
    db.define_table('person', Field('name'),
    +                format=lambda r: r.name or 'anonymous')
    +
    +
    +

    The format attribute will be used for two purposes:

    +
      +
    • To represent referenced records in select/option drop-downs.

    • +
    • To set the db.othertable.otherfield.represent attribute for all fields +referencing this table. This means that the Form constructor will +not show references by id but will use the preferred format +representation instead.

    • +
    +
    +
    +

    `` Rname``: nome real

    +

    rname sets a database backend name for the table. This makes the +py4web table name an alias, and rname is the real name used when +constructing the query for the backend. To illustrate just one use, +rname can be used to provide MSSQL fully qualified table names +accessing tables belonging to other databases on the server: +rname = 'db1.dbo.table1'

    +
    +
    +

    `` Primarykey``: Suporte para tabelas legadas

    +

    primarykey helps support legacy tables with existing primary keys, +even multi-part. See Legacy databases and keyed tables.

    +
    +
    +

    `` Migrate``, `` fake_migrate``

    +

    migrate sets migration options for the table. Refer to +Migrations for details.

    +
    +
    +

    `` Table_class``

    +

    If you define your own table class as a sub-class of +pydal.objects.Table, you can provide it here; this allows you to extend +and override methods. Example:

    +
    from pydal.objects import Table
    +
    +class MyTable(Table):
    +    ...
    +
    +db.define_table(..., table_class=MyTable)
    +
    +
    +
    +
    +

    `` Sequence_name``

    +

    O nome de uma seqüência tabela personalizada (se suportado pelo banco de dados). Pode criar uma seqüência (a partir de 1 e incrementando por 1) ou usar isso para tabelas legadas com seqüências personalizadas.

    +
    +

    Observe que, quando necessário, py4web vai criar seqüências automaticamente por padrão.

    +
    +
    +
    +

    `` Trigger_name``

    +

    Refere-se a `` sequence_name``. Relevante para alguns backends que não suportam campos numéricos auto-incremento.

    +
    +
    +

    `` polymodel``

    +

    For use with Google App Engine.

    +
    +
    +

    `` On_define``

    +

    `` On_define`` é uma chamada de retorno acionado quando um lazy_table é instanciado, embora ela é chamada de qualquer maneira, se a tabela não é preguiçoso. Isso permite que mudanças dinâmicas para a mesa sem perder as vantagens de instanciação adiada.

    +

    Exemplo:

    +
    db = DAL(lazy_tables=True)
    +db.define_table('person',
    +    Field('name'),
    +    Field('age', 'integer'),
    +    on_define=lambda table: [
    +        table.name.set_attributes(requires=IS_NOT_EMPTY(), default=''),
    +        table.age.set_attributes(requires=IS_INT_IN_RANGE(0, 120), default=30) ])
    +
    +
    +

    Nota Este exemplo mostra como usar `` on_define`` mas não é realmente necessário. O simples `` valores requires`` poderiam ser adicionados às definições de campo ea mesa ainda seria preguiçoso. No entanto, `` requires`` que tomar um objeto definido como o primeiro argumento, como IS_IN_DB, vai fazer uma consulta como `` db.sometable.somefield == some_value`` que causaria `` sometable`` a ser definido no início . Esta é a situação salvos por `` on_define``.

    +
    +
    +

    Adicionando atributos para campos e tabelas

    +

    Se você precisa adicionar atributos personalizados aos campos, você pode simplesmente fazer isso: `` db.table.field.extra = {} ``

    +

    “extra” is not a keyword; it’s a custom attribute now attached to the +field object. You can do it with tables too but they must be preceded by +an underscore to avoid naming conflicts with fields:

    +
    db.table._extra = {}
    +
    +
    +
    +
    +

    Bancos de dados legados e tabelas com chave

    +

    py4web pode se conectar a bancos de dados legados sob algumas condições.

    +

    The easiest way is when these conditions are met:

    +
      +
    • Each table must have a unique auto-increment integer field called “id”.

    • +
    • Records must be referenced exclusively using the “id” field.

    • +
    +

    Ao acessar uma tabela existente, isto é, uma tabela não criado por py4web no aplicativo atual, sempre definir `` migrar = False``.

    +

    If the legacy table has an auto-increment integer field but it is not +called “id”, py4web can still access it but the table definition must +declare the auto-increment field with ‘id’ type (that is using +Field('...', 'id')).

    +

    Finalmente se a tabela de legado usa uma chave primária que não é um campo id auto-incremento é possível usar uma “mesa com chave”, por exemplo:

    +
    db.define_table('account',
    +                Field('accnum', 'integer'),
    +                Field('acctype'),
    +                Field('accdesc'),
    +                primarykey=['accnum', 'acctype'],
    +                migrate=False)
    +
    +
    +
      +
    • `` Primarykey`` é uma lista dos nomes de campo que compõem a chave primária.

    • +
    • Todos os campos PrimaryKey tem um `` NÃO NULL`` definido, mesmo se não especificado.

    • +
    • Tabelas com chave só podem referenciar outras tabelas com chave.

    • +
    • Campos de referência devem usar o reference tablename.fieldname.

    • +
    • A `` função update_record`` não está disponível para filas de mesas com chave.

    • +
    +
    +

    Atualmente tabelas chaveadas são suportadas apenas para DB2, MSSQL, Ingres e Informix, mas serão adicionados outros engines.

    +
    +

    No momento da escrita, não podemos garantir que os `` obras de atributos primarykey`` com cada mesa legado existente e cada backend de banco de dados suportado. Para simplificar, recomendamos, se possível, criando uma visão do banco de dados que tem um campo id auto-incremento.

    +
    +
    +
    +

    Construtor Field

    +

    Estes são os valores padrão de um construtor de campo:

    +
    Field(fieldname, type='string', length=None, default=DEFAULT,
    +      required=False, requires=DEFAULT,
    +      ondelete='CASCADE', notnull=False, unique=False,
    +      uploadfield=True, widget=None, label=None, comment=None,
    +      writable=True, readable=True, searchable=True, listable=True,
    +      update=None, authorize=None, autodelete=False, represent=None,
    +      uploadfolder=None, uploadseparate=None, uploadfs=None,
    +      compute=None, filter_in=None, filter_out=None,
    +      custom_qualifier=None, map_none=None, rname=None)
    +
    +
    +

    onde padrão é um valor especial usado para permitir que o valor Nenhum para um parâmetro.

    +

    Nem todos eles são relevantes para todos os campos. `` Length`` é relevante apenas para campos do tipo “string”. `` Uploadfield``, `` authorize``, e `` autodelete`` são relevantes apenas para campos do tipo “Upload”. `` Ondelete`` é relevante apenas para campos do tipo “referência” e “Upload”.

    +
      +
    • `` Length`` define o comprimento máximo de uma “string”, “password” ou campo “Upload”. Se `` length`` não for especificado um valor padrão é usado, mas o valor padrão não é garantido para ser compatível. * Para evitar migrações indesejadas em upgrades, recomendamos que você sempre especificar o comprimento de campos de cordas, senha e upload. *

    • +
    • `` Default`` define o valor padrão para o campo. O valor padrão é utilizada quando se realiza uma inserção se um valor não for especificado explicitamente. É também usado para formas construídas a partir da tabela usando `` Form``-preencher previamente. Note, em vez de ser um valor fixo, o padrão em vez disso pode ser uma função (incluindo uma função lambda) que retorna um valor do tipo apropriado para o campo. Nesse case, a função é chamada uma vez para cada registro inserido, mesmo quando vários registros são inseridos em uma única transação.

    • +
    • `` Required`` conta a DAL que nenhuma inserção deve ser permitido nesta tabela se um valor para este campo não é especificado explicitamente.

    • +
    • requires is a validator or a list of validators. This is not used +by the DAL, but instead it is used by Form (this will be explained +better on the Forumlários chapter). The default validators for +the given types are shown in the next section +Field types and validators.

      +
      +

      Nota

      +

      while requires=... is enforced at the level of forms, +required=True is enforced at the level of the DAL (insert). In +addition, notnull, unique and ondelete are enforced at +the level of the database. While they sometimes may seem redundant, +it is important to maintain the distinction when programming with the +DAL.

      +
      +
    • +
    • `` Rname`` fornece o campo com um “nome real”, um nome para o campo conhecido para o adaptador de banco de dados; quando o campo é usado, ele é o valor rname que é enviado para o banco de dados. O nome py4web para o campo é então efetivamente um alias.

    • +
    • `` Ondelete`` traduz na “ON DELETE” instrução SQL. Por padrão, ele é definido como “em cascata”. Isso diz ao banco de dados que quando se exclui um registro, ele também deve excluir todos os registros que se referem a ele. Para desativar este recurso, conjunto de `` ondelete`` a “nenhuma acção” ou “NULL SET”.

    • +
    • `` Notnull = True`` se traduz na “NOT NULL” instrução SQL. Ela impede que a banco de dados a partir da inserção de valores nulos para o campo.

    • +
    • `` Unique = True`` se traduz na instrução SQL “único” e ele garante que os valores deste campo são exclusivos dentro da tabela. Ela é aplicada no nível de banco de dados.

    • +
    • uploadfield applies only to fields of type “upload”. A field of +type “upload” stores the name of a file saved somewhere else, by +default on the filesystem under the application “uploads/” folder. If +uploadfield is set to True, then the file is stored in a blob +field within the same table and the value of uploadfield is the +name of the blob field. This will be discussed in more detail later +in More on uploads.

    • +
    • uploadfolder must be set to a location where to store uploaded files. +The scaffolding app defines a folder settings.UPLOAD_FOLDER +which points to apps/{app_name}/uploads so you can +set, for example, Field(... uploadfolder=settings.UPLOAD_FOLDER).

    • +
    • uploadseparate if set to True will upload files under different +subfolders of the uploadfolder folder. This is optimized to avoid +too many files under the same folder/subfolder. ATTENTION: You cannot +change the value of uploadseparate from True to False without +breaking links to existing uploads. pydal either uses the separate +subfolders or it does not. Changing the behavior after files have +been uploaded will prevent pydal from being able to retrieve those +files. If this happens it is possible to move files and fix the +problem but this is not described here.

    • +
    • `` Uploadfs`` permite que você especificar um sistema de arquivos diferente, onde fazer o upload de arquivos, incluindo um armazenamento Amazon S3 ou um armazenamento de SFTP remoto.

    • +
    +
    +

    Você precisa ter PyFileSystem instalado para que isso funcione. `` Uploadfs`` deve apontar para PyFileSystem.

    +
    +
      +
    • autodelete determines if the corresponding uploaded file should +be deleted when the record referencing the file is deleted. For +“upload” fields only. However, records deleted by the database itself +due to a CASCADE operation will not trigger py4web’s autodelete.

    • +
    • label is a string (or a helper or something that can be +serialized to a string) that contains the label to be used for this +field in auto-generated forms. +serialized to a string) that contains a comment associated with this +field, and will be displayed to the right of the input field in the +autogenerated forms.

    • +
    • `` Writable`` declara se um campo é gravável em formulários.

    • +
    • `` Readable`` declara se um campo é legível em formulários. Se um campo não é nem legível, nem gravável, não será exibido em criar e atualizar formas.

    • +
    • `` Update`` contém o valor padrão para este campo quando o registro é atualizado.

    • +
    • `` Compute`` é uma função opcional. Se um registro é inserido ou atualizado, a função de computação será executado eo campo será preenchido com o resultado da função. O registro é passado para a função de computação como um `` dict``, eo dict não incluirá o valor atual de que, ou qualquer outro campo de computação.

    • +
    • `` Authorize`` pode ser usado para exigir o controle de acesso no campo correspondente, para apenas os campos “Upload”. Ele será discutido mais em detalhe no contexto de autenticação e autorização.

    • +
    • widget do not use DAL widgets with py4web, it has has its own +(see Widgets later).

    • +
    • represent can be None or can point to a function that takes a +field value and returns an alternate representation for the field +value.

    • +
    +

    Note not all the attributes are thread safe and most of them +should only be set globally for an app. The following are guaranteed to be +thread safe and be set/reset in any action: +default, update, readable, writable, requires.

    +
    +

    Field types and validators

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Type

    Default validators

    `` String``

    `` IS_LENGTH (comprimento) `` comprimento padrão é 512

    `` text``

    `` IS_LENGTH (comprimento) `` comprimento padrão é 32.768

    `` blob``

    `` Comprimento padrão None`` é 2 ** 31 (2 GIB)

    `` boolean``

    `` None``

    `` integer``

    `` IS_INT_IN_RANGE (** -2 31, 2 ** 31) ``

    `` Double``

    `` IS_FLOAT_IN_RANGE (-1e100, 1e100) ``

    `` Decimal (n, m) ``

    IS_DECIMAL_IN_RANGE(-10**10, 10**10)

    `` date``

    `` IS_DATE () ``

    `` Time``

    `` IS_TIME () ``

    `` datetime``

    `` IS_DATETIME () ``

    `` password``

    `` IS_LENGTH (comprimento) `` comprimento padrão é 512

    `` Upload``

    `` Comprimento padrão é 512 None``

    `` Referência <table> ``

    `` IS_IN_DB (db, table.field, formato) ``

    `` Lista: string``

    `` None``

    `` Lista: integer``

    `` None``

    `` Lista: referência <table> ``

    IS_IN_DB(db, table._id, format, multiple=True)

    `` json``

    `` IS_EMPTY_OR (IS_JSON ()) `` comprimento padrão é 512

    `` bigint``

    `` IS_INT_IN_RANGE (** -2 63, 2 ** 63) ``

    `` Grande-id``

    `` None``

    `` Grande-reference``

    `` None``

    +

    Decimal requer e devolve valores como `` objectos Decimal``, como definidos na Python `` decimal`` módulo. SQLite não lidar com o `` decimal`` tipo assim internamente que tratá-lo como um `` double``. O (n, m) são o número de dígitos no total e o número de dígitos após o ponto decimal, respectivamente.

    +

    A `` grande-id`` e, `` grande-reference`` são suportados apenas por alguns dos mecanismos de bases de dados e são experimentais. Eles não são normalmente usados ​​como tipos de campo a menos de tabelas legadas, no entanto, o construtor DAL tem um argumento `` bigint_id`` que, quando definido para `` True`` faz com que os `` campos id`` e `` campos reference`` `` grande-id`` e `` grande-reference`` respectivamente.

    +

    The list:<type> fields are special because they are designed to take +advantage of certain denormalization features on NoSQL (in the case of +Google App Engine NoSQL, the field types ListProperty and +StringListProperty) and back-port them all the other supported +relational databases. On relational databases lists are stored as a +text field. The items are separated by a | and each | in +string item is escaped as a ||. They are discussed in +`` Lista: <type> `` e `` contains``.

    +

    The json field type is pretty much explanatory. It can store any +JSON serializable object. It is designed to work specifically for +MongoDB and backported to the other database adapters for portability.

    +

    blob fields are also special. By default, binary data is encoded in +base64 before being stored into the actual database field, and it is +decoded when extracted. This has the negative effect of using 33% more +storage space than necessary in blob fields, but has the advantage of +making the communication independent of the back-end specific escaping +conventions.

    +
    +
    +

    modificação da tabela e campo em tempo de execução

    +

    A maioria dos atributos de campos e tabelas podem ser modificados depois que eles são definidos:

    +
    >>> db.define_table('person', Field('name', default=''), format='%(name)s')
    +<Table person (id, name)>
    +>>> db.person._format = '%(name)s/%(id)s'
    +>>> db.person.name.default = 'anonymous'
    +
    +
    +

    aviso de que os atributos de tabelas são geralmente precedido por um sublinhado para evitar conflitos com possíveis nomes de campo.

    +

    Você pode listar as tabelas que foram definidos para uma determinada conexão com o banco:

    +
    >>> db.tables
    +['person']
    +
    +
    +

    Você pode consultar para o tipo de uma tabela:

    +
    >>> type(db.person)
    +<class 'pydal.objects.Table'>
    +
    +
    +

    Você pode acessar uma tabela utilizando diferentes sintaxes:

    +
    >>> db.person is db['person']
    +True
    +
    +
    +

    Você também pode listar os campos que foram definidos para uma determinada tabela:

    +
    >>> db.person.fields
    +['id', 'name']
    +
    +
    +

    Da mesma forma você pode acessar campos de seu nome de várias maneiras equivalentes:

    +
    >>> type(db.person.name)
    +<class 'pydal.objects.Field'>
    +>>> db.person.name is db.person['name']
    +True
    +
    +
    +

    Dado um campo, você pode acessar os atributos definidos em sua definição:

    +
    >>> db.person.name.type
    +string
    +>>> db.person.name.unique
    +False
    +>>> db.person.name.notnull
    +False
    +>>> db.person.name.length
    +32
    +
    +
    +

    incluindo a sua tabela pai, tablename, e ligação parent:

    +
    >>> db.person.name._table == db.person
    +True
    +>>> db.person.name._tablename == 'person'
    +True
    +>>> db.person.name._db == db
    +True
    +
    +
    +

    Um campo também tem métodos. Alguns deles são utilizados para consultas de construção e vamos vê-los mais tarde. Um método especial do objeto de campo é `` validate`` e chama os validadores para o campo.

    +
    >>> db.person.name.validate('John')
    +('John', None)
    +
    +
    +

    que retorna um tuplo `` (valor, erro) . `` `` Error é None`` se a entrada passa a validação.

    +
    +
    +

    Mais sobre envios

    +

    Considere o seguinte modelo:

    +
    db.define_table('myfile',
    +                Field('image', 'upload', default='path/to/file'))
    +
    +
    +

    No case de um campo de “carregamento”, o valor padrão pode, opcionalmente, ser definida como um caminho (um caminho absoluto ou um caminho relativo para a pasta aplicativo atual), o valor padrão é então atribuído a cada novo registro que não especifica um imagem.

    +

    Observe que desta forma vários registros podem acabar com referência ao mesmo arquivo de imagem padrão e isso poderia ser um problema em um campo ter `` autodelete`` habilitado. Quando você não quer permitir duplicatas para o campo de imagem (ou seja, vários registros referenciando o mesmo arquivo), mas ainda quer definir um valor padrão para o “carregamento”, então você precisa de uma forma de copiar o arquivo padrão para cada novo registro que faz não especificar uma imagem. Isto pode ser obtido usando um arquivo-como objeto referenciando o arquivo padrão como o argumento `` default`` ao campo, ou mesmo com:

    +
    Field('image', 'upload', default=dict(data='<file_content>', filename='<file_name>'))
    +
    +
    +

    Normalmente uma inserção é feita automaticamente através de um `` Form`` mas ocasionalmente você já tem o arquivo no sistema de arquivos e quer enviá-lo por meio de programação. Isso pode ser feito da seguinte maneira:

    +
    with open(filename, 'rb') as stream:
    +    db.myfile.insert(image=db.myfile.image.store(stream, filename))
    +
    +
    +

    Também é possível inserir um arquivo de uma forma mais simples e tem a chamada de método de inserção `` store`` automaticamente:

    +
    with open(filename, 'rb') as stream:
    +    db.myfile.insert(image=stream)
    +
    +
    +

    Neste case, o nome do ficheiro é obtido a partir do objecto corrente, se disponível.

    +

    O método store` do objeto campo carregamento leva um fluxo de arquivo e um nome de arquivo. Ele usa o nome do arquivo para determinar a extensão (tipo) do arquivo, cria um novo nome temporário para o arquivo (de acordo com mecanismo de upload py4web) e carrega o conteúdo do arquivo neste novo arquivo temporário (sob os envios de pasta salvo indicação em contrário). Ele retorna o novo nome temp, que é então armazenada no campo `` image`` da tabela `` db.myfile``.

    +

    Note, se o arquivo deve ser armazenado em um campo blob associado ao invés do sistema de arquivos, o método store` não irá inserir o arquivo no campo blob (porque` store` é chamado antes da inserção), portanto, o arquivo deve ser explicitamente inserido no campo blob:

    +
    db.define_table('myfile',
    +                Field('image', 'upload', uploadfield='image_file'),
    +                Field('image_file', 'blob'))
    +with open(filename, 'rb') as stream:
    +    db.myfile.insert(image=db.myfile.image.store(stream, filename),
    +                     image_file=stream.read())
    +
    +
    +

    O método retrieve` faz o oposto do` store`.

    +

    Quando os arquivos enviados são armazenados no sistema de arquivos (como no case de um `` Field ( “imagem” simples, “upload”) ``) o código:

    +
    row = db(db.myfile).select().first()
    +(filename, fullname) = db.myfile.image.retrieve(row.image, nameonly=True)
    +
    +
    +

    recupera o nome do arquivo original (filename) como visto pelo usuário em tempo de upload e o nome do arquivo armazenado (fullname, com caminho relativo para a pasta da aplicação). Embora, em geral, a chamada:

    +
    (filename, stream) = db.myfile.image.retrieve(row.image)
    +
    +
    +

    recupera o nome original do arquivo (filename) e um arquivo-como objeto pronto para dados de arquivo de acesso carregado (stream).

    +
    +

    Observe que o fluxo retornado por `` retrieve`` é um objeto de arquivo real no case de que os arquivos enviados são armazenados no sistema de arquivos. Nesse case, lembre-se de fechar o arquivo quando você é feito, chamando `` stream.close () ``.

    +
    +

    Aqui está um exemplo de uso seguro do `` retrieve``:

    +
    from contextlib import closing
    +import shutil
    +row = db(db.myfile).select().first()
    +(filename, stream) = db.myfile.image.retrieve(row.image)
    +with closing(stream) as src, closing(open(filename, 'wb')) as dest:
    +    shutil.copyfileobj(src, dest)
    +
    +
    +
    +
    +
    +

    Migrações

    +

    With our example table definition:

    +
    db.define_table('person')
    +
    +
    +

    define_table checks whether or not the corresponding table exists. +If it does not, it generates the SQL to create it and executes the SQL. +If the table does exist but differs from the one being defined, it +generates the SQL to alter the table and executes it. If a field has +changed type but not name, it will try to convert the data (If you do +not want this, you need to redefine the table twice, the first time, +letting py4web drop the field by removing it, and the second time adding +the newly defined field so that py4web can create it). If the table +exists and matches the current definition, it will leave it alone. In +all cases it will create the db.person object that represents the +table.

    +

    Referimo-nos a esse comportamento como uma “migração”. py4web registra todas as migrações e migração tentativas no arquivo “Sql.log”.

    +
    +

    Nota

    +

    by default py4web uses the “app/databases” folder for the +log file and all other migration files it needs. You can change this +setting by changing the folder argument to DAL. To set a different +log file name, for example “migrate.log” you can do +db = DAL(..., adapter_args=dict(logfile='migrate.log'))

    +
    +

    The first argument of define_table is always the table name. The +other unnamed arguments are the fields. The function also takes +an optional keyword argument called “migrate”:

    +
    db.define_table('person', ..., migrate='person.table')
    +
    +
    +

    O valor de migrar é o nome do arquivo onde as informações lojas py4web migração interna para esta tabela. Esses arquivos são muito importantes e nunca deve ser removido enquanto existirem as tabelas correspondentes. Nos cases em que uma tabela foi descartado eo arquivo correspondente ainda existem, ele pode ser removido manualmente. Por padrão, migre é definida como True. Este causas py4web para gerar o nome do arquivo a partir de um hash da string de conexão. Se migre é definida como falso, a migração não é realizada, e py4web assume que a tabela existe no armazenamento de dados e que contém (pelo menos) os campos listados no `` define_table``.

    +

    Não pode haver duas tabelas no mesmo aplicativo com o mesmo nome migrar.

    +

    A classe DAL também leva um argumento “migrar”, que determina o valor padrão de migrar para chamadas para `` define_table``. Por exemplo,

    +
    db = DAL('sqlite://storage.sqlite', migrate=False)
    +
    +
    +

    irá definir o valor padrão de migrar para Falso quando `` db.define_table`` é chamado sem um argumento migrar.

    +
    +

    Nota

    +

    py4web only migrates new columns, removed columns, and +changes in column type (except in SQLite). py4web does not migrate +changes in attributes such as changes in the values of default, +unique, notnull, and ondelete.

    +
    +

    As migrações podem ser desativado para todas as tabelas de uma só vez:

    +
    db = DAL(..., migrate_enabled=False)
    +
    +
    +

    This is the recommended behavior when two apps share the same database. +Only one of the two apps should perform migrations, the other should +disable them.

    +
    +

    Fixação migrações quebrados

    +

    Há dois problemas comuns com as migrações e existem formas de recuperar a partir deles.

    +

    Um problema é específico com SQLite. SQLite não impor tipos de coluna e não pode soltar colunas. Isto significa que se você tiver uma coluna do tipo string e você removê-lo, não é realmente removido. Se você adicionar a coluna novamente com um tipo diferente (por exemplo, data e hora) você acaba com uma coluna de data e hora que contém strings (lixo para fins práticos). não py4web não reclamar sobre isso, porque ele não sabe o que está no banco de dados, até que ele tenta recuperar registros e falha.

    +

    Se py4web retorna um erro em alguma função de análise ao selecionar registros, muito provavelmente isso é devido a dados corrompidos em uma coluna por causa da questão acima.

    +

    A solução consiste em actualizar todos os registos da tabela e a actualização dos valores na coluna em questão com Nenhum.

    +

    O outro problema é mais genérico, mas típico com MySQL. O MySQL não permitem mais de um ALTER TABLE em uma transação. Isto significa que py4web deve quebrar transações complexas em partes menores (um ALTER TABLE na época) e cometem uma peça no momento. Por isso, é possível que parte de uma transação complexa fica comprometida e uma parte falhar, deixando py4web em um estado corrompido. Por que parte de uma transação falhar? Uma vez que, por exemplo, envolve a alteração de uma tabela de conversão e uma coluna de strings dentro de uma coluna de data e hora, tentativas py4web para converter os dados, mas os dados não podem ser convertidos. O que acontece com py4web? Ele fica confuso sobre o que exatamente é a estrutura da tabela realmente armazenados no banco de dados.

    +

    A solução consiste em permitir migrações falsos:

    +
    db.define_table(...., migrate=True, fake_migrate=True)
    +
    +
    +

    Isto irá reconstruir metadados py4web sobre a tabela de acordo com a definição da tabela. Tente várias definições de tabela para ver qual delas funciona (aquele antes da migração falhou ea uma após a migração falhou). Uma vez que remove sucesso do `` fake_migrate = True`` parâmetro.

    +

    Before attempting to fix migration problems it is prudent to make a copy +of “yourapp/databases/*.table” files.

    +

    Migração problemas também pode ser fixada para todas as tabelas de uma só vez:

    +
    db = DAL(..., fake_migrate_all=True)
    +
    +
    +

    Isso também falhará se o modelo descreve tabelas que não existem no banco de dados, mas pode ajudar a estreitar o problema.

    +
    +
    +

    Migração resumo controle

    +

    A lógica dos vários argumentos de migração estão resumidos neste pseudo-código:

    +
    if DAL.migrate_enabled and table.migrate:
    +   if DAL.fake_migrate_all or table.fake_migrate:
    +       perform fake migration
    +   else:
    +       perform migration
    +
    +
    +
    +
    +
    +

    Table methods

    +
    +

    `` Insert``

    +

    Dada uma tabela, você pode inserir registros

    +
    >>> db.person.insert(name="Alex")
    +1
    +>>> db.person.insert(name="Bob")
    +2
    +
    +
    +

    Inserir retorna o valor único “id” de cada registro inserido.

    +

    Você pode truncar a tabela, ou seja, excluir todos os registros e reinicie o contador do id.

    +
    >>> db.person.truncate()
    +
    +
    +

    Agora, se você inserir um registro novo, o contador recomeça a 1 (isto é específico back-end e não se aplica ao Google NoSQL):

    +
    >>> db.person.insert(name="Alex")
    +1
    +
    +
    +

    Observe que você pode passar um parâmetro para `` truncate``, por exemplo, você pode dizer SQLite para reiniciar o contador id.

    +
    >>> db.person.truncate('RESTART IDENTITY CASCADE')
    +
    +
    +

    O argumento é em SQL puro e, portanto, específico do motor.

    +

    py4web também fornece um método bulk_insert

    +
    >>> db.person.bulk_insert([{'name': 'Alex'}, {'name': 'John'}, {'name': 'Tim'}])
    +[3, 4, 5]
    +
    +
    +

    É preciso uma lista de dicionários de campos a serem inseridas e executa várias inserções ao mesmo tempo. Ele retorna a lista de valores “id” dos registros inseridos. Nos bancos de dados relacionais suportadas não há nenhuma vantagem em usar esta função ao invés de looping e realizando inserções individuais, mas no Google App Engine NoSQL, há uma grande vantagem de velocidade.

    +
    +
    +

    `` Query``, `` Set``, `` Rows``

    +

    Vamos considerar novamente a tabela definida (e caiu) anteriormente e inserir três registros:

    +
    >>> db.define_table('person', Field('name'))
    +<Table person (id, name)>
    +>>> db.person.insert(name="Alex")
    +1
    +>>> db.person.insert(name="Bob")
    +2
    +>>> db.person.insert(name="Carl")
    +3
    +
    +
    +

    Você pode armazenar a tabela em uma variável. Por exemplo, com variável `` Person``, você poderia fazer:

    +
    >>> person = db.person
    +
    +
    +

    Você também pode armazenar um campo em uma variável como `` name``. Por exemplo, você também pode fazer:

    +
    >>> name = person.name
    +
    +
    +

    Você pode até criar uma consulta (usando operadores como ==, =, <,>, <=,> =, como, pertence!) E armazenar a consulta em uma variável `` q`` tal como em:

    +
    >>> q = name == 'Alex'
    +
    +
    +

    Quando você chamar `` db`` com uma consulta, você define um conjunto de registros. Você pode armazená-lo em uma variável `` s`` e escreve:

    +
    >>> s = db(q)
    +
    +
    +

    Observe que nenhuma consulta de banco de dados foi realizada até agora. DAL + consulta simplesmente definir um conjunto de registros neste db que correspondem a consulta. py4web determina a partir da consulta que tabela (ou tabelas) estão envolvidos e, de fato, não há necessidade de especificar isso.

    +
    +
    +

    `` Update_or_insert``

    +

    Algumas vezes você precisa executar uma inserção somente se não há nenhum registro com os mesmos valores como aqueles que estão sendo inseridos. Isso pode ser feito com

    +
    db.define_table('person',
    +                Field('name'),
    +                Field('birthplace'))
    +
    +db.person.update_or_insert(name='John', birthplace='Chicago')
    +
    +
    +

    O registro será inserido somente se não houver nenhum outro usuário chamado John nascido em Chicago.

    +

    Você pode especificar quais valores usar como uma chave para determinar se existe o registro. Por exemplo:

    +
    db.person.update_or_insert(db.person.name == 'John',
    +                           name='John',
    +                           birthplace='Chicago')
    +
    +
    +

    e se houver John sua terra natal será atualizado então um novo registro será criado.

    +

    Os critérios de selecção no exemplo acima é um único campo. Ele também pode ser uma consulta, tais como

    +
    db.person.update_or_insert((db.person.name == 'John') & (db.person.birthplace == 'Chicago'),
    +                           name='John',
    +                           birthplace='Chicago',
    +                           pet='Rover')
    +
    +
    +
    +
    +

    `` Validate_and_insert``, `` validate_and_update``

    +

    A função

    +
    ret = db.mytable.validate_and_insert(field='value')
    +
    +
    +

    funciona muito bem como

    +
    id = db.mytable.insert(field='value')
    +
    +
    +

    except that it calls the validators for the fields before performing the +insert and bails out if the validation does not pass. If validation does +not pass the errors can be found in ret["errors"]. ret["errors"] holds +a key-value mapping where each key is the field name whose validation +failed, and the value of the key is the result from the validation error +(much like form["errors"]). If it passes, the id of the new record is +in ret["id"]. Mind that normally validation is done by the form +processing logic so this function is rarely needed.

    +

    Similarmente

    +
    ret = db(query).validate_and_update(field='value')
    +
    +
    +

    funciona muito da mesma forma como

    +
    num = db(query).update(field='value')
    +
    +
    +

    except that it calls the validators for the fields before performing the +update. Notice that it only works if query involves a single table. The +number of updated records can be found in ret["updated"] and errors +will be in ret["errors"].

    +
    +
    +

    `` Drop``

    +

    Finalmente, você pode soltar tabelas e todos os dados serão perdidos:

    +
    db.person.drop()
    +
    +
    +
    +
    +

    Marcação de registros

    +

    Etiquetas permite adicionar ou encontrar propriedades anexadas aos registros em seu banco de dados.

    +
    from py4web import DAL, Field
    +from pydal.tools.tags import Tags
    +
    +db = DAL("sqlite:memory")
    +db.define_table("thing", Field("name"))
    +id1 = db.thing.insert(name="chair")
    +id2 = db.thing.insert(name="table")
    +properties = Tags(db.thing)
    +properties.add(id1, "color/red")
    +properties.add(id1, "style/modern")
    +properties.add(id2, "color/green")
    +properties.add(id2, "material/wood")
    +
    +assert properties.get(id1) == ["color/red", "style/modern"]
    +assert properties.get(id2) == ["color/green", "material/wood"]
    +
    +rows = db(properties.find(["style/modern"])).select()
    +assert rows.first().id == id1
    +
    +rows = db(properties.find(["material/wood"])).select()
    +assert rows.first().id == id2
    +
    +rows = db(properties.find(["color"])).select()
    +assert len(rows) == 2
    +
    +
    +

    Tags are hierarchical. Then find([“color”]) would return id1 and id2 +because both records have tags with “color”.

    +

    It is internally implemented with the creation of an additional table, which in +this example would be db.thing_tags_default, because no tail was +specified on the Tags(table, tail=“default”) constructor.

    +

    py4web uses Tags as a flexible mechanism to manage permissions, we’ll see +all the details later on the Authorization using Tags chapter.

    +
    +
    +
    +

    Raw SQL

    +
    +

    `` executesql``

    +

    A DAL permite emitir explicitamente instruções SQL.

    +
    >>> db.executesql('SELECT * FROM person;')
    +[(1, u'Massimo'), (2, u'Massimo')]
    +
    +
    +

    Neste case, os valores de retorno não são analisados ​​ou transformados pela DAL, eo formato depende do driver de banco de dados específico. Este uso com selecciona normalmente não é necessário, mas é mais comum com índices.

    +

    `` Executesql`` leva cinco argumentos opcionais: `` placeholders``, `` as_dict``, `` fields``, `` colnames``, e `` as_ordered_dict``.

    +

    `` Placeholders`` é uma seqüência opcional de valores a serem substituídos ou, se suportado pelo driver DB, um dicionário com chaves correspondentes chamado espaços reservados no seu SQL.

    +

    If as_dict is set to True, the results cursor returned by the DB +driver will be converted to a sequence of dictionaries keyed with the db +field names. Results returned with as_dict = True are the same as +those returned when applying as_list() to a normal select:

    +
    [{'field1': val1_row1, 'field2': val2_row1}, {'field1': val1_row2, 'field2': val2_row2}]
    +
    +
    +

    `` As_ordered_dict`` é muito bonito como `` as_dict`` mas os antigos garante que a ordem dos resultando campos (teclas OrderedDict) refletem a ordem em que eles são retornados de DB motorista:

    +
    [OrderedDict([('field1', val1_row1), ('field2', val2_row1)]),
    + OrderedDict([('field1', val1_row2), ('field2', val2_row2)])]
    +
    +
    +

    O argumento `` fields`` é uma lista de objetos DAL de campo que correspondem aos campos retornados da DB. Os objectos de campo devem ser parte de um ou mais objectos Tabela definido no objecto DAL. A `` lista fields`` pode incluir um ou mais DAL Tabela objetos em adição a ou em vez de incluir Campo objetos, ou pode ser apenas uma única tabela (não de uma lista). Nesse case, os objectos de campo vai ser extraído da tabela (s).

    +

    Em vez de especificar o argumento `` fields``, o argumento `` colnames`` pode ser especificado como uma lista de nomes de campos em formato tabela.campo. Novamente, estes devem representar tabelas e campos definidos no objeto DAL.

    +

    Também é possível especificar `` fields`` eo associado `` colnames``. Nesse case, `` fields`` pode também incluir objetos Expressão DAL, além de objetos de campo. Para objetos de campo em “campos”, o associado `` colnames`` ainda deve estar no formato tabela.campo. Para Expression objetos em `` fields``, o associado `` colnames`` podem ser quaisquer rótulos arbitrários.

    +

    Observe, a Tabela DAL objectos referidos por `` fields`` ou `` colnames`` pode ser fictícios mesas e não têm para representar todas as tabelas reais no banco de dados. Além disso, nota que o `` fields`` e `` colnames`` devem estar na mesma ordem que os campos nos resultados cursor retornado do DB.

    +
    +
    +

    `` _Lastsql``

    +

    Se SQL foi executado manualmente usando ExecuteSQL ou foi SQL gerado pelo DAL, você sempre pode encontrar o código SQL em `` db._lastsql``. Isso é útil para fins de depuração:

    +
    >>> rows = db().select(db.person.ALL)
    +>>> db._lastsql
    +SELECT person.id, person.name FROM person;
    +
    +
    +
    +

    py4web never generates queries using the “*” operator. py4web is +always explicit when selecting fields.

    +
    +
    +
    +

    Temporização de consultas

    +

    All queries are automatically timed by py4web. The variable +db._timings is a list of tuples. Each tuple contains the raw SQL +query as passed to the database driver and the time it took to execute +in seconds.

    +
    +
    +

    Índices

    +

    Atualmente, a API DAL não fornece um comando para criar índices em tabelas, mas isso pode ser feito usando o comando `` executesql``. Isso ocorre porque a existência de índices pode fazer migrações complexa, e é melhor para lidar com eles de forma explícita. Os índices podem ser necessários para esses campos que são usados ​​em consultas recorrentes.

    +

    Aqui está um exemplo de como:

    +
    db = DAL('sqlite://storage.sqlite')
    +db.define_table('person', Field('name'))
    +db.executesql('CREATE INDEX IF NOT EXISTS myidx ON person (name);')
    +
    +
    +

    Outros dialetos banco de dados têm sintaxes muito semelhantes, mas pode não suportar o opcional “SE NÃO EXISTE” directiva.

    +
    +
    +

    Generating raw SQL

    +

    Às vezes você precisa para gerar o SQL, mas não executá-lo. Isso é fácil de fazer com py4web uma vez que cada comando que executa banco de dados IO tem um comando equivalente que não, e simplesmente retorna o SQL que teriam sido executados. Estes comandos têm os mesmos nomes e sintaxe como os funcionais, mas eles começam com um sublinhado:

    +

    Aqui é `` _insert``

    +
    >>> print(db.person._insert(name='Alex'))
    +INSERT INTO "person"("name") VALUES ('Alex');
    +
    +
    +

    Aqui é `` _count``

    +
    >>> print(db(db.person.name == 'Alex')._count())
    +SELECT COUNT(*) FROM "person" WHERE ("person"."name" = 'Alex');
    +
    +
    +

    Aqui é `` _select``

    +
    >>> print(db(db.person.name == 'Alex')._select())
    +SELECT "person"."id", "person"."name" FROM "person" WHERE ("person"."name" = 'Alex');
    +
    +
    +

    Aqui é `` _delete``

    +
    >>> print(db(db.person.name == 'Alex')._delete())
    +DELETE FROM "person" WHERE ("person"."name" = 'Alex');
    +
    +
    +

    E, finalmente, aqui é `` _update``

    +
    >>> print(db(db.person.name == 'Alex')._update(name='Susan'))
    +UPDATE "person" SET "name"='Susan' WHERE ("person"."name" = 'Alex');
    +
    +
    +
    +

    Além disso, você sempre pode usar `` db._lastsql`` para retornar o código SQL mais recente, se foi executada manualmente usando ExecuteSQL ou foi SQL gerado pelo DAL.

    +
    +
    +
    +
    +

    `` Comando SELECT``

    +

    Dado um conjunto, `` s``, você pode buscar os registros com o comando `` SELECT``:

    +
    >>> rows = s.select()
    +
    +
    +

    It returns an iterable object of class pydal.objects.Rows whose +elements are Row objects. pydal.objects.Row objects act like +dictionaries, but their elements can also be accessed as attributes. +The former differ from the latter because +its values are read-only.

    +

    O objecto Fileiras permite loop sobre o resultado do seleccionar e imprimindo os valores dos campos seleccionados para cada linha:

    +
    >>> for row in rows:
    +...     print(row.id, row.name)
    +...
    +1 Alex
    +
    +
    +

    Você pode fazer todas as etapas em uma declaração:

    +
    >>> for row in db(db.person.name == 'Alex').select():
    +...     print(row.name)
    +...
    +Alex
    +
    +
    +

    O comando select pode tomar argumentos. Todos os argumentos sem nome são interpretados como os nomes dos campos que você deseja buscar. Por exemplo, você pode ser explícita no campo “id” e no campo “nome” buscar:

    +
    >>> for row in db().select(db.person.id, db.person.name):
    +...     print(row.name)
    +...
    +Alex
    +Bob
    +Carl
    +
    +
    +

    O atributo mesa ALL permite especificar todos os campos:

    +
    >>> for row in db().select(db.person.ALL):
    +...     print(row.id, row.name)
    +...
    +1 Alex
    +2 Bob
    +3 Carl
    +
    +
    +

    Observe que não há nenhuma strings de consulta passada para db. py4web entende que se você quiser todos os campos da pessoa mesa sem informações adicionais, então você quer todos os registros da pessoa mesa.

    +

    Uma sintaxe alternativa equivalente é o seguinte:

    +
    >>> for row in db(db.person).select():
    +...     print(row.id, row.name)
    +...
    +1 Alex
    +2 Bob
    +3 Carl
    +
    +
    +

    e py4web entende que se você perguntar para todos os registros da pessoa mesa sem informações adicionais, então você quer todos os campos da tabela pessoa.

    +

    Dada uma linha

    +
    >>> row = rows[0]
    +
    +
    +

    você pode extrair seus valores usando várias expressões equivalentes:

    +
    >>> row.name
    +Alex
    +>>> row['name']
    +Alex
    +>>> row('person.name')
    +Alex
    +
    +
    +

    The latter syntax is particularly handy when selecting an expression +instead of a column. We will show this later.

    +

    Você também pode fazer

    +
    rows.compact = False
    +
    +
    +

    desativar a notação

    +
    rows[i].name
    +
    +
    +

    e permitir que, em vez disso, a notação menos compacto:

    +
    rows[i].person.name
    +
    +
    +

    Sim isso é incomum e raramente necessário.

    +

    Row objetos também tem dois métodos importantes:

    +
    row.delete_record()
    +
    +
    +

    e

    +
    row.update_record(name="new value")
    +
    +
    +
    +

    Usando um seleto para uso de memória inferior à base de iterador

    +

    Python “iterators” são um tipo de “preguiçoso-avaliação”. Eles dados ‘alimentar’ um passo de tempo; laços tradicionais Python criar todo o conjunto de dados na memória antes de looping.

    +

    O uso tradicional de selecionar é:

    +
    for row in db(db.table).select():
    +    ...
    +
    +
    +

    mas para um grande número de linhas, usando uma alternativa à base de iterador tem uso de memória dramaticamente inferior:

    +
    for row in db(db.table).iterselect():
    +    ...
    +
    +
    +

    Testes mostram que isto é de cerca de 10% mais rápido, mesmo em máquinas com muita RAM.

    +
    +
    +

    Renderizando Rows com represent

    +

    Você pode querer reescrever linhas retornadas por seleção para tirar proveito de informações de formatação contida na representa a criação dos campos.

    +
    rows = db(query).select()
    +repr_row = rows.render(0)
    +
    +
    +

    Se você não especificar um índice, você tem um gerador para iterar sobre todas as linhas:

    +
    for row in rows.render():
    +    print(row.myfield)
    +
    +
    +

    Também pode ser aplicada a fatias:

    +
    for row in rows[0:10].render():
    +    print(row.myfield)
    +
    +
    +

    Se você só quer transformar campos selecionados através do seu atributo “representar”, você pode incluí-los no argumento “campos”:

    +
    repr_row = row.render(0, fields=[db.mytable.myfield])
    +
    +
    +

    Note, it returns a transformed copy of the original Row, so there’s no +update_record (which you wouldn’t want anyway) or delete_record.

    +
    +
    +

    Atalhos

    +

    A DAL suporta vários atalhos-simplificando código. Em particular:

    +
    myrecord = db.mytable[id]
    +
    +
    +

    retorna o registro com o dado `` id`` se ele existir. Se o `` id`` não existe, ele retorna `` None``. A declaração acima é equivalente a

    +
    myrecord = db(db.mytable.id == id).select().first()
    +
    +
    +

    Você pode excluir registros por id:

    +
    del db.mytable[id]
    +
    +
    +

    e isto é equivalente a

    +
    db(db.mytable.id == id).delete()
    +
    +
    +

    e exclui o registro com o dado `` id``, se ele existir.

    +

    Nota: esta sintaxe de atalho de exclusão actualmente não trabalha se * versionamento * é ativado

    +

    Você pode inserir registros:

    +
    db.mytable[None] = dict(myfield='somevalue')
    +
    +
    +

    É equivalente a

    +
    db.mytable.insert(myfield='somevalue')
    +
    +
    +

    e cria um novo registro com valores de campos especificados pelo dicionário sobre o lado direito.

    +

    Note: insert shortcut was previously db.table[0] = .... It has +changed in pyDAL 19.02 to permit normal usage of id 0.

    +

    Você pode atualizar os registros:

    +
    db.mytable[id] = dict(myfield='somevalue')
    +
    +
    +

    o qual é equivalente a

    +
    db(db.mytable.id == id).update(myfield='somevalue')
    +
    +
    +

    e atualiza um registro existente com os valores dos campos especificados pelo dicionário sobre o lado direito.

    +
    +
    +

    A obtenção de um `` row``

    +

    No entanto, outra sintaxe conveniente é o seguinte:

    +
    record = db.mytable(id)
    +record = db.mytable(db.mytable.id == id)
    +record = db.mytable(id, myfield='somevalue')
    +
    +
    +

    Aparentemente semelhante a `` db.mytable [id] `` a sintaxe acima é mais flexível e mais seguro. Antes de tudo, verifica se `` id`` é um int (ou `` str (id) `` é um int) e retorna `` None`` se não (nunca levanta uma exceção). Ele também permite especificar várias condições que o registro deve atender. Se eles não forem atendidas, ele também retorna `` None``.

    +
    +
    +

    Recursivas `` s SELECT``

    +

    Considere a pessoa tabela anterior e uma nova tabela “coisa” fazendo referência a uma “pessoa”:

    +
    db.define_table('thing',
    +                Field('name'),
    +                Field('owner_id', 'reference person'))
    +
    +
    +

    e um simples selecionar a partir desta tabela:

    +
    things = db(db.thing).select()
    +
    +
    +

    o qual é equivalente a

    +
    things = db(db.thing._id != None).select()
    +
    +
    +

    onde `` _id`` é uma referência para a chave principal da tabela. Normalmente `` db.thing._id`` é o mesmo que `` db.thing.id`` e vamos supor que na maior parte deste livro.

    +

    Para cada linha de coisas é possível buscar não apenas campos da tabela selecionada (coisa), mas também a partir de tabelas vinculadas (de forma recursiva):

    +
    for thing in things:
    +    print(thing.name, thing.owner_id.name)
    +
    +
    +

    Aqui `` thing.owner_id.name`` requer um banco de dados escolha para cada coisa em coisas e por isso é ineficiente. Sugerimos usando junta sempre que possível, em vez de seleciona recursiva, no entanto, este é conveniente e prático ao acessar registros individuais.

    +

    Você também pode fazê-lo para trás, escolhendo os coisas referenciados por uma pessoa:

    +
    person = db.person(id)
    +for thing in person.thing.select(orderby=db.thing.name):
    +    print(person.name, 'owns', thing.name)
    +
    +
    +

    Nesta última expressão `` person.thing`` é um atalho para

    +
    db(db.thing.owner_id == person.id)
    +
    +
    +

    isto é, o conjunto de thing`` `` s referenciados pelos actuais `` Person``. Esta sintaxe se decompõe se a tabela referenciando tem várias referências à tabela referenciada. Neste case é preciso ser mais explícito e usar uma consulta completa.

    +
    +
    +

    `` Orderby``, `` groupby``, `` limitby``, `` distinct``, `` having``, `` orderby_on_limitby``, `` join``, `` left``, `` cache``

    +

    O comando `` SELECT`` leva uma série de argumentos opcionais.

    +
    +

    ordenar por

    +

    Você pode buscar os registros classificados pelo nome:

    +
    >>> for row in db().select(db.person.ALL, orderby=db.person.name):
    +...     print(row.name)
    +...
    +Alex
    +Bob
    +Carl
    +
    +
    +

    Você pode buscar os registros classificados pelo nome em ordem inversa (aviso o til):

    +
    >>> for row in db().select(db.person.ALL, orderby=~db.person.name):
    +...     print(row.name)
    +...
    +Carl
    +Bob
    +Alex
    +
    +
    +

    Você pode ter os registros obtida aparecem em ordem aleatória:

    +
    >>> for row in db().select(db.person.ALL, orderby='<random>'):
    +...     print(row.name)
    +...
    +Carl
    +Alex
    +Bob
    +
    +
    +
    +

    O uso de `` orderby = “<random>” `` não é suportada no Google NoSQL. No entanto, para superar esse limite, a classificação pode ser feito em linhas selecionadas:

    +
    +
    import random
    +rows = db(...).select().sort(lambda row: random.random())
    +
    +
    +

    Você pode classificar os registros de acordo com vários campos concatenando-los com um “|”:

    +
    >>> for row in db().select(db.person.name, orderby=db.person.name|db.person.id):
    +...     print(row.name)
    +...
    +Alex
    +Bob
    +Carl
    +
    +
    +
    +
    +

    groupby, tendo

    +

    Usando `` groupby`` juntamente com `` orderby``, você pode agrupar registros com o mesmo valor para o campo especificado (isto é back-end específico, e não é sobre o Google NoSQL):

    +
    >>> for row in db().select(db.person.ALL,
    +...                        orderby=db.person.name,
    +...                        groupby=db.person.name):
    +...     print(row.name)
    +...
    +Alex
    +Bob
    +Carl
    +
    +
    +

    Pode usar `` having`` em conjunto com `` groupby`` ao grupo condicionalmente (apenas aqueles `` having`` a condição estão agrupados).

    +
    db(query1).select(db.person.ALL, groupby=db.person.name, having=query2)
    +
    +
    +

    Observe que os registros filtros Consulta1 a ser exibido, registros filtros Query2 ser agrupados.

    +
    +
    +

    distinto

    +

    Com o argumento `` distinta = True``, você pode especificar que você só quer selecionar registros distintos. Isto tem o mesmo efeito que o agrupamento usando todos os campos especificados, exceto que ele não necessita de classificação. Ao usar distinta é importante não para selecionar todos os campos, e em particular para não selecionar o campo “id”, senão todos os registros serão sempre distintas.

    +

    Aqui está um exemplo:

    +
    >>> for row in db().select(db.person.name, distinct=True):
    +...     print(row.name)
    +...
    +Alex
    +Bob
    +Carl
    +
    +
    +

    Note que `` distinct`` também pode ser uma expressão, por exemplo:

    +
    >>> for row in db().select(db.person.name, distinct=db.person.name):
    +...     print(row.name)
    +...
    +Alex
    +Bob
    +Carl
    +
    +
    +
    +
    +

    limitby

    +

    Com `` limitby = (min, max) ``, pode seleccionar um subconjunto dos registos de deslocamento = min, mas não incluindo offset = máx. No próximo exemplo nós selecionamos os dois primeiros registros a partir de zero:

    +
    >>> for row in db().select(db.person.ALL, limitby=(0, 2)):
    +...     print(row.name)
    +...
    +Alex
    +Bob
    +
    +
    +
    +
    +

    orderby_on_limitby

    +

    Note-se que os padrões DAL de adicionar implicitamente um orderby ao usar um limitby. Isso garante a mesma consulta retorna os mesmos resultados de cada vez, importante para a paginação. Mas pode causar problemas de desempenho. use `` orderby_on_limitby = False`` para mudar isso (isso o padrão é True).

    +
    +
    +

    juntar-se, deixou

    +

    These are involved in managing One to many relation. They are +described in Inner join and Left outer join sections respectively.

    +
    +
    +

    cache, em cache

    +

    An example use which gives much faster selects is:

    +
    rows = db(query).select(cache=(cache.get, 3600), cacheable=True)
    +
    +
    +

    Look at Caching selects, to understand what the trade-offs are.

    +
    +
    +
    +

    Operadores lógicos

    +

    As consultas podem ser combinados usando o binário operador AND “` & `”:

    +
    >>> rows = db((db.person.name=='Alex') & (db.person.id > 3)).select()
    +>>> for row in rows: print row.id, row.name
    +>>> len(rows)
    +0
    +
    +
    +

    eo binário operador OR “` | `”:

    +
    >>> rows = db((db.person.name == 'Alex') | (db.person.id > 3)).select()
    +>>> for row in rows: print row.id, row.name
    +1 Alex
    +
    +
    +

    Você pode negar uma sub-consulta invertendo o seu operador:

    +
    >>> rows = db((db.person.name != 'Alex') | (db.person.id > 3)).select()
    +>>> for row in rows: print row.id, row.name
    +2 Bob
    +3 Carl
    +
    +
    +

    ou pela negação explícita com o “` ~ `” operador unário:

    +
    >>> rows = db(~(db.person.name == 'Alex') | (db.person.id > 3)).select()
    +>>> for row in rows: print row.id, row.name
    +2 Bob
    +3 Carl
    +
    +
    +
    +

    Devido a restrições de Python em sobrecarga “` and`” e “` or`” operadores, estes não podem ser utilizados na formação de consultas. Os operadores binários “` & ” e “ | ” deve ser usado em seu lugar. Note-se que estes operadores (ao contrário de “ and`” e “` or`”) tem precedência maior do que os operadores de comparação, de modo que os parênteses “extra” nos exemplos acima são de preenchimento obrigatório. Da mesma forma, o operador unitário “~` `` ” tem precedência mais elevada do que os operadores de comparação, de modo ~ ` `` comparações -negated também deve estar entre parênteses.

    +
    +

    Também é possível consultas construir usando in-place operadores lógicos:

    +
    >>> query = db.person.name != 'Alex'
    +>>> query &= db.person.id > 3
    +>>> query |= db.person.name == 'John'
    +
    +
    +
    +
    +

    `` Count``, `` isempty``, `` DELETE``, `` update``

    +

    Você pode contar registros em um conjunto:

    +
    >>> db(db.person.name != 'William').count()
    +3
    +
    +
    +

    Note que `` count`` leva um opcional `` distinct`` argumento que o padrão é falso, e ele funciona muito parecido com o mesmo argumento para `` SELECT``. `` Count`` tem também um argumento `` cache`` que funciona muito parecido com o argumento equivalente do método SELECT`.

    +

    Às vezes você pode precisar verificar se uma tabela está vazia. Uma maneira mais eficiente do que a contagem está a utilizar o método isempty`:

    +
    >>> db(db.person).isempty()
    +False
    +
    +
    +

    Você pode excluir registros em um jogo:

    +
    >>> db(db.person.id > 3).delete()
    +0
    +
    +
    +

    A `` DELETE`` método devolve o número de registos que foram eliminados.

    +

    E você pode atualizar todos os registros em um conjunto, passando argumentos nomeados correspondentes aos campos que precisam ser atualizados:

    +
    >>> db(db.person.id > 2).update(name='Ken')
    +1
    +
    +
    +

    O método update` retorna o número de registros que foram atualizados.

    +
    +
    +

    Expressões

    +

    O valor atribuído uma instrução de atualização pode ser uma expressão. Por exemplo, considere este modelo

    +
    db.define_table('person',
    +                Field('name'),
    +                Field('visits', 'integer', default=0))
    +
    +db(db.person.name == 'Massimo').update(visits = db.person.visits + 1)
    +
    +
    +

    Os valores usados ​​em consultas também podem ser expressões

    +
    db.define_table('person',
    +                Field('name'),
    +                Field('visits', 'integer', default=0),
    +                Field('clicks', 'integer', default=0))
    +
    +db(db.person.visits == db.person.clicks + 1).delete()
    +
    +
    +
    +
    +

    `` case``

    +

    Uma expressão pode conter uma cláusula case, por exemplo:

    +
    >>> condition = db.person.name.startswith('B')
    +>>> yes_or_no = condition.case('Yes', 'No')
    +>>> for row in db().select(db.person.name, yes_or_no):
    +...     print(row.person.name, row[yes_or_no])  # could be row(yes_or_no) too
    +...
    +Alex No
    +Bob Yes
    +Ken No
    +
    +
    +
    +
    +

    `` Update_record``

    +

    py4web também permite actualizar um único registro que já está na memória usando `` update_record``

    +
    >>> row = db(db.person.id == 2).select().first()
    +>>> row.update_record(name='Curt')
    +<Row {'id': 2, 'name': 'Curt'}>
    +
    +
    +

    `` Update_record`` não deve ser confundido com

    +
    >>> row.update(name='Curt')
    +
    +
    +

    porque para uma única linha, o método `` update`` atualiza o objeto de linha, mas não o registro de banco de dados, como no case de `` update_record``.

    +

    Também é possível alterar os atributos de uma linha (um de cada vez) e, em seguida, chamar `` update_record () `` sem argumentos para salvar as alterações:

    +
    >>> row = db(db.person.id > 2).select().first()
    +>>> row.name = 'Philip'
    +>>> row.update_record() # saves above change
    +<Row {'id': 3, 'name': 'Philip'}>
    +
    +
    +
    +

    Note, you should avoid using row.update_record() with no +arguments when the row object contains fields that have an +update attribute (e.g., +Field('modified_on', update=datetime.datetime.utcnow)). Calling +row.update_record() will retain all of the existing values in +the row object, so any fields with update attributes will +have no effect in this case. Be particularly mindful of this with +tables that include auth.signature.

    +
    +

    O método update_record` está disponível apenas se campo` id` da tabela está incluído no seleto, e` cacheable` não está definido para` True`.

    +
    +
    +

    Inserir e atualizar a partir de um dicionário

    +

    Um problema comum é composto de precisar inserir ou atualizar registros em uma tabela onde o nome da tabela, o campo para ser atualizado, eo valor para o campo são armazenados em variáveis. Por exemplo: `` tablename``, `` fieldname``, e `` value``.

    +

    A inserção pode ser feito usando a seguinte sintaxe:

    +
    db[tablename].insert(**{fieldname:value})
    +
    +
    +

    A atualização do registro com dado id pode ser feito com:

    +
    db(db[tablename]._id == id).update(**{fieldname:value})
    +
    +
    +

    Observe que usamos `` table._id`` ao invés de `` table.id``. Desta forma, a consulta funciona mesmo para tabelas com um campo de chave primária com o tipo diferente de “id”.

    +
    +
    +

    `` `` First`` e last``

    +

    Dado um objecto linhas contendo registos:

    +
    rows = db(query).select()
    +first_row = rows.first()
    +last_row = rows.last()
    +
    +
    +

    são equivalentes às

    +
    first_row = rows[0] if len(rows) else None
    +last_row = rows[-1] if len(rows) else None
    +
    +
    +

    Observe, `` primeiro () `` e `` última () `` permitem obter, obviamente, o primeiro e último registro presente em sua consulta, mas isso não significa que esses registros estão indo para ser o primeiro ou o último inserido registros. No case de pretender o primeiro ou último registro inserido em uma determinada tabela não se esqueça de usar `` orderby = db.table_name.id``. Se você esquecer você só vai conseguir o primeiro eo último registro retornado pela consulta, que são muitas vezes em uma ordem aleatória determinada pelo otimizador de consulta backend.

    +
    +
    +

    `` `` As_dict`` e as_list``

    +

    Fila objecto pode ser serializados em um dicionário normal usando a `` as_dict () `` método e um objecto de linhas pode ser serializados em uma lista de dicionários usando a `` as_list () `` método. aqui estão alguns exemplos:

    +
    rows = db(query).select()
    +rows_list = rows.as_list()
    +first_row_dict = rows.first().as_dict()
    +
    +
    +

    These methods are convenient for passing Rows to generic views and or to +store Rows in sessions (Rows objects themselves cannot be +serialized because they contain a reference to an open DB connection):

    +
    rows = db(query).select()
    +session.rows = rows  # not allowed!
    +session.rows = rows.as_list()  # allowed!
    +
    +
    +
    +
    +

    Combinando Rows

    +

    Fileiras objectos podem ser combinadas no nível Python. Aqui assumimos:

    +
    >>> print(rows1)
    +person.name
    +Max
    +Tim
    +
    +>>> print(rows2)
    +person.name
    +John
    +Tim
    +
    +
    +

    Você pode fazer a união dos registros em dois conjuntos de linhas:

    +
    >>> rows3 = rows1 + rows2
    +>>> print(rows3)
    +person.name
    +Max
    +Tim
    +John
    +Tim
    +
    +
    +

    Você pode fazer a união dos registros remoção de duplicatas:

    +
    >>> rows3 = rows1 | rows2
    +>>> print(rows3)
    +person.name
    +Max
    +Tim
    +John
    +
    +
    +

    Você pode fazer intersecção dos registros em dois conjuntos de linhas:

    +
    >>> rows3 = rows1 & rows2
    +>>> print(rows3)
    +person.name
    +Tim
    +
    +
    +
    +
    +

    `` Find``, `` exclude``, `` sort``

    +

    Algumas vezes você precisa executar duas seleciona e um contém um subconjunto de um seleto anterior. Neste case, é inútil para acessar o banco de dados novamente. Os `` find``, `` exclude`` e `` objetos sort`` permitem manipular fileiras objeto e gerar outro sem acessar o banco de dados. Mais especificamente: - `` retorna find`` um novo conjunto de linhas filtradas por uma condição e deixa o inalterados originais. - `` retornos exclude`` um novo conjunto de linhas filtrados por uma condição e remove-los das linhas originais. - `` retorna sort`` um novo conjunto de linhas classificadas por uma condição e deixa o inalterados originais.

    +

    Todos estes métodos dar um único argumento, uma função que age em cada linha individual.

    +

    Aqui está um exemplo de uso:

    +
    >>> db.define_table('person', Field('name'))
    +<Table person (id, name)>
    +>>> db.person.insert(name='John')
    +1
    +>>> db.person.insert(name='Max')
    +2
    +>>> db.person.insert(name='Alex')
    +3
    +>>> rows = db(db.person).select()
    +>>> for row in rows.find(lambda row: row.name[0]=='M'):
    +...     print(row.name)
    +...
    +Max
    +>>> len(rows)
    +3
    +>>> for row in rows.exclude(lambda row: row.name[0]=='M'):
    +...     print(row.name)
    +...
    +Max
    +>>> len(rows)
    +2
    +>>> for row in rows.sort(lambda row: row.name):
    +...     print(row.name)
    +...
    +Alex
    +John
    +
    +
    +

    Eles podem ser combinados:

    +
    >>> rows = db(db.person).select()
    +>>> rows = rows.find(lambda row: 'x' in row.name).sort(lambda row: row.name)
    +>>> for row in rows:
    +...     print(row.name)
    +...
    +Alex
    +Max
    +
    +
    +

    Tipo leva um argumento opcional `` reversa = True`` com o significado óbvio.

    +

    O método find` tem um argumento` limitby` opcional com a mesma sintaxe e funcionalidade como o conjunto` método SELECT`.

    +
    +
    +

    Selects com cache

    +

    The select method also takes a cache argument, which defaults to +None. For caching purposes, it should be set to a tuple where the first +element is the cache function with signature (key, callback, expiration) +(for example cache.get assuming cache +is an instance of the py4web cache object), and +the second element is the expiration time in seconds.

    +

    No exemplo a seguir, você vê um controlador que armazena em cache um seleto sobre a mesa db.log previamente definido. As buscas reais dados selecionados do banco de dados back-end não mais do que uma vez a cada 60 segundos e armazena o resultado na memória. Se a próxima chamada para este controlador ocorre em menos de 60 segundos desde o último banco de dados IO, ele simplesmente vai buscar os dados anteriores da memória.

    +
    def cache_db_select():
    +    logs = db().select(db.log.ALL, cache=(cache.get, 60))
    +    return dict(logs=logs)
    +
    +
    +

    O método SELECT` tem um argumento` cacheable` opcional, normalmente definido como False. Quando `` cacheável = True`` o resultante `` Rows`` Serializável mas `` A falta row`` s `` `` update_record`` e métodos delete_record``.

    +

    Se você não precisar destes métodos você pode acelerar seleciona um lote, definindo o atributo `` cacheable``:

    +
    rows = db(query).select(cacheable=True)
    +
    +
    +

    Quando o argumento `` cache`` está definido, mas `` cacheable = False`` (default), apenas os resultados de banco de dados são armazenados em cache, não as linhas reais objeto. Quando o argumento `` cache`` é usado em conjunto com `` cacheável = True`` as linhas inteiras objecto é cache e isso resulta em muito mais rápido cache:

    +
    rows = db(query).select(cache=(cache.get, 3600), cacheable=True)
    +
    +
    +
    +
    +
    +

    Computed and Virtual fields

    +
    +

    Campos computados

    +

    Campos DAL podem ter um atributo `` compute``. Esta deve ser uma função (ou lambda) que recebe um objeto Row e retorna um valor para o campo. Quando um novo registo é modificado, incluindo inserções e atualizações, se um valor para o campo não é fornecido, py4web tenta calcular a partir dos outros valores de campo utilizando a função `` compute``. Aqui está um exemplo:

    +
    >>> db.define_table('item',
    +...                 Field('unit_price', 'double'),
    +...                 Field('quantity', 'integer'),
    +...                 Field('total_price',
    +...                       compute=lambda r: r['unit_price'] * r['quantity']))
    +<Table item (id, unit_price, quantity, total_price)>
    +>>> rid = db.item.insert(unit_price=1.99, quantity=5)
    +>>> db.item[rid]
    +<Row {'total_price': '9.95', 'unit_price': 1.99, 'id': 1L, 'quantity': 5}>
    +
    +
    +

    Notice that the computed value is stored in the db and it is not +computed on retrieval, as in the case of virtual fields, described next. +Two typical applications of computed fields are:

    +
      +
    • in wiki applications, to store the processed input wiki text as HTML, to +avoid re-processing on every request

    • +
    • for searching, to compute normalized values for a field, to be used for searching.

    • +
    +

    Computed fields are evaluated in the order in which they are defined in +the table definition. A computed field can refer to previously defined +computed fields.

    +
    +
    +

    Campos virtuais

    +

    Campos virtuais também são computados campos (como na subseção anterior), mas eles diferem daquelas porque são * * virtual no sentido de que não são armazenadas no db e eles são calculados a cada vez registros são extraídos do banco de dados. Eles podem ser usados ​​para simplificar o código do usuário sem usar armazenamento adicional, mas eles não podem ser usados ​​para pesquisa.

    +
    +
    +

    Campos virtuais novo estilo (experimental)

    +

    py4web fornece uma nova e mais fácil maneira de definir campos virtuais e campos virtuais preguiçosos. Esta seção é marcado experimental porque as APIs ainda podem mudar um pouco do que é descrito aqui.

    +

    Aqui vamos considerar o mesmo exemplo na subseção anterior. Em particular, considere o seguinte modelo:

    +
    db.define_table('item',
    +                Field('unit_price', 'double'),
    +                Field('quantity', 'integer'))
    +
    +
    +

    Pode-se definir um `` total_price`` campo virtual como

    +
    db.item.total_price = Field.Virtual(lambda row: row.item.unit_price * row.item.quantity)
    +
    +
    +

    isto é, simplesmente definindo um novo campo `` total_price`` ser um `` Field.Virtual``. O único argumento do construtor é uma função que recebe uma linha e retorna os valores calculados.

    +

    Um campo virtual definido como o descrito acima é calculado automaticamente para todos os registros quando os registros são selecionados:

    +
    for row in db(db.item).select():
    +    print(row.total_price)
    +
    +
    +

    Também é possível definir campos de métodos que são calculados on-demand, quando chamado. Por exemplo:

    +
    db.item.discounted_total = \
    +    Field.Method(lambda row, discount=0.0:
    +                 row.item.unit_price * row.item.quantity * (100.0 - discount / 100))
    +
    +
    +

    Neste case, `` row.discounted_total`` não é um valor, mas uma função. A função usa os mesmos argumentos que a função passada para o `` construtor Method`` exceto `` row`` que está implícito (pense nisso como `` self`` para objetos).

    +

    O campo preguiçoso no exemplo acima permite uma para calcular o valor total para cada `` item``:

    +
    for row in db(db.item).select(): print(row.discounted_total())
    +
    +
    +

    E também permite passar um `` percentual discount`` opcional (digamos 15%):

    +
    for row in db(db.item).select(): print(row.discounted_total(15))
    +
    +
    +

    Campos virtuais e de método também podem ser definidos no lugar quando uma tabela é definida:

    +
    db.define_table('item',
    +                Field('unit_price', 'double'),
    +                Field('quantity', 'integer'),
    +                Field.Virtual('total_price', lambda row: ...),
    +                Field.Method('discounted_total', lambda row, discount=0.0: ...))
    +
    +
    +
    +

    Mind that virtual fields do not have the same attributes as regular +fields (length, default, required, etc). They do not appear in the +list of db.table.fields.

    +
    +
    +
    +

    Campos virtuais velho antigo

    +

    A fim de definir um ou mais virtuais campos, você também pode definir uma classe de contêiner, instanciá-lo e vinculá-lo a uma tabela ou a um seleto. Por exemplo, considere a seguinte tabela:

    +
    db.define_table('item',
    +                Field('unit_price', 'double'),
    +                Field('quantity', 'integer'))
    +
    +
    +

    Pode-se definir um `` total_price`` campo virtual como

    +
    class MyVirtualFields:
    +    def total_price(self):
    +        return self.item.unit_price * self.item.quantity
    +
    +db.item.virtualfields.append(MyVirtualFields())
    +
    +
    +

    Observe que cada método da classe que recebe um único argumento (auto) é um novo campo virtual. `` Self`` refere-se a cada linha de uma select. valores de campo são referidos pelo caminho completo como em `` self.item.unit_price``. A tabela está ligada aos campos virtuais anexando uma instância da classe para atributo `` virtualfields`` da tabela.

    +

    Campos virtuais também podem acessar campos recursivos como em

    +
    db.define_table('item',
    +                Field('unit_price', 'double'))
    +
    +db.define_table('order_item',
    +                Field('item', 'reference item'),
    +                Field('quantity', 'integer'))
    +
    +class MyVirtualFields:
    +    def total_price(self):
    +        return self.order_item.item.unit_price * self.order_item.quantity
    +
    +db.order_item.virtualfields.append(MyVirtualFields())
    +
    +
    +

    Observe o acesso de campo recursiva `` self.order_item.item.unit_price`` onde `` self`` é o registro looping.

    +

    Eles também podem agir sobre o resultado de um JOIN

    +
    rows = db(db.order_item.item == db.item.id).select()
    +
    +class MyVirtualFields:
    +    def total_price(self):
    +        return self.item.unit_price * self.order_item.quantity
    +
    +rows.setvirtualfields(order_item=MyVirtualFields())
    +
    +for row in rows:
    +    print(row.order_item.total_price)
    +
    +
    +

    Note como neste case, a sintaxe é diferente. O campo virtual acessa tanto `` self.item.unit_price`` e `` self.order_item.quantity`` que pertencem ao juntar-se selecionar. O campo virtual é anexado para as linhas da tabela usando o método setvirtualfields` do objecto linhas. Este método leva um número arbitrário de argumentos nomeados e pode ser usado para definir vários campos virtuais, definidos em várias classes, e anexá-los a várias tabelas:

    +
    class MyVirtualFields1:
    +    def discounted_unit_price(self):
    +        return self.item.unit_price * 0.90
    +
    +class MyVirtualFields2:
    +    def total_price(self):
    +        return self.item.unit_price * self.order_item.quantity
    +    def discounted_total_price(self):
    +        return self.item.discounted_unit_price * self.order_item.quantity
    +
    +rows.setvirtualfields(item=MyVirtualFields1(),
    +                      order_item=MyVirtualFields2())
    +
    +for row in rows:
    +    print(row.order_item.discounted_total_price)
    +
    +
    +

    Campos virtuais podem ser * lazy* ; tudo que eles precisam fazer é retornar uma função e acessá-lo chamando a função:

    +
    db.define_table('item',
    +                Field('unit_price', 'double'),
    +                Field('quantity', 'integer'))
    +
    +class MyVirtualFields:
    +    def lazy_total_price(self):
    +        def lazy(self=self):
    +            return self.item.unit_price * self.item.quantity
    +        return lazy
    +
    +db.item.virtualfields.append(MyVirtualFields())
    +
    +for item in db(db.item).select():
    +    print(item.lazy_total_price())
    +
    +
    +

    ou mais curto utilizando uma função lambda:

    +
    class MyVirtualFields:
    +    def lazy_total_price(self):
    +        return lambda self=self: self.item.unit_price * self.item.quantity
    +
    +
    +
    +
    +
    +

    Joins and Relations

    +
    +

    Um para muitos relação

    +

    Para ilustrar como implementar um para muitos relação com a DAL, definir outra mesa “coisa” que refere-se à mesa “pessoa” que redefinir aqui:

    +
    >>> db.define_table('person',
    +...                 Field('name'))
    +<Table person (id, name)>
    +>>> db.person.insert(name='Alex')
    +1
    +>>> db.person.insert(name='Bob')
    +2
    +>>> db.person.insert(name='Carl')
    +3
    +>>> db.define_table('thing',
    +...                 Field('name'),
    +...                 Field('owner_id', 'reference person'))
    +<Table thing (id, name, owner_id)>
    +
    +
    +

    Table “thing” has two fields, the name of the thing and the owner of the +thing. The “owner_id” field is a reference field, it is intended that +the field reference the other table by its id. A reference type can be +specified in two equivalent ways, either: +Field('owner_id', 'reference person') or: +Field('owner_id', db.person).

    +

    Este último é sempre convertido para o ex. Eles são equivalentes, exceto no case de tabelas preguiçosos, referências auto ou outros tipos de referências cíclicas onde o ex-notação é a notação só é permitido.

    +

    Agora, insira três coisas, duas de propriedade de Alex e um por Bob:

    +
    >>> db.thing.insert(name='Boat', owner_id=1)
    +1
    +>>> db.thing.insert(name='Chair', owner_id=1)
    +2
    +>>> db.thing.insert(name='Shoes', owner_id=2)
    +3
    +
    +
    +

    Você pode selecionar como você fez para qualquer outra tabela:

    +
    >>> for row in db(db.thing.owner_id == 1).select():
    +...     print(row.name)
    +...
    +Boat
    +Chair
    +
    +
    +

    Porque uma coisa tem uma referência a uma pessoa, uma pessoa pode ter muitas coisas, assim que um registro da tabela pessoa agora adquire uma coisa nova atributo, que é um conjunto, que define as coisas dessa pessoa. Isso permite que um loop sobre todas as pessoas e buscar as suas coisas com facilidade:

    +
    >>> for person in db().select(db.person.ALL):
    +...     print(person.name)
    +...     for thing in person.thing.select():
    +...         print('    ', thing.name)
    +...
    +Alex
    +     Boat
    +     Chair
    +Bob
    +     Shoes
    +Carl
    +
    +
    +
    +
    +

    Inner join

    +

    Outra forma de conseguir um resultado semelhante é usando uma junção, especificamente um INNER JOIN. executa py4web junta-se automaticamente e de forma transparente quando a consulta liga dois ou mais tabelas como no exemplo a seguir:

    +
    >>> rows = db(db.person.id == db.thing.owner_id).select()
    +>>> for row in rows:
    +...     print(row.person.name, 'has', row.thing.name)
    +...
    +Alex has Boat
    +Alex has Chair
    +Bob has Shoes
    +
    +
    +

    Observe que py4web fez uma junção, então as linhas agora contêm dois registros, um de cada mesa, ligados entre si. Porque os dois registros podem ter campos com nomes conflitantes, você precisa especificar a tabela quando se extrai um valor de campo de uma linha. Isto significa que enquanto antes que você poderia fazer:

    +
    row.name
    +
    +
    +

    e era óbvio que se este era o nome de uma pessoa ou uma coisa, em resultado de uma junção que você tem que ser mais explícito e dizer:

    +
    row.person.name
    +
    +
    +

    ou:

    +
    row.thing.name
    +
    +
    +

    Há uma sintaxe alternativa para associações internas:

    +
    >>> rows = db(db.person).select(join=db.thing.on(db.person.id == db.thing.owner_id))
    +>>> for row in rows:
    +...     print(row.person.name, 'has', row.thing.name)
    +...
    +Alex has Boat
    +Alex has Chair
    +Bob has Shoes
    +
    +
    +

    Enquanto a saída é o mesmo, o SQL gerado nos dois cases, pode ser diferente. O último sintaxe remove as ambiguidades possíveis quando a mesma tabela é unidas duas vezes e alias:

    +
    db.define_table('thing',
    +                Field('name'),
    +                Field('owner_id1', 'reference person'),
    +                Field('owner_id2', 'reference person'))
    +
    +rows = db(db.person).select(
    +        join=[db.person.with_alias('owner_id1').on(db.person.id == db.thing.owner_id1),
    +              db.person.with_alias('owner_id2').on(db.person.id == db.thing.owner_id2)])
    +
    +
    +

    O valor de `` join`` pode ser lista de `` db.table.on (…) `` para participar.

    +
    +
    +

    Left outer join

    +

    Observe que Carl não aparecer na lista acima, porque ele não tem as coisas. Se você pretende selecionar sobre as pessoas (se eles têm coisas ou não) e as suas coisas (se tiver algum), então você precisa para realizar um LEFT OUTER JOIN. Isso é feito usando o argumento de “esquerda” da seleção. Aqui está um exemplo:

    +
    >>> rows = db().select(db.person.ALL, db.thing.ALL,
    +...                    left=db.thing.on(db.person.id == db.thing.owner_id))
    +>>> for row in rows:
    +...     print(row.person.name, 'has', row.thing.name)
    +...
    +Alex has Boat
    +Alex has Chair
    +Bob has Shoes
    +Carl has None
    +
    +
    +

    Where:

    +
    left = db.thing.on(...)
    +
    +
    +

    é que a esquerda se juntar a consulta. Aqui o argumento de `` db.thing.on`` é a condição necessária para a junção (o mesmo utilizado acima para a junção interna). No case de uma associação à esquerda, é necessário ser explícito sobre quais campos para selecionar.

    +

    Multiple esquerda junções podem ser combinados, passando uma lista ou tupla de `` db.mytable.on (…) `` para o parâmetro `` left``.

    +
    +
    +

    Agrupamento e contando

    +

    Ao fazer junta-se, às vezes você quer agrupar linhas de acordo com certos critérios e contá-los. Por exemplo, contar o número de coisas pertencentes a cada pessoa. py4web permite isso também. Primeiro, você precisa de um operador de contagem. Em segundo lugar, você quer se juntar a tabela a pessoa com o quadro de coisa pelo proprietário. Terceiro, você quer selecionar todas as linhas (pessoa + coisa), agrupá-los por pessoa, e contá-los enquanto agrupamento:

    +
    >>> count = db.person.id.count()
    +>>> for row in db(db.person.id == db.thing.owner_id
    +...               ).select(db.person.name, count, groupby=db.person.name):
    +...     print(row.person.name, row[count])
    +...
    +Alex 2
    +Bob 1
    +
    +
    +

    Observe a `` operador count`` (que é incorporado) é usado como um campo. O único problema aqui é em como recuperar a informação. Cada linha contém claramente uma pessoa e a contagem, mas a contagem não é um campo de uma pessoa nem é uma mesa. Então, onde ela vai? Ele vai para o objeto de armazenamento representando o registro com uma chave igual ao próprio expressão de consulta.

    +

    O método count` do objeto campo tem um argumento` distinct` opcional. Quando ajustado para `` True`` especifica que apenas os valores distintos de campo em questão estão a ser contadas.

    +
    +
    +

    Many to many relation

    +

    Nos exemplos anteriores, que permitiram uma coisa para ter um proprietário, mas uma pessoa pode ter muitas coisas. E se barco era propriedade de Alex e Curt? Isso requer uma relação muitos-para-muitos, e é realizada através de uma tabela intermediária que liga uma pessoa a uma coisa através de uma relação de propriedade.

    +

    Aqui está como fazê-lo:

    +
    >>> db.define_table('person',
    +...                 Field('name'))
    +<Table person (id, name)>
    +>>> db.person.bulk_insert([dict(name='Alex'), dict(name='Bob'), dict(name='Carl')])
    +[1, 2, 3]
    +>>> db.define_table('thing',
    +...                 Field('name'))
    +<Table thing (id, name)>
    +>>> db.thing.bulk_insert([dict(name='Boat'), dict(name='Chair'), dict(name='Shoes')])
    +[1, 2, 3]
    +>>> db.define_table('ownership',
    +...                 Field('person', 'reference person'),
    +...                 Field('thing', 'reference thing'))
    +<Table ownership (id, person, thing)>
    +
    +
    +

    a relação de propriedade existente pode agora ser reescrita como:

    +
    >>> db.ownership.insert(person=1, thing=1)  # Alex owns Boat
    +1
    +>>> db.ownership.insert(person=1, thing=2)  # Alex owns Chair
    +2
    +>>> db.ownership.insert(person=2, thing=3)  # Bob owns Shoes
    +3
    +
    +
    +

    Agora você pode adicionar a nova relação que Curt co-proprietária Barco:

    +
    >>> db.ownership.insert(person=3, thing=1)  # Curt owns Boat too
    +4
    +
    +
    +

    Porque agora você tem uma relação de três vias entre as mesas, pode ser conveniente para definir um novo conjunto no qual executar as operações:

    +
    >>> persons_and_things = db((db.person.id == db.ownership.person) &
    +...                         (db.thing.id == db.ownership.thing))
    +
    +
    +

    Agora é fácil para selecionar todas as pessoas e suas coisas da nova Set:

    +
    >>> for row in persons_and_things.select():
    +...     print(row.person.name, 'has', row.thing.name)
    +...
    +Alex has Boat
    +Alex has Chair
    +Bob has Shoes
    +Curt has Boat
    +
    +
    +

    Da mesma forma, você pode procurar por todas as coisas pertencentes a Alex:

    +
    >>> for row in persons_and_things(db.person.name == 'Alex').select():
    +...     print(row.thing.name)
    +...
    +Boat
    +Chair
    +
    +
    +

    e todos os proprietários de barco:

    +
    >>> for row in persons_and_things(db.thing.name == 'Boat').select():
    +...     print(row.person.name)
    +...
    +Alex
    +Curt
    +
    +
    +

    A lighter alternative to many-to-many relations is tagging, see the +Authorization using Tags chapter. Tagging works even on database backends +that do not support JOINs like the Google App Engine NoSQL.

    +
    +
    +

    A auto-referência e aliases

    +

    É possível definir tabelas com campos que se referem a si mesmos, aqui está um exemplo:

    +
    db.define_table('person',
    +                Field('name'),
    +                Field('father_id', 'reference person'),
    +                Field('mother_id', 'reference person'))
    +
    +
    +

    Observe que a notação alternativa de usar um objeto de tabela como tipo de campo irá falhar neste case, porque ele usa uma tabela antes de ser definido:

    +
    db.define_table('person',
    +                Field('name'),
    +                Field('father_id', db.person),  # wrong!
    +                Field('mother_id', db['person']))  # wrong!
    +
    +
    +

    Em geral `` db.tablename` e “` referência tablename”`` são tipos de campo equivalentes, mas o último é o único que tem permissão para auto-referências.

    +

    Quando uma tabela tem uma auto-referência e você tem que fazer se juntar, por exemplo, para selecionar uma pessoa e seu pai, você precisa de um alias para a tabela. Em SQL um alias é um nome alternativo temporário que você pode usar para fazer referência a uma tabela / coluna em uma consulta (ou outra instrução SQL).

    +

    Com py4web você pode fazer um alias para uma tabela usando o método with_alias`. Isso funciona também para expressões, o que significa também para campos desde `` Field`` é derivada de `` Expression``.

    +

    Aqui está um exemplo:

    +
    >>> fid, mid = db.person.bulk_insert([dict(name='Massimo'), dict(name='Claudia')])
    +>>> db.person.insert(name='Marco', father_id=fid, mother_id=mid)
    +3
    +>>> Father = db.person.with_alias('father')
    +>>> Mother = db.person.with_alias('mother')
    +>>> type(Father)
    +<class 'pydal.objects.Table'>
    +>>> str(Father)
    +'person AS father'
    +>>> rows = db().select(db.person.name, Father.name, Mother.name,
    +...                    left=(Father.on(Father.id == db.person.father_id),
    +...                          Mother.on(Mother.id == db.person.mother_id)))
    +>>> for row in rows:
    +...     print(row.person.name, row.father.name, row.mother.name)
    +...
    +Massimo None None
    +Claudia None None
    +Marco Massimo Claudia
    +
    +
    +

    Observe que optámos por fazer uma distinção entre: - “father_id”: o nome do campo usado na “pessoa” mesa; - “pai”: o alias que deseja usar para a tabela referenciada pelo campo acima; esta é comunicada ao banco de dados; - “Pai”: a variável usada por py4web para se referir a esse alias.

    +

    A diferença é sutil, e não há nada de errado em usar o mesmo nome para os três:

    +
    >>> db.define_table('person',
    +...                 Field('name'),
    +...                 Field('father', 'reference person'),
    +...                 Field('mother', 'reference person'))
    +<Table person (id, name, father, mother)>
    +>>> fid, mid = db.person.bulk_insert([dict(name='Massimo'), dict(name='Claudia')])
    +>>> db.person.insert(name='Marco', father=fid, mother=mid)
    +3
    +>>> father = db.person.with_alias('father')
    +>>> mother = db.person.with_alias('mother')
    +>>> rows = db().select(db.person.name, father.name, mother.name,
    +...                    left=(father.on(father.id==db.person.father),
    +...                          mother.on(mother.id==db.person.mother)))
    +>>> for row in rows:
    +...     print(row.person.name, row.father.name, row.mother.name)
    +...
    +Massimo None None
    +Claudia None None
    +Marco Massimo Claudia
    +
    +
    +

    Mas é importante ter a distinção clara, a fim de construir perguntas corretas.

    +
    +
    +
    +

    Outros operadores

    +

    py4web tem outros operadores que fornecem uma API para operadores SQL equivalentes de acesso. Vamos definir outra mesa “log” para eventos loja de segurança, sua event_time e gravidade, onde a gravidade é um número inteiro.

    +
    >>> db.define_table('log', Field('event'),
    +...                        Field('event_time', 'datetime'),
    +...                        Field('severity', 'integer'))
    +<Table log (id, event, event_time, severity)>
    +
    +
    +

    Como antes, inserir alguns eventos, a “varredura de portas”, uma “injeção de XSS” e um “login não autorizado”. Por causa do exemplo, você pode registrar eventos com o mesmo event_time mas com diferentes gravidades (1, 2, e 3, respectivamente).

    +
    >>> import datetime
    +>>> now = datetime.datetime.now()
    +>>> db.log.insert(event='port scan', event_time=now, severity=1)
    +1
    +>>> db.log.insert(event='xss injection', event_time=now, severity=2)
    +2
    +>>> db.log.insert(event='unauthorized login', event_time=now, severity=3)
    +3
    +
    +
    +
    +

    `` Like``, `` ilike``, `` regexp``, `` startswith``, `` endswith``, `` contains``, `` upper``, `` lower``

    +

    Campos tem um `` operador like`` que você pode usar para combinar strings:

    +
    >>> for row in db(db.log.event.like('port%')).select():
    +...     print(row.event)
    +...
    +port scan
    +
    +
    +

    Aqui “porta%” indica uma partida string com “porta”. O personagem por cento sinal, “%”, é um personagem wild-card que significa “qualquer sequência de caracteres”.

    +

    O `` operador like`` mapeia para a palavra como em ANSI-SQL. COMO é sensível a maiúsculas na maioria dos bancos de dados, e depende do agrupamento do próprio banco de dados. O método like` é, portanto, case-sensível, mas ele pode ser feito de maiúsculas e minúsculas com

    +
    db.mytable.myfield.like('value', case_sensitive=False)
    +
    +
    +

    que é o mesmo que usar `` ilike``

    +
    db.mytable.myfield.ilike('value')
    +
    +
    +

    py4web também fornece alguns atalhos:

    +
    db.mytable.myfield.startswith('value')
    +db.mytable.myfield.endswith('value')
    +db.mytable.myfield.contains('value')
    +
    +
    +

    que são aproximadamente equivalentes, respectivamente, a

    +
    db.mytable.myfield.like('value%')
    +db.mytable.myfield.like('%value')
    +db.mytable.myfield.like('%value%')
    +
    +
    +

    Remember that contains has a special meaning for list:<type> +fields, as discussed in `` Lista: <type> `` e `` contains``.

    +

    O método contains` também pode ser passada uma lista de valores e um argumento booleano opcional` all` para procurar registros que contêm todos os valores:

    +
    db.mytable.myfield.contains(['value1', 'value2'], all=True)
    +
    +
    +

    ou qualquer valor a partir da lista

    +
    db.mytable.myfield.contains(['value1', 'value2'], all=False)
    +
    +
    +

    Há um também um `` método regexp`` que funciona como o método like` mas permite sintaxe de expressão regular para a expressão look-up. Ele só é suportado pelo MySQL, Oracle, PostgreSQL, SQLite, e MongoDB (com diferente grau de apoio).

    +

    O `` upper`` e `` métodos lower`` permitem converter o valor do campo para maiúsculas ou minúsculas, e você também pode combiná-los com o gosto do operador:

    +
    >>> for row in db(db.log.event.upper().like('PORT%')).select():
    +...     print(row.event)
    +...
    +port scan
    +
    +
    +
    +
    +

    `` Year``, `` month``, `` day``, `` hour``, `` minutes``, `` seconds``

    +

    A data ea data e hora campos têm `` day``, `` month`` e `` métodos year``. Os campos de data e hora e de tempo têm `` hour``, `` `` minutes`` e métodos seconds``. Aqui está um exemplo:

    +
    >>> for row in db(db.log.event_time.year() > 2018).select():
    +...     print(row.event)
    +...
    +port scan
    +xss injection
    +unauthorized login
    +
    +
    +
    +
    +

    `` Belongs``

    +

    O operador IN SQL é realizado através do método belongs` que devolve verdadeiro quando o valor do campo pertence ao conjunto especificado (lista ou tuplos):

    +
    >>> for row in db(db.log.severity.belongs((1, 2))).select():
    +...     print(row.event)
    +...
    +port scan
    +xss injection
    +
    +
    +

    A DAL também permite que um SELECT aninhada como o argumento do operador pertence. A única limitação é que o seleccione aninhada tem de ser um `` _select``, não um `` SELECT``, e apenas um campo tem de ser seleccionada explicitamente, o que define o conjunto.

    +
    >>> bad_days = db(db.log.severity == 3)._select(db.log.event_time)
    +>>> for row in db(db.log.event_time.belongs(bad_days)).select():
    +...     print(row.severity, row.event)
    +...
    +1 port scan
    +2 xss injection
    +3 unauthorized login
    +
    +
    +

    Nos cases em que um seleto aninhada é necessária e o campo look-up é uma referência também podemos usar uma consulta como argumento. Por exemplo:

    +
    db.define_table('person', Field('name'))
    +db.define_table('thing',
    +                Field('name'),
    +                Field('owner_id', 'reference person'))
    +
    +db(db.thing.owner_id.belongs(db.person.name == 'Jonathan')).select()
    +
    +
    +

    Neste case, é óbvio que o SELECT aninhada só precisa do campo referenciado pelo campo `` db.thing.owner_id`` por isso não precisa do `` notação mais detalhado _select``.

    +

    A selecção pode aninhada também ser usado como insert valor / atualização, mas, neste case, a sintaxe é diferente:

    +
    lazy = db(db.person.name == 'Jonathan').nested_select(db.person.id)
    +
    +db(db.thing.id == 1).update(owner_id = lazy)
    +
    +
    +

    Neste case, `` lazy`` é uma expressão aninhada que calcula o `` id`` de pessoa “Jonathan”. As duas linhas resultar em uma consulta SQL única.

    +
    +
    +

    `` Sum``, `` avg``, `` min``, `` `` max`` e len``

    +

    Anteriormente, você usou o `` operador count`` para contar registros. Da mesma forma, você pode usar o `` operador sum`` para adicionar (soma) os valores de um campo específico de um grupo de registros. Tal como no case de contagem, o resultado de uma soma é recuperado através do objecto de armazenamento:

    +
    >>> sum = db.log.severity.sum()
    +>>> print(db().select(sum).first()[sum])
    +6
    +
    +
    +

    Você também pode usar `` avg``, `` min``, e `` max`` à média, mínimo e valor máximo, respectivamente, para os registros selecionados. Por exemplo:

    +
    >>> max = db.log.severity.max()
    +>>> print(db().select(max).first()[max])
    +3
    +
    +
    +

    `` Len`` calcula o comprimento do valor do campo. Ele é geralmente usado em cordas ou texto campos, mas dependendo do back-end que ainda pode funcionar para outros tipos também (boolean, integer, etc).

    +
    >>> for row in db(db.log.event.len() > 13).select():
    +...     print(row.event)
    +...
    +unauthorized login
    +
    +
    +

    As expressões podem ser combinados para formar expressões mais complexas. Por exemplo, aqui estamos calculando a soma do comprimento das strings de eventos nos logs de mais um:

    +
    >>> exp = (db.log.event.len() + 1).sum()
    +>>> db().select(exp).first()[exp]
    +43
    +
    +
    +
    +
    +

    Substrings

    +

    Pode-se construir uma expressão para se referir a uma substring. Por exemplo, podemos agrupar as coisas cujo nome começa com os mesmos três personagens e selecione apenas um de cada grupo:

    +
    db(db.thing).select(distinct = db.thing.name[:3])
    +
    +
    +
    +
    +

    Os valores por defeito com `` `` coalesce`` e coalesce_zero``

    +

    Há momentos em que você precisa para puxar um valor de banco de dados, mas também precisa de valores padrão se o valor para um registro é definido como NULL. Em SQL existe uma função, `` COALESCE``, para isso. py4web tem um método coalesce` equivalente:

    +
    >>> db.define_table('sysuser', Field('username'), Field('fullname'))
    +<Table sysuser (id, username, fullname)>
    +>>> db.sysuser.insert(username='max', fullname='Max Power')
    +1
    +>>> db.sysuser.insert(username='tim', fullname=None)
    +2
    +>>> coa = db.sysuser.fullname.coalesce(db.sysuser.username)
    +>>> for row in db().select(coa):
    +...     print(row[coa])
    +...
    +Max Power
    +tim
    +
    +
    +

    Outras vezes você precisa para calcular uma expressão matemática, mas alguns campos têm um valor definido para Nenhum quando deveria ser zero. `` Coalesce_zero`` vem para o resgate por falta Nada a zero na consulta:

    +
    >>> db.define_table('sysuser', Field('username'), Field('points'))
    +<Table sysuser (id, username, points)>
    +>>> db.sysuser.insert(username='max', points=10)
    +1
    +>>> db.sysuser.insert(username='tim', points=None)
    +2
    +>>> exp = db.sysuser.points.coalesce_zero().sum()
    +>>> db().select(exp).first()[exp]
    +10
    +>>> type(exp)
    +<class 'pydal.objects.Expression'>
    +>>> print(exp)
    +SUM(COALESCE("sysuser"."points",'0'))
    +
    +
    +
    +
    +
    +

    Exportar e importar dados

    +
    +

    CSV (uma tabela de cada vez)

    +

    Quando um objeto linhas é convertido para uma string é automaticamente serializado na CSV:

    +
    >>> rows = db(db.person.id == db.thing.owner_id).select()
    +>>> print(rows)
    +person.id,person.name,thing.id,thing.name,thing.owner_id
    +1,Alex,1,Boat,1
    +1,Alex,2,Chair,1
    +2,Bob,3,Shoes,2
    +
    +
    +

    Você pode serializar uma única tabela em formato CSV e armazená-lo em um arquivo “test.csv”:

    +
    with open('test.csv', 'wb') as dumpfile:
    +    dumpfile.write(str(db(db.person).select()))
    +
    +
    +

    Converting a Rows object into a string produces an encoded binary string +and it’s better to be explicit with the encoding used:

    +
    with open('test.csv', 'w', encoding='utf-8', newline='') as dumpfile:
    +    dumpfile.write(str(db(db.person).select()))
    +
    +
    +

    Isto é equivalente a

    +
    rows = db(db.person).select()
    +with open('test.csv', 'wb') as dumpfile:
    +    rows.export_to_csv_file(dumpfile)
    +
    +
    +

    Você pode ler o arquivo de volta CSV com:

    +
    with open('test.csv', 'rb') as dumpfile:
    +    db.person.import_from_csv_file(dumpfile)
    +
    +
    +

    Again, you can be explict about the encoding for +the exporting file:

    +
    rows = db(db.person).select()
    +with open('test.csv', 'w', encoding='utf-8', newline='') as dumpfile:
    +    rows.export_to_csv_file(dumpfile)
    +
    +
    +

    ea importação de um:

    +
    with open('test.csv', 'r', encoding='utf-8', newline='') as dumpfile:
    +    db.person.import_from_csv_file(dumpfile)
    +
    +
    +

    When importing, py4web looks for the field names in the CSV header. In +this example, it finds two columns: “person.id” and “person.name”. It +ignores the “person.” prefix, and it ignores the “id” fields. Then all +records are appended and assigned new ids.

    +
    +
    +

    CSV (todas as tabelas ao mesmo tempo)

    +

    Em py4web, você pode backup / restaurar um banco de dados inteiro com dois comandos:

    +

    Exportar:

    +
    with open('somefile.csv', 'w', encoding='utf-8', newline='') as dumpfile:
    +    db.export_to_csv_file(dumpfile)
    +
    +
    +

    Importar:

    +
    with open('somefile.csv', 'r', encoding='utf-8', newline='') as dumpfile:
    +    db.import_from_csv_file(dumpfile)
    +
    +
    +

    Este mecanismo pode ser utilizado mesmo se a banco de dados de importação é de um tipo diferente do que a banco de dados de exportação.

    +

    Os dados são armazenados em “somefile.csv” como um arquivo CSV, onde cada mesa começa com uma linha que indica o nome da tabela, e outra linha com os nomes de campos:

    +
    TABLE tablename
    +field1,field2,field3,...
    +
    +
    +

    Duas tabelas são separados por `` r n r n`` (que é duas linhas vazias). As extremidades de arquivos com a linha

    +
    END
    +
    +
    +

    O arquivo não inclui os arquivos enviados, se estes não são armazenados no banco de dados. Os upload de arquivos armazenados no sistema de arquivos deve ser despejado em separado, um zip dos “uploads” pasta pode ser suficiente na maioria dos cases.

    +

    Ao importar, os novos registros serão anexados ao banco de dados se não está vazio. Em geral, os novos registros importados não terão o mesmo ID de registro como os registros originais (salvos), mas py4web irá restaurar referências para que eles não estão quebrados, mesmo que os valores id podem mudar.

    +

    Se uma tabela contém um campo chamado `` uuid``, este campo será utilizado para identificar duplicatas. Além disso, se um registro importado tem o mesmo `` uuid`` como um registro existente, o recorde anterior será atualizada.

    +
    +
    +

    CSV e sincronização de banco de dados remoto

    +

    Considere mais uma vez o seguinte modelo:

    +
    db.define_table('person',
    +                Field('name'))
    +
    +db.define_table('thing',
    +                Field('name'),
    +                Field('owner_id', 'reference person'))
    +
    +# usage example
    +if db(db.person).isempty():
    +    nid = db.person.insert(name='Massimo')
    +    db.thing.insert(name='Chair', owner_id=nid)
    +
    +
    +

    Cada registro é identificado por um identificador e referenciado por esse id. Se você tem duas cópias do banco de dados usado por instalações py4web distintas, o id é único apenas dentro de cada banco de dados e não através das bases de dados. Este é um problema ao mesclar registros de bancos de dados diferentes.

    +

    A fim de fazer registros exclusivamente identificável através de bases de dados, eles devem: - ter um ID único (UUID), - ter uma última modificação para acompanhar o mais recente entre várias cópias, - referência o UUID em vez do id.

    +

    Isto pode ser conseguido mudando o modelo acima para:

    +
    import datetime
    +import uuid
    +
    +now = datetime.datetime.utcnow
    +
    +db.define_table('person',
    +                Field('uuid', length=64),
    +                Field('modified_on', 'datetime', default=now, update=now),
    +                Field('name'))
    +
    +db.define_table('thing',
    +                Field('uuid', length=64),
    +                Field('modified_on', 'datetime', default=now, update=now),
    +                Field('name'),
    +                Field('owner_id', length=64))
    +
    +db.person.uuid.default = db.thing.uuid.default = lambda:str(uuid.uuid4())
    +
    +db.thing.owner_id.requires = IS_IN_DB(db, 'person.uuid', '%(name)s')
    +
    +# usage example
    +if db(db.person).isempty():
    +    nid = str(uuid.uuid4())
    +    db.person.insert(uuid=nid, name='Massimo')
    +    db.thing.insert(name='Chair', owner_id=nid)
    +
    +
    +
    +

    Note-se que nas definições da tabela acima, o valor padrão para os dois campos `` uuid`` é definida como uma função de lambda, que retorna um UUID (convertido para uma strings). A função lambda é chamado uma vez para cada registro inserido, garantindo que cada registro recebe um UUID único, mesmo que vários registros são inseridos em uma única transação.

    +
    +

    Criar uma ação de controlador para exportar o banco de dados:

    +
    from py4web import response
    +
    +def export():
    +    s = StringIO.StringIO()
    +    db.export_to_csv_file(s)
    +    response.set_header('Content-Type', 'text/csv')
    +    return s.getvalue()
    +
    +
    +

    Criar uma ação de controlador para importar uma cópia salva dos outros registros de dados e sincronização:

    +
    from yatl.helpers import FORM, INPUT
    +
    +def import_and_sync():
    +    form = FORM(INPUT(_type='file', _name='data'), INPUT(_type='submit'))
    +    if form.process().accepted:
    +        db.import_from_csv_file(form.vars.data.file, unique=False)
    +        # for every table
    +        for tablename in db.tables:
    +            table = db[tablename]
    +            # for every uuid, delete all but the latest
    +            items = db(table).select(table.id, table.uuid,
    +                                     orderby=~table.modified_on,
    +                                     groupby=table.uuid)
    +            for item in items:
    +                db((table.uuid == item.uuid) & (table.id != item.id)).delete()
    +    return dict(form=form)
    +
    +
    +

    Opcionalmente, você deve criar um índice manualmente para fazer a busca por uuid mais rápido.

    +

    Alternativamente, você pode usar XML-RPC para exportar / importar o arquivo.

    +

    Se os registros referência a arquivos enviados, você também precisa exportar / importar o conteúdo da pasta uploads. Observe que os arquivos nele já são rotulados por UUIDs para que você não precisa se preocupar com conflitos de nomes e referências.

    +
    +
    +

    HTML e XML (uma tabela de cada vez)

    +

    Linhas objetos também têm um método xml` (como ajudantes) que serializa-lo para XML / HTML:

    +
    >>> rows = db(db.person.id == db.thing.owner_id).select()
    +>>> print(rows.xml())
    +
    +
    +
    <table>
    +<thead>
    +<tr><th>person.id</th><th>person.name</th>
    +    <th>thing.id</th><th>thing.name</th>
    +    <th>thing.owner_id</th>
    +</tr>
    +</thead>
    +<tbody>
    +<tr class="w2p_odd odd">
    +    <td>1</td><td>Alex</td>
    +    <td>1</td><td>Boat</td>
    +    <td>1</td>
    +</tr>
    +<tr class="w2p_even even">
    +    <td>1</td><td>Alex</td>
    +    <td>2</td><td>Chair</td>
    +    <td>1</td>
    +</tr>
    +<tr class="w2p_odd odd">
    +    <td>2</td><td>Bob</td>
    +    <td>3</td>
    +    <td>Shoes</td>
    +    <td>2</td>
    +</tr>
    +</tbody>
    +</table>
    +
    +
    +

    If you need to serialize the Rows in any other XML format with custom +tags, you can easily do that using the universal TAG XML helper +that we’ll see later and the Python syntax +*<iterable> allowed in function calls:

    +
    >>> rows = db(db.person).select()
    +>>> print(TAG.result(*[TAG.row(*[TAG.field(r[f], _name=f) for f in db.person.fields]) for r in rows]))
    +
    +
    +
    <result>
    +<row><field name="id">1</field><field name="name">Alex</field></row>
    +<row><field name="id">2</field><field name="name">Bob</field></row>
    +<row><field name="id">3</field><field name="name">Carl</field></row>
    +</result>
    +
    +
    +
    +

    Aviso

    +

    Do not confuse the TAG XML helper used here (see the `` TAG`` +chapter) with the Tags method that will be extensively explained +on the Authorization using Tags chapter.

    +
    +
    +
    +

    Representação de dados

    +

    O método Rows.export_to_csv_file` aceita um argumento de palavra-chave chamada` represent`. Quando `` True`` ele usará as colunas função `` represent`` ao exportar os dados, em vez dos dados brutos.

    +

    A função também aceita um argumento de palavra-chave chamada `` colnames`` que deve conter uma lista de nomes de colunas um desejo para exportação. O padrão é todas as colunas.

    +

    Ambos `` export_to_csv_file`` e `` import_from_csv_file`` aceitar argumentos de palavra-chave que contam o analisador CSV o formato para salvar / carregar os arquivos: - `` delimiter``: delimitador para separar valores (padrão “”) - `` quotechar : personagem para usar para citar valores String (default para aspas) - `` quoting: sistema de cotação (padrão `` csv.QUOTE_MINIMAL``)

    +

    Aqui estão algumas Exemplo de uso:

    +
    import csv
    +rows = db(query).select()
    +with open('/tmp/test.txt', 'wb') as oufile:
    +    rows.export_to_csv_file(oufile,
    +                            delimiter='|',
    +                            quotechar='"',
    +                            quoting=csv.QUOTE_NONNUMERIC)
    +
    +
    +

    O que tornaria algo semelhante a

    +
    "hello"|35|"this is the text description"|"2013-03-03"
    +
    +
    +

    Para mais informações consulte a documentação oficial do Python

    +
    +
    +
    +

    Características avançadas

    +
    +

    `` Lista: <type> `` e `` contains``

    +

    py4web fornece os seguintes tipos de campos especiais:

    +
    list:string
    +list:integer
    +list:reference <table>
    +
    +
    +

    Eles podem conter listas de cordas, de inteiros e de referências, respectivamente.

    +

    No Google App Engine NoSQL `` lista: string`` é mapeado em `` StringListProperty``, os outros dois são mapeados em `` ListProperty (int) ``. Em bancos de dados relacionais são mapeados em campos de texto que contém a lista de itens separados por `` | ``. Por exemplo `` [1, 2, 3] `` é mapeado para `` | 1 | 2 | 3 | ``.

    +

    Para listas de corda os itens são escapou de modo que qualquer `` | `` no item é substituído por um `` || ``. De qualquer forma esta é uma representação interna e é transparente para o usuário.

    +

    Você pode usar `` lista: string``, por exemplo, da seguinte maneira:

    +
    >>> db.define_table('product',
    +...                 Field('name'),
    +...                 Field('colors', 'list:string'))
    +<Table product (id, name, colors)>
    +>>> db.product.colors.requires = IS_IN_SET(('red', 'blue', 'green'))
    +>>> db.product.insert(name='Toy Car', colors=['red', 'green'])
    +1
    +>>> products = db(db.product.colors.contains('red')).select()
    +>>> for item in products:
    +...     print(item.name, item.colors)
    +...
    +Toy Car ['red', 'green']
    +
    +
    +

    `` Lista: obras integer`` da mesma forma, mas os itens devem ser inteiros.

    +

    Como de costume, os requisitos são aplicadas ao nível das formas, não no nível de `` insert``.

    +
    +

    Por `` lista: <type> `` campos de `` contém (valor) `` operador de mapas em uma consulta não trivial que verifica a existência de listas contendo o `` value``. O `` operador contains`` também funciona para regular, `` string`` e `` campos text`` e ele mapeia para um `` LIKE “% value%” ``.

    +
    +

    O `` lista: reference`` eo `` contém (valor) `` operador são particularmente úteis para de-normalize muitos-para-muitos relações. Aqui está um exemplo:

    +
    >>> db.define_table('tag',
    +...                 Field('name'),
    +...                 format='%(name)s')
    +<Table tag (id, name)>
    +>>> db.define_table('product',
    +...                 Field('name'),
    +...                 Field('tags', 'list:reference tag'))
    +<Table product (id, name, tags)>
    +>>> a = db.tag.insert(name='red')
    +>>> b = db.tag.insert(name='green')
    +>>> c = db.tag.insert(name='blue')
    +>>> db.product.insert(name='Toy Car', tags=[a, b, c])
    +1
    +>>> products = db(db.product.tags.contains(b)).select()
    +>>> for item in products:
    +...     print(item.name, item.tags)
    +...
    +Toy Car [1, 2, 3]
    +>>> for item in products:
    +...     print(item.name, db.product.tags.represent(item.tags))
    +...
    +Toy Car red, green, blue
    +
    +
    +

    Observe que um `` lista: Campo tag`` referência obter uma restrição padrão

    +
    requires = IS_IN_DB(db, db.tag._id, db.tag._format, multiple=True)
    +
    +
    +

    que produz um `` / OPTION`` gota-caixa múltipla SELECT formas.

    +

    Além disso, observe que este campo recebe um atributo represent` que representa a lista de referências como uma lista separada por vírgulas de referências formatados` padrão. Isto é usado em leitura `` forms``.

    +
    +

    Enquanto `` lista: reference`` tem um validador padrão e uma representação padrão, `` lista: integer`` e `` lista: string`` não. Então, esses dois precisam de um `` IS_IN_SET`` ou um `` validador IS_IN_DB`` se você quiser usá-los em formas.

    +
    +
    +
    +

    Herança de tabela

    +

    É possível criar uma tabela que contém todos os campos de outra tabela. É suficiente para passar a outra tabela no lugar de um campo para `` define_table``. Por exemplo

    +
    >>> db.define_table('person', Field('name'), Field('gender'))
    +<Table person (id, name, gender)>
    +>>> db.define_table('doctor', db.person, Field('specialization'))
    +<Table doctor (id, name, gender, specialization)>
    +
    +
    +

    Também é possível definir uma tabela fictícia que não está armazenado em um banco de dados, a fim de reutilizá-la em vários outros lugares. Por exemplo:

    +
    now = datetime.datetime.utcnow
    +
    +signature = db.Table(db, 'signature',
    +                     Field('is_active', 'boolean', default=True),
    +                     Field('created_on', 'datetime', default=now),
    +                     Field('created_by', db.auth_user, default=auth.user_id),
    +                     Field('modified_on', 'datetime', update=now),
    +                     Field('modified_by', db.auth_user, update=auth.user_id))
    +
    +db.define_table('payment', Field('amount', 'double'), signature)
    +
    +
    +

    Este exemplo parte do princípio que a autenticação py4web padrão está activada.

    +

    Note que se você usar `` Auth`` py4web já cria uma tal mesa para você:

    +
    auth = Auth(db)
    +db.define_table('payment', Field('amount', 'double'), auth.signature)
    +
    +
    +

    Ao usar herança de tabela, se você deseja que a tabela herdar a validadores herdar, certifique-se de definir os validadores de tabela pai antes de definir a tabela herdar.

    +
    +
    +

    `` `` Filter_in`` e filter_out``

    +

    É possível definir um filtro para cada campo a ser chamada antes de um valor é inserido na banco de dados para esse campo e depois de um valor é recuperado a partir da banco de dados.

    +

    Imagine for example that you want to store a serializable Python data +structure in a field in the JSON format. Here is how it could be +accomplished:

    +
    >>> import json
    +>>> db.define_table('anyobj',
    +...                 Field('name'),
    +...                 Field('data', 'text'))
    +<Table anyobj (id, name, data)>
    +>>> db.anyobj.data.filter_in = lambda obj: json.dumps(obj)
    +>>> db.anyobj.data.filter_out = lambda txt: json.loads(txt)
    +>>> myobj = ['hello', 'world', 1, {2: 3}]
    +>>> aid = db.anyobj.insert(name='myobjname', data=myobj)
    +>>> row = db.anyobj[aid]
    +>>> row.data
    +['hello', 'world', 1, {'2': 3}]
    +
    +
    +

    Another way to accomplish the same is by using a Field of type +SQLCustomType, as discussed in Personalizados `` tipos Field``.

    +
    +
    +

    retornos de chamada no registro de inserção, exclusão e atualização

    +

    PY4WEB fornece um mecanismo para registrar retornos de chamada para ser chamado antes e / ou após a inserção, atualização e exclusão de registros.

    +

    Cada tabela armazena seis listas de chamadas de retorno:

    +
    db.mytable._before_insert
    +db.mytable._after_insert
    +db.mytable._before_update
    +db.mytable._after_update
    +db.mytable._before_delete
    +db.mytable._after_delete
    +
    +
    +

    Você pode registrar uma função de retorno de chamada, acrescentando-o à lista correspondente. A ressalva é que, dependendo da funcionalidade, o retorno tem assinatura diferente.

    +

    This is best explained by examples.

    +
    >>> db.define_table('person', Field('name'))
    +<Table person (id, name)>
    +>>> def pprint(callback, *args):
    +...     print("%s%s" % (callback, args))
    +...
    +>>> db.person._before_insert.append(lambda f: pprint('before_insert', f))
    +>>> db.person._after_insert.append(lambda f, i: pprint('after_insert', f, i))
    +>>> db.person.insert(name='John')
    +before_insert(<OpRow {'name': 'John'}>,)
    +after_insert(<OpRow {'name': 'John'}>, 1)
    +1
    +>>> db.person._before_update.append(lambda s, f: pprint('before_update', s, f))
    +>>> db.person._after_update.append(lambda s, f: pprint('after_update', s, f))
    +>>> db(db.person.id == 1).update(name='Tim')
    +before_update(<Set ("person"."id" = 1)>, <OpRow {'name': 'Tim'}>)
    +after_update(<Set ("person"."id" = 1)>, <OpRow {'name': 'Tim'}>)
    +1
    +>>> db.person._before_delete.append(lambda s: pprint('before_delete', s))
    +>>> db.person._after_delete.append(lambda s: pprint('after_delete', s))
    +>>> db(db.person.id == 1).delete()
    +before_delete(<Set ("person"."id" = 1)>,)
    +after_delete(<Set ("person"."id" = 1)>,)
    +1
    +
    +
    +

    Como você pode ver: - `` f`` é passado o objeto `` OpRow`` com os dados para inserção ou atualização. - `` i`` é passado o id do registro recém-inserido. - `` s`` é passado o objeto `` Set`` usado para atualizar ou excluir. `` OpRow`` é um objeto auxiliar especializada em armazenamento (campo, valor) pares, você pode pensar nisso como um dicionário normal que você pode usar até mesmo com a sintaxe da notação atributo (que é `` f.name`` e `` f [ “nome”] `` são equivalentes).

    +

    Os valores de retorno destes callback deve ser `` None`` ou `` False``. Se qualquer um dos `` _antes_ * `` retorno de chamada retorna um `` valor True`` ele irá abortar a / update / operação de exclusão real de inserção.

    +

    Algumas vezes uma chamada de retorno pode precisar executar uma atualização na mesma ou em uma tabela diferente e se quer evitar disparar outras chamadas de retorno, o que poderia causar um loop infinito.

    +

    Para este efeito, há os objetos `` Set`` tem um método update_naive` que funciona como` update` mas ignora antes e depois de retornos de chamada.

    +
    +

    Cascades no banco de dados

    +

    Database schema can define relationships which trigger deletions of +related records, known as cascading. The DAL is not informed when a +record is deleted due to a cascade. So no *_delete callback will ever +be called as consequence of a cascade-deletion.

    +
    +
    +
    +

    versionamento recorde

    +

    É possível pedir py4web para salvar cada cópia de um registro quando o registro é modificado individualmente. Existem diferentes maneiras de fazer isso e que pode ser feito para todas as tabelas ao mesmo tempo usando a sintaxe:

    +
    auth.enable_record_versioning(db)
    +
    +
    +

    isso requer `` Auth``. Ele também pode ser feito para cada mesa, como discutido abaixo.

    +

    Considere a seguinte tabela:

    +
    db.define_table('stored_item',
    +                Field('name'),
    +                Field('quantity', 'integer'),
    +                Field('is_active', 'boolean',
    +                      writable=False, readable=False, default=True))
    +
    +
    +

    Observe o campo booleano oculto chamado `` is_active`` e padronizando para True.

    +

    Podemos dizer py4web para criar uma nova tabela (no mesmo ou em outro banco de dados) e armazenar todas as versões anteriores de cada registro na tabela, quando modificado.

    +

    Isso é feito da seguinte maneira:

    +
    db.stored_item._enable_record_versioning()
    +
    +
    +

    ou em uma sintaxe mais detalhado:

    +
    db.stored_item._enable_record_versioning(archive_db=db,
    +                                         archive_name='stored_item_archive',
    +                                         current_record='current_record',
    +                                         is_active='is_active')
    +
    +
    +

    O `` archive_db = db`` diz py4web para armazenar a tabela de arquivo no mesmo banco de dados como o `` tabela stored_item``. O `` archive_name`` define o nome para a tabela de arquivo. A tabela de arquivo tem os mesmos campos como a tabela original `` stored_item`` exceto que campos exclusivos não são mais exclusivo (porque ele precisa para armazenar várias versões) e tem um campo extra que nome é especificado por `` current_record`` e que é uma referência para o registo atual na tabela `` stored_item``.

    +

    Quando os registros são excluídos, eles não são realmente excluídos. Um registro excluído é copiado na tabela `` stored_item_archive`` (como quando ele é modificado) e do campo `` is_active`` é definido como False. Ao permitir gravar versões conjuntos py4web um `` common_filter`` nesta tabela que esconde todos os registros na tabela `` stored_item`` onde o campo `` is_active`` é definida como falsa. O parâmetro `` is_active`` no método _enable_record_versioning` permite especificar o nome do campo usado pelo` common_filter` para determinar se o campo foi excluído ou não.

    +
    +
    +

    filtros comuns

    +

    Um filtro comum é uma generalização da ideia multi-tenancy acima. Ele fornece uma maneira fácil de evitar a repetição da mesma consulta. Considere, por exemplo, a tabela a seguir:

    +
    db.define_table('blog_post',
    +                Field('subject'),
    +                Field('post_text', 'text'),
    +                Field('is_public', 'boolean'),
    +                common_filter = lambda query: db.blog_post.is_public == True)
    +
    +
    +

    Qualquer select, DELETE ou UPDATE nesta tabela, vai incluir posts única públicos. O atributo também pode ser modificado em tempo de execução:

    +
    db.blog_post._common_filter = lambda query: ...
    +
    +
    +

    Ela serve tanto como uma forma de evitar a repetição do “db.blog_post.is_public == True” frase em cada blog pesquisa post, e também como uma melhoria de segurança, que o impede de esquecer para não permitir a visualização de mensagens não-públicas.

    +

    No case de você realmente quer itens deixados de fora pelo filtro comum (por exemplo, permitindo que o administrador para ver mensagens não-públicas), você pode remover o filtro:

    +
    db.blog_post._common_filter = None
    +
    +
    +

    ou ignorá-lo:

    +
    db(query, ignore_common_filters=True)
    +
    +
    +
    +

    Note-se que common_filters são ignorados pela interface AppAdmin.

    +
    +
    +
    +

    Personalizados `` tipos Field``

    +

    Além de usar o `` filter_in`` e `` filter_out``, é possível definir novos tipos de campos / personalizados. Por exemplo, suponha que você deseja definir um tipo personalizado para armazenar um endereço IP:

    +
    >>> def ip2int(sv):
    +...     "Convert an IPV4 to an integer."
    +...     sp = sv.split('.'); assert len(sp) == 4 # IPV4 only
    +...     iip = 0
    +...     for i in map(int, sp): iip = (iip<<8) + i
    +...     return iip
    +...
    +>>> def int2ip(iv):
    +...     "Convert an integer to an IPV4."
    +...     assert iv > 0
    +...     iv = (iv,); ov = []
    +...     for i in range(3):
    +...         iv = divmod(iv[0], 256)
    +...         ov.insert(0, iv[1])
    +...     ov.insert(0, iv[0])
    +...     return '.'.join(map(str, ov))
    +...
    +>>> from pydal import SQLCustomType
    +>>> ipv4 = SQLCustomType(type='string', native='integer',
    +...                      encoder=lambda x : str(ip2int(x)), decoder=int2ip)
    +>>> db.define_table('website',
    +...                 Field('name'),
    +...                 Field('ipaddr', type=ipv4))
    +<Table website (id, name, ipaddr)>
    +>>> db.website.insert(name='wikipedia', ipaddr='91.198.174.192')
    +1
    +>>> db.website.insert(name='google', ipaddr='172.217.11.174')
    +2
    +>>> db.website.insert(name='youtube', ipaddr='74.125.65.91')
    +3
    +>>> db.website.insert(name='github', ipaddr='207.97.227.239')
    +4
    +>>> rows = db(db.website.ipaddr > '100.0.0.0').select(orderby=~db.website.ipaddr)
    +>>> for row in rows:
    +...     print(row.name, row.ipaddr)
    +...
    +github 207.97.227.239
    +google 172.217.11.174
    +
    +
    +

    `` SQLCustomType`` é uma fábrica tipo de campo. Seu argumento `` type`` deve ser um dos tipos py4web padrão. Diz py4web como tratar os valores de campo no nível py4web. `` Native`` é o tipo do campo, tanto quanto a banco de dados está em causa. nomes permitidos dependem do mecanismo de banco de dados. `` Encoder`` é uma transformação opcional função aplicada quando os dados são armazenados e `` decoder`` é a função de transformação inversa opcional.

    +
    +

    This feature is marked as experimental because can make your code not +portable across database engines.

    +
    +

    Ele não funciona no Google App Engine NoSQL.

    +
    +
    +

    Usando DAL sem definir tabelas

    +

    A DAL pode ser usado a partir de qualquer programa Python simplesmente fazendo isso:

    +
    from pydal import DAL, Field
    +db = DAL('sqlite://storage.sqlite', folder='path/to/app/databases')
    +
    +
    +

    ou seja, importar a DAL, conexão e especificar a pasta que contém os arquivos .table (a pasta app / bancos de dados).

    +

    Para acessar os dados e seus atributos ainda temos que definir todas as tabelas que vão de acesso com `` db.define_table``.

    +

    Se nós apenas precisam de acesso aos dados, mas não para os atributos da tabela py4web, nós fugir sem re-definir as tabelas, mas simplesmente pedindo py4web para ler as informações necessárias a partir dos metadados nos ficheiros .table:

    +
    from py4web import DAL, Field
    +db = DAL('sqlite://storage.sqlite', folder='path/to/app/databases', auto_import=True)
    +
    +
    +

    Isso nos permite acessar qualquer db.table sem necessidade de re definir-lo.

    +
    +
    +

    Transação distribuída

    +
    +

    No momento da escrita deste recurso só é suportado pelo PostgreSQL, MySQL e Firebird, uma vez que expõem API para commits de duas fases.

    +
    +

    Supondo que você tenha dois (ou mais) conexões com bancos de dados PostgreSQL distintas, por exemplo:

    +
    db_a = DAL('postgres://...')
    +db_b = DAL('postgres://...')
    +
    +
    +

    Em seus modelos ou controladores, você pode cometê-los simultaneamente com:

    +
    DAL.distributed_transaction_commit(db_a, db_b)
    +
    +
    +

    Em case de falha, esta função desfaz e levanta uma `` Exception``.

    +

    Em controladores, quando uma ação retornos, se você tiver duas ligações distintas e você não chamar a função acima, py4web compromete-los separadamente. Isto significa que há uma possibilidade de que um dos commits sucede e uma falha. A transação distribuída impede que isso aconteça.

    +
    +
    +

    Copiar dados de um para outro db

    +

    Considere a situação em que você estiver usando o seguinte banco de dados:

    +
    db = DAL('sqlite://storage.sqlite')
    +
    +
    +

    e você deseja mover para outro banco de dados usando uma seqüência de conexão diferente:

    +
    db = DAL('postgres://username:password@localhost/mydb')
    +
    +
    +

    Antes de mudar, você quer mover os dados e reconstruir todos os metadados para o novo banco de dados. Assumimos o novo banco de dados a existir, mas nós também assumir que é vazio.

    +
    +
    +
    +

    Pegadinhas

    +
    +

    Nota sobre novo DAL e adaptadores

    +

    O código fonte do Banco de Dados Camada de Abstração foi completamente reescrito em 2010. Enquanto ele permanece compatível com versões anteriores, a reescrita tornou mais modular e mais fácil de estender. Aqui nós explicamos a lógica principal.

    +

    The module “dal.py” defines, among other, the following classes.

    +
    ConnectionPool
    +BaseAdapter extends ConnectionPool
    +Row
    +DAL
    +Reference
    +Table
    +Expression
    +Field
    +Query
    +Set
    +Rows
    +
    +
    +

    Seu uso tem sido explicado nas seções anteriores, exceto para `` BaseAdapter``. Quando os métodos de um `` Table`` ou `` necessidade objeto Set`` para se comunicar com o banco de dados que confiam aos métodos do adaptador a tarefa para gerar o SQL e ou a chamada de função.

    +

    Por exemplo:

    +
    db.mytable.insert(myfield='myvalue')
    +
    +
    +

    chamadas

    +
    Table.insert(myfield='myvalue')
    +
    +
    +

    que delega o adaptador de voltar:

    +
    db._adapter.insert(db.mytable, db.mytable._listify(dict(myfield='myvalue')))
    +
    +
    +

    Aqui `` convertidos db.mytable._listify`` o dict dos argumentos em uma lista de `` (campo, valor) `` e chama o método insert` do` adapter`. `` Db._adapter`` faz mais ou menos o seguinte:

    +
    query = db._adapter._insert(db.mytable, list_of_fields)
    +db._adapter.execute(query)
    +
    +
    +

    onde a primeira linha constrói a consulta e o segundo executa.

    +

    `` BaseAdapter`` define a interface para todas as placas.

    +

    pyDAL at the moment of writing this book, contains the +following adapters:

    +
    SQLiteAdapter extends BaseAdapter
    +JDBCSQLiteAdapter extends SQLiteAdapter
    +MySQLAdapter extends BaseAdapter
    +PostgreSQLAdapter extends BaseAdapter
    +JDBCPostgreSQLAdapter extends PostgreSQLAdapter
    +OracleAdapter extends BaseAdapter
    +MSSQLAdapter extends BaseAdapter
    +MSSQL2Adapter extends MSSQLAdapter
    +MSSQL3Adapter extends MSSQLAdapter
    +MSSQL4Adapter extends MSSQLAdapter
    +FireBirdAdapter extends BaseAdapter
    +FireBirdEmbeddedAdapter extends FireBirdAdapter
    +InformixAdapter extends BaseAdapter
    +DB2Adapter extends BaseAdapter
    +IngresAdapter extends BaseAdapter
    +IngresUnicodeAdapter extends IngresAdapter
    +GoogleSQLAdapter extends MySQLAdapter
    +NoSQLAdapter extends BaseAdapter
    +GoogleDatastoreAdapter extends NoSQLAdapter
    +CubridAdapter extends MySQLAdapter (experimental)
    +TeradataAdapter extends DB2Adapter (experimental)
    +SAPDBAdapter extends BaseAdapter (experimental)
    +CouchDBAdapter extends NoSQLAdapter (experimental)
    +IMAPAdapter extends NoSQLAdapter (experimental)
    +MongoDBAdapter extends NoSQLAdapter (experimental)
    +VerticaAdapter extends MSSQLAdapter (experimental)
    +SybaseAdapter extends MSSQLAdapter (experimental)
    +
    +
    +

    que substituir o comportamento dos `` BaseAdapter``.

    +

    Cada adaptador tem mais ou menos a seguinte estrutura:

    +
    class MySQLAdapter(BaseAdapter):
    +
    +    # specify a driver to use
    +    driver = globals().get('pymysql', None)
    +
    +    # map py4web types into database types
    +    types = {
    +        'boolean': 'CHAR(1)',
    +        'string': 'VARCHAR(%(length)s)',
    +        'text': 'LONGTEXT',
    +        ...
    +        }
    +
    +    # connect to the database using driver
    +    def __init__(self, db, uri, pool_size=0, folder=None, db_codec ='UTF-8',
    +                 credential_decoder=lambda x:x, driver_args={},
    +                 adapter_args={}):
    +        # parse uri string and store parameters in driver_args
    +        ...
    +        # define a connection function
    +        def connect(driver_args=driver_args):
    +            return self.driver.connect(**driver_args)
    +        # place it in the pool
    +        self.pool_connection(connect)
    +        # set optional parameters (after connection)
    +        self.execute('SET FOREIGN_KEY_CHECKS=1;')
    +        self.execute("SET sql_mode='NO_BACKSLASH_ESCAPES';")
    +
    +   # override BaseAdapter methods as needed
    +   def lastrowid(self, table):
    +        self.execute('select last_insert_id();')
    +        return int(self.cursor.fetchone()[0])
    +
    +
    +

    Olhando para os vários adaptadores como exemplo deve ser fácil de escrever novos.

    +

    Quando `` db`` exemplo é criado:

    +
    db = DAL('mysql://...')
    +
    +
    +

    the prefix in the uri string defines the adapter. The mapping is defined +in the following dictionary also in “dal.py”:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    couchdb

    pydal.adapters.couchdb.CouchDB

    cubrid

    pydal.adapters.mysql.Cubrid

    db2:ibm_db_dbi

    pydal.adapters.db2.DB2IBM

    db2:pyodbc

    pydal.adapters.db2.DB2Pyodbc

    firebird

    pydal.adapters.firebird.FireBird

    firebird_embedded

    pydal.adapters.firebird.FireBirdEmbedded

    google:MySQLdb

    pydal.adapters.google.GoogleMySQL

    google:datastore

    pydal.adapters.google.GoogleDatastore

    google:datastore+ndb

    pydal.adapters.google.GoogleDatastore

    google:psycopg2

    pydal.adapters.google.GooglePostgres

    google:sql

    pydal.adapters.google.GoogleSQL

    informix

    pydal.adapters.informix.Informix

    informix-se

    pydal.adapters.informix.InformixSE

    ingres

    pydal.adapters.ingres.Ingres

    ingresu

    pydal.adapters.ingres.IngresUnicode

    jdbc:postgres

    pydal.adapters.postgres.JDBCPostgre

    jdbc:sqlite

    pydal.adapters.sqlite.JDBCSQLite

    jdbc:sqlite:memory

    pydal.adapters.sqlite.JDBCSQLite

    mongodb

    pydal.adapters.mongo.Mongo

    mssql

    pydal.adapters.mssql.MSSQL1

    mssql2

    pydal.adapters.mssql.MSSQL1N

    mssql3

    pydal.adapters.mssql.MSSQL3

    mssql3n

    pydal.adapters.mssql.MSSQL3N

    mssql4

    pydal.adapters.mssql.MSSQL4

    mssql4n

    pydal.adapters.mssql.MSSQL4N

    mssqln

    pydal.adapters.mssql.MSSQL1N

    mysql

    pydal.adapters.mysql.MySQL

    oracle

    pydal.adapters.oracle.Oracle

    postgres

    pydal.adapters.postgres.Postgre

    postgres2

    pydal.adapters.postgres.PostgreNew

    postgres2:psycopg2

    pydal.adapters.postgres.PostgrePsycoNew

    postgres3

    pydal.adapters.postgres.PostgreBoolean

    postgres3:psycopg2

    pydal.adapters.postgres.PostgrePsycoBoolean

    postgres:psycopg2

    pydal.adapters.postgres.PostgrePsyco

    pytds

    pydal.adapters.mssql.PyTDS

    sapdb

    pydal.adapters.sap.SAPDB

    spatialite

    pydal.adapters.sqlite.Spatialite

    spatialite:memory

    pydal.adapters.sqlite.Spatialite

    sqlite

    pydal.adapters.sqlite.SQLite

    sqlite:memory

    pydal.adapters.sqlite.SQLite

    sybase

    pydal.adapters.mssql.Sybase

    teradata

    pydal.adapters.teradata.Teradata

    vertica

    pydal.adapters.mssql.Vertica

    +

    the uri string is then parsed in more detail by the adapter itself. +An updated list of adapters can be obtained as dictionary with

    +

    For any adapter you can replace the driver with a different one +globally (not thread safe):

    +
    import MySQLdb as mysqldb
    +from pydal.adapters.mysql import SQLAdapter
    +SQLAdapter.driver = mysqldb
    +
    +
    +

    isto é `` mysqldb`` tem de ser * que * módulo com um método .Connect (). Você pode especificar argumentos motorista opcionais e argumentos adaptador:

    +
    db = DAL(..., driver_args={}, adapter_args={})
    +
    +
    +

    For recognized adapters you can also simply specify the name in the +adapter_args:

    +
    from pydal.adapters.mysql import MySQL
    +assert "mysqldv" in MySQL.drivers
    +db = DAL(..., driver_args={}, adapter_args={"driver": "mysqldb"})
    +
    +
    +
    +
    +

    SQLite

    +

    SQLite does not support dropping and altering columns. That means that +py4web migrations will work up to a point. If you delete a field from a +table, the column will remain in the database but will be invisible to +py4web. If you decide to reinstate the column, py4web will try re-create +it and fail. In this case you must set fake_migrate=True so that +metadata is rebuilt without attempting to add the column again. Also, +for the same reason, SQLite is not aware of any change of column +type. If you insert a number in a string field, it will be stored as +string. If you later change the model and replace the type “string” with +type “integer”, SQLite will continue to keep the number as a string and +this may cause problem when you try to extract the data.

    +

    SQLite não tem um tipo booleano. py4web mapeia internamente booleans para uma strings de 1 carácter, com ‘T’ e ‘F’ representar Verdadeiro e Falso. A DAL lida com isso completamente; a abstração de um verdadeiro valor booleano funciona bem. Mas se você estiver atualizando a tabela SQLite com o SQL diretamente, estar ciente da implementação py4web, e evitar o uso de 0 e 1 valores.

    +
    +
    +

    MySQL

    +

    MySQL does not support multiple ALTER TABLE within a single transaction. +This means that any migration process is broken into multiple commits. +If something happens that causes a failure it is possible to break a +migration (the py4web metadata are no longer in sync with the actual +table structure in the database). This is unfortunate but it can be +prevented (migrate one table at the time) or it can be fixed in the +aftermath (revert the py4web model to what corresponds to the table +structure in database, set fake_migrate=True and after the metadata +has been rebuilt, set fake_migrate=False and migrate the table +again).

    +
    +
    +

    Google SQL

    +

    Google SQL has the same problems as MySQL and more. In particular table +metadata itself must be stored in the database in a table that is not +migrated by py4web. This is because Google App Engine has a read-only +file system. PY4WEB migrations in Google SQL combined with the MySQL +issue described above can result in metadata corruption. Again, this can +be prevented (by migrating the table at once and then setting +migrate=False so that the metadata table is not accessed any more) or it +can fixed in the aftermath (by accessing the database using the Google +dashboard and deleting any corrupted entry from the table called +py4web_filesystem.

    +
    +
    +

    MSSQL (Microsoft SQL Server)

    +

    não MSSQL <2012 não suporta o SQL OFFSET palavra-chave. Portanto, o banco de dados não pode fazer a paginação. Ao fazer um `` limitby = (a, b) `` py4web vai buscar a primeira `` a + b`` linhas e descartar o primeiro `` a``. Isto pode resultar numa sobrecarga considerável quando comparado com outros bancos de dados. Se você estiver usando MSSQL> = 2005, o prefixo recomendado para uso é `` mssql3: // `` que fornece um método para evitar o problema de buscar todo o conjunto de resultados não-paginado. Se você estiver em MSSQL> = 2012, use `` mssql4: // `` que usa o `` OFFSET … ROWS … FETCH PRÓXIMO … ROWS ONLY`` construção para apoiar a paginação nativamente, sem sucessos de desempenho como outros backends. O `` mssql: // `` uri também reforça (por razões históricas) o uso de `` colunas text``, que são superseeded em versões mais recentes (a partir de 2005) por `` varchar (max) . `` Mssql3: // `` e `` mssql4: // `` deve ser usado se você não quer enfrentar algumas limitações do - oficialmente obsoleto - `` colunas text.

    +

    MSSQL tem problemas com referências circulares em tabelas que têm onDelete CASCADE. Este é um bug MSSQL e você trabalhar em torno dele, definindo o atributo onDelete para todos os campos de referência a “nenhuma acção”. Você também pode fazê-lo uma vez por todas, antes de definir tabelas:

    +
    db = DAL('mssql://....')
    +for key in db._adapter.types:
    +    if ' ON DELETE %(on_delete_action)s' in db._adapter.types[key]:
    +        db._adapter.types[key] = db._adapter.types[key].replace('%(on_delete_action)s', 'NO ACTION')
    +
    +
    +

    MSSQL também tem problemas com argumentos passados ​​para a palavra-chave DISTINCT e, portanto Enquanto isso funciona,

    +
    db(query).select(distinct=True)
    +
    +
    +

    isso não faz

    +
    db(query).select(distinct=db.mytable.myfield)
    +
    +
    +
    +
    +

    Oráculo

    +

    A Oracle também não suporta a paginação. Ele não suporta nem a OFFSET nem as palavras-chave limite. PY4WEB alcança a paginação, traduzindo um `` db (…). Select (limitby = (a, b)) `` em um complexo de três vias SELECT aninhada (como sugerido por documentação oficial Oracle). Isso funciona para simples escolha, mas pode quebrar para seleciona complexos envolvendo campos e ou junta alias.

    +
    +
    +

    Google NoSQL (Datastore)

    +

    Google NoSQL (Datastore) não permite que se junta, deixou junta, agregados, expressão ou envolvendo mais de uma tabela, o ‘como’ pesquisas operador em campos “texto”.

    +

    As transações são limitados e não fornecida automaticamente pelo py4web (você precisa usar a API do Google `` run_in_transaction`` que você pode procurar na documentação do Google App Engine online).

    +

    O Google também limita o número de registros que você pode recuperar em cada uma consulta (1000, no momento da escrita). No Google armazenamento de dados IDs de registro são inteiro, mas eles não são seqüenciais. Enquanto em SQL “lista: string” tipo é mapeado em um tipo de “texto”, no Google Datastore é mapeado em um `` ListStringProperty``. Da mesma forma “lista: número inteiro” e “lista: referência” são mapeados para `` ListProperty``. Isso faz buscas por conteúdo dentro desses campos tipos mais eficientes no Google NoSQL que em bancos de dados SQL.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-08.html b/apps/_documentation/static/pt/chapter-08.html new file mode 100644 index 000000000..1b288e466 --- /dev/null +++ b/apps/_documentation/static/pt/chapter-08.html @@ -0,0 +1,1222 @@ + + + + + + + + + The RestAPI — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    The RestAPI

    +

    Since version 19.5.10 pyDAL includes a restful API [CIT0801] called RestAPI. It is +inspired by GraphQL [CIT0802] and while it’s not quite the same due to it being less +powerful, it is in the spirit of py4web since it’s more practical and easier to use.

    +

    Like GraphQL RestAPI allows a client to query for information using the +GET method and allows to specify some details about the format of the +response (which references to follow, and how to denormalize the data). +Unlike GraphQL it allows the server to specify a policy and restrict +which queries are allowed and which ones are not. They can be evaluated +dynamically per request based on the user and the state of the server.

    +

    As the name implies RestAPI allows all standard methods: GET, POST, PUT, +and DELETE. Each of them can be enabled or disabled based on the policy, +for individual tables and individual fields.

    +
    +

    Nota

    +

    Specifications might be subject to changes since this is a new feature.

    +
    +

    In the examples below we assume a simple app called “superheroes”:

    +
    # in superheroes/__init__.py
    +import os
    +from py4web import action, request, Field, DAL
    +from pydal.restapi import RestAPI, Policy
    +
    +# database definition
    +DB_FOLDER = os.path.join(os.path.dirname(__file__), 'databases')
    +if not os.path.isdir(DB_FOLDER):
    +    os.mkdir(DB_FOLDER)
    +db = DAL('sqlite://storage.sqlite', folder=DB_FOLDER)
    +db.define_table(
    +    'person',
    +    Field('name'),
    +    Field('job'))
    +db.define_table(
    +    'superhero',
    +    Field('name'),
    +    Field('real_identity', 'reference person'))
    +db.define_table(
    +    'superpower',
    +    Field('description'))
    +db.define_table(
    +    'tag',
    +    Field('superhero', 'reference superhero'),
    +    Field('superpower', 'reference superpower'),
    +    Field('strength', 'integer'))
    +
    +# add example entries in db
    +if not db(db.person).count():
    +    db.person.insert(name='Clark Kent', job='Journalist')
    +    db.person.insert(name='Peter Park', job='Photographer')
    +    db.person.insert(name='Bruce Wayne', job='CEO')
    +    db.superhero.insert(name='Superman', real_identity=1)
    +    db.superhero.insert(name='Spiderman', real_identity=2)
    +    db.superhero.insert(name='Batman', real_identity=3)
    +    db.superpower.insert(description='Flight')
    +    db.superpower.insert(description='Strength')
    +    db.superpower.insert(description='Speed')
    +    db.superpower.insert(description='Durability')
    +    db.tag.insert(superhero=1, superpower=1, strength=100)
    +    db.tag.insert(superhero=1, superpower=2, strength=100)
    +    db.tag.insert(superhero=1, superpower=3, strength=100)
    +    db.tag.insert(superhero=1, superpower=4, strength=100)
    +    db.tag.insert(superhero=2, superpower=2, strength=50)
    +    db.tag.insert(superhero=2, superpower=3, strength=75)
    +    db.tag.insert(superhero=2, superpower=4, strength=10)
    +    db.tag.insert(superhero=3, superpower=2, strength=80)
    +    db.tag.insert(superhero=3, superpower=3, strength=20)
    +    db.tag.insert(superhero=3, superpower=4, strength=70)
    +    db.commit()
    +
    +# policy definitions
    +policy = Policy()
    +policy.set('superhero', 'GET', authorize=True, allowed_patterns=['*'])
    +policy.set('*', 'GET', authorize=True, allowed_patterns=['*'])
    +
    +# for security reasons we disabled here all methods but GET at the policy level,
    +# to enable any of them just set authorize = True
    +policy.set('*', 'PUT', authorize=False)
    +policy.set('*', 'POST', authorize=False)
    +policy.set('*', 'DELETE', authorize=False)
    +
    +@action('api/<tablename>/', method = ['GET', 'POST'])
    +@action('api/<tablename>/<rec_id>', method = ['GET', 'PUT', 'DELETE'])
    +@action.uses(db)
    +def api(tablename, rec_id=None):
    +    return RestAPI(db, policy)(request.method,
    +                            tablename,
    +                            rec_id,
    +                            request.GET,
    +                            request.POST
    +                            )
    +
    +@action("index")
    +def index():
    +    return "RestAPI example"
    +
    +
    +
    +

    RestAPI policies and actions

    +

    The policy is per table (or * for all tables) and per method. authorize +can be True (allow), False (deny) or a function with the signature +(method, tablename, record_id, get_vars, post_vars) which returns +True/False. For the GET policy one can specify a list of allowed query +patterns (* for all). A query pattern will be matched against the keys +in the query string.

    +

    A acção acima referida é exposto como:

    +
    /superheroes/api/{tablename}
    +/superheroes/api/{tablename}/{rec_id}
    +
    +
    +

    The result can be seen directly with a browser, rendered as JSON. +Let’s look for example at the person table:

    +_images/restapi.png +

    The diagram of the superhero’s database should help you interpreting the code:

    +_images/restapi2.png +
    +

    Nota

    +

    Keep in mind that request.POST only contains the form data +that is posted using a regular HTML-form or JavaScript +FormData object.

    +
    +
    +
    +

    RestAPI GET

    +

    A consulta geral tem a forma `` {} algo .eq = value`` onde `` eq = `` significa “igual”, `` gt = `` significa “maior que”, etc. A expressão pode ser prefixado por `` not.``.

    +

    {something} can be:

    +
      +
    • the name of a field in the table being queried as in:

      +
      +

      ** Todos os super-heróis chamado de “Superman” **

      +
      /superheroes/api/superhero?name.eq=Superman
      +
      +
      +
      +
    • +
    • the name of a field of a table referred by the table being queried as in:

      +
      +

      ** Todos os super-heróis com a identidade real “Clark Kent” **

      +
      /superheroes/api/superhero?real_identity.name.eq=Clark Kent
      +
      +
      +
      +
    • +
    • the name of a field of a table that refers to the table being queried as in:

      +
      +

      ** Todos os super-heróis com qualquer superpotência tag com força> 90 **

      +
      /superheroes/api/superhero?superhero.tag.strength.gt=90
      +
      +
      +

      (here tag is the name of the link table, the preceding superhero is +the name of the field that refers to the selected table and strength +is the name of the field used to filter)

      +
      +
    • +
    • a field of the table referenced by a many-to-many linked table as in:

      +
      +

      ** Todos os super-heróis com o poder de vôo **

      +
      /superheroes/api/superhero?superhero.tag.superpower.description.eq=Flight
      +
      +
      +
      +
    • +
    +
    +

    Dica

    +

    The key to understand the syntax above is to read it as:

    +

    << select records of table superhero referred by field superhero +of table tag, when the superpower field of said table points +to a record with description equal to “Flight” >>

    +
    +

    The query allows additional modifiers for example:

    +
    @offset=10
    +@limit=10
    +@order=name
    +@model=true
    +@lookup=real_identity
    +
    +
    +

    The first 3 are obvious. @model returns a JSON description of database +model. @lookup denormalizes the linked field.

    +
    +
    +

    RestAPI practical examples

    +

    Aqui estão alguns exemplos práticos:

    +

    URL:

    +
    /superheroes/api/superhero
    +
    +
    +

    RESULTADO:

    +
    {
    +    "count": 3,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "real_identity": 1,
    +            "name": "Superman",
    +            "id": 1
    +        },
    +        {
    +            "real_identity": 2,
    +            "name": "Spiderman",
    +            "id": 2
    +        },
    +        {
    +            "real_identity": 3,
    +            "name": "Batman",
    +            "id": 3
    +        }
    +    ],
    +    "timestamp": "2019-05-19T05:38:00.132635",
    +    "api_version": "0.1"
    +}
    +
    +
    +

    URL:

    +
    /superheroes/api/superhero?@model=true
    +
    +
    +

    RESULTADO:

    +
    {
    +    "count": 3,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "real_identity": 1,
    +            "name": "Superman",
    +            "id": 1
    +        },
    +        {
    +            "real_identity": 2,
    +            "name": "Spiderman",
    +            "id": 2
    +        },
    +        {
    +            "real_identity": 3,
    +            "name": "Batman",
    +            "id": 3
    +        }
    +    ],
    +    "timestamp": "2021-01-04T07:03:38.466030",
    +    "model": [
    +        {
    +            "regex": "[1-9]\\d*",
    +            "name": "id",
    +            "default": null,
    +            "required": false,
    +            "label": "Id",
    +            "post_writable": true,
    +            "referenced_by": [
    +                "tag.superhero"
    +            ],
    +            "unique": false,
    +            "type": "id",
    +            "options": null,
    +            "put_writable": true
    +        },
    +        {
    +            "regex": null,
    +            "name": "name",
    +            "default": null,
    +            "required": false,
    +            "label": "Name",
    +            "post_writable": true,
    +            "unique": false,
    +            "type": "string",
    +            "options": null,
    +            "put_writable": true
    +        },
    +        {
    +            "regex": null,
    +            "name": "real_identity",
    +            "default": null,
    +            "required": false,
    +            "label": "Real Identity",
    +            "post_writable": true,
    +            "references": "person",
    +            "unique": false,
    +            "type": "reference",
    +            "options": null,
    +            "put_writable": true
    +        }
    +    ],
    +    "api_version": "0.1"
    +}
    +
    +
    +

    URL:

    +
    /superheroes/api/superhero?@lookup=real_identity
    +
    +
    +

    RESULTADO:

    +
    {
    +    "count": 3,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "real_identity": {
    +                "name": "Clark Kent",
    +                "job": "Journalist",
    +                "id": 1
    +            },
    +            "name": "Superman",
    +            "id": 1
    +        },
    +        {
    +            "real_identity": {
    +                "name": "Peter Park",
    +                "job": "Photographer",
    +                "id": 2
    +            },
    +            "name": "Spiderman",
    +            "id": 2
    +        },
    +        {
    +            "real_identity": {
    +                "name": "Bruce Wayne",
    +                "job": "CEO",
    +                "id": 3
    +            },
    +            "name": "Batman",
    +            "id": 3
    +        }
    +    ],
    +    "timestamp": "2019-05-19T05:38:00.178974",
    +    "api_version": "0.1"
    +}
    +
    +
    +

    URL:

    +
    /superheroes/api/superhero?@lookup=identity:real_identity
    +
    +
    +

    (Desnormalizar o real_identity e renomeá-lo de identidade)

    +

    RESULTADO:

    +
    {
    +    "count": 3,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "real_identity": 1,
    +            "name": "Superman",
    +            "id": 1,
    +            "identity": {
    +                "name": "Clark Kent",
    +                "job": "Journalist",
    +                "id": 1
    +            }
    +        },
    +        {
    +            "real_identity": 2,
    +            "name": "Spiderman",
    +            "id": 2,
    +            "identity": {
    +                "name": "Peter Park",
    +                "job": "Photographer",
    +                "id": 2
    +            }
    +        },
    +        {
    +            "real_identity": 3,
    +            "name": "Batman",
    +            "id": 3,
    +            "identity": {
    +                "name": "Bruce Wayne",
    +                "job": "CEO",
    +                "id": 3
    +            }
    +        }
    +    ],
    +    "timestamp": "2019-05-19T05:38:00.123218",
    +    "api_version": "0.1"
    +}
    +
    +
    +

    URL:

    +
    /superheroes/api/superhero?@lookup=identity!:real_identity[name,job]
    +
    +
    +

    (Desnormalizar o real_identity [mas apenas campos nome e trabalho], recolher a com o prefixo de identidade)

    +

    RESULTADO:

    +
    {
    +    "count": 3,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "name": "Superman",
    +            "identity.job": "Journalist",
    +            "identity.name": "Clark Kent",
    +            "id": 1
    +        },
    +        {
    +            "name": "Spiderman",
    +            "identity.job": "Photographer",
    +            "identity.name": "Peter Park",
    +            "id": 2
    +        },
    +        {
    +            "name": "Batman",
    +            "identity.job": "CEO",
    +            "identity.name": "Bruce Wayne",
    +            "id": 3
    +        }
    +    ],
    +    "timestamp": "2021-01-04T07:03:38.559918",
    +    "api_version": "0.1"
    +}
    +
    +
    +

    URL:

    +
    /superheroes/api/superhero?@lookup=superhero.tag
    +
    +
    +

    RESULTADO:

    +
    {
    +    "count": 3,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "real_identity": 1,
    +            "name": "Superman",
    +            "superhero.tag": [
    +                {
    +                    "strength": 100,
    +                    "superhero": 1,
    +                    "id": 1,
    +                    "superpower": 1
    +                },
    +                {
    +                    "strength": 100,
    +                    "superhero": 1,
    +                    "id": 2,
    +                    "superpower": 2
    +                },
    +                {
    +                    "strength": 100,
    +                    "superhero": 1,
    +                    "id": 3,
    +                    "superpower": 3
    +                },
    +                {
    +                    "strength": 100,
    +                    "superhero": 1,
    +                    "id": 4,
    +                    "superpower": 4
    +                }
    +            ],
    +            "id": 1
    +        },
    +        {
    +            "real_identity": 2,
    +            "name": "Spiderman",
    +            "superhero.tag": [
    +                {
    +                    "strength": 50,
    +                    "superhero": 2,
    +                    "id": 5,
    +                    "superpower": 2
    +                },
    +                {
    +                    "strength": 75,
    +                    "superhero": 2,
    +                    "id": 6,
    +                    "superpower": 3
    +                },
    +                {
    +                    "strength": 10,
    +                    "superhero": 2,
    +                    "id": 7,
    +                    "superpower": 4
    +                }
    +            ],
    +            "id": 2
    +        },
    +        {
    +            "real_identity": 3,
    +            "name": "Batman",
    +            "superhero.tag": [
    +                {
    +                    "strength": 80,
    +                    "superhero": 3,
    +                    "id": 8,
    +                    "superpower": 2
    +                },
    +                {
    +                    "strength": 20,
    +                    "superhero": 3,
    +                    "id": 9,
    +                    "superpower": 3
    +                },
    +                {
    +                    "strength": 70,
    +                    "superhero": 3,
    +                    "id": 10,
    +                    "superpower": 4
    +                }
    +            ],
    +            "id": 3
    +        }
    +    ],
    +    "timestamp": "2019-05-19T05:38:00.201988",
    +    "api_version": "0.1"
    +}
    +
    +
    +

    URL:

    +
    /superheroes/api/superhero?@lookup=superhero.tag.superpower
    +
    +
    +

    RESULTADO:

    +
    {
    +    "count": 3,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "real_identity": 1,
    +            "name": "Superman",
    +            "superhero.tag.superpower": [
    +                {
    +                    "strength": 100,
    +                    "superhero": 1,
    +                    "id": 1,
    +                    "superpower": {
    +                        "id": 1,
    +                        "description": "Flight"
    +                    }
    +                },
    +                {
    +                    "strength": 100,
    +                    "superhero": 1,
    +                    "id": 2,
    +                    "superpower": {
    +                        "id": 2,
    +                        "description": "Strength"
    +                    }
    +                },
    +                {
    +                    "strength": 100,
    +                    "superhero": 1,
    +                    "id": 3,
    +                    "superpower": {
    +                        "id": 3,
    +                        "description": "Speed"
    +                    }
    +                },
    +                {
    +                    "strength": 100,
    +                    "superhero": 1,
    +                    "id": 4,
    +                    "superpower": {
    +                        "id": 4,
    +                        "description": "Durability"
    +                    }
    +                }
    +            ],
    +            "id": 1
    +        },
    +        {
    +            "real_identity": 2,
    +            "name": "Spiderman",
    +            "superhero.tag.superpower": [
    +                {
    +                    "strength": 50,
    +                    "superhero": 2,
    +                    "id": 5,
    +                    "superpower": {
    +                        "id": 2,
    +                        "description": "Strength"
    +                    }
    +                },
    +                {
    +                    "strength": 75,
    +                    "superhero": 2,
    +                    "id": 6,
    +                    "superpower": {
    +                        "id": 3,
    +                        "description": "Speed"
    +                    }
    +                },
    +                {
    +                    "strength": 10,
    +                    "superhero": 2,
    +                    "id": 7,
    +                    "superpower": {
    +                        "id": 4,
    +                        "description": "Durability"
    +                    }
    +                }
    +            ],
    +            "id": 2
    +        },
    +        {
    +            "real_identity": 3,
    +            "name": "Batman",
    +            "superhero.tag.superpower": [
    +                {
    +                    "strength": 80,
    +                    "superhero": 3,
    +                    "id": 8,
    +                    "superpower": {
    +                        "id": 2,
    +                        "description": "Strength"
    +                    }
    +                },
    +                {
    +                    "strength": 20,
    +                    "superhero": 3,
    +                    "id": 9,
    +                    "superpower": {
    +                        "id": 3,
    +                        "description": "Speed"
    +                    }
    +                },
    +                {
    +                    "strength": 70,
    +                    "superhero": 3,
    +                    "id": 10,
    +                    "superpower": {
    +                        "id": 4,
    +                        "description": "Durability"
    +                    }
    +                }
    +            ],
    +            "id": 3
    +        }
    +    ],
    +    "timestamp": "2019-05-19T05:38:00.322494",
    +    "api_version": "0.1"
    +}
    +
    +
    +

    URL (it’s a single line, split for readability):

    +
    /superheroes/api/superhero?
    +@lookup=powers:superhero.tag[strength].superpower[description]
    +
    +
    +

    RESULTADO:

    +
    {
    +    "count": 3,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "real_identity": 1,
    +            "name": "Superman",
    +            "powers": [
    +                {
    +                    "strength": 100,
    +                    "superpower": {
    +                        "description": "Flight"
    +                    }
    +                },
    +                {
    +                    "strength": 100,
    +                    "superpower": {
    +                        "description": "Strength"
    +                    }
    +                },
    +                {
    +                    "strength": 100,
    +                    "superpower": {
    +                        "description": "Speed"
    +                    }
    +                },
    +                {
    +                    "strength": 100,
    +                    "superpower": {
    +                        "description": "Durability"
    +                    }
    +                }
    +            ],
    +            "id": 1
    +        },
    +        {
    +            "real_identity": 2,
    +            "name": "Spiderman",
    +            "powers": [
    +                {
    +                    "strength": 50,
    +                    "superpower": {
    +                        "description": "Strength"
    +                    }
    +                },
    +                {
    +                    "strength": 75,
    +                    "superpower": {
    +                        "description": "Speed"
    +                    }
    +                },
    +                {
    +                    "strength": 10,
    +                    "superpower": {
    +                        "description": "Durability"
    +                    }
    +                }
    +            ],
    +            "id": 2
    +        },
    +        {
    +            "real_identity": 3,
    +            "name": "Batman",
    +            "powers": [
    +                {
    +                    "strength": 80,
    +                    "superpower": {
    +                        "description": "Strength"
    +                    }
    +                },
    +                {
    +                    "strength": 20,
    +                    "superpower": {
    +                        "description": "Speed"
    +                    }
    +                },
    +                {
    +                    "strength": 70,
    +                    "superpower": {
    +                        "description": "Durability"
    +                    }
    +                }
    +            ],
    +            "id": 3
    +        }
    +    ],
    +    "timestamp": "2019-05-19T05:38:00.309903",
    +    "api_version": "0.1"
    +}
    +
    +
    +

    URL (it’s a single line, split for readability):

    +
    /superheroes/api/superhero?
    +@lookup=powers!:superhero.tag[strength].superpower[description]
    +
    +
    +

    RESULTADO:

    +
    {
    +    "count": 3,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "real_identity": 1,
    +            "name": "Superman",
    +            "powers": [
    +                {
    +                    "strength": 100,
    +                    "description": "Flight"
    +                },
    +                {
    +                    "strength": 100,
    +                    "description": "Strength"
    +                },
    +                {
    +                    "strength": 100,
    +                    "description": "Speed"
    +                },
    +                {
    +                    "strength": 100,
    +                    "description": "Durability"
    +                }
    +            ],
    +            "id": 1
    +        },
    +        {
    +            "real_identity": 2,
    +            "name": "Spiderman",
    +            "powers": [
    +                {
    +                    "strength": 50,
    +                    "description": "Strength"
    +                },
    +                {
    +                    "strength": 75,
    +                    "description": "Speed"
    +                },
    +                {
    +                    "strength": 10,
    +                    "description": "Durability"
    +                }
    +            ],
    +            "id": 2
    +        },
    +        {
    +            "real_identity": 3,
    +            "name": "Batman",
    +            "powers": [
    +                {
    +                    "strength": 80,
    +                    "description": "Strength"
    +                },
    +                {
    +                    "strength": 20,
    +                    "description": "Speed"
    +                },
    +                {
    +                    "strength": 70,
    +                    "description": "Durability"
    +                }
    +            ],
    +            "id": 3
    +        }
    +    ],
    +    "timestamp": "2019-05-19T05:38:00.355181",
    +    "api_version": "0.1"
    +}
    +
    +
    +

    URL (it’s a single line, split for readability):

    +
    /superheroes/api/superhero?
    +@lookup=powers!:superhero.tag[strength].superpower[description],
    +identity!:real_identity[name]
    +
    +
    +

    RESULTADO:

    +
    {
    +    "count": 3,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "name": "Superman",
    +            "identity.name": "Clark Kent",
    +            "powers": [
    +                {
    +                    "strength": 100,
    +                    "description": "Flight"
    +                },
    +                {
    +                    "strength": 100,
    +                    "description": "Strength"
    +                },
    +                {
    +                    "strength": 100,
    +                    "description": "Speed"
    +                },
    +                {
    +                    "strength": 100,
    +                    "description": "Durability"
    +                }
    +            ],
    +            "id": 1
    +        },
    +        {
    +            "name": "Spiderman",
    +            "identity.name": "Peter Park",
    +            "powers": [
    +                {
    +                    "strength": 50,
    +                    "description": "Strength"
    +                },
    +                {
    +                    "strength": 75,
    +                    "description": "Speed"
    +                },
    +                {
    +                    "strength": 10,
    +                    "description": "Durability"
    +                }
    +            ],
    +            "id": 2
    +        },
    +        {
    +            "name": "Batman",
    +            "identity.name": "Bruce Wayne",
    +            "powers": [
    +                {
    +                    "strength": 80,
    +                    "description": "Strength"
    +                },
    +                {
    +                    "strength": 20,
    +                    "description": "Speed"
    +                },
    +                {
    +                    "strength": 70,
    +                    "description": "Durability"
    +                }
    +            ],
    +            "id": 3
    +        }
    +    ],
    +    "timestamp": "2021-01-04T07:31:34.974953",
    +    "api_version": "0.1"
    +}
    +
    +
    +

    URL:

    +
    /superheroes/api/superhero?name.eq=Superman
    +
    +
    +

    RESULTADO:

    +
    {
    +    "count": 1,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "real_identity": 1,
    +            "name": "Superman",
    +            "id": 1
    +        }
    +    ],
    +    "timestamp": "2019-05-19T05:38:00.405515",
    +    "api_version": "0.1"
    +}
    +
    +
    +

    URL:

    +
    /superheroes/api/superhero?real_identity.name.eq=Clark Kent
    +
    +
    +

    RESULTADO:

    +
    {
    +    "count": 1,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "real_identity": 1,
    +            "name": "Superman",
    +            "id": 1
    +        }
    +    ],
    +    "timestamp": "2019-05-19T05:38:00.366288",
    +    "api_version": "0.1"
    +}
    +
    +
    +

    URL:

    +
    /superheroes/api/superhero?not.real_identity.name.eq=Clark Kent
    +
    +
    +

    RESULTADO:

    +
    {
    +    "count": 2,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "real_identity": 2,
    +            "name": "Spiderman",
    +            "id": 2
    +        },
    +        {
    +            "real_identity": 3,
    +            "name": "Batman",
    +            "id": 3
    +        }
    +    ],
    +    "timestamp": "2019-05-19T05:38:00.451907",
    +    "api_version": "0.1"
    +}
    +
    +
    +

    URL:

    +
    /superheroes/api/superhero?superhero.tag.superpower.description=Flight
    +
    +
    +

    RESULTADO:

    +
    {
    +    "count": 1,
    +    "status": "success",
    +    "code": 200,
    +    "items": [
    +        {
    +            "real_identity": 1,
    +            "name": "Superman",
    +            "id": 1
    +        }
    +    ],
    +    "timestamp": "2019-05-19T05:38:00.453020",
    +    "api_version": "0.1"
    +}
    +
    +
    +
    +
    +

    The RestAPI response

    +

    All RestAPI response have the fields:

    +
    +
    api_version:
    +

    RestAPI version.

    +
    +
    timestamp:
    +

    Datetime in ISO 8601 format.

    +
    +
    status:
    +

    RestAPI status (i.e. «success» or «error»).

    +
    +
    code:
    +

    HTTP status.

    +
    +
    +

    Other optional fields are:

    +
    +
    count:
    +

    Total matching (not total returned), for GET.

    +
    +
    items:
    +

    In response to a GET.

    +
    +
    errors:
    +

    Usually a validation error.

    +
    +
    models:
    +

    Usually if status != «success».

    +
    +
    message:
    +

    For error details.

    +
    +
    + +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-09.html b/apps/_documentation/static/pt/chapter-09.html new file mode 100644 index 000000000..b521c771b --- /dev/null +++ b/apps/_documentation/static/pt/chapter-09.html @@ -0,0 +1,787 @@ + + + + + + + + + Linguagem de template YATL — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Linguagem de template YATL

    +

    py4web uses two distinct template languages for rendering dynamic HTML pages that contain Python code:

    + +

    Since Renoir does not include HTML helpers (see next chapter), py4web by default uses the Renoir module for rendering templates and the yatl module for helpers, +plus some minor trickery to make them work together seamlessly.

    +

    py4web also uses double square brackets [[ ... ]] to escape Python code embedded in HTML, unless specified otherwise.

    +

    The advantage of using square brackets instead of angle brackets is that +it’s transparent to all common HTML editors. This allows the developer +to use those editors to create py4web templates.

    +
    +

    Aviso

    +

    Be careful not to mix Python code square brackets with other square brackets! +For example, you’ll soon see syntax like this:

    +
    +
    [[items = ['a', 'b', 'c']]] # this gives "Internal Server Error"
    +[[items = ['a', 'b', 'c'] ]] # this works
    +
    +
    +
    +

    It’s mandatory to add a space after the first closed bracket for +separating the list from the Python code square brackets.

    +
    +

    Since the developer is embedding Python code into HTML, the document +should be indented according to HTML rules, and not Python rules. +Therefore, we allow un-indented Python inside the [[ ... ]] tags. +But since Python normally uses indentation to delimit blocks of code, we +need a different way to delimit them; this is why the py4web template +language makes use of the Python keyword pass.

    +

    A code block starts with a line ending with a colon and ends with a +line beginning with pass. The keyword pass is not necessary +when the end of the block is obvious from the context.

    +

    Aqui está um exemplo:

    +
    [[
    +if i == 0:
    +response.write('i is 0')
    +else:
    +response.write('i is not 0')
    +pass
    +]]
    +
    +
    +

    Note que `` pass`` é uma palavra-chave Python, não uma palavra-chave py4web. Alguns editores Python, como Emacs, use a palavra-chave `` pass`` para significar a divisão de blocos e usá-lo para o código re-indent automaticamente.

    +

    O linguagem de template py4web faz exatamente a mesma. Quando encontra algo como:

    +
    <html><body>
    +[[for x in range(10):]][[=x]] hello <br />[[pass]]
    +</body></html>
    +
    +
    +

    que traduz em um programa:

    +
    response.write("""<html><body>""", escape=False)
    +for x in range(10):
    +    response.write(x)
    +    response.write(""" hello <br />""", escape=False)
    +response.write("""</body></html>""", escape=False)
    +
    +
    +

    response.write writes to the response body.

    +

    When there is an error in a py4web template, the error report shows the +generated template code, not the actual template as written by the developer. +This helps the developer debug the code by highlighting the actual code +that is executed (which is something that can be debugged with an HTML +editor or the DOM inspector of the browser).

    +

    Observe também que:

    +
    [[=x]]
    +
    +
    +

    gera

    +
    response.write(x)
    +
    +
    +

    Variables injected into the HTML in this way are escaped by default. The +escaping is ignored if x is an XML object, even if escape is set +to True (see `` XML`` later for details).

    +

    Aqui está um exemplo que introduz o `` H1`` helper:

    +
    [[=H1(i)]]
    +
    +
    +

    que é traduzido para:

    +
    response.write(H1(i))
    +
    +
    +

    mediante avaliação, o objeto `` H1`` e seus componentes são recursivamente serializados, escapou e escrita para o corpo da resposta. As tags gerados pelo `` H1`` e HTML interior não escapamos. Este mecanismo garante que todo o texto - e somente texto - exibido na página web é sempre escaparam, evitando assim vulnerabilidades XSS. Ao mesmo tempo, o código é simples e fácil de depurar.

    +

    O método `` response.write (obj, escapar = True) `` recebe dois argumentos, o objeto a ser escrito e se ele tem que ser escapado (definido como `` True`` por padrão). Se `` obj`` tem um `` .xml () `` método, ele é chamado e o resultado escrito para o corpo da resposta (o argumento `` escape`` é ignorado). Caso contrário, ele usa `` __str__`` o método do objeto para serializar-lo e, se o argumento fuga é `` True``, lhe escapa. Todos os built-in helper objetos ( `` H1`` no exemplo) são objetos que sabem como serializar-se através do `` .xml () `` método.

    +

    This is all done transparently.

    +
    +

    Nota

    +

    While the response object used inside the controllers is a +full bottle.response object, inside the yatl templates it is +replaced by a dummy object (yatl.template.DummyResponse). +This object is quite different, and much simpler: it only has a write method! +Also, you never need to (and never should) call the response.write +method explicitly.

    +
    +
    +

    Sintaxe básica

    +

    The py4web template language supports all Python control structures. +Here we provide some examples of each of them. They can be nested +according to usual programming practice. +You can easily test them by copying the _scaffold app (see +Copying the _scaffold app) and then editing the file +new_app/template/index.html.

    +
    +

    `` Para … in``

    +

    Em templates você pode fazer um loop sobre qualquer objeto iterável:

    +
    [[items = ['a', 'b', 'c'] ]]
    +<ul>
    +[[for item in items:]]<li>[[=item]]</li>[[pass]]
    +</ul>
    +
    +
    +

    que produz:

    +
    <ul>
    +<li>a</li>
    +<li>b</li>
    +<li>c</li>
    +</ul>
    +
    +
    +

    Aqui `` items`` é qualquer objeto iterável como uma lista Python, Python tupla, ou linhas objeto, ou qualquer objeto que é implementado como um iterador. Os elementos apresentados são primeiro serializado e escapou.

    +
    +
    +

    `` While``

    +

    Você pode criar um loop usando a palavra-chave, enquanto:

    +
    [[k = 3]]
    +<ul>
    +[[while k > 0:]]<li>[[=k]][[k = k - 1]]</li>[[pass]]
    +</ul>
    +
    +
    +

    que produz:

    +
    <ul>
    +<li>3</li>
    +<li>2</li>
    +<li>1</li>
    +</ul>
    +
    +
    +
    +
    +

    `` If … elif … else``

    +

    Você pode usar cláusulas condicionais:

    +
    [[
    +import random
    +k = random.randint(0, 100)
    +]]
    +<h2>
    +[[=k]]
    +[[if k % 2:]]is odd[[else:]]is even[[pass]]
    +</h2>
    +
    +
    +

    que produz:

    +
    <h2>
    +45 is odd
    +</h2>
    +
    +
    +

    Uma vez que é óbvio que `` else`` encerra a primeira `` if`` bloco, não há necessidade de um `` declaração pass``, e usando um seria incorreto. No entanto, você deve fechar explicitamente a opção `` bloco else`` com um `` pass``.

    +

    Lembre-se que, em Python “else if” está escrito `` elif`` como no exemplo a seguir:

    +
    [[
    +import random
    +k = random.randint(0, 100)
    +]]
    +<h2>
    +[[=k]]
    +[[if k % 4 == 0:]]is divisible by 4
    +[[elif k % 2 == 0:]]is even
    +[[else:]]is odd
    +[[pass]]
    +</h2>
    +
    +
    +

    Produz:

    +
    <h2>
    +64 is divisible by 4
    +</h2>
    +
    +
    +
    +
    +

    `` Tentar … exceto … else … finally``

    +

    It is also possible to use try...except statements in templates with one +caveat. Consider the following example:

    +
    [[try:]]
    +Hello [[= 1 / 0]]
    +[[except:]]
    +division by zero
    +[[else:]]
    +no division by zero
    +[[finally:]]
    +<br />
    +[[pass]]
    +
    +
    +

    Ela irá produzir o seguinte resultado:

    +
    Hello division by zero
    +<br />
    +
    +
    +

    Este exemplo ilustra que todas as saídas gerado antes de ocorrer uma exceção é processado (incluindo a saída que precedeu a excepção) no interior do bloco de teste. “Olá” é escrito porque precede a exceção.

    +
    +
    +

    `` Def … return``

    +

    O linguagem de template py4web permite ao desenvolvedor definir e implementar funções que podem retornar qualquer objeto Python ou uma cadeia de texto / html. Aqui, consideramos dois exemplos:

    +
    [[def itemize1(link): return LI(A(link, _href="http://" + link))]]
    +<ul>
    +[[=itemize1('www.google.com')]]
    +</ul>
    +
    +
    +

    produz o seguinte resultado:

    +
    <ul>
    +<li><a href="http://www.google.com">www.google.com</a></li>
    +</ul>
    +
    +
    +

    A função `` itemize1`` devolve um objecto auxiliar que é inserido no local em que a função é chamada.

    +

    Considere agora o seguinte código:

    +
    [[def itemize2(link):]]
    +<li><a href="http://[[=link]]">[[=link]]</a></li>
    +[[return]]
    +<ul>
    +[[itemize2('www.google.com')]]
    +</ul>
    +
    +
    +

    Ela produz exactamente o mesmo resultado como acima. Neste caso, a função `` itemize2`` representa um pedaço de HTML que vai substituir a tag py4web onde a função é chamada. Observe que não existe ‘=’ na frente da chamada para `` itemize2``, já que a função não retornar o texto, mas escreve-lo diretamente para a resposta.

    +

    There is one caveat: functions defined inside a template must terminate with +a return statement, or the automatic indentation will fail.

    +
    +
    +
    +

    Information workflow

    +

    For dynamically modifying the workflow of the information there are custom commands available: +extend, include, block and super. Note that they are special template +directives, not Python commands.

    +

    In addition, you can use normal Python functions inside templates.

    +
    +

    extend and include

    +

    Templates can extend and include other templates in a tree-like structure.

    +

    For example, we can think of a template “index.html” that extends +“layout.html” and includes “body.html”. At the same time, “layout.html” +may include “header.html” and “footer.html”.

    +

    The root of the tree is what we call a layout template. Just like any other +HTML template file, you can edit it from the command line or using the py4web Dashboard. +The file name “layout.html” is just a convention.

    +

    Here is a minimalist page that extends the “layout.html” template and +includes the “page.html” template:

    +
    <!--minimalist_page.html-->
    +[[extend 'layout.html']]
    +<h1>Hello World</h1>
    +[[include 'page.html']]
    +
    +
    +

    The extended layout file must contain an [[include]] directive, +something like:

    +
    <!--layout.html-->
    +<html>
    +  <head>
    +    <title>Page Title</title>
    +  </head>
    +  <body>
    +    [[include]]
    +  </body>
    +</html>
    +
    +
    +

    When the template is called, the extended (layout) template is loaded, and the +calling template replaces the [[include]] directive inside the layout. +If you don’t write the [[include]] directive inside the layout, then it will +be included at the beginning of the file. Also, if you use multiple [[extend]] +directives only the last one will be processed. +Processing continues recursively until all extend and include +directives have been processed. The resulting template is then +translated into Python code.

    +

    Note, when an application is bytecode +compiled, it is this Python code that is compiled, not the original template +files themselves. So, the bytecode compiled version of a given template is a +single .pyc file that includes the Python code not just for the original +template file, but for its entire tree of extended and included templates.

    +

    Any content or code that precedes the [[extend ...]] directive will +be inserted (and therefore executed) before the beginning of the +extended template’s content/code. Although this is not typically used to +insert actual HTML content before the extended template’s content, it can be +useful as a means to define variables or functions that you want to make +available to the extended template. For example, consider a template +“index.html”:

    +
    <!--index.html-->
    +[[sidebar_enabled=True]]
    +[[extend 'layout.html']]
    +<h1>Home Page</h1>
    +
    +
    +

    and an excerpt from “layout.html”:

    +
    <!--layout.html-->
    +[[include]]
    +[[if sidebar_enabled:]]
    +    <div id="sidebar">
    +        Sidebar Content
    +    </div>
    +[[pass]]
    +
    +
    +

    Because the sidebar_enabled assignment in “index.html” comes before +the extend, that line gets inserted before the beginning of +“layout.html”, making sidebar_enabled available anywhere within the +“layout.html” code.

    +

    It is also worth pointing out that the variables returned by the +controller function are available not only in the function’s main template, +but in all of its extended and included templates as well.

    +
    +
    +

    Extending using variables

    +

    The argument of an extend or include (i.e., the extended or +included template name) can be a Python variable (though not a Python +expression). However, this imposes a limitation – templates that use +variables in extend or include statements cannot be bytecode +compiled. As noted above, bytecode-compiled templates include the entire +tree of extended and included templates, so the specific extended and +included templates must be known at compile time, which is not possible if +the template names are variables (whose values are not determined until run +time). Because bytecode compiling templates can provide a significant speed +boost, using variables in extend and include should generally be +avoided if possible.

    +

    In some cases, an alternative to using a variable in an include is +simply to place regular [[include ...]] directives inside an +if...else block.

    +
    [[if some_condition:]]
    +   [[include 'this_template.html']]
    +[[else:]]
    +   [[include 'that_template.html']]
    +[[pass]]
    +
    +
    +

    The above code does not present any problem for bytecode compilation +because no variables are involved. Note, however, that the bytecode +compiled template will actually include the Python code for both +“this_template.html” and “that_template.html”, though only the code for one of +those templates will be executed, depending on the value of +some_condition.

    +

    Keep in mind, this only works for include – you cannot place +[[extend ...]] directives inside if...else blocks.

    +

    Layouts are used to encapsulate page commonality (headers, footers, +menus), and though they are not mandatory, they will make your +application easier to write and maintain.

    +
    +
    +

    Template Functions

    +

    Consider this “layout.html”:

    +
    <!--layout.html-->
    +<html>
    +  <body>
    +    [[include]]
    +    <div class="sidebar">
    +      [[if 'mysidebar' in globals():]][[mysidebar()]][[else:]]
    +        my default sidebar
    +      [[pass]]
    +    </div>
    +  </body>
    +</html>
    +
    +
    +

    and this extending template

    +
    [[def mysidebar():]]
    +   my new sidebar!!!
    +[[return]]
    +[[extend 'layout.html']]
    +   Hello World!!!
    +
    +
    +

    Notice the function is defined before the [[extend...]] statement – +this results in the function being created before the “layout.html” code +is executed, so the function can be called anywhere within +“layout.html”, even before the [[include]]. Also notice the function +is included in the extended template without the = prefix.

    +

    The code generates the following output:

    +
    <html>
    +  <body>
    +    Hello World!!!
    +    <div class="sidebar">
    +      my new sidebar!!!
    +    </div>
    +  </body>
    +</html>
    +
    +
    +

    Notice that the function is defined in HTML (although it could also +contain Python code) so that response.write is used to write its +content (the function does not return the content). This is why the +layout calls the template function using [[mysidebar()]] rather than +[[=mysidebar()]]. Functions defined in this way can take arguments.

    +
    +
    +

    block and super

    +

    The main way to make a template more modular is by using +[[block ...]]s and this mechanism is an alternative to the +mechanism discussed in the previous section.

    +

    To understand how this works, consider apps based on the scaffolding app +welcome, which has a template layout.html. This template is extended by the template +default/index.html via [[extend 'layout.html']]. The contents of +layout.html predefine certain blocks with certain default content, and +these are therefore included into default/index.html.

    +

    You can override these default content blocks by enclosing your new +content inside the same block name. The location of the block in the +layout.html is not changed, but the contents is.

    +

    Here is a simplified version. Imagine this is “layout.html”:

    +
    <html>
    +  <body>
    +    [[include]]
    +    <div class="sidebar">
    +      [[block mysidebar]]
    +        my default sidebar (this content to be replaced)
    +      [[end]]
    +    </div>
    +  </body>
    +</html>
    +
    +
    +

    and this is a simple extending template default/index.html:

    +
    [[extend 'layout.html']]
    +Hello World!!!
    +[[block mysidebar]]
    +my new sidebar!!!
    +[[end]]
    +
    +
    +

    It generates the following output, where the content is provided by the +over-riding block in the extending template, yet the enclosing DIV and class +comes from layout.html. This allows consistency across templates:

    +
    <html>
    +  <body>
    +    Hello World!!!
    +    <div class="sidebar">
    +        my new sidebar!!!
    +    </div>
    +  </body>
    +</html>
    +
    +
    +

    The real layout.html defines a number of useful blocks, and you can +easily add more to match the layout your desire.

    +

    You can have many blocks, and if a block is present in the extended template +but not in the extending template, the content of the extended template is used. +Also, notice that unlike with functions, it is not necessary to define +blocks before the [[extend ...]] – even if defined after the +extend, they can be used to make substitutions anywhere in the +extended template.

    +

    Inside a block, you can use the expression [[super]] to include the +content of the parent. For example, if we replace the above extending +template with:

    +
    [[extend 'layout.html']]
    +Hello World!!!
    +[[block mysidebar]]
    +[[super]]
    +my new sidebar!!!
    +[[end]]
    +
    +
    +

    we get:

    +
    <html>
    +  <body>
    +    Hello World!!!
    +    <div class="sidebar">
    +        my default sidebar
    +        my new sidebar!
    +    </div>
    +  </body>
    +</html>
    +
    +
    +
    +
    +
    +

    Page layout standard structure

    +
    +

    Default page layout

    +

    The “templates/layout.html” that currently ships with the py4web _scaffold +application is quite complex but it has the following structure:

    +
     1 <!DOCTYPE html>
    + 2 <html>
    + 3   <head>
    + 4     <base href="[[=URL('static')]]/">
    + 5     <meta name="viewport" content="width=device-width, initial-scale=1">
    + 6     <link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAAQEAAAEAIAAwAAAAFgAAACgAAAABAAAAAgAAAAEAIAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAA=="/>
    + 7     <link rel="stylesheet" href="css/no.css">
    + 8     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css" integrity="sha512-1PKOgIY59xJ8Co8+NE6FZ+LOAZKjy+KY8iq0G4B3CyeY6wYHN3yt9PW0XpSriVlkMXe40PTKnXrLnZ9+fkDaog==" crossorigin="anonymous" />
    + 9     <style>.py4web-validation-error{margin-top:-16px; font-size:0.8em;color:red}</style>
    +10     [[block page_head]]<!-- individual pages can customize header here -->[[end]]
    +11   </head>
    +12   <body>
    +13     <header>
    +14       <!-- Navigation bar -->
    +15       <nav class="black">
    +16         <!-- Logo -->
    +17         <a href="[[=URL('index')]]">
    +18           <b>py4web <script>document.write(window.location.href.split('/')[3]);</script></b>
    +19         </a>
    +20         <!-- Do not touch this -->
    +21         <label for="hamburger"></label>
    +22         <input type="checkbox" id="hamburger">
    +23         <!-- Left menu ul/li -->
    +24         [[block page_left_menu]][[end]]
    +25         <!-- Right menu ul/li -->
    +26         <ul>
    +27           [[if globals().get('user'):]]
    +28           <li>
    +29             <a class="navbar-link is-primary">
    +30               [[=globals().get('user',{}).get('email')]]
    +31             </a>
    +32             <ul>
    +33               <li><a href="[[=URL('auth/profile')]]">Edit Profile</a></li>
    +34               <li><a href="[[=URL('auth/change_password')]]">Change Password</a></li>
    +35               <li><a href="[[=URL('auth/logout')]]">Logout</a></li>
    +36             </ul>
    +37           </li>
    +38           [[else:]]
    +39           <li>
    +40             Login
    +41             <ul>
    +42               <li><a href="[[=URL('auth/register')]]">Sign up</a></li>
    +43               <li><a href="[[=URL('auth/login')]]">Log in</a></li>
    +44             </ul>
    +45           </li>
    +46           [[pass]]
    +47         </ul>
    +48       </nav>
    +49     </header>
    +50     <!-- beginning of HTML inserted by extending template -->
    +51     <center>
    +52       <div>
    +53         <!-- Flash alert messages, first optional one in data-alert -->
    +54         <flash-alerts class="padded" data-alert="[[=globals().get('flash','')]]"></flash-alerts>
    +55       </div>
    +56       <main class="padded">
    +57         <!-- contect injected by extending page -->
    +58         [[include]]
    +59       </main>
    +60     </center>
    +61     <!-- end of HTML inserted by extending template -->
    +62     <footer class="black padded">
    +63       <p>
    +64         Made with py4web
    +65       </p>
    +66     </footer>
    +67   </body>
    +68   <!-- You've gotta have utils.js -->
    +69   <script src="js/utils.js"></script>
    +70   [[block page_scripts]]<!-- individual pages can add scripts here -->[[end]]
    +71 </html>
    +
    +
    +

    There are a few features of this default layout that make it very easy +to use and customize:

    +
      +
    • it is written in HTML5

    • +
    • on line 7 it’s used the no.css stylesheet, see +here

    • +
    • on line 58 [[include]] is replaced by the content of the extending template when +the page is rendered

    • +
    • it contains the following blocks: page_head, page_left_menu, page_scripts

    • +
    • on line 30 it checks if the user is logged on and changes the menu accordingly

    • +
    • on line 54 it checks for flash alert messages

    • +
    +

    Of course you can also completely replace the “layout.html” and +the stylesheet with your own.

    +
    +
    +

    Mobile development

    +

    Although the default layout.html is designed to be mobile-friendly, one +may sometimes need to use different templates when a page is visited by a +mobile device.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-10.html b/apps/_documentation/static/pt/chapter-10.html new file mode 100644 index 000000000..7beeb0e78 --- /dev/null +++ b/apps/_documentation/static/pt/chapter-10.html @@ -0,0 +1,896 @@ + + + + + + + + + Helpers YATL — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Helpers YATL

    +
    +

    Helpers overview

    +

    Consider the following code in a template:

    +
    [[=DIV('this', 'is', 'a', 'test', _id='123', _class='myclass')]]
    +
    +
    +

    ele é processado como:

    +
    <div id="123" class="myclass">thisisatest</div>
    +
    +
    +

    You can easily test the rendering of these commands by copying the _scaffold app (see +Copying the _scaffold app) and then editing the file +new_app/template/index.html.

    +

    DIV is a helper class, i.e., something that can be used to build +HTML programmatically. It corresponds to the HTML <div> tag.

    +

    Helpers can have:

    +
      +
    • positional arguments interpreted as objects contained between the +open and close tags, like thisisatest in the previous example

    • +
    • named arguments (start with an underscore) +interpreted as HTML tag attributes (without the underscore), like _class +and _id in the previous example

    • +
    • named arguments (start without an underscore), in this case these +arguments are tag-specific

    • +
    +

    Em vez de um conjunto de argumentos sem nome, um helper também pode ter uma única lista ou tupla como seu conjunto de componentes usando a notação `` * `` e pode levar um único dicionário como seu conjunto de atributos usando o `` ** ` `, por exemplo:

    +
    [[
    +contents = ['this', 'is', 'a', 'test']
    +attributes = {'_id':'123', '_class':'myclass'}
    +=DIV(*contents, **attributes)
    +]]
    +
    +
    +

    (Produz a mesma saída que antes).

    +

    The following are the current set of helpers available within the YATL +module:

    +

    A, BEAUTIFY, BODY, CAT, CODE, DIV, EM, +FORM, H1, H2, H3, H4, H5, H6, HEAD, +HTML, IMG, INPUT, LABEL, LI, METATAG, +OL, OPTION, P, PRE, SELECT, SPAN, STRONG, +TABLE, TAG, TAGGER, THEAD, TBODY, TD, +TEXTAREA, TH, TT, TR, UL, XML, xmlescape, +I, META, LINK, TITLE, STYLE, SCRIPT

    +

    Helpers can be used to build complex expressions, that can then be serialized to +XML. For example:

    +
    [[=DIV(STRONG(I("hello ", "<world>")), _class="myclass")]]
    +
    +
    +

    é prestado:

    +
    <div class="myclass"><strong><i>hello &lt;world&gt;</i></strong></div>
    +
    +
    +

    Helpers can also be serialized into strings, equivalently, with the +__str__ and the xml methods. This can be manually tested directly +with a Python shell or by using the Opção `` comando shell`` of py4web +and then:

    +
    >>> from yatl.helpers import *
    +>>>
    +>>> str(DIV("hello world"))
    +'<div>hello world</div>'
    +>>> DIV("hello world").xml()
    +'<div>hello world</div>'
    +
    +
    +

    The helpers mechanism in py4web is more than a system to generate HTML +without concatenating strings. It provides a server-side representation +of the document object model (DOM).

    +

    Componentes de helpers podem ser referenciados através de sua posição, e helpers agir como listas com relação aos seus componentes:

    +
    >>> a = DIV(SPAN('a', 'b'), 'c')
    +>>> print(a)
    +<div><span>ab</span>c</div>
    +>>> del a[1]
    +>>> a.append(STRONG('x'))
    +>>> a[0][0] = 'y'
    +>>> print(a)
    +<div><span>yb</span><strong>x</strong></div>
    +
    +
    +

    Atributos de helpers pode ser referenciado pelo nome, e helpers agir como dicionários com relação aos seus atributos:

    +
    >>> a = DIV(SPAN('a', 'b'), 'c')
    +>>> a['_class'] = 's'
    +>>> a[0]['_class'] = 't'
    +>>> print(a)
    +<div class="s"><span class="t">ab</span>c</div>
    +
    +
    +

    Note, the complete set of components can be accessed via a list called +a.children, and the complete set of attributes can be accessed via +a dictionary called a.attributes. So, a[i] is equivalent to +a.children[i] when i is an integer, and a[s] is equivalent +to a.attributes[s] when s is a string.

    +

    Note que atributos auxiliares são passados ​​como argumentos para o auxiliar. Em alguns casos, no entanto, nomes de atributos incluem caracteres especiais que não são permitidos em identificadores Python (por exemplo, hífens) e, portanto, não podem ser usados ​​como nomes de argumentos de palavra-chave. Por exemplo:

    +
    DIV('text', _data-role='collapsible')
    +
    +
    +

    will not work because “_data-role” includes a hyphen, which will produce +a Python syntax error.

    +

    In such cases you can pass the attributes as a dictionary and make use +of Python’s ** function arguments notation, which maps a dictionary +of (key:value) pairs into a set of keyword arguments:

    +
    >>> print(DIV('text', **{'_data-role': 'collapsible'}))
    +<div data-role="collapsible">text</div>
    +
    +
    +

    Você também pode criar dinamicamente tags especiais:

    +
    >>> print(TAG['soap:Body']('whatever', **{'_xmlns:m':'http://www.example.org'}))
    +<soap:Body xmlns:m="http://www.example.org">whatever</soap:Body>
    +
    +
    +
    +
    +

    Built-in helpers

    +
    +

    `` XML``

    +

    XML is an helper object used to encapsulate text that should not be +escaped. The text may or may not contain valid XML; for example it +could contain JavaScript.

    +

    O texto neste exemplo é escapado:

    +
    >>> print(DIV("<strong>hello</strong>"))
    +<div>&lt;strong&gt;hello&lt;/strong&gt;</div>
    +
    +
    +

    usando `` XML`` você pode impedir escapar:

    +
    >>> print(DIV(XML("<strong>hello</strong>")))
    +<div><strong>hello</strong></div>
    +
    +
    +

    Às vezes você quer renderizar HTML armazenado em uma variável, mas o HTML pode conter tags inseguras como scripts:

    +
    >>> print(XML('<script>alert("unsafe!")</script>'))
    +<script>alert("unsafe!")</script>
    +
    +
    +

    Un-escaped executable input such as this (for example, entered in the +body of a comment in a blog) is unsafe, because it can be used to +generate cross site scripting (XSS) attacks against other visitors to +the page. +In this case the py4web XML helper can sanitize our text to prevent injections +and escape all tags except those that you explicitly allow. Here is an +example:

    +
    >>> print(XML('<script>alert("unsafe!")</script>', sanitize=True))
    +&lt;script&gt;alert(&quot;unsafe!&quot;)&lt;/script&gt;
    +
    +
    +

    Os `` construtores XML``, por padrão, considere o conteúdo de algumas tags e alguns de seus atributos de segurança. Você pode substituir os padrões usando os opcionais `` permitted_tags`` e `` allowed_attributes`` argumentos. Aqui estão os valores padrão dos argumentos opcionais do `` helper XML``.

    +
    XML(text, sanitize=False,
    +    permitted_tags=['a', 'b', 'blockquote', 'br/', 'i', 'li',
    +        'ol', 'ul', 'p', 'cite', 'code', 'pre', 'img/',
    +        'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'table', 'tr', 'td',
    +        'div', 'strong', 'span'],
    +    allowed_attributes={'a': ['href', 'title', 'target'],
    +        'img': ['src', 'alt'], 'blockquote': ['type'], 'td': ['colspan']})
    +
    +
    +
    +
    +

    `` A``

    +

    Este assistente é usado para construir ligações.

    +
    >>> print(A('<click>', XML('<strong>me</strong>'),
    +            _href='http://www.py4web.com'))
    +<a href="http://www.py4web.com">&lt;click&gt;<strong>me</strong></a>
    +
    +
    +
    +
    +

    `` BODY``

    +

    Este assistente faz com que o corpo de uma página.

    +
    >>> print(BODY('<hello>', XML('<strong>world</strong>'), _bgcolor='red'))
    +<body bgcolor="red">&lt;hello&gt;<strong>world</strong></body>
    +
    +
    +
    +
    +

    `` CAT``

    +

    This helper concatenates other helpers.

    +
    >>> print(CAT('Here is a ', A('link', _href='target'), ', and here is some ', STRONG('bold text'), '.'))
    +Here is a <a href="target">link</a>, and here is some <strong>bold text</strong>.
    +
    +
    +
    +
    +

    `` Div``

    +

    This is the content division element.

    +
    >>> print(DIV('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
    +<div id="0" class="test">&lt;hello&gt;<strong>world</strong></div>
    +
    +
    +
    +
    +

    `` EM``

    +

    Insiste no seu conteúdo.

    +
    >>> print(EM('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
    +<em id="0" class="test">&lt;hello&gt;<strong>world</strong></em>
    +
    +
    +
    +
    +

    `` Form``

    +

    Use this helper to make a FORM for user input. Forms will be later discussed +in detail in the dedicated Forumlários chapter.

    +
    >>> print(FORM(INPUT(_type='submit'), _action='', _method='post'))
    +<form action="" method="post"><input type="submit"/></form>
    +
    +
    +
    +
    +

    `` H1``, `` h2``, `` H3``, `` H4``, `` H5``, `` H6``

    +

    These helpers are for paragraph headings and subheadings.

    +
    >>> print(H1('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
    +<h1 id="0" class="test">&lt;hello&gt;<strong>world</strong></h1>
    +
    +
    +
    + +
    +

    `` HTML``

    +

    For tagging an HTML page.

    +
    >>> print(HTML(BODY('<hello>', XML('<strong>world</strong>'))))
    +<html><body>&lt;hello&gt;<strong>world</strong></body></html>
    +
    +
    +
    +
    +

    `` I``

    +

    Este assistente torna o seu conteúdo em itálico.

    +
    >>> print(I('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
    +<i id="0" class="test">&lt;hello&gt;<strong>world</strong></i>
    +
    +
    +
    +
    +

    `` IMG``

    +

    It can be used to embed images into HTML.

    +
    >>> print(IMG(_src='http://example.com/image.png', _alt='test'))
    +<img alt="test" src="http://example.com/image.png"/>
    +
    +
    +

    Aqui é uma combinação de helpers A, IMG, e URL para a inclusão de uma imagem estática com um link:

    +
    >>> print(A(IMG(_src=URL('static', 'logo.png'), _alt="My Logo"),
    +... _href=URL('default', 'index')))
    +<a href="/default/index"><img alt="My Logo" src="/static/logo.png"/></a>
    +
    +
    +
    +
    +

    `` INPUT``

    +

    Cria um `` <input … /> `` tag. Uma tag de entrada não pode conter outras tags, e é fechada por `` /> `` em vez de > ``. A tag de entrada tem um atributo opcional `` _type que pode ser definido como “texto” (o padrão), “enviar”, “caixa”, ou “rádio”.

    +
    >>> print(INPUT(_name='test', _value='a'))
    +<input name="test" value="a"/>
    +
    +
    +

    For radio buttons use the _checked attribute:

    +
    >>> for v in ['a', 'b', 'c']:
    +...     print(INPUT(_type='radio', _name='test', _value=v, _checked=v=='b'), v)
    +...
    +<input name="test" type="radio" value="a"/> a
    +<input checked="checked" name="test" type="radio" value="b"/> b
    +<input name="test" type="radio" value="c"/> c
    +
    +
    +

    e similarmente para caixas de seleção:

    +
    >>> print(INPUT(_type='checkbox', _name='test', _value='a', _checked=True))
    +<input checked="checked" name="test" type="checkbox" value="a"/>
    +>>> print(INPUT(_type='checkbox', _name='test', _value='a', _checked=False))
    +<input name="test" type="checkbox" value="a"/>
    +
    +
    +
    +
    +

    `` Label``

    +

    Ele é usado para criar uma tag rótulo para um campo de entrada.

    +
    >>> print(LABEL('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
    +<label id="0" class="test">&lt;hello&gt;<strong>world</strong></label>
    +
    +
    +
    +
    +

    `` LI``

    +

    Faz um item da lista e deve estar contido em um `` UL`` ou `` tag OL``.

    +
    >>> print(LI('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
    +<li id="0" class="test">&lt;hello&gt;<strong>world</strong></li>
    +
    +
    +
    +
    +

    `` OL``

    +

    It stands for ordered list. The list should contain LI tags.

    +
    >>> print(OL(LI('<hello>'), LI(XML('<strong>world</strong>')), _class='test', _id=0))
    +<ol class="test" id="0"><li>&lt;hello&gt;</li><li><strong>world</strong></li></ol>
    +
    +
    +
    +
    +

    `` OPTION``

    +

    This should only be used as argument of a SELECT.

    +
    >>> print(OPTION('<hello>', XML('<strong>world</strong>'), _value='a'))
    +<option value="a">&lt;hello&gt;<strong>world</strong></option>
    +
    +
    +

    For selected options use the _selected attribute:

    +
    >>> print(OPTION('Thank You', _value='ok', _selected=True))
    +<option selected="selected" value="ok">Thank You</option>
    +
    +
    +
    +
    +

    `` P``

    +

    Isto é para marcar um parágrafo.

    +
    >>> print(P('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
    +<p id="0" class="test">&lt;hello&gt;<strong>world</strong></p>
    +
    +
    +
    +
    +

    `` PRE``

    +

    Gera um `` <pre> … </ pre> `` tag para exibir texto pré-formatado. O `` CODE`` auxiliar é geralmente preferível para listagens de código.

    +
    >>> print(SELECT(OPTION('first', _value='1'), OPTION('second', _value='2'), _class='test', _id=0))
    +<pre id="0" class="test">&lt;hello&gt;<strong>world</strong></pre>
    +
    +
    +
    +
    +

    `` SCRIPT``

    +

    This is for include or link a script, such as JavaScript.

    +
    >>> print(SCRIPT('console.log("hello world");', _type='text/javascript'))
    +<script type="text/javascript">console.log("hello world");</script>
    +
    +
    +
    +
    +

    `` SELECT``

    +

    Makes a <select>...</select> tag. This is used with the OPTION +helper.

    +
    >>> print(SELECT(OPTION('first', _value='1'), OPTION('second', _value='2'),
    +... _class='test', _id=0))
    +<select class="test" id="0"><option value="1">first</option><option value="2">second</option></select>
    +
    +
    +
    +
    +

    `` SPAN``

    +

    Semelhante a `` div`` mas utilizado para marcação em linha (em vez de bloco) conteúdo.

    +
    >>> print(SPAN('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
    +<span id="0" class="test">&lt;hello&gt;<strong>world</strong></span>
    +
    +
    +
    +
    +

    `` STYLE``

    +

    Semelhante ao script, mas usadas para incluir ou código do link CSS. Aqui, o CSS está incluído:

    +
    >>> print(STYLE(XML('body {color: white}')))
    +<style>body {color: white}</style>
    +
    +
    +

    e aqui ela está ligada:

    +
    >>> print(STYLE(_src='style.css'))
    +<style src="style.css"></style>
    +
    +
    +
    +
    +

    `` TABLE``, `` TR``, `` TD``

    +

    Estas tags (juntamente com o opcional `` THEAD`` e `` helpers TBODY``) são utilizados para tabelas de construção HTML.

    +
    >>> print(TABLE(TR(TD('a'), TD('b')), TR(TD('c'), TD('d'))))
    +<table><tr><td>a</td><td>b</td></tr><tr><td>c</td><td>d</td></tr></table>
    +
    +
    +

    TR expects TD content.

    +

    É fácil converter uma matriz de Python em uma tabela HTML usando `` * `` notação argumentos de função do Python, que mapeia os elementos da lista para os argumentos da função posicionais.

    +

    Aqui, vamos fazê-lo linha por linha:

    +
    >>> table = [['a', 'b'], ['c', 'd']]
    +>>> print(TABLE(TR(*map(TD, table[0])), TR(*map(TD, table[1]))))
    +<table><tr><td>a</td><td>b</td></tr><tr><td>c</td><td>d</td></tr></table>
    +
    +
    +

    Aqui nós fazer todas as linhas de uma só vez:

    +
    >>> table = [['a', 'b'], ['c', 'd']]
    +>>> print(TABLE(*[TR(*map(TD, rows)) for rows in table]))
    +<table><tr><td>a</td><td>b</td></tr><tr><td>c</td><td>d</td></tr></table>
    +
    +
    +
    +
    +

    `` TBODY``

    +

    Isto é usado para linhas tag contidos no corpo de mesa, em oposição a linhas de cabeçalho ou de rodapé. É opcional.

    +
    >>> print(TBODY(TR(TD('<hello>')), _class='test', _id=0))
    +<tbody id="0" class="test"><tr><td>&lt;hello&gt;</td></tr></tbody>
    +
    +
    +
    +
    +

    `` TEXTAREA``

    +

    Este assistente faz uma <textarea> … </ textarea> tag ``.

    +
    >>> print(TEXTAREA('<hello>', XML('<strong>world</strong>'), _class='test',
    +... _cols="40", _rows="10"))
    +<textarea class="test" cols="40" rows="10">&lt;hello&gt;<strong>world</strong></textarea>
    +
    +
    +
    +
    +

    `` TH``

    +

    Este é utilizado em vez de `` TD`` em cabeçalhos de tabela.

    +
    >>> print(TH('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
    +<th id="0" class="test">&lt;hello&gt;<strong>world</strong></th>
    +
    +
    +
    +
    +

    `` THEAD``

    +

    Isto é usado para linhas de cabeçalho da tabela tag.

    +
    >>> print(THEAD(TR(TH('<hello>')), _class='test', _id=0))
    +<thead id="0" class="test"><tr><th>&lt;hello&gt;</th></tr></thead>
    +
    +
    +
    +
    +

    `` TITLE``

    +

    Isto é usado para marcar o título de uma página em um cabeçalho HTML.

    +
    >>> print(TITLE('<hello>', XML('<strong>world</strong>')))
    +<title>&lt;hello&gt;<strong>world</strong></title>
    +
    +
    +
    +
    +

    `` TT``

    +

    Etiquetas de texto como máquina de escrever texto (monoespaçada).

    +
    >>> print(TT('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
    +<tt id="0" class="test">&lt;hello&gt;<strong>world</strong></tt>
    +
    +
    +
    +
    +

    `` UL``

    +

    It stands for unordered list. The list should contain LI tags.

    +
    >>> print(UL(LI('<hello>'), LI(XML('<strong>world</strong>')), _class='test', _id=0))
    +<ul class="test" id="0"><li>&lt;hello&gt;</li><li><strong>world</strong></li></ul>
    +
    +
    +
    +
    +

    `` URL``

    +

    The URL helper is not part of yatl package, instead it is provided by py4web.

    +
    +
    +
    +

    Helpers personalizados

    +
    +

    `` TAG``

    +

    Sometimes you need to generate custom XML tags*. For this purpose py4web +provides TAG, a universal tag generator.

    +
    [[=TAG.name('a', 'b', _c='d')]]
    +
    +
    +

    gera o seguinte XML:

    +
    <name c="d">ab</name>
    +
    +
    +

    Argumentos “a”, “b” e “d” são automaticamente escapou; usar o `` helper XML`` para suprimir esse comportamento. Usando `` TAG`` você pode gerar HTML / XML marcas já não fornecidos pela API. As etiquetas podem ser aninhados, e são serializados com `` str () `` Uma sintaxe é equivalente.:

    +
    [[=TAG['name']('a', 'b', _c='d')]]
    +
    +
    +

    Tags com auto-fechamento podem ser geradas com o helper TAG. O noma da tag deve terminar com um “/”.

    +
    [[=TAG['link/'](_href='http://py4web.com')]]
    +
    +
    +

    gera o seguinte XML:

    +
    <link ref="http://py4web.com"/>
    +
    +
    +

    Notice that TAG is an object, and TAG.name or TAG['name'] is +a function that returns an helper instance.

    +
    +
    +

    `` BEAUTIFY``

    +

    `` BEAUTIFY`` é usado para representações de construção HTML de objetos compostos, incluindo listas, tuplas e dicionários:

    +
    [[=BEAUTIFY({"a": ["hello", STRONG("world")], "b": (1, 2)})]]
    +
    +
    +

    `` BEAUTIFY`` retorna um objeto serializado XML-like to XML, com uma representação de vista agradável de seu argumento construtor. Neste caso, a representação XML:

    +
    {"a": ["hello", STRONG("world")], "b": (1, 2)}
    +
    +
    +

    retribuirá como:

    +
    <table><tbody>
    +<tr><th>a</th><td><ul><li>hello</li><li><strong>world</strong></li></ul></td></tr>
    +<tr><th>b</th><td>(1, 2)</td></tr>
    +</tbody></table>
    +
    +
    +
    +
    +
    +

    Server-side DOM

    +

    As we’ve already seen the helpers mechanism in py4web also provides a server-side representation of the document object model (DOM).

    +
    +

    children

    +

    Each helper object keep the list of its components into the children +attribute.

    +
    >>> CAT('hello', STRONG('world')).children
    +['hello', <yatl.helpers.TAGGER object at 0x7fa533ff7640>]
    +
    +
    +
    +
    +

    find

    +

    To help searching into the DOM, all helpers have a find method with +the following signature:

    +
    def find(self, query=None, **kargs)
    +
    +
    +

    that returns all the components matching supplied arguments.

    +

    A very simple query can be a tag name:

    +
    >>> a = DIV(DIV(SPAN('x'), 3, DIV(SPAN('y'))))
    +>>> for c in a.find('span', first_only=True): c[0]='z'
    +>>> print(a)  # We should .xml() here instead of print
    +<div><div><span>z</span>3<div><span>y</span></div></div></div>
    +>>> for c in a.find('span'): c[0]='z'
    +>>> print(a)
    +<div><div><span>z</span>3<div><span>z</span></div></div></div>
    +
    +
    +

    It also supports a syntax compatible with jQuery, +accepting the following expressions:

    + +

    Here are some examples:

    +
    >>> a = DIV(SPAN(A('hello', **{'_id': '1-1', '_u:v': '$'})), P('world', _class='this is a test'))
    +>>> for e in a.find('div a#1-1, p.is'): print(e)
    +<a id="1-1" u:v="$">hello</a>
    +<p class="this is a test">world</p>
    +>>> for e in a.find('#1-1'): print(e)
    +<a id="1-1" u:v="$">hello</a>
    +>>> a.find('a[u:v=$]')[0].xml()
    +'<a id="1-1" u:v="$">hello</a>'
    +>>> a = FORM(INPUT(_type='text'), SELECT(OPTION(0)), TEXTAREA())
    +>>> for c in a.find('input, select, textarea'): c['_disabled'] = True
    +>>> a.xml()
    +'<form><input disabled="disabled" type="text"/><select disabled="disabled"><option>0</option></select><textarea disabled="disabled"></textarea></form>'
    +>>> for c in a.find('input, select, textarea'): c['_disabled'] = False
    +>>> a.xml()
    +'<form><input type="text"/><select><option>0</option></select><textarea></textarea></form>'
    +
    +
    +

    Elements that are matched can also be replaced or removed by specifying +a replace argument (note, a list of the original matching elements +is still returned as usual).

    +
    >>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='abc'), SPAN('z', _class='abc'))))
    +>>> b = a.find('span.abc', replace=P('x', _class='xyz'))
    +>>> print(a)
    +<div><div><p class="xyz">x</p><div><p class="xyz">x</p><p class="xyz">x</p></div></div></div>
    +
    +
    +

    replace can be a callable, which will be passed the original element and +should return a new element to replace it.

    +
    >>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='abc'), SPAN('z', _class='abc'))))
    +>>> b = a.find('span.abc', replace=lambda el: P(el[0], _class='xyz'))
    +>>> print(a)
    +<div><div><p class="xyz">x</p><div><p class="xyz">y</p><p class="xyz">z</p></div></div></div>
    +
    +
    +

    Se `` substituir = None``, os elementos correspondentes serão completamente removidas.

    +
    >>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='abc'), SPAN('z', _class='abc'))))
    +>>> b = a.find('span', text='y', replace=None)
    +>>> print(a)
    +<div><div><span class="abc">x</span><div><span class="abc"></span><span class="abc">z</span></div></div></div>
    +
    +
    +

    If a text argument is specified, elements will be searched for text +components that match text, and any matching text components will be +replaced (text is ignored if replace is not also specified, use +a find argument when you only need searching for textual elements).

    +

    Like the find argument, text can be a string or a compiled regex.

    +
    >>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='abc'), SPAN('z', _class='abc'))))
    +>>> b = a.find(text=re.compile('x|y|z'), replace='hello')
    +>>> print(a)
    +<div><div><span class="abc">hello</span><div><span class="abc">hello</span><span class="abc">hello</span></div></div></div>
    +
    +
    +

    If other attributes are specified along with text, then only components +that match the specified attributes will be searched for text.

    +
    >>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='efg'), SPAN('z', _class='abc'))))
    +>>> b = a.find('span.efg', text=re.compile('x|y|z'), replace='hello')
    +>>> print(a)
    +<div><div><span class="abc">x</span><div><span class="efg">hello</span><span class="abc">z</span></div></div></div>
    +
    +
    +
    +
    +
    +

    Using Inject

    +

    Normally all the code should be called from the controller program, and only the +necessary data is passed to the template in order to be displayed. +But sometimes it’s useful to pass variables or even use a python function as a helper called from a template.

    +

    In this case you can use the fixture Inject from py4web.utils.factories.

    +

    This is a simple example for injecting a variable:

    +
    from py4web.utils.factories import Inject
    +
    +my_var = "Example variable to be passed to a Template"
    +
    +...
    +
    +@unauthenticated("index", "index.html")
    +@action.uses(Inject(my_var=my_var))
    +def index():
    +
    +   ...
    +
    +
    +

    Then in index.html you can use the injected variable:

    +
    [[=my_var]]
    +
    +
    +

    You can also use Inject to add variables to the auth.enable line; +in this way auth forms would have access to that variable.

    +
    auth.enable(uses=(session, T, db, Inject(TIMEOFFSET=settings.TIMEOFFSET)))
    +
    +
    +

    A more complex usage of Inject is for passing python functions to templates. +For example if your helper function is called sidebar_menu +and it’s inside the libs/helpers.py module of your app, you could use this in controllers.py:

    +
    from py4web.utils.factories import Inject
    +from .libs.helpers import sidebar_menu
    +
    +@action(...)
    +@action.uses("index.html", Inject(sidebar_menu=sidebar_menu))
    +def index(): ....
    +
    +
    +

    OR

    +
    from py4web.utils.factories import Inject
    +from .libs import helpers
    +
    +@action(...)
    +@action.uses(Inject(**vars(helpers)), "index.html")
    +def index(): ....
    +
    +
    +

    Then you can import the needed code in the index.html template in a clean way:

    +
    [[=sidebar_menu]]
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-11.html b/apps/_documentation/static/pt/chapter-11.html new file mode 100644 index 000000000..31ae2d2eb --- /dev/null +++ b/apps/_documentation/static/pt/chapter-11.html @@ -0,0 +1,265 @@ + + + + + + + + + Internacionalização — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Internacionalização

    +
    +

    Pluralizar

    +

    Pluralizar é uma biblioteca Python para a Internacionalização (i18n) e Pluralização (p10n).

    +

    The library assumes a folder (for example “translations”) that contains +files like:

    +
    it.json
    +it-IT.json
    +fr.json
    +fr-FR.json
    +(etc)
    +
    +
    +

    Cada arquivo tem a seguinte estrutura, por exemplo para o italiano (it.json):

    +
    {"dog": {"0": "no cane", "1": "un cane", "2": "{n} cani", "10": "tantissimi cani"}}
    +
    +
    +

    As chaves de nível superior são as expressões a ser traduzido e o valor associado / dicionário mapeia um número para uma tradução. Diferentes traduções correspondem a diferentes formas de plural da expressão,

    +

    Aqui está outro exemplo para a palavra “cama” em checo

    +
    {"bed": {"0": "no postel", "1": "postel", "2": "postele", "5": "postelí"}}
    +
    +
    +

    Para traduzir e pluralizar de “cachorro” string um simplesmente deforma a corda na operadora T da seguinte forma:

    +
    >>> from pluralize import Translator
    +>>> T = Translator('translations')
    +>>> dog = T("dog")
    +>>> print(dog)
    +dog
    +>>> T.select('it')
    +>>> print(dog)
    +un cane
    +>>> print(dog.format(n=0))
    +no cane
    +>>> print(dog.format(n=1))
    +un cane
    +>>> print(dog.format(n=5))
    +5 cani
    +>>> print(dog.format(n=20))
    +tantissimi cani
    +
    +
    +

    A cadeia pode conter vários espaços reservados, mas o {n} espaço reservado é especial porque a variável chamada “n” é usado para determinar a pluralização pelo melhor jogo (tecla dict max <= n).

    +

    T (…) os objetos podem ser adicionados em conjunto com os outros e com a corda, como cordas regulares.

    +

    T.select (s) pode analisar uma string s seguinte HTTP aceito formato de idioma.

    +
    +
    +

    Atualizar os arquivos de tradução

    +

    Encontrar todas as cordas envoltas em T (…) em .py, .html e arquivos .js:

    +
    matches = T.find_matches('path/to/app/folder')
    +
    +
    +

    Adicione entradas recém-descobertas em todos os idiomas suportados

    +
    T.update_languages(matches)
    +
    +
    +

    Add a new supported language (for example German, “de”)

    +
    T.languages['de'] = {}
    +
    +
    +

    Certifique-se de todos os idiomas contêm as mesmas expressões de origem

    +
    known_expressions = set()
    +for language in T.languages.values():
    +    for expression in language:
    +        known_expressions.add(expression)
    +T.update_languages(known_expressions))
    +
    +
    +

    Finalmente salvar as alterações:

    +
    T.save('translations')
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-12.html b/apps/_documentation/static/pt/chapter-12.html new file mode 100644 index 000000000..9070f946c --- /dev/null +++ b/apps/_documentation/static/pt/chapter-12.html @@ -0,0 +1,1670 @@ + + + + + + + + + Forumlários — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Forumlários

    +

    The Form class provides a high-level API for quickly building CRUD (create, update and delete) forms, +especially for working on an existing database table. It can generate and process a form from a +list of desired fields and/or from an existing database table.

    +

    There are 3 types of forms:

    +

    CRUD Create forms:

    +
    @action('create_thing')
    +@action.uses('generic.html', db, flash)
    +def create_thing():
    +    form = Form(db.thing)
    +    if form.accepted:
    +        flash.set("record created")
    +        redirect(URL('other_page'))
    +    return locals()
    +
    +
    +

    CRUD Update forms:

    +
    @action('update_thing/<thing_id:int>')
    +@action.uses('generic.html', db, flash)
    +def update_thing(thing_id):
    +    form = Form(db.thing, thing_id)
    +    if form.accepted:
    +        flash.set("record updated")
    +        redirect(URL('other_page'))
    +    return locals()
    +
    +
    +

    Non-CRUD forms (not associated to a database):

    +
    @action('some_form')
    +@action.uses('generic.html', flash)
    +def some_form():
    +    fields = [
    +        Field("name", requires=IS_NOT_EMPTY()),
    +        Field("color", required=IS_IN_SET(["red","blue","green"])),
    +    ]
    +    form = Form(fields)
    +    if form.accepted:
    +        flash.set("information recorded")
    +        redirect(URL('other_page'))
    +    return locals()
    +
    +
    +

    The use of flash is optional. flash is defined in common.py +in the scaffolding application. It simply stores a message in a cookie +so it can be recovered and displayed after redirection. +This is done in the default layout.

    +

    In this chapter from now on we will assume the following model and +an app derived from the scaffolding app:

    +
    db.define_table(
    +    'thing',
    +    Field('name', requires=IS_NOT_EMPTY()),
    +    Field('color', requires=IS_IN_SET(['red','blue','green'])),
    +    Field('image', 'upload', download_url=lambda name: URL('download', name)),
    +)
    +
    +
    +
    +

    The Form constructor

    +

    O `` construtor Form`` aceita os seguintes argumentos:

    +
    Form(self,
    +     table,
    +     record=None,
    +     readonly=False,
    +     deletable=True,
    +     formstyle=FormStyleDefault,
    +     dbio=True,
    +     keep_values=False,
    +     form_name=False,
    +     hidden=None,
    +     validation=None,
    +     csrf_session=None,
    +     csrf_protection=True,
    +     lifespan=None,
    +     signing_info=None,
    +     ):
    +
    +
    +

    Onde:

    +
      +
    • table: a DAL table or a list of fields

    • +
    • `` Record``: um registro DAL ou ID de registro

    • +
    • `` Readonly``: Defina como true para fazer um formulário readonly

    • +
    • `` Deletable``: definida para Falso ao apagamento disallow de registro

    • +
    • formstyle: a function that renders the form using helpers. Can be FormStyleDefault (default), +FormStyleBulma or FormStyleBootstrap4

    • +
    • `` Dbio``: definida para Falso para evitar quaisquer gravações DB

    • +
    • `` Keep_values``: se definido como verdadeiro, ele lembra os valores do formulário previamente submetidas

    • +
    • `` Form_name``: o nome opcional desta forma

    • +
    • `` Hidden``: um dicionário de campos ocultos que é adicionado à forma

    • +
    • validation: an optional validator, see Validation functions

    • +
    • csrf_session: if None, no csrf token is added. If a session, then a CSRF token is added and verified

    • +
    • lifespan: lifespan of CSRF token in seconds, to limit form validity

    • +
    • signing_info: information that should not change between when the CSRF token is signed and verified

    • +
    +
    +
    +

    A minimal form example without a database

    +

    Let’s start with a minimal working form example. +Create a new minimal app called form_minimal :

    +
    # in controllers.py
    +from py4web impot action, redirect, URL, Field
    +from py4web.utils.form import Form
    +from pydal.validators import *
    +
    +@action('index', method=['GET', 'POST'])
    +@action.uses('form_minimal.html')
    +def index():
    +    fields = [
    +        Field('name', requires=IS_NOT_EMPTY()),
    +        Field('color', requires=IS_IN_SET(['red','blue','green'])),
    +    ]
    +    form = Form(fields)
    +    if form.accepted:
    +        # Do something with form.vars['name'] and form.vars['color']
    +        redirect(URL('accepted'))
    +    if form.errors:
    +        # do something
    +        ...
    +    return dict(form=form)
    +
    +@action("accepted")
    +def accepted():
    +    return "form_example accepted"
    +
    +
    +

    Also, you need to create a file inside the app called templates/form_minimal.html +that just contains the line:

    +
    [[extend 'layout.html']]
    +[[=form]]
    +
    +
    +

    Then reload py4web and visit http://127.0.0.1:8000/form_minimal - you’ll get the Form page:

    +_images/form1.png +

    Note that:

    +
      +
    • Form is a class contained in the py4web.utils.form module

    • +
    • it’s possible to use form validators like IS_NOT_EMPTY, see Validação de formulário later. +They are imported from the pydal.validators module

    • +
    • it’s normally important to use both the GET and the POST methods in the action where +the form is contained

    • +
    +

    This example is intentionally not using a database, a template, nor the session management. +The next example will.

    +
    +
    +

    Basic form example

    +

    In this next basic example we generate a CRUD create form from a database. +Create a new minimal app called form_basic :

    +
    # in controllers.py
    +from py4web import action, redirect, URL, Field
    +from py4web.utils.form import Form
    +from pydal.validators import *
    +from .common import db
    +
    +# controllers definition
    +@action("create_form", method=["GET", "POST"])
    +@action.uses("form_basic.html", db)
    +def create_form():
    +    form = Form(db.thing)
    +    rows = db(db.thing).select()
    +    return dict(form=form, rows=rows)
    +
    +
    +

    Note the import of two simple validators on top, in order to be used later +with the requires parameter. We’ll fully explain them +on the Validação de formulário paragraph.

    +

    You will also need a template file templates/form_basic.html that +contains, for example, the following code:

    +
    [[extend "layout.html"]]
    +
    +<h2 class="title">Form Basic example: My Things</h2>
    +
    +[[=form]]
    +
    +<h2 class="title">Rows</h2>
    +
    +<ul>
    +[[for row in rows:]]
    +<li>[[=row.id]]: [[=row.name]] has color [[=row.color]]</li>
    +[[pass]]
    +</ul>
    +
    +
    +

    Reload py4web and visit http://127.0.0.1:8000/create_form : +the result is an input form on the top of the page, and the list of all the +previously added entries on the bottom:

    +_images/form2.png +

    This is a simple example and you cannot change nor delete existing records. But if you’d +like to experiment, the database content can be fully seen and changed with the Dashboard app.

    +

    You can turn a create form into a CRUD update form by passing a record or a record id +it second argument:

    +
    # controllers definition
    +@action("update_form/<thing_id:int>", method=["GET", "POST"])
    +@action.uses("form_basic.html", db)
    +def update_form():
    +    form = Form(db.thing, thing_id)
    +    rows = db(db.thing).select()
    +    return dict(form=form, rows=rows)
    +
    +
    +
    +

    File upload field

    +

    We can make a minor modification to our reference model and an upload type file:

    +
    db.define_table(
    +    'thing',
    +    Field('name', requires=IS_NOT_EMPTY()),
    +    Field('color', requires=IS_IN_SET(['red','blue','green'])),
    +    Field('image', 'upload', download_url=lambda image: URL('download', image)),
    +)
    +
    +
    +

    The file upload field is quite particular. The standard way to use it (as in the _scaffold app) +is to have the UPLOAD_FOLDER defined in the common.py file. But if you don’t specify it, then the +default value of your_app/upload folder will be used (and the folder will also be created if needed). +download_url is a callback that given the image name, generated the URL to download. The download +url is predefined in common.py.

    +

    We can modify form_basic.html to display the uploaded images:

    +
    <h2 class="title">Form upload example: My Things</h2>
    +
    +[[=form]]
    +
    +<h2 class="title">Rows</h2>
    +
    +<ul>
    +[[for row in rows:]]
    +<li>[[=row.id]]: [[=row.name]] has color [[=row.color]]
    +    <img src="[[=URL('download', row.image)]]" />
    +[[pass]]
    +</ul>
    +
    +
    +

    The uploaded files (the thing images) are saved on the UPLOAD_FOLDER folder with their name hashed. +Other details on the upload fields can be found on Construtor Field paragraph, including +a way to save the files inside the database itself.

    +
    +
    +
    +

    Widgets

    +
    +

    Standard widgets

    +

    Py4web provides many widgets in the py4web.utility.form library. They are simple plugins +that easily allow you to specify the type of the input elements in a form, along with +some of their properties.

    +

    Here is the full list:

    +
      +
    • CheckboxWidget

    • +
    • DateTimeWidget

    • +
    • FileUploadWidget

    • +
    • ListWidget

    • +
    • PasswordWidget

    • +
    • RadioWidget

    • +
    • SelectWidget

    • +
    • TextareaWidget

    • +
    +

    This is an improved “Basic Form Example” with a radio button widget:

    +
    # in controllers.py
    +from py4web import action, redirect, URL, Field
    +from py4web.utils.form import Form, FormStyleDefault, RadioWidget
    +from pydal.validators import *
    +from .common import db
    +
    +# controllers definition
    +@action("create_form", method=["GET", "POST"])
    +@action.uses("form_widgets.html", db)
    +def create_form():
    +    FormStyleDefault.widgets['color']=RadioWidget()
    +    form = Form(db.thing, formstyle=FormStyleDefault)
    +    rows = db(db.thing).select()
    +    return dict(form=form, rows=rows)
    +
    +
    +

    Notice the differences from the “Basic Form example” we’ve seen at the +beginning of the chapter:

    +
      +
    • you need to import the widget from the py4web.utils.form library

    • +
    • before the form definition, you define the color field form style with the line:

      +
      +
      FormStyleDefault.widgets['color']=RadioWidget()
      +
      +
      +
      +
    • +
    +

    The result is the same as before, but now we have a radio button widget instead of the +dropdown menu!

    +

    Using widgets in forms is quite easy, and they’ll let you have more control on its pieces.

    +
    +

    Importante

    +

    When using py4web, use py4web widgets, and do not use the pydal widget argument in the Field object +(see Construtor Field).

    +
    +
    +
    +

    Custom widgets

    +

    You can also customize the widgets properties by subclassing the FormStyleDefault class. Let’s have a quick look, +improving again our Superhero example:

    +
    # in controllers.py
    +from py4web import action, redirect, URL, Field
    +from py4web.utils.form import Form, FormStyleDefault, RadioWidget
    +from pydal.validators import *
    +from .common import db
    +
    +# custom widget class definition
    +class MyCustomWidget:
    +    def make(self, field, value, error, title, placeholder, readonly=False):
    +        tablename = field._table if "_table" in dir(field) else "no_table"
    +        control = INPUT(
    +            _type="text",
    +            _id="%s_%s" % (tablename, field.name),
    +            _name=field.name,
    +            _value=value,
    +            _class="input",
    +            _placeholder=placeholder if placeholder and placeholder != "" else "..",
    +            _title=title,
    +            _style="font-size: x-large;color: red; background-color: black;",
    +        )
    +        return control
    +
    +# controllers definition
    +@action("create_form", method=["GET", "POST"])
    +@action.uses("form_custom_widgets.html", db)
    +def create_form():
    +    MyStyle = FormStyleDefault
    +    MyStyle.classes = FormStyleDefault.classes
    +    MyStyle.widgets['name']=MyCustomWidget()
    +    MyStyle.widgets['color']=RadioWidget()
    +
    +    form = Form(db.thing, deletable=False, formstyle=MyStyle)
    +    rows = db(db.thing).select()
    +    return dict(form=form, rows=rows)
    +
    +
    +

    The result is similar to the previous ones, but now we have a custom input field, +with foreground color red and background color black,

    +

    Even the radio button widget has changed, from red to blue.

    +
    +
    +
    +

    Advanced form design

    +
    +

    Form structure manipulation

    +

    In py4web a form is rendered by YATL helpers. This means the tree structure of a form +can be manipulated before the form is serialized in HTML. +Here is an example of how to manipulate the generate HTML structure:

    +
    db.define_table('paint', Field('color'))
    +form = Form(db.paint)
    +form.structure.find('[name=color]')[0]['_class'] = 'my-class'
    +
    +
    +

    Notice that a form does not make an HTML tree until form structure is accessed. Once accessed you can use .find(...) +to find matching elements. The argument of find is a string following the filter syntax of jQuery. In the above case +there is a single match [0] and we modify the _class attribute of that element. Attribute names of HTML elements +must be preceded by an underscore.

    +
    +
    +

    Custom forms

    +

    Custom forms allow you to granulary control how the form is processed. In the template file, you can execute specific +instructions before the form is displayed or after its data submission by inserting code among the following statements:

    +
    [[=form.custom.begin ]]
    +[[=form.custom.submit ]]
    +[[=form.custom.end ]]
    +
    +
    +

    For example you could use it to avoid displaying the id field while editing a record in your form:

    +
    [[extend 'layout.html']]
    +[[=form.custom.begin ]]
    +    [[for field in DETAIL_FIELDS: ]]
    +        [[ if field not in ['id']: ]]
    +            <div class="select">
    +                [[=form.custom.widgets[field] ]]
    +            </div>
    +        [[pass]]
    +    [[pass]]
    +[[=form.custom.submit ]]
    +[[=form.custom.end ]]
    +
    +
    +

    Note: “custom” is just a convention, it could be any name that does not clash with already defined objects.

    +
    +

    Aviso

    +

    When working with custom forms, if you have a writable field that isn’t included on your +form, it will be set to null when you save a record. Any time a field is not included +on a custom form, it should be set field.writable=False to ensure that field is not updated.

    +

    Also, custom forms only create the element for a given field, but no surrounding elements +that might be needed based on your css framework. For example, if you’re using Bulma as +your css framework, you’ll have to add an outer DIV in order to get select controls to +appear correctly.

    +
    +

    You can also be more creative and use your HTML in the template instead of using widgets:

    +
    [[extend 'layout.html']]
    +
    +[[for field, error form.errors.items:]]
    +<div class="error">Field [[=field]] [[=error]]</div>
    +[[pass]]
    +
    +[[=form.custom.begin ]]
    +
    +<div class="select">
    +     <input name="name" value="form.vars.get('name', '')"/>
    +</div>
    +<div class="select">
    +[[for color in ['red', 'blue', 'green']:]]
    +     <label>[[=color]]</label>
    +     <input name="color" type="radio" value="[[=color]]"
    +                [[if form.vars.get('color') == color:]]checked[[pass]]
    +     />
    +[[pass]]
    +</div>
    +<input type="submit" value="Click me"/>
    +[[=form.custom.end ]]
    +
    +
    +
    +
    +

    The sidecar parameter

    +

    The sidecar is the stuff injected in the form along with the submit button.

    +

    For example, you can inject a simple click me button in your form with the following +code:

    +
    form.param.sidecar = DIV(BUTTON("click me", _onclick="alert('doh!')"))
    +
    +
    +

    In particular, this is frequently used for adding a Cancel button, which is not provided by py4web:

    +
    attrs = {
    +"_onclick": "window.history.back(); return false;",
    +"_class": "button is-default",
    +}
    +form.param.sidecar.append(BUTTON("Cancel", **attrs))
    +
    +
    +
    +
    +
    +

    Validação de formulário

    +

    Validators are classes used to validate input fields (including forms generated from database tables). +They are normally assigned using the requires attribute of a table Field object, as already +shown on the Construtor Field paragraph of the DAL chapter. Also, you can use advanced validators +in order to create widgets such as drop-down menus, radio buttons and even lookups from other tables. +Last but not least, you can even explicitly define a validation function.

    +

    Here is a simple example of how to require a validator for a table field:

    +
    db.define_table(
    +    'person',
    +    Field('name',requires=IS_NOT_EMPTY(),
    +    Field('job')
    +)
    +
    +
    +

    The validator is frequently +written explicitly outside the table definition in this equivalent syntax:

    +
    db.define_table(
    +    'person',
    +    Field('name'),
    +    Field('job')
    +)
    +db.person.name.requires = IS_NOT_EMPTY()
    +
    +
    +

    A field can have a single validator or a list of multiple validators:

    +
    db.person.name.requires = [
    +    IS_NOT_EMPTY(),
    +    IS_NOT_IN_DB(db, 'person.name')]
    +
    +
    +

    Mind that the only validators that can be used with list: type fields are:

    +
      +
    • IS_IN_DB(..., multiple=True)

    • +
    • IS_IN_SET(..., multiple=True)

    • +
    • IS_NOT_EMPTY()

    • +
    • IS_LIST_OF_EMAILS()

    • +
    • IS_LIST_OF(...)

    • +
    +

    The latter can be used to apply any validator to the individual items in the list. +multiple=(1, 1000) requires a selection of between 1 and 1000 items. +This enforces selection of at least one choice.

    +

    Built-in validators have constructors that take an error_message argument:

    +
    IS_NOT_EMPTY(error_message='cannot be empty!')
    +
    +
    +

    Notice the error message is usually fist option of the constructors and you can normally +avoid to name it. Hence the following syntax is equivalent:

    +

    If you want to use internationalization like explained in a previous chapter you need to +define your own messages and wrap the validator message in the T operator:

    +
    +

    IS_NOT_EMPTY(error_message=T(“cannot be empty!”))

    +
    +
    IS_NOT_EMPTY('cannot be empty!')
    +
    +
    +

    Here is an example of a validator on a database table:

    +
    db.person.name.requires = IS_NOT_EMPTY(error_message=T('fill this!'))
    +
    +
    +

    where we have used the translation operator T to allow for internationalization. +Notice that error messages are not translated by default unless you define them explicitly with T.

    +

    One can also call validators explicitly for a field:

    +
    db.person.name.validate(value)
    +
    +
    +

    which returns a tuple (value, error) and error is None if the value validates.

    +

    You can easily test most of the following validators directly using python only. +For example:

    +
    >>> from pydal.validators import *
    +>>> IS_ALPHANUMERIC()('test')
    +('test', None)
    +>>> IS_ALPHANUMERIC()('test!')
    +('test!', 'Enter only letters, numbers, and underscore')
    +>>> IS_ALPHANUMERIC('this is not alphanumeric')('test!')
    +('test!', 'this is not alphanumeric')
    +>>> IS_ALPHANUMERIC(error_message='this is not alphanumeric')('test!')
    +('test!', 'this is not alphanumeric')
    +
    +
    +
    +

    Dica

    +

    The DAL validators are well documented inside the python source code. You can easily check it by yourself for all the details!

    +
    from pydal import validators
    +dir(validators) # get the list of all validators
    +help(validators.IS_URL) # get specific help for the IS_URL validator
    +
    +
    +
    +
    +

    Text format validators

    +
    +

    IS_ALPHANUMERIC

    +

    This validator checks that a field value contains only characters in the ranges a-z, A-Z, 0-9, and underscores.

    +
    requires = IS_ALPHANUMERIC(error_message='must be alphanumeric!')
    +
    +
    +
    +
    +

    IS_LOWER

    +

    This validator never returns an error. It just converts the value to lower case.

    +
    requires = IS_LOWER()
    +
    +
    +
    +
    +

    IS_UPPER

    +

    This validator never returns an error. It converts the value to upper case.

    +
    requires = IS_UPPER()
    +
    +
    +
    +
    +

    IS_EMAIL

    +

    It checks that the field value looks like an email address. It does not try to send email to confirm.

    +
    requires = IS_EMAIL(error_message='invalid email!')
    +
    +
    +
    +
    +

    IS_MATCH

    +

    This validator matches the value against a regular expression and returns an error if it does not match. +Here is an example of usage to validate a US zip code:

    +
    requires = IS_MATCH('^\d{5}(-\d{4})?$',
    +    error_message='not a zip code')
    +
    +
    +

    Here is an example of usage to validate an IPv4 address (note: the IS_IPV4 validator is more appropriate for this purpose):

    +
    requires = IS_MATCH('^\d{1,3}(\.\d{1,3}){3}$',
    +        error_message='not an IP address')
    +
    +
    +

    Here is an example of usage to validate a US phone number:

    +
    requires = IS_MATCH('^1?((-)\d{3}-?|\(\d{3}\))\d{3}-?\d{4}$',
    +        error_message='not a phone number')
    +
    +
    +

    For more information on Python regular expressions, refer to the official Python documentation.

    +

    IS_MATCH takes an optional argument strict which defaults to False. When set to True it only matches the whole string (from the beginning to the end):

    +
    >>> IS_MATCH('ab', strict=False)('abc')
    +('abc', None)
    +>>> IS_MATCH('ab', strict=True)('abc')
    +('abc', 'Invalid expression')
    +
    +
    +

    IS_MATCH takes an other optional argument search which defaults to False. When set to True, it uses regex method search instead of method match to validate the string.

    +

    IS_MATCH('...', extract=True) filters and extract only the first matching +substring rather than the original value.

    +
    +
    +

    IS_LENGTH

    +

    Checks if length of field’s value fits between given boundaries. Works +for both text and file inputs.

    +

    Its arguments are:

    +
      +
    • maxsize: the maximum allowed length / size (has default = 255)

    • +
    • minsize: the minimum allowed length / size

    • +
    +

    Examples: +Check if text string is shorter than 16 characters:

    +
    >>> IS_LENGTH(15)('example string')
    +('example string', None)
    +>>> IS_LENGTH(15)('example long string')
    +('example long string', 'Enter from 0 to 15 characters')
    +>>> IS_LENGTH(15)('33')
    +('33', None)
    +>>> IS_LENGTH(15)(33)
    +('33', None)
    +
    +
    +

    Check if uploaded file has size between 1KB and 1MB:

    +
    INPUT(_type='file', _name='name', requires=IS_LENGTH(1048576, 1024))
    +
    +
    +

    For all field types except for files, it checks the length of the value. +In the case of files, the value is a cgi.FieldStorage, so it validates the +length of the data in the file, which is the behavior one might intuitively expect.

    +
    +
    +

    IS_URL

    +

    Rejects a URL string if any of the following is true:

    +
      +
    • The string is empty or None

    • +
    • The string uses characters that are not allowed in a URL

    • +
    • The string breaks any of the HTTP syntactic rules

    • +
    • The URL scheme specified (if one is specified) is not “http” or “https”

    • +
    • The top-level domain (if a host name is specified) does not exist

    • +
    +

    (These rules are based on RFC 2616)

    +

    This function only checks the URL’s syntax. It does not check that the URL points to a real document, +for example, or that it otherwise makes semantic sense. This function does automatically prepend +“http://” in front of a URL in the case of an abbreviated URL (e.g. “google.ca”). +If the parameter mode='generic' is used, then this function’s behavior changes. It then rejects a URL +string if any of the following is true:

    +
      +
    • The string is empty or None

    • +
    • The string uses characters that are not allowed in a URL

    • +
    • The URL scheme specified (if one is specified) is not valid

    • +
    +

    (These rules are based on RFC 2396)

    +

    The list of allowed schemes is customizable with the allowed_schemes parameter. If you exclude None from +the list, then abbreviated URLs (lacking a scheme such as “http”) will be rejected.

    +

    The default prepended scheme is customizable with the prepend_scheme parameter. If you set prepend_scheme +to None, then prepending will be disabled. URLs that require prepending to parse will still be accepted, +but the return value will not be modified.

    +

    IS_URL is compatible with the Internationalized Domain Name (IDN) standard specified in RFC 3490). +As a result, URLs can be regular strings or unicode strings. +If the URL’s domain component (e.g. google.ca) contains non-US-ASCII letters, then the domain will +be converted into Punycode (defined in RFC 3492). IS_URL goes a +bit beyond the standards, and allows non-US-ASCII characters to be present in the path +and query components of the URL as well. These non-US-ASCII characters will be encoded. +For example, space will be encoded as”%20”. The unicode character with hex code 0x4e86 +will become “%4e%86”.

    +

    Examples:

    +
    requires = IS_URL())
    +requires = IS_URL(mode='generic')
    +requires = IS_URL(allowed_schemes=['https'])
    +requires = IS_URL(prepend_scheme='https')
    +requires = IS_URL(mode='generic',
    +                allowed_schemes=['ftps', 'https'],
    +                prepend_scheme='https')
    +
    +
    +
    +
    +

    IS_SAFE

    +
    requires = IS_SAFE(error_message='Unsafe Content')
    +requires = IS_SAFE(mode="sanitize")
    +requires = IS_SAFE(sanitizer=lambda text: str(XML(text, sanitize=True)))
    +
    +
    +

    This validators is for text fields that should contain HTML and may contain invalid tags (script, ember, object, iframe). +It works by trying to sanitize the content and either provide an error (mode=»error») or replacing the content +with the sanitized one (mode=»sanitize»). You can specify the error message, the mode, and provide your own sanitizer.

    +
    +
    +

    IS_SLUG

    +
    requires = IS_SLUG(maxlen=80, check=False, error_message='must be slug')
    +
    +
    +

    If check is set to True it check whether the validated value is a slug (allowing only alphanumeric characters and non-repeated dashes).

    +

    If check is set to False (default) it converts the input value to a slug.

    +
    +
    +

    IS_JSON

    +
    requires = IS_JSON(error_message='Invalid json', native_json=False)
    +
    +
    +

    This validator checks that a field value is in JSON format.

    +

    If native_json is set to False (default) it converts the input value to the serialized value otherwise the input value is left unchanged.

    +
    +
    +
    +

    Date and time validators

    +
    +

    IS_TIME

    +

    This validator checks that a field value contains a valid time in the specified format.

    +
    requires = IS_TIME(error_message='must be HH:MM:SS!')
    +
    +
    +
    +
    +

    IS_DATE

    +

    This validator checks that a field value contains a valid date in the specified format. It is good practice to specify the format using the translation operator, in order to support different formats in different locales.

    +
    requires = IS_DATE(format=T('%Y-%m-%d'),
    +    error_message='must be YYYY-MM-DD!')
    +
    +
    +

    For the full description on % directives look under the IS_DATETIME validator.

    +
    +
    +

    IS_DATETIME

    +

    This validator checks that a field value contains a valid datetime in the specified format. It is good practice to specify the format using the translation operator, in order to support different formats in different locales.

    +
    requires = IS_DATETIME(format=T('%Y-%m-%d %H:%M:%S'),
    +                   error_message='must be YYYY-MM-DD HH:MM:SS!')
    +
    +
    +

    The following symbols can be used for the format string (this shows the symbol, their meaning, and an example string):

    +
    %Y  year with century (e.g. '1963')
    +%y  year without century (e.g. '63')
    +%d  day of the month (e.g. '28')
    +%m  month (e.g '08')
    +%b  abbreviated month name (e.g.'Aug')
    +%B  full month name (e.g. 'August')
    +%H  hour (24-hour clock, e.g. '14')
    +%I  hour (12-hour clock, e.g. '02')
    +%p  either 'AM' or 'PM'
    +%M  minute (e.g. '30')
    +%S  second (e.g. '59')
    +
    +
    +
    +
    +

    IS_DATE_IN_RANGE

    +

    Works very much like the previous validator but allows to specify a range:

    +
    requires = IS_DATE_IN_RANGE(format=T('%Y-%m-%d'),
    +                minimum=datetime.date(2008, 1, 1),
    +                maximum=datetime.date(2009, 12, 31),
    +                error_message='must be YYYY-MM-DD!')
    +
    +
    +

    For the full description on % directives look under the IS_DATETIME validator.

    +
    +
    +

    IS_DATETIME_IN_RANGE

    +

    Works very much like the previous validator but allows to specify a range:

    +
    requires = IS_DATETIME_IN_RANGE(format=T('%Y-%m-%d %H:%M:%S'),
    +                    minimum=datetime.datetime(2008, 1, 1, 10, 30),
    +                    maximum=datetime.datetime(2009, 12, 31, 11, 45),
    +                    error_message='must be YYYY-MM-DD HH:MM::SS!')
    +
    +
    +

    For the full description on % directives look under the IS_DATETIME validator.

    +
    +
    +
    +

    Range, set and equality validators

    +
    +

    IS_EQUAL_TO

    +

    Checks whether the validated value is equal to a given value (which can be a variable):

    +
    requires = IS_EQUAL_TO(request.vars.password,
    +                    error_message='passwords do not match')
    +
    +
    +
    +
    +

    IS_NOT_EMPTY

    +

    This validator checks that the content of the field value is neither None nor an empty string nor an empty list. A string value is checked for after a .strip().

    +
    requires = IS_NOT_EMPTY(error_message='cannot be empty!')
    +
    +
    +

    You can provide a regular expression for the matching of the empty string.

    +
    requires = IS_NOT_EMPTY(error_message='Enter a value', empty_regex='NULL(?i)')
    +
    +
    +
    +
    +

    IS_NULL_OR

    +

    Deprecated, an alias for IS_EMPTY_OR described below.

    +
    +
    +

    IS_EMPTY_OR

    +

    Sometimes you need to allow empty values on a field along with other requirements. For example a field may be a date but it can also be empty. +The IS_EMPTY_OR validator allows this:

    +
    requires = IS_EMPTY_OR(IS_DATE())
    +
    +
    +

    An empty value is either None or an empty string or an empty list. A string value is checked for after a .strip().

    +

    You can provide a regular expression for the matching of the empty string with the empty_regex argument (like for IS_NOT_EMPTY validator).

    +

    You may also specify a value to be used for the empty case.

    +
    requires = IS_EMPTY_OR(IS_ALPHANUMERIC(), null='anonymous')
    +
    +
    +
    +
    +

    IS_EXPR

    +

    This validator let you express a general condition by means of a callable which takes a value to validate and returns the error message or None to accept the input value.

    +
    requires = IS_EXPR(lambda v: T('not divisible by 3') if int(v) % 3 else None)
    +
    +
    +

    Notice that returned message will not be translated if you do not arrange otherwise.

    +

    For backward compatibility the condition may be expressed as a string containing a logical expression in terms of a variable value. It validates a field value if the expression evaluates to True.

    +
    requires = IS_EXPR('int(value) % 3 == 0',
    +               error_message='not divisible by 3')
    +
    +
    +

    One should first check that the value is an integer so that an exception will not occur.

    +
    requires = [IS_INT_IN_RANGE(0, None),
    +            IS_EXPR(lambda v: T('not divisible by 3') if v % 3 else None)]
    +
    +
    +
    +
    +

    IS_DECIMAL_IN_RANGE

    +
    INPUT(_type='text', _name='name', requires=IS_DECIMAL_IN_RANGE(0, 10, dot="."))
    +
    +
    +

    It converts the input into a Python Decimal or generates an error if +the decimal does not fall within the specified inclusive range. +The comparison is made with Python Decimal arithmetic.

    +

    The minimum and maximum limits can be None, meaning no lower or upper limit, +respectively.

    +

    The dot argument is optional and allows you to internationalize the symbol used to separate the decimals.

    +
    +
    +

    IS_FLOAT_IN_RANGE

    +

    Checks that the field value is a floating point number within a definite range, 0 <= value <= 100 in the following example:

    +
    requires = IS_FLOAT_IN_RANGE(0, 100, dot=".",
    +                            error_message='negative or too large!')
    +
    +
    +

    The dot argument is optional and allows you to internationalize the symbol used to separate the decimals.

    +
    +
    +

    IS_INT_IN_RANGE

    +
    +
    Checks that the field value is an integer number within a definite range,

    0 <= value < 100 in the following example:

    +
    requires = IS_INT_IN_RANGE(0, 100,
    +                        error_message='negative or too large!')
    +
    +
    +
    +
    +
    +
    +

    IS_IN_SET

    +

    This validator will automatically set the form field to an option field (ie, with a drop-down menu).

    +

    IS_IN_SET checks that the field values are in a set:

    +
    requires = IS_IN_SET(['a', 'b', 'c'], zero=T('choose one'),
    +             error_message='must be a or b or c')
    +
    +
    +

    The zero argument is optional and it determines the text of the option selected by default, an option which +is not accepted by the IS_IN_SET validator itself. If you do not want a «choose one» option, set zero=None.

    +

    The elements of the set can be combined with a numerical validator, as long as IS_IN_SET is first in the list. +Doing so will force conversion by the last validator to the numerical type. So, IS_IN_SET can be followed by +IS_INT_IN_RANGE (which converts the value to int) or IS_FLOAT_IN_RANGE (which converts the value to float). For example:

    +
    requires = [ IS_IN_SET([2, 3, 5, 7], error_message='must be prime and less than 10'),
    +            IS_INT_IN_RANGE(0, None) ]
    +
    +
    +
    +
    +

    Checkbox validation

    +

    To force a filled-in form checkbox (such as an acceptance of terms and conditions), use this:

    +
    requires=IS_IN_SET(['ON'])
    +
    +
    +
    +
    +

    Dictionaries and tuples with IS_IN_SET

    +

    You may also use a dictionary or a list of tuples to make the drop down list more descriptive:

    +
    # Dictionary example:
    +requires = IS_IN_SET({'A':'Apple', 'B':'Banana', 'C':'Cherry'}, zero=None)
    +
    +# List of tuples example:
    +requires = IS_IN_SET([('A', 'Apple'), ('B', 'Banana'), ('C', 'Cherry')])
    +
    +
    +
    +
    +

    Sorted options

    +

    To keep the options alphabetically sorted by their labels into the drop down list, use the sort argument with IS_IN_SET.

    +
    IS_IN_SET([('H', 'Hulk'), ('S', 'Superman'), ('B', 'Batman')], sort=True)
    +
    +
    +
    +
    +

    IS_IN_SET and Tagging

    +

    The IS_IN_SET validator has an optional attribute multiple=False. If set to True, multiple values can be stored in one +field. The field should be of type list:integer or list:string as discussed in `` Lista: <type> `` e `` contains``. +An explicit example of tagging is discussed there. We strongly suggest using the jQuery multiselect plugin to render multiple fields.

    +

    Note that when multiple=True, IS_IN_SET will accept zero or more values, i.e. it will accept the field when nothing has been selected. +multiple can also be a tuple of the form (a, b) where a and b are the minimum and (exclusive) maximum number of items +that can be selected respectively.

    +
    +
    +
    +

    Complexity and security validators

    +
    +

    IS_STRONG

    +

    Enforces complexity requirements on a field (usually a password field).

    +

    Example:

    +
    requires = IS_STRONG(min=10, special=2, upper=2)
    +
    +
    +

    where:

    +
      +
    • min is minimum length of the value

    • +
    • special is the minimum number of required special characters, by default special characters are any of the following +^!!@#$%^&*()_+-=?<>,.:;{}[]| (you can customize these using specials = '...')

    • +
    • upper is the minimum number of upper case characters

    • +
    +

    other accepted arguments are:

    +
      +
    • invalid for the list of forbidden characters, by default invalid=' "'

    • +
    • max for the maximum length of the value

    • +
    • lower for the minimum number of lower case characters

    • +
    • number for the minimum number of digit characters

    • +
    +

    Obviously you can provide an error_message as for any other validator, although IS_STRONG is clever enough to provide a clear message to describe the validation failure.

    +

    A special argument you can use is entropy, that is a minimum value for the complexity of the value to accept (a number), experiment this with:

    +
    >>> IS_STRONG(entropy=100.0)('hello')
    +('hello', Entropy (24.53) less than required (100.0))
    +
    +
    +

    Notice that if the argument entropy is not given then IS_STRONG implicitly sets the following defaults: min = 8, upper = 1, lower = 1, +number = 1, special = 1 which otherwise are all sets to None.

    +
    +
    +

    CRYPT

    +

    This is also a filter. It performs a secure hash on the input and it is used to prevent passwords from being passed in the clear to the database.

    +
    requires = CRYPT()
    +
    +
    +

    By default, CRYPT uses 1000 iterations of the pbkdf2 algorithm combined with SHA512 to produce a 20-byte-long hash. +Old versions of web2py used md5 or HMAC+SHA512 depending on whether a key was specified or not.

    +

    If a key is specified, CRYPT uses the HMAC algorithm. The key may contain a prefix that determines the algorithm to use with HMAC, for example SHA512:

    +
    requires = CRYPT(key='sha512:thisisthekey')
    +
    +
    +

    This is the recommended syntax. The key must be a unique string associated with the database used. The key can never be changed. If you lose the key, the previously hashed values become useless. +By default, CRYPT uses random salt, such that each result is different. To use a constant salt value, specify its value:

    +
    requires = CRYPT(salt='mysaltvalue')
    +
    +
    +

    Or, to use no salt:

    +
    requires = CRYPT(salt=False)
    +
    +
    +

    The CRYPT validator hashes its input, and this makes it somewhat special. If you need to validate a password field before it +is hashed, you can use CRYPT in a list of validators, but must make sure it is the last of the list, so that it is called last. For example:

    +
    requires = [IS_STRONG(), CRYPT(key='sha512:thisisthekey')]
    +
    +
    +

    CRYPT also takes a min_length argument, which defaults to zero.

    +

    The resulting hash takes the form alg$salt$hash, where alg is the hash algorithm used, salt is the salt string (which can be empty), +and hash is the algorithm’s output. Consequently, the hash is self-identifying, allowing, for example, the algorithm to be changed without +invalidating previous hashes. The key, however, must remain the same.

    +
    +
    +
    +

    Special type validators

    +
    +

    IS_LIST_OF

    +

    This validator helps you to ensure length limits on values of type list, for this purpose use its minimum, maximum, and error_message +arguments, for example:

    +
    requires = IS_LIST_OF(minimum=2)
    +
    +
    +

    A list value may comes from a form containing multiple fields with the same name or a multiple selection box. +Note that this validator automatically converts a non-list value into a single valued list:

    +
    >>> IS_LIST_OF()('hello')
    +(['hello'], None)
    +
    +
    +

    If the first argument of IS_LIST_OF is another validator, then it applies the other validator to each element of the list. +A typical usage is validation of a list: type field, for example:

    +
    Field('emails', 'list:string', requires=IS_LIST_OF(IS_EMAIL()), ...)
    +
    +
    +
    +
    +

    IS_LIST_OF_EMAILS

    +

    This validator is specifically designed to work with the following field:

    +
    Field('emails', 'list:string',
    +      widget=SQLFORM.widgets.text.widget,
    +    requires=IS_LIST_OF_EMAILS(),
    +    filter_in=lambda l: \\
    +        IS_LIST_OF_EMAILS.split_emails.findall(l[0]) if l else l,
    +    represent=lambda v, r: \\
    +        XML(', '.join([A(x, _href='mailto:'+x).xml() for x in (v or [])]))
    +    )
    +
    +
    +

    Notice that due to the widget customization this field will be rendered by a textarea in SQLFORMs (see next [[Widgets #Widgets]] +section). This let you insert and edit multiple emails in a single input field (very much like normal mail client programs do), +separating each email address with ,, ;, and blanks (space, newline, and tab characters). +As a consequence now we need a validator which is able to operate on a single value input and a way to split the validated value into +a list to be next processed by DAL, these are what the requires and filter_in arguments stand for. +As alternative to filter_in, you can pass the following function to the onvalidation argument of form accepts, process, +or validate method:

    +
    def emails_onvalidation(form):
    +    form.vars.emails = IS_LIST_OF_EMAILS.split_emails.findall(form.vars.emails)
    +
    +
    +

    The effect of the represent argument (at lines 6 and 7) is to add a «mailto:…» link to each email address when the record is rendered in HTML pages.

    +
    +
    +

    ANY_OF

    +

    This validator takes a list of validators and accepts a value if any of the validators in the list does (i.e. it acts like a logical +OR with respect to given validators).

    +
    requires = ANY_OF([IS_ALPHANUMERIC(), IS_EMAIL()])
    +
    +
    +

    When none of the validators accepts the value you get the error message form the last attempted one (the last in the list), you +can customize the error message as usual:

    +
    >>> ANY_OF([IS_ALPHANUMERIC(), IS_EMAIL()])('@ab.co')
    +('@ab.co', 'Enter a valid email address')
    +>>> ANY_OF([IS_ALPHANUMERIC(), IS_EMAIL()],
    +...        error_message='Enter login or email')('@ab.co')
    +('@ab.co', 'Enter login or email')
    +
    +
    +
    +
    +

    IS_IMAGE

    +

    This validator checks if a file uploaded through the file input was saved in one of the selected image formats and has dimensions (width and height) +within given limits.

    +

    It does not check for maximum file size (use IS_LENGTH for that). It returns +a validation failure if no data was uploaded. It supports the file formats BMP, GIF, JPEG, PNG, and it does not require the Python Imaging Library.

    +

    Code parts taken from ref.``source1``:cite

    +

    It takes the following arguments: +- extensions: iterable containing allowed image file extensions in lowercase +- maxsize: iterable containing maximum width and height of the image +- minsize: iterable containing minimum width and height of the image

    +

    Use (-1, -1) as minsize to bypass the image-size check.

    +

    Here are some Examples: +- Check if uploaded file is in any of supported image formats:

    +
    requires = IS_IMAGE()
    +
    +
    +
      +
    • Check if uploaded file is either JPEG or PNG:

    • +
    +
    requires = IS_IMAGE(extensions=('jpeg', 'png'))
    +
    +
    +
      +
    • Check if uploaded file is PNG with maximum size of 200x200 pixels:

    • +
    +
    requires = IS_IMAGE(extensions=('png'), maxsize=(200, 200))
    +
    +
    +

    Note: on displaying an edit form for a table including requires = IS_IMAGE(), a delete checkbox will NOT appear because to delete the file +would cause the validation to fail. To display the delete checkbox use this validation:

    +
    requires = IS_EMPTY_OR(IS_IMAGE())
    +
    +
    +
    +
    +

    IS_FILE

    +

    Checks if name and extension of file uploaded through file input matches given criteria.

    +

    Does not ensure the file type in any way. Returns validation failure if no data was uploaded.

    +

    Its arguments are:

    +
      +
    • filename: string/compiled regex or a list of strings/regex of valid filenames

    • +
    • extension: string/compiled regex or a list of strings/regex of valid extensions

    • +
    • lastdot: which dot should be used as a filename / extension separator: True indicates last dot (e.g., «file.tar.gz» +will be broken in «file.tar» + «gz») while False means first dot (e.g., «file.tar.gz» will be broken into «file» + «tar.gz»).

    • +
    • case: 0 means keep the case; 1 means transform the string into lowercase (default); 2 means transform the string into uppercase.

    • +
    +

    If there is no dot present, extension checks will be done against empty string and filename checks against whole value.

    +

    Examples: +Check if file has a pdf extension (case insensitive):

    +
    INPUT(_type='file', _name='name',
    +        requires=IS_FILE(extension='pdf'))
    +
    +
    +

    Check if file is called “thumbnail” and has a jpg or png extension +(case insensitive):

    +
    INPUT(_type='file', _name='name',
    +        requires=IS_FILE(filename='thumbnail',
    +        extension=['jpg', 'png']))
    +
    +
    +

    Check if file has a tar.gz extension and name starting with backup:

    +
    INPUT(_type='file', _name='name',
    +        requires=IS_FILE(filename=re.compile('backup.*'),
    +        extension='tar.gz', lastdot=False))
    +
    +
    +

    Check if file has no extension and name matching README +(case sensitive):

    +
    INPUT(_type='file', _name='name',
    +    requires=IS_FILE(filename='README',
    +    extension='', case=0)
    +
    +
    +
    +
    +

    IS_UPLOAD_FILENAME

    +

    This is the older implementation for checking files, included for backwards compatibility. For new applications, use IS_FILE().

    +

    This validator checks if the name and extension of a file uploaded through the file input matches the given criteria.

    +

    It does not ensure the file type in any way. Returns validation failure +if no data was uploaded.

    +

    Its arguments are:

    +
      +
    • filename: filename (before dot) regex.

    • +
    • extension: extension (after dot) regex.

    • +
    • lastdot: which dot should be used as a filename / extension separator: True indicates last dot (e.g., «file.tar.gz» will be +broken in «file.tar» + «gz») while False means first dot (e.g., «file.tar.gz» will be broken into «file» + «tar.gz»).

    • +
    • case: 0 means keep the case; 1 means transform the string into lowercase (default); 2 means transform the string into uppercase.

    • +
    +

    If there is no dot present, extension checks will be done against an empty string and filename checks will be done against the whole value.

    +

    Examples:

    +

    Check if file has a pdf extension (case insensitive):

    +
    requires = IS_UPLOAD_FILENAME(extension='pdf')
    +
    +
    +

    Check if file has a tar.gz extension and name starting with backup:

    +
    requires = IS_UPLOAD_FILENAME(filename='backup.*', extension='tar.gz', lastdot=False)
    +
    +
    +

    Check if file has no extension and name matching README (case sensitive):

    +
    requires = IS_UPLOAD_FILENAME(filename='^README$', extension='^$', case=0)
    +
    +
    +
    +
    +

    IS_IPV4

    +

    This validator checks if a field’s value is an IP version 4 address in decimal form. Can +be set to force addresses from a certain range.

    +

    IPv4 regex taken from regexlib. The signature for the IS_IPV4 constructor is the following:

    +
    IS_IPV4(minip='0.0.0.0', maxip='255.255.255.255', invert=False,
    +        is_localhost=None, is_private=None, is_automatic=None,
    +        error_message='Enter valid IPv4 address')
    +
    +
    +

    Onde:

    +
      +
    • minip is the lowest allowed address

    • +
    • maxip is the highest allowed address

    • +
    • invert is a flag to invert allowed address range, i.e. if set to True allows addresses only from outside +of given range; note that range boundaries are not matched this way

    • +
    +

    You can pass an IP address either as a string (e.g. “192.168.0.1”) or as a list or tuple of 4 integers (e.g. [192, 168, 0, 1]).

    +

    To check for multiple address ranges pass to minip and maxip a list or tuple of boundary addresses, for example +to allow only addresses between “192.168.20.10” and “192.168.20.19” or between “192.168.30.100” and “192.168.30.199” use:

    +
    requires = IS_IPV4(minip=('192.168.20.10', '192.168.30.100'),
    +                maxip=('192.168.20.19', '192.168.30.199'))
    +
    +
    +

    Notice that only a range for which both lower and upper limits are set is configured, that is the number of configured ranges +is determined by the shorter of the iterables passed to minip and maxip.

    +

    The arguments is_localhost, is_private, and is_automatic accept the following values:

    +
      +
    • None to ignore the option

    • +
    • True to force the option

    • +
    • False to forbid the option

    • +
    +

    The option meanings are:

    +
      +
    • is_localhost: match localhost address (127.0.0.1)

    • +
    • is_private: match address in 172.16.0.0 - 172.31.255.255 and 192.168.0.0 - 192.168.255.255 ranges

    • +
    • is_automatic: match address in 169.254.0.0 - 169.254.255.255 range

    • +
    +

    Examples:

    +

    Check for valid IPv4 address:

    +
    requires = IS_IPV4()
    +
    +
    +

    Check for valid private network IPv4 address:

    +
    requires = IS_IPV4(minip='192.168.0.1', maxip='192.168.255.255')
    +
    +
    +
    +
    +

    IS_IPV6

    +

    This validator checks if a field’s value is an IP version 6 address.

    +

    The signature for the IS_IPV6 constructor is the following:

    +
    IS_IPV6(is_private=None,
    +        is_link_local=None,
    +        is_reserved=None,
    +        is_multicast=None,
    +        is_routeable=None,
    +        is_6to4=None,
    +        is_teredo=None,
    +        subnets=None,
    +        error_message='Enter valid IPv6 address')
    +
    +
    +

    The arguments is_private, is_link_local, is_reserved, is_multicast, is_routeable, is_6to4, +and is_teredo accept the following values:

    +
      +
    • None to ignore the option

    • +
    • True to force the option

    • +
    • False to forbid the option, this does not work for is_routeable

    • +
    +

    The option meanings are:

    +
      +
    • is_private: match an address allocated for private networks

    • +
    • is_link_local: match an address reserved for link-local (i.e. in fe80::/10 range), this is a private network too (also matched by is_private above)

    • +
    • is_reserved: match an address otherwise IETF reserved

    • +
    • is_multicast: match an address reserved for multicast use (i.e. in ff00::/8 range)

    • +
    • is_6to4: match an address that appear to contain a 6to4 embedded address (i.e. in 2002::/16 range)

    • +
    • is_teredo: match a teredo address (i.e. in 2001::/32 range)

    • +
    +

    Forcing is_routeable (setting to True) is a shortcut to forbid (setting to False) is_private, is_reserved, and is_multicast all.

    +

    Use the subnets argument to pass a subnet or list of subnets to check for address membership, this way an address must be a subnet member to validate.

    +

    Examples:

    +

    Check for valid IPv6 address:

    +
    requires = IS_IPV6()
    +
    +
    +

    Check for valid private network IPv6 address:

    +
    requires = IS_IPV6(is_link_local=True)
    +
    +
    +

    Check for valid IPv6 address in subnet:

    +
    requires = IS_IPV6(subnets='fb00::/8')
    +
    +
    +
    +
    +

    IS_IPADDRESS

    +

    This validator checks if a field’s value is an IP address (either version 4 or version 6). +Can be set to force addresses from within a specific range. +Checks are done using the appropriate IS_IPV4 or IS_IPV6 validator.

    +

    The signature for the IS_IPADDRESS constructor is the following:

    +
    IS_IPADDRESS(minip='0.0.0.0', maxip='255.255.255.255', invert=False,
    +            is_localhost=None, is_private=None, is_automatic=None,
    +            is_ipv4=None,
    +            is_link_local=None, is_reserved=None, is_multicast=None,
    +            is_routeable=None, is_6to4=None, is_teredo=None,
    +            subnets=None, is_ipv6=None,
    +            error_message='Enter valid IP address')
    +
    +
    +

    With respect to IS_IPV4 and IS_IPV6 validators the only added arguments are:

    +
      +
    • is_ipv4, set to True to force version 4 or set to False to forbid version 4

    • +
    • is_ipv6, set to True to force version 6 or set to False to forbid version 6

    • +
    +

    Refer to IS_IPV4 and IS_IPV6 validators for the meaning of other arguments.

    +

    Examples:

    +

    Check for valid IP address (both IPv4 and IPv6):

    +
    requires = IS_IPADDRESS()
    +
    +
    +

    Check for valid IP address (IPv6 only):

    +
    requires = IS_IPADDRESS(is_ipv6=True)
    +
    +
    +
    +
    +
    +

    Other validators

    +
    +

    CLEANUP

    +

    This is a filter. It never fails. By default it just removes all characters whose decimal ASCII codes +are not in the list [10, 13, 32-127]. It always perform an initial strip (i.e. heading and trailing blank characters removal) on the value.

    +
    requires = CLEANUP()
    +
    +
    +

    You can pass a regular expression to decide what has to be removed, for example to clear all non-digit characters use:

    +
    >>> CLEANUP('[^\\d]')('Hello 123 world 456')
    +('123456', None)
    +
    +
    +
    +
    +
    +

    Database validators

    +
    +

    IS_NOT_IN_DB

    +

    Synopsis: +IS_NOT_IN_DB(db|set, 'table.field')

    +

    Consider the following example:

    +
    db.define_table('person', Field('name'))
    +db.person.name.requires = IS_NOT_IN_DB(db, 'person.name')
    +
    +
    +

    It requires that when you insert a new person, his/her name is not already in the database, db, in the field person.name.

    +

    A set can be used instead of db.

    +

    As with all other validators this requirement is enforced at the form processing level, not at the database level. +This means that there is a small probability that, if two visitors try to concurrently insert records with the same person.name, +this results in a race condition and both records are accepted. It is therefore safer to also inform the database that this field should have a unique value:

    +
    db.define_table('person', Field('name', unique=True))
    +db.person.name.requires = IS_NOT_IN_DB(db, 'person.name')
    +
    +
    +

    Now if a race condition occurs, the database raises an OperationalError and one of the two inserts is rejected.

    +

    The first argument of IS_NOT_IN_DB can be a database connection or a Set. In the latter case, you would be checking only the set defined by the Set.

    +

    A complete argument list for IS_NOT_IN_DB() is as follows:

    +
    IS_NOT_IN_DB(dbset, field, error_message='value already in database or empty',
    +            allowed_override=[], ignore_common_filters=True)
    +
    +
    +

    The following code, for example, does not allow registration of two persons with the same name within 10 days of each other:

    +
    import datetime
    +now = datetime.datetime.today()
    +db.define_table('person',
    +    Field('name'),
    +    Field('registration_stamp', 'datetime', default=now))
    +recent = db(db.person.registration_stamp > now-datetime.timedelta(10))
    +db.person.name.requires = IS_NOT_IN_DB(recent, 'person.name')
    +
    +
    +
    +
    +

    IS_IN_DB

    +

    Synopsis: +IS_IN_DB(db|set, 'table.value_field', '%(representing_field)s', zero='choose one') +where the third and fourth arguments are optional.

    +

    multiple= is also possible if the field type is a list. The default is False. It can be set to True or to a tuple (min, max) +to restrict the number of values selected. So multiple=(1, 10) enforces at least one and at most ten selections.

    +

    Other optional arguments are discussed below.

    +

    Example +Consider the following tables and requirement:

    +
    db.define_table('person', Field('name', unique=True))
    +db.define_table('dog', Field('name'), Field('owner', db.person))
    +db.dog.owner.requires = IS_IN_DB(db, 'person.id', '%(name)s',
    +                                zero=T('choose one'))
    +
    +
    +

    the IS_IN_DB requirement could also be written to use a Set instead of db

    +
    db.dog.owner.requires = IS_IN_DB(db(db.person.id > 10), 'person.id', '%(name)s',
    +                                zero=T('choose one'))
    +
    +
    +

    It is enforced at the level of dog INSERT/UPDATE/DELETE forms. This example requires that a dog.owner be a valid id +in the field person.id in the database db. Because of this validator, the dog.owner field is represented +as a drop-down list. The third argument of the validator is a string that describes the elements in the drop-down list, +this is passed to the label argument of the validator. In the example you want to see the person %(name)s instead +of the person %(id)s. %(...)s is replaced by the value of the field in brackets for each record. Other accepted +values for the label are a Field instance (e.g. you could use db.person.name instead of “%(name)s”) or even a callable +that takes a row and returns the description for the option.

    +

    The zero option works very much like for the IS_IN_SET validator.

    +

    Other optional arguments accepted by IS_IN_DB are: orderby, groupby, distinct, cache, and left; +these are passed to the db select (see their description on the DAL chapter).

    +

    Notice that groupby, distinct, and left do not apply to Google App Engine.

    +

    To alphabetically sort the options listed in the drop-down list you can set the sort argument to True (sorting is case-insensitive), +this may be usefull when no orderby is feasible or practical.

    +

    The first argument of the validator can be a database connection or a DAL Set, as in IS_NOT_IN_DB. This can be useful for example when +wishing to limit the records in the drop-down list. In this example, we use IS_IN_DB in a controller to limit the records dynamically +each time the controller is called:

    +
    def index():
    +    (...)
    +    query = (db.table.field == 'xyz') # in practice 'xyz' would be a variable
    +    db.table.field.requires = IS_IN_DB(db(query), ...)
    +    form = Form(...)
    +    if form.process().accepted: ...
    +    (...)
    +
    +
    +

    If you want the field validated, but you do not want a drop-down, you must put the validator in a list.

    +
    db.dog.owner.requires = [IS_IN_DB(db, 'person.id', '%(name)s')]
    +
    +
    +

    Occasionally you want the drop-down (so you do not want to use the list syntax above) yet you want to use additional validators. +For this purpose the IS_IN_DB validator takes an extra argument _and that can point to a list of other validators applied +if the validated value passes the IS_IN_DB validation. For example to validate all dog owners in db that are not in a subset:

    +
    subset = db(db.person.id > 100)
    +db.dog.owner.requires = IS_IN_DB(db, 'person.id', '%(name)s',
    +                                _and=IS_NOT_IN_DB(subset, 'person.id'))
    +
    +
    +
    +
    +

    IS_IN_DB and Tagging

    +

    The IS_IN_DB validator has an optional attribute multiple=False. If set to True multiple values can be stored in one field. +This field should be of type list:reference as discussed in `` Lista: <type> `` e `` contains``. An explicit example of +tagging is discussed there. Multiple references are handled automatically in create and update forms, but they are transparent to +the DAL. We strongly suggest using the jQuery multiselect plugin to render multiple fields.

    +
    +
    +
    +

    Validation functions

    +

    In order to explicitly define a validation function, we pass to the validation parameter a +function that takes the form and returns a dictionary, mapping field +names to errors. If the dictionary is non-empty, the errors will be +displayed to the user, and no database I/O will take place.

    +

    Aqui está um exemplo:

    +
    from py4web import Field
    +from py4web.utils.form import Form, FormStyleBulma
    +from pydal.validators import IS_INT_IN_RANGE
    +
    +def custom_check(form):
    +    if not 'name' in form.errors and len(form.vars['name']) < 4
    +        form.errors['name'] = T("too short")
    +
    +@action('form_example', method=['GET', 'POST'])
    +@action.uses('form_example.html', session)
    +def form_example():
    +    form = Form(db.thing, validation=custom_check)
    +    if form.accepted:
    +        redirect(URL('index'))
    +    return dict(form=form)
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-13.html b/apps/_documentation/static/pt/chapter-13.html new file mode 100644 index 000000000..7b7292595 --- /dev/null +++ b/apps/_documentation/static/pt/chapter-13.html @@ -0,0 +1,892 @@ + + + + + + + + + Authentication and authorization — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Authentication and authorization

    +

    Strong authentication and authorization methods are +vital for a modern, multiuser web application. +While they are often used interchangeably, authentication and authorization +are separate processes:

    +
      +
    • Authentication confirms that users are who they say they are

    • +
    • Authorization gives those users permission to access a resource

    • +
    +
    +

    Authentication using Auth

    +

    py4web comes with a an object Auth and a system of plugins for user +authentication. It has the same name as the +corresponding web2py one and serves the same purpose but the API and +internal design is very different.

    +

    The _scaffold application provides a guideline for its standard usage. By +default it uses a local SQLite database and allows creating new users, +login and logout. Notice that if you don’t configure it, you have to manually +approve new users (by visiting the link logged on the console or +by directly editing the database).

    +

    To use the Auth object, first of all you need to import it, instantiate it, configure +it, and enable it.

    +
    from py4web.utils.auth import Auth
    +auth = Auth(session, db)
    +# (configure here)
    +auth.enable()
    +
    +
    +

    The import step is obvious. The second step does not perform any +operation other than telling the Auth object which session object to use +and which database to use. Auth data is stored in session['user'] +and, if a user is logged in, the user id is stored in +session[‘user’][‘id’]. The db object is used to store persistent info +about the user in a table auth_user which is created if missing. +The auth_user table has the following fields:

    +
      +
    • nome do usuário

    • +
    • o email

    • +
    • senha

    • +
    • primeiro nome

    • +
    • último nome

    • +
    • sso_id (usado para single sign on, ver mais adiante)

    • +
    • action_token (usado para verificar e-mail, bloquear usuários e outras tarefas, também ver mais adiante).

    • +
    +

    A `` auth.enable () `` passo cria e expõe os seguintes APIs RESTful:

    +
      +
    • {Nomeaplic} / auth / api / registo (POST)

    • +
    • {Nomeaplic} / auth / api / Login (POST)

    • +
    • {Nomeaplic} / auth / api / request_reset_password (POST)

    • +
    • {Nomeaplic} / auth / api / reset_password (POST)

    • +
    • {Appname} / auth / api / verify_email (GET, POST)

    • +
    • {Nomeaplic} / auth / api / Sair (GET, POST) (+)

    • +
    • {Nomeaplic} / auth / api / perfil (GET, POST) (+)

    • +
    • {Nomeaplic} / auth / api / change_password (POST) (+)

    • +
    • {Nomeaplic} / auth / api / change_email (POST) (+)

    • +
    +

    Os que estão marcados com um (+) requerem um usuário conectado.

    +
    +

    Interface de autenticação

    +

    Você pode criar sua própria interface do usuário da web para usuários de login usando as APIs acima, mas py4web fornece um como exemplo, implementada nos seguintes arquivos:

    +
      +
    • _Scaffold / templates / auth.html

    • +
    • _scaffold/templates/layout.html

    • +
    +

    The key section is in layout.html where (using the no.css framework) the menu actions are defined:

    +
     1<ul>
    + 2   [[if globals().get('user'):]]
    + 3   <li>
    + 4   <a class="navbar-link is-primary">
    + 5      [[=globals().get('user',{}).get('email')]]
    + 6   </a>
    + 7   <ul>
    + 8      <li><a href="[[=URL('auth/profile')]]">Edit Profile</a></li>
    + 9      [[if 'change_password' in globals().get('actions',{}).get('allowed_actions',{}):]]
    +10         <li><a href="[[=URL('auth/change_password')]]">Change Password</a></li>
    +11      [[pass]]
    +12      <li><a href="[[=URL('auth/logout')]]">Logout</a></li>
    +13   </ul>
    +14   </li>
    +15   [[else:]]
    +16   <li>
    +17   Login
    +18   <ul>
    +19      <li><a href="[[=URL('auth/register')]]">Sign up</a></li>
    +20      <li><a href="[[=URL('auth/login')]]">Log in</a></li>
    +21   </ul>
    +22   </li>
    +23   [[pass]]
    +24</ul>
    +
    +
    +

    The menu is dynamic: on line 2 there is a check if the user is already defined +(i.e. if the user has already logged on). In this case the email is shown in the +top menu, plus the menu options Edit Profile, Change Password (optional) and +Logout. +Instead, if the user is not already logged on, from line 15 there are +only the corresponding menu options allowed: Sign up and Log in.

    +

    Every menu option then redirects the user to the corresponding standard URL, +which in turn activates the Auth action.

    +
    +
    +

    Using Auth inside actions

    +

    There two ways to use the Auth object in an action.

    +

    The first one does not force a login. With @action.uses(auth) +we tell py4web that this action should have information about the user, +trying to parse the session for a user session.

    +
    @action('index')
    +@action.uses(auth)
    +def index():
    +    user = auth.get_user()
    +    return 'hello {first_name}'.format(**user) if user else 'not logged in'
    +
    +
    +

    The second one forces the login if needed:

    +
    @action('index')
    +@action.uses(auth.user)
    +def index():
    +    user = auth.get_user()
    +    return 'hello {first_name}'.format(**user)
    +
    +
    +

    Aqui `` @ action.uses (auth.user) `` diz py4web que essa ação requer um usuário conectado e deve redirecionar para login se nenhum usuário está logado.

    +
    +
    +

    Two Factor Authentication

    +

    Two factor authentication (or Two-step verification) is a way of improving authentication security. +When activated an extra step is added in the login process. In the first step, users are shown the +standard username/password form. If they successfully pass this challenge by submitting the correct +username and password, and two factor authentication is enabled for the user, the server will +present a second form before logging them in.

    +

    There are a few Auth settings available to control how two factor authentication works.

    +

    The following can be specified on Auth instantiation:

    +
      +
    • two_factor_required

    • +
    • two_factor_send

    • +
    • two_factor_validate

    • +
    +
    +

    two_factor_required

    +

    When you pass a method name to the two_factor_required parameter you are telling py4web to call +that method to determine whether or not this login should be use or bypass two factor authentication. +If your method returns True, then this login requires two factor. If it returns False, two factor authentication +is bypassed for this login.

    +

    Sample two_factor_required method

    +

    This example shows how to allow users that are on a specific network.

    +
    def user_outside_network(user, request):
    +    import ipaddress
    +
    +    networks = ["10.10.0.0/22"]
    +
    +    ip_list = []
    +    for range in networks:
    +        ip_list.extend(ipaddress.IPv4Network(range))
    +
    +    if ipaddress.IPv4Address(request.remote_addr) in ip_list:
    +        #  if the client address is in the network address list, then do NOT require MFA
    +        return False
    +
    +    return True
    +
    +
    +
    +
    +

    two_factor_send

    +

    When two factor authentication is active, py4web can generate a 6 digit code (using random.randint) and +makes it possible to send it to the user. How this code is sent, is up to you. The two_factor_send +argument to the Auth class allows you to specify the method that sends the two factor code to the user.

    +

    This example shows how to send an email with the two factor code:

    +
    def send_two_factor_email(user, code):
    +    try:
    +        auth.sender.send(
    +            to=[user.email],
    +            subject=f"Two factor login verification code",
    +            body=f"You're verification code is {code}",
    +            sender="from_address@youremail.com",
    +        )
    +    except Exception as e:
    +        print(e)
    +    return code
    +
    +
    +

    Notice that this method takes two arguments: the current user, and the code to be sent. +Also notice this method can override the code and return a new one.

    +
    auth.param.two_factor_required = user_outside_network
    +auth.param.two_factor_send = send_two_factor_email
    +
    +
    +
    +
    +

    two_factor_validate

    +

    By default, py4web will validate the user input in the two factor form by comparing the code entered +by the user with the code generated and sent using two_factor_send. However, sometimes it may be +useful to define a custom validation of this user-entered code. For instance, if one would like to use the +TOTP (or the Time-Based One-Time-Passwords) as the two factor authentication method, the validation +requires comparing the code entered by the user with the value generated at the same time at the server side. +Hence, it is not sufficient to generate that value earlier when showing the form (using for instance +two_factor_send method), because by the time the user submits the form, the current valid value may +already be different. Instead, this value should be +generated when validating the form submitted by the user.

    +

    To accomplish such custom validation, the two_factor_validate method is available. It takes two arguments:

    +
    +
      +
    • the current user

    • +
    • the code that was entered by the user into the two factor authentication form

    • +
    +
    +

    The primary use-case for this method is validation of time-based passwords.

    +

    This example shows how to validate a time-based two factor code:

    +
    def validate_code(user, code):
    +   try:
    +      # get the correct code from an external function
    +      correct_code = generate_time_based_code(user_id)
    +   except Exception as e:
    +      # return None to indicate that validation could not be performed
    +      return None
    +
    +   # compare the value entered in the auth form with the correct code
    +   if code == correct_code:
    +      return True
    +   else:
    +      return False
    +
    +
    +

    The validate_code method must return one of three values:

    +
      +
    • True - if the validation succeeded,

    • +
    • False - if the validation failed,

    • +
    • None - if the validation was not possible for any reason

    • +
    +

    Notice that - if defined - this method is _always_ called to validate the two factor +authentication form. It is up to you to decide what kind of validation it does. If the returned value is True, +the user input will be accepted as valid. If the returned value is False then the user input will be +rejected as invalid, number of tries will be decreased by one, and user will be asked to try again. +If the returned value is None the user input will be checked against the code generated with the use +of two_factor_send method and the final result will depend on that comparison. In this case authentication +will fail if two_factor_send method was not defined, and hence no code was sent to the user.

    +
    auth.param.two_factor_validate = validate_code
    +
    +
    +
    +
    +

    two_factor_tries

    +

    By default, the user has 3 attempts to pass two factor authentication. You can override this after using:

    +
    auth.param.two_factor_tries = 5
    +
    +
    +

    Once this is all setup, the flow for two factor authentication is:

    +
      +
    • present the login page

    • +
    • +
      upon successful login and user passes two_factor_required
        +
      • redirect to py4web auth/two_factor endpoint

      • +
      • +
        if two_factor_send method has been defined:
          +
        • generate 6 digit verification code

        • +
        • call two_factor_send to send the verification code to the user

        • +
        +
        +
        +
      • +
      • display verification page where user can enter their code

      • +
      • if two_factor_validate method has been defined - call it to validate the user-entered code

      • +
      • upon successful verification, take user to _next_url that was passed to the login page

      • +
      +
      +
      +
    • +
    +

    Important! If you filtered ALLOWED_ACTIONS in your app, make sure to whitelist the «two_factor» action +so not to block the two factor API.

    +
    +
    +
    +

    Plugins de Autenticação

    +

    Plugins are defined in “py4web/utils/auth_plugins” and they have a +hierarchical structure. Some are exclusive and some are not. For example, +default, LDAP, PAM, and SAML are exclusive (the developer has to pick +one). Default, Google, Facebook, and Twitter OAuth are not exclusive +(the developer can pick them all and the user gets to choose using the +UI).

    +

    O `` <auth /> `` componentes irá se adaptar automaticamente para formulários de login de exibição, conforme exigido pelos plugins instalados.

    +

    In the _scaffold/settings.py and _scaffold/common.py files you can see +the default settings for the supported plugins.

    +
    +

    PAM

    +

    Configurando PAM é o mais fácil:

    +
    from py4web.utils.auth_plugins.pam_plugin import PamPlugin
    +auth.register_plugin(PamPlugin())
    +
    +
    +

    This one like all plugins must be imported and registered. +The constructor of this plugins does not require any +arguments (where other plugins do).

    +

    O `` auth.register_plugin (…) `` must ** ** vir antes do `` auth.enable () ``, uma vez que não faz sentido para expor APIs antes de plugins desejados são montados.

    +
    +

    Nota

    +

    by design PAM authentication using local users works fine only if py4web is run by root. +Otherwise you can only authenticate the specific user that runs the py4web process.

    +
    +
    +
    +

    LDAP

    +

    This is a common authentication method, especially using Microsoft Active Directory in enterprises.

    +
    from py4web.utils.auth_plugins.ldap_plugin import LDAPPlugin
    +LDAP_SETTING = {
    +    'mode': 'ad',
    +    'server': 'my.domain.controller',
    +    'base_dn': 'cn=Users,dc=domain,dc=com'
    +}
    +auth.register_plugin(LDAPPlugin(**LDAP_SETTINGS))
    +
    +
    +
    +

    Aviso

    +

    it needs the python-ldap module. On Ubuntu, you should also install some developer’s libraries +in advance with sudo apt-get install libldap2-dev libsasl2-dev.

    +
    +
    +
    +

    OAuth2 with Google

    +
    from py4web.utils.auth_plugins.oauth2google import OAuth2Google # TESTED
    +auth.register_plugin(OAuth2Google(
    +    client_id=CLIENT_ID,
    +    client_secret=CLIENT_SECRET,
    +    callback_url='auth/plugin/oauth2google/callback'))
    +
    +
    +

    O ID de cliente e segredo do cliente deve ser fornecido pelo Google.

    +
    +
    +

    OAuth2 with Facebook

    +
    from py4web.utils.auth_plugins.oauth2facebook import OAuth2Facebook # UNTESTED
    +auth.register_plugin(OAuth2Facebook(
    +    client_id=CLIENT_ID,
    +    client_secret=CLIENT_SECRET,
    +    callback_url='auth/plugin/oauth2google/callback'))
    +
    +
    +

    O ID de cliente e segredo do cliente deve ser fornecido pelo Facebook.

    +
    +
    +

    OAuth2 with Discord

    +
    from py4web.utils.auth_plugins.oauth2discord import OAuth2Discord
    +auth.register_plugin(OAuth2Discord(
    +    client_id=DISCORD_CLIENT_ID,
    +    client_secret=DISCORD_CLIENT_SECRET,
    +    callback_url="auth/plugin/oauth2discord/callback"))
    +
    +
    +

    To obtain a Discord client ID and secret, create an application at https://discord.com/developers/applications. +You will also have to register your OAuth2 redirect URI in your created application, in the form of +http(s)://<your host>/<your app name>/auth/plugin/oauth2discord/callback

    +
    +

    Nota

    +

    As Discord users have no concept of first/last name, the user in the auth table will contain the +Discord username as the first name and discriminator as the last name.

    +
    +
    +
    +
    +

    Auth API Plugins

    +

    There are two types of web APIs, those called by the browser for example by a single page web app, +and those designed to be called by a different kind of program. Both of them may need tosupport +authentication. The distintion is important because, in the case of the browser, there is no need +to manage any authentication token as the browser already provides cookies and py4web uses +cookies to handle seesions. If the user operating the browser is logged-in, when an API is called, +the corresponding action already knows who the user is. No additional logic is necessary. +In this case there there is no need for any kind of additional API token which would only diminuish +the security provided by the cookie based session token.

    +

    When the API is to be accessed by a different program (for example a script) the story is different. +There is no session and we do not want to ask the user for the password every time. +The standard way to authenticate in this case is by issuing the user an API token, aka a string, +which, when presented along with API request allows py4web to recognize the identity of the caller. +This is also referred to as «Authentication bearer».

    +

    Py4web provides a plugin system that gives you a lot of flexibility but it also provides +two practical plugins that are sufficient in most cases. The two plugins are called: +SimpleTokenPlugin and JwtTokenPlugin. The first one of the two is recommended in most of the cases.

    +

    What all plugins have in common: +- They have a way for a user to create a token which is a string. +- When an HTTP(S) request is made to an action that @actiion.uses(auth) or @action.uses(auth.user)

    +
    +

    py4web will identify the user if the token is present, as if the user was logged-in.

    +
    +

    What SimpleTokenPlugin and JwtTokenPlugin have in common: +- When an HTTP(S) request is made, the token must be put in the «Authentication» header.

    +
    +

    You will need to create your own plugin if you want to pass it in some other manner.

    +
    +
      +
    • Each user can create as many tokens as desired.

    • +
    • Users can create tokens for other users if the application logic requires/allows it.

    • +
    +

    Unique features of SimpleTokenPlugin: +- A token is a UUID. +- Tokens can be managed serverside (created, deleted, expired, change expiration). +- Current tokens are stored in a adatabase table. +- The default table associates token with the owner and a textual description.

    +
    +

    Users can nevertheless provide their own table and add any desired metadata to tokens +which the app can retrieve to distinguish different tokens from the same user. +This is done by adding fields to the table.

    +
    +
      +
    • Under the hood veryfing a token requires a database query.

    • +
    +

    Unique features of JwtTokenPlugin: +- The token is an encrypted and digitally signed dict that stores the user_id and expiration. +- The author of the token can add any metadata to into the token at creation. +- The token is not stored anywhere serverside and there is no database table. +- Tokens can be created (and there is a function to do so) but they cannot be managed.

    +
    +

    The server cannot expire tokens or change expiration. This would require the tokens +to validated against a database and that is exactely when the JwtTokenPlugin tries to avoid.

    +
    +
      +
    • The only way to expire a token is by changing the serverside secret using for validation +so when a token is expired, all tokens are expired.

    • +
    +

    SimpleTokenPlugin are the recommended kind of tokens for most applications. +JwtTokenPlugin are valuable when the expiration is short and known in advance and when +avoiding a database lookup is very important, such as for actions that are very fast +and one is willing to sacrifice a bit of security (serverside token expiration capability) +in order to avoid database access.

    +
    +

    Example of SimpleTokenPlugin

    +

    In common.py:

    +
    from py4web.utils.auth import SimpleTokenPlugin
    +simple_token_plugin = SimpleTokenPlugin(auth)
    +auth.token_plugins.append(simple_token_plugin)
    +
    +
    +

    You can optionally a table=db.mytable to a custom table. Otherwise it will create and use +one called «auth_simple_token».

    +

    In controllers.py

    +
    @action("test_api")
    +@action.uses(auth.user)
    +def test_api():
    +    return {"hello": "world"}
    +
    +
    +

    Users can access this action if via a browser if they are logged in, without the token, of via API by providing a token.

    +
    curl http://127.0.0.1:8000/test1/test_api -H "Authorization: Bearer {token}"
    +
    +
    +

    In order to create and manage tokens you can use a grid. In controllers.py

    +
    @action("tokens/<path:path>")
    +@action.uses("generic.html", auth.user)
    +def _(path):
    +   db.auth_simple_token.user_id.default = auth.user_id
    +   grid = Grid(path, db.auth_simple_token.user_id==auth.user_id, create=True, deletable=True)
    +   return dict(grid=grid)
    +
    +
    +
    +
    +

    Example of JwtTokenPlugin

    +

    In common.py:

    +
    from py4web.utils.auth import SimpleTokenPlugin
    +jwt_token_plugin = JwtTokenPlugin(auth)
    +auth.token_plugins.append(jwt_token_plugin)
    +
    +
    +

    In controllers.py it works the same as SimpleTokenPlugin:

    +
    @action("test_api")
    +@action.uses(auth.user)
    +def test_api():
    +    return {"hello": "world"}
    +
    +
    +

    The token is also passed using the same header as in the previous example:

    +
    curl http://127.0.0.1:8000/test1/test_api -H "Authorization: Bearer {token}"
    +
    +
    +

    While you cannot manage tokens you still need a way to create them. You can create an +action for example that, when called, gives you a new token. In controllers.py

    +
    @action("make_token")
    +@action.uses("generic.html", auth.user)
    +def make_token():
    +     return dict(token=jwt_token_plugin.make(
    +        auth.current_user,
    +        expiration=utcnow()+datetime.timedelta(days=10)))
    +
    +
    +
    +
    +

    Example of custom Token Plugin

    +

    A token plugin is just a class that, given a request, returns an associated user. +For example here is a dumb and UNSAFE plugin that authorizes everybody as user 1 as long as +the «Authentication» header is provided.

    +

    from py4web import request

    +
    class MyCustomTokenPlugin:
    +    def get_user(self):
    +        authorization = request.headers.get("Authentication")
    +        if authorization:
    +            return db.auth_user(1)
    +        return None
    +
    +auth.token_plugins.append(MyCustomTokenPlugin())
    +
    +
    +
    +
    +
    +
    +

    Authorization using Tags

    +

    As already mentioned, authorization is the process of verifying what specific +applications, files, and data a user has access to. This is accomplished +in py4web using Tags, that we’ve already discovered on Marcação de registros +in the DAL chapter.

    +
    +

    Etiquetas e permissões

    +

    Py4web provides a general purpose tagging +mechanism that allows the developer to tag any record of any table, +check for the existence of tags, as well as checking for records +containing a tag. Group membership can be thought of a type of tag that +we apply to users. Permissions can also be tags. Developers are free to +create their own logic on top of the tagging system.

    +
    +

    Nota

    +

    Py4web does not have the concept of groups as web2py does. Experience +showed that while that mechanism is powerful it suffers from two +problems: it is overkill for most apps, and it is not flexible enough +for very complex apps.

    +
    +

    To use the tagging system you first need to import the Tags module +from pydal.tools. Then create a Tags object to tag a table:

    +
    from pydal.tools.tags import Tags
    +groups = Tags(db.auth_user, 'groups')
    +
    +
    +

    The tail_name parameter is optional and if not specified the “default” +value will be used. If you look at the database level, a new table will +be created with a name equals to tagged_db + '_tag_' + tail_name, +in this case auth_user_tag_groups:

    +_images/tags_db.png +

    Então você pode adicionar uma ou mais marcas de registros da tabela, bem como remover existente tags:

    +
    groups.add(user.id, 'manager')
    +groups.add(user.id, ['dancer', 'teacher'])
    +groups.remove(user.id, 'dancer')
    +
    +
    +

    On the auth_user_tagged_groups this will produce two records +with different groups assigned to the same user.id (the «Record ID» field):

    +_images/tags2.png +

    Slashes at the +beginning or the end of a tag are optional. All other chars are allowed +on equal footing.

    +

    A common use case is group based access control. Here the developer +first checks if a user is a member of the 'manager' group, if the +user is not a manager (or no one is logged in) py4web redirects to the +'not authorized url'. Else the user is in the correct group and then +py4web displays ‘hello manager’:

    +
    @action('index')
    +@action.uses(auth.user)
    +def index():
    +    if not 'manager' in groups.get(auth.get_user()['id']):
    +        redirect(URL('not_authorized'))
    +    return 'hello manager'
    +
    +
    +

    Aqui o desenvolvedor consulta o banco de dados para todos os registros que têm a tag desejada (s):

    +
    @action('find_by_tag/{group_name}')
    +@action.uses(db)
    +def find(group_name):
    +    users = db(groups.find([group_name])).select(orderby=db.auth_user.first_name | db.auth_user.last_name)
    +    return {'users': users}
    +
    +
    +

    We’ve already seen a simple requires_membership fixture on :ref:The Condition fixture. It +enables the following syntax:

    +
    groups = Tags(db.auth_user)
    +
    +class requires_membership(Fixture):
    +    def __init__(self, group):
    +        self.__prerequisites__ = [auth.user] # you must have a user before you can check
    +        self.group  = group # store the group when action defined
    +    def on_request(self, context): # will be called if the action is called
    +        if self.group not in groups.get(auth.user_id):
    +            raise HTTP(401) # check and do something
    +
    +@action('index')
    +@action.uses(requires_membership('teacher'))
    +def index():
    +    return 'hello teacher'
    +
    +
    +

    Deixamos para você como um exercício para criar um dispositivo elétrico `` has_membership`` para permitir a seguinte sintaxe:

    +
    @action('index')
    +@action.uses(has_membership(groups, 'teacher'))
    +def index():
    +    return 'hello teacher'
    +
    +
    +

    Important: Tags are automatically hierarchical. For example, if +a user has a group tag ‘teacher/high-school/physics’, then all the +following searches will return the user:

    +
      +
    • `` Groups.find ( “professor /-ensino médio / física”) ``

    • +
    • `` Groups.find ( “professor /-colegial”) ``

    • +
    • `` Groups.find ( “professor”) ``

    • +
    +

    This means that slashes have a special meaning for tags.

    +
    +
    +

    Multiple Tags objects

    +
    +

    Nota

    +

    One table can have multiple associated Tags objects. The +name “groups” here is completely arbitrary but has a specific semantic +meaning. Different Tags objects are independent to each other. The +limit to their use is your creativity.

    +
    +

    For example you could create a table auth_group:

    +
    db.define_table('auth_group', Field('name'), Field('description'))
    +
    +
    +

    and two Tags attached to it:

    +
    groups = Tags(db.auth_user)
    +permissions = Tags(db.auth_groups)
    +
    +
    +

    Then create a “zapper” record in auth_group, give it a permission, and make a user member +of the group:

    +
    zap_id = db.auth_group.insert(name='zapper', description='can zap database')
    +permissions.add(zap_id, 'zap database')
    +groups.add(user.id, 'zapper')
    +
    +
    +

    E você pode verificar se há uma permissão de utilizador através de uma junção explícita:

    +
    @action('zap')
    +@action.uses(auth.user)
    +def zap():
    +    user = auth.get_user()
    +    permission = 'zap database'
    +    if db(permissions.find(permission))(
    +          db.auth_group.name.belongs(groups.get(user['id']))
    +          ).count():
    +        # zap db
    +        return 'database zapped'
    +    else:
    +        return 'you do not belong to any group with permission to zap db'
    +
    +
    +

    Aviso aqui `` permissions.find (permissão) `` gera uma consulta para todos os grupos com a permissão e que ainda filtro desses grupos para aqueles do utilizador actual é membro da. Contamos eles e se encontrarmos qualquer, então o usuário tem a permissão.

    +
    +
    +

    User Impersonation

    +

    Auth provides API that allow you to impersonate another user. +Here is an example of an action to start impersonating and stop impersonating another user.

    +
    @action("impersonate/{user_id:int}", method="GET")
    +@action.uses(auth.user)
    +def start_impersonating(user_id):
    +    if (not auth.is_impersonating() and
    +        user_id and
    +        user_id != auth.user_id and
    +        db(db.auth_user.id==user_id).count()):
    +        auth.start_impersonating(user_id, URL("index"))
    +    raise HTTP(404)
    +
    + @action("stop_impersonating", method="GET")
    + @action.uses(auth)
    + def stop_impersonating():
    +    if auth and auth.is_impersonating():
    +        auth.stop_impersonating(URL("index"))
    +    redirect(URL("index"))
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-14.html b/apps/_documentation/static/pt/chapter-14.html new file mode 100644 index 000000000..e10351f27 --- /dev/null +++ b/apps/_documentation/static/pt/chapter-14.html @@ -0,0 +1,714 @@ + + + + + + + + + Rede — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Rede

    +

    py4web comes with a Grid object providing grid and CRUD (create, update and delete) capabilities. +This allows you to quickly and safely provide an interface to your data. Since it’s also +highly customizable, it’s the corner stone of most py4web’s applications.

    +
    +

    Key features

    +
      +
    • CRUD completa com Confirmação de exclusão

    • +
    • Clique cabeças de coluna para classificar - clique novamente para DESC

    • +
    • Controle de paginação

    • +
    • Construído em Search (pode usar search_queries OU search_form)

    • +
    • Botões de ação - com ou sem texto

    • +
    • Pré e Pós Ação (adicionar seus próprios botões para cada linha)

    • +
    • Datas de grid em formato local

    • +
    • Formatação padrão por tipo de utilizador mais substituições

    • +
    +
    +

    Dica

    +

    There is an excellent grid tutorial made by Jim Steil on https://github.com/jpsteil/grid_tutorial. +You’re strongly advised to check it for any doubt and for finding many precious examples, +hints & tips.

    +
    +
    +
    +

    Basic grid example

    +

    In this simple example we will make a grid over the superhero table.

    +

    Create a new minimal app called grid. Change it with the following content.

    +
    # in grid/__init__.py
    +import os
    +from py4web import action, Field, DAL
    +from py4web.utils.grid import *
    +from py4web.utils.form import *
    +from yatl.helpers import A
    +
    +
    +# database definition
    +DB_FOLDER = os.path.join(os.path.dirname(__file__), 'databases')
    +if not os.path.isdir(DB_FOLDER):
    +   os.mkdir(DB_FOLDER)
    +db = DAL('sqlite://storage.sqlite', folder=DB_FOLDER)
    +db.define_table(
    +   'person',
    +   Field('superhero'),
    +   Field('name'),
    +   Field('job'))
    +
    +# add example entries in db
    +if not db(db.person).count():
    +   db.person.insert(superhero='Superman', name='Clark Kent', job='Journalist')
    +   db.person.insert(superhero='Spiderman', name='Peter Park', job='Photographer')
    +   db.person.insert(superhero='Batman', name='Bruce Wayne', job='CEO')
    +   db.commit()
    +
    +@action('index', method=['POST', 'GET'])
    +@action('index/<path:path>', method=['POST', 'GET'])
    +@action.uses('grid.html', db)
    +def index(path=None):
    +   grid = Grid(path,
    +            formstyle=FormStyleDefault, # FormStyleDefault or FormStyleBulma
    +            grid_class_style=GridClassStyle, # GridClassStyle or GridClassStyleBulma
    +            query=(db.person.id > 0),
    +            orderby=[db.person.name],
    +            search_queries=[['Search by Name', lambda val: db.person.name.contains(val)]])
    +
    +   return dict(grid=grid)
    +
    +
    +

    Add a new file templates/grid.html with this basic content:

    +
    [[=grid.render()]]
    +
    +
    +

    Then restart py4web. If you browse to http://127.0.0.1:8000/grid/index you’ll get this +result:

    +_images/grid.png +

    Its layout is quite minimal, but it’s perfectly usable.

    +

    The main problem is that by default the no.css stylesheet is used, see +here. But we’ve not loaded it! +Change the file templates/grid.html with this content:

    +
    <!DOCTYPE html>
    +<html>
    +   <head>
    +      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css"  />
    +   </head>
    +   <body>
    +      [[=grid.render()]]
    +   <body>
    +</html>
    +
    +
    +

    Then refresh the page.

    +_images/grid_nocss.png +

    This is better now, with proper icons for Details, Edit and Delete actions.

    +

    We can also think about using the bulma.css, +see here. In this case you need to change +the grid object on __init__.py to:

    +
    formstyle=FormStyleBulma, # FormStyleDefault or FormStyleBulma
    +grid_class_style=GridClassStyleBulma, #GridClassStyle or GridClassStyleBulma
    +
    +
    +

    Notice that in this case you need to import the corresponding python modules in advance +(we’ve already done it on line 4 and 5 above). Instead if you use the default no.css style +you don’t need to manually import its style modules (and you even don’t need the formstyle +and grid_class_style parameters).

    +

    You also have to change the file templates/grid.html with this content:

    +
    <!DOCTYPE html>
    +<html>
    +   <head>
    +      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.9.3/css/bulma.min.css">
    +   </head>
    +   <body>
    +         [[=grid.render()]]
    +   <body>
    +</html>
    +
    +
    +

    Then refresh the page.

    +_images/grid_bulmacss.png +

    This is much better, isn’t it?

    +
    +

    Nota

    +

    These are just minimal examples for showing how grid works internally. +Normally you should start from a copy of the standard _scaffold app, with all +the Session and Authentication stuff already defined. Also, you should +follow the standard rules for code, like placing the db definition inside +models.py and so on. +Using standards will make your code simpler, safer and more maintainable.

    +

    Also, do not use grid objects directly on the root action of an app, because +it does not add the “index” route. So, in this example if you browse to +http://127.0.0.1:8000/grid the main page is displayed fine but any contained +action will lead to a non existent page.

    +
    +

    In the Advanced topics and examples chapter you can find +more examples, including a master/detail grid example written with htmx. +And don’t forget Jim Steil’s detailed tutorial on https://github.com/jpsteil/grid_tutorial.

    +
    +
    +

    The Grid object

    +
    class Grid:
    +   def __init__(
    +      self,
    +      path,
    +      query,
    +      search_form=None,
    +      search_queries=None,
    +      columns=None,
    +      field_id=None,
    +      show_id=False,
    +      orderby=None,
    +      left=None,
    +      headings=None,
    +      create=True,
    +      details=True,
    +      editable=True,
    +      deletable=True,
    +      validation=None,
    +      pre_action_buttons=None,
    +      post_action_buttons=None,
    +      auto_process=True,
    +      rows_per_page=15,
    +      include_action_button_text=True,
    +      search_button_text="Filter",
    +      formstyle=FormStyleDefault,
    +      grid_class_style=GridClassStyle,
    +      T=lambda text: text,
    +   ):
    +
    +
    +
      +
    • caminho: a rota do pedido

    • +
    • query: consulta pydal a ser processado

    • +
    • search_form: py4web FORM to be included as the search form. If +search_form is passed in then the developer is responsible for +applying the filter to the query passed in. This differs from +search_queries

    • +
    • search_queries: list of query lists to use to build the search form. +Ignored if search_form is used

    • +
    • columns: list of fields or columns to display on the list page, +see the Custom columns paragraph later. +If blank, the table will use all readable fields of the searched table

    • +
    • show_id: mostrar o campo ID de registo na página de lista - default = false

    • +
    • orderby: Campo orderby pydal ou lista de campos

    • +
    • esquerda: se juntando outras tabelas, especifique a expressão esquerda pydal aqui

    • +
    • títulos: lista de títulos a ser utilizado para página da lista - se não for fornecido o uso do rótulo do campo

    • +
    • criar: URL para redirecionar para a criação de registros - definido como verdadeiro para gerar automaticamente o URL - definido como falso para não exibir o botão

    • +
    • details: URL to redirect to for displaying records - set to True to +automatically generate the URL - set to False to not display the +button (*)

    • +
    • editable: URL to redirect to for editing records - set to True to +automatically generate the URL - set to False to not display the +button (*)

    • +
    • deletable: URL to redirect to for deleting records - set to True to +automatically generate the URL - set to False to not display the +button (*)

    • +
    • validation: optional validation function to pass to create and edit forms

    • +
    • pre_action_buttons: lista de instâncias action_button para incluir antes de os botões de ação padrão

    • +
    • post_action_buttons: lista de instâncias action_button para incluir após os botões de ação padrão

    • +
    • auto_process: Boolean - se ou não a grid deve ser processado imediatamente. Se False, desenvolvedor deve chamar grid.process () uma vez todos os parâmetros são configurados

    • +
    • rows_per_page: número de linhas a serem exibidos por página. padrão 15

    • +
    • include_action_button_text: boolean dizendo a grid se deseja ou não de texto em botões de ação dentro de sua grid

    • +
    • search_button_text: texto a ser exibido no botão enviar em seu formulário de pesquisa

    • +
    • formstyle: py4web Form formstyle usado para estilo seu formulário ao construir automaticamente formulários CRUD

    • +
    • grid_class_style: GridClassStyle object used to override defaults for +styling your rendered grid. Allows you to specify classes or styles +to apply at certain points in the grid

    • +
    • T: optional pluralize object

    • +
    +

    (*) The parameters details, editable and deletable can also take a callable that will +be passed the current row of the grid. This is useful because you can then turn a button on or off +depending on the values in the row. In other words, +instead of providing a simple Boolean value you can use an expression like:

    +
    deletable=lambda row: False if row.job=="CEO" else True,
    +
    +
    +

    See also Using callable parameters later on.

    +
    +

    Searching and filtering

    +

    There are two ways to build a search form:

    +
      +
    • Fornecer uma lista search_queries

    • +
    • Construa a sua própria forma de pesquisa personalizada

    • +
    +

    Se você fornecer uma lista search_queries à grid, ele irá:

    +
      +
    • build a search form. If more than one search query in the list, it +will also generate a dropdown to select which search field to search +against

    • +
    • recolher valores de filtro e filtrar a grid

    • +
    +

    No entanto, se isso não lhe dá flexibilidade suficiente, você pode fornecer o seu próprio formulário de busca e lidar com toda a filtragem (construção das consultas) por si mesmo.

    +
    +
    +

    CRUD settings

    +

    The grid provides CRUD (create, read, update and delete) capabilities +utilizing py4web Form. +You can turn off CRUD features by setting +create/details/editable/deletable during grid instantiation.

    +

    Além disso, você pode fornecer uma URL separada para a criação / detalhes / editáveis ​​/ parâmetros elimináveis ​​para ignorar as páginas CRUD gerados automaticamente e lidar com as páginas de detalhes do mesmo.

    +
    +
    +
    +

    Custom columns

    +

    If the grid does not involve a join but displays results from a single table +you can specify a list of columns. Columns are highly customizable.

    +
    from py4web.utils.grid import Column
    +from yatl.helpers import A
    +
    +columns = [
    +   db.person.id,
    +   db.person.superhero,
    +   db.person.name,
    +   db.person.job,
    +   Column("Web Site", lambda row: f"https://{row.superhero}.com"),
    +   Column("Go To", lambda row: A("link", _href=f"https://{row.superhero}.com"))
    +]
    +
    +grid = Grid(... columns=columns ...)
    +
    +
    +

    Notice in this example the first columns are regular fields, +The fifth column has a header «Web Site» and consists of URL strings generated from the rows. +The last column has a header «Go To» and generates actual clickable links using the A helper. +This is the result:

    +_images/grid_columns.png +

    Notice that we’ve also used the deletable parameter in order to disable and hide it for +Batman only, as explained before.

    +
    +

    Aviso

    +

    Do not define columns outside of the controller methods that use them, otherwise the +structure of the table will change every time the user press the refresh button of the browser!

    +

    The reason is that each time the grid displays, +it modifies the “columns” variable (in the grid) by adding the action buttons to it. So, if columns are +defined outside of the controller method, it just keeps adding the actions column.

    +
    +
    +
    +

    Usando templates

    +

    Use o seguinte para tornar a sua grid ou formas CRUD em seus templates.

    +

    Mostrar a grid ou um formulário CRUD

    +
    [[=grid.render()]]
    +
    +
    +

    You can customize the CRUD form layout like a normal form (see Custom forms). So you can use +the following structure:

    +
    [[form = grid.render() ]]
    +[[form.custom["begin"] ]]
    +...
    +[[form.custom["submit"]
    +[[form.custom["end"]
    +
    +
    +

    But notice that when handling custom form layouts you need to know if you are displaying +the grid or a form. Use the following to decide:

    +
    [[if grid.action in ['details', 'edit']: ]]
    +    #  Display the custom form
    +    [[form = grid.render() ]]
    +    [[form.custom["begin"] ]]
    +    ...
    +    [[form.custom["submit"]
    +    [[form.custom["end"]
    +[[else:]]
    +    [[grid.render() ]]
    +[[pass]]
    +
    +
    +
    +
    +

    Customizing style

    +

    Você pode fornecer suas próprias formstyle ou grid classes e estilo ao grid.

    +
      +
    • formstyle é o mesmo que um formstyle Forma, usadas para as formas estilo CRUD.

    • +
    • grid_class_style é uma classe que fornece as classes e / ou estilos utilizados para certas porções da grelha.

    • +
    +

    The default GridClassStyle - based on no.css, primarily uses styles to +modify the layout of the grid. We’ve already seen that it’s possible +to use other class_style, in particular GridClassStyleBulma.

    +

    You can even build your own class_style to be used with the css framework of +your choice. Unfortunately, one based on bootstrap is still missing.

    +
    +
    +

    Ação personalizada Botões

    +

    As with web2py, you can add additional buttons to each row in your grid. +You do this by providing pre_action_buttons or post_action_buttons to +the Grid init method.

    +
      +
    • pre_action_buttons - list of action_button instances to include +before the standard action buttons

    • +
    • post_action_buttons - list of action_button instances to include +after the standard action buttons

    • +
    +

    You can build your own Action Button class to pass to pre/post action +buttons based on the template below (this is not provided with py4web).

    +
    +

    Botão Classe Ação Amostra

    +
    class GridActionButton:
    + def __init__(
    +     self,
    +     url,
    +     text=None,
    +     icon=None,
    +     additional_classes="",
    +     additional_styles="",
    +     override_classes="",
    +     override_styles="",
    +     message="",
    +     append_id=False,
    +     name=None,
    +     ignore_attribute_plugin=False,
    +     **attrs
    + ):
    +     self.url = url
    +     self.text = text
    +     self.icon = icon
    +     self.additional_classes = additional_classes
    +     self.additional_styles = additional_styles
    +     self.override_classes = override_classes
    +     self.override_styles = override_styles
    +     self.message = message
    +     self.append_id = append_id
    +     self.name = name
    +     self.ignore_attribute_plugin = ignore_attribute_plugin
    +     self.attrs = attrs
    +
    +
    +
      +
    • url: a página para navegar até quando o botão é clicado

    • +
    • texto: texto para exibição no botão

    • +
    • icon: the font-awesome icon to display before the text, for example +«fa-calendar»

    • +
    • additional_classes: uma lista separada por espaços de aulas para incluir no elemento botão

    • +
    • additional_styles: a string containing additional styles to add to the button

    • +
    • override_classes: a space-separated list of classes to place on the control that will replace the default classes

    • +
    • override_styles: a string containing the styles to be applied to the control

    • +
    • mensagem: mensagem de confirmação para exibição se a classe ‘confirmação’ é adicionado a classes adicionais

    • +
    • append_id: Se for verdade, adicionar id_field_name = id_value à querystring url para o botão

    • +
    • name: the name to apply to the control

    • +
    • ignore_attribute_plugin: boolean - respect the attribute plugin specified on the grid or ignore it

    • +
    • attrs: additional attributes to apply to the control

    • +
    +

    After defining the custom GridActionButton class, you need to define +your Action buttons:

    +
    pre_action_buttons = [
    +    lambda row: GridActionButton(
    +        lambda row: f"https://www.google.com/search?q={row.superhero}",
    +        text= f"Google for {row.superhero}",
    +    )
    +]
    +
    +
    +

    Finally, you need to reference them in the Grid definition:

    +
    grid = Grid(... pre_action_buttons = pre_action_buttons  ...)
    +
    +
    +
    +
    +

    Using callable parameters

    +

    A recent improvement to py4web allows you to pass a callable instead of a GridActionButton. This allow you to more easily change the behaviour +of standard and custom Actions.

    +

    Callable can be used with:

    +
      +
    • details

    • +
    • editable

    • +
    • deletable

    • +
    • additional_classes

    • +
    • additional_styles

    • +
    • override_classes

    • +
    • override_styles

    • +
    +

    Example usage:

    +
    @action("example/<path:path>")
    +def example(path=None):
    +
    +    pre_action_buttons = [
    +        lambda row: GridActionButton(
    +            URL("test", row.id),
    +            text="Click me",
    +            icon="fa-plus",
    +            additional_classes=row.id,
    +            additional_styles=["height: 10px" if row.bar else None],
    +        )
    +    ]
    +
    +    post_action_buttons = [
    +        lambda row: GridActionButton(
    +            URL("test", row.id),
    +            text="Click me!!!",
    +            icon="fa-plus",
    +            additional_classes=row.id,
    +            additional_styles=["height: 10px" if row.bar else None],
    +        )
    +    ]
    +
    +    grid = Grid(
    +        path=path,
    +        query=db.foo,
    +        pre_action_buttons=pre_action_buttons,
    +        post_action_buttons=post_action_buttons,
    +    )
    +
    +    return dict(grid=grid.render())
    +
    +
    +
    +
    +
    +

    Os campos de referência

    +

    Ao exibir campos em uma tabela PyDAL, às vezes você deseja exibir um campo mais descritivo do que um valor de chave estrangeira. Há um par de maneiras de lidar com isso com a grid py4web.

    +

    filter_out on PyDAL field definition - here is an example of a foreign +key field

    +
    Field('company', 'reference company',
    +      requires=IS_NULL_OR(IS_IN_DB(db, 'company.id',
    +                                   '%(name)s',
    +                                   zero='..')),
    +      filter_out=lambda x: x.name if x else ''),
    +
    +
    +

    Isto irá exibir o nome da empresa na grid em vez do ID empresa

    +

    A queda de usar este método é que classificação e filtragem são baseados no campo da empresa na tabela de empregado e não o nome da empresa

    +

    left join and specify fields from joined table - specified on the left +parameter of Grid instantiation

    +
    db.company.on(db.employee.company == db.company.id)
    +
    +
    +

    You can specify a standard PyDAL left join, including a list of joins to +consider. +Now the company name field can be included in your fields list can be +clicked on and sorted.

    +

    Also you can specify a query such as:

    +
    queries.append((db.employee.last_name.contains(search_text)) | (db.employee.first_name.contains(search_text)) | db.company.name.contains(search_text))
    +
    +
    +

    Este método permite classificar e filtrar, mas não permite que você para combinar campos a serem exibidos em conjunto, como o método filter_out faria

    +

    Você precisa determinar qual método é melhor para o seu caso de uso compreender as grids diferentes no mesmo aplicativo pode precisar de se comportar de forma diferente.

    +
    +
    +

    Grids with checkboxes

    +

    While the grid, per se, does not support checkboxes, you can use custom columns to add one or more columns of checkboxes. +You can also add the helpers logic (the grid uses helpers to generate HTML) to wrap it in a <form> and add one +or more submit buttons. You can then add logic to process the selected rows when the button is selected. For example:

    +
    column = Column("select", lambda row: INPUT(_type="checkbox",_name="selected_id",_value=row.id))
    +
    +@action("manage")
    +@action("manage/<path:path>")
    +@action.uses("manage.html", db)
    +def manage(path=None):
    +
    +   grid = Grid(path, db.thing, columns=[column, db.thing.name])
    +
    +   # if we are displaying a "select" grid page (not a form)
    +   if not grid.form:
    +      grid = grid.render()
    +      # if checkboxes selection was submitted
    +      if request.method == "POST":
    +         # do something with the selected ids
    +         print("you selected", request.POST.get("selected_id"))
    +      # inject a ``<form>`` and a ``submit`` button
    +      grid.children[1:] = [FORM(
    +            *grid.children[1:],
    +            DIV(INPUT(_type="submit",_value="do it!")),
    +            _method="POST",
    +            _action=request.url)]
    +   return locals()
    +
    +
    +

    Notice in the above example request.POST.get("selected_id") can be a single ID (if one selected) or a list of IDs (if more than one +is selected).

    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-15.html b/apps/_documentation/static/pt/chapter-15.html new file mode 100644 index 000000000..64e348779 --- /dev/null +++ b/apps/_documentation/static/pt/chapter-15.html @@ -0,0 +1,544 @@ + + + + + + + + + De web2py para py4web — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    De web2py para py4web

    +

    Este capítulo é dedicado a ajudar os usuários para portar aplicativos web2py antigos para py4web.

    +

    Web2py and py4web share many similarities and some differences. For example they share the same +database abstraction layer (pyDAL) which means pydal table definitions and queries are identical +between the two frameworks. They also share the same template language with the minor caveat that +web2py defaults to {{…}} delimiters while py4web defaults to [[…]] delimiters. They also +share the same validators, part of pyDAL, and very similar helpers. The py4web ones are a +lighter/faster/minimalist re-implementation but they serve the same purpose and support a very +similar syntax. They both provide a Form object (equivalent to SQLFORM in web2py) and a Grid +object (equivalent to SQLFORM.grid in web2py). They both provide a XML object that can sanitize +HTML and URL helper to generate URL. They both can raise HTTP to return non-200 OK pages. They +both provide an Auth object that can generate register/login/change password/lost password/edit +profile forms. Both web2py and py4web track and log all errors.

    +

    Some of the main differences are the following:

    +
      +
    • web2py works with both Python 2.6+ and 3.6+, while py4web runs on Python 3.7+ only. So, if your +old web2py application is still using Python 2, your first step involves migrating it to at +least Python 3.7, better if the latest 3.9.

    • +
    • web2py apps consist of collection of files which are executed at every HTTP request (using a +custom importer, in a predetermined order). In py4web apps are regular python modules that are +imported automatically by the frameworks. By the way, this makes possible the use of standard +python debuggers (even inside the most used IDEs).

    • +
    • In web2py every app has a fixed folder structure. A function is an action if and only if it is +defined in a controllers/*.py file. py4web is much less constraining. In py4web an app must +have an entry point __init__.py and a static folder. Every other convention such as the +location of templates, uploaded files, translation files, sessions, etc. is user specified.

    • +
    • In web2py the scaffolding app (the blue print for creating new apps) is called “welcome”. In +py4web it is called “_scaffold”. _scaffold contains a “settings.py” file and a “common.py”. +The latter provides an example of how to enable Auth and configure all the options for the +specific app. _scaffold has also a “model.py” file and a “controller.py” file but, unlike +web2py, those files are not treated in any special manner. Their names follow a convention +(not enforced by the framework) and they are imported by the __init__.py file as for any +regular python module.

    • +
    • In web2py every function in controllers/*.py is an action. In py4web a function is an action +if it has the @action("...") decorator. That means that actions can be defined anywhere. The +admin interface will help you locate where a particular action is defined.

    • +
    • In web2py the mapping between URLs and file/function names is automatic but it can be +overwritten in “routes.py” (like in Django). In py4web the mapping is specified in the decorator +as in @action(“my_url_path”) (like in Bottle and Flask). Notice that if the path starts with +“/” it is assumed to be an absolute path. If not, it is assumed to be relative and prepended by +the “/{appname}/” prefix. Also, if the path ends with “/index”, the latter postfix is assumed +to be optional.

    • +
    • In web2py the path extension matters and “http://.html” is expected to return HTML while +“http://.json” is expected to return JSON, etc. In py4web there is no such convention. If the +action returns a dict() and has a template, the dict() will be rendered by the template, else it +will be rendered in JSON. More complex behavior can be accomplished using decorators.

    • +
    • In web2py there are many wrappers around each action and, for example, they could handle sessions, +pluralization, database connections, and more whether the action needs it or not. This makes +web2py performances hard to compare with other frameworks. In py4web everything is optional and +features must be enabled and configured for each action using the @action.uses(...) decorator. +The arguments of @action.uses(...) are called fixtures in analogy with the fixtures in a +house. They add functionality by providing preprocessing and postprocessing to the action. For +example @action.uses(session, T, db, flash) indicates that the action needs to use session, +internationalization/pluralization (T), the database (db), and carry on state for flash messages +upon redirection.

    • +
    • web2py uses its own request/response objects. py4web uses the request/response objects from the +underlying Ombott library. While this may change in the future we are committed to keep them +the interface with the web server, routing, partial requests, if modified since, and file +streaming.

    • +
    • Both web2py and py4web use the same pyDAL therefore tables are defined using the same exact +syntax, and so do queries. In web2py tables are re-defined at every HTTP +request, when the entire models are executed. In py4web only the action is executed for every +HTTP request, while the code defined outside of actions is only executed at startup. That makes +py4web much faster, in particular when there are many tables. The downside of this approach is +that the developer should be careful to never override pyDAL variables inside action or in any +way that depends on the content of the request object, else the code is not thread safe. The +only variables that can be changed at will are the following field attributes: readable, +writable, requires, update, default. All the others are for practical purposes to be +considered global and non thread safe. This is also the reason that makes using +Tabelas preguiçosos with py4web useless and even dangerous.

    • +
    • Both web2py and pyweb have an Auth object which serve the same purpose. Both objects have the +ability to generate forms pretty much in the same manner. The py4web ones is defined to be more +modular and extensible and support both Forms and APIs, but it lacks the auth.requires_* +decorators and group membership/permissions. This does not mean that the feature is not +available. In fact py4web is even more powerful and that is why the syntax is different. While +the web2py Auth objects tries to do everything, the corresponding py4web object is only in +charge of establishing the identity of a user, not what the user can do. The latter can be +achieved by attaching Tags to users. So group membership is assigned by labeling users with +the Tags of the groups they belong to and checking permissions based on the user tags. Py4web +provides a mechanism for assigning and checking tags efficiently to any object, including but +not limited to, users.

    • +
    • Web2py comes with the Rocket web server. py4web at the time of writing defaults to the +Rocket3 web server, which is the same multi-threaded +web server used by web2py stripped of all the Python2 logic and dependencies. Note that this +may change in the future.

    • +
    +
    +

    Simple conversion examples

    +
    +

    “Hello world” example

    +

    web2py

    +
    # in controllers/default.py
    +def index():
    +   return "hello world"
    +
    +
    +

    –> py4web

    +
    # file imported by __init__.py
    +@action('index')
    +def index():
    +    return "hello world"
    +
    +
    +
    +
    +

    “Redirect with variables” example

    +

    web2py

    +
    request.get_vars.name
    +request.post_vars.name
    +request.env.name
    +raise HTTP(301)
    +redirect(url)
    +URL('c','f',args=[1,2],vars={})
    +
    +
    +

    –> py4web

    +
    request.query.get('name')
    +request.forms.get('name') or request.json.get('name')
    +request.environ.get('name')
    +raise HTTP(301)
    +redirect(url)
    +URL('c', 'f', 1, 2, vars={})
    +
    +
    +
    +
    +

    “Returning variables” example

    +

    web2py

    +
    def index():
    +   a = request.get_vars.a
    +   return locals()
    +
    +
    +

    –> py4web

    +
    @action("index")
    +def index():
    +   a = request.query.get('a')
    +   return locals()
    +
    +
    +
    +
    +

    “Returning args” example

    +

    web2py

    +
    def index():
    +   a, b, c = request.args
    +   b, c = int(b), int(c)
    +   return locals()
    +
    +
    +

    –> py4web

    +
    @action("index/<a>/<b:int>/<c:int>")
    +def index(a,b,c):
    +   return locals()
    +
    +
    +
    +
    +

    “Return calling methods” example

    +

    web2py

    +
    def index():
    +   if request.method == "GET":
    +      return "GET"
    +   if request.method == "POST":
    +      return "POST"
    +   raise HTTP(400)
    +
    +
    +

    –> py4web

    +
    @action("index", method="GET")
    +def index():
    +   return "GET"
    +
    +@action("index", method="POST")
    +def index():
    +   return "POST"
    +
    +
    +
    +
    +

    “Setting up a counter” example

    +

    web2py

    +
    def counter():
    +   session.counter = (session.counter or 0) + 1
    +   return str(session.counter)
    +
    +
    +

    –> py4web

    +
    def counter():
    +   session['counter'] = session.get('counter', 0) + 1
    +   return str(session['counter'])
    +
    +
    +
    +
    +

    “View” example

    +

    web2py

    +
    {{ extend 'layout.html' }}
    +<div>
    +{{ for k in range(1): }}
    +<span>{{= k }}<span>
    +{{ pass }}
    +</div>
    +
    +
    +

    –> py4web

    +
    [[ extend 'layout.html' ]]
    +<div>
    +[[ for k in range(1): ]]
    +<span>[[= k ]]<span>
    +[[ pass ]]
    +</div>
    +
    +
    +
    +
    +

    “Form and flash” example

    +

    web2py

    +
    db.define_table('thing', Field('name'))
    +
    +def index():
    +   form = SQLFORM(db.thing)
    +   form.process()
    +   if form.accepted:
    +      flash = 'Done!'
    +   rows = db(db.thing).select()
    +   return locals()
    +
    +
    +

    –> py4web

    +
    db.define_table('thing', Field('name'))
    +
    +@action("index")
    +@action.uses(db, flash)
    +def index():
    +   form = Form(db.thing)
    +   if form.accepted:
    +      flash.set("Done!", "green")
    +   rows = db(db.thing).select()
    +   return locals()
    +
    +
    +

    In the template you can access the flash object with

    +
    <div class="flash">[[=globals().get('flash','')]]</div>
    +
    +
    +

    or using the more sophisticated

    +
    <flash-alerts class="padded " data-alert="[[=globals().get( 'flash', '')]]"></flash-alerts>
    +
    +
    +

    The latter requires utils.js from the scaffolding app to render +the custom tag into a div with dismissal behavior.

    +

    Also notice that Flash is special: it is a singleton. +So if you instantiate multiple Flash objects they share their data.

    +
    +
    +

    “grid” example

    +

    web2py

    +
    def index():
    +   grid = SQLFORM.grid(db.thing, editable=True)
    +   return locals()
    +
    +
    +

    –> py4web

    +
    @action("index")
    +@action.uses(db, flash)
    +def index():
    +   grid = Grid(db.thing)
    +   form.param.editable = True
    +   return locals()
    +
    +
    +
    +
    +

    “Accessing OS files” example

    +

    web2py

    +
    file_path = os.path.join(request.folder, 'file.csv')
    +
    +
    +

    –> py4web

    +
    from .settings import APP_FOLDER
    +file_path = os.path.join(APP_FOLDER, 'file.csv')
    +
    +
    +
    +
    +

    “auth” example

    +

    web2py

    +
    auth = Auth()
    +auth.define_tables()
    +
    +@requires_login()
    +def index():
    +   user_id = auth.user.id
    +   user_email = auth.user.email
    +   return locals()
    +
    +def user():
    +    return dict(form=auth())
    +
    +
    +

    Access with http://.../user/login.

    +

    –> py4web

    +
    auth = Auth(define_table=False)
    +auth.define_tables()
    +auth.enable(route='auth')
    +
    +@action("index")
    +@action.uses(auth.user)
    +def index():
    +   user_id = auth.user_id
    +   user_email = auth.get_user().get('email')
    +   return locals()
    +
    +
    +

    Access with http://.../auth/login. +Notice that in web2py auth.user is the current logged-in user +retrieved from session. In py4web instead auth.user is a fixture which serves the +same purpose as @requires_login in web2py. In py4web only the user_id +is stored in the session and it can be retrieved using auth.user_id. +If you need more information about the user, you need to fetch the record +from the database with auth.get_user() The latter returns all readable +fields as a Python dictionary.

    +

    Also notice there is a big difference between:

    +
    @action.uses(auth)
    +
    +
    +

    and

    +
    @action.uses(auth.user)
    +
    +
    +

    In the first case the decorated action can access the auth object +but auth.user_id may be None if the user is not logged in. In the second +case we are requiring a valid logged in user and therefore auth.user_id +is guaranteed to be a valid user id.

    +

    Also notice that if an action uses auth, then it automatically uses +its session and its flash objects.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/chapter-16.html b/apps/_documentation/static/pt/chapter-16.html new file mode 100644 index 000000000..eb53ad439 --- /dev/null +++ b/apps/_documentation/static/pt/chapter-16.html @@ -0,0 +1,940 @@ + + + + + + + + + Advanced topics and examples — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Advanced topics and examples

    +
    +

    The scheduler

    +

    Py4web has a built-in scheduler. There is nothing for you to install or configure to make it work.

    +

    Given a task (just a python function), you can schedule async runs of that function. +The runs can be a one-off or periodic. They can have timeout. They can be scheduled to run at a given scheduled time.

    +

    The scheduler works by creating a table task_run and enqueueing runs of the predefined task as table records. +Each task_run references a task and contains the input to be passed to that task. The scheduler will capture the +task stdout+stderr in a db.task_run.log and the task output in db.task_run.output.

    +

    A py4web thread loops and finds the next task that needs to be executed. For each task it creates a worker process +and assigns the task to the worker process. You can specify how many worker processes should run concurrently. +The worker processes are daemons and they only live for the life of one task run. Each worker process is only +responsible for executing that one task in isolation. The main loop is responsible for assigning tasks and timeouts.

    +

    The system is very robust because the only source of truth is the database and its integrity is guaranteed by +transactional safety. Even if py4web is killed, running tasks continue to run unless they complete, fail, or are +explicitly killed.

    +

    Aside for allowing multiple concurrent task runs in execution on one node, +it is also possible to run multiple instances of the scheduler on different computing nodes, +as long as they use the same client/server database for task_run and as long as +they all define the same tasks.

    +

    Here is an example of how to use the scheduler:

    +
    from pydal.tools.scheduler import Scheduler, delta, now
    +from .common import db
    +
    +# create and start the scheduler
    +scheduler = Scheduler(db, sleep_time=1, max_concurrent_runs=1)
    +scheduler.start()
    +
    +# register your tasks
    +scheduler.register_task("hello", lambda **inputs: print("hi!"))
    +scheduler.register_task("slow", lambda: time.sleep(10))
    +scheduler.register_task("periodic", lambda **inputs: print("I am periodic!"))
    +scheduler.register_task("fail", lambda x: 1 / x)
    +
    +# enqueue some task runs:
    +
    +scheduler.enqueue_run(name="hello")
    +scheduler.enqueue_run(name="hello", scheduled_for=now() + delta(10) # start in 10 secs
    +scheduler.enqueue_run(name="slow", timeout=1) # 1 secs
    +scheduler.enqueue_run(name="periodic", period=10) # 10 secs
    +scheduler.enqueue_run(name="fail", inputs={"x": 0})
    +
    +
    +

    Notice that in scaffolding app, the scheduler is created and started in common if +USE_SCHEDULER=True in settings.py.

    +

    You can manage your task runs busing the dashboard or using a Grid(path, db.task_run).

    +

    To prevent database locks (in particular with sqlite) we recommend:

    +
      +
    • Use a different database for the scheduler and everything else

    • +
    • Always db.commit() as soon as possible after any insert/update/delete

    • +
    • wrap your database logic in tasks in a try…except as in

    • +
    +
    def my_task():
    +    try:
    +        # do something
    +        db.commit()
    +    except Exception:
    +        db.rollback()
    +
    +
    +
    +
    +

    Sending messages using a background task

    +

    As en example of application of the above, consider the case of wanting to send emails asynchronously from a background task. +In this example we send them using SendGrid from Twilio (https://www.twilio.com/docs/sendgrid/for-developers/sending-email/quickstart-python).

    +

    Here is a possible scheduler task to send the email:

    +
    import sendgrid
    +from sendgrid.helpers.mail import Mail, Email, To, Content
    +
    +def sendmail_task(from_addr, to_addrs, subject, body):
    +    ""
    +    # build the messages using sendgrid API
    +    from_email = Email(from_addr)  # Must be your verified sender
    +    content_type = "text/plain" if body[:6] != "<html>" else "text/html"
    +    content = Content(content_type, body)
    +    mail = Mail(from_email, To(to_addrs), subject, content)
    +    # ask sendgrid to deliver it
    +    sg = sendgrid.SendGridAPIClient(api_key=settings.SENDGRID_API_KEY)
    +    response = sg.client.mail.send.post(request_body=mail.get())
    +    # check if worked
    +    assert response.status_code == "200"
    +
    +# register the above task with the scheduler
    +scheduler.register_task("sendmail", sendmail_task)
    +
    +
    +

    To schedule sending a new email do:

    +
    email = {
    +    "from_addr": "me@example.com",
    +    "to_addrs": ["me@example.com"],
    +    "subject": "Hello World",
    +    "body": "I am alive!",
    +}
    +scheduler.enqueue_run(name="sendmail", inputs=email, scheduled_for=None)
    +
    +
    +

    The key:value in the email representation must match the arguments of the task. +The scheduled_for argument is optional and allows you to specify when the email should be sent. +You can use the Dashboard to see the status of your task_runs for the task called sendmail.

    +

    You can also tell auth to tap into above mechanism for sending emails:

    +
    class MySendGridSender:
    +    def __init__(self, from_addr):
    +        self.from_addr = from_adds
    +    def send(self, to_addr, subject, body):
    +        email = {
    +            "from_addr": self.from_addr,
    +            "to_addrs": [to_addr],
    +            "subject": subject,
    +            "body": body,
    +        }
    +        scheduler.enqueue_run(name="sendmail", inputs=email)
    +
    +auth.sender = MySendGridSender(from_addr="me@example.com")
    +
    +
    +

    With the above, Auth will not send emails using smtplib. Instead it will send them with SendGrid using the scheduler. +Notice the only requirement here is that auth.sender must be an object with a send method with the same signature as in the example.

    +

    Notice, it it also possible to send SMS messages instead of emails but this requires 1) store the phone number in auth_user and 2) override the Auth.send method.

    +
    +
    +

    Celery

    +

    Yes. You can use Celery instead of the build-in scheduler but it adds complexity and it is less robust. +Yet the build-in scheduler is designed for long running tasks and the database can become a bottleneck +if you have hundreds of tasks running concurrently. Celery may work better if you have more than 100 concurrent +tasks and/or they are short running tasks.

    +
    +
    +

    py4web and asyncio

    +

    Asyncio is not strictly needed, at least for most of the normal use +cases where it will add problems more than value because of its concurrency model. +On the other hand, we think py4web needs a built-in websocket async based solution.

    +

    If you plan to play with asyncio be careful that you should also deal with all +the framework’s components: in particular pydal is not asyncio compliant because +not all the adapters work with async.

    +
    +
    +

    htmx

    +

    There are many javascript front-end frameworks available today that allow you great flexibility +over how you design your web client. Vue, React and Angular are just a few. However, the +complexity in building one of these systems prevents many developers from reaping those benefits. +Add to that the rapid state of change in the ecosystem and you soon have an application that is +difficult to maintain just a year or two down the road.

    +

    As a consequence, there is a growing need to use simple html elements to add reactivity to your web +pages. htmx is one of the tools emerging as a leader in page reactivity without the complexities of javascript. +Technically, htmx allows you to access AJAX, CSS Transitions, Web Sockets and Server Sent Events directly +in HTML, using attributes, so you can build modern user interfaces with the simplicity and power of hypertext. +[CIT1601]

    +

    Read all about htmx and its capabilities on the official site at https://htmx.org . If you prefer, +there is also a video tutorial: Simple, Fast Frontends With htmx .

    +

    py4web enables htmx integration in a couple of ways.

    +
      +
    1. Allow you to add htmx attributes to your forms and buttons

    2. +
    3. Includes an htmx attributes plugin for the py4web grid

    4. +
    +
    +

    htmx usage in Form

    +

    The py4web Form class allows you to pass **kwargs to it that will be passed along as attributes to the html +form. For example, to add the hx-post and hx-target to the <form> element you would use:

    +
    attrs = {
    +    "_hx-post": URL("url_to_post_to/%s" % record_id),
    +    "_hx-target": "#detail-target",
    +}
    +form = Form(
    +    db.tablename,
    +    record=record_id,
    +    **attrs,
    +)
    +
    +
    +

    Now when your form is submitted it will call the URL in the hx-post attribute and whatever is returned +to the browser will replace the html inside of the element with id=»detail-target».

    +

    Let’s continue with a full example (started from scaffold).

    +

    controllers.py

    +
    import datetime
    +
    +@action("htmx_form_demo", method=["GET", "POST"])
    +@action.uses("htmx_form_demo.html")
    +def htmx_form_demo():
    +    return dict(timestamp=datetime.datetime.now())
    +
    +
    +@action("htmx_list", method=["GET", "POST"])
    +@action.uses("htmx_list.html", db)
    +def htmx_list():
    +    superheros = db(db.superhero.id > 0).select()
    +    return dict(superheros=superheros)
    +
    +
    +@action("htmx_form/<record_id>", method=["GET", "POST"])
    +@action.uses("htmx_form.html", db)
    +def htmx_form(record_id=None):
    +    attrs = {
    +        "_hx-post": URL("htmx_form/%s" % record_id),
    +        "_hx-target": "#htmx-form-demo",
    +    }
    +    form = Form(db.superhero, record=db.superhero(record_id), **attrs)
    +    if form.accepted:
    +        redirect(URL("htmx_list"))
    +
    +    cancel_attrs = {
    +        "_hx-get": URL("htmx_list"),
    +        "_hx-target": "#htmx-form-demo",
    +    }
    +    form.param.sidecar.append(A("Cancel", **cancel_attrs))
    +
    +    return dict(form=form)
    +
    +
    +

    templates/htmx_form_demo.html

    +
    [[extend 'layout.html']]
    +
    +[[=timestamp]]
    +<div id="htmx-form-demo">
    +    <div hx-get="[[=URL('htmx_list')]]" hx-trigger="load" hx-target="#htmx-form-demo"></div>
    +</div>
    +
    +<script src="https://unpkg.com/htmx.org@1.3.2"></script>
    +
    +
    +

    templates/htmx_list.html

    +
    <ul>
    +[[for sh in superheros:]]
    +    <li><a hx-get="[[=URL('htmx_form/%s' % sh.id)]]" hx-target="#htmx-form-demo">[[=sh.name]]</a></li>
    +[[pass]]
    +</ul>
    +
    +
    +

    templates/htmx_form.html

    +
    [[=form]]
    +
    +
    +

    We now have a functional maintenance app to update our superheros. In your browser navigate to the htmx_form_demo page +in your new application. The hx-trigger=»load» attribute on the inner div of the htmx_form_demo.html page +loads the htmx_list.html page inside the htmx-form-demo DIV once the htmx_form_demo page is loaded.

    +

    Notice the timestamp added outside of the htmx-form-demo DIV does not change when transitions occur. This is +because the outer page is never reloaded, only the content inside the htmx-form-demo DIV.

    +

    The htmx attributes hx-get and hx-target are then used on the anchor tags to call the htmx_form page to +load the form inside the htmx-form-demo DIV.

    +

    So far we’ve just seen standard htmx processing. Nothing fancy here, and nothing specific to py4web. However, +in the htmx_form method we see how you can pass any attribute to a py4web form that will be rendered on the +<form> element as we add the hx-post and hx-target. This tells the form to allow htmx to override the default +form behavior and to render the resulting output in the target specified.

    +

    The default py4web form does not include a Cancel button in case you want to cancel out of the edit form. But +you can add “sidecar” elements to your forms. You can see in htmx_form that we add a cancel option and add the +required htmx attributes to make sure the htmx_list page is rendered inside the htmx-form-demo DIV.

    +
    +
    +

    htmx usage in Grid

    +

    The py4web grid provides an attributes plugin system that allows you to build plugins to provide custom attributes +for form elements, anchor elements or confirmation messages. py4web also provide an attributes plugin specifically for +htmx.

    +

    Here is an example building off the previous htmx forms example.

    +

    controller.py

    +
    @action("htmx_form/<record_id>", method=["GET", "POST"])
    +@action.uses("htmx_form.html", db)
    +def htmx_form(record_id=None):
    +    attrs = {
    +        "_hx-post": URL("htmx_form/%s" % record_id),
    +        "_hx-target": "#htmx-form-demo",
    +    }
    +    form = Form(db.superhero, record=db.superhero(record_id), **attrs)
    +    if form.accepted:
    +        redirect(URL("htmx_list"))
    +
    +    cancel_attrs = {
    +        "_hx-get": URL("htmx_list"),
    +        "_hx-target": "#htmx-form-demo",
    +    }
    +    form.param.sidecar.append(A("Cancel", **cancel_attrs))
    +
    +    return dict(form=form)
    +
    +@action("htmx_grid", method=["GET", "POST"])
    +@action("htmx_grid/<path:path>", method=["GET", "POST"])
    +@action.uses( "htmx_grid.html", session, db)
    +def htmx_grid(path=None):
    +    grid = Grid(path, db.superhero, auto_process=False)
    +
    +    grid.attributes_plugin = AttributesPluginHtmx("#htmx-grid-demo")
    +    attrs = {
    +        "_hx-get": URL(
    +            "htmx_grid",
    +        ),
    +        "_hx-target": "#htmx-grid-demo",
    +    }
    +    grid.param.new_sidecar = A("Cancel", **attrs)
    +    grid.param.edit_sidecar = A("Cancel", **attrs)
    +
    +    grid.process()
    +
    +    return dict(grid=grid)
    +
    +
    +

    templates/htmx_form_demo.html

    +
    [[extend 'layout.html']]
    +
    +[[=timestamp]]
    +<div id="htmx-form-demo">
    +    <div hx-get="[[=URL('htmx_list')]]" hx-trigger="load" hx-target="#htmx-form-demo"></div>
    +</div>
    +
    +<div id="htmx-grid-demo">
    +    <div hx-get="[[=URL('htmx_grid')]]" hx-trigger="load" hx-target="#htmx-grid-demo"></div>
    +</div>
    +
    +<script src="https://unpkg.com/htmx.org@1.3.2"></script>
    +
    +
    +

    Notice that we added the #htmx-grid-demo DIV which calls the htmx_grid route.

    +

    templates/htmx_grid.html

    +
    [[=grid.render()]]
    +
    +
    +

    In htmx_grid we take advantage of deferred processing on the grid. We setup a standard CRUD grid, defer +processing and then tell the grid we’re going to use an alternate attributes plugin to build our navigation. +Now the forms, links and delete confirmations are all handled by htmx.

    +
    +
    +

    Autocomplete Widget using htmx

    +

    htmx can be used for much more than just form/grid processing. In this example we’ll take advantage of htmx and the +py4web form widgets to build an autocomplete widget that can be used in your forms. NOTE: this is just an example, none +of this code comes with py4web

    +

    Again we’ll use the superheros database as defined in the examples app.

    +

    Add the following to your controllers.py. This code will build your autocomplete dropdowns as well as +handle the database calls to get your data.

    +
    import json
    +from functools import reduce
    +
    +from yatl import DIV, INPUT, SCRIPT
    +
    +from py4web import action, request, URL
    +from ..common import session, db, auth
    +
    +
    +@action(
    +    "htmx/autocomplete",
    +    method=["GET", "POST"],
    +)
    +@action.uses(
    +    "htmx/autocomplete.html",
    +    session,
    +    db,
    +    auth.user,
    +)
    +def autocomplete():
    +    tablename = request.params.tablename
    +    fieldname = request.params.fieldname
    +    autocomplete_query = request.params.query
    +
    +    field = db[tablename][fieldname]
    +    data = []
    +
    +    fk_table = None
    +
    +    if field and field.requires:
    +        fk_table = field.requires.ktable
    +        fk_field = field.requires.kfield
    +
    +        queries = []
    +        if "_autocomplete_search_fields" in dir(field):
    +            for sf in field._autocomplete_search_fields:
    +                queries.append(
    +                    db[fk_table][sf].contains(
    +                        request.params[f"{tablename}_{fieldname}_search"]
    +                    )
    +                )
    +            query = reduce(lambda a, b: (a | b), queries)
    +        else:
    +            for f in db[fk_table]:
    +                if f.type in ["string", "text"]:
    +                    queries.append(
    +                        db[fk_table][f.name].contains(
    +                            request.params[f"{tablename}_{fieldname}_search"]
    +                        )
    +                    )
    +
    +            query = reduce(lambda a, b: (a | b), queries)
    +
    +        if len(queries) == 0:
    +            queries = [db[fk_table].id > 0]
    +            query = reduce(lambda a, b: (a & b), queries)
    +
    +        if autocomplete_query:
    +            query = reduce(lambda a, b: (a & b), [autocomplete_query, query])
    +        data = db(query).select(orderby=field.requires.orderby)
    +
    +    return dict(
    +        data=data,
    +        tablename=tablename,
    +        fieldname=fieldname,
    +        fk_table=fk_table,
    +        data_label=field.requires.label,
    +    )
    +
    +class HtmxAutocompleteWidget:
    +    def __init__(self, simple_query=None, url=None, **attrs):
    +        self.query = simple_query
    +        self.url = url if url else URL("htmx/autocomplete")
    +        self.attrs = attrs
    +
    +        self.attrs.pop("simple_query", None)
    +        self.attrs.pop("url", None)
    +
    +    def make(self, field, value, error, title, placeholder="", readonly=False):
    +        #  TODO: handle readonly parameter
    +        control = DIV()
    +        if "_table" in dir(field):
    +            tablename = field._table
    +        else:
    +            tablename = "no_table"
    +
    +        #  build the div-hidden input field to hold the value
    +        hidden_input = INPUT(
    +            _type="text",
    +            _id="%s_%s" % (tablename, field.name),
    +            _name=field.name,
    +            _value=value,
    +        )
    +        hidden_div = DIV(hidden_input, _style="display: none;")
    +        control.append(hidden_div)
    +
    +        #  build the input field to accept the text
    +
    +        #  set the htmx attributes
    +
    +        values = {
    +            "tablename": str(tablename),
    +            "fieldname": field.name,
    +            "query": str(self.query) if self.query else "",
    +            **self.attrs,
    +        }
    +        attrs = {
    +            "_hx-post": self.url,
    +            "_hx-trigger": "keyup changed delay:500ms",
    +            "_hx-target": "#%s_%s_autocomplete_results" % (tablename, field.name),
    +            "_hx-indicator": ".htmx-indicator",
    +            "_hx-vals": json.dumps(values),
    +        }
    +        search_value = None
    +        if value and field.requires:
    +            row = (
    +                db(db[field.requires.ktable][field.requires.kfield] == value)
    +                .select()
    +                .first()
    +            )
    +            if row:
    +                search_value = field.requires.label % row
    +
    +        control.append(
    +            INPUT(
    +                _type="text",
    +                _id="%s_%s_search" % (tablename, field.name),
    +                _name="%s_%s_search" % (tablename, field.name),
    +                _value=search_value,
    +                _class="input",
    +                _placeholder=placeholder if placeholder and placeholder != "" else "..",
    +                _title=title,
    +                _autocomplete="off",
    +                **attrs,
    +            )
    +        )
    +
    +        control.append(DIV(_id="%s_%s_autocomplete_results" % (tablename, field.name)))
    +
    +        control.append(
    +            SCRIPT(
    +                """
    +        htmx.onLoad(function(elt) {
    +            document.querySelector('#%(table)s_%(field)s_search').onkeydown = check_%(table)s_%(field)s_down_key;
    +            \n
    +            function check_%(table)s_%(field)s_down_key(e) {
    +                if (e.keyCode == '40') {
    +                    document.querySelector('#%(table)s_%(field)s_autocomplete').focus();
    +                    document.querySelector('#%(table)s_%(field)s_autocomplete').selectedIndex = 0;
    +                }
    +            }
    +        })
    +            """
    +                % {
    +                    "table": tablename,
    +                    "field": field.name,
    +                }
    +            )
    +        )
    +
    +        return control
    +
    +
    +

    Usage - in your controller code, this example uses bulma as the base css formatter.

    +
    formstyle = FormStyleFactory()
    +formstyle.classes = FormStyleBulma.classes
    +formstyle.class_inner_exceptions = FormStyleBulma.class_inner_exceptions
    +formstyle.widgets["vendor"] = HtmxAutocompleteWidget(
    +    simple_query=(db.vendor.vendor_type == "S")
    +)
    +
    +form = Form(
    +    db.product,
    +    record=product_record,  # defined earlier in controller
    +    formstyle=formstyle,
    +)
    +
    +
    +

    First, get an instance of FormStyleFactory. Then get the base css classes from whichever css framework you wish. Add +the class inner exceptions from your css framework. Once this is set up you can override the default widget for a +field based on its name. In this case we’re overriding the widget for the “vendor” field. Instead of including all +vendors in the select dropdown, we’re limiting only to those with a vendor type equal to “S”.

    +

    When this is rendered in your page, the default widget for the vendor field is replaced with the widget generated by +the HtmxAutocompleteWidget. When you pass a simple query to the HtmxAutocompleteWidget the widget will use the default +route to fill the dropdown with data.

    +

    If using the simple query and default build url, you are limited to a simple DAL query. You cannot use DAL subqueries +within this simple query. If the data for the dropdown requires a more complex DAL query you can override the default +data builder URL to provide your own controller function to retrieve the data.

    +
    +
    +[CIT1601] +

    from the https://htmx.org website

    +
    +
    +
    +
    +
    +

    utils.js

    +

    Multiple times in this documentation we have mentioned utils.js which comes with the scaffolding application, +yet we never clearly listed what is in there. So here it is.

    +
    +

    string.format

    +

    It extends the String object prototype to allow expressions like this:

    +
    var a = "hello {name}".format(name="Max");
    +
    +
    +
    +
    +

    The Q object

    +

    The Q object can be used like a selector supporting jQuery like syntax:

    +
    var element = Q("#element-id")[0];
    +var selected_elements = Q(".element-class");
    +
    +
    +

    It supports the same syntax as JS querySelectorAll +and always returns an array of selected elements (can be empty).

    +

    The Q objects is also a container for functions that can be useful when programming in Javascript. +It is stateless.

    +

    For example:

    +

    Q.clone

    +

    A function to clone any object:

    +
    var b = {any: "object"}
    +var a = Q.clone(b);
    +
    +
    +

    Q.eval

    +

    It evaluates JS expressions in a string. It is not a sandbox.

    +
    var a = Q.eval("2+3+Math.random()");
    +
    +
    +

    Q.ajax

    +

    A wrapper for the JS fetch method which provides a nicer syntax:

    +
    var data = {};
    +var headers = {'custom-header-name': 'value'}
    +var success = response => { console.log("recereived", response); }
    +var failure = response => { console.log("recereived", response); }
    +Q.ajax("POST", url, data, headers).then(success, failure);
    +
    +
    +

    Q.get_cookie

    +

    Extracts a cookie by name from the header of cookies in the current page: +returns null if the cookie does not exist. Can be used within the JS of a page to retrieve a session cookie +in case it is needed to call an API.

    +
    var a = Q.get_cookie("session");
    +
    +
    +

    Q.register_vue_component

    +

    This is specific for Vue 2 and may be deprecated in the future but it allows +to define a vue component where the template is stored in a separate HTML file +and the template will be loaded lazily only when/if the component is used.

    +

    For example instead of doing:

    +
    Vue.component('button-counter', {
    +data: function () {
    +    return {
    +        count: 0
    +    }
    +},
    +template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
    +});
    +
    +
    +

    You would put the template in a button-counter.html and do

    +
    Q.register_vue_component("button-counter", "button-counter.html", function(res) {
    +    return {
    +        data: function () {
    +            return {
    +                count: 0
    +            };
    +        };
    +});
    +
    +
    +

    Q.upload_helper

    +

    It allows to bind an input tag of type file to a callback so that when a file is selected +the content of the selected file is loaded, base64 encoded, and passed to the callback.

    +

    This is useful to create form which include an input field selector - but you want to +place the content of the selected file into a variable, for example to do an ajax post of that content.

    +

    For example:

    +
    <input type="file" id="my-id" />
    +
    +
    +

    and

    +
    var file_name = ""
    +var file_content = "";
    +Q.upload_helper("my_id", function(name, content) {
    +   file_name = name;
    +   file_content = content; // base 64 encoded;
    +}
    +
    +
    +
    +
    +

    The T object

    +

    This is a Javascript reimplementation of the Python pluralize library in Python +which is used by the Python T object in py4web. So basically a client-side T.

    +
    T.translations = {'dog': {0: 'no cane', 1: 'un case', 2: '{n} cani', 10: 'tanti cani'}};
    +var message = T('dog').format({n: 5}); // "5 cani"
    +
    +
    +

    The intended usage is to create a server endpoint that can provide translations +for the client accepted-language, obtain T.translations via ajax get, and then use +T to translate and pluralize all messages clientside rather than serverside.

    +

    Q.debounce

    +

    Prevents a function from stepping on itself.

    +
    setInterval(500, Q.debounce(function(){console.log("hello!")}, 200);
    +
    +
    +

    and the function will be called every 500ms +but will skip if the previous call did not terminate. +Unlike other debounce implementations out there, it makes sure +the last call is always executed by delaying it (in the example 200ms);

    +

    Q.debounce

    +

    Prevents a function from being called too often;

    +
    Q("#element").onclick = Q.debounce(function(){console.log("clicked!")}, 1000);
    +
    +
    +

    If the element is clicked more often than once every 1000ms, the other clicks will be ignored.

    +

    Q.tags_inputs

    +

    It turns a regular text input containing a string of comma separated tags into a tag widgets. +For example:

    +
    <input name="browsers"/>
    +
    +
    +

    and in JSL

    +
    Q.tags_input('[name=zip_codes]')
    +
    +
    +

    You can restrict the set of options with:

    +
    Q.tags_input('[name=zip_codes]', {
    +   freetext: false,
    +   tags: ['Chrome', 'Firefox', 'Safari', 'Edge']
    +});
    +
    +
    +

    It works with the datalist element to provide autocomplete. Simply prepend -list to the datalist id:

    +
    <input name="browsers"/>
    +<datalist id="browses-list">
    +   <option>Chrome</option>
    +   <option>Firfox</option>
    +   <option>Safari</option>
    +   <option>Edge</option>
    +</datalist>
    +
    +
    +

    and in JS:

    +
    Q.tags_input('[name=zip_codes]', {freetext: false});
    +
    +
    +

    It provides more undocumented options. +You need to style the tags. For example:

    +
    ul.tags-list {
    +  padding-left: 0;
    +}
    +ul.tags-list li {
    +  display: inline-block;
    +  border-radius: 100px;
    +  background-color: #111111;
    +  color: white;
    +  padding: 0.3em 0.8em 0.2em 0.8em;
    +  line-height: 1.2em;
    +  margin: 2px;
    +  cursor: pointer;
    +  opacity: 0.2;
    +  text-transform: capitalize;
    +}
    +ul.tags-list li[data-selected=true] {
    +  opacity: 1.0;
    +}
    +
    +
    +

    Notice that if an input element has class .type-list-string or .type-list-integer, utils.js applies the +tag_input function automatically.

    +

    Q.score_input*

    +

    ..code:: javascript

    +
    +

    Q.score_input(Q(“input[type=password]”)[0]);

    +
    +

    This will turn the password input into a widget that scores the password complexity. +It is applied automatically to inputs with name «password» or «new_password».

    +

    Components

    +

    This is a poor man version of HTMX. It allows to insert in the page ajax-component tags that +are loaded via ajax and any form in those components will be trapped +(i.e. the result of form submission will also be displayed inside the same component)

    +

    For example imagine an index.html that contains

    +
    <ajax-component id="component_1" url="[[=URL('mycomponent')]]">
    +    <blink>Loading...</blink>
    +</ajax-component>
    +
    +
    +

    And a different action serving the component:

    +
    @action("mycomponent", method=["GET", "POST"])
    +@action.uses(flash)
    +def mycomponent():
    +    flash.set("Welcome")
    +    form = Form([Field("your_name")])
    +    return DIV(
    +        "Hello " + request.forms["your_name"]
    +        if form.accepted else form).xml()
    +
    +
    +

    A component action is a regular action except that it should generate html without the +<html><body>…</body></html> envelop and it can make use of templates and flash for example.

    +

    Notice that if the main page supports flash messages, any flash message in the component will be displayed +by the parent page.

    +

    Moreover if the component returns a redirect(«other_page») not just the content of the component, +but the entire page will be redirected.

    +

    The contents of the component html can contain <script>…</script> and they can modify global page variables +as well as modify other components.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/dark.css b/apps/_documentation/static/pt/dark.css new file mode 100644 index 000000000..da2235b5b --- /dev/null +++ b/apps/_documentation/static/pt/dark.css @@ -0,0 +1,622 @@ +/* links */ + +a, +a:visited { + color: #aaddff; +} + + +/* code directives */ + +.method dt, +.class dt, +.data dt, +.attribute dt, +.function dt, +.classmethod dt, +.exception dt, +.descclassname, +.descname { + background-color: #2d2d2d !important; +} + +.rst-content dl:not(.docutils) dt { + color: #aaddff; + background-color: #2d2d2d; + border-top: solid 3px #525252; + border-left: solid 3px #525252; +} + +em.property { + color: #888888; +} + + +/* tables */ + +.rst-content table.docutils thead { + color: #ddd; +} + +.rst-content table.docutils td { + border: 0px; +} + +.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td { + background-color: #5a5a5a; +} + + +/* inlined code highlights */ + +.xref, +.py-meth, +.rst-content a code { + color: #aaddff !important; + font-weight: normal !important; +} + +.rst-content code { + color: #eee !important; + font-weight: normal !important; +} + +code.literal { + background-color: #2d2d2d !important; + border: 1px solid #6d6d6d !important; +} + +code.docutils.literal.notranslate { + color: #ddd; +} + + +/* notes, warnings, hints */ + +.hint .admonition-title { + background: #2aa87c !important; +} + +.warning .admonition-title { + background: #cc4444 !important; +} + +.admonition-title { + background: #3a7ca8 !important; +} + +.admonition, +.note { + background-color: #2d2d2d !important; +} + + +/* table of contents */ + +.wy-nav-content-wrap { + background-color: rgba(0, 0, 0, 0.6) !important; +} + +.sidebar { + background-color: #191919 !important; +} + +.sidebar-title { + background-color: #2b2b2b !important; +} + +.wy-menu-vertical a { + color: #ddd; +} + +.wy-menu-vertical code.docutils.literal.notranslate { + color: #404040; + background: none !important; + border: none !important; +} + +.wy-nav-content { + background: #3c3c3c; + color: #dddddd; +} + +.wy-menu-vertical li.on a, +.wy-menu-vertical li.current>a { + background: #a3a3a3; + border-bottom: 0px !important; + border-top: 0px !important; +} + +.wy-menu-vertical li.current { + background: #b3b3b3; +} + +.toc-backref { + color: grey !important; +} + +.highlight .hll { + background-color: #49483e +} + +.highlight { + background: #222; + color: #f8f8f2 +} + +.highlight .c { + color: #888 +} + + +/* Comment */ + +.highlight .err { + color: #960050; + background-color: #1e0010 +} + + +/* Error */ + +.highlight .k { + color: #66d9ef +} + + +/* Keyword */ + +.highlight .l { + color: #ae81ff +} + + +/* Literal */ + +.highlight .n { + color: #f8f8f2 +} + + +/* Name */ + +.highlight .o { + color: #f92672 +} + + +/* Operator */ + +.highlight .p { + color: #f8f8f2 +} + + +/* Punctuation */ + +.highlight .ch { + color: #888 +} + + +/* Comment.Hashbang */ + +.highlight .cm { + color: #888 +} + + +/* Comment.Multiline */ + +.highlight .cp { + color: #888 +} + + +/* Comment.Preproc */ + +.highlight .cpf { + color: #888 +} + + +/* Comment.PreprocFile */ + +.highlight .c1 { + color: #888 +} + + +/* Comment.Single */ + +.highlight .cs { + color: #888 +} + + +/* Comment.Special */ + +.highlight .gd { + color: #f92672 +} + + +/* Generic.Deleted */ + +.highlight .ge { + font-style: italic +} + + +/* Generic.Emph */ + +.highlight .gi { + color: #a6e22e +} + + +/* Generic.Inserted */ + +.highlight .gs { + font-weight: bold +} + + +/* Generic.Strong */ + +.highlight .gu { + color: #888 +} + + +/* Generic.Subheading */ + +.highlight .kc { + color: #66d9ef +} + + +/* Keyword.Constant */ + +.highlight .kd { + color: #66d9ef +} + + +/* Keyword.Declaration */ + +.highlight .kn { + color: #f92672 +} + + +/* Keyword.Namespace */ + +.highlight .kp { + color: #66d9ef +} + + +/* Keyword.Pseudo */ + +.highlight .kr { + color: #66d9ef +} + + +/* Keyword.Reserved */ + +.highlight .kt { + color: #66d9ef +} + + +/* Keyword.Type */ + +.highlight .ld { + color: #e6db74 +} + + +/* Literal.Date */ + +.highlight .m { + color: #ae81ff +} + + +/* Literal.Number */ + +.highlight .s { + color: #e6db74 +} + + +/* Literal.String */ + +.highlight .na { + color: #a6e22e +} + + +/* Name.Attribute */ + +.highlight .nb { + color: #f8f8f2 +} + + +/* Name.Builtin */ + +.highlight .nc { + color: #a6e22e +} + + +/* Name.Class */ + +.highlight .no { + color: #66d9ef +} + + +/* Name.Constant */ + +.highlight .nd { + color: #a6e22e +} + + +/* Name.Decorator */ + +.highlight .ni { + color: #f8f8f2 +} + + +/* Name.Entity */ + +.highlight .ne { + color: #a6e22e +} + + +/* Name.Exception */ + +.highlight .nf { + color: #a6e22e +} + + +/* Name.Function */ + +.highlight .nl { + color: #f8f8f2 +} + + +/* Name.Label */ + +.highlight .nn { + color: #f8f8f2 +} + + +/* Name.Namespace */ + +.highlight .nx { + color: #a6e22e +} + + +/* Name.Other */ + +.highlight .py { + color: #f8f8f2 +} + + +/* Name.Property */ + +.highlight .nt { + color: #f92672 +} + + +/* Name.Tag */ + +.highlight .nv { + color: #f8f8f2 +} + + +/* Name.Variable */ + +.highlight .ow { + color: #f92672 +} + + +/* Operator.Word */ + +.highlight .w { + color: #f8f8f2 +} + + +/* Text.Whitespace */ + +.highlight .mb { + color: #ae81ff +} + + +/* Literal.Number.Bin */ + +.highlight .mf { + color: #ae81ff +} + + +/* Literal.Number.Float */ + +.highlight .mh { + color: #ae81ff +} + + +/* Literal.Number.Hex */ + +.highlight .mi { + color: #ae81ff +} + + +/* Literal.Number.Integer */ + +.highlight .mo { + color: #ae81ff +} + + +/* Literal.Number.Oct */ + +.highlight .sa { + color: #e6db74 +} + + +/* Literal.String.Affix */ + +.highlight .sb { + color: #e6db74 +} + + +/* Literal.String.Backtick */ + +.highlight .sc { + color: #e6db74 +} + + +/* Literal.String.Char */ + +.highlight .dl { + color: #e6db74 +} + + +/* Literal.String.Delimiter */ + +.highlight .sd { + color: #e6db74 +} + + +/* Literal.String.Doc */ + +.highlight .s2 { + color: #e6db74 +} + + +/* Literal.String.Double */ + +.highlight .se { + color: #ae81ff +} + + +/* Literal.String.Escape */ + +.highlight .sh { + color: #e6db74 +} + + +/* Literal.String.Heredoc */ + +.highlight .si { + color: #e6db74 +} + + +/* Literal.String.Interpol */ + +.highlight .sx { + color: #e6db74 +} + + +/* Literal.String.Other */ + +.highlight .sr { + color: #e6db74 +} + + +/* Literal.String.Regex */ + +.highlight .s1 { + color: #e6db74 +} + + +/* Literal.String.Single */ + +.highlight .ss { + color: #e6db74 +} + + +/* Literal.String.Symbol */ + +.highlight .bp { + color: #f8f8f2 +} + + +/* Name.Builtin.Pseudo */ + +.highlight .fm { + color: #a6e22e +} + + +/* Name.Function.Magic */ + +.highlight .vc { + color: #f8f8f2 +} + + +/* Name.Variable.Class */ + +.highlight .vg { + color: #f8f8f2 +} + + +/* Name.Variable.Global */ + +.highlight .vi { + color: #f8f8f2 +} + + +/* Name.Variable.Instance */ + +.highlight .vm { + color: #f8f8f2 +} + + +/* Name.Variable.Magic */ + +.highlight .il { + color: #ae81ff +} + + +/* Literal.Number.Integer.Long */ diff --git a/apps/_documentation/static/pt/genindex.html b/apps/_documentation/static/pt/genindex.html new file mode 100644 index 000000000..afc0aa1f9 --- /dev/null +++ b/apps/_documentation/static/pt/genindex.html @@ -0,0 +1,187 @@ + + + + + + + + Índice — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + + +

    Índice

    + +
    + +
    + + +
    +
    +
    + +
    + +
    +

    © Copyright 2020, BSDv3 License.

    +
    + + Compilado com Sphinx usando um + tema + fornecido por Read the Docs. + + +
    +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/index.html b/apps/_documentation/static/pt/index.html new file mode 100644 index 000000000..ea69d1b09 --- /dev/null +++ b/apps/_documentation/static/pt/index.html @@ -0,0 +1,338 @@ + + + + + + + + + py4web: o manual de referência — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    py4web: o manual de referência

    +
    +

    Conteúdo:

    + +
    +
    +
    +

    Índices e tabelas

    +
      +
    • : Ref: genindex

    • +
    • : Ref: modindex

    • +
    • : Ref: search

    • +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/objects.inv b/apps/_documentation/static/pt/objects.inv new file mode 100644 index 000000000..6c2180dab Binary files /dev/null and b/apps/_documentation/static/pt/objects.inv differ diff --git a/apps/_documentation/static/pt/search.html b/apps/_documentation/static/pt/search.html new file mode 100644 index 000000000..6a675057a --- /dev/null +++ b/apps/_documentation/static/pt/search.html @@ -0,0 +1,201 @@ + + + + + + + + Pesquisar — Documentação py4web 20250125 + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    +
      +
    • + +
    • +
    • +
    +
    +
    +
    +
    + + + + +
    + +
    + +
    +
    +
    + +
    + +
    +

    © Copyright 2020, BSDv3 License.

    +
    + + Compilado com Sphinx usando um + tema + fornecido por Read the Docs. + + +
    +
    +
    +
    +
    + + +
    + + Read the Docs + + + + + + + + v: 20250125 + + +
    + +
    +
    Idiomas
    + + + +
    en
    + + +
    pt
    + + +
    + + +
    +
    Versões
    + + +
    current
    + + +
    + + +
    +
    Transferências
    + +
    pdf
    + +
    epub
    + +
    + + +
    +
    +
    + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/_documentation/static/pt/searchindex.js b/apps/_documentation/static/pt/searchindex.js new file mode 100644 index 000000000..00c66d530 --- /dev/null +++ b/apps/_documentation/static/pt/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"A auto-refer\u00eancia e aliases": [[6, "self-reference-and-aliases"]], "A minimal form example without a database": [[12, "a-minimal-form-example-without-a-database"]], "A obten\u00e7\u00e3o de um `` row``": [[6, "fetching-a-row"]], "A p\u00e1gina Web principal": [[3, "the-main-web-page"]], "ANY_OF": [[12, "any-of"]], "Acknowledgments": [[0, "acknowledgments"]], "Adicionando atributos para campos e tabelas": [[6, "adding-attributes-to-fields-and-tables"]], "Advanced form design": [[12, "advanced-form-design"]], "Advanced topics and examples": [[16, null]], "Agrupamento e contando": [[6, "grouping-and-counting"]], "Ajuda, recursos e dicas": [[1, null]], "Aplicativos de modelo-less": [[6, "model-less-applications"]], "As fontes no GitHub": [[1, "the-sources-on-github"]], "Assinatura da DAL": [[6, "dal-signature"]], "Atalhos": [[6, "shortcuts"]], "Atualizar os arquivos de tradu\u00e7\u00e3o": [[11, "update-the-translation-files"]], "Auth API Plugins": [[13, "auth-api-plugins"]], "Authentication and authorization": [[13, null]], "Authentication using Auth": [[13, "authentication-using-auth"]], "Authorization using Tags": [[13, "authorization-using-tags"]], "Autocomplete Widget using htmx": [[16, "autocomplete-widget-using-htmx"]], "A\u00e7\u00e3o personalizada Bot\u00f5es": [[14, "custom-action-buttons"]], "Bancos de dados legados e tabelas com chave": [[6, "legacy-databases-and-keyed-tables"]], "Bancos de dados replicados": [[6, "replicated-databases"]], "Basic form example": [[12, "basic-form-example"]], "Basic grid example": [[14, "basic-grid-example"]], "Bot\u00e3o Classe A\u00e7\u00e3o Amostra": [[14, "sample-action-button-class"]], "Built-in helpers": [[10, "built-in-helpers"]], "CLEANUP": [[12, "cleanup"]], "CRUD settings": [[14, "crud-settings"]], "CRYPT": [[12, "crypt"]], "CSV (todas as tabelas ao mesmo tempo)": [[6, "csv-all-tables-at-once"]], "CSV (uma tabela de cada vez)": [[6, "csv-one-table-at-a-time"]], "CSV e sincroniza\u00e7\u00e3o de banco de dados remoto": [[6, "csv-and-remote-database-synchronization"]], "Caching e Memoize": [[5, "caching-and-memoize"]], "Campos computados": [[6, "computed-fields"]], "Campos virtuais": [[6, "virtual-fields"]], "Campos virtuais novo estilo (experimental)": [[6, "new-style-virtual-fields-experimental"]], "Campos virtuais velho antigo": [[6, "old-style-virtual-fields"]], "Caracter\u00edsticas avan\u00e7adas": [[6, "advanced-features"]], "Cascades no banco de dados": [[6, "database-cascades"]], "Caveats about fixtures": [[5, "caveats-about-fixtures"]], "Celery": [[16, "celery"]], "Checkbox validation": [[12, "checkbox-validation"]], "Client-side session in cookies": [[5, "client-side-session-in-cookies"]], "Combinando Rows": [[6, "combining-rows"]], "Como contribuir": [[1, "how-to-contribute"]], "Complexity and security validators": [[12, "complexity-and-security-validators"]], "Computed and Virtual fields": [[6, "computed-and-virtual-fields"]], "Configura\u00e7\u00f5es de quoting e case e do banco de dados": [[6, "database-quoting-and-case-settings"]], "Configura\u00e7\u00f5es padr\u00e3o de migra\u00e7\u00e3o": [[6, "default-migration-settings"]], "Construtor DAL": [[6, "dal-constructor"]], "Construtor Field": [[6, "field-constructor"]], "Construtor Table": [[6, "table-constructor"]], "Conte\u00fado:": [[17, null]], "Copiar dados de um para outro db": [[6, "copy-data-from-one-db-into-another"]], "Copying the _scaffold app": [[4, "copying-the-scaffold-app"]], "Creating an app": [[4, null]], "Custom columns": [[14, "custom-columns"]], "Custom error pages": [[4, "custom-error-pages"]], "Custom forms": [[12, "custom-forms"]], "Custom widgets": [[12, "custom-widgets"]], "Customizing style": [[14, "customizing-style"]], "DAL introduction": [[6, "dal-introduction"]], "Database validators": [[12, "database-validators"]], "Date and time validators": [[12, "date-and-time-validators"]], "De web2py para py4web": [[15, null]], "Decoradores de conveni\u00eancia": [[5, "convenience-decorators"]], "Default page layout": [[8, "default-page-layout"]], "Deployment on Docker/Podman": [[2, "deployment-on-docker-podman"]], "Deployment on GCloud (aka GAE - Google App Engine)": [[2, "deployment-on-gcloud-aka-gae-google-app-engine"]], "Deployment on Ubuntu": [[2, "deployment-on-ubuntu"]], "Depura\u00e7\u00e3o py4web com PyCharm": [[1, "debugging-py4web-with-pycharm"]], "Depura\u00e7\u00e3o py4web com VScode": [[1, "debugging-py4web-with-vscode"]], "Dicas e sugest\u00f5es": [[1, "hints-and-tips"]], "Dictionaries and tuples with IS_IN_SET": [[12, "dictionaries-and-tuples-with-is-in-set"]], "Do princ\u00edpio": [[4, "from-scratch"]], "Domain-mapped apps": [[4, "domain-mapped-apps"]], "Em valores de retorno": [[4, "on-return-values"]], "Este manual": [[1, "this-manual"]], "Etiquetas e permiss\u00f5es": [[13, "tags-and-permissions"]], "Example of JwtTokenPlugin": [[13, "example-of-jwttokenplugin"]], "Example of SimpleTokenPlugin": [[13, "example-of-simpletokenplugin"]], "Example of custom Token Plugin": [[13, "example-of-custom-token-plugin"]], "Experimentar com o shell py4web": [[6, "experiment-with-the-py4web-shell"]], "Exportar e importar dados": [[6, "exporting-and-importing-data"]], "Express\u00f5es": [[6, "expressions"]], "Extending using variables": [[8, "extending-using-variables"]], "Falhas de conex\u00e3o (par\u00e2metro tentativas)": [[6, "connection-failures-attempts-parameter"]], "Fazendo uma conex\u00e3o segura": [[6, "making-a-secure-connection"]], "Field types and validators": [[6, "field-types-and-validators"]], "File upload field": [[12, "file-upload-field"]], "Fixa\u00e7\u00e3o migra\u00e7\u00f5es quebrados": [[6, "fixing-broken-migrations"]], "Fixtures personalizados": [[5, "custom-fixtures"]], "Fixtures with dependencies": [[5, "fixtures-with-dependencies"]], "Fixures": [[5, null]], "Form structure manipulation": [[12, "form-structure-manipulation"]], "Foruml\u00e1rios": [[12, null]], "Generating raw SQL": [[6, "generating-raw-sql"]], "Google NoSQL (Datastore)": [[6, "google-nosql-datastore"]], "Google SQL": [[6, "google-sql"]], "Grids with checkboxes": [[14, "grids-with-checkboxes"]], "HTML e XML (uma tabela de cada vez)": [[6, "html-and-xml-one-table-at-a-time"]], "HTTPS": [[2, "https"]], "Helpers YATL": [[10, null]], "Helpers overview": [[10, "helpers-overview"]], "Helpers personalizados": [[10, "custom-helpers"]], "Heran\u00e7a de tabela": [[6, "table-inheritance"]], "IS_ALPHANUMERIC": [[12, "is-alphanumeric"]], "IS_DATE": [[12, "is-date"]], "IS_DATETIME": [[12, "is-datetime"]], "IS_DATETIME_IN_RANGE": [[12, "is-datetime-in-range"]], "IS_DATE_IN_RANGE": [[12, "is-date-in-range"]], "IS_DECIMAL_IN_RANGE": [[12, "is-decimal-in-range"]], "IS_EMAIL": [[12, "is-email"]], "IS_EMPTY_OR": [[12, "is-empty-or"]], "IS_EQUAL_TO": [[12, "is-equal-to"]], "IS_EXPR": [[12, "is-expr"]], "IS_FILE": [[12, "is-file"]], "IS_FLOAT_IN_RANGE": [[12, "is-float-in-range"]], "IS_IMAGE": [[12, "is-image"]], "IS_INT_IN_RANGE": [[12, "is-int-in-range"]], "IS_IN_DB": [[12, "is-in-db"]], "IS_IN_DB and Tagging": [[12, "is-in-db-and-tagging"]], "IS_IN_SET": [[12, "is-in-set"]], "IS_IN_SET and Tagging": [[12, "is-in-set-and-tagging"]], "IS_IPADDRESS": [[12, "is-ipaddress"]], "IS_IPV4": [[12, "is-ipv4"]], "IS_IPV6": [[12, "is-ipv6"]], "IS_JSON": [[12, "is-json"]], "IS_LENGTH": [[12, "is-length"]], "IS_LIST_OF": [[12, "is-list-of"]], "IS_LIST_OF_EMAILS": [[12, "is-list-of-emails"]], "IS_LOWER": [[12, "is-lower"]], "IS_MATCH": [[12, "is-match"]], "IS_NOT_EMPTY": [[12, "is-not-empty"]], "IS_NOT_IN_DB": [[12, "is-not-in-db"]], "IS_NULL_OR": [[12, "is-null-or"]], "IS_SAFE": [[12, "is-safe"]], "IS_SLUG": [[12, "is-slug"]], "IS_STRONG": [[12, "is-strong"]], "IS_TIME": [[12, "is-time"]], "IS_UPLOAD_FILENAME": [[12, "is-upload-filename"]], "IS_UPPER": [[12, "is-upper"]], "IS_URL": [[12, "is-url"]], "Implanta\u00e7\u00e3o em PythonAnywhere.com": [[2, "deployment-on-pythonanywhere-com"]], "Information workflow": [[8, "information-workflow"]], "Inner join": [[6, "inner-join"]], "Inserir e atualizar a partir de um dicion\u00e1rio": [[6, "inserting-and-updating-from-a-dictionary"]], "Instalando a partir de bin\u00e1rios": [[2, "installing-from-binaries"]], "Instalando a partir de fonte (localmente)": [[2, "installing-from-source-locally"]], "Instala\u00e7\u00e3o de fonte (globalmente)": [[2, "installing-from-source-globally"]], "Instala\u00e7\u00e3o e coloca\u00e7\u00e3o em funcionamento": [[2, null]], "Installing from pip, using a virtual environment": [[2, "installing-from-pip-using-a-virtual-environment"]], "Installing from pip, without virtual environment": [[2, "installing-from-pip-without-virtual-environment"]], "Interface de autentica\u00e7\u00e3o": [[13, "auth-ui"]], "Internacionaliza\u00e7\u00e3o": [[11, null]], "Joins and Relations": [[6, "joins-and-relations"]], "Key features": [[14, "key-features"]], "LDAP": [[13, "ldap"]], "Left outer join": [[6, "left-outer-join"]], "Linguagem de template YATL": [[8, null]], "Local de pasta do banco de dados": [[6, "database-folder-location"]], "MSSQL (Microsoft SQL Server)": [[6, "mssql-microsoft-sql-server"]], "Mais sobre envios": [[6, "more-on-uploads"]], "Many to many relation": [[6, "many-to-many-relation"]], "Marca\u00e7\u00e3o de registros": [[6, "tagging-records"]], "Melhoramento": [[2, "upgrading"]], "Migra\u00e7\u00e3o resumo controle": [[6, "migration-control-summary"]], "Migra\u00e7\u00f5es": [[6, "migrations"]], "Mobile development": [[8, "mobile-development"]], "Modelos": [[4, "templates"]], "Multiple Tags objects": [[13, "multiple-tags-objects"]], "Multiple fixtures": [[5, "multiple-fixtures"]], "MySQL": [[6, "mysql"]], "Nota sobre novo DAL e adaptadores": [[6, "note-on-new-dal-and-adapters"]], "O Dashboard": [[3, null]], "O fixture DAL": [[5, "the-dal-fixture"]], "O fixture flash": [[5, "the-flash-fixture"]], "O grupo Google": [[1, "the-google-group"]], "O objeto `` request``": [[4, "the-request-object"]], "O pool de conex\u00f5es": [[6, "connection-pooling"]], "O que \u00e9 py4web?": [[0, null]], "OAuth2 with Discord": [[13, "oauth2-with-discord"]], "OAuth2 with Facebook": [[13, "oauth2-with-facebook"]], "OAuth2 with Google": [[13, "oauth2-with-google"]], "Operadores l\u00f3gicos": [[6, "logical-operators"]], "Op\u00e7\u00e3o `` comando call``": [[2, "call-command-option"]], "Op\u00e7\u00e3o `` comando new_app``": [[2, "new-app-command-option"]], "Op\u00e7\u00e3o `` comando run``": [[2, "run-command-option"]], "Op\u00e7\u00e3o `` comando set_password``": [[2, "set-password-command-option"]], "Op\u00e7\u00e3o `` comando setup``": [[2, "setup-command-option"]], "Op\u00e7\u00e3o `` comando shell``": [[2, "shell-command-option"]], "Op\u00e7\u00e3o `` comando version``": [[2, "version-command-option"]], "Op\u00e7\u00f5es de linha de comando": [[2, "command-line-options"]], "Or\u00e1culo": [[6, "oracle"]], "Os campos de refer\u00eancia": [[14, "reference-fields"]], "Os valores por defeito com `` `` coalesce`` e coalesce_zero``": [[6, "default-values-with-coalesce-and-coalesce-zero"]], "Other validators": [[12, "other-validators"]], "Outros operadores": [[6, "other-operators"]], "Outros par\u00e2metros do construtor DAL": [[6, "other-dal-constructor-parameters"]], "PAM": [[13, "pam"]], "Page layout standard structure": [[8, "page-layout-standard-structure"]], "Palavras-chave reservadas": [[6, "reserved-keywords"]], "Pegadinhas": [[6, "gotchas"]], "Personalizados `` tipos Field``": [[6, "custom-field-types"]], "Plataformas e pr\u00e9-requisitos suportados": [[2, "supported-platforms-and-prerequisites"]], "Plugins de Autentica\u00e7\u00e3o": [[13, "auth-plugins"]], "Pluralizar": [[11, "pluralize"]], "Primeira corrida": [[2, "first-run"]], "Procedimentos de configura\u00e7\u00e3o": [[2, "setup-procedures"]], "Pr\u00e9-requisitos": [[1, "prerequisites"]], "P\u00e1ginas est\u00e1ticas": [[4, "static-web-pages"]], "P\u00e1ginas web din\u00e2micas": [[4, "dynamic-web-pages"]], "Range, set and equality validators": [[12, "range-set-and-equality-validators"]], "Raw SQL": [[6, "raw-sql"]], "Recursivas `` s SELECT``": [[6, "recursive-selects"]], "Recursos": [[1, "resources"]], "Rede": [[14, null]], "Renderizando Rows com represent": [[6, "rendering-rows-using-represent"]], "Representa\u00e7\u00e3o de dados": [[6, "data-representation"]], "RestAPI GET": [[7, "restapi-get"]], "RestAPI policies and actions": [[7, "restapi-policies-and-actions"]], "RestAPI practical examples": [[7, "restapi-practical-examples"]], "Rotas": [[4, "routes"]], "SQLite": [[6, "sqlite"]], "Searching and filtering": [[14, "searching-and-filtering"]], "Selects com cache": [[6, "caching-selects"]], "Sending messages using a background task": [[16, "sending-messages-using-a-background-task"]], "Server-side DOM": [[10, "server-side-dom"]], "Server-side session anywhere": [[5, "server-side-session-anywhere"]], "Server-side session in Redis": [[5, "server-side-session-in-redis"]], "Server-side session in database": [[5, "server-side-session-in-database"]], "Server-side session in memcache": [[5, "server-side-session-in-memcache"]], "Sess\u00e3o no Dashboard": [[3, "login-into-the-dashboard"]], "Sharing sessions": [[5, "sharing-sessions"]], "Simple conversion examples": [[15, "simple-conversion-examples"]], "Sintaxe b\u00e1sica": [[8, "basic-syntax"]], "Sorted options": [[12, "sorted-options"]], "Special installations": [[2, "special-installations"]], "Special type validators": [[12, "special-type-validators"]], "Standard widgets": [[12, "standard-widgets"]], "Strings de conex\u00e3o (o par\u00e2metro uri)": [[6, "connection-strings-the-uri-parameter"]], "Substrings": [[6, "substrings"]], "Supported databases": [[6, "supported-databases"]], "Tabelas pregui\u00e7osos": [[6, "lazy-tables"]], "Table methods": [[6, "table-methods"]], "Template Functions": [[8, "template-functions"]], "Temporiza\u00e7\u00e3o de consultas": [[6, "timing-queries"]], "Text format validators": [[12, "text-format-validators"]], "The Auth fixture": [[5, "the-auth-fixture"]], "The Condition fixture": [[5, "the-condition-fixture"]], "The DAL: a quick tour": [[6, "the-dal-a-quick-tour"]], "The Database Abstraction Layer (DAL)": [[6, null]], "The Discord server": [[1, "the-discord-server"]], "The Form constructor": [[12, "the-form-constructor"]], "The Grid object": [[14, "the-grid-object"]], "The Inject fixture": [[5, "the-inject-fixture"]], "The Q object": [[16, "the-q-object"]], "The RestAPI": [[7, null]], "The RestAPI response": [[7, "the-restapi-response"]], "The Session fixture": [[5, "the-session-fixture"]], "The T object": [[16, "the-t-object"]], "The Template fixture": [[5, "the-template-fixture"]], "The Translator fixture": [[5, "the-translator-fixture"]], "The URLsigner fixture": [[5, "the-urlsigner-fixture"]], "The _scaffold app": [[4, "the-scaffold-app"]], "The scheduler": [[16, "the-scheduler"]], "The sidecar parameter": [[12, "the-sidecar-parameter"]], "Transa\u00e7\u00e3o distribu\u00edda": [[6, "distributed-transaction"]], "Tutoriais e v\u00eddeo": [[1, "tutorials-and-video"]], "Two Factor Authentication": [[13, "two-factor-authentication"]], "Um local de trabalho python moderna": [[1, "a-modern-python-workplace"]], "Um para muitos rela\u00e7\u00e3o": [[6, "one-to-many-relation"]], "Understanding the design": [[2, "understanding-the-design"]], "Usando DAL sem definir tabelas": [[6, "using-dal-without-define-tables"]], "Usando o DAL \u201cstand-alone\u201d": [[6, "using-the-dal-stand-alone"]], "Usando templates": [[14, "using-templates"]], "Usando um seleto para uso de mem\u00f3ria inferior \u00e0 base de iterador": [[6, "using-an-iterator-based-select-for-lower-memory-use"]], "User Impersonation": [[13, "user-impersonation"]], "Using Auth inside actions": [[13, "using-auth-inside-actions"]], "Using Fixtures": [[5, "using-fixtures"]], "Using Inject": [[10, "using-inject"]], "Using callable parameters": [[14, "using-callable-parameters"]], "Using local storage": [[5, "using-local-storage"]], "Using the dashboard app with databases": [[6, "using-the-dashboard-app-with-databases"]], "Validation functions": [[12, "validation-functions"]], "Valida\u00e7\u00e3o de formul\u00e1rio": [[12, "form-validation"]], "WSGI": [[2, "wsgi"]], "Watch for files change": [[4, "watch-for-files-change"]], "Widgets": [[12, "widgets"]], "`` A``": [[10, "a"]], "`` BEAUTIFY``": [[10, "beautify"]], "`` BODY``": [[10, "body"]], "`` Belongs``": [[6, "belongs"]], "`` CAT``": [[10, "cat"]], "`` Comando SELECT``": [[6, "select-command"]], "`` Count``, `` isempty``, `` DELETE``, `` update``": [[6, "count-isempty-delete-update"]], "`` Def \u2026 return``": [[8, "def-return"]], "`` Div``": [[10, "div"]], "`` Drop``": [[6, "drop"]], "`` EM``": [[10, "em"]], "`` Find``, `` exclude``, `` sort``": [[6, "find-exclude-sort"]], "`` Form``": [[10, "form"]], "`` Format``: representa\u00e7\u00e3o da ficha": [[6, "format-record-representation"]], "`` H1``, `` h2``, `` H3``, `` H4``, `` H5``, `` H6``": [[10, "h1-h2-h3-h4-h5-h6"]], "`` HEAD``": [[10, "head"]], "`` HTML``": [[10, "html"]], "`` IMG``": [[10, "img"]], "`` INPUT``": [[10, "input"]], "`` I``": [[10, "i"]], "`` Id``: Notas sobre a chave prim\u00e1ria": [[6, "id-notes-about-the-primary-key"]], "`` If \u2026 elif \u2026 else``": [[8, "if-elif-else"]], "`` Insert``": [[6, "insert"]], "`` LI``": [[10, "li"]], "`` Label``": [[10, "label"]], "`` Like``, `` ilike``, `` regexp``, `` startswith``, `` endswith``, `` contains``, `` upper``, `` lower``": [[6, "like-ilike-regexp-startswith-endswith-contains-upper-lower"]], "`` Lista: `` e `` contains``": [[6, "list-type-and-contains"]], "`` Migrate``, `` fake_migrate``": [[6, "migrate-fake-migrate"]], "`` OL``": [[10, "ol"]], "`` OPTION``": [[10, "option"]], "`` On_define``": [[6, "on-define"]], "`` Orderby``, `` groupby``, `` limitby``, `` distinct``, `` having``, `` orderby_on_limitby``, `` join``, `` left``, `` cache``": [[6, "orderby-groupby-limitby-distinct-having-orderby-on-limitby-join-left-cache"]], "`` PRE``": [[10, "pre"]], "`` P``": [[10, "p"]], "`` Para \u2026 in``": [[8, "for-in"]], "`` Primarykey``: Suporte para tabelas legadas": [[6, "primarykey-support-for-legacy-tables"]], "`` Query``, `` Set``, `` Rows``": [[6, "query-set-rows"]], "`` Redefine``": [[6, "redefine"]], "`` Rname``: nome real": [[6, "rname-real-name"]], "`` SCRIPT``": [[10, "script"]], "`` SELECT``": [[10, "select"]], "`` SPAN``": [[10, "span"]], "`` STYLE``": [[10, "style"]], "`` Sequence_name``": [[6, "sequence-name"]], "`` Sum``, `` avg``, `` min``, `` `` max`` e len``": [[6, "sum-avg-min-max-and-len"]], "`` TABLE``, `` TR``, `` TD``": [[10, "table-tr-td"]], "`` TAG``": [[10, "tag"]], "`` TBODY``": [[10, "tbody"]], "`` TEXTAREA``": [[10, "textarea"]], "`` THEAD``": [[10, "thead"]], "`` TH``": [[10, "th"]], "`` TITLE``": [[10, "title"]], "`` TT``": [[10, "tt"]], "`` Table_class``": [[6, "table-class"]], "`` Tentar \u2026 exceto \u2026 else \u2026 finally``": [[8, "try-except-else-finally"]], "`` Trigger_name``": [[6, "trigger-name"]], "`` UL``": [[10, "ul"]], "`` URL``": [[10, "url"]], "`` Update_or_insert``": [[6, "update-or-insert"]], "`` Update_record``": [[6, "update-record"]], "`` Validate_and_insert``, `` validate_and_update``": [[6, "validate-and-insert-validate-and-update"]], "`` While``": [[8, "while"]], "`` XML``": [[10, "xml"]], "`` Year``, `` month``, `` day``, `` hour``, `` minutes``, `` seconds``": [[6, "year-month-day-hour-minutes-seconds"]], "`` _Lastsql``": [[6, "lastsql"]], "`` `` As_dict`` e as_list``": [[6, "as-dict-and-as-list"]], "`` `` Filter_in`` e filter_out``": [[6, "filter-in-and-filter-out"]], "`` `` First`` e last``": [[6, "first-and-last"]], "`` `` Plural`` e singular``": [[6, "plural-and-singular"]], "`` `` commit`` e rollback``": [[6, "commit-and-rollback"]], "`` case``": [[6, "case"]], "`` executesql``": [[6, "executesql"]], "`` polymodel``": [[6, "polymodel"]], "assinatura define_table": [[6, "define-table-signature"]], "block and super": [[8, "block-and-super"]], "cache, em cache": [[6, "cache-cacheable"]], "children": [[10, "children"]], "distinto": [[6, "distinct"]], "extend and include": [[8, "extend-and-include"]], "filtros comuns": [[6, "common-filters"]], "find": [[10, "find"]], "groupby, tendo": [[6, "groupby-having"]], "htmx": [[16, "htmx"]], "htmx usage in Form": [[16, "htmx-usage-in-form"]], "htmx usage in Grid": [[16, "htmx-usage-in-grid"]], "juntar-se, deixou": [[6, "join-left"]], "limitby": [[6, "limitby"]], "modifica\u00e7\u00e3o da tabela e campo em tempo de execu\u00e7\u00e3o": [[6, "run-time-field-and-table-modification"]], "ordenar por": [[6, "orderby"]], "orderby_on_limitby": [[6, "orderby-on-limitby"]], "py4web and asyncio": [[16, "py4web-and-asyncio"]], "py4web model": [[6, "py4web-model"]], "py4web: o manual de refer\u00eancia": [[17, null]], "retornos de chamada no registro de inser\u00e7\u00e3o, exclus\u00e3o e atualiza\u00e7\u00e3o": [[6, "callbacks-on-record-insert-delete-and-update"]], "string.format": [[16, "string-format"]], "two_factor_required": [[13, "two-factor-required"]], "two_factor_send": [[13, "two-factor-send"]], "two_factor_tries": [[13, "two-factor-tries"]], "two_factor_validate": [[13, "two-factor-validate"]], "utils.js": [[16, "utils-js"]], "versionamento recorde": [[6, "record-versioning"]], "\u00cdndices": [[6, "indexes"]], "\u00cdndices e tabelas": [[17, "indices-and-tables"]], "\u201cAccessing OS files\u201d example": [[15, "accessing-os-files-example"]], "\u201cForm and flash\u201d example": [[15, "form-and-flash-example"]], "\u201cHello world\u201d example": [[15, "hello-world-example"]], "\u201cRedirect with variables\u201d example": [[15, "redirect-with-variables-example"]], "\u201cReturn calling methods\u201d example": [[15, "return-calling-methods-example"]], "\u201cReturning args\u201d example": [[15, "returning-args-example"]], "\u201cReturning variables\u201d example": [[15, "returning-variables-example"]], "\u201cSetting up a counter\u201d example": [[15, "setting-up-a-counter-example"]], "\u201cView\u201d example": [[15, "view-example"]], "\u201cauth\u201d example": [[15, "auth-example"]], "\u201cgrid\u201d example": [[15, "grid-example"]]}, "docnames": ["chapter-01", "chapter-02", "chapter-03", "chapter-04", "chapter-05", "chapter-06", "chapter-07", "chapter-08", "chapter-09", "chapter-1", "chapter-10", "chapter-11", "chapter-12", "chapter-13", "chapter-14", "chapter-15", "chapter-16", "index"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["chapter-01.rst", "chapter-02.rst", "chapter-03.rst", "chapter-04.rst", "chapter-05.rst", "chapter-06.rst", "chapter-07.rst", "chapter-08.rst", "chapter-09.rst", "chapter-1.rst", "chapter-10.rst", "chapter-11.rst", "chapter-12.rst", "chapter-13.rst", "chapter-14.rst", "chapter-15.rst", "chapter-16.rst", "index.rst"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"0": [2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "00": 7, "01": 7, "02": [6, 12], "03": [2, 6, 7], "04": 2, "04t07": 7, "05": 7, "08": 12, "0x4e86": 12, "0x7fa533ff7640": 10, "1": [2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "10": [2, 6, 7, 8, 10, 11, 12, 13, 16], "100": [2, 6, 7, 8, 12, 16], "1000": [5, 6, 12, 16], "1000ms": 16, "100px": 16, "1024": 12, "1048576": 12, "10px": 14, "11": [6, 12], "111111": 16, "11211": 5, "12": 12, "120": 6, "123": [10, 12], "123218": 7, "123456": 12, "125": 6, "127": [2, 3, 4, 5, 12, 13, 14], "13": [6, 12], "132635": 7, "14": [8, 12, 14], "15": [6, 12, 13, 14], "16": 12, "168": 12, "169": 12, "16px": 8, "172": [6, 12], "174": 6, "178974": 7, "19": [6, 7, 12], "192": [6, 12], "1963": 12, "198": 6, "199": 12, "19t05": 7, "1e100": 6, "1kb": 12, "1l": 6, "1mb": 12, "1pkogiy59xj8co8": 8, "2": [5, 6, 7, 8, 10, 11, 12, 13, 15, 16], "20": [2, 7, 11, 12], "200": [7, 12, 15, 16], "2001": 12, "2002": 12, "2005": 6, "2007": 0, "2008": 12, "2009": 12, "200ms": 16, "200x200": 12, "2010": 6, "2012": 6, "2013": 6, "2015": 0, "2018": 6, "2019": 7, "201988": 7, "2020": 1, "20201112": 3, "2021": 7, "2022": 5, "207": 6, "217": 6, "22": 13, "227": 6, "239": 6, "2396": 12, "24": 12, "254": 12, "255": 12, "256": 6, "2616": 12, "28": 12, "2em": 16, "2px": 16, "3": [0, 2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "30": [2, 6, 8, 12], "301": 15, "309903": 7, "31": [6, 7, 12], "32": [6, 12], "322494": 7, "33": [6, 12], "34": 7, "3490": 12, "3492": 12, "35": 6, "355181": 7, "3600": [5, 6], "366288": 7, "38": 7, "3em": 16, "4": [2, 5, 6, 7, 8, 12, 14], "40": [2, 10, 16], "400": [5, 15], "401": 13, "404": [4, 5, 13], "405515": 7, "43": 6, "45": [8, 12], "451907": 7, "453020": 7, "456": 12, "466030": 7, "4e": 12, "5": [5, 6, 7, 8, 11, 12, 13, 14, 16], "50": [2, 7], "500": 16, "500ms": 16, "512": 6, "53": 12, "54": 8, "559918": 7, "58": 8, "59": 12, "6": [5, 6, 7, 12, 13, 15, 16], "60": [5, 6], "63": [6, 12], "6379": 5, "64": [6, 8, 16], "65": 6, "6to4": 12, "7": [2, 7, 8, 12, 15], "70": 7, "74": 6, "75": 7, "768": 6, "8": [2, 6, 7, 12], "80": [4, 7, 12], "8000": [2, 3, 4, 12, 13, 14], "86": 12, "8601": 7, "8em": [8, 16], "9": [6, 7, 12, 14, 15], "90": [6, 7], "91": 6, "95": 6, "97": 6, "974953": 7, "99": 6, "A": [1, 2, 4, 5, 7, 8, 11, 13, 14, 15, 16, 17], "AS": 6, "Ao": [4, 6, 8, 14], "As": [3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 16], "COMO": 6, "Com": 6, "Comando": 17, "Como": [6, 17], "Da": 6, "De": [0, 1, 4, 6, 17], "Do": [6, 8, 12, 14, 17], "E": [1, 6, 13], "Ela": [1, 6, 8], "Ele": [2, 3, 5, 6, 10], "Eles": [0, 4, 6], "Em": [2, 5, 6, 8, 10], "Essas": 0, "Esse": 4, "Esses": [5, 6], "Esta": [0, 1, 2, 4, 6], "Estas": 10, "Este": [2, 6, 8, 10, 14, 15], "Estes": 6, "For": [1, 2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "Fora": 0, "H\u00e1": [1, 5, 6, 14], "Isso": [2, 4, 6], "Isto": [0, 2, 3, 4, 5, 6, 10, 14], "Mas": [1, 4, 6], "NO": 6, "Na": 0, "Nem": 6, "No": [2, 5, 6, 8, 13, 14], "Nos": 6, "N\u00f3s": [0, 1, 5], "O": [2, 8, 10, 12, 13, 17], "OU": 14, "Os": [0, 3, 4, 8, 10, 13, 17], "Por": [2, 3, 4, 5, 6, 10], "SE": 6, "Se": [1, 2, 3, 4, 6, 8, 10, 14], "Seu": 6, "Tamb\u00e9m": 6, "Um": 5, "Uma": [4, 6, 8, 10], "_": [2, 5, 12, 13, 16], "__": [1, 2, 4], "__dict__": 5, "__file__": [5, 7, 14], "__init": 2, "__init__": [2, 4, 5, 6, 7, 13, 14, 15, 16], "__prerequisite__": 5, "__prerequisites__": [5, 13], "__str__": [5, 8, 10], "_action": [10, 14], "_adapt": 6, "_after_delet": 6, "_after_insert": 6, "_after_updat": 6, "_all_": 4, "_alt": 10, "_always_": 13, "_and": 12, "_antes_": 6, "_autocomplet": 16, "_autocomplete_search_fields": 16, "_before_delet": 6, "_before_insert": 6, "_before_updat": 6, "_bgcolor": 10, "_c": 10, "_checked": 10, "_class": [5, 10, 12, 16], "_cols": 10, "_common_filt": 6, "_count": 6, "_dashboard": [2, 3], "_dat": 10, "_db": 6, "_dbnam": 6, "_default": [2, 4], "_delet": 6, "_disabled": 10, "_documentation": [1, 3], "_enable_record_versioning": 6, "_extr": 6, "_format": 6, "_href": [4, 5, 8, 10, 12, 14], "_hx": 16, "_id": [6, 10, 12, 16], "_insert": 6, "_listify": 6, "_method": [10, 14], "_nam": [6, 10, 12, 14, 16], "_next_url": 13, "_nonreserved": 6, "_onclick": 12, "_placehold": [12, 16], "_rows": 10, "_scaffold": [5, 8, 10, 12, 13, 14, 15, 17], "_search": 16, "_select": 6, "_selected": 10, "_sesson": 5, "_src": 10, "_style": [12, 16], "_tabl": [6, 12, 16], "_tablenam": 6, "_tag_": 13, "_timings": 6, "_titl": [12, 16], "_type": [6, 10, 12, 14, 16], "_u": 10, "_updat": 6, "_ur": 6, "_valu": [10, 12, 14, 16], "_xmlns": 10, "aaabaaeaaqeaaaeaiaawaaaafgaaacgaaaabaaaaagaaaaeaiaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaapaaaaa": 8, "ab": [10, 12], "aba": 3, "abaix": 6, "abas": 3, "abbreviated": 12, "abc": [10, 12], "abert": [1, 3, 6], "ability": 15, "able": [5, 6, 12], "abort": [4, 6], "about": [6, 7, 13, 14, 15, 16, 17], "abov": [4, 5, 6, 7, 8, 12, 14, 16], "abracadabr": 2, "abrir": 2, "absent": 2, "absolut": [2, 6, 15], "abspath": 4, "abstraction": [5, 15, 17], "abstra\u00e7\u00e3": 6, "acab": 6, "accdesc": 6, "accept": [4, 5, 12, 16], "acceptanc": 12, "accepted": [1, 2, 6, 12, 13, 15, 16], "accepting": 10, "accepts": 12, "access": [2, 4, 5, 6, 10, 13, 15, 16], "accessed": [6, 10, 12, 13], "accessibl": 4, "accessing": [5, 6], "accnum": 6, "accomplish": [4, 5, 6, 13], "accomplished": [6, 13, 15], "according": 8, "accordingly": 8, "account": 6, "acctype": 6, "aceit": [6, 11, 12], "aceler": 6, "acert": 2, "acess": [0, 2, 4, 5, 6], "acess\u00f3ri": 4, "achieved": [5, 15], "acim": [6, 7, 8, 13], "acion": 6, "acknowledgments": 17, "acompanh": 6, "acontec": 6, "acord": 6, "acrescent": 6, "across": [6, 8], "act": 6, "actiion": 13, "action": [4, 5, 6, 7, 10, 12, 13, 14, 15, 16], "action_button": 14, "action_token": [5, 13], "actionfactory": 5, "actions": [4, 5, 6, 14, 15, 17], "activ": [6, 13], "activat": [2, 13], "activated": 13, "activating": 2, "activiti": 6, "acts": 12, "actu": 6, "actual": [5, 6, 8, 13, 14], "actualiz": 6, "actually": [6, 8], "ac\u00e7\u00e3": [4, 5, 6, 7], "ad": 13, "adapt": 13, "adapter_args": 6, "adapters": [6, 16], "adatabas": 13, "add": [1, 2, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "added": [0, 2, 5, 12, 13, 16], "adding": [6, 12, 13, 14], "addition": [6, 8], "additional": [4, 5, 6, 7, 8, 12, 13, 14], "additional_cl": 14, "additional_styl": 14, "address": [2, 5, 12, 13], "adds": 16, "adi": 6, "adiant": 13, "adicion": [2, 5, 11, 12, 13, 14], "adicional": [2, 5, 6], "adi\u00e7\u00e3": 6, "adjust": 1, "admin": [5, 15], "admin_access": 5, "admin_emails": 5, "admin_list": 5, "admin_only": 5, "adminaccess": 5, "administr": [0, 6], "administrativ": 2, "administrator": 2, "adquir": 6, "advanc": [2, 13, 14], "advanced": [14, 17], "advantag": [2, 6, 8, 16], "advisabl": 6, "advised": 14, "affecting": 6, "after": [5, 6, 8, 12, 13, 14, 16], "after_connection": 6, "after_delet": 6, "after_insert": 6, "after_updat": 6, "aftermath": 6, "again": [2, 4, 5, 6, 12, 13, 16], "against": [6, 7, 10, 12, 13, 14], "age": 6, "aggregat": 6, "agir": [6, 10], "agn\u00f3st": 4, "agor": [2, 4, 5, 6, 8], "agrad": 10, "agreg": 6, "aid": 6, "aims": 0, "aind": [2, 6, 13], "ajax": [8, 14, 16], "ajud": [0, 2, 6, 15, 17], "ajust": 6, "aka": [1, 13], "alcanc": 6, "alchemy": 6, "aleat\u00f3r": 6, "alert": [5, 8, 10, 12, 15], "alerts": [5, 8, 15], "alex": 6, "alfar": [0, 1], "alg": 12, "algo": [5, 6, 7, 8], "algorithm": [5, 12], "algum": [4, 6, 10], "alguns": [0, 2, 4, 5, 6, 7, 8, 10], "ali": [6, 12], "aliment": 6, "aliv": 16, "all": [0, 1, 2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "allocated": 12, "allow": [6, 7, 8, 10, 12, 13, 14, 16], "allowed": [6, 7, 12, 13], "allowed_actions": 13, "allowed_attribut": 10, "allowed_overrid": 12, "allowed_patterns": 7, "allowed_schem": 12, "allowing": [1, 12, 16], "allows": [2, 3, 4, 5, 6, 7, 8, 12, 13, 14, 16], "almost": 5, "along": [2, 4, 10, 12, 13, 16], "alphabetically": 12, "alphanumeric": 12, "already": [2, 4, 5, 10, 12, 13, 14], "also": [0, 1, 2, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16], "alt": 10, "alter": [0, 2, 4, 5, 6, 11], "altering": 6, "altern": 6, "alternat": [5, 6, 16], "alternativ": [2, 6, 8, 12], "although": [2, 8, 12], "alvo": 6, "always": [0, 2, 4, 5, 6, 12, 16], "al\u00e9m": [4, 6, 14], "am": [12, 16], "amazon": 6, "ambas": 6, "ambient": 2, "ambigu": [4, 6], "ambos": [4, 5, 6], "among": [6, 12], "amount": 6, "ampli": 1, "an": [0, 1, 2, 3, 5, 6, 8, 10, 12, 13, 14, 15, 16, 17], "analis": [4, 6, 11], "analogy": 15, "ancestor": 10, "anchor": 16, "and": [0, 1, 2, 3, 4, 5, 10, 17], "andaim": 4, "andrew": 1, "anex": 6, "angle": 8, "angul": 16, "angularjs": 0, "aninh": [6, 10], "anonymous": [6, 8, 12], "anoth": [4, 5, 6, 8, 12, 13], "anotherpath": 5, "ansi": 6, "answer": 1, "anteced": 4, "anterior": [2, 6], "antes": [1, 6, 8, 10, 13, 14], "antig": 15, "any": [2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "anyhow": 2, "anyobj": 6, "anything": 4, "anyway": 6, "anywher": [8, 13, 15], "an\u00e1lis": 6, "apag": 12, "aparec": 6, "aparent": 6, "apen": [2, 5, 6, 7], "api": [0, 6, 7, 10, 12, 16], "api_key": 16, "api_version": 7, "apis": [0, 6, 13, 15], "aplic": [0, 2, 3, 4, 5, 14, 15], "apoi": 6, "apont": 6, "app": [0, 1, 3, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17], "app1": 5, "app1_session": 5, "app2": 5, "app_fold": 15, "app_nam": [2, 4, 5, 6], "app_watch_handl": 4, "appadmin": [0, 6], "appe": [6, 12], "append": [6, 10, 12, 13, 14, 16], "append_id": 14, "appended": [5, 6], "apple": 12, "appli": [6, 12, 16], "application": [2, 4, 5, 6, 8, 12, 13, 15, 16], "applications": [0, 2, 3, 4, 6, 12, 13, 14], "applied": [5, 6, 12, 14, 16], "apply": [0, 5, 12, 13, 14], "applying": [6, 14], "appnam": [2, 4, 5, 13, 15], "appname_session": 5, "approach": [6, 15], "appropriat": [6, 12], "appropriately": 6, "approv": 13, "apps": [0, 1, 2, 3, 5, 6, 8, 13, 15, 17], "apps_fold": 2, "aprend": 1, "apresent": 8, "apropri": 6, "aproxim": 6, "apt": 13, "ap\u00f3s": [2, 6, 14], "aqu": [2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14], "aquel": [6, 13], "arbitrary": [4, 13], "arbitr\u00e1ri": 6, "archive_db": 6, "archive_nam": 6, "are": [0, 1, 2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "aren": 6, "args": [1, 2, 6], "argument": [2, 4, 5, 6, 8, 10, 12, 13, 16], "arguments": [2, 5, 6, 8, 10, 12, 13, 15, 16], "arithmetic": 12, "armazen": [0, 2, 5, 6, 10], "around": [1, 15], "arquiv": [0, 2, 3, 4, 5, 6, 13, 17], "arrang": 12, "array": 16, "arriv": [0, 6], "as_ordered_dict": 6, "asci": 12, "asid": 16, "ask": [13, 16], "asked": [2, 13], "asking": 5, "aspas": 6, "aspects": 4, "assert": [6, 16], "assets": 2, "assigned": [6, 12, 13, 15], "assigning": [15, 16], "assignment": 8, "assigns": 16, "assim": [6, 8], "assinatur": [4, 5], "assist": 4, "assistent": 10, "assoc": [6, 11], "associat": 13, "associated": [6, 12, 13], "assum": [2, 5, 6, 7, 11, 12], "assumed": 15, "assuming": [5, 6], "async": 16, "asynchronously": 16, "asynci": 17, "at": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "atend": [2, 6], "ativ": [2, 6], "atrav\u00e9s": [6, 8, 10, 13], "atribut": [5, 10], "atribu\u00edd": 6, "attached": [6, 13], "attaching": 15, "attacks": [5, 10], "attempted": 12, "attempting": 6, "attempts": [6, 13], "attention": [4, 6], "attribut": [4, 5, 6, 10, 12, 14, 15, 16], "attributes_plugin": 16, "attributespluginhtmx": 16, "attrs": [12, 14, 16], "atual": [2, 6], "atualiz": [2, 17], "aug": 12, "august": 12, "aul": 14, "aut": 10, "autentic": 6, "auth": [0, 2, 4, 6, 8, 10, 16, 17], "auth_group": 13, "auth_groups": 13, "auth_plugins": 13, "auth_simple_token": 13, "auth_us": [5, 6, 13, 16], "auth_user_tag_groups": [6, 13], "auth_user_tagged_groups": 13, "authenticat": 13, "authenticated": [5, 6], "authentication": [5, 14, 17], "author": 13, "authoriz": [6, 7, 13], "authorization": [5, 6, 17], "authorized": 13, "auto_import": 6, "auto_process": [14, 16], "autocomplete_query": 16, "autodelet": 6, "autogenerated": 6, "automat": [2, 4, 6, 8, 10, 13, 14], "automatic": [4, 6, 8, 15], "automatically": [2, 3, 4, 5, 6, 12, 13, 14, 15, 16], "autoriz": 6, "auxili": [5, 6, 8, 10], "availabl": [1, 2, 6, 8, 10, 13, 15, 16], "avali": [6, 8], "avanc": 17, "avis": [5, 6, 13], "avoid": [1, 2, 5, 6, 12, 13], "avoided": 8, "avoiding": [5, 13], "avoids": 6, "awar": 6, "awesom": [8, 14], "axel": 0, "axolotl": 0, "azul": 4, "a\u00e7\u00e3": [4, 5, 6, 13, 17], "a\u00e7\u00f5": 5, "a\u00e7\u00fac": 5, "b": [5, 6, 8, 10, 12, 15, 16], "back": [5, 6, 12], "backend": [4, 6], "backends": 6, "background": [2, 4, 12, 17], "backported": 6, "backslash": 4, "backup": [2, 6, 12], "backward": 12, "backwards": [0, 12], "bad_days": 6, "bails": 6, "banan": 12, "banc": [0, 1, 3, 4, 5, 13], "bar": [8, 14], "barc": 6, "barr": 4, "barri": 0, "bas": [0, 2, 4, 8, 14, 16], "base64": [6, 8, 16], "base_dn": 13, "baseadapt": 6, "based": [0, 2, 3, 4, 5, 7, 8, 12, 13, 14, 15, 16], "bash": 2, "basic": [2, 5, 17], "basically": 16, "bast": 2, "bat": 2, "batman": [7, 12, 14], "battl": 0, "be": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "bear": 13, "beasley": 0, "becaus": [0, 2, 4, 5, 6, 8, 10, 12, 13, 14, 16], "becom": [12, 16], "bed": 11, "been": [0, 2, 5, 6, 8, 12, 13], "befor": [2, 5, 6, 8, 12, 13, 14], "before_delet": 6, "before_insert": 6, "before_updat": 6, "begin": [12, 14], "beginners": 2, "beginning": [8, 12, 13], "behavior": [4, 5, 6, 12, 15, 16], "behaviour": [2, 4, 6, 14], "being": [4, 5, 6, 7, 8, 12, 16], "believ": [0, 5], "belong": [13, 15], "belonging": 6, "belongs": 13, "below": [5, 6, 7, 12, 14], "bem": [0, 5, 6, 13], "benefits": 16, "benef\u00edci": 6, "best": [2, 5, 6], "bett": [0, 1, 2, 4, 6, 14, 15, 16], "between": [5, 10, 12, 15], "beyond": 12, "bgcolor": 10, "bibliotec": [0, 4, 11], "big": 15, "bigint": 6, "bigint_id": 6, "bilhet": [0, 3, 6], "bilh\u00e9t": 0, "bin": 2, "binari": 2, "binary": 6, "bind": 16, "bin\u00e1ri": 6, "birthplac": 6, "bit": [12, 13], "bitbucket": 1, "black": [8, 12], "blank": [12, 14], "blanks": 12, "blink": 16, "blob": [1, 6], "bloc": [8, 10], "block": [4, 13, 16], "blockquot": 10, "blocks": 8, "blog": [1, 6, 10], "blog_post": 6, "bloqu": 13, "blu": [4, 6, 12, 15], "bmp": 12, "boas": 2, "boat": 6, "bob": 6, "body": [4, 8, 13, 14, 16], "boilerplat": 5, "bold": 10, "bom": 2, "bonit": 6, "book": 6, "boolean": [6, 14], "booleans": 6, "boost": [6, 8], "bootstrap": 14, "bord": 16, "botar": 0, "both": [1, 2, 5, 6, 8, 12, 13, 15], "bottl": [0, 4, 5, 8, 15], "bottle_app": 2, "bottleneck": 16, "bottlepy": [4, 5], "bottom": 12, "bot\u00e3": 3, "bot\u00f5": [3, 17], "boundari": 12, "boundary": 12, "box": [0, 6, 12], "br": [8, 10], "bracket": 8, "brackets": [8, 12], "branch": [1, 2], "break": [2, 6], "breaking": 6, "breaks": 12, "breez": 1, "brev": 4, "briefly": 2, "broken": [0, 6, 12], "brows": [1, 2, 3, 5, 7, 8, 13, 14, 16], "browsers": 16, "browsing": 3, "bruc": [7, 14], "brut": 6, "bsd": 1, "buff": 6, "buffering": 4, "bug": 6, "bugs": 1, "build": [1, 2, 4, 5, 10, 14, 16], "building": [4, 12, 16], "built": [0, 1, 4, 5, 6, 8, 12, 16, 17], "bulk_insert": 6, "bulletproof": 6, "bulm": [12, 14, 16], "bunch": 2, "busc": [3, 6, 14], "busing": 16, "but": [0, 1, 2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "button": [3, 4, 5, 12, 14, 16], "buttons": [10, 12, 14, 16], "by": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "bypass": [12, 13], "bypassed": 13, "byte": 12, "bytecod": 8, "bytes": 6, "b\u00e1sic": [0, 1, 6, 17], "c": [1, 2, 3, 5, 6, 8, 10, 12, 15], "ca": 12, "cabec": [10, 14], "cabe\u00e7alh": [4, 10], "cach": [0, 2, 4, 5, 12], "cache_db_select": 6, "cacheabl": 6, "cached": 5, "cache\u00e1vel": 6, "caching": [4, 6, 17], "cachorr": 11, "cad": [2, 4, 5, 8, 11, 14], "caiu": 6, "caix": [0, 6, 10], "calcul": 6, "calend": 14, "call": [0, 5, 6, 8, 12, 13, 16], "callabl": [10, 12], "callback": [6, 12, 13, 16], "callback_url": 13, "called": [1, 2, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "calling": [5, 6, 8], "calls": [2, 5, 6, 8, 16], "cam": [6, 11], "caminh": [2, 4, 6, 14], "camp": [5, 7, 10, 12, 17], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "cancel": [12, 16], "cancel_attrs": 16, "cannot": [2, 4, 5, 6, 8, 12, 13, 16], "capabiliti": [14, 16], "capability": 13, "capac": 0, "capaz": [1, 2], "capitaliz": 16, "captur": 16, "cap\u00edtul": [2, 4, 5, 15], "car": 6, "caract": [6, 10], "caracter": 4, "caracter\u00edst": 17, "card": 6, "careful": [5, 6, 8, 15, 16], "carg": 6, "carl": 6, "carreg": [0, 6], "carroll": 0, "carry": 15, "cart": 5, "car\u00e1ct": [4, 6], "cas": [0, 1, 2, 3, 4, 5, 8, 10, 12, 13, 14, 15, 16], "cascading": 6, "cascat": 6, "case_sensitiv": 6, "cassi": 0, "caus": [6, 12], "caveat": [6, 8, 15], "caveats": 17, "cd": 2, "cdnjs": [8, 14], "celery": 17, "cent": [5, 6, 8], "century": 12, "ceo": [7, 14], "cerc": 6, "cert": [1, 2, 6, 14], "certain": [6, 8, 12, 14], "certez": 6, "certificat": 2, "certifiqu": [6, 11], "cf": 4, "cgi": 12, "cha": 6, "challeng": 13, "cham": [2, 4, 5, 7, 8, 11, 14], "chang": [1, 2, 3, 5, 6, 7, 8, 12, 13, 14, 15, 16, 17], "change_email": 13, "change_password": [8, 13], "changed": [2, 3, 4, 5, 6, 8, 12, 15, 16], "changed_fil": 4, "changing": [6, 13], "channel": 1, "chapt": [3, 4, 5, 6, 8, 10, 12, 13, 14], "chapters": [1, 5], "char": 6, "charact": [6, 12], "characters": [6, 12], "charg": [2, 15], "chars": 13, "chat": 2, "chats": 1, "chav": [4, 8, 10, 11, 14], "chec": 11, "check": [3, 4, 5, 6, 12, 13, 14, 16], "check_": 16, "check_reserved": 6, "checkbox": [8, 10, 17], "checkboxwidget": 12, "checked": [10, 12, 13], "checking": [1, 12, 13, 15], "checks": [2, 6, 8, 12, 13], "cherry": 12, "chicag": 6, "children": 14, "choic": [1, 12, 14], "choos": [6, 12, 13], "choosen": 6, "chrom": [3, 16], "cient": 6, "cinc": 6, "circul": 6, "circumstanc": 5, "cit": [6, 10, 12], "cit0801": 7, "cit0802": 7, "cit1601": 16, "clar": 6, "clark": [7, 14], "clash": 12, "class": [5, 6, 8, 10, 12, 13, 15, 16], "class_inner_exceptions": 16, "class_styl": 14, "classific": [6, 14], "claud": 6, "claus": 6, "cle": 12, "clean": [5, 10], "cleanup": 0, "clearly": 16, "clev": 12, "cli": 2, "clic": 14, "click": [3, 10, 12, 14, 16], "clickabl": 14, "clicked": [14, 16], "clicks": [6, 16], "client": [0, 7, 12, 13, 16], "client_id": 13, "client_ip": 5, "client_secret": 13, "clients": 5, "clientsid": 16, "cliqu": [3, 14], "clock": 12, "clon": [2, 4, 6, 16], "cloned": 2, "clos": [6, 10], "closed": [6, 8], "closing": [5, 6], "cloudflar": [8, 14], "cl\u00e1usul": [6, 8], "cmd": 2, "cn": 13, "co": [6, 12], "coa": 6, "cod": [1, 2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "codific": 6, "coding": 1, "cois": 6, "colegial": 13, "collapsibl": 10, "collection": [0, 15], "collections": 2, "collects": 2, "colnam": 6, "coloc": 17, "colon": 8, "color": [4, 6, 8, 10, 12, 16], "color_identifi": 4, "colors": [4, 6], "cols": 10, "colspan": 10, "column": [6, 14], "columns": [6, 17], "colun": [6, 14], "comand": 6, "comando": [3, 4, 6, 10, 17], "combin": [4, 5, 10, 14], "combined": [5, 6, 12], "come": [0, 5], "comec": [1, 2, 4, 6], "comes": [0, 5, 8, 12, 13, 14, 15, 16], "comet": 6, "coming": 5, "comm": [2, 16], "command": [2, 4, 6, 8], "commands": [2, 4, 6, 8, 10], "comment": [6, 10], "commit": [5, 7, 14, 16], "commits": [5, 6], "committed": [6, 15], "common": [2, 4, 5, 8, 12, 13, 15, 16], "common_filt": 6, "common_filters": 6, "commonality": 8, "communicat": 5, "communication": 6, "communications": 5, "community": [0, 6], "compact": 6, "company": 14, "compar": [6, 13, 15], "compared": 0, "comparing": 13, "comparison": [12, 13], "compartilh": [5, 6], "compat": 6, "compatibility": 12, "compatibl": [0, 1, 10, 12], "competitor": 0, "compil": [4, 8, 10, 12], "compilation": 8, "compiled": [4, 8, 10, 12], "compiled_css": 4, "compiling": 8, "complet": [0, 2, 6, 10, 12, 14, 16], "completed": [0, 6], "completely": [6, 8, 13], "complex": [1, 2, 4, 5, 6, 8, 10, 13, 15, 16], "complexiti": 16, "complexity": 16, "compliant": 16, "complicated": 5, "component": [0, 4, 5, 8, 10, 12, 13, 16], "component_1": 16, "components": [0, 3, 10, 12, 16], "comport": [4, 6, 10, 14], "compos": 2, "composing": 5, "compost": [6, 10], "compreend": [1, 14], "compressed": 4, "comprim": 3, "compriment": 6, "compris": 3, "compromet": [4, 6], "compromis": 0, "comput": 1, "computed": 17, "computing": 16, "comp\u00f5": 6, "comum": [5, 6], "comunic": 6, "comuns": 3, "concaten": 6, "concatenat": 10, "concatenating": 10, "conceived": 6, "concept": [0, 13], "conch": 2, "concorrent": 0, "concurrency": [6, 16], "concurrent": 16, "concurrently": [2, 12, 16], "cond": 5, "condicion": 8, "condicional": 6, "condition": [6, 12, 13, 17], "conditions": [6, 12], "condi\u00e7\u00e3": 6, "condi\u00e7\u00f5": 6, "conect": [6, 13], "conex\u00e3": 4, "conf": 6, "confiabil": 1, "config": [2, 4], "configur": [3, 13, 14, 15, 16, 17], "configuration": [1, 4], "configurations": 2, "configured": [5, 12, 15], "confirm": [2, 12, 14], "confirmation": 16, "confirmations": 16, "confirms": 13, "conflicts": 6, "conflit": [0, 2, 4, 6], "conform": [6, 13], "confund": 6, "confus": 6, "conhec": [1, 6], "conjunt": [6, 10, 11, 14], "conn": 5, "connect": [3, 6], "connecting": 6, "connection": [5, 6, 12], "connectionpool": 6, "connections": [5, 6, 15], "cons": 6, "conseg": 6, "consegu": 6, "consequenc": [6, 12, 16], "consequently": 12, "consid": [5, 8, 10, 12, 14, 16], "consider": [6, 8, 10], "considered": [5, 6, 8, 15], "consist": [6, 15], "consistency": 8, "consistent": 5, "consists": [6, 14], "consol": [2, 10, 13, 16], "constant": 12, "constraining": 15, "constraints": 4, "constru": [6, 10, 14], "constructing": 6, "construction": 4, "constructor": [6, 13, 17], "constructors": [6, 12], "construtor": [5, 10, 12, 17], "constru\u00e7\u00e3": [6, 10, 14], "constru\u00edd": [6, 14], "constr\u00f3": 6, "consult": [1, 7, 13, 14], "consulta1": 6, "cont": [2, 5, 10, 11, 13], "contador": [5, 6], "contag": 6, "contain": [2, 4, 5, 6, 8, 10, 12, 13, 16], "contained": [10, 12, 14], "containing": [0, 2, 5, 12, 13, 14, 16], "contains": [3, 5, 7, 8, 11, 12, 14, 15, 16], "contect": 8, "contenh": 5, "content": [2, 4, 5, 6, 8, 10, 12, 14, 15, 16], "content_typ": 16, "contents": [8, 10, 16], "context": [3, 5, 6, 8, 13], "contextlib": 6, "contexts": 5, "conte\u00fad": [4, 6, 10], "continu": [0, 6, 8, 16], "contr": 6, "contribu": 17, "contributed": 0, "control": [2, 8, 12, 13, 14, 16], "controll": [5, 6, 8, 10, 12, 13, 14, 15, 16], "controllers": [4, 5, 6, 8, 10, 12, 13, 15, 16], "controls": 12, "contr\u00e1ri": [0, 4, 6, 8], "cont\u00e9m": [2, 4, 5, 6], "cont\u00eain": 6, "cont\u00eam": [6, 11], "convenienc": 5, "convenient": [6, 17], "convention": [8, 12, 15], "conventions": [4, 6], "conven\u00e7\u00e3": 4, "conversion": [12, 17], "convers\u00e3": 6, "convert": [4, 6, 10], "converted": [1, 6, 12], "converting": 6, "converts": 12, "cooki": [0, 4, 6, 12, 13, 16], "copi": 2, "copied": 2, "copy": [2, 3, 4, 6, 14], "copyfileobj": 6, "copying": [2, 8, 10, 17], "cor": [2, 4, 5], "cord": [4, 6, 11], "corey": 1, "corn": 14, "cornerston": 0, "corp": [8, 10], "corr": 17, "correct": [4, 13], "correct_cod": 13, "correctly": [4, 12], "corrent": 6, "correspond": [2, 4, 6, 11], "correspondent": [4, 6, 10], "corresponding": [3, 6, 13, 14, 15], "corresponds": [2, 6, 10], "corret": 6, "corrig": 1, "corromp": 6, "corrupted": 6, "corruption": 6, "costum": 6, "cot": 6, "cota\u00e7\u00e3": 6, "couchdb": 6, "couchdbadapt": 6, "could": [1, 2, 4, 6, 8, 10, 12, 13, 15], "count": [5, 7, 13, 14, 16], "counterparts": 4, "coupl": 16, "cours": [1, 8], "cov": 4, "cp": 2, "creat": [0, 1, 2, 4, 5, 6, 8, 12, 13, 14, 16], "create_form": 12, "create_thing": 12, "created": [0, 2, 4, 5, 6, 8, 12, 13, 16], "created_by": 6, "created_on": 6, "creating": [1, 2, 5, 6, 13, 15, 16, 17], "creation": [6, 13], "creativ": 12, "creativity": 13, "credential_decod": 6, "cresc": 6, "cri": [2, 3, 4, 5, 6, 8, 10, 13, 14], "cria\u00e7\u00e3": [2, 6, 14], "crit": 12, "critical": 2, "crit\u00e9ri": 6, "cross": [5, 10], "crossorigin": 8, "crt": [2, 6], "crud": [3, 12, 16], "cruz": [1, 6], "crypt": 2, "cs": 5, "csrf": [5, 12], "csrf_protection": 12, "csrf_session": 12, "css": [1, 4, 5, 8, 10, 12, 13, 14, 16], "csv": 15, "ct": 5, "ctrl": [2, 3], "cubrid": 6, "cubridadapt": 6, "cubriddb": 6, "cuj": 6, "curl": 13, "current": [5, 6, 10, 13, 14, 15, 16], "current_record": 6, "current_us": [5, 13], "currently": [2, 5, 8], "curs": 1, "cursor": [6, 16], "curt": 6, "custom": [0, 5, 6, 8, 10, 15, 16, 17], "custom_check": 12, "custom_qualifi": 6, "customiz": [8, 12, 14], "customizabl": [12, 14], "customization": 12, "customizing": 17, "cx_oracl": 6, "c\u00edclic": 6, "c\u00f3dig": [4, 6, 8, 10], "c\u00f3p": 6, "d": [1, 2, 7, 10, 12], "dad": [0, 1, 3, 4, 5, 13, 17], "daemon": 2, "daemons": 16, "dal": [2, 4, 7, 12, 13, 14, 16, 17], "dals": 6, "dan": 0, "danc": 13, "dand": 4, "dangerous": 15, "daquel": 6, "dar": 6, "dash": 12, "dashboard": [2, 4, 5, 8, 12, 16, 17], "dashboard_mod": 2, "dat": [0, 2, 5, 6, 7, 8, 10, 13, 14, 15, 16], "data_label": 16, "databas": [0, 1, 3, 7, 13, 14, 15, 16, 17], "datalist": 16, "datetim": [4, 5, 6, 7, 12, 13, 16], "datetimewidget": 12, "day": 12, "days": [12, 13], "db": [2, 3, 4, 5, 7, 10, 12, 13, 14, 15, 16], "db1": 6, "db2": 6, "db2adapt": 6, "db2ibm": 6, "db2pyodbc": 6, "db_a": 6, "db_b": 6, "db_codec": 6, "db_fold": [5, 7, 14], "db_nam": 6, "db_uid": 6, "dbadmin": 4, "dbi": 12, "dbo": 6, "dbset": 12, "dbstor": 5, "dc": 13, "dd": 12, "deal": [6, 16], "dealfar": 0, "debounc": 16, "debug": [1, 2, 5, 6, 8], "debugg": 1, "debugged": 8, "debuggers": 15, "debugging": [1, 4], "debugpy": [1, 2], "decid": [6, 12, 13, 14], "decim": 4, "decimal": [6, 12], "decimals": 12, "decl": [4, 6], "declar": [0, 4, 5, 6, 8], "declaration": 4, "declared": 5, "decod": 6, "decode_credentials": 6, "decoded": 6, "decomp\u00f5": 6, "decor": [1, 4, 17], "decorated": 15, "decorator": [4, 5, 6, 15], "decorators": [5, 15], "decreased": 13, "dedic": [1, 4, 15], "dedicated": [1, 5, 10], "def": [4, 5, 6, 7, 10, 12, 13, 14, 15, 16], "default": [2, 3, 4, 5, 6, 7, 10, 12, 13, 14, 15, 16], "defaults": [5, 6, 12, 14, 15], "deferred": [6, 16], "defin": [0, 4, 5, 8, 10, 12, 13, 14, 16], "define_tabl": [5, 7, 12, 13, 14, 15], "defined": [2, 4, 5, 6, 8, 12, 13, 14, 15, 16], "defining": 14, "definit": 12, "definition": [6, 7, 12, 14], "definitions": [6, 7, 15], "defini\u00e7\u00e3": 6, "defini\u00e7\u00f5": 6, "deform": 11, "deix": 13, "del": [5, 6, 10], "delay": 16, "delaying": 16, "deleg": 6, "delet": [2, 4, 7, 12, 14, 16], "deletabl": [12, 13, 14], "delete_record": 6, "deleted": [6, 13], "deleting": [6, 14], "deletion": 6, "deletions": 6, "delimit": [0, 6, 8], "delimiters": [5, 15], "deliv": 16, "delt": 16, "dem": [1, 2, 16], "demand": 6, "denormaliz": 7, "denormalization": 6, "dentr": [0, 2, 4, 6, 14], "deny": 7, "depend": [4, 5, 6, 13], "dependenc": [0, 2, 15], "dependent": [2, 3, 4, 5], "depending": [6, 8, 12, 14], "depends": [5, 6, 15], "deploy": 2, "deployment": 1, "deployment_tools": 2, "depo": [2, 3, 6], "deprecated": [12, 16], "depur": [6, 8], "deriv": 6, "derived": [6, 12], "desat": 6, "desativ": 6, "desc": 14, "descart": 6, "descendant": 10, "descobert": [2, 11], "descompact": 2, "descrev": 6, "describ": [3, 12], "described": [2, 4, 5, 6, 12], "description": [6, 7, 12, 13], "descriptiv": 12, "descrit": [2, 4, 6, 14], "desd": [5, 6], "desej": [1, 2, 5, 6, 13, 14], "desempenh": 6, "desencad": 3, "desenvolv": 0, "desenvolvedor": [1, 8, 13, 14], "desfaz": 6, "design": [0, 13, 16, 17], "designed": [0, 4, 6, 8, 12, 13, 16], "desir": 8, "desired": [5, 12, 13], "desloc": 6, "desnormaliz": 7, "despej": 6, "dess": [0, 5, 6, 13], "dest": [4, 6, 12], "detail": [6, 10, 14, 16], "detail_fields": 12, "detailed": [2, 14], "details": [0, 1, 5, 6, 7, 8, 12, 14], "detalh": [6, 14], "determin": [4, 5, 6, 11, 12, 13, 14], "determined": [8, 12], "determining": 5, "deterministic": 5, "dev": [1, 2, 3, 4, 5, 6, 8, 10, 13, 14], "develop": [5, 6, 8, 13, 14, 15], "developers": [0, 1, 6, 13, 16], "developing": 4, "development": [0, 1, 2, 4, 6], "development_tools": 2, "devic": 8, "devolv": [6, 8], "di": [0, 5], "diagr": 7, "dialect": 6, "dialects": 6, "dialet": 6, "dic": 17, "dicion\u00e1ri": [10, 11, 12], "dict": [4, 5, 6, 11, 12, 13, 14, 15, 16], "dictionari": 6, "dictionary": [4, 5, 6, 10, 12, 15], "did": [0, 4, 16], "didn": 2, "dif": 6, "diferenc": 6, "diferent": [2, 5, 6, 11, 14], "diff": 6, "differenc": [6, 12, 15], "different": [0, 2, 4, 5, 6, 8, 12, 13, 15, 16], "differs": [6, 14], "difficult": [2, 16], "dif\u00edcil": 1, "dig": 6, "digit": [12, 13], "digitally": 13, "dimensions": 12, "diminuish": 13, "dinam": 10, "din\u00e2m": [6, 17], "dir": [2, 12, 16], "direct": 6, "directiv": [2, 4, 8, 12], "directly": [2, 4, 5, 6, 7, 10, 12, 13, 14, 16], "directory": 13, "direit": [3, 6], "diret": [1, 5, 6, 8], "diret\u00f3ri": 4, "dirnam": [5, 7, 14], "disabl": [6, 14], "disabled": [7, 10, 12], "disallow": 12, "discord_client_id": 13, "discord_client_secret": 13, "discount": 6, "discounted_total": 6, "discounted_total_pric": 6, "discounted_unit_pric": 6, "discovered": 13, "discriminator": 13, "discuss": 3, "discussed": [6, 8, 10, 12], "discussion": 6, "discuss\u00e3": 1, "discuss\u00f5": 1, "discut": 6, "disk": 5, "dismissal": 15, "dismissibl": 5, "dispar": 6, "display": [5, 12, 13, 14, 16], "displayed": [3, 6, 10, 12, 14, 16], "displaying": [5, 12, 14], "displays": [13, 14], "dispon": 6, "dispon\u00edv": 1, "disposit": [4, 5, 13], "diss": [4, 6, 14], "distinct": [8, 12], "distinction": 6, "distinguish": 13, "distintion": 13, "distin\u00e7\u00e3": 6, "distribu": 6, "distribut": 6, "distributed_transaction_commit": 6, "distribution": 6, "ditched": 0, "div": [4, 5, 8, 12, 14, 15, 16], "divisibl": [8, 12], "division": [8, 10], "divis\u00e3": 8, "divmod": 6, "diz": [4, 6, 13, 14], "djang": [0, 1, 6, 15], "do_connect": 6, "dobr": 6, "dobrag": 6, "doc": 1, "dockerfil": 2, "docs": [1, 2, 4, 16], "doctor": 6, "doctyp": [8, 14], "document": [6, 8, 10, 12, 16], "documentation": [3, 12, 16], "documentations": 5, "documented": [5, 12], "does": [0, 2, 5, 6, 8, 12, 13, 14, 15, 16], "doesn": 5, "dog": [11, 12, 16], "doh": 12, "doing": [6, 12, 16], "dois": [0, 5, 6, 8], "dom": [8, 17], "domain": [12, 13, 17], "domains": 4, "don": [2, 4, 5, 6, 8, 12, 13, 14, 15], "dot": 12, "doubl": [2, 6, 8], "doubt": 14, "down": [12, 16], "download": [2, 12], "download_url": 12, "downs": 6, "downsid": [6, 15], "dramat": 6, "driv": 6, "driven": 0, "driver_args": 6, "drivers": 6, "drop": 12, "dropdown": [12, 14, 16], "dropdowns": 16, "dropping": 6, "dsn": 6, "duas": [5, 6], "due": [6, 7, 12], "dumb": 13, "dummy": [6, 8], "dummyrespons": 8, "dump": 5, "dumpfil": 6, "dumps": [6, 16], "duplicat": 6, "durability": 7, "during": [6, 14], "dynamic": [4, 8, 13], "dynamically": [6, 7, 8, 12], "d\u00e1": [0, 2, 14], "d\u00edgit": [4, 6], "ea": 6, "each": [2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "earli": [13, 16], "early": 5, "easi": [7, 8], "easiest": 6, "easily": [4, 5, 6, 8, 10, 12, 14], "easy": [5, 8, 12], "ebook": 1, "echo": 4, "ecosyst": 16, "edge": 16, "edif\u00edci": 5, "edit": [0, 2, 3, 4, 8, 12, 13, 14, 15, 16], "edit_sidec": 16, "editabl": [14, 15], "editing": [8, 10, 12, 13, 14], "editor": [1, 8], "editors": 8, "edi\u00e7\u00e3": 0, "edi\u00e7\u00f5": 3, "education": 2, "efeit": 6, "efet": 6, "effect": [3, 5, 6, 12], "efficient": [0, 5], "efficiently": [1, 15], "efforts": 1, "efg": 10, "eficient": 6, "eith": [4, 6, 12], "el": 10, "element": [6, 8, 10, 12, 14, 16], "elements": [6, 10, 12, 16], "elev": 6, "elimin": [6, 14], "else": [2, 5, 6, 12, 13, 14, 15, 16], "elt": 16, "el\u00e9tr": [4, 5, 13], "emacs": 8, "email": [2, 5, 8, 12, 13, 15, 16], "emails": [12, 16], "emails_onvalidation": 12, "embed": 10, "embedded": [5, 8, 12], "embedding": 8, "ember": 12, "embor": 6, "emerging": 16, "emit": [3, 6], "employ": 5, "employe": 14, "empreg": 14, "empres": 14, "empty": [2, 4, 12, 16], "empty_regex": 12, "en": [5, 7, 16], "enabl": [1, 5, 6, 7, 10, 13, 15, 16], "enable_record_versioning": 6, "enabled": [5, 7, 13, 15], "encaix": 4, "encapsulat": [8, 10], "encerr": 8, "enclosed": 6, "enclosing": 8, "encod": 6, "encoded": [5, 6, 12, 16], "encoding": 6, "encontr": [4, 6, 8, 11, 13], "encountered": 4, "encrypted": [2, 5, 13], "encryption": 0, "end": [4, 6, 8, 12, 13, 14, 16], "enderec": 6, "ending": 8, "endpoint": [13, 16], "ends": [6, 8, 15], "enforc": [5, 12], "enforced": [6, 12, 15], "enfrent": [1, 6], "engin": [6, 12], "engineering": 2, "english": 5, "enough": [12, 13], "enquant": [0, 6, 8], "enqueu": 16, "enqueue_run": 16, "enqueueing": 16, "ensin": 13, "ensur": [4, 12], "entant": [6, 8, 10, 14], "entend": 6, "enter": [4, 12, 13], "entered": [10, 13], "entering": 5, "enterpris": [1, 13], "entidad": 6, "entir": [8, 15, 16], "entity_quoting": 6, "entrad": [4, 6, 10, 11], "entri": [7, 12, 14], "entropy": 12, "entry": [0, 6, 15], "ent\u00e3": [2, 4, 6, 13], "env": 15, "envelop": 16, "envi": [10, 14], "environ": [5, 15], "environment": [0, 1, 4, 5, 6], "environments": [1, 4], "envolt": 11, "envolv": 6, "eo": 6, "epub": 1, "eq": 7, "equal": [7, 12, 13, 16], "equals": [10, 13], "equip": 5, "equivalent": [4, 5, 6, 10, 12, 15], "equivalently": 10, "errad": 6, "errlog": 5, "erro": [2, 3, 6], "error": [2, 3, 5, 6, 7, 8, 10, 12, 16, 17], "error_messag": 12, "error_pag": 4, "errorlog": 2, "errors": [1, 4, 5, 6, 7, 12, 15], "escap": [6, 8, 10], "escaped": [6, 8, 10], "escaping": [6, 8], "escolh": [1, 4, 6], "escond": 6, "escrav": 6, "escrev": [6, 8, 10], "escrit": [6, 8], "espac": [6, 11, 14], "espec": [5, 6, 10], "especial": [2, 4, 6, 11], "especializ": 6, "especially": [0, 2, 4, 5, 12, 13], "especif": [4, 6], "especific": [4, 5, 6], "especifiqu": 14, "espec\u00edf": [1, 2, 6], "esper": [4, 5, 6], "esprim": 4, "esquec": 6, "esquem": 6, "esquerd": [6, 14], "estabelec": 6, "establish": 6, "established": 6, "establishing": 15, "estad": [5, 6], "estam": 6, "estar": [4, 6, 10], "estend": [0, 5, 6], "estil": 14, "estiv": 6, "estrangeir": [1, 14], "estreit": 6, "estrutur": [4, 5, 6, 11], "est\u00e1t": [10, 17], "est\u00e3": [5, 6, 7, 10, 13], "etap": 6, "etc": [4, 5, 6, 7, 11, 15], "etiquet": [6, 10], "eval": 16, "evaluat": [5, 12, 16], "evaluated": [6, 7], "even": [1, 4, 5, 6, 8, 10, 12, 14, 15, 16], "event": 6, "event_tim": 6, "events": [2, 16], "eventually": 5, "ever": 6, "every": [0, 5, 6, 13, 14, 15, 16], "everybody": 13, "everyon": [0, 1], "everything": [2, 15, 16], "evit": [0, 2, 6, 8, 12], "evolution": 0, "ex": 6, "exact": [8, 15], "exactely": 13, "exactly": 5, "exampl": [1, 2, 4, 5, 6, 8, 10, 11, 17], "exat": [6, 8], "excellent": [1, 14], "except": [2, 4, 5, 6, 8, 10, 12, 13, 16], "exception": [5, 6, 12, 13, 16], "exceptions": [4, 5, 16], "excep\u00e7\u00e3": 8, "excerpt": 8, "excet": [5, 6], "exce\u00e7\u00e3": [4, 5, 6, 8], "exce\u00e7\u00f5": 4, "exclu": 6, "exclud": 12, "exclus": 6, "exclusiv": [12, 13], "exclusively": [0, 5, 6], "exclus\u00e3": 14, "exclu\u00edd": [2, 6], "exe": 2, "execu": [2, 4], "execut": [0, 2, 3, 6, 12], "executabl": [6, 10], "executed": [2, 5, 6, 8, 15, 16], "executing": 16, "execution": [1, 16], "exempl": [2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "exercis": 5, "exerc\u00edci": 13, "exib": [3, 6, 8, 10, 14], "exibi\u00e7\u00e3": [13, 14], "exig": [1, 2, 6, 13], "exist": [1, 2, 4, 5, 6, 8, 12, 16], "existenc": 13, "existent": [2, 6, 13, 14], "existing": [2, 5, 6, 12], "exists": [5, 6], "exit": 2, "exiting": 5, "exp": [4, 6], "expand": 3, "expect": [6, 12], "expected": [4, 15], "expects": [2, 10], "experienc": [1, 13], "experienced": 0, "experiment": [1, 12], "experimental": [2, 5], "experimenting": 1, "expir": [5, 13], "expiration": [5, 6, 13], "expired": 13, "explain": 12, "explained": [5, 6, 12, 14], "explanatory": 6, "explic": [4, 6], "explicit": [0, 2, 4, 5, 6, 8, 12], "explicitly": [0, 2, 5, 6, 8, 10, 12, 16], "explict": 6, "exploring": 3, "expl\u00edcit": [6, 13], "expor": [4, 13], "export": 17, "export_to_csv_fil": 6, "exporting": 6, "expos": [4, 5], "exposed": 6, "expost": 7, "express": 12, "expressed": 12, "expression": [4, 6, 8, 11, 12, 14], "expressions": [10, 12, 16], "express\u00e3": [6, 7, 11, 14], "express\u00f5": 11, "exp\u00f5": [0, 3, 4, 6, 13], "extend": [5, 6, 12, 13, 15, 16], "extended": 8, "extends": [6, 8, 16], "extensibl": 15, "extension": [12, 15], "extensions": 12, "extensively": [3, 6], "extens\u00e3": 6, "extern": 2, "external": [6, 13], "externally": 4, "extra": [5, 6, 12, 13], "extra_fields": 5, "extract": [6, 12], "extracted": 6, "extracts": 16, "extras": 6, "extra\u00edd": 6, "extrem": 6, "f": [4, 5, 6, 13, 14, 15, 16], "fa": 14, "facebook": [0, 5], "facil": [4, 5, 6], "facilitat": 4, "fact": [4, 5, 15], "factori": [5, 10], "fail": [6, 8, 12, 13, 16], "failed": [6, 13], "fails": [3, 12], "failur": [6, 12, 16], "fak": 6, "fake_migrate_all": 6, "falh": 4, "fall": 12, "fals": [2, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "falt": 6, "famous": [1, 6], "fancy": 16, "far": [14, 16], "fas": 6, "fast": [0, 4, 6, 8, 13, 15, 16], "fat": 6, "fath": 6, "father_id": 6, "favorite_color": 5, "faz": [2, 5, 8, 10, 12, 13], "fb00": 12, "fdb": 6, "fe80": 12, "feasibl": [2, 12], "featur": [0, 4, 6, 7, 8, 13, 15, 17], "february": 5, "fech": [6, 8, 10], "fechament": 10, "feit": 6, "fetch": [6, 15, 16], "fetchon": 6, "few": [8, 13, 16], "fez": [2, 6], "ff00": 12, "fic": 6, "ficheir": 6, "fict\u00edc": 6, "fict\u00edci": 6, "fid": 6, "field": [2, 4, 5, 7, 13, 14, 15, 16, 17], "field1": 6, "field2": 6, "field3": 6, "field_id": 14, "fieldnam": [6, 16], "fields": [5, 7, 12, 13, 14, 15, 17], "fieldstorag": 12, "fifth": 14, "fil": [0, 1, 2, 3, 5, 6, 8, 10, 11, 13, 14, 16, 17], "file_content": [6, 16], "file_nam": [6, 16], "file_path": 15, "fileir": 6, "filenam": [2, 4, 5, 6, 12], "filep": 4, "filepaths": 4, "filesyst": [4, 5, 6], "fileuploadwidget": 12, "fill": [12, 16], "filled": 12, "filt": [2, 4, 7, 12, 14], "filter_in": 12, "filter_out": 14, "filtered": 13, "filters": [4, 12], "filtr": [13, 14], "filtrag": [4, 14], "fim": [1, 2, 5, 6], "fin": [2, 13, 14], "final": [1, 2, 5, 6, 11, 13], "finally": [4, 14], "find": [1, 2, 4, 12, 13, 14], "find_by_tag": 13, "find_match": 11, "findall": 12, "finding": 14, "finds": [6, 16], "fins": 6, "firebird": 6, "firebird_embedded": 6, "firebirdadapt": 6, "firebirdembedded": 6, "firebirdembeddedadapt": 6, "firefox": [3, 16], "firfox": 16, "first": [0, 2, 3, 5, 7, 8, 10, 12, 13, 14, 15, 16], "first_nam": [4, 5, 13, 14], "first_only": 10, "first_row": 6, "first_row_dict": 6, "fist": 12, "fits": 12, "fix": [5, 6], "fixed": [6, 15], "fixtur": [0, 2, 6, 10, 13, 15, 17], "fixur": 17, "fiz": 1, "fk_field": 16, "fk_tabl": 16, "fkdaog": 8, "flag": 12, "flash": [8, 12, 16, 17], "flask": [0, 15], "flexibil": [0, 14], "flexibility": [13, 16], "flexibl": [6, 13], "flex\u00edv": 0, "flex\u00edvel": 6, "flight": 7, "float": [4, 12], "floating": 12, "flow": 13, "flux": 6, "fn": 2, "focus": 16, "fold": [1, 2, 3, 4, 5, 6, 7, 11, 12, 14, 15], "folders": 2, "follow": [2, 4, 7, 14, 15], "followed": [2, 5, 12], "following": [1, 2, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16], "follows": [5, 6, 12], "font": [6, 8, 12, 14], "foo": 14, "foot": 8, "footers": 8, "footing": 13, "forbid": 12, "forbidden": 12, "forc": [2, 5, 6, 7, 12, 13], "forcing": 12, "foreground": 12, "foreign": 14, "foreign_key_checks": 6, "forgery": 5, "forget": 14, "form": [0, 4, 5, 6, 7, 11, 13, 14, 17], "form_basic": 12, "form_custom_widgets": 12, "form_exampl": 12, "form_minimal": 12, "form_nam": 12, "form_widgets": 12, "format": [4, 5, 7, 10, 11, 13, 14], "formats": 12, "formatt": 16, "forma\u00e7\u00e3": 6, "formdat": 7, "forms": [6, 10, 14, 15, 16], "formstyl": [12, 14, 16], "formstylebootstrap4": 12, "formstylebulm": [12, 14, 16], "formstyledefault": [12, 14], "formstylefactory": 16, "formul\u00e1ri": [6, 13, 14, 17], "fornec": [0, 2, 3, 4, 5, 6, 10, 13, 14], "forum": 3, "foruml\u00e1ri": [6, 10, 17], "forward": 1, "found": [2, 4, 5, 6, 12], "four": [2, 6], "fourth": 12, "fp": 5, "fr": 11, "fracass": 6, "fragment": 4, "framework": [0, 2, 12, 13, 14, 15, 16], "frameworks": [0, 2, 5, 6, 15, 16], "fras": 6, "fre": [1, 5, 13], "freetext": 16, "frent": 8, "frequently": 12, "frequ\u00eanc": 1, "friendly": [0, 5, 8], "from": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "from_addr": 16, "from_address": 13, "from_adds": 16, "from_email": 16, "front": [4, 12, 16], "frontends": 16, "fronts": 0, "fsstorag": 5, "ftps": 12, "fug": [6, 8], "full": [2, 4, 5, 6, 8, 12, 16], "fullnam": 6, "fully": [4, 5, 6, 12], "func": [2, 5], "funcion": [6, 17], "funcional": [0, 5, 6], "function": [2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "functional": 16, "functionaliti": 2, "functionality": [0, 8, 15], "functions": [2, 5, 10, 16], "functools": 16, "fund": 4, "fun\u00e7\u00e3": [4, 6, 8, 10], "fun\u00e7\u00f5": [4, 8], "futur": [5, 15, 16], "f\u00e1bric": 6, "f\u00e1cil": [0, 6, 8, 10, 13], "f\u00edsic": 13, "g": [1, 2, 6, 10, 12], "gain": 2, "gananc": 4, "garant": [6, 8], "garraf": 4, "gavgavian": 1, "gend": 6, "general": [5, 6, 12, 13], "generaliz": 6, "generally": [2, 5, 6, 8], "generat": [2, 6, 8, 10, 12, 13, 14, 15, 16], "generate_time_based_cod": 13, "generated": [1, 5, 6, 8, 12, 13, 14, 16], "generation": 1, "generator": 10, "generic": [2, 4, 5, 6, 12, 13], "generically": 6, "genindex": 17, "gen\u00e9r": 6, "ger": [6, 8, 10, 13, 14], "gerador": 6, "geral": [0, 2, 6, 7, 10], "german": 11, "gest\u00e3": [0, 1], "get": [1, 2, 4, 5, 6, 8, 12, 13, 14, 15, 16, 17], "get_cooki": 16, "get_us": [4, 5, 13, 15], "get_vars": [7, 15], "gets": [8, 13], "getvalu": 6, "gevent": [1, 2], "gia": 5, "gib": 6, "gif": 12, "git": [1, 2], "github": [2, 3, 4, 5, 6, 14], "gitlat": 1, "giv": [4, 5, 6, 8, 13], "given": [2, 4, 5, 6, 8, 12, 13, 16], "giving": 5, "global": [0, 4, 6, 15, 16], "globally": [2, 6], "globals": [5, 6, 8, 13, 15], "go": [2, 4, 14], "goes": [6, 12], "going": [4, 16], "good": [3, 12], "googl": [0, 3, 5, 8, 12, 14], "googledatastor": 6, "googledatastoreadapt": 6, "googlemysql": 6, "googlepostgr": 6, "googlesql": 6, "googlesqladapt": 6, "gost": 6, "got": 6, "gotch": 6, "gott": 8, "grac": 6, "grad": 0, "grand": 6, "grants": 5, "granul": 6, "granulary": 12, "graphically": 6, "graphql": 7, "grau": 6, "grav": 6, "grava\u00e7\u00f5": 12, "gravidad": 6, "grav\u00e1vel": 6, "great": 16, "green": [4, 6, 12, 15], "grelh": 14, "grid": [0, 4, 13, 17], "grid_class_styl": 14, "grid_tutorial": 14, "gridactionbutton": 14, "gridclassstyl": 14, "gridclassstylebulm": 14, "grids": 17, "group": [1, 3, 5, 13, 15], "group_nam": 13, "groupby": 12, "grouping": 2, "groups": [0, 1, 3, 5, 13, 15], "growing": [0, 16], "grup": [6, 13], "gt": [7, 10], "guarant": 5, "guaranteed": [6, 15, 16], "gui": 3, "guid": 2, "guidelin": 13, "gunicorn": 2, "gz": 12, "h": [2, 12, 13], "h1": [4, 8], "h2": [8, 12], "habilit": 6, "had": 6, "hamburg": 8, "hand": [2, 16], "handl": [2, 4, 5, 6, 13, 15, 16], "handled": [4, 5, 12, 16], "handlers": 4, "handling": [4, 14], "handy": 6, "hanging": 1, "happen": 5, "happens": 6, "hard": 15, "hardcod": 5, "harmoniz": 4, "has": [0, 2, 4, 5, 6, 8, 12, 13, 14, 15, 16], "has_membership": 13, "hash": [2, 6, 12], "hashed": 12, "hav": [0, 1, 2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "head": [4, 5, 6, 8, 13, 14, 16], "headers": [4, 8, 13, 16], "heading": 12, "headings": [10, 14], "height": [12, 14, 16], "hell": [4, 5, 6, 8, 10, 12, 13, 16], "help": [1, 2, 5, 6, 7, 8, 10, 12, 14, 15], "helpers": [4, 6, 8, 12, 14, 15, 16, 17], "helps": [6, 8, 12], "henc": [0, 2, 4, 5, 6, 12, 13], "her": [0, 1, 2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 16], "herd": 6, "her\u00f3": 7, "hesitat": 6, "hex": 12, "hh": 12, "hi": 16, "hid": 14, "hidden": [12, 16], "hidden_div": 16, "hidden_input": 16, "hierarchical": [6, 13], "high": [12, 13], "highest": 12, "highlighting": [1, 8], "highly": [1, 4, 14], "hints": 14, "his": 12, "historical": 0, "history": 12, "hist\u00f3r": [5, 6], "hmac": 12, "ho": 5, "hold": 16, "holds": 6, "hom": 8, "hood": 13, "hor": 6, "hosped": 1, "host": [2, 4, 5, 12, 13], "hosted": 1, "hour": 12, "hous": 15, "housekeeping": 6, "houv": 6, "how": [0, 2, 4, 5, 6, 7, 8, 12, 13, 14, 15, 16], "howev": [4, 6, 8, 12, 13, 16], "href": [8, 10, 13, 14], "hs256": 5, "html": [1, 2, 4, 5, 7, 8, 11, 12, 13, 14, 15, 16], "html5": 8, "htmx": [14, 17], "htmx_form": 16, "htmx_form_dem": 16, "htmx_grid": 16, "htmx_list": 16, "htmxautocompletewidget": 16, "http": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15], "https": [1, 3, 4, 5, 7, 8, 12, 13, 14, 16], "httrespons": 5, "hulk": 12, "hundreds": 16, "hx": 16, "hybrid": 4, "hypertext": 16, "hyphen": 10, "h\u00e1bit": 2, "h\u00edfens": 10, "i": [2, 4, 5, 6, 7, 8, 12, 13, 16], "i18n": [5, 11], "ibm_db_dbi": 6, "icon": [8, 14], "icons": 14, "id": [2, 7, 8, 10, 12, 13, 14, 15, 16], "id1": 6, "id2": 6, "id_field_nam": 14, "id_valu": 14, "ide": [0, 1, 2, 3, 6], "ident": 7, "identical": 15, "identifi": 6, "identific": [6, 10], "identify": [4, 13], "identifying": [5, 12], "identity": [6, 7, 13, 15], "ides": 15, "idiom": 11, "idn": 12, "ids": [6, 14], "ie": 12, "ietf": 12, "if": [0, 1, 2, 3, 4, 5, 6, 7, 10, 12, 13, 14, 15, 16], "ifram": 12, "ignor": [5, 6, 8, 12, 14], "ignore_attribute_plugin": 14, "ignore_common_filters": [6, 12], "ignore_field_cas": 6, "ignored": [4, 8, 10, 14, 16], "igual": [6, 7], "iip": 6, "illustrat": 6, "ilustr": [6, 8], "imag": [6, 8, 10, 12], "image_fil": 6, "imagin": [5, 6, 8, 16], "imaging": 12, "imap": 6, "imapadapt": 6, "imaplib": 6, "imediat": 14, "img": [4, 12], "immediat": 2, "immediately": 6, "immensely": 0, "imped": [6, 10], "impersonat": 13, "impersonating": 13, "implement": [5, 6, 8, 13], "implementation": [4, 8, 12, 15], "implementations": 16, "implemented": [4, 6], "implements": [5, 6], "impli": 7, "implications": 5, "implicit": 6, "implicitly": [6, 12], "impl\u00edcit": 6, "impor": 6, "import": [0, 2, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17], "import_and_sync": 6, "import_from_csv_fil": 6, "important": [0, 2, 4, 5, 6, 12, 13], "imported": [2, 4, 12, 13, 15], "importing": 6, "impos": 8, "impot": 12, "imprim": 6, "improved": 12, "improvement": 14, "improving": [12, 13], "in": [0, 1, 2, 3, 4, 6, 7, 11, 12, 13, 14, 15, 17], "inalter": 6, "inclu": [0, 4, 6, 8, 10, 14], "includ": [4, 6, 7, 10, 14, 16], "include_action_button_text": 14, "include_paths": 4, "included": [5, 6, 8, 12, 14], "including": [5, 12, 14, 15, 16], "inclusion": 0, "inclusiv": [0, 12], "inclus\u00e3": 10, "inclu\u00edd": [6, 10], "incoming": 2, "incomum": 6, "incorpor": 6, "incorrect": 4, "incorret": 8, "increased": 5, "increment": 6, "indeed": [0, 5], "indent": 8, "indentation": 8, "indented": 8, "independent": [0, 4, 5, 6, 13], "indesej": [2, 6], "index": [1, 2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "index_form": 5, "indic": [4, 6], "indicat": [12, 13, 15], "indicator": 16, "individu": [0, 2, 5, 6], "individual": [5, 6, 7, 8, 12], "indo": 6, "inefficient": 5, "ineficient": 6, "infinit": 6, "info": [2, 4, 5, 13], "inform": [1, 4, 5, 6, 12], "information": [5, 6, 7, 12, 13, 15, 17], "informed": 6, "informix": 6, "informixadapt": 6, "informixdb": 6, "informixs": 6, "ingredient": 4, "ingres": 6, "ingresadapt": 6, "ingresdb": 6, "ingresu": 6, "ingresunicod": 6, "ingresunicodeadapt": 6, "inic": [2, 4], "inicializ": [4, 5], "init": [4, 14], "initial": [8, 12], "initializ": [2, 5], "initialization": 5, "initialized": 0, "inject": [12, 14, 17], "injected": [5, 8, 10, 12], "injecting": 10, "injection": 6, "injections": 10, "inje\u00e7\u00e3": 6, "inlin": 16, "inner": [5, 16], "input": [2, 5, 6, 8, 12, 13, 14, 16], "inputs": [12, 16], "insegur": 10, "insensitiv": 12, "inser": [3, 8], "insert": [5, 7, 8, 12, 13, 14, 16], "inserted": 8, "inserting": 12, "inserts": 12, "inser\u00e7\u00f5": 6, "insid": [2, 4, 5, 6, 8, 10, 12, 14, 15, 16], "insir": 6, "insist": 10, "inspector": 8, "inspired": 7, "instal": [3, 6, 13, 17], "install": [2, 6, 13, 16], "installation": [2, 6], "installations": 17, "installed": [0, 1, 2, 3, 4, 5, 6], "installs": 2, "instanc": [4, 5, 6, 10, 12, 13, 14, 16], "instanci": 6, "instantiat": [6, 13, 15], "instantiated": 6, "instantiation": [13, 14], "instead": [1, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16], "instructions": [2, 12], "instru\u00e7\u00e3": 6, "instru\u00e7\u00f5": 6, "inst\u00e2nc": [6, 14], "int": [4, 6, 12, 13, 15], "int2ip": 6, "integ": [2, 6, 7, 10, 12, 16], "integers": 12, "integr": 0, "integrated": 1, "integration": 16, "integrity": [4, 8, 16], "inteir": [4, 6], "intended": [6, 16], "intentionally": 12, "interaction": 5, "interag": 0, "interchangeably": 13, "interfac": [0, 3, 5, 6, 14, 15, 16], "interior": 8, "intermedi\u00e1r": 6, "intern": [5, 6], "internacionaliz": [0, 4, 17], "internal": [0, 1, 8, 13], "internally": [4, 5, 6, 14], "internationaliz": 12, "internationalization": [5, 12, 15], "internationalized": 12, "interpret": [0, 6], "interpreted": 10, "interpreting": 7, "interromp": 6, "intersec\u00e7\u00e3": 6, "into": [0, 2, 4, 5, 6, 8, 10, 12, 13, 15, 16], "introdu": 2, "introduc": 0, "introduction": [1, 17], "introduz": 8, "intuitively": 12, "invalid": [2, 6, 12, 13], "invalidated": 5, "invalidating": 12, "invers": 6, "invert": [6, 12], "invisibl": 6, "involv": [6, 14, 15], "involved": [6, 8], "inv\u00e9s": 6, "in\u00edci": 6, "in\u00fatil": 6, "io": [2, 6], "ip": [2, 6, 12], "ip2int": 6, "ip_list": 13, "ipaddr": 6, "ipaddress": 13, "iptabl": 2, "ipv4": [6, 12], "ipv4address": 13, "ipv4network": 13, "ipv6": 12, "irem": [4, 5], "ir\u00e1": [2, 3, 4, 6, 8, 13, 14], "is": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "is_6to4": 12, "is_activ": 6, "is_automatic": 12, "is_dat": 6, "is_datetim": 6, "is_decimal_in_rang": 6, "is_empty_or": 6, "is_float_in_rang": 6, "is_impersonating": 13, "is_in_db": [6, 14], "is_in_set": 6, "is_int_in_rang": 6, "is_json": 6, "is_length": 6, "is_link_local": 12, "is_localhost": 12, "is_multicast": 12, "is_not_empty": 6, "is_null_or": 14, "is_privat": 12, "is_public": 6, "is_reserved": 12, "is_routeabl": 12, "is_tered": 12, "is_tim": 6, "is_valid": 5, "isdir": [7, 14], "isn": [5, 12, 14], "iso": 7, "isolation": 16, "issu": [0, 4, 6], "issuing": 13, "it": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "italian": [5, 11], "item": [6, 8, 10], "itemize1": 8, "itemize2": 8, "items": [6, 7, 8, 12], "itens": 6, "iter": 8, "iterabl": [6, 12], "iterations": 12, "iterators": 6, "iterselect": 6, "its": [0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16], "itself": [1, 2, 6, 12, 16], "it\u00e1l": 10, "iv": 6, "janel": 2, "javascript": [1, 4, 7, 10, 16], "jdbc": 6, "jdbcpostgr": 6, "jdbcpostgresqladapt": 6, "jdbcsqlit": 6, "jdbcsqliteadapt": 6, "jetbrains": 1, "jim": [0, 1, 14], "jinja2": 5, "job": [7, 12, 14], "jog": [6, 11], "john": [0, 6], "join": [4, 5, 7, 12, 14, 15], "joined": 14, "joins": [14, 17], "jonathan": 6, "jorn": 1, "journalist": [7, 14], "jpeg": 12, "jpg": 12, "jpsteil": 14, "jquery": [10, 12, 16], "js": [0, 4, 5, 8, 11, 15, 17], "jsl": 16, "json": [0, 1, 2, 4, 5, 6, 7, 11, 12, 15, 16], "junt": [10, 14], "jun\u00e7\u00e3": [6, 13], "jun\u00e7\u00f5": 6, "just": [1, 2, 4, 5, 6, 7, 8, 12, 13, 14, 16], "jwt": 5, "jwt_token_plugin": 13, "jython": 6, "k": [5, 8, 15], "kargs": 10, "kbd": 2, "kbytes": 5, "keep": [1, 2, 4, 5, 6, 7, 8, 10, 12, 15], "keep_valu": 12, "keeps": [5, 14], "kell": 0, "ken": 6, "kent": [7, 14], "kevin": 0, "key": [2, 4, 5, 6, 7, 10, 12, 13, 16, 17], "keycod": 16, "keyed": 6, "keys": [6, 7], "keyup": 16, "keyword": [6, 8, 10], "keywords": 6, "kfield": 16, "killed": 16, "kind": [4, 13], "kindness": 0, "kinds": 4, "kinterbasdb": 6, "know": [5, 14], "known": [6, 8, 13], "known_expressions": 11, "knows": [4, 5, 13], "krzysztof": 0, "ktabl": 16, "kwargs": [6, 16], "ky8iq0g4b3cyey6wyhn3yt9pw0xpsrivlkmxe40ptknxrlnz9": 8, "l": [2, 12], "la": [4, 6], "label": [6, 7, 8, 12, 16], "labeling": 15, "labels": 12, "lac": 6, "lacking": 12, "lacks": 15, "lad": [1, 5, 6], "lambd": [5, 6, 10, 12, 14, 16], "lang": 5, "languag": [1, 4, 5, 8, 11, 15, 16], "larg": [0, 12], "last": [1, 5, 8, 12, 13, 14, 16], "last_insert_id": 6, "last_nam": [5, 13, 14], "last_row": 6, "lastdot": 12, "lastrowid": 6, "lat": [2, 4, 5, 6, 8, 10, 12, 14], "latest": [2, 6, 15], "latin1": 6, "latt": [6, 12, 15], "launch": [1, 2], "lax": 5, "lay": [5, 15, 17], "layers": 5, "layout": [12, 13, 14, 15, 16, 17], "layouts": [8, 14], "lazily": 16, "lazy": [1, 2, 4, 6], "lazy_tabl": 6, "lazy_total_pric": 6, "ldap": [0, 5], "ldap_plugin": 13, "ldap_setting": 13, "ldap_settings": 13, "ldapplugin": 13, "lead": [14, 16], "leads": 5, "learn": [1, 6], "least": [1, 2, 12, 15, 16], "leav": [5, 6], "left": [8, 12, 14, 16], "legacy": 6, "leg\u00edvel": 6, "leitur": 6, "lembr": [3, 6, 8, 12], "len": [12, 16], "length": [6, 12], "ler": [1, 6], "less": [7, 12, 15, 16], "let": [7, 12, 16], "lets": 2, "letters": 12, "letting": 6, "lev": [6, 10], "levant": 6, "level": [2, 4, 6, 7, 12, 13], "leverag": 0, "li": [8, 12, 13, 16], "lib": 2, "libldap2": 13, "librari": 13, "library": [2, 6, 11, 12, 15, 16], "libs": [8, 10, 14], "libsasl2": 13, "libsass": 4, "licens": 1, "lid": [1, 4, 5, 6, 14], "lif": 16, "lifespan": 12, "lifetim": 5, "lig": [2, 5, 6, 10], "liga\u00e7\u00e3": [4, 5, 6], "liga\u00e7\u00f5": [6, 10], "light": [6, 15], "lik": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16], "limit": [5, 6, 7, 12, 13], "limitation": 8, "limited": [0, 2, 5, 15, 16], "limiting": 16, "limits": 12, "limp": 1, "lin": [2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 16], "linguag": [0, 4, 5, 17], "linguagens": 4, "linh": [5, 6, 8, 10, 14, 17], "link": [4, 7, 8, 10, 12, 13, 14], "linked": 7, "links": [2, 6, 14, 16], "linting": 1, "linux": 2, "list": [0, 1, 2, 4, 5, 7, 8, 10, 12, 13, 14, 16], "list_of_fields": 6, "listabl": 6, "listagens": 10, "listed": [5, 12, 16], "listen": [2, 4], "listening": [2, 3], "listproperty": 6, "lists": [6, 14], "liststringproperty": 6, "listwidget": 12, "littl": [1, 5, 6], "liv": [6, 16], "livr": [1, 6], "lix": 6, "ll": [1, 2, 3, 5, 6, 8, 12, 14, 16], "lo": [1, 2, 3, 4, 6, 7, 8, 10], "load": [3, 5, 16], "loaded": [4, 8, 14, 16], "loading": 16, "loads": [6, 16], "loazkjy": 8, "loc": 5, "local": [3, 8, 12, 13, 14], "local_initializ": 5, "localhost": [2, 4, 5, 6, 12], "localiz": 4, "locally": 2, "locals": [5, 12, 14, 15], "localstoragedem": 5, "locat": 15, "location": [2, 4, 6, 8, 15], "locked": 6, "locking": 5, "locks": 16, "log": [0, 2, 4, 5, 6, 8, 10, 13, 15, 16], "logerrors": 5, "logfil": 6, "logged": [5, 8, 13, 15], "logging": [2, 13], "logging_level": 2, "logic": [2, 4, 5, 6, 13, 14, 15, 16], "logical": 12, "login": [0, 2, 3, 4, 5, 6, 8, 12, 13, 15], "logout": [0, 8, 13], "logs": [2, 5, 6], "loj": 6, "long": [0, 2, 6, 12, 13, 16], "longhash_tablenam": 6, "longtext": 6, "look": [4, 5, 6, 7, 12, 13], "looking": 3, "looks": [2, 6, 12], "lookup": [5, 7, 13], "lookups": 12, "loop": [6, 8, 16], "looping": 6, "loops": 16, "los": [2, 4, 6, 12], "lost": [5, 15], "lot": [4, 6, 13], "lots": 1, "loved": 0, "low": [0, 12], "lowercas": 12, "lowest": 12, "lru": 5, "lt": 10, "lts": 2, "luc": [0, 1], "lug": [1, 5, 6], "lumin\u00e1r": 4, "l\u00e1": [2, 4], "l\u00edngu": 1, "m": [0, 2, 6, 10, 12], "mac": [2, 6], "macac": 5, "machin": 2, "macneiln": 2, "mad": [8, 12, 13, 14], "magically": 0, "mai": 5, "mail": [2, 3, 5, 12, 13, 16], "mailing": 6, "mailt": 12, "main": [1, 2, 3, 4, 6, 8, 14, 15, 16], "maintain": [6, 8, 16], "maintainability": 6, "maintainabl": 14, "maintenanc": 16, "maior": [6, 7], "mai\u00fascul": 6, "major": 6, "mak": [0, 1, 2, 5, 6, 8, 10, 12, 13, 14, 15, 16], "make_token": 13, "makefil": 2, "making": [6, 8], "man": 16, "manag": [2, 3, 4, 5, 6, 13, 14, 16], "managed": [0, 13], "management": 12, "managing": 6, "mandatory": [5, 8], "maneir": [6, 14], "manipul": 6, "manipulat": 12, "manipulated": 12, "manipulation": 4, "mann": [5, 13, 15], "manual": [2, 3, 4, 5, 6], "manually": [2, 4, 6, 10, 13, 14], "many": [0, 1, 2, 4, 5, 7, 8, 12, 13, 14, 15, 16], "map": [4, 6, 10, 11], "map_non": 6, "mapped": 17, "mapping": [2, 4, 6, 12, 15], "maps": [6, 10], "marc": [1, 6, 10, 13], "marca\u00e7\u00e3": [10, 13], "margin": [8, 16], "marked": 6, "massim": [0, 6], "mast": [1, 2, 14], "match": [1, 2, 4, 5, 6, 8, 10, 11, 12, 16], "matched": [4, 7, 10, 12], "matching": [7, 10, 12], "matem\u00e1t": 6, "material": 6, "math": 16, "matriz": 10, "matters": 15, "max": [11, 12, 16], "max_concurrent_runs": 16, "maximum": [5, 12], "maxip": 12, "maxlen": 12, "maxsiz": 12, "may": [2, 4, 5, 6, 8, 10, 12, 13, 15, 16], "md": 1, "md5": 12, "mean": 15, "meaning": [6, 12, 13], "meanings": 12, "means": [1, 2, 3, 4, 5, 6, 8, 12, 13, 15], "mecan": [6, 8], "mechanism": [0, 4, 5, 6, 8, 10, 13, 15, 16], "med": 1, "mediant": 8, "mei": 6, "melhor": [0, 1, 6, 11, 14, 17], "memb": [12, 13], "membership": [0, 5, 12, 13, 15], "memberships": 5, "membr": 13, "memcach": [0, 6], "memoiz": 17, "memory": [5, 6], "men": [1, 2, 5, 6], "menor": 6, "mensag": 14, "mensagens": [5, 6], "ment": 1, "mention": 5, "mentioned": [13, 16], "menu": [8, 12, 13], "menus": [8, 12], "mes": [6, 10], "mescl": 6, "mesm": [0, 1, 2, 4, 5, 8, 10, 11, 14], "messag": [2, 4, 5, 7, 8, 12, 14, 15, 17], "messed": 1, "mestr": 6, "met": [6, 8, 10], "metad": 6, "metadat": [6, 13], "metatag": 10, "method": [4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "methods": [5, 7, 10, 12, 13, 14, 17], "mfa": 13, "micah": 0, "microsoft": [1, 13], "mid": 6, "middlewar": 5, "might": [4, 7, 12], "migr": 6, "migrate_enabled": 6, "migrated": 6, "migrating": [6, 15], "migration": 6, "migrations": 6, "migra\u00e7\u00f5": 17, "min": [8, 12, 14], "min_length": 12, "mind": [4, 6, 7, 8, 12], "mindful": 6, "minimal": [4, 5, 14, 17], "minimalist": [8, 15], "minimalist_pag": 8, "minimum": 12, "minip": 12, "minor": [8, 12, 15], "minsiz": 12, "minut": 12, "min\u00fascul": 6, "missing": [2, 13, 14], "mistak": 2, "mix": 8, "mkdir": [2, 4, 7, 14], "mm": 12, "mobili\u00e1ri": 5, "mod": [2, 4, 5, 6, 12, 13], "model": [0, 3, 7, 10, 12, 15, 16], "models": [4, 6, 7, 14, 15], "modern": [6, 13, 16], "modifi": 14, "modific": [2, 4], "modification": 12, "modifications": 2, "modified": [4, 12, 15], "modified_by": 6, "modified_on": 6, "modifiers": 7, "modify": [12, 14, 16], "modifying": [2, 6, 8], "modindex": 17, "modul": [0, 1, 2, 4, 6, 8, 10, 12, 13, 14, 15], "moment": [2, 6], "mong": 6, "mongodb": 6, "mongodbadapt": 6, "monoespac": 10, "monolithic": 0, "mont": 13, "month": 12, "mor": [0, 2, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16], "moreov": 16, "most": [0, 4, 5, 6, 12, 13, 14, 15, 16], "mostr": [1, 4, 6, 14], "moth": 6, "mother_id": 6, "motor": 6, "mov": 6, "msg": 4, "mssql1": 6, "mssql1n": 6, "mssql2": 6, "mssql2adapt": 6, "mssql3": 6, "mssql3adapt": 6, "mssql3n": 6, "mssql4": 6, "mssql4adapt": 6, "mssql4n": 6, "mssqladapt": 6, "mssqln": 6, "mtabl": 0, "much": [0, 1, 4, 5, 6, 8, 12, 14, 15, 16], "mud": [4, 5, 6], "mudanc": 6, "muit": [0, 1, 4, 5], "mult": [1, 2, 6, 15], "multicast": 12, "multipl": [1, 2, 4, 6, 8, 10, 12, 15, 16, 17], "multiprocess": 5, "multiselect": 12, "multius": 13, "must": [1, 2, 3, 4, 5, 6, 8, 10, 12, 13, 15, 16], "my": [5, 8, 10, 12, 13, 16], "my_app": 4, "my_content": 5, "my_id": 16, "my_password_fil": 2, "my_task": 16, "my_url_path": 15, "my_var": [5, 10], "myapp": [2, 4], "myclass": 10, "mycomponent": 16, "mycustomtokenplugin": 13, "mycustomwidget": 12, "mydb": 6, "myerrors": 5, "myfield": 6, "myfil": 6, "myfixtur": 5, "myfunction": 2, "myidx": 6, "myobj": 6, "myobjnam": 6, "myord": 6, "myquery": 6, "myrecord": 6, "mysaltvalu": 12, "mysendgridsend": 16, "myset": 6, "mysideb": 8, "mysqladapt": 6, "mysqldb": 6, "mysqldv": 6, "mystyle": 12, "mytabl": [6, 13], "myvalu": 6, "myvirtualfields": 6, "myvirtualfields1": 6, "myvirtualfields2": 6, "m\u00e1quin": [6, 10], "m\u00e1x": 6, "m\u00e1xim": 6, "m\u00e9d": 6, "m\u00e9di": 13, "m\u00e9tod": [4, 5, 6, 8, 14], "m\u00ednim": [5, 6], "m\u00f3dul": [0, 2, 5, 6], "m\u00faltipl": [0, 6], "n": [5, 6, 11, 16], "nad": [2, 4, 6], "nam": [1, 2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "named": 10, "nameonly": 6, "naming": 6, "nasc": 6, "natal": 6, "nativ": 6, "native_json": 12, "nav": 8, "navb": [8, 13], "naveg": 14, "navigat": 16, "navigation": [8, 16], "ndb": 6, "ne6fz": 8, "necess": [1, 2, 4, 6, 8], "necessary": [6, 8, 10, 13], "necessit": 6, "necess\u00e1r": [1, 6], "necess\u00e1ri": [2, 4, 6], "need": [0, 1, 2, 5, 6, 8, 10, 12, 13, 14, 15, 16], "needed": [2, 4, 5, 6, 10, 12, 13, 16], "needs": [0, 4, 5, 6, 13, 15, 16], "neg": 6, "negated": 6, "negativ": [6, 12], "nega\u00e7\u00e3": 6, "neith": 12, "nel": 6, "nenhum": [6, 13], "ness": 6, "nest": [1, 6, 8, 10], "nested": [6, 8], "nested_select": 6, "network": [12, 13], "networks": [6, 12, 13], "nev": [6, 8, 12, 15, 16], "nevertheless": 13, "new": [0, 2, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "new_app": [8, 10], "new_password": 16, "new_sidec": 16, "newlin": [6, 12], "newly": 6, "next": [1, 5, 6, 8, 12, 16], "nginx": [2, 4], "nic": [0, 16], "nicozanf": 2, "nid": 6, "niss": 6, "no_backslash_escap": 6, "no_tabl": [12, 16], "nod": [4, 16], "nom": [2, 4, 5, 7, 10, 12, 13, 14], "nomeaplic": 13, "non": [2, 4, 5, 6, 7, 10, 12, 13, 14, 15, 16], "nor": [2, 12], "norm": 6, "normal": [4, 5, 6, 8, 12, 14, 16], "normaliz": 6, "normalized": 6, "normally": [2, 6, 8, 10, 12, 14], "northwind": 1, "nosqladapt": 6, "noss": [1, 4, 5, 6], "not": [0, 1, 2, 4, 5, 7, 8, 10, 12, 13, 14, 15, 16], "not_authorized": 13, "notably": 5, "notation": 10, "nota\u00e7\u00e3": [6, 10], "noted": 8, "nothing": [2, 5, 6, 12, 16], "notic": [2, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16], "notnull": 6, "notset": 2, "nov": [0, 1, 2, 3, 4, 14], "novaaplicaca": 4, "now": [0, 4, 5, 6, 12, 14, 16], "nowadays": 1, "nul": 6, "null": [6, 7, 12, 16], "numb": [2, 5, 6, 8, 12, 13, 16], "number_workers": 2, "numbers": 12, "numerical": 12, "num\u00e9r": 6, "nunc": [5, 6], "n\u00e3": [0, 1, 2, 3, 4, 5, 6, 8, 10, 13, 14], "n\u00edvel": [6, 11], "n\u00famer": [4, 6, 11, 14], "oauth": 13, "oauth2": [0, 5], "oauth2discord": 13, "oauth2facebook": 13, "oauth2googl": 13, "obj": [6, 8], "object": [0, 4, 5, 6, 7, 8, 10, 12, 13, 15, 17], "objects": [0, 4, 5, 6, 10, 12, 14, 15, 16], "objet": [0, 5, 6, 8, 10, 11], "obras": 6, "obrigat\u00f3ri": 6, "observ": [4, 6, 8], "obsolet": 6, "obtain": [2, 13, 16], "obtained": 6, "obter": [4, 6], "obtid": [2, 6], "obvi": 6, "obvious": [7, 8, 13], "obviously": 12, "ocasional": 6, "occasionally": 12, "occur": [2, 12, 16], "occurring": 2, "occurs": 12, "ocorr": [4, 6, 8], "ocult": [6, 12], "odd": [6, 8], "of": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16], "off": [0, 2, 4, 14, 16], "official": [0, 12, 16], "offs": 6, "offset": [6, 7], "oficial": 6, "often": [4, 6, 13, 16], "ok": [10, 15], "old": [2, 5, 12, 15], "older": 12, "olhand": 6, "ol\u00e1": 8, "ombott": [0, 4, 15], "omit": 2, "omitted": 2, "on": [0, 1, 3, 4, 5, 6, 7, 8, 12, 13, 14, 15, 16], "on_delete_action": 6, "on_error": 5, "on_fals": 5, "on_request": [5, 13], "on_success": 5, "once": [1, 2, 4, 5, 6, 12, 13, 16], "onclick": 16, "onde": [2, 6, 7, 8, 12], "ondelet": 6, "one": [0, 2, 4, 5, 6, 7, 8, 12, 13, 14, 16], "ones": [2, 5, 7, 12, 15], "onion": 5, "onkeydown": 16, "onlin": [1, 6], "onload": 16, "only": [1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "onvalidation": 12, "opacity": 16, "opcion": [6, 10], "opcional": [4, 6, 10, 12], "open": [1, 2, 4, 5, 6, 10], "opened": 1, "opening": 5, "oper": [0, 3, 11, 17], "operat": 12, "operating": 13, "operation": [6, 13], "operationalerror": 12, "operations": [5, 6], "operator": [5, 6, 12], "oposi\u00e7\u00e3": 10, "opost": 6, "opposed": 5, "opposit": 5, "oprow": 6, "optimized": 6, "option": [2, 3, 5, 6, 12, 13, 16], "optional": [2, 4, 5, 6, 7, 8, 12, 13, 14, 15, 16], "optionally": [0, 2, 13], "options": [2, 6, 7, 10, 13, 15, 16], "opt\u00e1m": 6, "op\u00e7\u00e3": [3, 4, 6, 8, 10], "op\u00e7\u00f5": [6, 17], "or": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "oracl": 6, "oracleadapt": 6, "ordem": 6, "order": [2, 4, 5, 6, 7, 10, 12, 13, 14, 15], "order_it": 6, "orderby": [12, 13, 14, 16], "ordered": 10, "ordereddict": 6, "ordering": 5, "org": [2, 4, 7, 10, 16], "organiz": 6, "organized": 4, "orig": [2, 11], "origin": 6, "original": [6, 8, 10, 12], "orm": 6, "other": [0, 1, 2, 4, 5, 6, 7, 8, 10, 13, 14, 15, 16], "other_pag": [12, 16], "otherfield": 6, "others": [0, 6, 15], "othertabl": 6, "otherwis": [4, 5, 6, 8, 12, 13, 14], "otimiz": 6, "oufil": 6, "our": [0, 1, 2, 5, 6, 10, 12, 16], "out": [0, 1, 2, 5, 8, 12, 16], "outlined": [4, 5], "output": [1, 2, 5, 8, 12, 16], "output_styl": 4, "outr": [1, 2, 4, 5, 10, 11, 13, 14, 17], "outsid": [0, 5, 6, 12, 14, 15, 16], "ov": 6, "over": [4, 8, 14, 16], "overkill": 13, "overrid": [4, 6, 8, 13, 14, 15, 16], "override_cl": 14, "override_styl": 14, "overriding": [4, 16], "overview": 17, "overwrit": 5, "overwritten": [5, 15], "own": [4, 5, 6, 8, 12, 13, 14, 15, 16], "owner": [6, 12, 13], "owner_id": 6, "owner_id1": 6, "owner_id2": 6, "owners": 12, "ownership": 6, "owns": 6, "p": [2, 8, 12], "p10n": 11, "p11n": 5, "packag": [0, 2, 6, 10], "padded": [5, 8, 15], "padding": 16, "padroniz": 6, "padr\u00e3": [0, 2, 4, 5, 8, 10, 14], "padr\u00f5": [4, 6, 10], "pag": [1, 3, 5, 6, 10, 12, 13, 14, 15, 16, 17], "page_head": 8, "page_left_menu": 8, "page_scripts": 8, "pagin": [6, 14], "pai": 6, "painel": [0, 2, 3], "paint": [4, 12], "painting": 4, "pairs": 10, "palavr": [8, 10, 11], "pam": [0, 5], "pam_plugin": 13, "pamplugin": 13, "papel": 2, "par": [0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 16, 17], "paragraph": [5, 10, 12, 14], "paramet": [1, 2, 4, 5, 6, 13, 14, 16], "parameters": [2, 6], "params": 16, "parec": [5, 6], "parent": [2, 6, 8, 16], "park": [7, 14], "pars": [5, 6, 12, 13], "parsed": 6, "parsemodul": 4, "parsing": 4, "part": [4, 10, 15], "partial": [4, 6, 15], "particip": 6, "participat": 1, "particul": [0, 1, 6, 12, 14, 15, 16], "particular": 6, "particularly": 6, "parts": 12, "party": [0, 5], "par\u00e1graf": [1, 10], "par\u00e2metr": [5, 14], "par\u00eantes": 6, "pass": [4, 5, 6, 8, 10, 12, 13, 14, 15, 16], "passed": [2, 4, 5, 6, 10, 12, 13, 14, 16], "passing": [5, 6, 10, 12], "passphras": 5, "password": [2, 6, 8, 12, 13, 15, 16], "password_fil": 2, "passwords": [12, 13], "passwordwidget": 12, "past": [2, 4], "path": [2, 4, 5, 6, 7, 11, 12, 13, 14, 15, 16], "path_t": 2, "pattern": 7, "patterns": 7, "paus": 2, "pay": 4, "payment": 6, "payroll": 5, "pbkdf2": 12, "pc": 3, "pdf": [1, 12], "pdkdf2": 2, "pec": [5, 6], "ped": [2, 4, 5, 6, 14], "pedac": 8, "peg": 6, "pegadinh": 17, "pel": [1, 4, 5, 6, 8, 10, 11, 13], "pens": 6, "per": [4, 5, 7, 14], "percentual": 6, "perd": [1, 2, 6], "perfect": 0, "perfectly": 14, "perfil": [0, 13], "perform": [5, 6, 12, 13], "performanc": [0, 5, 6, 15], "performed": 13, "performing": 6, "performs": 12, "pergunt": 6, "perhaps": 5, "period": 16, "periodic": 16, "permanec": 6, "permission": [5, 13], "permissions": [0, 5, 6, 13, 15], "permiss\u00e3": [5, 6, 13], "permit": [0, 3, 5, 6, 8, 10, 13, 14], "permitted_tags": 10, "persist": 5, "persistent": [6, 13], "person": [6, 7, 12, 14], "personag": 6, "personagens": [4, 6], "personal": 2, "personaliz": [0, 2, 17], "persons": 12, "persons_and_things": 6, "perspectiv": 0, "pertenc": 6, "pertencent": 6, "pesquis": [2, 3, 6, 14], "pesso": 6, "pet": [6, 7, 14], "philip": 6, "phon": [12, 16], "photograph": [7, 14], "physics": 13, "pick": [5, 13], "picked": 4, "picks": 5, "piec": [0, 12], "pierr": 0, "pip": [0, 1, 6], "pirsch": 0, "piscin": [4, 6], "piu": 5, "pixels": 12, "plac": [1, 4, 5, 6, 8, 12, 14, 16], "placehold": [12, 16], "placeholders": 6, "placing": 14, "plain": 16, "plan": [1, 16], "plataform": 17, "platform": [0, 1], "play": 16, "playing": 0, "pleas": [5, 6], "plug": 5, "plugin": [5, 12, 14, 16], "plugins": [12, 16], "plural": 11, "pluraliz": [0, 4, 5, 14, 16, 17], "pluralization": 15, "plus": [6, 8, 13, 14], "pm": 12, "png": [10, 12], "pod": [0, 1, 2, 4, 5, 6, 7, 8, 10, 11, 13, 14], "point": [4, 5, 6, 12, 15, 16], "pointing": [2, 3, 8], "points": [6, 7, 12, 14], "polic": 17, "policy": 7, "pollut": 5, "pol\u00edt": 0, "pont": 6, "pool": 5, "pool_connection": 6, "pool_siz": [5, 6], "pooling": 6, "poor": 16, "pop": 16, "popul": [0, 6], "porqu": [2, 4, 5, 6, 8, 11], "port": [0, 2, 3, 5, 6, 15], "portability": 6, "portabl": 6, "portant": [2, 4, 5, 6, 10], "ports": 2, "por\u00e7\u00f5": 14, "posicion": 10, "position": 5, "positional": 10, "posi\u00e7\u00e3": [5, 10], "possibil": 6, "possibl": [4, 5, 6, 8, 12, 13, 14, 15, 16], "possibly": 6, "poss\u00edv": 6, "poss\u00edvel": [4, 6], "post": [4, 5, 6, 7, 10, 12, 13, 14, 15, 16], "post_action_buttons": 14, "post_text": 6, "post_vars": [7, 15], "post_writabl": 7, "posted": 7, "postel": 11, "posterior": 5, "postfix": 15, "postgr": 6, "postgreboolean": 6, "postgrenew": 6, "postgrepsyc": 6, "postgrepsycoboolean": 6, "postgrepsyconew": 6, "postgres2": 6, "postgres3": 6, "postgres_nonreserved": 6, "postgresql": [2, 6], "postgresqladapt": 6, "postprocessing": 15, "posts": 6, "potentially": 2, "pouc": [5, 6], "pow": [2, 6, 16], "powerful": [7, 13, 15], "powers": 7, "pprint": 6, "pr": 1, "practic": [8, 12], "practical": [6, 12, 13, 15, 17], "pre": [2, 4, 5, 14], "pre_action_buttons": 14, "precau\u00e7\u00e3": 2, "preced": [6, 8], "preceded": [6, 12], "precedent": 6, "preceding": 7, "precious": 14, "precis": [1, 2, 4, 5, 6, 14], "predefin": 8, "predefined": [12, 16], "predetermined": 15, "preench": 6, "preenchiment": 6, "pref": [2, 16], "prefer": 10, "preferenc": 5, "preferred": [5, 6], "prefix": [2, 4, 6, 7, 8, 12, 15], "preguic": 15, "prelimin": 1, "preocup": 6, "prepend": [12, 16], "prepend_schem": 12, "prepended": [12, 15], "prepending": 12, "prepends": 4, "preprocessing": 15, "prerequisit": [2, 5], "presenc": [5, 6], "present": [2, 6, 8, 12, 13], "presented": 13, "preserv": [0, 5], "preserved": 5, "press": [4, 14], "pression": 3, "prest": 10, "pretend": 6, "pretty": [4, 6, 15], "prevent": [6, 10, 12, 16], "prevented": 6, "preventing": 5, "prevents": [2, 5, 16], "previ": [6, 12], "previous": [5, 8, 10, 12, 13, 16], "previously": [5, 6, 12], "prim": [5, 12], "primarily": 14, "primary": [6, 8, 13], "primeir": [6, 8, 13, 17], "princip": 0, "principal": [1, 5, 6, 17], "princ\u00edpi": [6, 17], "print": [4, 5, 6, 10, 11, 13, 14, 15, 16], "printed": 4, "prioritiz": 4, "privat": [5, 12], "probability": 12, "probl": [0, 6, 8, 14], "problem": [1, 6], "problems": [6, 13, 16], "proc": [13, 16], "proced": 17, "procedur": 2, "process": [2, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16], "processed": [5, 6, 8, 12], "processing": [5, 6, 8, 12, 16], "procur": [1, 6], "produc": [6, 10, 12, 13], "product": [6, 16], "product_record": 16, "production": [2, 4], "products": 6, "produz": [2, 5, 6, 8, 10], "produ\u00e7\u00e3": 0, "professor": 13, "profil": [8, 13, 15], "progr": [1, 2, 3, 10, 13], "program": [1, 3, 6, 8], "programmatically": 10, "programming": [1, 6, 8, 16], "programs": [1, 2, 12], "project": [0, 2, 4, 5, 6], "project_nam": 2, "projet": [0, 2], "prompt": [2, 4, 6], "pront": 6, "prop": [5, 6, 14], "properly": 4, "properti": [6, 12], "propriedad": 6, "propriet\u00e1r": 6, "propriet\u00e1ri": 6, "protocol": 3, "prototyp": 16, "provavel": [4, 5, 6], "proveit": 6, "provid": [0, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16], "provided": [5, 6, 8, 10, 12, 13, 14], "providing": [0, 13, 14, 15], "provoc": 6, "proxi": 4, "proxy": 4, "proxy_http_version": 4, "proxy_pass": 4, "proxy_set_head": 4, "prudent": 6, "pr\u00e1tic": [0, 6, 7], "pr\u00e9": [10, 14, 17], "pr\u00f3pr": [13, 14], "pr\u00f3pri": [6, 14], "pr\u00f3xim": [2, 6], "pseud": 6, "psycopg2": 6, "public": [4, 6], "pud": 2, "pull": 1, "punycod": 12, "pur": 6, "purpos": [0, 6, 10, 12, 13, 15], "put": [5, 7, 12, 13, 16], "put_writabl": 7, "putting": 4, "pux": 6, "pwd": 6, "py": [1, 2, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16], "py4web": [2, 3, 4, 5, 7, 8, 10, 12, 13, 14], "py4web_filesyst": 6, "py4web_wsg": 2, "pyc": 8, "pydal": [0, 2, 3, 5, 6, 7, 12, 13, 14, 15, 16], "pyfilesyst": 6, "pyinstall": 2, "pymong": 6, "pymysql": 6, "pyodbc": 6, "pypi": 2, "pypyodbc": 6, "pysqlite2": 6, "pytds": 6, "python": [0, 2, 4, 5, 6, 8, 10, 11, 12, 13, 14, 15, 16], "python2": [2, 15], "python3": 2, "pyweb": 15, "p\u00e1gin": [8, 10, 14, 17], "p\u00f3s": 14, "p\u00fablic": 6, "q": [2, 5, 6, 14], "qua": [0, 6], "quadr": [0, 1, 6], "quaisqu": [6, 12], "qualifi": 4, "qualified": 6, "qualqu": [1, 2, 4, 5, 6, 7, 8, 13], "quand": [1, 4, 6, 8, 14], "quant": 6, "quantity": 6, "quebr": 0, "qued": 14, "queir": 5, "quer": [2, 4, 5, 6, 10], "queri": [6, 7, 14, 15, 16], "queried": 7, "query": [4, 5, 7, 10, 12, 13, 14, 15, 16], "query1": 6, "query2": 6, "queryselector": 16, "queryselectorall": 16, "querystring": 14, "questions": [1, 2], "quest\u00e3": 6, "quick": [1, 12], "quickly": [2, 12, 14], "quickstart": 16, "quiet": 2, "quirk": 5, "quis": [4, 6], "quit": [1, 2, 5, 7, 8, 12, 14], "quot": [2, 10], "quote_minimal": 6, "quote_nonnumeric": 6, "quotech": 6, "r": [2, 6, 12], "rac": 12, "radi": [10, 12], "radiowidget": 12, "radius": 16, "radix": 4, "rais": [5, 12, 13, 15], "raised": 5, "ram": [5, 6], "randint": [8, 13], "random": [6, 8, 12, 13, 16], "rang": [4, 6, 8, 13, 15], "rapid": [0, 16], "rar": 6, "rarely": 6, "rath": [6, 8, 12, 16], "raw": 17, "raz\u00f5": 6, "rb": 6, "re": [0, 1, 2, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16], "rea": 6, "reach": 2, "reached": 5, "react": 16, "reactivity": 16, "read": [1, 4, 5, 6, 7, 14, 16], "readability": 7, "readabl": [5, 6, 14, 15], "readm": [1, 12], "readonly": [2, 12, 16], "ready": 2, "reagrup": 0, "real": [2, 4, 7, 8, 12], "real_identity": [6, 7], "realiz": [3, 4, 6], "really": [1, 4], "realment": 6, "reaping": 16, "reason": [2, 5, 6, 13, 14, 15], "reasons": [2, 7], "rebuilt": 6, "rec_id": 7, "receb": [6, 8], "recent": [2, 3, 6, 12, 14], "recently": 5, "recereived": 16, "recip": 2, "reclam": 6, "recogniz": [4, 13], "recognized": 6, "recolh": [7, 14], "recomec": 6, "recomend": 6, "recommend": [1, 5, 16], "recommended": [4, 6, 12, 13], "reconstru": 6, "record": [7, 12, 13, 15, 16], "record_id": [7, 16], "recorded": 12, "records": [6, 7, 12, 13, 14, 16], "recorrent": 6, "recovered": 12, "recreat": 6, "recreated": 6, "recup": 6, "recuper": [4, 6], "recurs": [2, 8, 17], "recursively": 8, "recycl": 6, "rec\u00e9m": [4, 6, 11], "red": [0, 3, 4, 6, 8, 10, 12, 17], "redefin": 5, "redefini\u00e7\u00e3": 6, "redesign": 0, "redirecion": [4, 13, 14], "redirect": [4, 5, 12, 13, 14, 16], "redirect_url": 5, "redirected": [5, 16], "redirection": [5, 12, 15], "redirects": [5, 13], "reduc": [0, 5, 16], "reduced": 0, "redundant": 6, "reescrev": 6, "reescrit": 6, "ref": [3, 5, 6, 10, 12, 13, 17], "refer": [6, 7], "referenc": [1, 5, 6, 7, 8, 10, 12, 14, 16], "referenced": [6, 7], "referenced_by": 7, "referencing": 6, "referim": 6, "referred": [6, 7, 13], "refers": 7, "reflected": 1, "reflet": 6, "reforc": 6, "refresh": 14, "regex": [7, 10, 12], "regexlib": 12, "regist": [0, 5, 6, 8, 13, 14, 15, 16], "register_plugin": 13, "register_task": 16, "register_vue_component": 16, "registered": [5, 13], "registers": 5, "registr": [3, 4, 12, 13, 14], "registration": [4, 12], "registration_stamp": 12, "regr": [4, 5], "regul": [0, 2, 4, 6, 7, 8, 11, 12, 14, 15, 16], "reimplementation": 16, "reinic": 6, "reinstal": 2, "reinstall": 2, "reinstat": 6, "rejected": [12, 13], "rejects": 12, "rel": [8, 14], "relacion": 6, "relat": 6, "related": [5, 6], "relational": 6, "relations": 17, "relationships": 6, "relativ": [4, 15], "rela\u00e7\u00e3": 10, "rela\u00e7\u00f5": 6, "releas": 2, "released": 0, "relev": 6, "reload": [2, 3, 4, 5, 12], "reloaded": [3, 4, 16], "reloading": [2, 4, 5], "reloads": [4, 5], "rely": [0, 4, 6], "rem": 5, "remain": [6, 12], "remains": 0, "rememb": [5, 6], "remembered": 5, "remote_addr": [5, 13], "remov": [2, 4, 6, 10, 12, 13], "removal": 12, "removed": [0, 6, 10, 12], "removing": 6, "remo\u00e7\u00e3": 6, "rend": [5, 6, 12, 14, 15, 16], "rendered": [5, 7, 8, 12, 14, 15, 16], "rendering": [8, 10], "renderiz": 10, "renders": 12, "reno": 8, "renom": 7, "reopening": 5, "repackaging": 0, "repeated": 12, "repeti\u00e7\u00e3": 6, "replac": [1, 4, 6, 8, 10, 14, 16], "replaced": [8, 10, 12, 16], "replacing": 12, "replicat": [1, 5], "report": 8, "reported": 4, "repository": [1, 2, 3], "reposit\u00f3ri": 2, "repr_row": 6, "represent": [8, 10, 12], "representation": [6, 10, 16], "representational_state_transf": 7, "represented": 12, "representing_field": 12, "represents": [0, 6], "requ": [0, 5, 6, 12, 13, 14, 15, 16], "request": [0, 1, 2, 5, 6, 7, 12, 13, 14, 15, 16], "request_body": 16, "request_reset_password": 13, "request_ur": 4, "requests": [1, 4, 5, 15], "requir": [2, 5, 6, 12, 13], "required": [4, 5, 6, 7, 12, 16], "requirement": [12, 16], "requirements": [0, 2, 12], "requires_": 15, "requires_login": 15, "requires_membership": 13, "requiring": [2, 15], "requisit": [6, 17], "res": 16, "reserv": 11, "reserved": [6, 12], "reset": 6, "reset_password": 13, "resgat": 6, "resourc": [6, 13], "respect": [6, 12, 14], "respectively": [6, 12], "respons": [4, 5, 6, 8, 15, 16, 17], "responsibility": 6, "responsibl": [14, 16], "respost": [5, 8], "ressalv": 6, "restabelec": 6, "restap": [0, 3, 17], "restart": [2, 4, 5, 6, 14], "restarting": 6, "restaur": 6, "restful": [7, 13], "restrict": [5, 7, 12, 16], "restri\u00e7\u00e3": 6, "restri\u00e7\u00f5": [0, 6], "restructuredtext": 1, "result": [1, 4, 6, 7, 8, 12, 13, 14, 16], "resulting": [8, 12, 16], "results": [4, 6, 8, 12, 14], "ret": 6, "retain": 6, "retorn": [5, 8, 10], "retribu": 10, "retriev": [5, 6, 13, 16], "retrieval": 6, "retrieved": [5, 15], "return": [4, 5, 6, 7, 10, 12, 13, 14, 16], "returned": [4, 5, 6, 7, 8, 10, 12, 13, 16], "returning": 5, "returns": [5, 6, 7, 10, 12, 13, 15, 16], "reutiliz": [2, 6], "revers": [4, 5, 6], "revers\u00e3": 4, "revert": 6, "rfc": 12, "rid": 6, "riding": 8, "right": [5, 6, 8], "rights": 2, "road": 16, "robust": 16, "rocket": [2, 15], "rocket3": [2, 15], "rocketserv": 2, "rodap": 10, "rol": [5, 10], "roll": 6, "rollback": 16, "rolls": 5, "root": [6, 8, 13, 14], "rosc": 5, "rot": [3, 14], "rotul": 6, "rout": [2, 4, 5, 14, 15, 16], "routing": [0, 2, 4, 15], "rov": 6, "row": [12, 14, 16], "rows": [10, 12, 14, 15], "rows1": 6, "rows2": 6, "rows3": 6, "rows_list": 6, "rows_per_pag": 14, "rpc": 6, "rst": 1, "rul": [8, 12, 14], "run": [1, 3, 4, 6, 8, 13, 16], "run_in_transaction": 6, "running": [1, 2, 4, 5, 16], "runs": [2, 4, 13, 15, 16], "r\u00e1di": 10, "r\u00e1p": [0, 6], "r\u00f3tul": [6, 10, 14], "s": [0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 13, 14, 16], "s3": 6, "s_": [12, 16], "s_autocomplet": 16, "s_autocomplete_results": 16, "s_down_key": 16, "s_search": 16, "sab": [1, 2, 6, 8], "sacrific": 13, "saf": [1, 6, 12, 14, 15], "safar": 16, "safely": [1, 14], "safety": 16, "said": 7, "sair": 13, "sak": 6, "salt": [1, 12], "salv": [4, 6, 11], "sam": [0, 2, 4, 5, 6, 7, 8, 12, 13, 15, 16], "same_sit": 5, "saml": 13, "saml2": 0, "sampl": 13, "san": 4, "sandbox": 16, "sanitiz": [5, 10, 12, 15], "sanitized": 12, "sant": 1, "sap": 6, "sapdb": 6, "sapdbadapt": 6, "sass": 4, "sass_compil": 4, "sav": [1, 5, 6, 11, 12], "saved": [2, 5, 6, 12], "say": 13, "sa\u00edd": [2, 4, 6, 8, 10], "scaffold": [2, 4, 16], "scaffold_zip": 2, "scaffolding": [2, 4, 5, 6, 8, 12, 15, 16], "scal": [5, 8], "scan": 6, "schaf": 1, "schedul": 17, "scheduled": 16, "scheduled_for": 16, "schem": [4, 6, 12], "school": 13, "scor": 16, "score_input": 16, "scratch": 4, "script": [2, 8, 12, 13, 16], "scripting": 10, "scripts": [2, 8, 10], "sdk": 2, "seamlessly": 8, "search": [0, 12, 13, 14, 17], "search_button_text": 14, "search_form": 14, "search_queri": 14, "search_text": 14, "search_valu": 16, "searchabl": 6, "searched": [10, 14], "searching": [6, 10], "second": [6, 10, 12, 13, 15], "seconds": [5, 12], "secret": [5, 13], "secs": 16, "section": [2, 4, 6, 8, 12, 13], "sections": 6, "secur": [0, 12], "securely": 2, "security": [0, 2, 6, 7, 13], "see": [0, 1, 3, 4, 5, 6, 8, 10, 12, 13, 14, 16], "seem": 6, "seen": [0, 5, 7, 10, 12, 13, 14, 16], "seesions": 13, "seg": 4, "segment": 4, "segred": 13, "segu": [2, 4, 5, 6, 8], "seguint": [2, 4, 5, 6, 8, 10, 11, 12, 13, 14], "segund": 6, "segur": [0, 5], "seguranc": [2, 5, 6, 10], "seis": 6, "sej": [4, 6], "seleccion": 6, "selecion": [3, 6], "select": [4, 5, 7, 11, 12, 13, 14, 15, 16, 17], "selected": [3, 4, 7, 10, 12, 14, 16], "selected_elements": 16, "selected_id": 14, "selectedindex": 16, "selecting": 6, "selection": [12, 14], "selections": 12, "selector": [10, 16], "selector1": 10, "selector2": 10, "selectorn": 10, "selectwidget": 12, "selec\u00e7\u00e3": 6, "sele\u00e7\u00e3": [6, 10], "self": [2, 5, 6, 10, 12, 13, 14, 16], "semantic": [12, 13], "semelh": [0, 4, 5, 6, 10], "sempr": [6, 8], "send": [2, 6, 12, 13, 16], "send_two_factor_email": 13, "sendgrid": 16, "sendgrid_api_key": 16, "sendgridapiclient": 16, "sending": 17, "sendmail": 16, "sendmail_task": 16, "sends": 13, "senh": [0, 2, 3, 5, 6, 13], "sens": [0, 6, 12], "sensitiv": [5, 12], "sens\u00edvel": 6, "sent": [5, 6, 13, 16], "sen\u00e3": 6, "separ": [6, 14], "separat": [4, 5, 6, 12, 13, 16], "separated": [2, 5, 6, 14, 16], "separating": [8, 12], "separator": 12, "sequenc": [5, 6], "sequencial": 6, "sequ\u00eanc": 6, "seq\u00fcenc": 6, "seq\u00fc\u00eanc": 6, "ser": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14], "seri": 1, "serializ": [4, 6, 8, 10], "serializabl": [0, 5, 6], "serialized": [5, 6, 10, 12], "serv": [0, 2, 3, 4, 7, 8, 13, 15, 16, 17], "served": [2, 4, 6], "server_addr": 6, "server_nam": 4, "servers": [2, 6], "serversid": [13, 16], "servidor": [0, 4, 5, 6], "serving": [5, 16], "ser\u00e3": [4, 6, 10], "session": [0, 2, 4, 6, 10, 12, 13, 14, 15, 16, 17], "session_app1": 5, "session_secret_key": 5, "sessions": [0, 6, 15], "sess\u00e3": [4, 17], "sess\u00f5": 5, "set": [0, 1, 2, 5, 7, 8, 10, 11, 14, 15, 16], "set_attribut": 6, "set_encoding": 6, "set_head": 6, "set_password": 3, "setinterval": 16, "sets": [2, 5, 6, 12], "setting": [2, 4, 5, 6, 12, 14], "settings": [1, 4, 5, 6, 10, 13, 15, 16], "setup": [1, 3, 4, 13, 16], "setvirtualfields": 6, "several": 4, "severity": 6, "se\u00e7\u00e3": 6, "se\u00e7\u00f5": 6, "sf": 16, "sftp": 6, "sg": 16, "sh": 16, "sha512": [8, 12], "shar": [5, 6, 15], "shared": 5, "shell": 10, "ships": 8, "sho": 6, "shopping": 5, "short": [12, 13, 16], "shortcut": [6, 8, 12], "should": [1, 2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "show": [2, 5, 6], "show_id": 14, "showcas": 6, "showed": 13, "showing": [13, 14], "shown": [2, 4, 5, 6, 12, 13], "shows": [4, 8, 12, 13], "shutil": 6, "si": [6, 14], "sid": [6, 13, 16, 17], "sideb": 8, "sidebar_enabled": 8, "sidebar_menu": 10, "sidec": 16, "sign": [5, 8, 13], "signatur": [5, 6, 7, 10, 12, 16], "signed": [2, 5, 12, 13], "signed_url": 5, "signif": [5, 6, 7], "signific": [6, 8], "significant": 8, "signing": 5, "signing_inf": 12, "signs": 5, "sim": 6, "simbol": 2, "simb\u00f3l": 4, "simil": [0, 4, 12, 15], "similar": [6, 10], "similariti": 15, "simmil": 4, "simpl": [1, 2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 16, 17], "simple_query": 16, "simple_token_plugin": 13, "simples": [4, 6, 11], "simplest": 2, "simplicity": [6, 16], "simplific": 6, "simplified": [0, 4, 8], "simply": [2, 4, 5, 6, 8, 12, 16], "simultan": 6, "simult\u00e2n": 6, "sinal": 6, "sinc": [0, 4, 5, 7, 8, 14, 15], "singl": [2, 4, 5, 6, 7, 8, 12, 13, 14], "singleton": [5, 15], "sintax": [4, 6, 10, 13, 17], "sint\u00e1t": 5, "sistem": [0, 2, 5, 6], "sit": [1, 2, 4, 5, 6, 10, 14, 16], "situa\u00e7\u00e3": 6, "siz": [5, 8, 12], "skip": [5, 16], "slash": [1, 4, 5, 13], "sleep": 16, "sleep_tim": 16, "slick": 0, "slow": [6, 16], "slug": 12, "small": [5, 12], "sms": 16, "smtplib": 16, "snippets": 6, "so": [2, 5, 6, 8, 10, 12, 13, 14, 15, 16], "soap": 10, "sob": [4, 6], "sobr": [0, 8], "sobrecarg": 6, "soch": 0, "sockets": 16, "solicit": [0, 6], "solt": 6, "solution": [0, 2, 16], "solu\u00e7\u00e3": [1, 6], "som": [0, 1, 2, 4, 5, 6, 7, 8, 10, 12, 13, 15, 16], "some_condition": 8, "some_form": 12, "some_valu": 6, "somefield": 6, "somefil": 6, "soment": [2, 4, 6, 8], "somepath": 5, "sometabl": 6, "something": [4, 6, 7, 8, 10, 12, 13, 14, 16], "sometim": [5, 6, 8, 10, 12, 13], "somevalu": 6, "somewhat": 12, "somewher": [5, 6], "soon": [8, 16], "sophisticated": 15, "sort": 12, "sorted": 14, "sorting": 12, "sourc": [1, 2, 3, 4, 6, 12, 16], "source1": 12, "south": 1, "sp": 6, "spac": [6, 8, 12, 14], "span": [4, 15], "spatialit": 6, "speaking": 5, "special": [0, 4, 5, 6, 8, 13, 15, 17], "specialization": 6, "specials": 12, "specifi": 5, "specific": [2, 4, 5, 6, 8, 10, 12, 13, 15, 16], "specifically": [5, 6, 12, 16], "specifications": 7, "specified": [5, 6, 8, 10, 12, 13, 14, 15, 16], "specify": [2, 4, 5, 6, 7, 12, 13, 14, 16], "specifying": 10, "speed": [7, 8], "sphinx": 1, "spiderman": [7, 14], "spin": [0, 4], "spirit": 7, "split": [6, 7, 8, 12], "split_emails": 12, "sql": 17, "sql_mod": 6, "sqladapt": 6, "sqlcustomtyp": 6, "sqlform": [0, 12, 15], "sqlforms": 12, "sqlit": [1, 5, 7, 13, 14, 16], "sqlite3": 6, "sqliteadapt": 6, "squar": 8, "src": [6, 8, 10, 12, 16], "ss": 12, "ssl": [2, 4], "ssl_cert": 2, "ssl_key": 2, "sslcert": 6, "sslkey": 6, "sslmod": 6, "sslrootcert": 6, "sso_id": [5, 13], "stabl": 2, "stand": 12, "standard": [2, 3, 6, 7, 13, 14, 15, 16, 17], "standards": [12, 14], "stands": 10, "start": [1, 2, 3, 4, 5, 6, 10, 12, 13, 14, 16], "start_impersonating": 13, "started": 16, "starting": [2, 4, 12], "starts": [0, 3, 5, 8, 15], "startup": [6, 15], "stat": [5, 7, 15, 16], "stated": 5, "stateful": 5, "stateless": [5, 16], "statement": 8, "statements": [8, 12], "static": [1, 4, 8, 10, 15], "static_dev": 4, "status": [7, 16], "status_cod": 16, "stderr": [2, 16], "stdout": [2, 16], "steil": [0, 1, 14], "step": [13, 15], "step1": 5, "step2": 5, "step3": 5, "step_completed": 5, "stepping": 16, "steps": 2, "still": [5, 6, 10, 12, 13, 14, 15], "ston": 14, "stop": [2, 13], "stop_impersonating": 13, "stor": [5, 6, 12, 13, 16], "storag": [6, 7, 14], "stored": [0, 5, 6, 12, 13, 15, 16], "stored_it": 6, "stored_item_archiv": 6, "storing": 5, "story": [0, 13], "str": [2, 5, 6, 10, 12, 15, 16], "stre": [5, 6], "streaming": [4, 15], "strength": 7, "strict": 12, "strictly": [4, 6, 16], "string": [4, 5, 6, 7, 10, 11, 12, 13, 14], "stringi": 6, "stringlistproperty": 6, "strings": [10, 12, 14], "strip": 12, "stripped": [2, 15], "strong": [0, 10, 13], "strongly": [1, 5, 12, 14], "structur": [1, 4, 6, 13, 14, 15, 17], "stuck": 2, "students": 2, "studi": 1, "study": 1, "stuff": [12, 14], "style": [4, 6, 8, 12, 16, 17], "styles": 14, "stylesheet": [8, 14], "styling": 14, "sub": 6, "subcl": 6, "subclassing": 12, "subconjunt": [0, 6], "subfold": 6, "subfolders": [5, 6], "subheadings": 10, "subject": [6, 7, 13, 16], "sublinh": 6, "submet": 12, "submission": [12, 16], "submit": [1, 5, 6, 10, 12, 14], "submits": 13, "submitted": [13, 14, 16], "submitting": 13, "subm\u00f3dul": 0, "subnet": 12, "subnets": 12, "subpast": 4, "subqueri": 16, "subset": 12, "subse\u00e7\u00e3": 6, "substitu": [0, 2, 6, 8, 10], "substitui\u00e7\u00f5": 14, "substitutions": 8, "substitu\u00edd": 6, "substring": [6, 12], "succeeded": [0, 13], "success": [5, 7, 16], "successful": [0, 13], "successfully": 13, "suced": 6, "sucess": [4, 6], "such": [4, 6, 10, 12, 13, 14, 15], "sud": [2, 13], "suffered": 0, "suffers": 13, "sufficient": 13, "suficient": [6, 14], "suger": [1, 6], "sugest\u00f5": 17, "suggest": [1, 12], "sugiz": 0, "sup": [5, 7], "super": 6, "superher": [6, 7, 12, 14, 16], "superhero": 7, "superior": 11, "superman": [6, 7, 12, 14], "superpotent": 7, "superpow": [6, 7], "superseeded": 6, "supond": [2, 6], "suponh": 6, "supor": 6, "suport": [0, 11, 17], "supplied": 10, "support": [1, 2, 6, 12, 14, 15], "supported": [11, 12, 13], "supporting": 16, "supports": [4, 5, 8, 10, 12, 16], "suppos": 5, "suppress": 2, "suprim": 10, "sur": [5, 12, 13, 16], "surely": [3, 4], "surrounding": 12, "susan": 6, "sutil": 6, "sv": 6, "switch": [2, 5, 6], "sybas": 6, "sybaseadapt": 6, "symbol": 12, "symbols": 12, "sync": [2, 6], "synops": 12, "syntactic": 12, "syntax": [0, 1, 4, 5, 6, 7, 8, 10, 12, 13, 15, 16], "system": [0, 2, 5, 6, 10, 13, 16], "systems": 16, "sysus": 6, "s\u00e3": [0, 1, 3, 4, 5, 6, 8, 10, 11, 13, 14], "s\u00e9ri": 6, "t": [0, 2, 4, 5, 6, 8, 10, 11, 12, 13, 14, 15], "t_fold": 5, "tab": [3, 5, 12], "tabel": [5, 10, 13, 14, 15], "tabl": [5, 7, 12, 13, 14, 15, 16, 17], "table1": 6, "table_hash": 6, "table_nam": 6, "tablenam": [6, 7, 12, 16], "tag": [0, 5, 6, 7, 8, 13, 15, 16], "tag_input": 16, "tagg": 10, "tagged_db": 13, "tagging": [6, 10, 13], "tags": [0, 5, 6, 8, 10, 12, 15, 16, 17], "tags_input": 16, "tags_inputs": 16, "tail": 6, "tail_nam": 13, "tais": 6, "tak": [2, 3, 5, 6, 8, 12, 13, 14, 16], "taken": 12, "tal": 6, "talk": 4, "talvez": [2, 5], "tamanh": 6, "tampering": [5, 6], "tant": [6, 16], "tantissim": 11, "tap": 16, "tar": 12, "tard": [4, 6], "taref": [1, 6, 13], "target": [10, 16], "task": 17, "task_run": 16, "tasks": [5, 6, 16], "tast": 6, "tbody": 6, "tcp": 3, "td": 6, "teach": 13, "technically": 16, "tecl": [6, 11], "tell": [4, 13, 16], "telling": [2, 13], "tells": [5, 16], "temp": [2, 8], "templat": [0, 4, 10, 12, 13, 15, 16, 17], "temporarily": 5, "tempor\u00e1ri": 6, "ten": 12, "tenancy": 6, "tenh": [1, 5, 6], "tent": [5, 6], "ter": [2, 4, 5, 6, 10], "teradat": 6, "teradataadapt": 6, "terceir": 6, "tered": 12, "term": 6, "termin": 10, "terminal": 4, "terminat": [8, 16], "termination": 4, "terms": 12, "terr": 6, "ter\u00e3": 6, "test": [2, 5, 6, 8, 10, 12, 14], "test1": 13, "test_ap": 13, "tested": [0, 2, 10, 13], "testing": [4, 6], "text": [2, 5, 6, 8, 10, 14, 16], "textar": 12, "textareawidget": 12, "textual": [10, 13], "th": 6, "than": [0, 4, 5, 6, 8, 10, 12, 13, 14, 16], "thank": 10, "thanks": 0, "that": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "that_templat": 8, "the": [0, 3, 8, 10, 11, 13, 15, 17], "thead": 6, "them": [0, 1, 2, 4, 5, 6, 7, 8, 12, 13, 14, 15, 16], "themselv": [6, 8], "then": [2, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16], "ther": [1, 2, 4, 5, 6, 8, 12, 13, 14, 15, 16], "therefor": [4, 5, 8, 12, 15], "thes": [2, 4, 5, 6, 8, 10, 12, 14, 16], "they": [2, 4, 5, 6, 7, 8, 12, 13, 15, 16], "thing": [5, 6, 12, 14, 15], "thing_id": 12, "thing_tags_default": 6, "things": [2, 5, 6, 12], "think": [5, 8, 14, 16], "third": [0, 5, 12], "this": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "this_templat": 8, "thisisatest": 10, "thisisthekey": 12, "thos": [5, 6, 8, 10, 13, 15, 16], "though": 8, "thought": [0, 6, 13], "thre": [0, 5, 6, 13], "thread": [5, 6, 15, 16], "threaded": [2, 15], "threads": [5, 6], "threadsafevariabl": 5, "through": [2, 12], "throughout": 5, "thumbnail": 12, "thus": 5, "ti": 5, "ticket": 6, "tickets_only": 2, "til": 6, "tim": [0, 4, 5, 6, 8, 13, 14, 15, 16], "timed": 6, "timedelt": [12, 13], "timeoffset": 10, "timeout": [5, 16], "timeouts": 16, "timestamp": [5, 7, 16], "tint": 4, "tip": [4, 14], "tips": [2, 14], "tir": 6, "titl": [8, 12, 16], "tiv": 6, "tmp": [5, 6], "to": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16], "to_addr": 16, "to_addrs": 16, "tod": [1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16], "today": [0, 12, 16], "togeth": [0, 8], "token": [5, 12], "token_plugins": 13, "tokens": 13, "tom": 6, "too": [2, 5, 6, 12, 16], "took": 6, "tool": 0, "tools": [6, 13, 16], "top": [8, 12, 13], "topics": [14, 17], "torn": [1, 2, 5, 6, 10, 14], "tosupport": 13, "total": [1, 6, 7], "total_pric": 6, "totp": 13, "touch": 8, "toy": 6, "tr": 6, "trabalh": [2, 6, 7], "traceback": 6, "tracebacks": 5, "track": [1, 15], "trad": 6, "tradicion": 6, "tradicional": 6, "traditional": 2, "tradutor": 4, "traduz": [1, 6, 8, 11], "tradu\u00e7\u00e3": [5, 17], "tradu\u00e7\u00f5": [5, 11], "trailing": [2, 12], "training": 1, "transaction": [5, 6], "transactional": 16, "transactions": 6, "transa\u00e7\u00f5": 6, "transform": [4, 5, 6, 12, 16], "transformed": [5, 6], "transforms": 5, "transitions": 16, "translat": 16, "translated": [5, 8, 12], "translation": [5, 12, 15], "translations": [5, 11, 16], "translator": [2, 11, 17], "transmit": 3, "transparent": [6, 8, 12], "transparently": 8, "trapped": 16, "trat": [4, 6], "tre": [4, 8, 12], "treated": [6, 15], "tri": [6, 13, 15], "trickery": 8, "tricks": 2, "tried": 0, "trigg": [6, 16], "triggers": 5, "trivial": [5, 6], "tru": [1, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "trunc": 6, "truncat": 6, "truth": 16, "try": [2, 4, 5, 6, 8, 12, 13, 16], "trying": [1, 12, 13], "tr\u00e1s": 6, "tr\u00eas": 6, "ttl": 5, "tud": [5, 6], "tupl": [6, 8, 10], "turn": [12, 13, 14, 16], "turned": 0, "turns": [6, 16], "tutorial": [1, 2, 4, 14, 16], "tutorials": 1, "twic": [5, 6], "twili": 16, "twitt": [0, 5, 13], "two": [1, 2, 4, 5, 6, 8, 12, 14, 15, 16], "two_factor": 13, "txt": [0, 2, 4, 6], "type": [1, 2, 5, 7, 8, 10, 13, 16], "types": [4, 12, 13], "typical": [5, 6, 12], "typically": [4, 8], "t\u00eam": [2, 4, 6, 13], "t\u00edpic": 6, "t\u00edtul": [3, 10, 14], "t\u00f3pic": 6, "u": [2, 6, 10], "ubuntu": 13, "uc": 1, "ui": [5, 13], "uid": 6, "ul": [8, 12, 13, 16], "un": [8, 10, 11, 16], "unauthenticated": [5, 6, 10], "unauthorized": 6, "unavailabl": 2, "unchanged": 12, "undefined": 5, "under": [2, 3, 4, 5, 6, 12, 13], "underlying": 15, "underscor": [6, 10, 12], "understand": [0, 2, 4, 6, 7, 8], "understanding": 17, "undocumented": 16, "unfortunat": 6, "unfortunately": 14, "unicod": [6, 12], "unicodedecodeerror": 6, "unid": 6, "uniform": 6, "uniqu": [6, 7, 12, 13], "unit_pric": 6, "unit\u00e1ri": 6, "universal": [4, 6, 10], "uni\u00e3": 6, "unknown": 4, "unless": [3, 5, 6, 8, 12, 16], "unlik": [0, 2, 7, 8, 15, 16], "unnamed": 6, "unneded": 2, "unordered": 10, "unpkg": 16, "unquoted": 10, "uns": 5, "unsaf": [5, 10, 12, 13], "untested": [2, 13], "until": [0, 5, 6, 8, 12], "un\u00e1ri": 6, "up": [1, 2, 5, 6, 8, 13, 16], "updat": [2, 5, 12, 14, 15, 16], "update_form": 12, "update_languag": 11, "update_naiv": 6, "update_thing": 12, "updated": [5, 6, 12], "updating": 5, "upgrad": [2, 6], "upgraded": 2, "upload": [4, 6], "upload_fold": [6, 12], "upload_help": 16, "uploaded": [6, 12, 15], "uploadfield": 6, "uploadfold": 6, "uploadfs": 6, "uploads": 6, "uploadseparat": 6, "upon": [2, 13, 15], "upper": [4, 5, 12], "upper_cas": 5, "uppercas": [5, 12], "uri": 13, "uris": 6, "url": [4, 5, 7, 8, 12, 13, 14, 15, 16], "url_prefix": 2, "url_sign": 5, "url_to_post_t": 16, "urls": [2, 4, 12, 15], "urlsign": 17, "us": [2, 12], "usa": [0, 4, 5, 6, 8], "usabl": 14, "usad": [0, 4, 6, 10, 11, 13, 14], "usag": [2, 3, 4, 5, 6, 10, 12, 13, 14], "usam": 6, "usand": [4, 5, 8, 10, 13, 17], "usar": [2, 4, 5, 6, 8, 10, 14], "use": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "use_schedul": 16, "used": [2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "useful": [2, 4, 8, 10, 12, 13, 14, 16], "usefull": 12, "useless": [12, 15], "user": [2, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16], "user_email": 15, "user_id": [5, 6, 13, 15], "user_nam": 6, "user_outside_network": 13, "user_password": 6, "user_token": 6, "usernam": [5, 6, 13], "users": [0, 1, 4, 5, 13, 15], "uses": [0, 1, 2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "using": [0, 1, 3, 4, 7, 12, 15, 17], "uso": [2, 5, 14], "usos": 6, "usou": [5, 6], "usual": [2, 8, 10, 12], "usually": [1, 5, 7, 12], "usu\u00e1ri": [1, 2, 3, 4, 5, 6, 13, 15], "us\u00e1": [2, 6, 8], "utcnow": [5, 6, 13], "utf": 6, "utf8": 6, "utf8mb4": 6, "utility": [2, 12], "utiliz": [2, 3, 4, 5, 6, 10, 13, 14], "utilizing": 14, "utils": [2, 4, 5, 8, 10, 12, 13, 14, 15, 17], "uuid": [5, 6, 13], "uuid4": [5, 6], "uuids": 6, "v": [5, 10, 12, 16], "v3": 1, "vai": [1, 4, 6, 8], "val": 14, "val1_row1": 6, "val1_row2": 6, "val2_row1": 6, "val2_row2": 6, "valid": [4, 5, 6, 10, 13, 15, 17], "validat": [6, 12, 13], "validate_cod": 13, "validate_js": 4, "validated": [12, 13], "validating": 13, "validation": [4, 6, 7, 8, 13, 14], "validator": [6, 12], "validators": [2, 15], "validity": 12, "valios": 1, "valor": [5, 10, 11, 12, 14], "valq7711": 0, "vals": 16, "valu": [2, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 16], "valuabl": 13, "value1": 6, "value2": 6, "value_field": 12, "valued": 12, "vam": [1, 6, 10], "vantag": 6, "vantagens": 6, "var": 16, "varch": 6, "vari": 6, "variabl": [5, 6, 10, 12, 14, 16], "various": 5, "vari\u00e1vel": [4, 6, 10, 11], "varredur": 6, "vars": [6, 10, 12, 15], "vaz": 6, "vazi": [2, 6], "ve": [2, 3, 5, 8, 10, 12, 13, 14, 16], "vej": [2, 3], "veloc": 6, "vem": [0, 4, 6], "vendor": 16, "vendor_typ": 16, "vendors": 16, "venv": 2, "ver": [2, 6, 13], "verd": 4, "verdad": 14, "verdadeir": [6, 12, 14], "verif": 6, "verific": [5, 6, 13], "verification": 13, "verified": [5, 12, 16], "verify": 5, "verify_email": 13, "verifying": 13, "vermelh": 4, "vers": 5, "version": [1, 3, 7, 8, 12, 16], "versions": [2, 5, 12], "vers\u00f5": 6, "vertic": 6, "verticaadapt": 6, "very": [0, 4, 8, 10, 12, 13, 15, 16], "veryfing": 13, "vez": [2, 4, 5, 8, 10, 13, 14], "ve\u00edcul": 5, "via": [5, 6, 8, 10, 13, 16], "vias": 6, "vic": 5, "vid": [1, 2, 16], "view": [1, 5, 6], "viewing": 6, "viewport": 8, "views": 6, "vincul": 6, "vind": 2, "vir": 13, "virtual": [1, 17], "virtualenv": [1, 2], "virtualfields": 6, "visit": [3, 5, 12], "visit_log": 5, "visited": [5, 8], "visiting": [5, 13], "visitor": 6, "visitors": [10, 12], "visits": 6, "vist": [5, 6, 10], "visual": 1, "visualiz": 6, "vis\u00e3": 6, "vis\u00edvel": 4, "vital": 13, "voc": [1, 2, 3, 4, 5, 6, 8, 10, 13, 14], "volt": [5, 6], "vou": 2, "vscod": 2, "vue": [0, 4, 16], "vulner": 8, "v\u00e1l": 4, "v\u00e1r": [2, 4, 5, 6], "v\u00e1ri": [4, 5, 6, 11], "v\u00e3": 6, "v\u00ea": 6, "v\u00edrgul": 6, "v\u00f4o": 7, "w": [2, 4, 5, 6], "w2p_even": 6, "w2p_odd": 6, "waitress": 2, "want": [2, 4, 5, 6, 8, 12, 13, 16], "wanting": 16, "wants": [4, 5], "warning": [2, 5], "was": [0, 5, 6, 12, 13, 14], "watch": [1, 2, 3, 17], "watched": 4, "way": [2, 3, 5, 6, 8, 10, 12, 13, 15], "wayn": [7, 14], "ways": [0, 2, 4, 6, 13, 14, 16], "wb": 6, "we": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "web": [0, 1, 2, 5, 6, 8, 13, 14, 15, 16, 17], "web2py": [0, 1, 2, 3, 4, 5, 6, 12, 13, 14, 17], "websit": [6, 16], "websocket": 16, "websockets": 2, "welcom": [4, 5, 8, 15, 16], "well": [0, 4, 5, 6, 8, 12, 13, 16], "wer": [0, 4], "what": [4, 5, 6, 8, 12, 13, 15, 16], "whatev": [10, 16], "when": [0, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "whenev": 4, "wher": [1, 2, 4, 6, 8, 12, 13, 15, 16], "wheth": [5, 6, 12, 13, 15], "which": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "whichev": 16, "whil": [4, 5, 6, 7, 12, 13, 14, 15], "whit": [10, 16], "whitelist": 13, "who": [0, 13], "whol": [4, 12], "whos": [5, 6, 8, 12], "why": [5, 8, 15], "widget": [6, 12], "widgets": [6, 16, 17], "width": [8, 12], "wik": [6, 7], "wikiped": [6, 7], "wild": 6, "wildcard": 4, "will": [1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "willing": 13, "window": [5, 8, 12], "windows": [1, 2, 4, 6], "wish": 16, "wishing": 12, "wit": 2, "with": [0, 1, 2, 3, 4, 7, 8, 10, 16, 17], "with_al": 6, "within": [0, 1, 5, 6, 8, 10, 12, 16], "without": [6, 8, 10, 13, 16, 17], "wolf": 0, "wood": 6, "words": [5, 14], "work": [0, 2, 4, 5, 6, 8, 10, 12, 16], "worked": [0, 16], "workers": 2, "workflow": [5, 17], "working": [2, 12], "workload": 6, "workplac": 1, "works": [2, 6, 8, 12, 13, 14, 15, 16], "workspacefold": 2, "world": [4, 5, 6, 8, 10, 12, 13, 16], "worry": 4, "worth": 8, "would": [0, 4, 5, 6, 10, 12, 13, 16], "wouldn": 6, "wrap": [12, 14, 16], "wrapp": 16, "wrapped": 5, "wrappers": 15, "writ": [2, 4, 5, 6, 8], "writabl": [5, 6, 12, 15], "writing": [4, 6, 15], "written": [1, 8, 12, 14], "wrong": [0, 5, 6], "wsgi": 5, "wsgiref": 2, "www": [2, 8, 10, 14, 16], "x": [2, 4, 6, 8, 10, 12, 14, 16], "xml": [8, 12, 15, 16], "xmlescap": 10, "xmlns": 10, "xss": [6, 8, 10], "xyz": [10, 12], "y": [2, 10, 12], "yaml": 2, "yatl": [0, 4, 5, 6, 12, 14, 16, 17], "yb": 10, "year": [12, 16], "yes": [2, 6, 16], "yes_or_n": 6, "yet": [0, 2, 4, 5, 8, 12, 16], "yml": 2, "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "your": [1, 2, 3, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16], "your_app": 12, "your_full_path_to_py4web": 1, "your_nam": [1, 16], "yourapp": 6, "yourappnam": 2, "youremail": 13, "yourself": [1, 12], "youtub": [2, 6], "yyyy": 12, "z": [10, 12], "zanferrar": 0, "zap": 13, "zap_id": 13, "zapp": 13, "zapped": 13, "zer": [6, 8, 12, 14], "zip": [0, 2, 6, 12], "zip_cod": 16, "zxjdbc": 6, "\u00c0s": [6, 10], "\u00e1rvor": 4, "\u00e2mbit": 4, "\u00e9": [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 17], "\u00e9poc": 6, "\u00edndic": 4, "\u00f3bvi": [6, 8], "\u00f3ptim": 4, "\u00faltim": [5, 6, 13], "\u00fanic": [0, 2, 6, 10], "\u00fate": [1, 6], "\u00fatil": 6}, "titles": ["O que \u00e9 py4web?", "Ajuda, recursos e dicas", "Instala\u00e7\u00e3o e coloca\u00e7\u00e3o em funcionamento", "O Dashboard", "Creating an app", "Fixures", "The Database Abstraction Layer (DAL)", "The RestAPI", "Linguagem de template YATL", "<no title>", "Helpers YATL", "Internacionaliza\u00e7\u00e3o", "Foruml\u00e1rios", "Authentication and authorization", "Rede", "De web2py para py4web", "Advanced topics and examples", "py4web: o manual de refer\u00eancia"], "titleterms": {"A": [3, 6, 10, 12], "As": 1, "Comando": 6, "Como": 1, "De": 15, "Do": 4, "EM": 10, "Em": 4, "Este": 1, "Mais": 6, "O": [0, 1, 3, 4, 5, 6], "OS": 15, "Os": [6, 14], "Um": [1, 6], "_lastsql": 6, "_scaffold": 4, "about": 5, "abstraction": 6, "accessing": 15, "acknowledgments": 0, "actions": [7, 13], "adapt": 6, "adicion": 6, "advanced": [12, 16], "agrup": 6, "ajud": 1, "aka": 2, "alias": 6, "alon": 6, "amostr": 14, "an": 4, "and": [6, 7, 8, 12, 13, 14, 15, 16], "antig": 6, "any_of": 12, "anywher": 5, "api": 13, "aplic": 6, "app": [2, 4, 6], "apps": 4, "args": 15, "arquiv": 11, "as_dict": 6, "as_list": 6, "assinatur": 6, "asynci": 16, "atalh": 6, "atribut": 6, "atualiz": [6, 11], "aut": 6, "autentic": 13, "auth": [5, 13, 15], "authentication": 13, "authorization": 13, "autocomplet": 16, "avanc": 6, "avg": 6, "a\u00e7\u00e3": 14, "background": 16, "banc": 6, "bas": 6, "basic": [12, 14], "beautify": 10, "belongs": 6, "bin\u00e1ri": 2, "block": 8, "body": 10, "bot\u00e3": 14, "bot\u00f5": 14, "built": 10, "b\u00e1sic": 8, "cach": 6, "caching": 5, "cad": 6, "call": 2, "callabl": 14, "calling": 15, "camp": [6, 14], "caracter\u00edst": 6, "cas": 6, "cascad": 6, "cat": 10, "caveats": 5, "celery": 16, "cham": 6, "chang": 4, "chav": 6, "checkbox": [12, 14], "children": 10, "class": 14, "cleanup": 12, "client": 5, "coalesc": 6, "coalesce_zer": 6, "coloc": 2, "columns": 14, "comando": 2, "combin": 6, "commit": 6, "complexity": 12, "comput": 6, "computed": 6, "comuns": 6, "condition": 5, "conex\u00e3": 6, "conex\u00f5": 6, "configur": [2, 6], "constructor": 12, "construtor": 6, "consult": 6, "cont": 6, "contains": 6, "conte\u00fad": 17, "contribu": 1, "control": 6, "convenient": 5, "conversion": 15, "cooki": 5, "copi": 6, "copying": 4, "corr": 2, "count": [6, 15], "creating": 4, "crud": 14, "crypt": 12, "csv": 6, "custom": [4, 12, 13, 14], "customizing": 14, "dad": 6, "dal": [5, 6], "dashboard": [3, 6], "dat": 12, "databas": [5, 6, 12], "datastor": 6, "day": 6, "db": 6, "decor": 5, "def": 8, "default": 8, "defeit": 6, "defin": 6, "define_tabl": 6, "deix": 6, "delet": 6, "dependenc": 5, "deployment": 2, "depur": 1, "design": [2, 12], "development": 8, "dic": 1, "dicion\u00e1ri": 6, "dictionari": 12, "din\u00e2m": 4, "discord": [1, 13], "distinct": 6, "distint": 6, "distribu\u00edd": 6, "div": 10, "dock": 2, "dom": 10, "domain": 4, "drop": 6, "elif": 8, "else": 8, "endswith": 6, "engin": 2, "envi": 6, "environment": 2, "equality": 12, "error": 4, "estil": 6, "est\u00e1t": 4, "etiquet": 13, "exampl": [7, 12, 13, 14, 15, 16], "excet": 8, "exclud": 6, "exclus\u00e3": 6, "execu": 6, "executesql": 6, "experiment": 6, "experimental": 6, "export": 6, "express\u00f5": 6, "extend": 8, "extending": 8, "facebook": 13, "factor": 13, "fake_migrat": 6, "falh": 6, "faz": 6, "featur": 14, "fich": 6, "field": [6, 12], "fields": 6, "fil": [4, 12, 15], "filter_in": 6, "filter_out": 6, "filtering": 14, "filtr": 6, "finally": 8, "find": [6, 10], "first": 6, "fixa\u00e7\u00e3": 6, "fixtur": 5, "fixur": 5, "flash": [5, 15], "font": [1, 2], "form": [10, 12, 15, 16], "format": [6, 12, 16], "forms": 12, "formul\u00e1ri": 12, "foruml\u00e1ri": 12, "from": 2, "funcion": 2, "functions": [8, 12], "gae": 2, "gcloud": 2, "generating": 6, "get": 7, "github": 1, "global": 2, "googl": [1, 2, 6, 13], "grid": [14, 15, 16], "grids": 14, "groupby": 6, "grup": 1, "h1": 10, "h2": 10, "h3": 10, "h4": 10, "h5": 10, "h6": 10, "having": 6, "head": 10, "hell": 15, "helpers": 10, "heranc": 6, "hour": 6, "html": [6, 10], "htmx": 16, "https": 2, "i": 10, "id": 6, "if": 8, "ilik": 6, "img": 10, "impersonation": 13, "implant": 2, "import": 6, "in": [5, 8, 10, 16], "includ": 8, "inferior": 6, "information": 8, "inject": [5, 10], "inner": 6, "input": 10, "inser": 6, "insert": 6, "inser\u00e7\u00e3": 6, "insid": 13, "instal": 2, "installations": 2, "installing": 2, "interfac": 13, "internacionaliz": 11, "introduction": 6, "is_alphanumeric": 12, "is_dat": 12, "is_date_in_rang": 12, "is_datetim": 12, "is_datetime_in_rang": 12, "is_decimal_in_rang": 12, "is_email": 12, "is_empty_or": 12, "is_equal_t": 12, "is_expr": 12, "is_fil": 12, "is_float_in_rang": 12, "is_imag": 12, "is_in_db": 12, "is_in_set": 12, "is_int_in_rang": 12, "is_ipaddress": 12, "is_ipv4": 12, "is_ipv6": 12, "is_json": 12, "is_length": 12, "is_list_of": 12, "is_list_of_emails": 12, "is_low": 12, "is_match": 12, "is_not_empty": 12, "is_not_in_db": 12, "is_null_or": 12, "is_saf": 12, "is_slug": 12, "is_strong": 12, "is_tim": 12, "is_upload_filenam": 12, "is_upp": 12, "is_url": 12, "isempty": 6, "iter": 6, "join": 6, "joins": 6, "js": 16, "junt": 6, "jwttokenplugin": 13, "key": 14, "label": 10, "last": 6, "lay": 6, "layout": 8, "ldap": 13, "left": 6, "leg": 6, "len": 6, "less": 6, "li": 10, "lik": 6, "limitby": 6, "linguag": 8, "linh": 2, "list": 6, "local": [1, 2, 5, 6], "low": 6, "l\u00f3gic": 6, "manipulation": 12, "manual": [1, 17], "many": 6, "mapped": 4, "marca\u00e7\u00e3": 6, "max": 6, "melhor": 2, "memcach": 5, "memoiz": 5, "mem\u00f3r": 6, "mesm": 6, "messag": 16, "methods": [6, 15], "microsoft": 6, "migrat": 6, "migra\u00e7\u00e3": 6, "migra\u00e7\u00f5": 6, "min": 6, "minimal": 12, "minut": 6, "mobil": 8, "model": [4, 6], "modern": 1, "modific": 6, "month": 6, "mssql": 6, "muit": 6, "multipl": [5, 13], "mysql": 6, "new_app": 2, "nom": 6, "nosql": 6, "not": 6, "nov": 6, "oauth2": 13, "object": [14, 16], "objects": 13, "objet": 4, "obten\u00e7\u00e3": 6, "of": 13, "ol": 10, "on": 2, "on_defin": 6, "oper": 6, "option": 10, "options": 12, "op\u00e7\u00e3": 2, "op\u00e7\u00f5": 2, "orden": 6, "orderby": 6, "orderby_on_limitby": 6, "or\u00e1cul": 6, "other": 12, "out": 6, "outr": 6, "overview": 10, "p": 10, "padr\u00e3": 6, "pag": [4, 8], "palavr": 6, "pam": 13, "par": [6, 8, 15], "paramet": 12, "parameters": 14, "part": [2, 6], "par\u00e2metr": 6, "past": 6, "pegadinh": 6, "permiss\u00f5": 13, "personaliz": [5, 6, 10, 14], "pip": 2, "plataform": 2, "plugin": 13, "plugins": 13, "plural": 6, "pluraliz": 11, "podman": 2, "polic": 7, "polymodel": 6, "pool": 6, "practical": 7, "pre": 10, "preguic": 6, "primarykey": 6, "primeir": 2, "prim\u00e1r": 6, "principal": 3, "princ\u00edpi": 4, "proced": 2, "pr\u00e9": [1, 2], "py4web": [0, 1, 6, 15, 16, 17], "pycharm": 1, "python": 1, "pythonanywher": 2, "p\u00e1gin": [3, 4], "q": 16, "quebr": 6, "query": 6, "quick": 6, "quoting": 6, "rang": 12, "raw": 6, "real": 6, "record": 6, "recurs": [1, 6], "red": [5, 14], "redefin": 6, "redirect": 15, "referent": [6, 14, 17], "regexp": 6, "registr": 6, "relation": 6, "relations": 6, "rela\u00e7\u00e3": 6, "remot": 6, "renderiz": 6, "replic": 6, "represent": 6, "request": 4, "requisit": [1, 2], "reserv": 6, "respons": 7, "restap": 7, "resum": 6, "retorn": [4, 6], "return": [8, 15], "returning": 15, "rnam": 6, "rollback": 6, "rot": 4, "row": 6, "rows": 6, "run": 2, "s": 6, "schedul": 16, "script": 10, "searching": 14, "seconds": 6, "security": 12, "segur": 6, "select": [6, 10], "selects": 6, "selet": 6, "sending": 16, "sequence_nam": 6, "serv": [1, 5, 6, 10], "session": 5, "sessions": 5, "sess\u00e3": 3, "set": [6, 12], "set_password": 2, "setting": 15, "settings": 14, "setup": 2, "sharing": 5, "shell": [2, 6], "sid": [5, 10], "sidec": 12, "simpl": 15, "simpletokenplugin": 13, "sincroniz": 6, "singul": 6, "sintax": 8, "sobr": 6, "sort": 6, "sorted": 12, "span": 10, "special": [2, 12], "sql": 6, "sqlit": 6, "stand": 6, "standard": [8, 12], "startswith": 6, "storag": 5, "string": 16, "strings": 6, "structur": [8, 12], "style": [10, 14], "substrings": 6, "sugest\u00f5": 1, "sum": 6, "sup": 8, "suport": [2, 6], "supported": 6, "t": 16, "tabel": [6, 17], "tabl": [6, 10], "table_class": 6, "tag": 10, "tagging": 12, "tags": 13, "task": 16, "tbody": 10, "td": 10, "temp": 6, "templat": [5, 8, 14], "temporiz": 6, "tend": 6, "tent": 8, "tentat": 6, "text": 12, "textar": 10, "th": 10, "the": [1, 2, 4, 5, 6, 7, 12, 14, 16], "thead": 10, "tim": 12, "tip": 6, "titl": 10, "to": 6, "tod": 6, "token": 13, "topics": 16, "tour": 6, "tr": 10, "trabalh": 1, "tradu\u00e7\u00e3": 11, "transa\u00e7\u00e3": 6, "translator": 5, "trigger_nam": 6, "tt": 10, "tupl": 12, "tutori": 1, "two": 13, "two_factor_required": 13, "two_factor_send": 13, "two_factor_tri": 13, "two_factor_validat": 13, "type": [6, 12], "types": 6, "ubuntu": 2, "ul": 10, "understanding": 2, "up": 15, "updat": 6, "update_or_insert": 6, "update_record": 6, "upload": 12, "upper": 6, "uri": 6, "url": 10, "urlsign": 5, "usag": 16, "usand": [6, 14], "user": 13, "using": [2, 5, 6, 8, 10, 13, 14, 16], "uso": 6, "utils": 16, "valid": 12, "validate_and_insert": 6, "validate_and_updat": 6, "validation": 12, "validators": [6, 12], "valor": [4, 6], "variabl": [8, 15], "velh": 6, "version": [2, 6], "vez": 6, "view": 15, "virtu": 6, "virtual": [2, 6], "vscod": 1, "v\u00edd": 1, "watch": 4, "web": [3, 4], "web2py": 15, "whil": 8, "widget": 16, "widgets": 12, "with": [5, 6, 12, 13, 14, 15], "without": [2, 12], "workflow": 8, "world": 15, "wsgi": 2, "xml": [6, 10], "yatl": [8, 10], "year": 6, "\u00e9": 0, "\u00edndic": [6, 17]}}) \ No newline at end of file diff --git a/apps/_documentation/static/pt/toggle.css b/apps/_documentation/static/pt/toggle.css new file mode 100644 index 000000000..f79376af7 --- /dev/null +++ b/apps/_documentation/static/pt/toggle.css @@ -0,0 +1,77 @@ +input[type=checkbox] { + visibility: hidden; + height: 0; + width: 0; + margin: 0; +} + +.rst-versions .rst-current-version { + padding: 10px; + display: flex; + justify-content: space-between; +} + +.rst-versions .rst-current-version .fa-book, +.rst-versions .rst-current-version .fa-v, +.rst-versions .rst-current-version .fa-caret-down { + height: 24px; + line-height: 24px; + vertical-align: middle; +} + +.rst-versions .rst-current-version .fa-element { + width: 80px; + text-align: center; +} + +.rst-versions .rst-current-version .fa-book { + text-align: left; +} + +.rst-versions .rst-current-version .fa-v { + color: #27AE60; + text-align: right; +} + +label { + margin: 0 auto; + display: inline-block; + justify-content: center; + align-items: right; + border-radius: 100px; + position: relative; + cursor: pointer; + text-indent: -9999px; + width: 50px; + height: 21px; + background: #000; +} + +label:after { + border-radius: 50%; + position: absolute; + content: ''; + background: #fff; + width: 15px; + height: 15px; + top: 3px; + left: 3px; + transition: ease-in-out 200ms; +} + +input:checked+label { + background: #3a7ca8; +} + +input:checked+label:after { + left: calc(100% - 5px); + transform: translateX(-100%); +} + +html.transition, +html.transition *, +html.transition *:before, +html.transition *:after { + transition: ease-in-out 200ms !important; + transition-delay: 0 !important; +} diff --git a/apps/_scaffold/__init__.py b/apps/_scaffold/__init__.py index aecd78c30..7a4f6e28c 100644 --- a/apps/_scaffold/__init__.py +++ b/apps/_scaffold/__init__.py @@ -3,11 +3,12 @@ assert py4web.check_compatible("0.1.20190709.1") -# by importing db you expose it to the _dashboard/dbadmin -from .models import db - # by importing controllers you expose the actions defined in it from . import controllers +# by importing db you expose it to the _dashboard/dbadmin +from .models import db +# import the scheduler +from .tasks import scheduler # optional parameters __version__ = "0.0.0" diff --git a/apps/_scaffold/common.py b/apps/_scaffold/common.py index 36de9ce74..c74bbf2b0 100644 --- a/apps/_scaffold/common.py +++ b/apps/_scaffold/common.py @@ -4,31 +4,23 @@ """ import os import sys -import logging -from py4web import Session, Cache, Translator, Flash, DAL, Field, action -from py4web.utils.mailer import Mailer + +from pydal.tools.scheduler import Scheduler +from pydal.tools.tags import Tags + +from py4web import DAL, Cache, Field, Flash, Session, Translator, action +from py4web.server_adapters.logging_utils import make_logger from py4web.utils.auth import Auth from py4web.utils.downloader import downloader -from pydal.tools.tags import Tags from py4web.utils.factories import ActionFactory +from py4web.utils.mailer import Mailer + from . import settings # ####################################################### # implement custom loggers form settings.LOGGERS # ####################################################### -logger = logging.getLogger("py4web:" + settings.APP_NAME) -formatter = logging.Formatter( - "%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s" -) -for item in settings.LOGGERS: - level, filename = item.split(":", 1) - if filename in ("stdout", "stderr"): - handler = logging.StreamHandler(getattr(sys, filename)) - else: - handler = logging.FileHandler(filename) - handler.setFormatter(formatter) - logger.setLevel(getattr(logging, level.upper(), "DEBUG")) - logger.addHandler(handler) +logger = make_logger("py4web:" + settings.APP_NAME, settings.LOGGERS) # ####################################################### # connect to db @@ -46,13 +38,13 @@ # ####################################################### cache = Cache(size=1000) T = Translator(settings.T_FOLDER) -flash = Flash() # ####################################################### # pick the session type that suits you best # ####################################################### if settings.SESSION_TYPE == "cookies": session = Session(secret=settings.SESSION_SECRET_KEY) + elif settings.SESSION_TYPE == "redis": import redis @@ -65,11 +57,15 @@ else cs(k, v, e) ) session = Session(secret=settings.SESSION_SECRET_KEY, storage=conn) + elif settings.SESSION_TYPE == "memcache": - import memcache, time + import time + + import memcache conn = memcache.Client(settings.MEMCACHE_CLIENTS, debug=0) session = Session(secret=settings.SESSION_SECRET_KEY, storage=conn) + elif settings.SESSION_TYPE == "database": from py4web.utils.dbstore import DBStore @@ -82,12 +78,16 @@ auth.use_username = True auth.param.registration_requires_confirmation = settings.VERIFY_EMAIL auth.param.registration_requires_approval = settings.REQUIRES_APPROVAL +auth.param.login_after_registration = settings.LOGIN_AFTER_REGISTRATION auth.param.allowed_actions = settings.ALLOWED_ACTIONS auth.param.login_expiration_time = 3600 -auth.param.password_complexity = {"entropy": 50} +auth.param.password_complexity = {"entropy": settings.PASSWORD_ENTROPY} auth.param.block_previous_password_num = 3 auth.param.default_login_enabled = settings.DEFAULT_LOGIN_ENABLED auth.define_tables() +auth.fix_actions() + +flash = auth.flash # ####################################################### # Configure email sender for auth @@ -130,8 +130,33 @@ callback_url="auth/plugin/oauth2google/callback", ) ) + +if settings.OAUTH2GOOGLE_SCOPED_CREDENTIALS_FILE: + from py4web.utils.auth_plugins.oauth2google_scoped import \ + OAuth2GoogleScoped # TESTED + + auth.register_plugin( + OAuth2GoogleScoped( + secrets_file=settings.OAUTH2GOOGLE_SCOPED_CREDENTIALS_FILE, + scopes=[], # Put here any scopes you want in addition to login + db=db, # Needed to store credentials in auth_credentials + ) + ) + +if settings.OAUTH2GITHUB_CLIENT_ID: + from py4web.utils.auth_plugins.oauth2github import OAuth2Github # TESTED + + auth.register_plugin( + OAuth2Github( + client_id=settings.OAUTH2GITHUB_CLIENT_ID, + client_secret=settings.OAUTH2GITHUB_CLIENT_SECRET, + callback_url="auth/plugin/oauth2github/callback", + ) + ) + if settings.OAUTH2FACEBOOK_CLIENT_ID: - from py4web.utils.auth_plugins.oauth2facebook import OAuth2Facebook # UNTESTED + from py4web.utils.auth_plugins.oauth2facebook import \ + OAuth2Facebook # UNTESTED auth.register_plugin( OAuth2Facebook( @@ -152,15 +177,33 @@ ) ) +# ####################################################### +# Enable optional API token plugins +# ####################################################### + +# curl -H "Authorization: Bearer {token}" +# create tokens in db.auth_simple_token +# +# simple_token_plugin = SimpleTokenPlugin(auth) +# auth.token_plugins.append(simple_token_plugin) + +# curl -H "Authorization: Bearer {token}" +# create tokens with JwtTokenPlugin(auth).make(user, expiration) +# +# jwt_token_plugin = JwtTokenPlugin(auth) +# auth.token_plugins.append(jwt_token_plugin) + # ####################################################### # Define a convenience action to allow users to download # files uploaded and reference by Field(type='upload') # ####################################################### if settings.UPLOAD_FOLDER: - @action('download/') - @action.uses(db) + + @action("download/") + @action.uses(db) def download(filename): - return downloader(db, settings.UPLOAD_FOLDER, filename) + return downloader(db, settings.UPLOAD_FOLDER, filename) + # To take advantage of this in Form(s) # for every field of type upload you MUST specify: # @@ -168,17 +211,15 @@ def download(filename): # field.download_url = lambda filename: URL('download/%s' % filename) # ####################################################### -# Optionally configure celery +# Define and optionally start the scheduler # ####################################################### -if settings.USE_CELERY: - from celery import Celery - - # to use "from .common import scheduler" and then use it according - # to celery docs, examples in tasks.py - scheduler = Celery( - "apps.%s.tasks" % settings.APP_NAME, broker=settings.CELERY_BROKER +if settings.USE_SCHEDULER: + scheduler = Scheduler( + db, logger=logger, max_concurrent_runs=settings.SCHEDULER_MAX_CONCURRENT_RUNS ) - + scheduler.start() +else: + scheduler = None # ####################################################### # Enable authentication @@ -187,6 +228,10 @@ def download(filename): # ####################################################### # Define convenience decorators +# They can be used instead of @action and @action.uses +# They should NEVER BE MIXED with @action and @action.uses +# If you need to provide extra fixtures for a specific controller +# add them like this: @authenticated(uses=[extra_fixture]) # ####################################################### unauthenticated = ActionFactory(db, session, T, flash, auth) authenticated = ActionFactory(db, session, T, flash, auth.user) diff --git a/apps/_scaffold/controllers.py b/apps/_scaffold/controllers.py index e2f2d8bc3..7f7388264 100644 --- a/apps/_scaffold/controllers.py +++ b/apps/_scaffold/controllers.py @@ -25,13 +25,17 @@ Warning: Fixtures MUST be declared with @action.uses({fixtures}) else your app will result in undefined behavior """ -from py4web import action, request, abort, redirect, URL from yatl.helpers import A -from .common import db, session, T, cache, auth, logger, authenticated, unauthenticated, flash +from py4web import URL, abort, action, redirect, request -@unauthenticated("index", "index.html") +from .common import (T, auth, authenticated, cache, db, flash, logger, session, + unauthenticated) + + +@action("index") +@action.uses("index.html", auth, T) def index(): user = auth.get_user() - message = T("Hello {first_name}".format(**user) if user else "Hello") + message = T("Hello {first_name}").format(**user) if user else T("Hello") return dict(message=message) diff --git a/apps/_scaffold/databases/README.md b/apps/_scaffold/databases/README.md deleted file mode 100644 index 1ae05404f..000000000 --- a/apps/_scaffold/databases/README.md +++ /dev/null @@ -1,2 +0,0 @@ - -This is just a placeholder for the needed '_scaffold/databases' folder diff --git a/apps/_scaffold/models.py b/apps/_scaffold/models.py index b896756b2..1b084b3e1 100644 --- a/apps/_scaffold/models.py +++ b/apps/_scaffold/models.py @@ -2,9 +2,10 @@ This file defines the database models """ -from .common import db, Field from pydal.validators import * +from .common import Field, db + ### Define your table below # # db.define_table('thing', Field('name')) diff --git a/apps/_scaffold/settings.py b/apps/_scaffold/settings.py index 5d8c4a1e0..cd0330063 100644 --- a/apps/_scaffold/settings.py +++ b/apps/_scaffold/settings.py @@ -6,18 +6,23 @@ This file is provided as an example: """ import os + from py4web.core import required_folder +# mode (default or development) +MODE = os.environ.get("PY4WEB_MODE") + # db settings APP_FOLDER = os.path.dirname(__file__) APP_NAME = os.path.split(APP_FOLDER)[-1] + # DB_FOLDER: Sets the place where migration files will be created # and is the store location for SQLite databases DB_FOLDER = required_folder(APP_FOLDER, "databases") DB_URI = "sqlite://storage.db" DB_POOL_SIZE = 1 DB_MIGRATE = True -DB_FAKE_MIGRATE = False # maybe? +DB_FAKE_MIGRATE = False # location where static files are stored: STATIC_FOLDER = required_folder(APP_FOLDER, "static") @@ -25,18 +30,26 @@ # location where to store uploaded files: UPLOAD_FOLDER = required_folder(APP_FOLDER, "uploads") -# send email on regstration -VERIFY_EMAIL = True +# send verification email on registration +VERIFY_EMAIL = MODE != "development" + +# complexity of the password 0: no constraints, 50: safe! +PASSWORD_ENTROPY = 0 if MODE == "development" else 50 # account requires to be approved ? REQUIRES_APPROVAL = False -# ALLOWED_ACTIONS: -# ["all"] -# ["login", "logout", "request_reset_password", "reset_password", "change_password", "change_email", "update_profile"] -# if you add "login", add also "logout" -ALLOWED_ACTIONS = ["all"] +# auto login after registration +# requires False VERIFY_EMAIL & REQUIRES_APPROVAL +LOGIN_AFTER_REGISTRATION = False +# ALLOWED_ACTIONS in API / default Forms: +# ["all"] +# ["login", "logout", "request_reset_password", "reset_password", \ +# "change_password", "change_email", "profile", "config", "register", +# "verify_email", "unsubscribe"] +# Note: if you add "login", add also "logout" +ALLOWED_ACTIONS = ["all"] # email settings SMTP_SSL = False @@ -47,14 +60,14 @@ # session settings SESSION_TYPE = "cookies" -SESSION_SECRET_KEY = "" # replace this with a uuid +SESSION_SECRET_KEY = None # or replace with your own secret MEMCACHE_CLIENTS = ["127.0.0.1:11211"] REDIS_SERVER = "localhost:6379" # logger settings LOGGERS = [ "warning:stdout" -] # syntax "severity:filename" filename can be stderr or stdout +] # syntax "severity:filename:format" filename can be stderr or stdout # Disable default login when using OAuth DEFAULT_LOGIN_ENABLED = True @@ -63,6 +76,10 @@ OAUTH2GOOGLE_CLIENT_ID = None OAUTH2GOOGLE_CLIENT_SECRET = None +# Single sign on Google, with stored credentials for scopes (will be used if provided). +# set it to something like os.path.join(APP_FOLDER, "private/credentials.json" +OAUTH2GOOGLE_SCOPED_CREDENTIALS_FILE = None + # single sign on Okta (will be used if provided. Please also add your tenant # name to py4web/utils/auth_plugins/oauth2okta.py. You can replace the XXX # instances with your tenant name.) @@ -73,21 +90,29 @@ OAUTH2FACEBOOK_CLIENT_ID = None OAUTH2FACEBOOK_CLIENT_SECRET = None +# single sign on GitHub (will be used if provided) +OAUTH2GITHUB_CLIENT_ID = None +OAUTH2GITHUB_CLIENT_SECRET = None + # enable PAM USE_PAM = False # enable LDAP USE_LDAP = False LDAP_SETTINGS = { - "mode": "ad", - "server": "my.domain.controller", - "base_dn": "ou=Users,dc=domain,dc=com", + "mode": "ad", # Microsoft Active Directory + "server": "mydc.domain.com", # FQDN or IP of one Domain Controller + "base_dn": "cn=Users,dc=domain,dc=com", # base dn, i.e. where the users are located } # i18n settings T_FOLDER = required_folder(APP_FOLDER, "translations") -# Celery settings +# Scheduler settings +USE_SCHEDULER = False +SCHEDULER_MAX_CONCURRENT_RUNS = 1 + +# Celery settings (alternative to the build-in scheduler) USE_CELERY = False CELERY_BROKER = "redis://localhost:6379/0" diff --git a/apps/_scaffold/static/js/utils.js b/apps/_scaffold/static/js/utils.js index 8873d808b..aa2bd424c 100644 --- a/apps/_scaffold/static/js/utils.js +++ b/apps/_scaffold/static/js/utils.js @@ -43,12 +43,18 @@ Q.ajax = function(method, url, data, headers) { return new Promise(function(resolve, reject) { fetch(url, options).then(function(res){ res.text().then(function(body){ - res.data = body; + res.data = body; res.json = function(){return JSON.parse(body);}; resolve(res); }, reject);}).catch(reject); }); } + +Q.get = (url, headers) => Q.ajax("GET", url, null, headers); +Q.post = (url, data, headers) => Q.ajax("POST", url, data, headers); +Q.put = (url, data, headers) => Q.ajax("PUT", url, data, headers); +Q.delete = (url, headers) => Q.ajax("DELETE", url, null, headers); + // Gets a cookie value Q.get_cookie = function (name) { var cookie = RegExp("" + name + "[^;]+").exec(document.cookie); @@ -56,26 +62,6 @@ Q.get_cookie = function (name) { return decodeURIComponent(!!cookie ? cookie.toString().replace(/^[^=]+./, "") : ""); }; -// Gets a session token (py4web specific) -Q.get_session_token = function () { - var app_name = Q.get_cookie('app_name'); - return Q.get_cookie(app_name + '_session'); -}; - -// Load data from localstorage -Q.retrieve = function (key) { - try { - return JSON.parse(window.localStorage.getItem(key)); - } catch (e) { - return null; - } -}; - -// Save data to localstorage -Q.store = function (key, value) { - window.localStorage.setItem(key, JSON.stringify(value)); -}; - // Load components lazily: https://vuejs.org/v2/guide/components.html#Async-Components Q.register_vue_component = function (name, src, onload) { Vue.component(name, function (resolve, reject) { @@ -164,59 +150,6 @@ Q.throttle = (callback, delay) => { return throttledEventHandler; }; -// A Vue app prototype -Q.app = function (elem_id) { - self = {}; - self.elem_id = elem_id || 'vue'; - self.data = { loading: 0, page: null, state: null }; - self.methods = {}; - self.filters = {}; - self.watch = {}; - self.pages = {}; - // translations - self.methods.T = T; - // toggles a variable - self.methods.toggle = function (obj, key) { obj[key] = !obj[key] }; - // sets a variable - self.methods.set = function (obj, key, value) { obj[key] = value; }; - // goto a given page and state (state should be 1 level deep dict - self.methods.go = function (page, state, push) { - self.v.loading++; - var pagecall = self.pages[page]; - if (pagecall) pagecall(state, function () { - if (push) { - var path = self.base + '/' + page; - if (state) for (var key in state) path += '/' + key + '/' + state[key]; - window.history.pushState(self.v, page, path); - } - self.v.loading--; - self.v.page = page; - self.v.state = state; - }); - }; - // restores state when navigating history - self.onpopstate = function (event) { - for (var key in event.state) self.v[key] = event.state[key]; - }; - self.start = function (base) { - self.base = base = base || window.location.href;; - self.v = new Vue({ - el: '#' + self.elem_id, - data: self.data, - methods: self.methods, - watch: self.watch, - filters: self.filters - }); - var parts = window.location.href.substr(base.length); - var page = parts[0]; - var state = {}; - for (var i = 1; i < parts.length; i += 2) state[parts[i]] = parts[i + 1]; - self.v.go(page, state, false); - window.onpopstate = self.onpopstate; - }; - return self; -}; - // Renders a JSON field with tags_input Q.tags_input = function(elem, options) { if (typeof elem === typeof '') elem = Q(elem)[0]; @@ -245,7 +178,6 @@ Q.tags_input = function(elem, options) { var fill = function(elem, repl) { repl.innerHTML = ''; tags.forEach(function(x){ - console.log(x); var item = document.createElement('li'); item.innerHTML = options.labels[x] || x; item.dataset.value = x; @@ -255,12 +187,14 @@ Q.tags_input = function(elem, options) { if(item.dataset.selected=='false') keys.push(x); else keys = keys.filter(function(y){ return x!=y; }); item.dataset.selected = keys.indexOf(x)>=0; elem.value = JSON.stringify(keys); + elem.dispatchEvent(new Event('input', { bubbles: true })); }; }); }; if (options.freetext) { var inp = document.createElement('input'); elem.parentNode.insertBefore(inp, elem); + inp.type = "text"; inp.classList = elem.classList; inp.placeholder = options.placeholder; inp.setAttribute('list', options.autocomplete_list); @@ -273,6 +207,7 @@ Q.tags_input = function(elem, options) { }); inp.value = ''; elem.value = JSON.stringify(keys); + elem.dispatchEvent(new Event('input', { bubbles: true })); fill(elem, repl); }; } @@ -330,7 +265,6 @@ Q.load_and_trap = function (method, url, form_data, target) { if (res.redirected) window.location = res.url; Q('#'+target)[0].innerHTML = res.data; Q.trap_form(url, target); - console.log(res.headers); var flash = res.headers.get('component-flash'); if (flash) Q.flash(JSON.parse(flash)); }; @@ -368,7 +302,6 @@ Q.handle_flash = function() { if (elem) { elem.addEventListener('flash', make_handler(elem), false); Q.flash = function(detail) {elem.dispatchEvent(new CustomEvent('flash', {detail: detail}));}; - console.log(elem.dataset.alert); if (elem.dataset.alert) Q.flash(Q.eval(elem.dataset.alert)); } }; diff --git a/apps/_scaffold/tasks.py b/apps/_scaffold/tasks.py index 441839bdc..6ccc5c6e8 100644 --- a/apps/_scaffold/tasks.py +++ b/apps/_scaffold/tasks.py @@ -1,34 +1,73 @@ -""" -To use celery tasks: -1) pip install -U "celery[redis]" -2) In settings.py: - USE_CELERY = True - CELERY_BROKER = "redis://localhost:6379/0" -3) Start "redis-server" -4) Start "celery -A apps.{appname}.tasks beat" -5) Start "celery -A apps.{appname}.tasks worker --loglevel=info" for each worker - -""" -from .common import settings, scheduler, db, Field - -# example of task that needs db access -@scheduler.task -def my_task(): +from .common import scheduler, settings +from .models import db + +# ####################################################### +# Use the built-in scheduler (nothing to install) +# ####################################################### + + +# define your tasks (or import them from other file) +def my_task(**inputs): + print(f"task running with {inputs}") try: - # this task will be executed in its own thread, connect to db - db._adapter.reconnect() # do something here db.commit() except: # rollback on failure db.rollback() + return {} + + +if settings.USE_SCHEDULER: + # register your tasks with the scheduler + scheduler.register_task("my_task", my_task) + # enqueue runs (here or in actions) for example + if db(db.task_run).count() < 1: + scheduler.enqueue_run("my_task", inputs={}, timeout=2, period=10) + +# manage your tasks via dashboard or Grid(path, db.task_run) + +# ####################################################### +# Optionally configure Celery +# ####################################################### +elif settings.USE_CELERY: + # ####################################################### + # To use celery tasks: + # 1) pip install -U "celery[redis]" + # 2) In settings.py: + # USE_CELERY = True + # CELERY_BROKER = "redis://localhost:6379/0" + # 3) Start "redis-server" + # 4) Start "celery -A apps.{appname}.tasks beat" + # 5) Start "celery -A apps.{appname}.tasks worker --loglevel=info" for each worker + # ####################################################### + + from celery import Celery + + # to use "from .common import scheduler" and then use it according + # to celery docs, examples in tasks.py + celery_scheduler = Celery( + "apps.%s.tasks" % settings.APP_NAME, broker=settings.CELERY_BROKER + ) + + # register your tasks + @scheduler.task + def my_task(): + # reconnect to database + db._adapter.reconnect() + try: + # do something here + db.commit() + except: + # rollback on failure + db.rollback() -# run my_task every 10 seconds -scheduler.conf.beat_schedule = { - "my_first_task": { - "task": "apps.%s.tasks.my_task" % settings.APP_NAME, - "schedule": 10.0, - "args": (), - }, -} + # run my_task every 10 seconds + celery_scheduler.conf.beat_schedule = { + "my_first_task": { + "task": f"apps.{settings.APP_NAME}.tasks.my_task", + "schedule": 10.0, + "args": (), + }, + } diff --git a/apps/_scaffold/templates/layout.html b/apps/_scaffold/templates/layout.html index fea0a1417..0edb16f51 100644 --- a/apps/_scaffold/templates/layout.html +++ b/apps/_scaffold/templates/layout.html @@ -6,7 +6,10 @@ - + [[block page_head]][[end]] diff --git a/apps/_websocket/templates/index.html b/apps/_websocket/templates/index.html index 9b9d0f9fb..2295f1a59 100644 --- a/apps/_websocket/templates/index.html +++ b/apps/_websocket/templates/index.html @@ -5,14 +5,15 @@ - + -

    Py4web Websockets! +

    Py4web Websockets with ssl! (original: https://github.com/zeekay/bottle-websocket )

    +

    ./py4web.py run apps -s geventWebSocketServer --watch=off --ssl_cert=server.pem --host=192.168.1.161 --port=9000 -L 10

    @@ -27,6 +28,7 @@

    Py4web Websockets! $('#messages').append("
  • Your browser doesn't support WebSockets.
  • "); } } + //ws = new WebSocket('wss://192.168.1.161:9000/_websocket/websocket'); ws = new WebSocket('ws://127.0.0.1:8000/_websocket/websocket'); ws.onopen = function(evt) { $('#messages').append('
  • WebSocket connection opened.
  • '); diff --git a/apps/examples/components/grid.py b/apps/examples/components/grid.py deleted file mode 100644 index 94c78897b..000000000 --- a/apps/examples/components/grid.py +++ /dev/null @@ -1,111 +0,0 @@ -import json - -from py4web import action, URL, request -from yatl.helpers import XML -from py4web.utils.url_signer import URLSigner -from py4web.core import Fixture - - -class Grid(Fixture): - """This is a prototype class for building paginable grids (tables) - with content provided server-side.""" - - GRID = '' - - def __init__( - self, path, session, search_placeholder=None, signer=None, db=None, auth=None - ): - """ - Displays a grid. - :param path: Path where the grid is loaded via AJAX. - :param session: used by the signer. - :param signer: singer for URLs. - :param db: specify a db if you need it added as widget. - :param auth: specify auth if you need it added as widget. - """ - self.path = path - self.search_placeholder = search_placeholder - self.signer = signer or URLSigner(session) - # Creates an action (an entry point for URL calls), - # mapped to the api method, that can be used to request pages - # for the table. - self.__prerequisites__ = [session] - args = list(filter(None, [session, db, auth, self.signer.verify()])) - f = action.uses(*args)(self.api) - action(self.path, method=["GET"])(f) - - def __call__(self): - """This method returns the element that can be included in the page.""" - return XML(Grid.GRID.format(url=self.url())) - - def url(self): - return URL(self.path, signer=self.signer) - - def api(self): - """The API must return the data to fill the table. - The data is a dictionary, containing: - - page: - - search_placeholder: - - has_more: - - rows: - A row is a dictionary, containing: - - is_header: - - cells: - is a list of dictionaries, containing: - - text: - - url: or None - - is_button: - - sortable: (valid only of the row is a header) - - sort: (+1 for sort up, -1 for sort down, 0 for no sort) - - el_class: or None (class of element, if needed) - All the fields except text are optional. - This is a sample implementation only, to test code. You should - over-ride the api method to provide your own input for the table. - """ - page = request.query.get("page") or 1 - q = request.query.get("q", "") # Query string - sort_order = request.query.get("sort_order") or None - header = dict( - is_header=True, - cells=[ - dict(text="Animal", sortable=True), - dict(text="N. paws", sortable=True), - dict(text="Class"), - ], - ) - # Copies the sort_order into the header, to reflect that the request has been - # satisfied. Note that we are doing server-side sorting, as the set of - # results can be very large and the web UI may have only a small set of the results. - # The reason why sort order is repeated in the answer is that the server might - # want to be able to communicate to the web UI what sort order has truly been - # used when producing the table. - if sort_order is not None: - for hc, so in zip(header["cells"], json.loads(sort_order)): - hc["sort"] = so - row1 = dict( - cells=[ - dict(text="Cat"), - dict(text="4"), - dict(text="Mammal", url=URL("mammals/cat"), is_button=True), - ] - ) - row2 = dict( - cells=[ - dict(text="Dog"), - dict(text="4"), - dict(text="Mammal", url=URL("mammals/dog"), is_button=True), - ] - ) - row3 = dict( - cells=[ - dict(text="Owl"), - dict(text="2"), - dict(text="Bird", url=URL("bird/owl"), is_button=True), - ] - ) - return dict( - page=int(page), - search_placeholder=self.search_placeholder, - has_more=True, - rows=[header, row1, row2, row3], - ) diff --git a/apps/examples/controllers.py b/apps/examples/controllers.py deleted file mode 100644 index c64b53004..000000000 --- a/apps/examples/controllers.py +++ /dev/null @@ -1,337 +0,0 @@ -import os -from py4web import action, request, abort, redirect, URL, Field, HTTP -from yatl.helpers import A, I -from py4web.utils.form import Form, FormStyleDefault -from py4web.utils.factories import ActionFactory, Inject -from py4web.utils.grid import Grid, GridClassStyle, Column -from py4web.utils.param import Param -from py4web.utils.publisher import Publisher, ALLOW_ALL_POLICY -from pydal.validators import IS_NOT_EMPTY, IS_INT_IN_RANGE, IS_IN_SET, IS_IN_DB -from yatl.helpers import INPUT, H1, HTML, BODY, A, DIV -from py4web.utils.param import Param -from .settings import SESSION_SECRET_KEY - -from .common import db, session, T, flash, cache, authenticated, unauthenticated, auth - -# import websocket examples -from .ws import * -from .socketio import * - -# exposes services necessary to access the db.thing via ajax -publisher = Publisher(db, policy=ALLOW_ALL_POLICY) - - -@action("index") -@action.uses("index.html") -def index(): - return {} - - -@action("page_without_template") -def page_without_template(): - return "ok" - - -@action("page_with_template") -@action.uses("page_with_template.html") -def page_with_template(): - return {"message": "Hello World"} - - -@action("page_with_error") -def page_with_error(): - 1 / 0 - - -@action("page_with_raise") -def page_with_raise(): - raise HTTP(400) - - -@action("page_with_redirect") -def page_with_redirect(): - redirect(URL('target')) - - -@action("target") -def target(): - return "target" - - -@action("page_with_parameters///") -def page_with_parameters(x, y, z): - return repr({"x": x, "y": y, "z": z}) - - -@action("page_with_query") -def page_with_query(): - return repr(dict(request.query)) - - -@action("page_with_postback", method=['GET', 'POST']) -def page_with_postback(): - return ('
    %s
    ' + - '' + - '' + - '", sanitize=True) - redirect("flash_next") - - -@action("flash_next") -@action.uses(flash, "flash_example_next.html") -def flash_example_next(): - return dict() - - -# exposed as /examples/create_form or /examples/update_form/ -@action("create_form", method=["GET", "POST"]) -@action("update_form/", method=["GET", "POST"]) -@action.uses(db, session, T, "form.html") -def example_form(id=None): - form = Form(db.person, id, deletable=False, formstyle=FormStyleDefault) - rows = db(db.person).select() - return dict(form=form, rows=rows) - - -# exposed as /examples/custom_form -@action("custom_form", method=["GET", "POST"]) -@action.uses(db, session, T, "custom_form.html") -def custom_form(id=None): - form = Form(db.person, id, deletable=False, formstyle=FormStyleDefault) - rows = db(db.person).select() - return dict(form=form, rows=rows) - - -@action("tagsinput_form", method=["GET", "POST"]) -@action.uses(session, "tagsinput_form.html") -def tagsinput_form(): - form = Form([Field('colors', 'list:string')], keep_values=True) - return dict(form=form) - - -# exposed as /examples/html_grid -@action("html_grid") -@action("html_grid/", method=["POST", "GET"]) -@action.uses(session, db, auth, T, "html_grid.html") -def example_html_grid(path=None): - # controllers and used for all grids in the app - grid_param = dict( - rows_per_page=5, - include_action_button_text=True, - search_button_text="Filter", - formstyle=FormStyleDefault, - grid_class_style=GridClassStyle) - - search_queries = [ - ['By Name', lambda value: db.thing.name.contains(value)], - ['By Color', lambda value: db.thing.color == value], - ['By Name or Color', lambda value: db.thing.name.contains(value)|(db.thing.color == value)], - ] - - query = db.thing.id > 0 - orderby = [db.thing.name] - columns = [field for field in db.thing if field.readable] - columns.insert(0, Column("Custom", lambda row: A("click me"))) - grid = Grid(path, - query, - columns=columns, - search_queries=search_queries, - orderby=orderby, - show_id=False, - T=T, - **grid_param) - - grid.formatters['thing.color'] = lambda color: I(_class="fa fa-circle", _style="color:"+color) - - return dict(grid=grid) - - -# exposed as /examples/ajaxgrid -@action("ajax_grid") -@action.uses("ajax_grid.html") -def example_ajax_grid(): - return dict(grid=publisher.grid(db.person)) - - -@action("hello") -@action.uses(T) -def hello(): - return str(T("Hello World")) - - -@action("count") -@action("count/") -@action.uses(T) -def count(number=1): - message = T("Cat").format(n=number) - link = A(T("more"), _href=URL("count/%s" % (number + 1))) - return HTML(BODY(H1(message, " ", link))).xml() - - -@action("forms", method=["GET", "POST"]) -@action.uses(session, db, T, "forms.html") -def example_multiple_forms(): - name = Field("name", requires=IS_NOT_EMPTY()) - forms = [ - Form( - [Field("name", requires=IS_NOT_EMPTY())], - form_name="1", - formstyle=FormStyleDefault, - ), - Form( - [Field("name", requires=IS_NOT_EMPTY())], - form_name="2", - keep_values=True, - formstyle=FormStyleDefault, - ), - Form( - [Field("name", requires=IS_NOT_EMPTY()), Field("age", "integer")], - form_name="3", - formstyle=FormStyleDefault, - ), - Form( - [Field("name", requires=IS_NOT_EMPTY()), Field("insane", "boolean")], - form_name="4", - formstyle=FormStyleDefault, - ), - Form( - [ - Field("name", requires=IS_NOT_EMPTY()), - Field("color", requires=IS_IN_SET(["red", "blue", "green"])), - ], - form_name="5", - formstyle=FormStyleDefault, - ), - Form( - [ - Field("name", requires=IS_NOT_EMPTY()), - Field( - "favorite_hero", requires=IS_IN_DB(db, "person.id", "person.name") - ), - ], - form_name="6", - formstyle=FormStyleDefault, - ), - ] - messages = [] - for form in forms: - if form.accepted: - messages.append("form %s accepted with: %s " % (form.form_name, form.vars)) - elif form.errors: - messages.append("form %s has errors: %s " % (form.form_name, form.errors)) - return dict(forms=forms, messages=messages) - - -# exposed as /examples/showme -@action("helpers") -@action.uses("generic.html") -def example_helpers(): - return dict(a=H1("I am a title"), b=2, c=dict(d=3, e=4, x=INPUT(_name="test"))) - -expose = ActionFactory(auth, T, Inject(message="Hello World")) - -@expose.get("test_expose1", template="generic.html") -def test_expose1(): - return dict() - -@expose.get("test_expose2") -def test_expose2(): - return dict() - -@expose("test_expose3") -def test_expose3(): - return dict() - - -# automatic actions -@unauthenticated.get() # exposed as /hello_world -def hello_world(): - return dict() - - -@unauthenticated.get() # exposed as /hello_world/ -def hello_world(msg): - return dict(msg=msg) - -@unauthenticated.callback("click me") -def a_callback(msg): - import logging - logging.info(msg) - - -@unauthenticated.get() -def show_a_button(): - return dict(mybutton=a_callback.button("clickme")(msg="hello world")) - - -@action("auth_forms", method=["GET", "POST"]) -@action.uses(db, session, T, auth, "auth_forms.html") -def auth_forms(): - disabled = False - # this is experimntal, we must disable forms that require a logged in user - if not auth.is_logged_in: - disabled = "disabled" - return dict( - register_form=auth.form("register"), - login_form=auth.form("login"), - reset_password_form=auth.form("reset_password"), - change_password_form=disabled or auth.form("change_password"), - profile_form=disabled or auth.form("profile"), - ) - - -@action("auth_form/", method=["GET", "POST"]) -@action.uses(db, session, T, auth, "auth_form.html") -def auth_form(name): - form = auth.form(name) - if form.submitted: - pass - elif form.accepted: - pass - elif form.errors: - pass - return dict(form=auth.form(name)) - - -# a py4web component is a action that returns a part of a page, not a full page -# it can use templates but they should not extend a layout -@action("mycomponent.load", method=["GET", "POST"]) -@action.uses(flash) -def mycomponent(): - flash.set('Welcome') - form = Form([Field("your_name")]) - return DIV("Hello " + request.forms["your_name"] if form.accepted else form).xml() - - -# a py4web component loader is a page that loads page parts via ajax -@action("component_loader") -@action.uses(flash, "component_loader.html") -def component_loader(): - return dict() diff --git a/apps/examples/controllers_components.py b/apps/examples/controllers_components.py deleted file mode 100644 index 529f86efb..000000000 --- a/apps/examples/controllers_components.py +++ /dev/null @@ -1,217 +0,0 @@ -""" -This file defines actions, i.e. functions the URLs are mapped into -The @action(path) decorator exposed the function at URL: - - http://127.0.0.1:8000/{app_name}/{path} - -If app_name == '_default' then simply - - http://127.0.0.1:8000/{path} - -If path == 'index' it can be omitted: - - http://127.0.0.1:8000/ - -The path follows the bottlepy syntax. - -@action.uses('generic.html') indicates that the action uses the generic.html template -@action.uses(session) indicates that the action uses the session -@action.uses(db) indicates that the action uses the db -@action.uses(T) indicates that the action uses the i18n & pluralization -@action.uses(auth.user) indicates that the action requires a logged in user -@action.uses(auth) indicates that the action requires the auth object - -session, db, T, auth, and tempates are examples of Fixtures. -Warning: Fixtures MUST be declared with @action.uses({fixtures}) else your app will result in undefined behavior -""" - -import datetime -import uuid - -from py4web import action, request, abort, redirect, URL, Field -from py4web.utils.form import Form, FormStyleBulma -from py4web.utils.url_signer import URLSigner -from pydal.validators import * - -from yatl.helpers import A -from .common import db, session, T, cache, auth -from .components.grid import Grid -from .components.vueform import VueForm, InsertForm, TableForm -from .components.fileupload import FileUpload -from .components.starrater import StarRater - -signed_url = URLSigner(session, lifespan=3600) - - -# ----------------------------- -# Sample grid. - -vue_grid = Grid("grid_api", session) - -@action("vuegrid", method=["GET"]) -@action.uses(vue_grid, "vuegrid.html") -def vuegrid(): - """This page generates a sample grid.""" - # We need to instantiate our grid component. - return dict(grid=vue_grid()) - -@action('vuegrid_bulma', method=["GET"]) -@action.uses(vue_grid, 'vuegrid_bulma.html') -def vuegrid_bulma(): - """This page generates a sample grid.""" - # We need to instantiate our grid component. - return dict(grid=vue_grid()) - -# ----------------------------- -# File uploader. - -file_uploader = FileUpload("upload_api", session) - - -@action("file_uploader", method=["GET"]) -@action.uses(file_uploader, "file_uploader.html") -def fileuploader(): - return dict(uploader=file_uploader(id=1)) - - -# ----------------------------- -# Custom vue form. - - -def get_time(): - return datetime.datetime.utcnow() - - -vue_form = VueForm( - "test_form", - session, - [ - Field("name", default="Luca"), - Field("last_name", default="Smith", writable=False), - Field("read", "boolean", default=True), - Field( - "animal", - requires=IS_IN_SET(["cat", "dog", "bird"]), - default="dog", - writable=False, - ), - Field( - "choice", - requires=IS_IN_SET({"c": "cat", "d": "dog", "b": "bird"}), - default="d", - ), - Field("arrival_time", "datetime", default=get_time), - Field("date_of_birth", "date"), - Field("narrative", "text"), - ], - readonly=False, - redirect_url="index", -) - - -@action("vue_form", method=["GET"]) -@action.uses(vue_form, "vueform.html") -def vueform(): - return dict(form=vue_form()) - -@action('vue_form_bulma', method=["GET"]) -@action.uses(vue_form, "vueform_bulma.html") -def vueform_bulma(): - return dict(form=vue_form()) - -# ----------------------------- -# Insertion form. - - -def not_too_expensive(fields): - """Validation function that checks that the total price is low enough.""" - if ( - fields["product_quantity"]["validated_value"] - * fields["product_cost"]["validated_value"] - ) > 1000000: - err = "Please insert only products with total value of less than a million." - fields["product_quantity"]["error"] = err - fields["product_cost"]["error"] = err - - -insert_form = InsertForm( - "insert_product", - session, - db.product, - validate=not_too_expensive, - redirect_url="index", -) - - -@action("insert_form", method=["GET"]) -@action.uses(insert_form, "vueform.html") -def insertform(): - return dict(form=insert_form()) - -@action('insert_form_bulma', method=["GET"]) -@action.uses(insert_form, 'vueform_bulma.html') -def insertform_bulma(): - return dict(form=insert_form()) - -# ----------------------------- -# Update form. -update_form = TableForm( - "update_product", - session, - db.product, - validate=not_too_expensive, - redirect_url="index", -) - - -@action("update_form", method=["GET"]) -@action.uses(update_form, "vueform.html") -def updateform(): - # For simplicity, we update the record 1. - return dict(form=update_form(id=1)) - -@action('update_form_bulma', method=["GET"]) -@action.uses(update_form, 'vueform_bulma.html') -def updateform_bulma(): - # For simplicity, we update the record 1. - return dict(form=update_form(id=1)) - -# ----------------------------- -# Star rater. - -star_rater = StarRater("star_rater", session) - - -@action("star_rater", method=["GET"]) -@action.uses(star_rater, "starrating.html") -def starrater(): - # This performs a star rating of item 1. - return dict(stars=star_rater(id=1)) - - -# ------------------------------ -# Star rater, instantiated from Vue. - - -@action("star_rater_vue", method=["GET"]) -@action.uses(star_rater, "star_rater_vue.html") -def star_rater_vue(): - return dict(get_posts_url=URL("star_rater_get_posts")) - - -@action('star_rater_vue_bulma', method=["GET"]) -@action.uses(star_rater, 'star_rater_vue_bulma.html') -def star_rater_vue_bulma(): - return dict(get_posts_url=URL('star_rater_get_posts')) - -@action("star_rater_get_posts", method=["GET"]) -def star_rater_get_posts(): - posts = [ - {"id": 1, "content": "Hello there"}, - {"id": 2, "content": "I love you"}, - {"id": 3, "content": "Do you love me too?"}, - ] - for p in posts: - # Creates the callback URL for each rater. - p["url"] = star_rater.url(p["id"]) - return dict(posts=posts) diff --git a/apps/examples/models.py b/apps/examples/models.py deleted file mode 100644 index cdfb8d0c5..000000000 --- a/apps/examples/models.py +++ /dev/null @@ -1,96 +0,0 @@ -""" -This file defines the database models -""" -import datetime - -from .common import db, Field, T, auth -from pydal.validators import * -from py4web.utils.populate import populate - -# simple table example -db.define_table( - 'person', - Field('name', requires=IS_NOT_IN_DB(db, 'person.name'), label=T('name')), - Field('job', requires=IS_NOT_EMPTY(), label=T('job')), - format='%(name)s', -) - -# simple reference example -db.define_table( - 'superhero', - Field('name', requires=IS_NOT_IN_DB(db, 'superhero.name')), - Field('real_identity', 'reference person'), - format='%(name)s', -) - -db.define_table('superpower', Field('description'), format='%(description)s') - -# many to many example -db.define_table( - 'tag', - Field('superhero', 'reference superhero'), - Field('superpower', 'reference superpower'), - Field('strength', 'integer'), -) - -if not db(db.person).count(): - db.person.insert( - name='Clark Kent', job='Journalist', - ) - db.person.insert(name='Peter Park', job='Photographer') - db.person.insert(name='Bruce Wayne', job='CEO') - db.superhero.insert(name='Superman', real_identity=1) - db.superhero.insert(name='Spiderman', real_identity=2) - db.superhero.insert(name='Batman', real_identity=3) - db.superpower.insert(description='Flight') - db.superpower.insert(description='Strength') - db.superpower.insert(description='Speed') - db.superpower.insert(description='Durability') - db.tag.insert(superhero=1, superpower=1, strength=100) - db.tag.insert(superhero=1, superpower=2, strength=100) - db.tag.insert(superhero=1, superpower=3, strength=100) - db.tag.insert(superhero=1, superpower=4, strength=100) - db.tag.insert(superhero=2, superpower=2, strength=50) - db.tag.insert(superhero=2, superpower=3, strength=75) - db.tag.insert(superhero=2, superpower=4, strength=10) - db.tag.insert(superhero=3, superpower=2, strength=80) - db.tag.insert(superhero=3, superpower=3, strength=20) - db.tag.insert(superhero=3, superpower=4, strength=70) - -# Used for examples of forms. -def get_user_email(): - return None if auth.current_user is None else auth.current_user.get('email') - - -def get_time(): - return datetime.datetime.utcnow() - - -db.define_table( - 'product', - Field('product_name'), - Field('product_quantity', 'integer', requires=IS_INT_IN_RANGE(0, None), default=0), - Field('product_cost', 'float', requires=IS_FLOAT_IN_RANGE(0, None), default=0.0), - Field('mail_order', 'boolean'), - Field('created_by', default=get_user_email), - Field('creation_date', 'datetime', default=get_time), -) - -# We do not want these fields to appear in forms by default. -db.product.id.readable = False -db.product.created_by.readable = False -db.product.creation_date.readable = False - -db.define_table( - 'thing', - Field('name', required=True), - Field('color', options=('red', 'green', 'blue')), - Field('is_ready', 'boolean'), - Field('time_created', 'time'), - Field('date_created', 'date'), - Field('timetime_created', 'datetime')) - -if db(db.thing).isempty(): - populate(db.thing, 100) - -db.commit() diff --git a/apps/examples/settings.py b/apps/examples/settings.py deleted file mode 100644 index 9d9dc4239..000000000 --- a/apps/examples/settings.py +++ /dev/null @@ -1,84 +0,0 @@ -""" -This is an optional file that defined app level settings such as: -- database settings -- session settings -- i18n settings -This file is provided as an example: -""" -import os - -# db settings -APP_FOLDER = os.path.dirname(__file__) -APP_NAME = os.path.split(APP_FOLDER)[-1] -# DB_FOLDER: Sets the place where migration files will be created -# and is the store location for SQLite databases -DB_FOLDER = os.path.join(APP_FOLDER, "databases") -DB_URI = "sqlite://storage.db" -DB_POOL_SIZE = 1 -DB_MIGRATE = True -DB_FAKE_MIGRATE = False # maybe? - -# location where to store uploaded files: -UPLOAD_FOLDER = os.path.join(APP_FOLDER, "uploads") - -# send email on regstration -VERIFY_EMAIL = False - -# account requires to be approved ? -REQUIRES_APPROVAL = False - -# email settings -SMTP_SSL = False -SMTP_SERVER = None -SMTP_SENDER = "you@example.com" -SMTP_LOGIN = "username:password" -SMTP_TLS = False - -# session settings -SESSION_TYPE = "cookies" -SESSION_SECRET_KEY = "" -MEMCACHE_CLIENTS = ["127.0.0.1:11211"] -REDIS_SERVER = "localhost:6379" - -# logger settings -LOGGERS = [ - "warning:stdout" -] # syntax "severity:filename" filename can be stderr or stdout - -# single sign on Google (will be used if provided) -OAUTH2GOOGLE_CLIENT_ID = None -OAUTH2GOOGLE_CLIENT_SECRET = None - -# single sign on Okta (will be used if provided. Please also add your tenant -# name to py4web/utils/auth_plugins/oauth2okta.py. You can replace the XXX -# instances with your tenant name.) -OAUTH2OKTA_CLIENT_ID = None -OAUTH2OKTA_CLIENT_SECRET = None - -# single sign on Google (will be used if provided) -OAUTH2FACEBOOK_CLIENT_ID = None -OAUTH2FACEBOOK_CLIENT_SECRET = None - -# enable PAM -USE_PAM = False - -# enable LDAP -USE_LDAP = False -LDAP_SETTINGS = { - "mode": "ad", - "server": "my.domain.controller", - "base_dn": "ou=Users,dc=domain,dc=com", -} - -# i18n settings -T_FOLDER = os.path.join(APP_FOLDER, "translations") - -# Celery settings -USE_CELERY = False -CELERY_BROKER = "redis://localhost:6379/0" - -# try import private settings -try: - from .settings_private import * -except: - pass diff --git a/apps/examples/socketio/__init__.py b/apps/examples/socketio/__init__.py deleted file mode 100644 index eb95eec6f..000000000 --- a/apps/examples/socketio/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -from py4web import action, request - - - -# pls, run socketio server - look at utils/wsservers.py -# test example for python-socketio - -@action("socketio/index") -@action.uses("socketio/index.html") -def index(): - return dict() - -@action('socketio/echo/', method=["GET", "POST"]) -def echo(path=None): - print (path) - print ('GET from sio-server') - - diff --git a/apps/examples/static/components-bulma/grid/grid.css b/apps/examples/static/components-bulma/grid/grid.css deleted file mode 100644 index e33802a47..000000000 --- a/apps/examples/static/components-bulma/grid/grid.css +++ /dev/null @@ -1,14 +0,0 @@ -.pagination .grid_page_number { - margin-right: 0.5em; - margin-left: 0.5em; -} -span.disabled { - color: lightgray; -} -th.clickable { - cursor: pointer; -} - -input.search { - width: 100%; -} \ No newline at end of file diff --git a/apps/examples/static/components-bulma/vueform/vueform.js b/apps/examples/static/components-bulma/vueform/vueform.js deleted file mode 100644 index b407d183e..000000000 --- a/apps/examples/static/components-bulma/vueform/vueform.js +++ /dev/null @@ -1,132 +0,0 @@ -(function(){ - - var form = { - props: ['url', 'check_url'], - data: null, - readonly: false, - methods: {} - }; - - form.data = function() { - var data = { - server_url: this.url, - validation_url: this.check_url, - fields: [], - readonly: false, - time_offset: luxon.DateTime.local().offsetNameShort, - time_zone: luxon.DateTime.local().zoneName, - }; - form.methods.load.call(data); - return data; - }; - - form.decorate = function (a) { - let k=0; - a.map(function(e) { - e._idx = k++; - e._modified = false; - }); - }; - - form.methods.load = function () { - // This method loads the structure and values for the form. - let self = this; - axios.get(self.server_url, {params: {page: self.page}}) - .then(function(res) { - set_results(self, res); - }) - }; - - function set_results(self, res) { - // This either sets new values (including errors) for the form, - // or it implements the redirection that one may wish after the post. - if (res.data.redirect_url) { - window.location = res.data.redirect_url; - } else { - self.fields = preprocess_fields(self, res.data.fields); - self.readonly = res.data.readonly; - form.decorate(self.fields); - } - } - - function preprocess_fields(self, fields) { - // Preprocesses the fields. - for (let f of fields) { - f.readonly = !f.writable; - if (f.type === 'datetime') { - console.log("converting time", f.value) - let m = luxon.DateTime.fromISO(f.value, {zone: "UTC"}); - let local_m = m.setZone(self.time_zone); - f.date = local_m.toFormat("y-MM-dd"); - f.time = local_m.toFormat("HH:mm"); - f.date_readonly = local_m.toLocaleString(luxon.DateTime.DATE_HUGE); - f.datetime_readonly = local_m.toLocaleString({ - year: "numeric", month: "long", - day: "numeric", weekday: "long", - hour: "numeric", minute: "numeric", - timeZoneName: "short", - }); - } - } - return fields; - } - - function set_date_field_value(field) { - // Reconstructs the field value, in UTC. - local_t = luxon.DateTime.fromISO(field.date + "T" + field.time); - utc_t = local_t.setZone("utc"); - field.value = utc_t.toString(); - } - - form.methods.submit = function () { - let self = this; - let d = {}; - for (field of self.fields) { - if (field.type === "datetime") { - set_date_field_value(field); - } - d[field.name] = field.value; - } - axios.post(self.server_url, d).then(function (res) { - set_results(self, res); - }) - }; - - form.methods.mark_field = function (field_idx) { - let self = this; - let field = self.fields[field_idx]; - field._modified = true; - }; - - form.methods.set_readable_date = function(field_idx) { - let self = this; - let field = self.fields[field_idx]; - if (field.type === 'datetime') { - local_m = luxon.DateTime.fromISO(field.date); - field.date_readonly = local_m.toLocaleString(luxon.DateTime.DATE_HUGE); - } - }; - - form.methods.validate_field = function (field_idx) { - let self = this; - let field = self.fields[field_idx]; - if (field._modified) { - if (field.type === 'datetime') { - set_date_field_value(field); - } - field._modified = false; - axios.post(self.validation_url, { - name: field.name, - value: field.value - }).then(function (res) { - field.error = res.data.error; - }); - } - }; - - Q.register_vue_component('vueform', 'components-bulma/vueform/vueform.html', - function(template) { - form.template = template.data; - return form; - }); -})(); diff --git a/apps/examples/static/components/grid/grid.css b/apps/examples/static/components/grid/grid.css deleted file mode 100644 index 67facc9f8..000000000 --- a/apps/examples/static/components/grid/grid.css +++ /dev/null @@ -1,13 +0,0 @@ -.pagination .grid_page_number { - margin-right: 0.5em; - margin-left: 0.5em; -} -span.disabled { - color: lightgray; -} -th.clickable { - cursor: pointer; -} -.grid td:last-child { - width:1px -} \ No newline at end of file diff --git a/apps/examples/static/components/grid/grid.html b/apps/examples/static/components/grid/grid.html deleted file mode 100644 index 2f8e579f0..000000000 --- a/apps/examples/static/components/grid/grid.html +++ /dev/null @@ -1,58 +0,0 @@ -
    -
    - - - - - - - -
    - - - - -
    - - - - - - - - - -
    - -
    -
    - No results. -
    -
    diff --git a/apps/examples/static/components/vueform/vueform.css b/apps/examples/static/components/vueform/vueform.css deleted file mode 100644 index 5b80d4a85..000000000 --- a/apps/examples/static/components/vueform/vueform.css +++ /dev/null @@ -1,5 +0,0 @@ - -.datetime .columns { - margin: -20px; - box-sizing: initial; -} \ No newline at end of file diff --git a/apps/examples/static/components/vueform/vueform.js b/apps/examples/static/components/vueform/vueform.js deleted file mode 100644 index 60f95d331..000000000 --- a/apps/examples/static/components/vueform/vueform.js +++ /dev/null @@ -1,132 +0,0 @@ -(function(){ - - var form = { - props: ['url', 'check_url'], - data: null, - readonly: false, - methods: {} - }; - - form.data = function() { - var data = { - server_url: this.url, - validation_url: this.check_url, - fields: [], - readonly: false, - time_offset: luxon.DateTime.local().offsetNameShort, - time_zone: luxon.DateTime.local().zoneName, - }; - form.methods.load.call(data); - return data; - }; - - form.decorate = function (a) { - let k=0; - a.map(function(e) { - e._idx = k++; - e._modified = false; - }); - }; - - form.methods.load = function () { - // This method loads the structure and values for the form. - let self = this; - axios.get(self.server_url, {params: {page: self.page}}) - .then(function(res) { - set_results(self, res); - }) - }; - - function set_results(self, res) { - // This either sets new values (including errors) for the form, - // or it implements the redirection that one may wish after the post. - if (res.data.redirect_url) { - window.location = res.data.redirect_url; - } else { - self.fields = preprocess_fields(self, res.data.fields); - self.readonly = res.data.readonly; - form.decorate(self.fields); - } - } - - function preprocess_fields(self, fields) { - // Preprocesses the fields. - for (let f of fields) { - f.readonly = !f.writable; - if (f.type === 'datetime') { - console.log("converting time", f.value) - let m = luxon.DateTime.fromISO(f.value, {zone: "UTC"}); - let local_m = m.setZone(self.time_zone); - f.date = local_m.toFormat("y-MM-dd"); - f.time = local_m.toFormat("HH:mm"); - f.date_readonly = local_m.toLocaleString(luxon.DateTime.DATE_HUGE); - f.datetime_readonly = local_m.toLocaleString({ - year: "numeric", month: "long", - day: "numeric", weekday: "long", - hour: "numeric", minute: "numeric", - timeZoneName: "short", - }); - } - } - return fields; - } - - function set_date_field_value(field) { - // Reconstructs the field value, in UTC. - local_t = luxon.DateTime.fromISO(field.date + "T" + field.time); - utc_t = local_t.setZone("utc"); - field.value = utc_t.toString(); - } - - form.methods.submit = function () { - let self = this; - let d = {}; - for (field of self.fields) { - if (field.type === "datetime") { - set_date_field_value(field); - } - d[field.name] = field.value; - } - axios.post(self.server_url, d).then(function (res) { - set_results(self, res); - }) - }; - - form.methods.mark_field = function (field_idx) { - let self = this; - let field = self.fields[field_idx]; - field._modified = true; - }; - - form.methods.set_readable_date = function(field_idx) { - let self = this; - let field = self.fields[field_idx]; - if (field.type === 'datetime') { - local_m = luxon.DateTime.fromISO(field.date); - field.date_readonly = local_m.toLocaleString(luxon.DateTime.DATE_HUGE); - } - }; - - form.methods.validate_field = function (field_idx) { - let self = this; - let field = self.fields[field_idx]; - if (field._modified) { - if (field.type === 'datetime') { - set_date_field_value(field); - } - field._modified = false; - axios.post(self.validation_url, { - name: field.name, - value: field.value - }).then(function (res) { - field.error = res.data.error; - }); - } - }; - - Q.register_vue_component('vueform', 'components/vueform/vueform.html', - function(template) { - form.template = template.data; - return form; - }); -})(); diff --git a/apps/examples/static/js/axios.min.js b/apps/examples/static/js/axios.min.js deleted file mode 100644 index 2d030546a..000000000 --- a/apps/examples/static/js/axios.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/* axios v0.20.0 | (c) 2020 by Matt Zabriskie */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new s(e),n=i(s.prototype.request,t);return o.extend(n,s.prototype,t),o.extend(n,t),n}var o=n(2),i=n(3),s=n(4),a=n(22),u=n(10),c=r(u);c.Axios=s,c.create=function(e){return r(a(c.defaults,e))},c.Cancel=n(23),c.CancelToken=n(24),c.isCancel=n(9),c.all=function(e){return Promise.all(e)},c.spread=n(25),e.exports=c,e.exports.default=c},function(e,t,n){"use strict";function r(e){return"[object Array]"===R.call(e)}function o(e){return"undefined"==typeof e}function i(e){return null!==e&&!o(e)&&null!==e.constructor&&!o(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function s(e){return"[object ArrayBuffer]"===R.call(e)}function a(e){return"undefined"!=typeof FormData&&e instanceof FormData}function u(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function c(e){return"string"==typeof e}function f(e){return"number"==typeof e}function p(e){return null!==e&&"object"==typeof e}function d(e){if("[object Object]"!==R.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function l(e){return"[object Date]"===R.call(e)}function h(e){return"[object File]"===R.call(e)}function m(e){return"[object Blob]"===R.call(e)}function y(e){return"[object Function]"===R.call(e)}function g(e){return p(e)&&y(e.pipe)}function v(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function x(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function w(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function b(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],function(e){u.headers[e]={}}),i.forEach(["post","put","patch"],function(e){u.headers[e]=i.merge(a)}),e.exports=u},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(13),i=n(16),s=n(5),a=n(17),u=n(20),c=n(21),f=n(14);e.exports=function(e){return new Promise(function(t,n){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"],(r.isBlob(p)||r.isFile(p))&&p.type&&delete d["Content-Type"];var l=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=unescape(encodeURIComponent(e.auth.password))||"";d.Authorization="Basic "+btoa(h+":"+m)}var y=a(e.baseURL,e.url);if(l.open(e.method.toUpperCase(),s(y,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l.onreadystatechange=function(){if(l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var r="getAllResponseHeaders"in l?u(l.getAllResponseHeaders()):null,i=e.responseType&&"text"!==e.responseType?l.response:l.responseText,s={data:i,status:l.status,statusText:l.statusText,headers:r,config:e,request:l};o(t,n,s),l=null}},l.onabort=function(){l&&(n(f("Request aborted",e,"ECONNABORTED",l)),l=null)},l.onerror=function(){n(f("Network Error",e,null,l)),l=null},l.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(f(t,e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=(e.withCredentials||c(y))&&e.xsrfCookieName?i.read(e.xsrfCookieName):void 0;g&&(d[e.xsrfHeaderName]=g)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),r.isUndefined(e.withCredentials)||(l.withCredentials=!!e.withCredentials),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),n(e),l=null)}),p||(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var r=n(15);e.exports=function(e,t,n,o,i){var s=new Error(e);return r(s,t,n,o,i)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,i,s){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(i)&&a.push("domain="+i),s===!0&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";var r=n(18),o=n(19);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,s={};return e?(r.forEach(e.split("\n"),function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(s[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?s[t]=(s[t]?s[t]:[]).concat([n]):s[t]=s[t]?s[t]+", "+n:n}}),s):s}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){function n(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function o(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(i[o]=n(void 0,e[o])):i[o]=n(e[o],t[o])}t=t||{};var i={},s=["url","method","data"],a=["headers","auth","proxy","params"],u=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],c=["validateStatus"];r.forEach(s,function(e){r.isUndefined(t[e])||(i[e]=n(void 0,t[e]))}),r.forEach(a,o),r.forEach(u,function(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(i[o]=n(void 0,e[o])):i[o]=n(void 0,t[o])}),r.forEach(c,function(r){r in t?i[r]=n(e[r],t[r]):r in e&&(i[r]=n(void 0,e[r]))});var f=s.concat(a).concat(u).concat(c),p=Object.keys(e).concat(Object.keys(t)).filter(function(e){return f.indexOf(e)===-1});return r.forEach(p,o),i}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}}])}); -//# sourceMappingURL=axios.min.map \ No newline at end of file diff --git a/apps/examples/static/js/star_rater_vue.js b/apps/examples/static/js/star_rater_vue.js deleted file mode 100644 index 1c5ddd3f6..000000000 --- a/apps/examples/static/js/star_rater_vue.js +++ /dev/null @@ -1,38 +0,0 @@ -// This will be the object that will contain the Vue attributes -// and be used to initialize it. -let app = {}; - -// Given an empty app object, initializes it filling its attributes, -// creates a Vue instance, and then initializes the Vue instance. -let init = (app) => { - - // This is the Vue data. - app.data = { - posts: "", - }; - - // We form the dictionary of all methods, so we can assign them - // to the Vue app in a single blow. - app.methods = {}; - - // This creates the Vue instance. - app.vue = new Vue({ - el: "#vue", - data: app.data, - methods: app.methods - }); - - // And this initializes it. - app.init = () => { - axios.get(get_posts_url).then((result) => { - app.vue.posts = result.data.posts; - }) - }; - - // Call to the initializer. - app.init(); -}; - -// This takes the (empty) app object, and initializes it, -// putting all the code i -init(app); diff --git a/apps/examples/templates/html_grid.html b/apps/examples/templates/html_grid.html deleted file mode 100644 index ac53ad9e0..000000000 --- a/apps/examples/templates/html_grid.html +++ /dev/null @@ -1,12 +0,0 @@ -[[extend 'layout.html']] - -

    Pure HTML Grid

    -
    - [[if 'action' in request.url_args and request.url_args['action'] in ['details', 'edit']:]] - [[form = grid.render()]] - [[=form]] - [[else:]] - [[=grid.render()]] - [[pass]] -
    - diff --git a/apps/examples/templates/index.html b/apps/examples/templates/index.html deleted file mode 100644 index b3b2ca7e7..000000000 --- a/apps/examples/templates/index.html +++ /dev/null @@ -1,190 +0,0 @@ -[[extend 'layout.html']] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Basic Examples
    A normal page without templateexample
    A normal page with templateexample
    A page causing an internal errorexample
    A missing pageexample
    Page which raises HTTPexample
    Page with a redirectexample
    Page with parametersexample
    Page with query stringexample
    Page with a postbackexample
    Fixtues: Flash
    A page with a flash (clientside only)example
    A page with a flash (with redirect and fixture)example
    Fixtues: Session
    A page with a counterexample
    Helpers
    A page using yatl helpersexample
    Internationalization and Pluralization
    A page using internationalization (try set browser to italian)example
    A page using pluralization (try set browser to italian)example
    Components
    A page embedding a py4web component via ajax (no Vue)example
    Forms
    A page with a create formexample
    A page with an update formexample
    A page with mutiple formsexample
    A page with a custom styled formexample
    A form with tags_input widgetexample
    Grid (no vue.js)
    A page with an serverside pure html gridexample
    Grid (requires Vue.js)
    A page with an ajax powered gridexample
    A page embedding multiple auth formsexample
    Py4web Component Examples (no.css)
    Sample Vue.js client-side grid. Subclass components.grid.Grid to tailor.example
    Javascript file uploader. Subclass components.fileupload.FileUpload to tailor.example
    Custom Vue form. Subclass components.vueform.VueForm to tailor.example
    Insertion form in Vue. Subclass components.vueform.InsertForm to tailor.example
    Update form in Vue. Subclass components.vueform.TableForm to tailor.example
    Star rating component in Vue; example of component instantiation from Vue. - Subclass components.starrater.StarRater to tailor.example
    Py4web Component Examples (Bulma)
    Sample Vue.js client-side grid using Bulma css. Subclass components.grid.Grid to tailor.example
    Custom Vue form using Bulma css. Subclass components.vueform.VueForm to tailor.example
    Insertion form in Vue, using Bulma css. Subclass components.vueform.InsertForm to tailor.example
    Update form in Vue, using Bluma css. Subclass components.vueform.TableForm to tailor.example
    Star rating component in Vue using Bulma css; example of component instantiation from Vue. - Subclass components.starrater.StarRater to tailor.example
    Websocket Examples
    A page using websocketsws
    A page using websockets with socketiosocketio
    diff --git a/apps/examples/templates/session_counter.html b/apps/examples/templates/session_counter.html deleted file mode 100644 index 1728ca199..000000000 --- a/apps/examples/templates/session_counter.html +++ /dev/null @@ -1,6 +0,0 @@ -[[extend "layout.html"]] - -

    Counter value: [[=counter]]

    - -Click to reload and increment counter -Click to reload and reset counter diff --git a/apps/examples/templates/vueform.html b/apps/examples/templates/vueform.html deleted file mode 100644 index 37f8a0138..000000000 --- a/apps/examples/templates/vueform.html +++ /dev/null @@ -1,20 +0,0 @@ -[[extend 'layout.html']] - -[[block page_head]] - -[[end]] - -
    - [[=form]] -
    - -[[block page_scripts]] - - - -[[end]] diff --git a/apps/examples/ws/__init__.py b/apps/examples/ws/__init__.py deleted file mode 100644 index f8fcb97c9..000000000 --- a/apps/examples/ws/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from py4web import action, request - - -# pls, run websockets server - look at utils/wsservers.py -# test example for websockets - -@action("ws/index") -@action.uses("ws/index.html") -def index(): - return dict() - diff --git a/apps/myfeed/README.md b/apps/fadebook/README.md similarity index 100% rename from apps/myfeed/README.md rename to apps/fadebook/README.md diff --git a/apps/myfeed/__init__.py b/apps/fadebook/__init__.py similarity index 99% rename from apps/myfeed/__init__.py rename to apps/fadebook/__init__.py index aecd78c30..c4e2e76da 100644 --- a/apps/myfeed/__init__.py +++ b/apps/fadebook/__init__.py @@ -3,11 +3,10 @@ assert py4web.check_compatible("0.1.20190709.1") -# by importing db you expose it to the _dashboard/dbadmin -from .models import db - # by importing controllers you expose the actions defined in it from . import controllers +# by importing db you expose it to the _dashboard/dbadmin +from .models import db # optional parameters __version__ = "0.0.0" diff --git a/apps/examples/common.py b/apps/fadebook/common.py similarity index 72% rename from apps/examples/common.py rename to apps/fadebook/common.py index 5bee0af19..acb6570ff 100644 --- a/apps/examples/common.py +++ b/apps/fadebook/common.py @@ -4,41 +4,23 @@ """ import os import sys -import logging -from py4web import Session, Cache, Translator, Flash, DAL, Field, action -from py4web.utils.mailer import Mailer + +from pydal.tools.scheduler import Scheduler +from pydal.tools.tags import Tags + +from py4web import DAL, Cache, Field, Flash, Session, Translator, action +from py4web.server_adapters.logging_utils import make_logger from py4web.utils.auth import Auth from py4web.utils.downloader import downloader -from pydal.tools.tags import Tags from py4web.utils.factories import ActionFactory +from py4web.utils.mailer import Mailer + from . import settings # ####################################################### # implement custom loggers form settings.LOGGERS # ####################################################### -logger = logging.getLogger("py4web:" + settings.APP_NAME) -formatter = logging.Formatter( - "%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s" -) -for item in settings.LOGGERS: - level, filename = item.split(":", 1) - if filename in ("stdout", "stderr"): - handler = logging.StreamHandler(getattr(sys, filename)) - else: - handler = logging.FileHandler(filename) - handler.setFormatter(formatter) - logger.setLevel(getattr(logging, level.upper(), "DEBUG")) - logger.addHandler(handler) - -# ####################################################### -# create required folders -# ####################################################### - -for folder in [settings.DB_FOLDER, - settings.T_FOLDER, - settings.UPLOAD_FOLDER]: - if not os.path.exists(folder): - os.mkdir(folder) +logger = make_logger("py4web:" + settings.APP_NAME, settings.LOGGERS) # ####################################################### # connect to db @@ -56,13 +38,13 @@ # ####################################################### cache = Cache(size=1000) T = Translator(settings.T_FOLDER) -flash = Flash() # ####################################################### # pick the session type that suits you best # ####################################################### if settings.SESSION_TYPE == "cookies": session = Session(secret=settings.SESSION_SECRET_KEY) + elif settings.SESSION_TYPE == "redis": import redis @@ -75,11 +57,15 @@ else cs(k, v, e) ) session = Session(secret=settings.SESSION_SECRET_KEY, storage=conn) + elif settings.SESSION_TYPE == "memcache": - import memcache, time + import time + + import memcache conn = memcache.Client(settings.MEMCACHE_CLIENTS, debug=0) session = Session(secret=settings.SESSION_SECRET_KEY, storage=conn) + elif settings.SESSION_TYPE == "database": from py4web.utils.dbstore import DBStore @@ -92,11 +78,16 @@ auth.use_username = True auth.param.registration_requires_confirmation = settings.VERIFY_EMAIL auth.param.registration_requires_approval = settings.REQUIRES_APPROVAL -auth.allowed_actions = ["all"] -auth.login_expiration_time = 3600 -auth.password_complexity = {"entropy": 50} -auth.block_previous_password_num = 3 +auth.param.login_after_registration = settings.LOGIN_AFTER_REGISTRATION +auth.param.allowed_actions = settings.ALLOWED_ACTIONS +auth.param.login_expiration_time = 3600 +auth.param.password_complexity = {"entropy": settings.PASSWORD_ENTROPY} +auth.param.block_previous_password_num = 3 +auth.param.default_login_enabled = settings.DEFAULT_LOGIN_ENABLED auth.define_tables() +auth.fix_actions() + +flash = auth.flash # ####################################################### # Configure email sender for auth @@ -139,8 +130,33 @@ callback_url="auth/plugin/oauth2google/callback", ) ) + +if settings.OAUTH2GOOGLE_SCOPED_CREDENTIALS_FILE: + from py4web.utils.auth_plugins.oauth2google_scoped import \ + OAuth2GoogleScoped # TESTED + + auth.register_plugin( + OAuth2GoogleScoped( + secrets_file=settings.OAUTH2GOOGLE_SCOPED_CREDENTIALS_FILE, + scopes=[], # Put here any scopes you want in addition to login + db=db, # Needed to store credentials in auth_credentials + ) + ) + +if settings.OAUTH2GITHUB_CLIENT_ID: + from py4web.utils.auth_plugins.oauth2github import OAuth2Github # TESTED + + auth.register_plugin( + OAuth2Github( + client_id=settings.OAUTH2GITHUB_CLIENT_ID, + client_secret=settings.OAUTH2GITHUB_CLIENT_SECRET, + callback_url="auth/plugin/oauth2github/callback", + ) + ) + if settings.OAUTH2FACEBOOK_CLIENT_ID: - from py4web.utils.auth_plugins.oauth2facebook import OAuth2Facebook # UNTESTED + from py4web.utils.auth_plugins.oauth2facebook import \ + OAuth2Facebook # UNTESTED auth.register_plugin( OAuth2Facebook( @@ -166,10 +182,12 @@ # files uploaded and reference by Field(type='upload') # ####################################################### if settings.UPLOAD_FOLDER: - @action('download/') - @action.uses(db) + + @action("download/") + @action.uses(db) def download(filename): - return downloader(db, settings.UPLOAD_FOLDER, filename) + return downloader(db, settings.UPLOAD_FOLDER, filename) + # To take advantage of this in Form(s) # for every field of type upload you MUST specify: # @@ -177,17 +195,15 @@ def download(filename): # field.download_url = lambda filename: URL('download/%s' % filename) # ####################################################### -# Optionally configure celery +# Define and optionally start the scheduler # ####################################################### -if settings.USE_CELERY: - from celery import Celery - - # to use "from .common import scheduler" and then use it according - # to celery docs - scheduler = Celery( - "apps.%s.tasks" % settings.APP_NAME, broker=settings.CELERY_BROKER +if settings.USE_SCHEDULER: + scheduler = Scheduler( + db, logger=logger, max_concurrent_runs=settings.SCHEDULER_MAX_CONCURRENT_RUNS ) - + scheduler.start() +else: + scheduler = None # ####################################################### # Enable authentication @@ -196,6 +212,10 @@ def download(filename): # ####################################################### # Define convenience decorators +# They can be used instead of @action and @action.uses +# They should NEVER BE MIXED with @action and @action.uses +# If you need to provide extra fixtures for a specific controller +# add them like this: @authenticated(uses=[extra_fixture]) # ####################################################### unauthenticated = ActionFactory(db, session, T, flash, auth) authenticated = ActionFactory(db, session, T, flash, auth.user) diff --git a/apps/fadebook/controllers.py b/apps/fadebook/controllers.py new file mode 100644 index 000000000..d9bde0838 --- /dev/null +++ b/apps/fadebook/controllers.py @@ -0,0 +1,158 @@ +from py4web import HTTP, URL, Field, action, redirect +from py4web.utils.form import Form + +from .common import auth, db, flash, session +from .make_up_data import make + +# +# Convenience functions +# + + +def check_liked(items): + """add a liked attributed to each item""" + query = db.item_like.created_by == auth.user_id + query &= db.item_like.item_id.belongs([item.id for item in items]) + liked_ids = set(row.item_id for row in db(query).select(db.item_like.item_id)) + for item in items: + item["liked"] = "true" if item.id in liked_ids else "false" + + +def friend_ids(user_id): + """return a list of ids of friends (included user_id self)""" + query = db.friend_request.status == "accepted" + query &= (db.friend_request.to_user == user_id) | ( + db.friend_request.from_user == user_id + ) + rows = db(query).select() + return ( + set([user_id]) + | set(row.from_user for row in rows) + | set(row.to_user for row in rows) + ) + + +# +# Pages +# + + +@action("index") +@action.uses("index.html", auth) +def index(): + if auth.user_id: + redirect(URL("feed")) + return {} + + +@action("feed", method=["GET", "POST"]) +@action.uses("feed.html", auth.user) +def feed(): + # make up some random data if only one user + make() + # a form to post a new item to the feed + form = Form(db.feed_item) + # list of 100 most recent posted items by user or friends + items = db(db.feed_item.created_by.belongs(friend_ids(auth.user_id))).select( + orderby=~db.feed_item.created_on, limitby=(0, 100) + ) + # determine if they were liked or not + check_liked(items) + return locals() + + +@action("home/", method=["GET", "POST"]) +@action.uses("home.html", auth.user) +def home(user_id): + if user_id not in friend_ids(auth.user_id): + raise HTTP(400) + user = db.auth_user(user_id) + # list of recent items posted by the user + items = db(db.feed_item.created_by == user_id).select( + orderby=~db.feed_item.created_on, limitby=(0, 100) + ) + # determine if they were liked or not + check_liked(items) + return locals() + + +@action("friends", method=["GET", "POST"]) +@action.uses("friends.html", auth.user) +def friends(): + # a search form (simply by first name) + form = Form([Field("name", required=True)]) + users = [] + if form.accepted: + # select users based on the tokens in the search input + query = None + for token in form.vars.get("name").split(): + q = db.auth_user.first_name.lower().startswith( + token.lower() + ) | db.auth_user.last_name.lower().startswith(token.lower()) + query = query & q if query else q + if query: + users = db(query).select() + + # make list of requests + alphabetical = db.auth_user.first_name + db.auth_user.last_name + query_received = (db.friend_request.to_user == auth.user_id) & ( + db.friend_request.from_user == db.auth_user.id + ) + requests_received = db(query_received).select(orderby=alphabetical) + # make list of requests sent + query_sent = (db.friend_request.from_user == auth.user_id) & ( + db.friend_request.to_user == db.auth_user.id + ) + requests_sent = db(query_sent).select(orderby=alphabetical) + + # return the form, lists, and button factories + return locals() + + +# +# Callback actions +# + + +@action("like/", method=["POST"]) +@action.uses(auth.user) +def like(item_id): + # try unlike + if db(db.item_like.item_id == item_id).delete(): + return dict(liked=False) + # else like + db.item_like.insert(item_id=item_id) + return dict(liked=True) + + +@action("friendship/request/", method=["POST"]) +@action.uses(auth.user) +def friendship_request(user_id): + # if request does not exist already, create it + query = (db.friend_request.to_user == user_id) & ( + db.friend_request.from_user == auth.user_id + ) + query |= (db.friend_request.to_user == auth.user_id) & ( + db.friend_request.from_user == user_id + ) + if not db(query).count(): + db.friend_request.insert( + from_user=auth.user_id, to_user=user_id, status="pending" + ) + + +@action("friendship//accept", method=["POST"]) +@action.uses(auth.user) +def friendship_accept(id): + # the target user can accept the request + db( + (db.friend_request.id == id) & (db.friend_request.to_user == auth.user_id) + ).update(status="accepted") + + +# make a button factory to reject frindship +@action("friendship//reject", method=["POST"]) +@action.uses(auth.user) +def friendship_reject(id): + # both origin and target users can delete a request + db(db.friend_request.id == id).delete() diff --git a/apps/myfeed/make_up_data.py b/apps/fadebook/make_up_data.py similarity index 86% rename from apps/myfeed/make_up_data.py rename to apps/fadebook/make_up_data.py index c8de80e6e..e1734de36 100644 --- a/apps/myfeed/make_up_data.py +++ b/apps/fadebook/make_up_data.py @@ -3,12 +3,13 @@ def make(): # prevent circular imports - from .common import db, action from py4web.utils.populate import populate + from .common import action, db + if db(db.auth_user).count() == 1: populate(db.auth_user, 10, contents={"is_active": True}) - populate(db.feed_item, 100, contents={"is_active": True, "parent_id": 0}) + populate(db.feed_item, 100, contents={"is_active": True}) # populate(db.item_like, 1000, contents={"is_active": True}) ids = [r.id for r in db(db.auth_user).select() if r.id > 1] for k in ids[:3]: diff --git a/apps/myfeed/models.py b/apps/fadebook/models.py similarity index 86% rename from apps/myfeed/models.py rename to apps/fadebook/models.py index d203c4b2b..2f44b7fd6 100644 --- a/apps/myfeed/models.py +++ b/apps/fadebook/models.py @@ -1,6 +1,7 @@ -from .common import * from pydal.validators import IS_NOT_EMPTY +from .common import * + db.define_table( "feed_item", Field("body", "text", requires=IS_NOT_EMPTY()), auth.signature ) @@ -11,7 +12,7 @@ "friend_request", Field("from_user", "reference auth_user"), Field("to_user", "reference auth_user"), - Field("status", options=("accepted", "rejected", "pending")), + Field("status", options=("accepted", "pending", "rejected")), ) db.commit() diff --git a/apps/fadebook/settings.py b/apps/fadebook/settings.py new file mode 100644 index 000000000..ff22e57f2 --- /dev/null +++ b/apps/fadebook/settings.py @@ -0,0 +1,123 @@ +""" +This is an optional file that defined app level settings such as: +- database settings +- session settings +- i18n settings +This file is provided as an example: +""" +import os + +from py4web.core import required_folder + +# mode (default or development) +MODE = "development" + +# db settings +APP_FOLDER = os.path.dirname(__file__) +APP_NAME = os.path.split(APP_FOLDER)[-1] + +# DB_FOLDER: Sets the place where migration files will be created +# and is the store location for SQLite databases +DB_FOLDER = required_folder(APP_FOLDER, "databases") +DB_URI = "sqlite://storage.db" +DB_POOL_SIZE = 1 +DB_MIGRATE = True +DB_FAKE_MIGRATE = False + +# location where static files are stored: +STATIC_FOLDER = required_folder(APP_FOLDER, "static") + +# location where to store uploaded files: +UPLOAD_FOLDER = required_folder(APP_FOLDER, "uploads") + +# send verification email on registration +VERIFY_EMAIL = MODE != "development" + +# complexity of the password 0: no constraints, 50: safe! +PASSWORD_ENTROPY = 0 if MODE == "development" else 50 + +# account requires to be approved ? +REQUIRES_APPROVAL = False + +# auto login after registration +# requires False VERIFY_EMAIL & REQUIRES_APPROVAL +LOGIN_AFTER_REGISTRATION = False + +# ALLOWED_ACTIONS in API / default Forms: +# ["all"] +# ["login", "logout", "request_reset_password", "reset_password", \ +# "change_password", "change_email", "profile", "config", "register", +# "verify_email", "unsubscribe"] +# Note: if you add "login", add also "logout" +ALLOWED_ACTIONS = ["all"] + +# email settings +SMTP_SSL = False +SMTP_SERVER = None +SMTP_SENDER = "you@example.com" +SMTP_LOGIN = "username:password" +SMTP_TLS = False + +# session settings +SESSION_TYPE = "cookies" +SESSION_SECRET_KEY = None # or replace with your own secret +MEMCACHE_CLIENTS = ["127.0.0.1:11211"] +REDIS_SERVER = "localhost:6379" + +# logger settings +LOGGERS = [ + "warning:stdout" +] # syntax "severity:filename:format" filename can be stderr or stdout + +# Disable default login when using OAuth +DEFAULT_LOGIN_ENABLED = True + +# single sign on Google (will be used if provided) +OAUTH2GOOGLE_CLIENT_ID = None +OAUTH2GOOGLE_CLIENT_SECRET = None + +# Single sign on Google, with stored credentials for scopes (will be used if provided). +# set it to something like os.path.join(APP_FOLDER, "private/credentials.json" +OAUTH2GOOGLE_SCOPED_CREDENTIALS_FILE = None + +# single sign on Okta (will be used if provided. Please also add your tenant +# name to py4web/utils/auth_plugins/oauth2okta.py. You can replace the XXX +# instances with your tenant name.) +OAUTH2OKTA_CLIENT_ID = None +OAUTH2OKTA_CLIENT_SECRET = None + +# single sign on Google (will be used if provided) +OAUTH2FACEBOOK_CLIENT_ID = None +OAUTH2FACEBOOK_CLIENT_SECRET = None + +# single sign on GitHub (will be used if provided) +OAUTH2GITHUB_CLIENT_ID = None +OAUTH2GITHUB_CLIENT_SECRET = None + +# enable PAM +USE_PAM = False + +# enable LDAP +USE_LDAP = False +LDAP_SETTINGS = { + "mode": "ad", # Microsoft Active Directory + "server": "mydc.domain.com", # FQDN or IP of one Domain Controller + "base_dn": "cn=Users,dc=domain,dc=com", # base dn, i.e. where the users are located +} + +# i18n settings +T_FOLDER = required_folder(APP_FOLDER, "translations") + +# Scheduler settings +USE_SCHEDULER = False +SCHEDULER_MAX_CONCURRENT_RUNS = 1 + +# Celery settings (alternative to the build-in scheduler) +USE_CELERY = False +CELERY_BROKER = "redis://localhost:6379/0" + +# try import private settings +try: + from .settings_private import * +except (ImportError, ModuleNotFoundError): + pass diff --git a/apps/examples/static/socketio/README.md b/apps/fadebook/static/README.md similarity index 100% rename from apps/examples/static/socketio/README.md rename to apps/fadebook/static/README.md diff --git a/apps/fadebook/static/css/no.css b/apps/fadebook/static/css/no.css new file mode 100644 index 000000000..13dabcf41 --- /dev/null +++ b/apps/fadebook/static/css/no.css @@ -0,0 +1,543 @@ +/***************************************************** + no.css version 2020-08-09.1 + + Designed to style pages without need for custom classes. + headers, paragraphs, buttons, tables, forms, + nav menus, alerts, and dialogs are styled automatically. + The only custom classes are color names, grid column sizes, + and a few convenience ones. + + Grid: + columns, col, c25, c33, c50, c66, c75 + Colors: + black, white, default, success, warning, error, info, transparent + Effects: + accordion, close, tags-list + Utils: + fill, padded + + License: MIT + *****************************************************/ + +/**************************************************** + global style + ****************************************************/ + +*, *:after, *:before { + border:0; + margin:0; + padding:0; + box-sizing: inherit; + color: inherit; +} + +html, body { + max-width: 100vw; + overflow-x: hidden; + box-sizing: border-box; +} + +body { + font-family: "Roboto", Helvetica, Arial, sans-serif; + line-height: 1.8em; + min-height: 100vh; + display: grid; + grid-template-rows: auto 1fr auto; +} + +/**************************************************** + elements style + ****************************************************/ + +p { + text-align:justify +} + +b, label, strong { + font-weight:bold +} + +ul { + list-style-type:none; + padding-left:20px +} + +a { + text-decoration:none; + color:#0074d9; + white-space:nowrap +} + +a:hover { + cursor:pointer +} + +h1,h2,h3,h4,h5,h6{ + font-weight:bold; + line-height: 1em; +} + +h1{ + font-size: 4em; + margin:1.0em 0 0.25em 0 +} + +h2{ + font-size: 2.4em; + margin:0.9em 0 0.25em 0 +} + +h3{ + font-size:1.8em; + margin:0.8em 0 0.25em 0 +} + +h4{ + font-size:1.6em; + margin:0.7em 0 0.30em 0 +} + +h5{ + font-size:1.4em; + margin:0.6em 0 0.40em 0 +} + +h6{ + font-size:1.2em; + margin:0.5em 0 0.50em 0 +} + +header, footer { + display:block; + width:100%; +} + +code { + background: #f4f5f6; + border-radius: .4rem; + font-size: 90; + margin: 0 .2rem; + padding: .2rem .5rem; + white-space: nowrap; +} + +p,li,button,fieldset,input,select,textarea,blockquote,table { + margin-bottom: 1.0rem; +} + +/**************************************************** + table + ****************************************************/ + +table { + border-collapse:collapse; + width: 100% +} + +tbody tr:hover { + background-color:#fbf6d9 +} + +thead tr { + background-color:#f1f1f1 +} + +tbody tr { + border-bottom:2px solid #f1f1f1 +} + +td, th { + padding: 4px 8px; + text-align: left; + vertical-align:top +} + +thead th { + vertical-align:bottom +} + +@media (min-width: 40rem) { + table { + display: table; + overflow-x: initial; + } +} + +/**************************************************** + buttons + ****************************************************/ + +[role="button"], button, input[type='button'], input[type='reset'], input[type='submit'] { + background-color: #0074d9; + border-radius: 5px; + margin-right: 10px; + margin-bottom: 10px; + color: #fff; + cursor: pointer; + display: inline-block; + font-size: 1.1rem; + font-weight: 300; + height: 1.8rem; + line-height: 1.8rem; + padding: 0 1.0rem; + text-align: center; + text-decoration: none; + white-space: nowrap; + min-width: 100px; +} + +[role="button"]:focus, [role="button"]:hover, button:focus, button:hover, input[type='button']:focus, input[type='button']:hover, input[type='reset']:focus, input[type='reset']:hover, input[type='submit']:focus, input[type='submit']:hover { + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} + +/**************************************************** + forms + ****************************************************/ + +input[type='color'], input[type='date'], input[type='datetime'], input[type='time'], input[type='datetime-local'], input[type='email'], input[type='month'], input[type='number'], input[type='password'], input[type='search'], input[type='tel'], input[type='text'], input[type='url'], input[type='week'], input:not([type]), textarea, select { + -webkit-appearance: none; + background-color: transparent; + border: 0.1rem solid #d1d1d1; + border-radius: 5px; + box-shadow: none; + box-sizing: inherit; + font-family: monospace; + font-size: 1.2em; + padding: .5em 1.0em .5em; + width: 100%; +} + +input[type='color']:focus, input[type='date']:focus, input[type='time']:focus, input[type='datetime']:focus, input[type='datetime-local']:focus, input[type='email']:focus, input[type='month']:focus, input[type='number']:focus, input[type='password']:focus, input[type='search']:focus, input[type='tel']:focus, input[type='text']:focus, input[type='url']:focus, input[type='week']:focus, input:not([type]):focus, textarea:focus, select:focus { + border-color: #0074d9; + outline: 0; +} + +select { + background: url('data:image/svg+xml;utf8,') center right no-repeat; +} + +select[multiple] { + background: none; + height: auto; +} + +textarea { + min-height: 6.5rem; +} + +fieldset { + border-width: 0; + padding: 0; +} + +input[type='checkbox'], input[type='radio'] { + display: inline; +} + +[disabled] { + cursor: default; + opacity: .5; +} + +/**************************************************** + grid and page formatting + ****************************************************/ + +body > center > * { + text-align: initial; + max-width: 900px; + margin-left: auto; + margin-right: auto; +} + +.columns { + display: table; + width: 100%; +} + +.columns .columns { + margin: 0 -1.5em; +} + +@media (min-width:600px) { + .col,.c25,.c33,.c50,.c66,.c75 { + padding: 1.5em; + display: table-cell; + vertical-align: top; + } + .c25 { width: 24.9%; } + .c33 { width: 33.3%; } + .c50 { width: 49.9%; } + .c66 { width: 66.6%; } + .c75 { width: 74.9%; } +} + +@media (max-width:600px) { + .col,.c25,.c33,.c50,.c66,.c75 { + padding: 20px; + display: block; + vertical-align: top; + } +} + +.columns:after { + content: ""; + clear: both; + display: table; +} + +/**************************************************** + colors + ****************************************************/ + +.transparent{background-color:transparent;color:#111} +.default{background-color:#0074d9;color:white} +.success{background-color:#2ecc40;color:white} +.warning{background-color:#ffdc00;color:#111} +.error{background-color:#cc1f00;color:white} +.info{background-color:#f1f1f1;color:#111} +.white{background-color:white;color:#111;padding 5px;} +.black{background-color:#111;color:white} + +/**************************************************** + navigation and nested menu + ****************************************************/ + +nav { + position:relative; + padding: 0 1.5em; + display: table; + width: 100vw; + height: 40px; +} + +nav ul { + list-style:none; + position:relative; + padding:0 +} + +nav > input[type=checkbox], nav > label { + display: none; +} + +@media (min-width:600px) { + nav > * { + display: table-cell; + vertical-align: middle; + } + nav > ul:last-child { + float:right; + } + nav > ul > li { + padding: 1.5em 0.5em + } +} + +@media (max-width:600px) { + nav > ul { + display: table-column; + vertical-align: middle; + } + nav > label { + position: absolute; + display: inline-block; + top: 5px; + right: 20px; + font-size: 2em; + } + nav > a { + display: inline-block; + padding-top: 8px !important; + } + nav > ul { + display: block; + } + nav > input[type=checkbox]:not(:checked) ~ ul { + display: none; + } + nav > ul > li { + display: block; + text-align: center; + padding: 0.5em 0.2em; + } +} + +nav li:hover { + background-color: #0074d9 +} + +nav li:hover > a { + color: white +} + +nav a { + padding:0 5px; + text-decoration:none; + text-align:left; + color: black; +} + +nav.black ul ul a { + color: black +} + +nav.black a, nav.black > label { + color: white +} + +nav li { + position:relative; + margin:0; + padding:0; + display: inline-block +} + +nav ul ul { + border:1px solid #e1e1e1; + visibility:hidden; + opacity:0; + position:absolute; + top:90%; + left:-20px; + padding:0; + z-index:1000; + transition:all 0.2s ease-out; + list-style-type: none; + box-shadow:5px 5px 10px #666; + background-color: white +} + +nav ul ul li { + width: 100%; +} + +nav ul ul a { + padding:10px 15px; + color:#333; + font-weight:700; + font-size:12px; + line-height:16px; + display: block; + color: #111; +} + +nav ul ul ul { + top:0; + left:80%; + z-index:1100 +} + +nav li:hover > ul { + visibility:visible; + opacity:1 +} + +nav>li>ul>li:first-child:before{ + content:''; + position:absolute; + width:1px; + height:1px; + border:10px solid transparent; + left:50px; + top:-20px; + margin-left:-10px; + border-bottom-color:white +} + +/**************************************************** + modal + ****************************************************/ + +[role="dialog"] > div { + position:fixed; + z-index:9999; + top:0; + bottom:0; + left:0; + right:0; + background-color:rgba(0,0,0,0.8); + padding-top:20vh; + transition:opacity 500ms; + visibility:hidden; + opacity:0; +} +[role="dialog"] > input[type=checkbox] { display: none !important; } +input[type=checkbox]:checked ~ div {visibility:visible; opacity:1} +[role="dialog"] > div > *:not(.close) {width: 66%; margin-left:auto; margin-right:auto; border-radius: 5px;} +[role="dialog"] > div > .close, [role="alert"] > .close { + background: url('data:image/svg+xml;utf8,') center right no-repeat; + width:24px; height:24px; cursor: pointer; position:absolute; top:15px; right:15px; + cursor: pointer; +} + +/**************************************************** + accordion + ****************************************************/ + +.accordion>label{cursor:pointer} +.accordion>input ~ label:before {content:"\25b2"; color:#ddd} +.accordion>input:checked ~ label:before {content:"\25bc"; color:#ddd} +.accordion>input {display:none} +.accordion>input:checked ~ *:not(label) { + max-height: 1000px !important; + overflow:hidden !important; + -webkit-transition: max-height .3s ease-in; + transition: max-height .3s ease-in; +} + +.accordion>*:not(label) { + max-height: 0; + overflow: hidden; + margin: 0; + padding: 0; + -webkit-transition: max-height .3s ease-out; + transition: max-height .3s ease-out; +} + +/**************************************************** + convenience + ****************************************************/ + +[role="alert"] { + margin: 1.5em; + padding: 1.5em; + position: relative; + border-radius: 5px; + color: black; +} + +[role="alert"] > .close { + position: absolute; + top: 10px; + right: 10px; +} + +.padded { + padding: 1.5em; +} + +.fill { + width: 100%; +} + +ul.tags-list { + padding-left: 0; +} + +ul.tags-list li { + display: inline-block; + border-radius: 100px; + background-color: #111111; + color: white; + padding: 0.3em 0.8em 0.2em 0.8em; + line-height: 1.2em; + margin: 2px; + cursor: pointer; + opacity: 0.2; + text-transform: capitalize; +} + +ul.tags-list li[data-selected=true] { + opacity: 1.0; +} diff --git a/apps/examples/static/favicon.ico b/apps/fadebook/static/favicon.ico similarity index 100% rename from apps/examples/static/favicon.ico rename to apps/fadebook/static/favicon.ico diff --git a/apps/myfeed/static/js/utils.js b/apps/fadebook/static/js/utils.js similarity index 82% rename from apps/myfeed/static/js/utils.js rename to apps/fadebook/static/js/utils.js index 8873d808b..aa2bd424c 100644 --- a/apps/myfeed/static/js/utils.js +++ b/apps/fadebook/static/js/utils.js @@ -43,12 +43,18 @@ Q.ajax = function(method, url, data, headers) { return new Promise(function(resolve, reject) { fetch(url, options).then(function(res){ res.text().then(function(body){ - res.data = body; + res.data = body; res.json = function(){return JSON.parse(body);}; resolve(res); }, reject);}).catch(reject); }); } + +Q.get = (url, headers) => Q.ajax("GET", url, null, headers); +Q.post = (url, data, headers) => Q.ajax("POST", url, data, headers); +Q.put = (url, data, headers) => Q.ajax("PUT", url, data, headers); +Q.delete = (url, headers) => Q.ajax("DELETE", url, null, headers); + // Gets a cookie value Q.get_cookie = function (name) { var cookie = RegExp("" + name + "[^;]+").exec(document.cookie); @@ -56,26 +62,6 @@ Q.get_cookie = function (name) { return decodeURIComponent(!!cookie ? cookie.toString().replace(/^[^=]+./, "") : ""); }; -// Gets a session token (py4web specific) -Q.get_session_token = function () { - var app_name = Q.get_cookie('app_name'); - return Q.get_cookie(app_name + '_session'); -}; - -// Load data from localstorage -Q.retrieve = function (key) { - try { - return JSON.parse(window.localStorage.getItem(key)); - } catch (e) { - return null; - } -}; - -// Save data to localstorage -Q.store = function (key, value) { - window.localStorage.setItem(key, JSON.stringify(value)); -}; - // Load components lazily: https://vuejs.org/v2/guide/components.html#Async-Components Q.register_vue_component = function (name, src, onload) { Vue.component(name, function (resolve, reject) { @@ -164,59 +150,6 @@ Q.throttle = (callback, delay) => { return throttledEventHandler; }; -// A Vue app prototype -Q.app = function (elem_id) { - self = {}; - self.elem_id = elem_id || 'vue'; - self.data = { loading: 0, page: null, state: null }; - self.methods = {}; - self.filters = {}; - self.watch = {}; - self.pages = {}; - // translations - self.methods.T = T; - // toggles a variable - self.methods.toggle = function (obj, key) { obj[key] = !obj[key] }; - // sets a variable - self.methods.set = function (obj, key, value) { obj[key] = value; }; - // goto a given page and state (state should be 1 level deep dict - self.methods.go = function (page, state, push) { - self.v.loading++; - var pagecall = self.pages[page]; - if (pagecall) pagecall(state, function () { - if (push) { - var path = self.base + '/' + page; - if (state) for (var key in state) path += '/' + key + '/' + state[key]; - window.history.pushState(self.v, page, path); - } - self.v.loading--; - self.v.page = page; - self.v.state = state; - }); - }; - // restores state when navigating history - self.onpopstate = function (event) { - for (var key in event.state) self.v[key] = event.state[key]; - }; - self.start = function (base) { - self.base = base = base || window.location.href;; - self.v = new Vue({ - el: '#' + self.elem_id, - data: self.data, - methods: self.methods, - watch: self.watch, - filters: self.filters - }); - var parts = window.location.href.substr(base.length); - var page = parts[0]; - var state = {}; - for (var i = 1; i < parts.length; i += 2) state[parts[i]] = parts[i + 1]; - self.v.go(page, state, false); - window.onpopstate = self.onpopstate; - }; - return self; -}; - // Renders a JSON field with tags_input Q.tags_input = function(elem, options) { if (typeof elem === typeof '') elem = Q(elem)[0]; @@ -245,7 +178,6 @@ Q.tags_input = function(elem, options) { var fill = function(elem, repl) { repl.innerHTML = ''; tags.forEach(function(x){ - console.log(x); var item = document.createElement('li'); item.innerHTML = options.labels[x] || x; item.dataset.value = x; @@ -255,12 +187,14 @@ Q.tags_input = function(elem, options) { if(item.dataset.selected=='false') keys.push(x); else keys = keys.filter(function(y){ return x!=y; }); item.dataset.selected = keys.indexOf(x)>=0; elem.value = JSON.stringify(keys); + elem.dispatchEvent(new Event('input', { bubbles: true })); }; }); }; if (options.freetext) { var inp = document.createElement('input'); elem.parentNode.insertBefore(inp, elem); + inp.type = "text"; inp.classList = elem.classList; inp.placeholder = options.placeholder; inp.setAttribute('list', options.autocomplete_list); @@ -273,6 +207,7 @@ Q.tags_input = function(elem, options) { }); inp.value = ''; elem.value = JSON.stringify(keys); + elem.dispatchEvent(new Event('input', { bubbles: true })); fill(elem, repl); }; } @@ -330,7 +265,6 @@ Q.load_and_trap = function (method, url, form_data, target) { if (res.redirected) window.location = res.url; Q('#'+target)[0].innerHTML = res.data; Q.trap_form(url, target); - console.log(res.headers); var flash = res.headers.get('component-flash'); if (flash) Q.flash(JSON.parse(flash)); }; @@ -368,7 +302,6 @@ Q.handle_flash = function() { if (elem) { elem.addEventListener('flash', make_handler(elem), false); Q.flash = function(detail) {elem.dispatchEvent(new CustomEvent('flash', {detail: detail}));}; - console.log(elem.dataset.alert); if (elem.dataset.alert) Q.flash(Q.eval(elem.dataset.alert)); } }; diff --git a/apps/examples/static/ws/README.md b/apps/fadebook/templates/README.md similarity index 100% rename from apps/examples/static/ws/README.md rename to apps/fadebook/templates/README.md diff --git a/apps/fadebook/templates/auth.html b/apps/fadebook/templates/auth.html new file mode 100644 index 000000000..8f4c6b73a --- /dev/null +++ b/apps/fadebook/templates/auth.html @@ -0,0 +1,15 @@ +[[extend "layout.html"]] + +
    + [[=form]] +
    diff --git a/apps/fadebook/templates/feed.html b/apps/fadebook/templates/feed.html new file mode 100644 index 000000000..7c8d6f9ab --- /dev/null +++ b/apps/fadebook/templates/feed.html @@ -0,0 +1,7 @@ +[[extend "layout.html"]] + +

    My Feed

    + +[[=form]] + +[[include "posts.html"]] diff --git a/apps/fadebook/templates/friends.html b/apps/fadebook/templates/friends.html new file mode 100644 index 000000000..dc18bc412 --- /dev/null +++ b/apps/fadebook/templates/friends.html @@ -0,0 +1,64 @@ +[[extend "layout.html"]] +

    Friends Search

    + +Try search for a user starting with "a" +[[=form]] + + + [[for user in users:]] + + + + + + + [[pass]] +
    [[=user.first_name]][[=user.last_name]][[=user.username]]
    + +

    Requests received

    + + [[for r in requests_received:]] + + + + + + + + [[pass]] +
    [[=r.auth_user.first_name]][[=r.auth_user.last_name]][[=r.auth_user.username]][[=r.friend_request.status]] + [[if r.friend_request.status == 'pending':]] + + + [[else:]] + + [[pass]] +
    + +

    Requests sent

    + + [[for r in requests_sent:]] + + + + + + + + [[pass]] +
    [[=r.auth_user.first_name]][[=r.auth_user.last_name]][[=r.auth_user.username]][[=r.friend_request.status]] + +
    + + diff --git a/apps/examples/templates/generic.html b/apps/fadebook/templates/generic.html similarity index 100% rename from apps/examples/templates/generic.html rename to apps/fadebook/templates/generic.html diff --git a/apps/fadebook/templates/home.html b/apps/fadebook/templates/home.html new file mode 100644 index 000000000..ba7bd3774 --- /dev/null +++ b/apps/fadebook/templates/home.html @@ -0,0 +1,5 @@ +[[extend "layout.html"]] + +

    Posts by user [[= user['username'] ]]

    + +[[include "posts.html"]] diff --git a/apps/fadebook/templates/index.html b/apps/fadebook/templates/index.html new file mode 100644 index 000000000..c992a0533 --- /dev/null +++ b/apps/fadebook/templates/index.html @@ -0,0 +1,6 @@ +[[extend "layout.html"]] + +
    +

    Welcome to FadeBook

    + Click to Login +
    diff --git a/apps/fadebook/templates/layout.html b/apps/fadebook/templates/layout.html new file mode 100644 index 000000000..b1ee56a60 --- /dev/null +++ b/apps/fadebook/templates/layout.html @@ -0,0 +1,81 @@ + + + + + + + + + + [[block page_head]][[end]] + + +
    + + +
    + +
    +
    + + +
    +
    + + [[include]] +
    +
    + +
    +

    + Made with py4web +

    +
    + + + + [[block page_scripts]][[end]] + diff --git a/apps/fadebook/templates/posts.html b/apps/fadebook/templates/posts.html new file mode 100644 index 000000000..9a2e334f0 --- /dev/null +++ b/apps/fadebook/templates/posts.html @@ -0,0 +1,20 @@ +[[for item in items:]] +
    + + [[=item.created_by.first_name]] + [[=item.created_by.last_name]] + + on [[=item.created_on]] says +
    [[=item.body]]
    + +
    +[[pass]] + + diff --git a/apps/myfeed/translations/it.json b/apps/fadebook/translations/it.json similarity index 100% rename from apps/myfeed/translations/it.json rename to apps/fadebook/translations/it.json diff --git a/apps/myfeed/common.py b/apps/myfeed/common.py deleted file mode 100644 index cf308e1de..000000000 --- a/apps/myfeed/common.py +++ /dev/null @@ -1,131 +0,0 @@ -""" -This file defines cache, session, and translator T object for the app -These are fixtures that every app needs so probably you will not be editing this file -""" -import os -import sys -import logging -from py4web import ( - action, - redirect, - abort, - request, - URL, - Session, - Cache, - Translator, - DAL, - Field, -) -from py4web.utils.mailer import Mailer -from py4web.utils.auth import Auth -from pydal.tools.tags import Tags -from py4web.utils.form import Form -from py4web.utils.factories import ActionFactory -from . import settings - -# implement custom loggers form settings.LOGGERS -logger = logging.getLogger("py4web:" + settings.APP_NAME) -formatter = logging.Formatter( - "%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s" -) -for item in settings.LOGGERS: - level, filename = item.split(":", 1) - if filename in ("stdout", "stderr"): - handler = logging.StreamHandler(getattr(sys, filename)) - else: - handler = logging.FileHandler(filename) - handler.setLevel(getattr(logging, level.upper(), "ERROR")) - handler.setFormatter(formatter) - logger.addHandler(handler) - -# connect to db -db = DAL( - settings.DB_URI, - folder=settings.DB_FOLDER, - pool_size=settings.DB_POOL_SIZE, - migrate_enabled=True, -) - -# define global objects that may or may not be used by th actions -cache = Cache(size=1000) -T = Translator(settings.T_FOLDER) - -# pick the session type that suits you best -if settings.SESSION_TYPE == "cookies": - session = Session(secret=settings.SESSION_SECRET_KEY) -elif settings.SESSION_TYPE == "redis": - import redis - - host, port = settings.REDIS_SERVER.split(":") - # for more options: https://github.com/andymccurdy/redis-py/blob/master/redis/client.py - conn = redis.Redis(host=host, port=int(port)) - conn.set = ( - lambda k, v, e, cs=conn.set, ct=conn.ttl: cs(k, v, ct(k)) - if ct(k) >= 0 - else cs(k, v, e) - ) - session = Session(secret=settings.SESSION_SECRET_KEY, storage=conn) -elif settings.SESSION_TYPE == "memcache": - import memcache, time - - conn = memcache.Client(settings.MEMCACHE_CLIENTS, debug=0) - session = Session(secret=settings.SESSION_SECRET_KEY, storage=conn) -elif settings.SESSION_TYPE == "database": - from py4web.utils.dbstore import DBStore - - session = Session(secret=settings.SESSION_SECRET_KEY, storage=DBStore(db)) - -auth = Auth(session, db, password_complexity=settings.PASSWORD_COMPLEXITY) -auth.param.registration_requires_confirmation = settings.VERIFY_EMAIL - - -if settings.SMTP_SERVER: - auth.sender = Mailer( - server=settings.SMTP_SERVER, - sender=settings.SMTP_SENDER, - login=settings.SMTP_LOGIN, - tls=settings.SMTP_TLS, - ) - -if auth.db: - groups = Tags(db.auth_user, "groups") - -if settings.USE_PAM: - from py4web.utils.auth_plugins.pam_plugin import PamPlugin - - auth.register_plugin(PamPlugin()) - -if settings.USE_LDAP: - from py4web.utils.auth_plugins.ldap_plugin import LDAPPlugin - - auth.register_plugin(LDAPPlugin(**settings.LDAP_SETTINGS)) - -if settings.OAUTH2GOOGLE_CLIENT_ID: - from py4web.utils.auth_plugins.oauth2google import OAuth2Google # TESTED - - auth.register_plugin( - OAuth2Google( - client_id=settings.OAUTH2GOOGLE_CLIENT_ID, - client_secret=settings.OAUTH2GOOGLE_CLIENT_SECRET, - callback_url="auth/plugin/oauth2google/callback", - ) - ) -if settings.OAUTH2FACEBOOK_CLIENT_ID: - from py4web.utils.auth_plugins.oauth2facebook import OAuth2Facebook # UNTESTED - - auth.register_plugin( - OAuth2Facebook( - client_id=settings.OAUTH2FACEBOOK_CLIENT_ID, - client_secret=settings.OAUTH2FACEBOOK_CLIENT_SECRET, - callback_url="auth/plugin/oauth2google/callback", - ) - ) - -# we enable auth, which requres sessions, T, db and we make T available to -# the template, although we recommend client-side translations instead -from py4web.utils.cors import CORS -auth.enable(uses=(session, T, db, CORS()), env=dict(T=T)) - -unauthenticated = ActionFactory(db, session, T, auth) -authenticated = ActionFactory(db, session, T, auth.user) diff --git a/apps/myfeed/controllers.py b/apps/myfeed/controllers.py deleted file mode 100644 index 11ee56261..000000000 --- a/apps/myfeed/controllers.py +++ /dev/null @@ -1,113 +0,0 @@ -from .common import * -from . import make_up_data - - -def get_requests(status=None, received=True): - """returns a join between all friend_requests (sent or received) - optionally filtered by status and auth_users""" - to_user, from_user = ( - ("to_user", "from_user") if received else ("from_user", "to_user") - ) - query = db.friend_request[to_user] == auth.user_id - query &= db.friend_request[from_user] == db.auth_user.id - if status: - query &= db.friend_request.status == status - return db(query).select( - db.auth_user.ALL, - db.friend_request.ALL, - orderby=db.auth_user.first_name + db.auth_user.last_name, - ) - - -def check_liked(items): - query = db.item_like.created_by == auth.user_id - query &= db.item_like.item_id.belongs(items.as_dict().keys()) - liked_ids = [row.item_id for row in db(query).select()] - for item in items: - item["liked"] = item.id in liked_ids - - -# make a "like" button factory -@authenticated.callback() -def like(id): - db.item_like.insert(item_id=id) - - -# the "/index" page -@authenticated() -def index(): - # make up some random data if only one user - make_up_data.make() - # my id - me = auth.user_id - # ids of all users following (including myself) - ids = [r.auth_user.id for r in get_requests("accepted")] + [me] - # a form to post a new item to the feed - form = Form(db.feed_item) - # list of receted posted items - items = db(db.feed_item.created_by.belongs(ids)).select( - orderby=~db.feed_item.created_on, limitby=(0, 100) - ) - check_liked(items) - return dict(form=form, items=items, like=like) - - -# the "/home/{user_id}" page -@authenticated() -def home(id): - # list of recent items posted by the user - items = db(db.feed_item.created_by == id).select( - orderby=~db.feed_item.created_on, limitby=(0, 100) - ) - check_liked(items) - return dict(items=items, like=like, user=db.auth_user[id]) - - -# make a button factory to request friendship -@authenticated.callback() -def request_friendship(id): - db.friend_request.insert(from_user=auth.user_id, to_user=id, status="pending") - - -# make a button factory to accept friendship -@authenticated.callback() -def accept_friendship(id): - friend_request = db.friend_request[id] - friend_request.update_record(status="accepted") - # after accepting also create the reciprocal relation - db.friend_request.insert( - from_user=friend_request.to_user, - to_user=friend_request.from_user, - status="accepted", - ) - - -# make a button factory to reject frindship -@authenticated.callback() -def reject_friendship(id): - db(db.friend_request.id == id).update(status="rejected") - - -# page "/friends" to search for new friends, see requests, accept/reject -@authenticated() -def friends(): - # list of requests received and sent - requests_received = get_requests(received=True) - requests_sent = get_requests(received=False) - # a search form (simply by first name) - form = Form([Field("name", requred=True)]) - users = [] - if form.accepted: - query = db.auth_user.first_name.startswith(form.vars.get("name")) - users = db(query).select() - - # return the form, lists, and button factories - return dict( - requests_received=requests_received, - requests_sent=requests_sent, - form=form, - users=users, - request_friendship=request_friendship, - accept_friendship=accept_friendship, - reject_friendship=reject_friendship, - ) diff --git a/apps/myfeed/git.zip b/apps/myfeed/git.zip deleted file mode 100644 index 5103419ee..000000000 Binary files a/apps/myfeed/git.zip and /dev/null differ diff --git a/apps/myfeed/static/components/auth.html b/apps/myfeed/static/components/auth.html deleted file mode 100644 index 83e6c946a..000000000 --- a/apps/myfeed/static/components/auth.html +++ /dev/null @@ -1,219 +0,0 @@ -
    -
    -
    -

    Register

    -
    -
    - - {{errors.username}} -
    -
    - - {{errors.email}} -
    -
    - - {{errors.password}} -
    -
    - - {{errors.password2}} -
    -
    - - {{errors.first_name}} -
    -
    - - {{errors.last_name}} -
    -
    - - - - {{errors[field.name]}} -
    -
    - - - -
    -
    -
    -
    -

    404 - Page non available

    - - -
    -
    -
    -
    -

    403 - User not authorized

    - - -
    -
    -
    -
    -

    Login

    -
    - -
    -
    - - - {{errors.email}} -
    -
    - - {{errors.password}} -
    -
    - - - -
    -
    -
    -
    -
    -

    Request Reset Password

    -
    -
    - - {{errors.email}} -
    -
    - - -
    -
    -
    -
    -

    Reset Password

    -
    -
    - - {{errors.new_password}} -
    -
    - - {{errors.new_password2}} -
    -
    - - -
    -
    -
    -
    -

    Change Password

    -
    -
    - - {{errors.old_password}} -
    -
    - - {{errors.new_password}} -
    -
    - - {{errors.new_password2}} -
    -
    - -
    -
    -
    -
    -

    Change Email

    -
    -
    - - {{errors.password}} -
    -
    - - {{errors.new_email}} -
    -
    - - {{errors.new_email2}} -
    -
    - -
    -
    -
    -
    -

    Profile

    -
    -
    - - {{errors.first_name}} -
    -
    - - {{errors.last_name}} -
    -
    - -
    -
    -
    -
    -

    Registered

    -
    -
    - -
    -
    -
    -
    -

    Request sent

    -
    -
    - -
    -
    -
    -
    -

    Email Verified

    -
    -
    - -
    -
    -
    -
    -

    Token Expired

    -
    -
    - -
    -
    -
    -
    -

    Logged out

    -
    -
    - -
    -
    -
    diff --git a/apps/myfeed/static/components/auth.js b/apps/myfeed/static/components/auth.js deleted file mode 100644 index 99130830e..000000000 --- a/apps/myfeed/static/components/auth.js +++ /dev/null @@ -1,129 +0,0 @@ -(function(){ - - var auth = { data: {}, methods: {}}; - - auth.data = function() { - var parts = window.location.href.split('?')[0].split('/'); - var data = { - plugins: [], - allowed_actions: [], - fields: [], - page: parts[parts.length-1], - next: Q.get_query()['next'] || '../index', - form: {}, - errors: {}, - user: null, - use_username: true - }; - return data; - }; - - auth.methods.go = function(page, no_history) { - var self=this; - console.log(this); - if (['login','logout','403','404'].indexOf(page)<0 && - self.allowed_actions.indexOf('all')<0 && - self.allowed_actions.indexOf(page)<0) { - page = '404'; - } - var url_noqs = window.location.href.split('?')[0] ; - var url = url_noqs.substring(0, url_noqs.lastIndexOf('/')) + '/' + page; - if (page == 'login') url += '?next=' + self.next ; - if (!no_history) history.pushState({'page': page}, null, url); - if (page == '403' || page == '404') - self.form = {} - else if (page == 'register') { - self.form = {username: '', email:'', password:'', password2:'', first_name:'', last_name: ''}; - self.fields.map(function(f){ if(!(f.name in self.form)) {f._added=true; self.form[f.name]=''; } else f._added=false; }); - } - else if (page == 'login') - self.form = {email:'', password:''}; - else if (page == 'request_reset_password') - self.form = {email:''}; - else if (page == 'reset_password') - self.form = {new_password:'', new_password2:''}; - else if (page == 'change_password') - self.form = {old_password:'', new_password:'', new_password2:''}; - else if (page == 'change_email') - self.form = {password: '', new_email:'', new_email2:''}; - else if (page == 'edit_profile') - self.form = {first_name:'', last_name: ''}; - else - self.form = {}; - self.errors = {} - for(var key in self.form) self.errors[key] = null; - self.page = page; - }; - - auth.methods.on_api_error = function (err){ - var self = this; - var res = err.response; - if(res.data.errors) self.errors = res.data.errors; - else alert(res.data.message); - }; - - auth.methods.submit_login = function() { - var self = this; - axios.post('../auth/api/login', self.form) - .then(function(res) {window.location = self.next}) - .catch(self.on_api_error.bind(self)); - }; - auth.methods.submit_register = function() { - var self = this; - var form = Q.clone(this.form) - delete form['password2'] - axios.post('../auth/api/register', form) - .then(function(res) {self.go('registered')}) - .catch(self.on_api_error.bind(self)); - }; - auth.methods.submit_request_reset_password = function() { - var self = this; - axios.post('../auth/api/request_reset_password', this.form) - .then(function(res) {self.go('request_sent')}) - .catch(self.on_api_error.bind(self)); - - }; - auth.methods.submit_reset_password = function() { - var self = this; - this.form.token = Q.get_query()['token']; - axios.post('../auth/api/reset_password', this.form) - .then(function(res) {self.go('login')}) - .catch(self.on_api_error.bind(self)); - }; - auth.methods.submit_change_password = function() { - var self = this; - axios.post('../auth/api/change_password', this.form) - .then(function(res) {window.location = self.next}) - .catch(self.on_api_error.bind(self)); - }; - auth.methods.submit_change_email = function() { - var self = this; - axios.post('../auth/api/change_email', this.form) - .then(function(res) {window.location = self.next}) - .catch(self.on_api_error.bind(self)) - }; - auth.methods.submit_edit_profile = function() { - var self = this; - axios.post('../auth/api/profile', this.form) - .then(function(res) {window.location = self.next}) - .catch(self.on_api_error.bind(self)); - }; - auth.created = function() { - var self = this; - window.addEventListener('popstate', function (event) { - self.go(event.state.page, true); - }, false); - axios.get('../auth/api/config').then(function(res){ - self.plugins=res.data.plugins; - self.allowed_actions=res.data.allowed_actions; - self.fields=res.data.fields; - self.use_username=res.data.use_username; - self.go(self.page, true); - }); - }; - Q.register_vue_component('auth', 'components/auth.html', function(template) { - auth.template = template.data; - return auth; - }); - -})(); \ No newline at end of file diff --git a/apps/myfeed/static/css/bulma.css b/apps/myfeed/static/css/bulma.css deleted file mode 100644 index dde87d61a..000000000 --- a/apps/myfeed/static/css/bulma.css +++ /dev/null @@ -1,10524 +0,0 @@ -/*! bulma.io v0.7.4 | MIT License | github.com/jgthms/bulma */ -@-webkit-keyframes spinAround { - from { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - to { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -@keyframes spinAround { - from { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - to { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} - -.delete, .modal-close, .is-unselectable, .button, .file, .breadcrumb, .pagination-previous, -.pagination-next, -.pagination-link, -.pagination-ellipsis, .tabs { - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.select:not(.is-multiple):not(.is-loading)::after, .navbar-link:not(.is-arrowless)::after { - border: 3px solid transparent; - border-radius: 2px; - border-right: 0; - border-top: 0; - content: " "; - display: block; - height: 0.625em; - margin-top: -0.4375em; - pointer-events: none; - position: absolute; - top: 50%; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - -webkit-transform-origin: center; - transform-origin: center; - width: 0.625em; -} - -.box:not(:last-child), .content:not(:last-child), .notification:not(:last-child), .progress:not(:last-child), .table:not(:last-child), .table-container:not(:last-child), .title:not(:last-child), -.subtitle:not(:last-child), .block:not(:last-child), .highlight:not(:last-child), .breadcrumb:not(:last-child), .level:not(:last-child), .list:not(:last-child), .message:not(:last-child), .tabs:not(:last-child) { - margin-bottom: 1.5rem; -} - -.delete, .modal-close { - -moz-appearance: none; - -webkit-appearance: none; - background-color: rgba(10, 10, 10, 0.2); - border: none; - border-radius: 290486px; - cursor: pointer; - pointer-events: auto; - display: inline-block; - flex-grow: 0; - flex-shrink: 0; - font-size: 0; - height: 20px; - max-height: 20px; - max-width: 20px; - min-height: 20px; - min-width: 20px; - outline: none; - position: relative; - vertical-align: top; - width: 20px; -} - -.delete::before, .modal-close::before, .delete::after, .modal-close::after { - background-color: white; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - -webkit-transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform: translateX(-50%) translateY(-50%) rotate(45deg); - -webkit-transform-origin: center center; - transform-origin: center center; -} - -.delete::before, .modal-close::before { - height: 2px; - width: 50%; -} - -.delete::after, .modal-close::after { - height: 50%; - width: 2px; -} - -.delete:hover, .modal-close:hover, .delete:focus, .modal-close:focus { - background-color: rgba(10, 10, 10, 0.3); -} - -.delete:active, .modal-close:active { - background-color: rgba(10, 10, 10, 0.4); -} - -.is-small.delete, .is-small.modal-close { - height: 16px; - max-height: 16px; - max-width: 16px; - min-height: 16px; - min-width: 16px; - width: 16px; -} - -.is-medium.delete, .is-medium.modal-close { - height: 24px; - max-height: 24px; - max-width: 24px; - min-height: 24px; - min-width: 24px; - width: 24px; -} - -.is-large.delete, .is-large.modal-close { - height: 32px; - max-height: 32px; - max-width: 32px; - min-height: 32px; - min-width: 32px; - width: 32px; -} - -.button.is-loading::after, .select.is-loading::after, .control.is-loading::after, .loader { - -webkit-animation: spinAround 500ms infinite linear; - animation: spinAround 500ms infinite linear; - border: 2px solid #dbdbdb; - border-radius: 290486px; - border-right-color: transparent; - border-top-color: transparent; - content: ""; - display: block; - height: 1em; - position: relative; - width: 1em; -} - -.is-overlay, .image.is-square img, -.image.is-square .has-ratio, .image.is-1by1 img, -.image.is-1by1 .has-ratio, .image.is-5by4 img, -.image.is-5by4 .has-ratio, .image.is-4by3 img, -.image.is-4by3 .has-ratio, .image.is-3by2 img, -.image.is-3by2 .has-ratio, .image.is-5by3 img, -.image.is-5by3 .has-ratio, .image.is-16by9 img, -.image.is-16by9 .has-ratio, .image.is-2by1 img, -.image.is-2by1 .has-ratio, .image.is-3by1 img, -.image.is-3by1 .has-ratio, .image.is-4by5 img, -.image.is-4by5 .has-ratio, .image.is-3by4 img, -.image.is-3by4 .has-ratio, .image.is-2by3 img, -.image.is-2by3 .has-ratio, .image.is-3by5 img, -.image.is-3by5 .has-ratio, .image.is-9by16 img, -.image.is-9by16 .has-ratio, .image.is-1by2 img, -.image.is-1by2 .has-ratio, .image.is-1by3 img, -.image.is-1by3 .has-ratio, .modal, .modal-background, .hero-video { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; -} - -.button, .input, -.textarea, .select select, .file-cta, -.file-name, .pagination-previous, -.pagination-next, -.pagination-link, -.pagination-ellipsis { - -moz-appearance: none; - -webkit-appearance: none; - align-items: center; - border: 1px solid transparent; - border-radius: 4px; - box-shadow: none; - display: inline-flex; - font-size: 1rem; - height: 2.25em; - justify-content: flex-start; - line-height: 1.5; - padding-bottom: calc(0.375em - 1px); - padding-left: calc(0.625em - 1px); - padding-right: calc(0.625em - 1px); - padding-top: calc(0.375em - 1px); - position: relative; - vertical-align: top; -} - -.button:focus, .input:focus, -.textarea:focus, .select select:focus, .file-cta:focus, -.file-name:focus, .pagination-previous:focus, -.pagination-next:focus, -.pagination-link:focus, -.pagination-ellipsis:focus, .is-focused.button, .is-focused.input, -.is-focused.textarea, .select select.is-focused, .is-focused.file-cta, -.is-focused.file-name, .is-focused.pagination-previous, -.is-focused.pagination-next, -.is-focused.pagination-link, -.is-focused.pagination-ellipsis, .button:active, .input:active, -.textarea:active, .select select:active, .file-cta:active, -.file-name:active, .pagination-previous:active, -.pagination-next:active, -.pagination-link:active, -.pagination-ellipsis:active, .is-active.button, .is-active.input, -.is-active.textarea, .select select.is-active, .is-active.file-cta, -.is-active.file-name, .is-active.pagination-previous, -.is-active.pagination-next, -.is-active.pagination-link, -.is-active.pagination-ellipsis { - outline: none; -} - -.button[disabled], .input[disabled], -.textarea[disabled], .select select[disabled], .file-cta[disabled], -.file-name[disabled], .pagination-previous[disabled], -.pagination-next[disabled], -.pagination-link[disabled], -.pagination-ellipsis[disabled], -fieldset[disabled] .button, -fieldset[disabled] .input, -fieldset[disabled] .textarea, -fieldset[disabled] .select select, -.select fieldset[disabled] select, -fieldset[disabled] .file-cta, -fieldset[disabled] .file-name, -fieldset[disabled] .pagination-previous, -fieldset[disabled] .pagination-next, -fieldset[disabled] .pagination-link, -fieldset[disabled] .pagination-ellipsis { - cursor: not-allowed; -} - -/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ -html, -body, -p, -ol, -ul, -li, -dl, -dt, -dd, -blockquote, -figure, -fieldset, -legend, -textarea, -pre, -iframe, -hr, -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - padding: 0; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: 100%; - font-weight: normal; -} - -ul { - list-style: none; -} - -button, -input, -select, -textarea { - margin: 0; -} - -html { - box-sizing: border-box; -} - -*, *::before, *::after { - box-sizing: inherit; -} - -img, -embed, -iframe, -object, -video { - height: auto; - max-width: 100%; -} - -audio { - max-width: 100%; -} - -iframe { - border: 0; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -td, -th { - padding: 0; - text-align: left; -} - -html { - background-color: white; - font-size: 16px; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - min-width: 300px; - overflow-x: hidden; - overflow-y: scroll; - text-rendering: optimizeLegibility; - -webkit-text-size-adjust: 100%; - -moz-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - text-size-adjust: 100%; -} - -article, -aside, -figure, -footer, -header, -hgroup, -section { - display: block; -} - -body, -button, -input, -select, -textarea { - font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif; -} - -code, -pre { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; - font-family: monospace; -} - -body { - color: #4a4a4a; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; -} - -a { - color: #3273dc; - cursor: pointer; - text-decoration: none; -} - -a strong { - color: currentColor; -} - -a:hover { - color: #363636; -} - -code { - background-color: whitesmoke; - color: #ff3860; - font-size: 0.875em; - font-weight: normal; - padding: 0.25em 0.5em 0.25em; -} - -hr { - background-color: whitesmoke; - border: none; - display: block; - height: 2px; - margin: 1.5rem 0; -} - -img { - height: auto; - max-width: 100%; -} - -input[type="checkbox"], -input[type="radio"] { - vertical-align: baseline; -} - -small { - font-size: 0.875em; -} - -span { - font-style: inherit; - font-weight: inherit; -} - -strong { - color: #363636; - font-weight: 700; -} - -fieldset { - border: none; -} - -pre { - -webkit-overflow-scrolling: touch; - background-color: whitesmoke; - color: #4a4a4a; - font-size: 0.875em; - overflow-x: auto; - padding: 1.25rem 1.5rem; - white-space: pre; - word-wrap: normal; -} - -pre code { - background-color: transparent; - color: currentColor; - font-size: 1em; - padding: 0; -} - -table td, -table th { - text-align: left; - vertical-align: top; -} - -table th { - color: #363636; -} - -.is-clearfix::after { - clear: both; - content: " "; - display: table; -} - -.is-pulled-left { - float: left !important; -} - -.is-pulled-right { - float: right !important; -} - -.is-clipped { - overflow: hidden !important; -} - -.is-size-1 { - font-size: 3rem !important; -} - -.is-size-2 { - font-size: 2.5rem !important; -} - -.is-size-3 { - font-size: 2rem !important; -} - -.is-size-4 { - font-size: 1.5rem !important; -} - -.is-size-5 { - font-size: 1.25rem !important; -} - -.is-size-6 { - font-size: 1rem !important; -} - -.is-size-7 { - font-size: 0.75rem !important; -} - -@media screen and (max-width: 768px) { - .is-size-1-mobile { - font-size: 3rem !important; - } - .is-size-2-mobile { - font-size: 2.5rem !important; - } - .is-size-3-mobile { - font-size: 2rem !important; - } - .is-size-4-mobile { - font-size: 1.5rem !important; - } - .is-size-5-mobile { - font-size: 1.25rem !important; - } - .is-size-6-mobile { - font-size: 1rem !important; - } - .is-size-7-mobile { - font-size: 0.75rem !important; - } -} - -@media screen and (min-width: 769px), print { - .is-size-1-tablet { - font-size: 3rem !important; - } - .is-size-2-tablet { - font-size: 2.5rem !important; - } - .is-size-3-tablet { - font-size: 2rem !important; - } - .is-size-4-tablet { - font-size: 1.5rem !important; - } - .is-size-5-tablet { - font-size: 1.25rem !important; - } - .is-size-6-tablet { - font-size: 1rem !important; - } - .is-size-7-tablet { - font-size: 0.75rem !important; - } -} - -@media screen and (max-width: 1087px) { - .is-size-1-touch { - font-size: 3rem !important; - } - .is-size-2-touch { - font-size: 2.5rem !important; - } - .is-size-3-touch { - font-size: 2rem !important; - } - .is-size-4-touch { - font-size: 1.5rem !important; - } - .is-size-5-touch { - font-size: 1.25rem !important; - } - .is-size-6-touch { - font-size: 1rem !important; - } - .is-size-7-touch { - font-size: 0.75rem !important; - } -} - -@media screen and (min-width: 1088px) { - .is-size-1-desktop { - font-size: 3rem !important; - } - .is-size-2-desktop { - font-size: 2.5rem !important; - } - .is-size-3-desktop { - font-size: 2rem !important; - } - .is-size-4-desktop { - font-size: 1.5rem !important; - } - .is-size-5-desktop { - font-size: 1.25rem !important; - } - .is-size-6-desktop { - font-size: 1rem !important; - } - .is-size-7-desktop { - font-size: 0.75rem !important; - } -} - -@media screen and (min-width: 1280px) { - .is-size-1-widescreen { - font-size: 3rem !important; - } - .is-size-2-widescreen { - font-size: 2.5rem !important; - } - .is-size-3-widescreen { - font-size: 2rem !important; - } - .is-size-4-widescreen { - font-size: 1.5rem !important; - } - .is-size-5-widescreen { - font-size: 1.25rem !important; - } - .is-size-6-widescreen { - font-size: 1rem !important; - } - .is-size-7-widescreen { - font-size: 0.75rem !important; - } -} - -@media screen and (min-width: 1472px) { - .is-size-1-fullhd { - font-size: 3rem !important; - } - .is-size-2-fullhd { - font-size: 2.5rem !important; - } - .is-size-3-fullhd { - font-size: 2rem !important; - } - .is-size-4-fullhd { - font-size: 1.5rem !important; - } - .is-size-5-fullhd { - font-size: 1.25rem !important; - } - .is-size-6-fullhd { - font-size: 1rem !important; - } - .is-size-7-fullhd { - font-size: 0.75rem !important; - } -} - -.has-text-centered { - text-align: center !important; -} - -.has-text-justified { - text-align: justify !important; -} - -.has-text-left { - text-align: left !important; -} - -.has-text-right { - text-align: right !important; -} - -@media screen and (max-width: 768px) { - .has-text-centered-mobile { - text-align: center !important; - } -} - -@media screen and (min-width: 769px), print { - .has-text-centered-tablet { - text-align: center !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .has-text-centered-tablet-only { - text-align: center !important; - } -} - -@media screen and (max-width: 1087px) { - .has-text-centered-touch { - text-align: center !important; - } -} - -@media screen and (min-width: 1088px) { - .has-text-centered-desktop { - text-align: center !important; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .has-text-centered-desktop-only { - text-align: center !important; - } -} - -@media screen and (min-width: 1280px) { - .has-text-centered-widescreen { - text-align: center !important; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .has-text-centered-widescreen-only { - text-align: center !important; - } -} - -@media screen and (min-width: 1472px) { - .has-text-centered-fullhd { - text-align: center !important; - } -} - -@media screen and (max-width: 768px) { - .has-text-justified-mobile { - text-align: justify !important; - } -} - -@media screen and (min-width: 769px), print { - .has-text-justified-tablet { - text-align: justify !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .has-text-justified-tablet-only { - text-align: justify !important; - } -} - -@media screen and (max-width: 1087px) { - .has-text-justified-touch { - text-align: justify !important; - } -} - -@media screen and (min-width: 1088px) { - .has-text-justified-desktop { - text-align: justify !important; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .has-text-justified-desktop-only { - text-align: justify !important; - } -} - -@media screen and (min-width: 1280px) { - .has-text-justified-widescreen { - text-align: justify !important; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .has-text-justified-widescreen-only { - text-align: justify !important; - } -} - -@media screen and (min-width: 1472px) { - .has-text-justified-fullhd { - text-align: justify !important; - } -} - -@media screen and (max-width: 768px) { - .has-text-left-mobile { - text-align: left !important; - } -} - -@media screen and (min-width: 769px), print { - .has-text-left-tablet { - text-align: left !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .has-text-left-tablet-only { - text-align: left !important; - } -} - -@media screen and (max-width: 1087px) { - .has-text-left-touch { - text-align: left !important; - } -} - -@media screen and (min-width: 1088px) { - .has-text-left-desktop { - text-align: left !important; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .has-text-left-desktop-only { - text-align: left !important; - } -} - -@media screen and (min-width: 1280px) { - .has-text-left-widescreen { - text-align: left !important; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .has-text-left-widescreen-only { - text-align: left !important; - } -} - -@media screen and (min-width: 1472px) { - .has-text-left-fullhd { - text-align: left !important; - } -} - -@media screen and (max-width: 768px) { - .has-text-right-mobile { - text-align: right !important; - } -} - -@media screen and (min-width: 769px), print { - .has-text-right-tablet { - text-align: right !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .has-text-right-tablet-only { - text-align: right !important; - } -} - -@media screen and (max-width: 1087px) { - .has-text-right-touch { - text-align: right !important; - } -} - -@media screen and (min-width: 1088px) { - .has-text-right-desktop { - text-align: right !important; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .has-text-right-desktop-only { - text-align: right !important; - } -} - -@media screen and (min-width: 1280px) { - .has-text-right-widescreen { - text-align: right !important; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .has-text-right-widescreen-only { - text-align: right !important; - } -} - -@media screen and (min-width: 1472px) { - .has-text-right-fullhd { - text-align: right !important; - } -} - -.is-capitalized { - text-transform: capitalize !important; -} - -.is-lowercase { - text-transform: lowercase !important; -} - -.is-uppercase { - text-transform: uppercase !important; -} - -.is-italic { - font-style: italic !important; -} - -.has-text-white { - color: white !important; -} - -a.has-text-white:hover, a.has-text-white:focus { - color: #e6e6e6 !important; -} - -.has-background-white { - background-color: white !important; -} - -.has-text-black { - color: #0a0a0a !important; -} - -a.has-text-black:hover, a.has-text-black:focus { - color: black !important; -} - -.has-background-black { - background-color: #0a0a0a !important; -} - -.has-text-light { - color: whitesmoke !important; -} - -a.has-text-light:hover, a.has-text-light:focus { - color: #dbdbdb !important; -} - -.has-background-light { - background-color: whitesmoke !important; -} - -.has-text-dark { - color: #363636 !important; -} - -a.has-text-dark:hover, a.has-text-dark:focus { - color: #1c1c1c !important; -} - -.has-background-dark { - background-color: #363636 !important; -} - -.has-text-primary { - color: #00d1b2 !important; -} - -a.has-text-primary:hover, a.has-text-primary:focus { - color: #009e86 !important; -} - -.has-background-primary { - background-color: #00d1b2 !important; -} - -.has-text-link { - color: #3273dc !important; -} - -a.has-text-link:hover, a.has-text-link:focus { - color: #205bbc !important; -} - -.has-background-link { - background-color: #3273dc !important; -} - -.has-text-info { - color: #209cee !important; -} - -a.has-text-info:hover, a.has-text-info:focus { - color: #0f81cc !important; -} - -.has-background-info { - background-color: #209cee !important; -} - -.has-text-success { - color: #23d160 !important; -} - -a.has-text-success:hover, a.has-text-success:focus { - color: #1ca64c !important; -} - -.has-background-success { - background-color: #23d160 !important; -} - -.has-text-warning { - color: #ffdd57 !important; -} - -a.has-text-warning:hover, a.has-text-warning:focus { - color: #ffd324 !important; -} - -.has-background-warning { - background-color: #ffdd57 !important; -} - -.has-text-danger { - color: #ff3860 !important; -} - -a.has-text-danger:hover, a.has-text-danger:focus { - color: #ff0537 !important; -} - -.has-background-danger { - background-color: #ff3860 !important; -} - -.has-text-black-bis { - color: #121212 !important; -} - -.has-background-black-bis { - background-color: #121212 !important; -} - -.has-text-black-ter { - color: #242424 !important; -} - -.has-background-black-ter { - background-color: #242424 !important; -} - -.has-text-grey-darker { - color: #363636 !important; -} - -.has-background-grey-darker { - background-color: #363636 !important; -} - -.has-text-grey-dark { - color: #4a4a4a !important; -} - -.has-background-grey-dark { - background-color: #4a4a4a !important; -} - -.has-text-grey { - color: #7a7a7a !important; -} - -.has-background-grey { - background-color: #7a7a7a !important; -} - -.has-text-grey-light { - color: #b5b5b5 !important; -} - -.has-background-grey-light { - background-color: #b5b5b5 !important; -} - -.has-text-grey-lighter { - color: #dbdbdb !important; -} - -.has-background-grey-lighter { - background-color: #dbdbdb !important; -} - -.has-text-white-ter { - color: whitesmoke !important; -} - -.has-background-white-ter { - background-color: whitesmoke !important; -} - -.has-text-white-bis { - color: #fafafa !important; -} - -.has-background-white-bis { - background-color: #fafafa !important; -} - -.has-text-weight-light { - font-weight: 300 !important; -} - -.has-text-weight-normal { - font-weight: 400 !important; -} - -.has-text-weight-semibold { - font-weight: 600 !important; -} - -.has-text-weight-bold { - font-weight: 700 !important; -} - -.is-family-primary { - font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; -} - -.is-family-secondary { - font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; -} - -.is-family-sans-serif { - font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; -} - -.is-family-monospace { - font-family: monospace !important; -} - -.is-family-code { - font-family: monospace !important; -} - -.is-block { - display: block !important; -} - -@media screen and (max-width: 768px) { - .is-block-mobile { - display: block !important; - } -} - -@media screen and (min-width: 769px), print { - .is-block-tablet { - display: block !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .is-block-tablet-only { - display: block !important; - } -} - -@media screen and (max-width: 1087px) { - .is-block-touch { - display: block !important; - } -} - -@media screen and (min-width: 1088px) { - .is-block-desktop { - display: block !important; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .is-block-desktop-only { - display: block !important; - } -} - -@media screen and (min-width: 1280px) { - .is-block-widescreen { - display: block !important; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .is-block-widescreen-only { - display: block !important; - } -} - -@media screen and (min-width: 1472px) { - .is-block-fullhd { - display: block !important; - } -} - -.is-flex { - display: flex !important; -} - -@media screen and (max-width: 768px) { - .is-flex-mobile { - display: flex !important; - } -} - -@media screen and (min-width: 769px), print { - .is-flex-tablet { - display: flex !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .is-flex-tablet-only { - display: flex !important; - } -} - -@media screen and (max-width: 1087px) { - .is-flex-touch { - display: flex !important; - } -} - -@media screen and (min-width: 1088px) { - .is-flex-desktop { - display: flex !important; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .is-flex-desktop-only { - display: flex !important; - } -} - -@media screen and (min-width: 1280px) { - .is-flex-widescreen { - display: flex !important; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .is-flex-widescreen-only { - display: flex !important; - } -} - -@media screen and (min-width: 1472px) { - .is-flex-fullhd { - display: flex !important; - } -} - -.is-inline { - display: inline !important; -} - -@media screen and (max-width: 768px) { - .is-inline-mobile { - display: inline !important; - } -} - -@media screen and (min-width: 769px), print { - .is-inline-tablet { - display: inline !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .is-inline-tablet-only { - display: inline !important; - } -} - -@media screen and (max-width: 1087px) { - .is-inline-touch { - display: inline !important; - } -} - -@media screen and (min-width: 1088px) { - .is-inline-desktop { - display: inline !important; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .is-inline-desktop-only { - display: inline !important; - } -} - -@media screen and (min-width: 1280px) { - .is-inline-widescreen { - display: inline !important; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .is-inline-widescreen-only { - display: inline !important; - } -} - -@media screen and (min-width: 1472px) { - .is-inline-fullhd { - display: inline !important; - } -} - -.is-inline-block { - display: inline-block !important; -} - -@media screen and (max-width: 768px) { - .is-inline-block-mobile { - display: inline-block !important; - } -} - -@media screen and (min-width: 769px), print { - .is-inline-block-tablet { - display: inline-block !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .is-inline-block-tablet-only { - display: inline-block !important; - } -} - -@media screen and (max-width: 1087px) { - .is-inline-block-touch { - display: inline-block !important; - } -} - -@media screen and (min-width: 1088px) { - .is-inline-block-desktop { - display: inline-block !important; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .is-inline-block-desktop-only { - display: inline-block !important; - } -} - -@media screen and (min-width: 1280px) { - .is-inline-block-widescreen { - display: inline-block !important; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .is-inline-block-widescreen-only { - display: inline-block !important; - } -} - -@media screen and (min-width: 1472px) { - .is-inline-block-fullhd { - display: inline-block !important; - } -} - -.is-inline-flex { - display: inline-flex !important; -} - -@media screen and (max-width: 768px) { - .is-inline-flex-mobile { - display: inline-flex !important; - } -} - -@media screen and (min-width: 769px), print { - .is-inline-flex-tablet { - display: inline-flex !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .is-inline-flex-tablet-only { - display: inline-flex !important; - } -} - -@media screen and (max-width: 1087px) { - .is-inline-flex-touch { - display: inline-flex !important; - } -} - -@media screen and (min-width: 1088px) { - .is-inline-flex-desktop { - display: inline-flex !important; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .is-inline-flex-desktop-only { - display: inline-flex !important; - } -} - -@media screen and (min-width: 1280px) { - .is-inline-flex-widescreen { - display: inline-flex !important; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .is-inline-flex-widescreen-only { - display: inline-flex !important; - } -} - -@media screen and (min-width: 1472px) { - .is-inline-flex-fullhd { - display: inline-flex !important; - } -} - -.is-hidden { - display: none !important; -} - -.is-sr-only { - border: none !important; - clip: rect(0, 0, 0, 0) !important; - height: 0.01em !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - white-space: nowrap !important; - width: 0.01em !important; -} - -@media screen and (max-width: 768px) { - .is-hidden-mobile { - display: none !important; - } -} - -@media screen and (min-width: 769px), print { - .is-hidden-tablet { - display: none !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .is-hidden-tablet-only { - display: none !important; - } -} - -@media screen and (max-width: 1087px) { - .is-hidden-touch { - display: none !important; - } -} - -@media screen and (min-width: 1088px) { - .is-hidden-desktop { - display: none !important; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .is-hidden-desktop-only { - display: none !important; - } -} - -@media screen and (min-width: 1280px) { - .is-hidden-widescreen { - display: none !important; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .is-hidden-widescreen-only { - display: none !important; - } -} - -@media screen and (min-width: 1472px) { - .is-hidden-fullhd { - display: none !important; - } -} - -.is-invisible { - visibility: hidden !important; -} - -@media screen and (max-width: 768px) { - .is-invisible-mobile { - visibility: hidden !important; - } -} - -@media screen and (min-width: 769px), print { - .is-invisible-tablet { - visibility: hidden !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .is-invisible-tablet-only { - visibility: hidden !important; - } -} - -@media screen and (max-width: 1087px) { - .is-invisible-touch { - visibility: hidden !important; - } -} - -@media screen and (min-width: 1088px) { - .is-invisible-desktop { - visibility: hidden !important; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .is-invisible-desktop-only { - visibility: hidden !important; - } -} - -@media screen and (min-width: 1280px) { - .is-invisible-widescreen { - visibility: hidden !important; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .is-invisible-widescreen-only { - visibility: hidden !important; - } -} - -@media screen and (min-width: 1472px) { - .is-invisible-fullhd { - visibility: hidden !important; - } -} - -.is-marginless { - margin: 0 !important; -} - -.is-paddingless { - padding: 0 !important; -} - -.is-radiusless { - border-radius: 0 !important; -} - -.is-shadowless { - box-shadow: none !important; -} - -.box { - background-color: white; - border-radius: 6px; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - color: #4a4a4a; - display: block; - padding: 1.25rem; -} - -a.box:hover, a.box:focus { - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #3273dc; -} - -a.box:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #3273dc; -} - -.button { - background-color: white; - border-color: #dbdbdb; - border-width: 1px; - color: #363636; - cursor: pointer; - justify-content: center; - padding-bottom: calc(0.375em - 1px); - padding-left: 0.75em; - padding-right: 0.75em; - padding-top: calc(0.375em - 1px); - text-align: center; - white-space: nowrap; -} - -.button strong { - color: inherit; -} - -.button .icon, .button .icon.is-small, .button .icon.is-medium, .button .icon.is-large { - height: 1.5em; - width: 1.5em; -} - -.button .icon:first-child:not(:last-child) { - margin-left: calc(-0.375em - 1px); - margin-right: 0.1875em; -} - -.button .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: calc(-0.375em - 1px); -} - -.button .icon:first-child:last-child { - margin-left: calc(-0.375em - 1px); - margin-right: calc(-0.375em - 1px); -} - -.button:hover, .button.is-hovered { - border-color: #b5b5b5; - color: #363636; -} - -.button:focus, .button.is-focused { - border-color: #3273dc; - color: #363636; -} - -.button:focus:not(:active), .button.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); -} - -.button:active, .button.is-active { - border-color: #4a4a4a; - color: #363636; -} - -.button.is-text { - background-color: transparent; - border-color: transparent; - color: #4a4a4a; - text-decoration: underline; -} - -.button.is-text:hover, .button.is-text.is-hovered, .button.is-text:focus, .button.is-text.is-focused { - background-color: whitesmoke; - color: #363636; -} - -.button.is-text:active, .button.is-text.is-active { - background-color: #e8e8e8; - color: #363636; -} - -.button.is-text[disabled], -fieldset[disabled] .button.is-text { - background-color: transparent; - border-color: transparent; - box-shadow: none; -} - -.button.is-white { - background-color: white; - border-color: transparent; - color: #0a0a0a; -} - -.button.is-white:hover, .button.is-white.is-hovered { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; -} - -.button.is-white:focus, .button.is-white.is-focused { - border-color: transparent; - color: #0a0a0a; -} - -.button.is-white:focus:not(:active), .button.is-white.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); -} - -.button.is-white:active, .button.is-white.is-active { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; -} - -.button.is-white[disabled], -fieldset[disabled] .button.is-white { - background-color: white; - border-color: transparent; - box-shadow: none; -} - -.button.is-white.is-inverted { - background-color: #0a0a0a; - color: white; -} - -.button.is-white.is-inverted:hover { - background-color: black; -} - -.button.is-white.is-inverted[disabled], -fieldset[disabled] .button.is-white.is-inverted { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; - color: white; -} - -.button.is-white.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; -} - -.button.is-white.is-outlined { - background-color: transparent; - border-color: white; - color: white; -} - -.button.is-white.is-outlined:hover, .button.is-white.is-outlined:focus { - background-color: white; - border-color: white; - color: #0a0a0a; -} - -.button.is-white.is-outlined.is-loading::after { - border-color: transparent transparent white white !important; -} - -.button.is-white.is-outlined[disabled], -fieldset[disabled] .button.is-white.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; -} - -.button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; -} - -.button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined:focus { - background-color: #0a0a0a; - color: white; -} - -.button.is-white.is-inverted.is-outlined[disabled], -fieldset[disabled] .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; -} - -.button.is-black { - background-color: #0a0a0a; - border-color: transparent; - color: white; -} - -.button.is-black:hover, .button.is-black.is-hovered { - background-color: #040404; - border-color: transparent; - color: white; -} - -.button.is-black:focus, .button.is-black.is-focused { - border-color: transparent; - color: white; -} - -.button.is-black:focus:not(:active), .button.is-black.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); -} - -.button.is-black:active, .button.is-black.is-active { - background-color: black; - border-color: transparent; - color: white; -} - -.button.is-black[disabled], -fieldset[disabled] .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; -} - -.button.is-black.is-inverted { - background-color: white; - color: #0a0a0a; -} - -.button.is-black.is-inverted:hover { - background-color: #f2f2f2; -} - -.button.is-black.is-inverted[disabled], -fieldset[disabled] .button.is-black.is-inverted { - background-color: white; - border-color: transparent; - box-shadow: none; - color: #0a0a0a; -} - -.button.is-black.is-loading::after { - border-color: transparent transparent white white !important; -} - -.button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; -} - -.button.is-black.is-outlined:hover, .button.is-black.is-outlined:focus { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; -} - -.button.is-black.is-outlined.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; -} - -.button.is-black.is-outlined[disabled], -fieldset[disabled] .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; -} - -.button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - color: white; -} - -.button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined:focus { - background-color: white; - color: #0a0a0a; -} - -.button.is-black.is-inverted.is-outlined[disabled], -fieldset[disabled] .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; -} - -.button.is-light { - background-color: whitesmoke; - border-color: transparent; - color: #363636; -} - -.button.is-light:hover, .button.is-light.is-hovered { - background-color: #eeeeee; - border-color: transparent; - color: #363636; -} - -.button.is-light:focus, .button.is-light.is-focused { - border-color: transparent; - color: #363636; -} - -.button.is-light:focus:not(:active), .button.is-light.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); -} - -.button.is-light:active, .button.is-light.is-active { - background-color: #e8e8e8; - border-color: transparent; - color: #363636; -} - -.button.is-light[disabled], -fieldset[disabled] .button.is-light { - background-color: whitesmoke; - border-color: transparent; - box-shadow: none; -} - -.button.is-light.is-inverted { - background-color: #363636; - color: whitesmoke; -} - -.button.is-light.is-inverted:hover { - background-color: #292929; -} - -.button.is-light.is-inverted[disabled], -fieldset[disabled] .button.is-light.is-inverted { - background-color: #363636; - border-color: transparent; - box-shadow: none; - color: whitesmoke; -} - -.button.is-light.is-loading::after { - border-color: transparent transparent #363636 #363636 !important; -} - -.button.is-light.is-outlined { - background-color: transparent; - border-color: whitesmoke; - color: whitesmoke; -} - -.button.is-light.is-outlined:hover, .button.is-light.is-outlined:focus { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; -} - -.button.is-light.is-outlined.is-loading::after { - border-color: transparent transparent whitesmoke whitesmoke !important; -} - -.button.is-light.is-outlined[disabled], -fieldset[disabled] .button.is-light.is-outlined { - background-color: transparent; - border-color: whitesmoke; - box-shadow: none; - color: whitesmoke; -} - -.button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #363636; - color: #363636; -} - -.button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined:focus { - background-color: #363636; - color: whitesmoke; -} - -.button.is-light.is-inverted.is-outlined[disabled], -fieldset[disabled] .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #363636; - box-shadow: none; - color: #363636; -} - -.button.is-dark { - background-color: #363636; - border-color: transparent; - color: whitesmoke; -} - -.button.is-dark:hover, .button.is-dark.is-hovered { - background-color: #2f2f2f; - border-color: transparent; - color: whitesmoke; -} - -.button.is-dark:focus, .button.is-dark.is-focused { - border-color: transparent; - color: whitesmoke; -} - -.button.is-dark:focus:not(:active), .button.is-dark.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); -} - -.button.is-dark:active, .button.is-dark.is-active { - background-color: #292929; - border-color: transparent; - color: whitesmoke; -} - -.button.is-dark[disabled], -fieldset[disabled] .button.is-dark { - background-color: #363636; - border-color: transparent; - box-shadow: none; -} - -.button.is-dark.is-inverted { - background-color: whitesmoke; - color: #363636; -} - -.button.is-dark.is-inverted:hover { - background-color: #e8e8e8; -} - -.button.is-dark.is-inverted[disabled], -fieldset[disabled] .button.is-dark.is-inverted { - background-color: whitesmoke; - border-color: transparent; - box-shadow: none; - color: #363636; -} - -.button.is-dark.is-loading::after { - border-color: transparent transparent whitesmoke whitesmoke !important; -} - -.button.is-dark.is-outlined { - background-color: transparent; - border-color: #363636; - color: #363636; -} - -.button.is-dark.is-outlined:hover, .button.is-dark.is-outlined:focus { - background-color: #363636; - border-color: #363636; - color: whitesmoke; -} - -.button.is-dark.is-outlined.is-loading::after { - border-color: transparent transparent #363636 #363636 !important; -} - -.button.is-dark.is-outlined[disabled], -fieldset[disabled] .button.is-dark.is-outlined { - background-color: transparent; - border-color: #363636; - box-shadow: none; - color: #363636; -} - -.button.is-dark.is-inverted.is-outlined { - background-color: transparent; - border-color: whitesmoke; - color: whitesmoke; -} - -.button.is-dark.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined:focus { - background-color: whitesmoke; - color: #363636; -} - -.button.is-dark.is-inverted.is-outlined[disabled], -fieldset[disabled] .button.is-dark.is-inverted.is-outlined { - background-color: transparent; - border-color: whitesmoke; - box-shadow: none; - color: whitesmoke; -} - -.button.is-primary { - background-color: #00d1b2; - border-color: transparent; - color: #fff; -} - -.button.is-primary:hover, .button.is-primary.is-hovered { - background-color: #00c4a7; - border-color: transparent; - color: #fff; -} - -.button.is-primary:focus, .button.is-primary.is-focused { - border-color: transparent; - color: #fff; -} - -.button.is-primary:focus:not(:active), .button.is-primary.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); -} - -.button.is-primary:active, .button.is-primary.is-active { - background-color: #00b89c; - border-color: transparent; - color: #fff; -} - -.button.is-primary[disabled], -fieldset[disabled] .button.is-primary { - background-color: #00d1b2; - border-color: transparent; - box-shadow: none; -} - -.button.is-primary.is-inverted { - background-color: #fff; - color: #00d1b2; -} - -.button.is-primary.is-inverted:hover { - background-color: #f2f2f2; -} - -.button.is-primary.is-inverted[disabled], -fieldset[disabled] .button.is-primary.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #00d1b2; -} - -.button.is-primary.is-loading::after { - border-color: transparent transparent #fff #fff !important; -} - -.button.is-primary.is-outlined { - background-color: transparent; - border-color: #00d1b2; - color: #00d1b2; -} - -.button.is-primary.is-outlined:hover, .button.is-primary.is-outlined:focus { - background-color: #00d1b2; - border-color: #00d1b2; - color: #fff; -} - -.button.is-primary.is-outlined.is-loading::after { - border-color: transparent transparent #00d1b2 #00d1b2 !important; -} - -.button.is-primary.is-outlined[disabled], -fieldset[disabled] .button.is-primary.is-outlined { - background-color: transparent; - border-color: #00d1b2; - box-shadow: none; - color: #00d1b2; -} - -.button.is-primary.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; -} - -.button.is-primary.is-inverted.is-outlined:hover, .button.is-primary.is-inverted.is-outlined:focus { - background-color: #fff; - color: #00d1b2; -} - -.button.is-primary.is-inverted.is-outlined[disabled], -fieldset[disabled] .button.is-primary.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; -} - -.button.is-link { - background-color: #3273dc; - border-color: transparent; - color: #fff; -} - -.button.is-link:hover, .button.is-link.is-hovered { - background-color: #276cda; - border-color: transparent; - color: #fff; -} - -.button.is-link:focus, .button.is-link.is-focused { - border-color: transparent; - color: #fff; -} - -.button.is-link:focus:not(:active), .button.is-link.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); -} - -.button.is-link:active, .button.is-link.is-active { - background-color: #2366d1; - border-color: transparent; - color: #fff; -} - -.button.is-link[disabled], -fieldset[disabled] .button.is-link { - background-color: #3273dc; - border-color: transparent; - box-shadow: none; -} - -.button.is-link.is-inverted { - background-color: #fff; - color: #3273dc; -} - -.button.is-link.is-inverted:hover { - background-color: #f2f2f2; -} - -.button.is-link.is-inverted[disabled], -fieldset[disabled] .button.is-link.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #3273dc; -} - -.button.is-link.is-loading::after { - border-color: transparent transparent #fff #fff !important; -} - -.button.is-link.is-outlined { - background-color: transparent; - border-color: #3273dc; - color: #3273dc; -} - -.button.is-link.is-outlined:hover, .button.is-link.is-outlined:focus { - background-color: #3273dc; - border-color: #3273dc; - color: #fff; -} - -.button.is-link.is-outlined.is-loading::after { - border-color: transparent transparent #3273dc #3273dc !important; -} - -.button.is-link.is-outlined[disabled], -fieldset[disabled] .button.is-link.is-outlined { - background-color: transparent; - border-color: #3273dc; - box-shadow: none; - color: #3273dc; -} - -.button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; -} - -.button.is-link.is-inverted.is-outlined:hover, .button.is-link.is-inverted.is-outlined:focus { - background-color: #fff; - color: #3273dc; -} - -.button.is-link.is-inverted.is-outlined[disabled], -fieldset[disabled] .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; -} - -.button.is-info { - background-color: #209cee; - border-color: transparent; - color: #fff; -} - -.button.is-info:hover, .button.is-info.is-hovered { - background-color: #1496ed; - border-color: transparent; - color: #fff; -} - -.button.is-info:focus, .button.is-info.is-focused { - border-color: transparent; - color: #fff; -} - -.button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); -} - -.button.is-info:active, .button.is-info.is-active { - background-color: #118fe4; - border-color: transparent; - color: #fff; -} - -.button.is-info[disabled], -fieldset[disabled] .button.is-info { - background-color: #209cee; - border-color: transparent; - box-shadow: none; -} - -.button.is-info.is-inverted { - background-color: #fff; - color: #209cee; -} - -.button.is-info.is-inverted:hover { - background-color: #f2f2f2; -} - -.button.is-info.is-inverted[disabled], -fieldset[disabled] .button.is-info.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #209cee; -} - -.button.is-info.is-loading::after { - border-color: transparent transparent #fff #fff !important; -} - -.button.is-info.is-outlined { - background-color: transparent; - border-color: #209cee; - color: #209cee; -} - -.button.is-info.is-outlined:hover, .button.is-info.is-outlined:focus { - background-color: #209cee; - border-color: #209cee; - color: #fff; -} - -.button.is-info.is-outlined.is-loading::after { - border-color: transparent transparent #209cee #209cee !important; -} - -.button.is-info.is-outlined[disabled], -fieldset[disabled] .button.is-info.is-outlined { - background-color: transparent; - border-color: #209cee; - box-shadow: none; - color: #209cee; -} - -.button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; -} - -.button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined:focus { - background-color: #fff; - color: #209cee; -} - -.button.is-info.is-inverted.is-outlined[disabled], -fieldset[disabled] .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; -} - -.button.is-success { - background-color: #23d160; - border-color: transparent; - color: #fff; -} - -.button.is-success:hover, .button.is-success.is-hovered { - background-color: #22c65b; - border-color: transparent; - color: #fff; -} - -.button.is-success:focus, .button.is-success.is-focused { - border-color: transparent; - color: #fff; -} - -.button.is-success:focus:not(:active), .button.is-success.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(35, 209, 96, 0.25); -} - -.button.is-success:active, .button.is-success.is-active { - background-color: #20bc56; - border-color: transparent; - color: #fff; -} - -.button.is-success[disabled], -fieldset[disabled] .button.is-success { - background-color: #23d160; - border-color: transparent; - box-shadow: none; -} - -.button.is-success.is-inverted { - background-color: #fff; - color: #23d160; -} - -.button.is-success.is-inverted:hover { - background-color: #f2f2f2; -} - -.button.is-success.is-inverted[disabled], -fieldset[disabled] .button.is-success.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #23d160; -} - -.button.is-success.is-loading::after { - border-color: transparent transparent #fff #fff !important; -} - -.button.is-success.is-outlined { - background-color: transparent; - border-color: #23d160; - color: #23d160; -} - -.button.is-success.is-outlined:hover, .button.is-success.is-outlined:focus { - background-color: #23d160; - border-color: #23d160; - color: #fff; -} - -.button.is-success.is-outlined.is-loading::after { - border-color: transparent transparent #23d160 #23d160 !important; -} - -.button.is-success.is-outlined[disabled], -fieldset[disabled] .button.is-success.is-outlined { - background-color: transparent; - border-color: #23d160; - box-shadow: none; - color: #23d160; -} - -.button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; -} - -.button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined:focus { - background-color: #fff; - color: #23d160; -} - -.button.is-success.is-inverted.is-outlined[disabled], -fieldset[disabled] .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; -} - -.button.is-warning { - background-color: #ffdd57; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning:hover, .button.is-warning.is-hovered { - background-color: #ffdb4a; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning:focus, .button.is-warning.is-focused { - border-color: transparent; - color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning:focus:not(:active), .button.is-warning.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); -} - -.button.is-warning:active, .button.is-warning.is-active { - background-color: #ffd83d; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning[disabled], -fieldset[disabled] .button.is-warning { - background-color: #ffdd57; - border-color: transparent; - box-shadow: none; -} - -.button.is-warning.is-inverted { - background-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; -} - -.button.is-warning.is-inverted:hover { - background-color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning.is-inverted[disabled], -fieldset[disabled] .button.is-warning.is-inverted { - background-color: rgba(0, 0, 0, 0.7); - border-color: transparent; - box-shadow: none; - color: #ffdd57; -} - -.button.is-warning.is-loading::after { - border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; -} - -.button.is-warning.is-outlined { - background-color: transparent; - border-color: #ffdd57; - color: #ffdd57; -} - -.button.is-warning.is-outlined:hover, .button.is-warning.is-outlined:focus { - background-color: #ffdd57; - border-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning.is-outlined.is-loading::after { - border-color: transparent transparent #ffdd57 #ffdd57 !important; -} - -.button.is-warning.is-outlined[disabled], -fieldset[disabled] .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ffdd57; - box-shadow: none; - color: #ffdd57; -} - -.button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: rgba(0, 0, 0, 0.7); - color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined:focus { - background-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; -} - -.button.is-warning.is-inverted.is-outlined[disabled], -fieldset[disabled] .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: rgba(0, 0, 0, 0.7); - box-shadow: none; - color: rgba(0, 0, 0, 0.7); -} - -.button.is-danger { - background-color: #ff3860; - border-color: transparent; - color: #fff; -} - -.button.is-danger:hover, .button.is-danger.is-hovered { - background-color: #ff2b56; - border-color: transparent; - color: #fff; -} - -.button.is-danger:focus, .button.is-danger.is-focused { - border-color: transparent; - color: #fff; -} - -.button.is-danger:focus:not(:active), .button.is-danger.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(255, 56, 96, 0.25); -} - -.button.is-danger:active, .button.is-danger.is-active { - background-color: #ff1f4b; - border-color: transparent; - color: #fff; -} - -.button.is-danger[disabled], -fieldset[disabled] .button.is-danger { - background-color: #ff3860; - border-color: transparent; - box-shadow: none; -} - -.button.is-danger.is-inverted { - background-color: #fff; - color: #ff3860; -} - -.button.is-danger.is-inverted:hover { - background-color: #f2f2f2; -} - -.button.is-danger.is-inverted[disabled], -fieldset[disabled] .button.is-danger.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #ff3860; -} - -.button.is-danger.is-loading::after { - border-color: transparent transparent #fff #fff !important; -} - -.button.is-danger.is-outlined { - background-color: transparent; - border-color: #ff3860; - color: #ff3860; -} - -.button.is-danger.is-outlined:hover, .button.is-danger.is-outlined:focus { - background-color: #ff3860; - border-color: #ff3860; - color: #fff; -} - -.button.is-danger.is-outlined.is-loading::after { - border-color: transparent transparent #ff3860 #ff3860 !important; -} - -.button.is-danger.is-outlined[disabled], -fieldset[disabled] .button.is-danger.is-outlined { - background-color: transparent; - border-color: #ff3860; - box-shadow: none; - color: #ff3860; -} - -.button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; -} - -.button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined:focus { - background-color: #fff; - color: #ff3860; -} - -.button.is-danger.is-inverted.is-outlined[disabled], -fieldset[disabled] .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; -} - -.button.is-small { - border-radius: 2px; - font-size: 0.75rem; -} - -.button.is-normal { - font-size: 1rem; -} - -.button.is-medium { - font-size: 1.25rem; -} - -.button.is-large { - font-size: 1.5rem; -} - -.button[disabled], -fieldset[disabled] .button { - background-color: white; - border-color: #dbdbdb; - box-shadow: none; - opacity: 0.5; -} - -.button.is-fullwidth { - display: flex; - width: 100%; -} - -.button.is-loading { - color: transparent !important; - pointer-events: none; -} - -.button.is-loading::after { - position: absolute; - left: calc(50% - (1em / 2)); - top: calc(50% - (1em / 2)); - position: absolute !important; -} - -.button.is-static { - background-color: whitesmoke; - border-color: #dbdbdb; - color: #7a7a7a; - box-shadow: none; - pointer-events: none; -} - -.button.is-rounded { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; -} - -.buttons { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; -} - -.buttons .button { - margin-bottom: 0.5rem; -} - -.buttons .button:not(:last-child):not(.is-fullwidth) { - margin-right: 0.5rem; -} - -.buttons:last-child { - margin-bottom: -0.5rem; -} - -.buttons:not(:last-child) { - margin-bottom: 1rem; -} - -.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { - border-radius: 2px; - font-size: 0.75rem; -} - -.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { - font-size: 1.25rem; -} - -.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { - font-size: 1.5rem; -} - -.buttons.has-addons .button:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.buttons.has-addons .button:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - margin-right: -1px; -} - -.buttons.has-addons .button:last-child { - margin-right: 0; -} - -.buttons.has-addons .button:hover, .buttons.has-addons .button.is-hovered { - z-index: 2; -} - -.buttons.has-addons .button:focus, .buttons.has-addons .button.is-focused, .buttons.has-addons .button:active, .buttons.has-addons .button.is-active, .buttons.has-addons .button.is-selected { - z-index: 3; -} - -.buttons.has-addons .button:focus:hover, .buttons.has-addons .button.is-focused:hover, .buttons.has-addons .button:active:hover, .buttons.has-addons .button.is-active:hover, .buttons.has-addons .button.is-selected:hover { - z-index: 4; -} - -.buttons.has-addons .button.is-expanded { - flex-grow: 1; -} - -.buttons.is-centered { - justify-content: center; -} - -.buttons.is-right { - justify-content: flex-end; -} - -.container { - margin: 0 auto; - position: relative; -} - -@media screen and (min-width: 1088px) { - .container { - max-width: 960px; - width: 960px; - } - .container.is-fluid { - margin-left: 64px; - margin-right: 64px; - max-width: none; - width: auto; - } -} - -@media screen and (max-width: 1279px) { - .container.is-widescreen { - max-width: 1152px; - width: auto; - } -} - -@media screen and (max-width: 1471px) { - .container.is-fullhd { - max-width: 1344px; - width: auto; - } -} - -@media screen and (min-width: 1280px) { - .container { - max-width: 1152px; - width: 1152px; - } -} - -@media screen and (min-width: 1472px) { - .container { - max-width: 1344px; - width: 1344px; - } -} - -.content li + li { - margin-top: 0.25em; -} - -.content p:not(:last-child), -.content dl:not(:last-child), -.content ol:not(:last-child), -.content ul:not(:last-child), -.content blockquote:not(:last-child), -.content pre:not(:last-child), -.content table:not(:last-child) { - margin-bottom: 1em; -} - -.content h1, -.content h2, -.content h3, -.content h4, -.content h5, -.content h6 { - color: #363636; - font-weight: 600; - line-height: 1.125; -} - -.content h1 { - font-size: 2em; - margin-bottom: 0.5em; -} - -.content h1:not(:first-child) { - margin-top: 1em; -} - -.content h2 { - font-size: 1.75em; - margin-bottom: 0.5714em; -} - -.content h2:not(:first-child) { - margin-top: 1.1428em; -} - -.content h3 { - font-size: 1.5em; - margin-bottom: 0.6666em; -} - -.content h3:not(:first-child) { - margin-top: 1.3333em; -} - -.content h4 { - font-size: 1.25em; - margin-bottom: 0.8em; -} - -.content h5 { - font-size: 1.125em; - margin-bottom: 0.8888em; -} - -.content h6 { - font-size: 1em; - margin-bottom: 1em; -} - -.content blockquote { - background-color: whitesmoke; - border-left: 5px solid #dbdbdb; - padding: 1.25em 1.5em; -} - -.content ol { - list-style-position: outside; - margin-left: 2em; - margin-top: 1em; -} - -.content ol:not([type]) { - list-style-type: decimal; -} - -.content ol:not([type]).is-lower-alpha { - list-style-type: lower-alpha; -} - -.content ol:not([type]).is-lower-roman { - list-style-type: lower-roman; -} - -.content ol:not([type]).is-upper-alpha { - list-style-type: upper-alpha; -} - -.content ol:not([type]).is-upper-roman { - list-style-type: upper-roman; -} - -.content ul { - list-style: disc outside; - margin-left: 2em; - margin-top: 1em; -} - -.content ul ul { - list-style-type: circle; - margin-top: 0.5em; -} - -.content ul ul ul { - list-style-type: square; -} - -.content dd { - margin-left: 2em; -} - -.content figure { - margin-left: 2em; - margin-right: 2em; - text-align: center; -} - -.content figure:not(:first-child) { - margin-top: 2em; -} - -.content figure:not(:last-child) { - margin-bottom: 2em; -} - -.content figure img { - display: inline-block; -} - -.content figure figcaption { - font-style: italic; -} - -.content pre { - -webkit-overflow-scrolling: touch; - overflow-x: auto; - padding: 1.25em 1.5em; - white-space: pre; - word-wrap: normal; -} - -.content sup, -.content sub { - font-size: 75%; -} - -.content table { - width: 100%; -} - -.content table td, -.content table th { - border: 1px solid #dbdbdb; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; -} - -.content table th { - color: #363636; - text-align: left; -} - -.content table thead td, -.content table thead th { - border-width: 0 0 2px; - color: #363636; -} - -.content table tfoot td, -.content table tfoot th { - border-width: 2px 0 0; - color: #363636; -} - -.content table tbody tr:last-child td, -.content table tbody tr:last-child th { - border-bottom-width: 0; -} - -.content.is-small { - font-size: 0.75rem; -} - -.content.is-medium { - font-size: 1.25rem; -} - -.content.is-large { - font-size: 1.5rem; -} - -.input, -.textarea { - background-color: white; - border-color: #dbdbdb; - color: #363636; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); - max-width: 100%; - width: 100%; -} - -.input::-moz-placeholder, -.textarea::-moz-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.input::-webkit-input-placeholder, -.textarea::-webkit-input-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.input:-moz-placeholder, -.textarea:-moz-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.input:-ms-input-placeholder, -.textarea:-ms-input-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.input:hover, .input.is-hovered, -.textarea:hover, -.textarea.is-hovered { - border-color: #b5b5b5; -} - -.input:focus, .input.is-focused, .input:active, .input.is-active, -.textarea:focus, -.textarea.is-focused, -.textarea:active, -.textarea.is-active { - border-color: #3273dc; - box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); -} - -.input[disabled], -fieldset[disabled] .input, -.textarea[disabled], -fieldset[disabled] -.textarea { - background-color: whitesmoke; - border-color: whitesmoke; - box-shadow: none; - color: #7a7a7a; -} - -.input[disabled]::-moz-placeholder, -fieldset[disabled] .input::-moz-placeholder, -.textarea[disabled]::-moz-placeholder, -fieldset[disabled] -.textarea::-moz-placeholder { - color: rgba(122, 122, 122, 0.3); -} - -.input[disabled]::-webkit-input-placeholder, -fieldset[disabled] .input::-webkit-input-placeholder, -.textarea[disabled]::-webkit-input-placeholder, -fieldset[disabled] -.textarea::-webkit-input-placeholder { - color: rgba(122, 122, 122, 0.3); -} - -.input[disabled]:-moz-placeholder, -fieldset[disabled] .input:-moz-placeholder, -.textarea[disabled]:-moz-placeholder, -fieldset[disabled] -.textarea:-moz-placeholder { - color: rgba(122, 122, 122, 0.3); -} - -.input[disabled]:-ms-input-placeholder, -fieldset[disabled] .input:-ms-input-placeholder, -.textarea[disabled]:-ms-input-placeholder, -fieldset[disabled] -.textarea:-ms-input-placeholder { - color: rgba(122, 122, 122, 0.3); -} - -.input[readonly], -.textarea[readonly] { - box-shadow: none; -} - -.input.is-white, -.textarea.is-white { - border-color: white; -} - -.input.is-white:focus, .input.is-white.is-focused, .input.is-white:active, .input.is-white.is-active, -.textarea.is-white:focus, -.textarea.is-white.is-focused, -.textarea.is-white:active, -.textarea.is-white.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); -} - -.input.is-black, -.textarea.is-black { - border-color: #0a0a0a; -} - -.input.is-black:focus, .input.is-black.is-focused, .input.is-black:active, .input.is-black.is-active, -.textarea.is-black:focus, -.textarea.is-black.is-focused, -.textarea.is-black:active, -.textarea.is-black.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); -} - -.input.is-light, -.textarea.is-light { - border-color: whitesmoke; -} - -.input.is-light:focus, .input.is-light.is-focused, .input.is-light:active, .input.is-light.is-active, -.textarea.is-light:focus, -.textarea.is-light.is-focused, -.textarea.is-light:active, -.textarea.is-light.is-active { - box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); -} - -.input.is-dark, -.textarea.is-dark { - border-color: #363636; -} - -.input.is-dark:focus, .input.is-dark.is-focused, .input.is-dark:active, .input.is-dark.is-active, -.textarea.is-dark:focus, -.textarea.is-dark.is-focused, -.textarea.is-dark:active, -.textarea.is-dark.is-active { - box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); -} - -.input.is-primary, -.textarea.is-primary { - border-color: #00d1b2; -} - -.input.is-primary:focus, .input.is-primary.is-focused, .input.is-primary:active, .input.is-primary.is-active, -.textarea.is-primary:focus, -.textarea.is-primary.is-focused, -.textarea.is-primary:active, -.textarea.is-primary.is-active { - box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); -} - -.input.is-link, -.textarea.is-link { - border-color: #3273dc; -} - -.input.is-link:focus, .input.is-link.is-focused, .input.is-link:active, .input.is-link.is-active, -.textarea.is-link:focus, -.textarea.is-link.is-focused, -.textarea.is-link:active, -.textarea.is-link.is-active { - box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); -} - -.input.is-info, -.textarea.is-info { - border-color: #209cee; -} - -.input.is-info:focus, .input.is-info.is-focused, .input.is-info:active, .input.is-info.is-active, -.textarea.is-info:focus, -.textarea.is-info.is-focused, -.textarea.is-info:active, -.textarea.is-info.is-active { - box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); -} - -.input.is-success, -.textarea.is-success { - border-color: #23d160; -} - -.input.is-success:focus, .input.is-success.is-focused, .input.is-success:active, .input.is-success.is-active, -.textarea.is-success:focus, -.textarea.is-success.is-focused, -.textarea.is-success:active, -.textarea.is-success.is-active { - box-shadow: 0 0 0 0.125em rgba(35, 209, 96, 0.25); -} - -.input.is-warning, -.textarea.is-warning { - border-color: #ffdd57; -} - -.input.is-warning:focus, .input.is-warning.is-focused, .input.is-warning:active, .input.is-warning.is-active, -.textarea.is-warning:focus, -.textarea.is-warning.is-focused, -.textarea.is-warning:active, -.textarea.is-warning.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); -} - -.input.is-danger, -.textarea.is-danger { - border-color: #ff3860; -} - -.input.is-danger:focus, .input.is-danger.is-focused, .input.is-danger:active, .input.is-danger.is-active, -.textarea.is-danger:focus, -.textarea.is-danger.is-focused, -.textarea.is-danger:active, -.textarea.is-danger.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 56, 96, 0.25); -} - -.input.is-small, -.textarea.is-small { - border-radius: 2px; - font-size: 0.75rem; -} - -.input.is-medium, -.textarea.is-medium { - font-size: 1.25rem; -} - -.input.is-large, -.textarea.is-large { - font-size: 1.5rem; -} - -.input.is-fullwidth, -.textarea.is-fullwidth { - display: block; - width: 100%; -} - -.input.is-inline, -.textarea.is-inline { - display: inline; - width: auto; -} - -.input.is-rounded { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; -} - -.input.is-static { - background-color: transparent; - border-color: transparent; - box-shadow: none; - padding-left: 0; - padding-right: 0; -} - -.textarea { - display: block; - max-width: 100%; - min-width: 100%; - padding: 0.625em; - resize: vertical; -} - -.textarea:not([rows]) { - max-height: 600px; - min-height: 120px; -} - -.textarea[rows] { - height: initial; -} - -.textarea.has-fixed-size { - resize: none; -} - -.checkbox, -.radio { - cursor: pointer; - display: inline-block; - line-height: 1.25; - position: relative; -} - -.checkbox input, -.radio input { - cursor: pointer; -} - -.checkbox:hover, -.radio:hover { - color: #363636; -} - -.checkbox[disabled], -fieldset[disabled] .checkbox, -.radio[disabled], -fieldset[disabled] -.radio { - color: #7a7a7a; - cursor: not-allowed; -} - -.radio + .radio { - margin-left: 0.5em; -} - -.select { - display: inline-block; - max-width: 100%; - position: relative; - vertical-align: top; -} - -.select:not(.is-multiple) { - height: 2.25em; -} - -.select:not(.is-multiple):not(.is-loading)::after { - border-color: #3273dc; - right: 1.125em; - z-index: 4; -} - -.select.is-rounded select { - border-radius: 290486px; - padding-left: 1em; -} - -.select select { - background-color: white; - border-color: #dbdbdb; - color: #363636; - cursor: pointer; - display: block; - font-size: 1em; - max-width: 100%; - outline: none; -} - -.select select::-moz-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.select select::-webkit-input-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.select select:-moz-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.select select:-ms-input-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.select select:hover, .select select.is-hovered { - border-color: #b5b5b5; -} - -.select select:focus, .select select.is-focused, .select select:active, .select select.is-active { - border-color: #3273dc; - box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); -} - -.select select[disabled], -fieldset[disabled] .select select { - background-color: whitesmoke; - border-color: whitesmoke; - box-shadow: none; - color: #7a7a7a; -} - -.select select[disabled]::-moz-placeholder, -fieldset[disabled] .select select::-moz-placeholder { - color: rgba(122, 122, 122, 0.3); -} - -.select select[disabled]::-webkit-input-placeholder, -fieldset[disabled] .select select::-webkit-input-placeholder { - color: rgba(122, 122, 122, 0.3); -} - -.select select[disabled]:-moz-placeholder, -fieldset[disabled] .select select:-moz-placeholder { - color: rgba(122, 122, 122, 0.3); -} - -.select select[disabled]:-ms-input-placeholder, -fieldset[disabled] .select select:-ms-input-placeholder { - color: rgba(122, 122, 122, 0.3); -} - -.select select::-ms-expand { - display: none; -} - -.select select[disabled]:hover, -fieldset[disabled] .select select:hover { - border-color: whitesmoke; -} - -.select select:not([multiple]) { - padding-right: 2.5em; -} - -.select select[multiple] { - height: auto; - padding: 0; -} - -.select select[multiple] option { - padding: 0.5em 1em; -} - -.select:not(.is-multiple):not(.is-loading):hover::after { - border-color: #363636; -} - -.select.is-white:not(:hover)::after { - border-color: white; -} - -.select.is-white select { - border-color: white; -} - -.select.is-white select:hover, .select.is-white select.is-hovered { - border-color: #f2f2f2; -} - -.select.is-white select:focus, .select.is-white select.is-focused, .select.is-white select:active, .select.is-white select.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); -} - -.select.is-black:not(:hover)::after { - border-color: #0a0a0a; -} - -.select.is-black select { - border-color: #0a0a0a; -} - -.select.is-black select:hover, .select.is-black select.is-hovered { - border-color: black; -} - -.select.is-black select:focus, .select.is-black select.is-focused, .select.is-black select:active, .select.is-black select.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); -} - -.select.is-light:not(:hover)::after { - border-color: whitesmoke; -} - -.select.is-light select { - border-color: whitesmoke; -} - -.select.is-light select:hover, .select.is-light select.is-hovered { - border-color: #e8e8e8; -} - -.select.is-light select:focus, .select.is-light select.is-focused, .select.is-light select:active, .select.is-light select.is-active { - box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); -} - -.select.is-dark:not(:hover)::after { - border-color: #363636; -} - -.select.is-dark select { - border-color: #363636; -} - -.select.is-dark select:hover, .select.is-dark select.is-hovered { - border-color: #292929; -} - -.select.is-dark select:focus, .select.is-dark select.is-focused, .select.is-dark select:active, .select.is-dark select.is-active { - box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); -} - -.select.is-primary:not(:hover)::after { - border-color: #00d1b2; -} - -.select.is-primary select { - border-color: #00d1b2; -} - -.select.is-primary select:hover, .select.is-primary select.is-hovered { - border-color: #00b89c; -} - -.select.is-primary select:focus, .select.is-primary select.is-focused, .select.is-primary select:active, .select.is-primary select.is-active { - box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); -} - -.select.is-link:not(:hover)::after { - border-color: #3273dc; -} - -.select.is-link select { - border-color: #3273dc; -} - -.select.is-link select:hover, .select.is-link select.is-hovered { - border-color: #2366d1; -} - -.select.is-link select:focus, .select.is-link select.is-focused, .select.is-link select:active, .select.is-link select.is-active { - box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); -} - -.select.is-info:not(:hover)::after { - border-color: #209cee; -} - -.select.is-info select { - border-color: #209cee; -} - -.select.is-info select:hover, .select.is-info select.is-hovered { - border-color: #118fe4; -} - -.select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active { - box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); -} - -.select.is-success:not(:hover)::after { - border-color: #23d160; -} - -.select.is-success select { - border-color: #23d160; -} - -.select.is-success select:hover, .select.is-success select.is-hovered { - border-color: #20bc56; -} - -.select.is-success select:focus, .select.is-success select.is-focused, .select.is-success select:active, .select.is-success select.is-active { - box-shadow: 0 0 0 0.125em rgba(35, 209, 96, 0.25); -} - -.select.is-warning:not(:hover)::after { - border-color: #ffdd57; -} - -.select.is-warning select { - border-color: #ffdd57; -} - -.select.is-warning select:hover, .select.is-warning select.is-hovered { - border-color: #ffd83d; -} - -.select.is-warning select:focus, .select.is-warning select.is-focused, .select.is-warning select:active, .select.is-warning select.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); -} - -.select.is-danger:not(:hover)::after { - border-color: #ff3860; -} - -.select.is-danger select { - border-color: #ff3860; -} - -.select.is-danger select:hover, .select.is-danger select.is-hovered { - border-color: #ff1f4b; -} - -.select.is-danger select:focus, .select.is-danger select.is-focused, .select.is-danger select:active, .select.is-danger select.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 56, 96, 0.25); -} - -.select.is-small { - border-radius: 2px; - font-size: 0.75rem; -} - -.select.is-medium { - font-size: 1.25rem; -} - -.select.is-large { - font-size: 1.5rem; -} - -.select.is-disabled::after { - border-color: #7a7a7a; -} - -.select.is-fullwidth { - width: 100%; -} - -.select.is-fullwidth select { - width: 100%; -} - -.select.is-loading::after { - margin-top: 0; - position: absolute; - right: 0.625em; - top: 0.625em; - -webkit-transform: none; - transform: none; -} - -.select.is-loading.is-small:after { - font-size: 0.75rem; -} - -.select.is-loading.is-medium:after { - font-size: 1.25rem; -} - -.select.is-loading.is-large:after { - font-size: 1.5rem; -} - -.file { - align-items: stretch; - display: flex; - justify-content: flex-start; - position: relative; -} - -.file.is-white .file-cta { - background-color: white; - border-color: transparent; - color: #0a0a0a; -} - -.file.is-white:hover .file-cta, .file.is-white.is-hovered .file-cta { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; -} - -.file.is-white:focus .file-cta, .file.is-white.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); - color: #0a0a0a; -} - -.file.is-white:active .file-cta, .file.is-white.is-active .file-cta { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; -} - -.file.is-black .file-cta { - background-color: #0a0a0a; - border-color: transparent; - color: white; -} - -.file.is-black:hover .file-cta, .file.is-black.is-hovered .file-cta { - background-color: #040404; - border-color: transparent; - color: white; -} - -.file.is-black:focus .file-cta, .file.is-black.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); - color: white; -} - -.file.is-black:active .file-cta, .file.is-black.is-active .file-cta { - background-color: black; - border-color: transparent; - color: white; -} - -.file.is-light .file-cta { - background-color: whitesmoke; - border-color: transparent; - color: #363636; -} - -.file.is-light:hover .file-cta, .file.is-light.is-hovered .file-cta { - background-color: #eeeeee; - border-color: transparent; - color: #363636; -} - -.file.is-light:focus .file-cta, .file.is-light.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); - color: #363636; -} - -.file.is-light:active .file-cta, .file.is-light.is-active .file-cta { - background-color: #e8e8e8; - border-color: transparent; - color: #363636; -} - -.file.is-dark .file-cta { - background-color: #363636; - border-color: transparent; - color: whitesmoke; -} - -.file.is-dark:hover .file-cta, .file.is-dark.is-hovered .file-cta { - background-color: #2f2f2f; - border-color: transparent; - color: whitesmoke; -} - -.file.is-dark:focus .file-cta, .file.is-dark.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); - color: whitesmoke; -} - -.file.is-dark:active .file-cta, .file.is-dark.is-active .file-cta { - background-color: #292929; - border-color: transparent; - color: whitesmoke; -} - -.file.is-primary .file-cta { - background-color: #00d1b2; - border-color: transparent; - color: #fff; -} - -.file.is-primary:hover .file-cta, .file.is-primary.is-hovered .file-cta { - background-color: #00c4a7; - border-color: transparent; - color: #fff; -} - -.file.is-primary:focus .file-cta, .file.is-primary.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.25); - color: #fff; -} - -.file.is-primary:active .file-cta, .file.is-primary.is-active .file-cta { - background-color: #00b89c; - border-color: transparent; - color: #fff; -} - -.file.is-link .file-cta { - background-color: #3273dc; - border-color: transparent; - color: #fff; -} - -.file.is-link:hover .file-cta, .file.is-link.is-hovered .file-cta { - background-color: #276cda; - border-color: transparent; - color: #fff; -} - -.file.is-link:focus .file-cta, .file.is-link.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(50, 115, 220, 0.25); - color: #fff; -} - -.file.is-link:active .file-cta, .file.is-link.is-active .file-cta { - background-color: #2366d1; - border-color: transparent; - color: #fff; -} - -.file.is-info .file-cta { - background-color: #209cee; - border-color: transparent; - color: #fff; -} - -.file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta { - background-color: #1496ed; - border-color: transparent; - color: #fff; -} - -.file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(32, 156, 238, 0.25); - color: #fff; -} - -.file.is-info:active .file-cta, .file.is-info.is-active .file-cta { - background-color: #118fe4; - border-color: transparent; - color: #fff; -} - -.file.is-success .file-cta { - background-color: #23d160; - border-color: transparent; - color: #fff; -} - -.file.is-success:hover .file-cta, .file.is-success.is-hovered .file-cta { - background-color: #22c65b; - border-color: transparent; - color: #fff; -} - -.file.is-success:focus .file-cta, .file.is-success.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(35, 209, 96, 0.25); - color: #fff; -} - -.file.is-success:active .file-cta, .file.is-success.is-active .file-cta { - background-color: #20bc56; - border-color: transparent; - color: #fff; -} - -.file.is-warning .file-cta { - background-color: #ffdd57; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); -} - -.file.is-warning:hover .file-cta, .file.is-warning.is-hovered .file-cta { - background-color: #ffdb4a; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); -} - -.file.is-warning:focus .file-cta, .file.is-warning.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25); - color: rgba(0, 0, 0, 0.7); -} - -.file.is-warning:active .file-cta, .file.is-warning.is-active .file-cta { - background-color: #ffd83d; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); -} - -.file.is-danger .file-cta { - background-color: #ff3860; - border-color: transparent; - color: #fff; -} - -.file.is-danger:hover .file-cta, .file.is-danger.is-hovered .file-cta { - background-color: #ff2b56; - border-color: transparent; - color: #fff; -} - -.file.is-danger:focus .file-cta, .file.is-danger.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 56, 96, 0.25); - color: #fff; -} - -.file.is-danger:active .file-cta, .file.is-danger.is-active .file-cta { - background-color: #ff1f4b; - border-color: transparent; - color: #fff; -} - -.file.is-small { - font-size: 0.75rem; -} - -.file.is-medium { - font-size: 1.25rem; -} - -.file.is-medium .file-icon .fa { - font-size: 21px; -} - -.file.is-large { - font-size: 1.5rem; -} - -.file.is-large .file-icon .fa { - font-size: 28px; -} - -.file.has-name .file-cta { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} - -.file.has-name .file-name { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.file.has-name.is-empty .file-cta { - border-radius: 4px; -} - -.file.has-name.is-empty .file-name { - display: none; -} - -.file.is-boxed .file-label { - flex-direction: column; -} - -.file.is-boxed .file-cta { - flex-direction: column; - height: auto; - padding: 1em 3em; -} - -.file.is-boxed .file-name { - border-width: 0 1px 1px; -} - -.file.is-boxed .file-icon { - height: 1.5em; - width: 1.5em; -} - -.file.is-boxed .file-icon .fa { - font-size: 21px; -} - -.file.is-boxed.is-small .file-icon .fa { - font-size: 14px; -} - -.file.is-boxed.is-medium .file-icon .fa { - font-size: 28px; -} - -.file.is-boxed.is-large .file-icon .fa { - font-size: 35px; -} - -.file.is-boxed.has-name .file-cta { - border-radius: 4px 4px 0 0; -} - -.file.is-boxed.has-name .file-name { - border-radius: 0 0 4px 4px; - border-width: 0 1px 1px; -} - -.file.is-centered { - justify-content: center; -} - -.file.is-fullwidth .file-label { - width: 100%; -} - -.file.is-fullwidth .file-name { - flex-grow: 1; - max-width: none; -} - -.file.is-right { - justify-content: flex-end; -} - -.file.is-right .file-cta { - border-radius: 0 4px 4px 0; -} - -.file.is-right .file-name { - border-radius: 4px 0 0 4px; - border-width: 1px 0 1px 1px; - order: -1; -} - -.file-label { - align-items: stretch; - display: flex; - cursor: pointer; - justify-content: flex-start; - overflow: hidden; - position: relative; -} - -.file-label:hover .file-cta { - background-color: #eeeeee; - color: #363636; -} - -.file-label:hover .file-name { - border-color: #d5d5d5; -} - -.file-label:active .file-cta { - background-color: #e8e8e8; - color: #363636; -} - -.file-label:active .file-name { - border-color: #cfcfcf; -} - -.file-input { - height: 100%; - left: 0; - opacity: 0; - outline: none; - position: absolute; - top: 0; - width: 100%; -} - -.file-cta, -.file-name { - border-color: #dbdbdb; - border-radius: 4px; - font-size: 1em; - padding-left: 1em; - padding-right: 1em; - white-space: nowrap; -} - -.file-cta { - background-color: whitesmoke; - color: #4a4a4a; -} - -.file-name { - border-color: #dbdbdb; - border-style: solid; - border-width: 1px 1px 1px 0; - display: block; - max-width: 16em; - overflow: hidden; - text-align: left; - text-overflow: ellipsis; -} - -.file-icon { - align-items: center; - display: flex; - height: 1em; - justify-content: center; - margin-right: 0.5em; - width: 1em; -} - -.file-icon .fa { - font-size: 14px; -} - -.label { - color: #363636; - display: block; - font-size: 1rem; - font-weight: 700; -} - -.label:not(:last-child) { - margin-bottom: 0.5em; -} - -.label.is-small { - font-size: 0.75rem; -} - -.label.is-medium { - font-size: 1.25rem; -} - -.label.is-large { - font-size: 1.5rem; -} - -.help { - display: block; - font-size: 0.75rem; - margin-top: 0.25rem; -} - -.help.is-white { - color: white; -} - -.help.is-black { - color: #0a0a0a; -} - -.help.is-light { - color: whitesmoke; -} - -.help.is-dark { - color: #363636; -} - -.help.is-primary { - color: #00d1b2; -} - -.help.is-link { - color: #3273dc; -} - -.help.is-info { - color: #209cee; -} - -.help.is-success { - color: #23d160; -} - -.help.is-warning { - color: #ffdd57; -} - -.help.is-danger { - color: #ff3860; -} - -.field:not(:last-child) { - margin-bottom: 0.75rem; -} - -.field.has-addons { - display: flex; - justify-content: flex-start; -} - -.field.has-addons .control:not(:last-child) { - margin-right: -1px; -} - -.field.has-addons .control:not(:first-child):not(:last-child) .button, -.field.has-addons .control:not(:first-child):not(:last-child) .input, -.field.has-addons .control:not(:first-child):not(:last-child) .select select { - border-radius: 0; -} - -.field.has-addons .control:first-child:not(:only-child) .button, -.field.has-addons .control:first-child:not(:only-child) .input, -.field.has-addons .control:first-child:not(:only-child) .select select { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} - -.field.has-addons .control:last-child:not(:only-child) .button, -.field.has-addons .control:last-child:not(:only-child) .input, -.field.has-addons .control:last-child:not(:only-child) .select select { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.field.has-addons .control .button:not([disabled]):hover, .field.has-addons .control .button:not([disabled]).is-hovered, -.field.has-addons .control .input:not([disabled]):hover, -.field.has-addons .control .input:not([disabled]).is-hovered, -.field.has-addons .control .select select:not([disabled]):hover, -.field.has-addons .control .select select:not([disabled]).is-hovered { - z-index: 2; -} - -.field.has-addons .control .button:not([disabled]):focus, .field.has-addons .control .button:not([disabled]).is-focused, .field.has-addons .control .button:not([disabled]):active, .field.has-addons .control .button:not([disabled]).is-active, -.field.has-addons .control .input:not([disabled]):focus, -.field.has-addons .control .input:not([disabled]).is-focused, -.field.has-addons .control .input:not([disabled]):active, -.field.has-addons .control .input:not([disabled]).is-active, -.field.has-addons .control .select select:not([disabled]):focus, -.field.has-addons .control .select select:not([disabled]).is-focused, -.field.has-addons .control .select select:not([disabled]):active, -.field.has-addons .control .select select:not([disabled]).is-active { - z-index: 3; -} - -.field.has-addons .control .button:not([disabled]):focus:hover, .field.has-addons .control .button:not([disabled]).is-focused:hover, .field.has-addons .control .button:not([disabled]):active:hover, .field.has-addons .control .button:not([disabled]).is-active:hover, -.field.has-addons .control .input:not([disabled]):focus:hover, -.field.has-addons .control .input:not([disabled]).is-focused:hover, -.field.has-addons .control .input:not([disabled]):active:hover, -.field.has-addons .control .input:not([disabled]).is-active:hover, -.field.has-addons .control .select select:not([disabled]):focus:hover, -.field.has-addons .control .select select:not([disabled]).is-focused:hover, -.field.has-addons .control .select select:not([disabled]):active:hover, -.field.has-addons .control .select select:not([disabled]).is-active:hover { - z-index: 4; -} - -.field.has-addons .control.is-expanded { - flex-grow: 1; -} - -.field.has-addons.has-addons-centered { - justify-content: center; -} - -.field.has-addons.has-addons-right { - justify-content: flex-end; -} - -.field.has-addons.has-addons-fullwidth .control { - flex-grow: 1; - flex-shrink: 0; -} - -.field.is-grouped { - display: flex; - justify-content: flex-start; -} - -.field.is-grouped > .control { - flex-shrink: 0; -} - -.field.is-grouped > .control:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; -} - -.field.is-grouped > .control.is-expanded { - flex-grow: 1; - flex-shrink: 1; -} - -.field.is-grouped.is-grouped-centered { - justify-content: center; -} - -.field.is-grouped.is-grouped-right { - justify-content: flex-end; -} - -.field.is-grouped.is-grouped-multiline { - flex-wrap: wrap; -} - -.field.is-grouped.is-grouped-multiline > .control:last-child, .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { - margin-bottom: 0.75rem; -} - -.field.is-grouped.is-grouped-multiline:last-child { - margin-bottom: -0.75rem; -} - -.field.is-grouped.is-grouped-multiline:not(:last-child) { - margin-bottom: 0; -} - -@media screen and (min-width: 769px), print { - .field.is-horizontal { - display: flex; - } -} - -.field-label .label { - font-size: inherit; -} - -@media screen and (max-width: 768px) { - .field-label { - margin-bottom: 0.5rem; - } -} - -@media screen and (min-width: 769px), print { - .field-label { - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - margin-right: 1.5rem; - text-align: right; - } - .field-label.is-small { - font-size: 0.75rem; - padding-top: 0.375em; - } - .field-label.is-normal { - padding-top: 0.375em; - } - .field-label.is-medium { - font-size: 1.25rem; - padding-top: 0.375em; - } - .field-label.is-large { - font-size: 1.5rem; - padding-top: 0.375em; - } -} - -.field-body .field .field { - margin-bottom: 0; -} - -@media screen and (min-width: 769px), print { - .field-body { - display: flex; - flex-basis: 0; - flex-grow: 5; - flex-shrink: 1; - } - .field-body .field { - margin-bottom: 0; - } - .field-body > .field { - flex-shrink: 1; - } - .field-body > .field:not(.is-narrow) { - flex-grow: 1; - } - .field-body > .field:not(:last-child) { - margin-right: 0.75rem; - } -} - -.control { - box-sizing: border-box; - clear: both; - font-size: 1rem; - position: relative; - text-align: left; -} - -.control.has-icons-left .input:focus ~ .icon, -.control.has-icons-left .select:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon, -.control.has-icons-right .select:focus ~ .icon { - color: #7a7a7a; -} - -.control.has-icons-left .input.is-small ~ .icon, -.control.has-icons-left .select.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon, -.control.has-icons-right .select.is-small ~ .icon { - font-size: 0.75rem; -} - -.control.has-icons-left .input.is-medium ~ .icon, -.control.has-icons-left .select.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon, -.control.has-icons-right .select.is-medium ~ .icon { - font-size: 1.25rem; -} - -.control.has-icons-left .input.is-large ~ .icon, -.control.has-icons-left .select.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon, -.control.has-icons-right .select.is-large ~ .icon { - font-size: 1.5rem; -} - -.control.has-icons-left .icon, .control.has-icons-right .icon { - color: #dbdbdb; - height: 2.25em; - pointer-events: none; - position: absolute; - top: 0; - width: 2.25em; - z-index: 4; -} - -.control.has-icons-left .input, -.control.has-icons-left .select select { - padding-left: 2.25em; -} - -.control.has-icons-left .icon.is-left { - left: 0; -} - -.control.has-icons-right .input, -.control.has-icons-right .select select { - padding-right: 2.25em; -} - -.control.has-icons-right .icon.is-right { - right: 0; -} - -.control.is-loading::after { - position: absolute !important; - right: 0.625em; - top: 0.625em; - z-index: 4; -} - -.control.is-loading.is-small:after { - font-size: 0.75rem; -} - -.control.is-loading.is-medium:after { - font-size: 1.25rem; -} - -.control.is-loading.is-large:after { - font-size: 1.5rem; -} - -.icon { - align-items: center; - display: inline-flex; - justify-content: center; - height: 1.5rem; - width: 1.5rem; -} - -.icon.is-small { - height: 1rem; - width: 1rem; -} - -.icon.is-medium { - height: 2rem; - width: 2rem; -} - -.icon.is-large { - height: 3rem; - width: 3rem; -} - -.image { - display: block; - position: relative; -} - -.image img { - display: block; - height: auto; - width: 100%; -} - -.image img.is-rounded { - border-radius: 290486px; -} - -.image.is-square img, -.image.is-square .has-ratio, .image.is-1by1 img, -.image.is-1by1 .has-ratio, .image.is-5by4 img, -.image.is-5by4 .has-ratio, .image.is-4by3 img, -.image.is-4by3 .has-ratio, .image.is-3by2 img, -.image.is-3by2 .has-ratio, .image.is-5by3 img, -.image.is-5by3 .has-ratio, .image.is-16by9 img, -.image.is-16by9 .has-ratio, .image.is-2by1 img, -.image.is-2by1 .has-ratio, .image.is-3by1 img, -.image.is-3by1 .has-ratio, .image.is-4by5 img, -.image.is-4by5 .has-ratio, .image.is-3by4 img, -.image.is-3by4 .has-ratio, .image.is-2by3 img, -.image.is-2by3 .has-ratio, .image.is-3by5 img, -.image.is-3by5 .has-ratio, .image.is-9by16 img, -.image.is-9by16 .has-ratio, .image.is-1by2 img, -.image.is-1by2 .has-ratio, .image.is-1by3 img, -.image.is-1by3 .has-ratio { - height: 100%; - width: 100%; -} - -.image.is-square, .image.is-1by1 { - padding-top: 100%; -} - -.image.is-5by4 { - padding-top: 80%; -} - -.image.is-4by3 { - padding-top: 75%; -} - -.image.is-3by2 { - padding-top: 66.6666%; -} - -.image.is-5by3 { - padding-top: 60%; -} - -.image.is-16by9 { - padding-top: 56.25%; -} - -.image.is-2by1 { - padding-top: 50%; -} - -.image.is-3by1 { - padding-top: 33.3333%; -} - -.image.is-4by5 { - padding-top: 125%; -} - -.image.is-3by4 { - padding-top: 133.3333%; -} - -.image.is-2by3 { - padding-top: 150%; -} - -.image.is-3by5 { - padding-top: 166.6666%; -} - -.image.is-9by16 { - padding-top: 177.7777%; -} - -.image.is-1by2 { - padding-top: 200%; -} - -.image.is-1by3 { - padding-top: 300%; -} - -.image.is-16x16 { - height: 16px; - width: 16px; -} - -.image.is-24x24 { - height: 24px; - width: 24px; -} - -.image.is-32x32 { - height: 32px; - width: 32px; -} - -.image.is-48x48 { - height: 48px; - width: 48px; -} - -.image.is-64x64 { - height: 64px; - width: 64px; -} - -.image.is-96x96 { - height: 96px; - width: 96px; -} - -.image.is-128x128 { - height: 128px; - width: 128px; -} - -.notification { - background-color: whitesmoke; - border-radius: 4px; - padding: 1.25rem 2.5rem 1.25rem 1.5rem; - position: relative; -} - -.notification a:not(.button):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; -} - -.notification strong { - color: currentColor; -} - -.notification code, -.notification pre { - background: white; -} - -.notification pre code { - background: transparent; -} - -.notification > .delete { - position: absolute; - right: 0.5rem; - top: 0.5rem; -} - -.notification .title, -.notification .subtitle, -.notification .content { - color: currentColor; -} - -.notification.is-white { - background-color: white; - color: #0a0a0a; -} - -.notification.is-black { - background-color: #0a0a0a; - color: white; -} - -.notification.is-light { - background-color: whitesmoke; - color: #363636; -} - -.notification.is-dark { - background-color: #363636; - color: whitesmoke; -} - -.notification.is-primary { - background-color: #00d1b2; - color: #fff; -} - -.notification.is-link { - background-color: #3273dc; - color: #fff; -} - -.notification.is-info { - background-color: #209cee; - color: #fff; -} - -.notification.is-success { - background-color: #23d160; - color: #fff; -} - -.notification.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); -} - -.notification.is-danger { - background-color: #ff3860; - color: #fff; -} - -.progress { - -moz-appearance: none; - -webkit-appearance: none; - border: none; - border-radius: 290486px; - display: block; - height: 1rem; - overflow: hidden; - padding: 0; - width: 100%; -} - -.progress::-webkit-progress-bar { - background-color: #dbdbdb; -} - -.progress::-webkit-progress-value { - background-color: #4a4a4a; -} - -.progress::-moz-progress-bar { - background-color: #4a4a4a; -} - -.progress::-ms-fill { - background-color: #4a4a4a; - border: none; -} - -.progress:indeterminate { - -webkit-animation-duration: 1.5s; - animation-duration: 1.5s; - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; - -webkit-animation-name: moveIndeterminate; - animation-name: moveIndeterminate; - -webkit-animation-timing-function: linear; - animation-timing-function: linear; - background-color: #dbdbdb; - background-image: linear-gradient(to right, #4a4a4a 30%, #dbdbdb 30%); - background-position: top left; - background-repeat: no-repeat; - background-size: 150% 150%; -} - -.progress:indeterminate::-webkit-progress-bar { - background-color: transparent; -} - -.progress:indeterminate::-moz-progress-bar { - background-color: transparent; -} - -.progress.is-white::-webkit-progress-value { - background-color: white; -} - -.progress.is-white::-moz-progress-bar { - background-color: white; -} - -.progress.is-white::-ms-fill { - background-color: white; -} - -.progress.is-white:indeterminate { - background-image: linear-gradient(to right, white 30%, #dbdbdb 30%); -} - -.progress.is-black::-webkit-progress-value { - background-color: #0a0a0a; -} - -.progress.is-black::-moz-progress-bar { - background-color: #0a0a0a; -} - -.progress.is-black::-ms-fill { - background-color: #0a0a0a; -} - -.progress.is-black:indeterminate { - background-image: linear-gradient(to right, #0a0a0a 30%, #dbdbdb 30%); -} - -.progress.is-light::-webkit-progress-value { - background-color: whitesmoke; -} - -.progress.is-light::-moz-progress-bar { - background-color: whitesmoke; -} - -.progress.is-light::-ms-fill { - background-color: whitesmoke; -} - -.progress.is-light:indeterminate { - background-image: linear-gradient(to right, whitesmoke 30%, #dbdbdb 30%); -} - -.progress.is-dark::-webkit-progress-value { - background-color: #363636; -} - -.progress.is-dark::-moz-progress-bar { - background-color: #363636; -} - -.progress.is-dark::-ms-fill { - background-color: #363636; -} - -.progress.is-dark:indeterminate { - background-image: linear-gradient(to right, #363636 30%, #dbdbdb 30%); -} - -.progress.is-primary::-webkit-progress-value { - background-color: #00d1b2; -} - -.progress.is-primary::-moz-progress-bar { - background-color: #00d1b2; -} - -.progress.is-primary::-ms-fill { - background-color: #00d1b2; -} - -.progress.is-primary:indeterminate { - background-image: linear-gradient(to right, #00d1b2 30%, #dbdbdb 30%); -} - -.progress.is-link::-webkit-progress-value { - background-color: #3273dc; -} - -.progress.is-link::-moz-progress-bar { - background-color: #3273dc; -} - -.progress.is-link::-ms-fill { - background-color: #3273dc; -} - -.progress.is-link:indeterminate { - background-image: linear-gradient(to right, #3273dc 30%, #dbdbdb 30%); -} - -.progress.is-info::-webkit-progress-value { - background-color: #209cee; -} - -.progress.is-info::-moz-progress-bar { - background-color: #209cee; -} - -.progress.is-info::-ms-fill { - background-color: #209cee; -} - -.progress.is-info:indeterminate { - background-image: linear-gradient(to right, #209cee 30%, #dbdbdb 30%); -} - -.progress.is-success::-webkit-progress-value { - background-color: #23d160; -} - -.progress.is-success::-moz-progress-bar { - background-color: #23d160; -} - -.progress.is-success::-ms-fill { - background-color: #23d160; -} - -.progress.is-success:indeterminate { - background-image: linear-gradient(to right, #23d160 30%, #dbdbdb 30%); -} - -.progress.is-warning::-webkit-progress-value { - background-color: #ffdd57; -} - -.progress.is-warning::-moz-progress-bar { - background-color: #ffdd57; -} - -.progress.is-warning::-ms-fill { - background-color: #ffdd57; -} - -.progress.is-warning:indeterminate { - background-image: linear-gradient(to right, #ffdd57 30%, #dbdbdb 30%); -} - -.progress.is-danger::-webkit-progress-value { - background-color: #ff3860; -} - -.progress.is-danger::-moz-progress-bar { - background-color: #ff3860; -} - -.progress.is-danger::-ms-fill { - background-color: #ff3860; -} - -.progress.is-danger:indeterminate { - background-image: linear-gradient(to right, #ff3860 30%, #dbdbdb 30%); -} - -.progress.is-small { - height: 0.75rem; -} - -.progress.is-medium { - height: 1.25rem; -} - -.progress.is-large { - height: 1.5rem; -} - -@-webkit-keyframes moveIndeterminate { - from { - background-position: 200% 0; - } - to { - background-position: -200% 0; - } -} - -@keyframes moveIndeterminate { - from { - background-position: 200% 0; - } - to { - background-position: -200% 0; - } -} - -.table { - background-color: white; - color: #363636; -} - -.table td, -.table th { - border: 1px solid #dbdbdb; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; -} - -.table td.is-white, -.table th.is-white { - background-color: white; - border-color: white; - color: #0a0a0a; -} - -.table td.is-black, -.table th.is-black { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; -} - -.table td.is-light, -.table th.is-light { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; -} - -.table td.is-dark, -.table th.is-dark { - background-color: #363636; - border-color: #363636; - color: whitesmoke; -} - -.table td.is-primary, -.table th.is-primary { - background-color: #00d1b2; - border-color: #00d1b2; - color: #fff; -} - -.table td.is-link, -.table th.is-link { - background-color: #3273dc; - border-color: #3273dc; - color: #fff; -} - -.table td.is-info, -.table th.is-info { - background-color: #209cee; - border-color: #209cee; - color: #fff; -} - -.table td.is-success, -.table th.is-success { - background-color: #23d160; - border-color: #23d160; - color: #fff; -} - -.table td.is-warning, -.table th.is-warning { - background-color: #ffdd57; - border-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); -} - -.table td.is-danger, -.table th.is-danger { - background-color: #ff3860; - border-color: #ff3860; - color: #fff; -} - -.table td.is-narrow, -.table th.is-narrow { - white-space: nowrap; - width: 1%; -} - -.table td.is-selected, -.table th.is-selected { - background-color: #00d1b2; - color: #fff; -} - -.table td.is-selected a, -.table td.is-selected strong, -.table th.is-selected a, -.table th.is-selected strong { - color: currentColor; -} - -.table th { - color: #363636; - text-align: left; -} - -.table tr.is-selected { - background-color: #00d1b2; - color: #fff; -} - -.table tr.is-selected a, -.table tr.is-selected strong { - color: currentColor; -} - -.table tr.is-selected td, -.table tr.is-selected th { - border-color: #fff; - color: currentColor; -} - -.table thead { - background-color: transparent; -} - -.table thead td, -.table thead th { - border-width: 0 0 2px; - color: #363636; -} - -.table tfoot { - background-color: transparent; -} - -.table tfoot td, -.table tfoot th { - border-width: 2px 0 0; - color: #363636; -} - -.table tbody { - background-color: transparent; -} - -.table tbody tr:last-child td, -.table tbody tr:last-child th { - border-bottom-width: 0; -} - -.table.is-bordered td, -.table.is-bordered th { - border-width: 1px; -} - -.table.is-bordered tr:last-child td, -.table.is-bordered tr:last-child th { - border-bottom-width: 1px; -} - -.table.is-fullwidth { - width: 100%; -} - -.table.is-hoverable tbody tr:not(.is-selected):hover { - background-color: #fafafa; -} - -.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { - background-color: #fafafa; -} - -.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { - background-color: whitesmoke; -} - -.table.is-narrow td, -.table.is-narrow th { - padding: 0.25em 0.5em; -} - -.table.is-striped tbody tr:not(.is-selected):nth-child(even) { - background-color: #fafafa; -} - -.table-container { - -webkit-overflow-scrolling: touch; - overflow: auto; - overflow-y: hidden; - max-width: 100%; -} - -.tags { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; -} - -.tags .tag { - margin-bottom: 0.5rem; -} - -.tags .tag:not(:last-child) { - margin-right: 0.5rem; -} - -.tags:last-child { - margin-bottom: -0.5rem; -} - -.tags:not(:last-child) { - margin-bottom: 1rem; -} - -.tags.are-medium .tag:not(.is-normal):not(.is-large) { - font-size: 1rem; -} - -.tags.are-large .tag:not(.is-normal):not(.is-medium) { - font-size: 1.25rem; -} - -.tags.has-addons .tag { - margin-right: 0; -} - -.tags.has-addons .tag:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.tags.has-addons .tag:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} - -.tags.is-centered { - justify-content: center; -} - -.tags.is-centered .tag { - margin-right: 0.25rem; - margin-left: 0.25rem; -} - -.tags.is-right { - justify-content: flex-end; -} - -.tags.is-right .tag:not(:first-child) { - margin-left: 0.5rem; -} - -.tags.is-right .tag:not(:last-child) { - margin-right: 0; -} - -.tags.has-addons .tag { - margin-right: 0; -} - -.tags.has-addons .tag:not(:first-child) { - margin-left: 0; - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.tags.has-addons .tag:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} - -.tag:not(body) { - align-items: center; - background-color: whitesmoke; - border-radius: 4px; - color: #4a4a4a; - display: inline-flex; - font-size: 0.75rem; - height: 2em; - justify-content: center; - line-height: 1.5; - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; -} - -.tag:not(body) .delete { - margin-left: 0.25rem; - margin-right: -0.375rem; -} - -.tag:not(body).is-white { - background-color: white; - color: #0a0a0a; -} - -.tag:not(body).is-black { - background-color: #0a0a0a; - color: white; -} - -.tag:not(body).is-light { - background-color: whitesmoke; - color: #363636; -} - -.tag:not(body).is-dark { - background-color: #363636; - color: whitesmoke; -} - -.tag:not(body).is-primary { - background-color: #00d1b2; - color: #fff; -} - -.tag:not(body).is-link { - background-color: #3273dc; - color: #fff; -} - -.tag:not(body).is-info { - background-color: #209cee; - color: #fff; -} - -.tag:not(body).is-success { - background-color: #23d160; - color: #fff; -} - -.tag:not(body).is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); -} - -.tag:not(body).is-danger { - background-color: #ff3860; - color: #fff; -} - -.tag:not(body).is-normal { - font-size: 0.75rem; -} - -.tag:not(body).is-medium { - font-size: 1rem; -} - -.tag:not(body).is-large { - font-size: 1.25rem; -} - -.tag:not(body) .icon:first-child:not(:last-child) { - margin-left: -0.375em; - margin-right: 0.1875em; -} - -.tag:not(body) .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: -0.375em; -} - -.tag:not(body) .icon:first-child:last-child { - margin-left: -0.375em; - margin-right: -0.375em; -} - -.tag:not(body).is-delete { - margin-left: 1px; - padding: 0; - position: relative; - width: 2em; -} - -.tag:not(body).is-delete::before, .tag:not(body).is-delete::after { - background-color: currentColor; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - -webkit-transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform: translateX(-50%) translateY(-50%) rotate(45deg); - -webkit-transform-origin: center center; - transform-origin: center center; -} - -.tag:not(body).is-delete::before { - height: 1px; - width: 50%; -} - -.tag:not(body).is-delete::after { - height: 50%; - width: 1px; -} - -.tag:not(body).is-delete:hover, .tag:not(body).is-delete:focus { - background-color: #e8e8e8; -} - -.tag:not(body).is-delete:active { - background-color: #dbdbdb; -} - -.tag:not(body).is-rounded { - border-radius: 290486px; -} - -a.tag:hover { - text-decoration: underline; -} - -.title, -.subtitle { - word-break: break-word; -} - -.title em, -.title span, -.subtitle em, -.subtitle span { - font-weight: inherit; -} - -.title sub, -.subtitle sub { - font-size: 0.75em; -} - -.title sup, -.subtitle sup { - font-size: 0.75em; -} - -.title .tag, -.subtitle .tag { - vertical-align: middle; -} - -.title { - color: #363636; - font-size: 2rem; - font-weight: 600; - line-height: 1.125; -} - -.title strong { - color: inherit; - font-weight: inherit; -} - -.title + .highlight { - margin-top: -0.75rem; -} - -.title:not(.is-spaced) + .subtitle { - margin-top: -1.25rem; -} - -.title.is-1 { - font-size: 3rem; -} - -.title.is-2 { - font-size: 2.5rem; -} - -.title.is-3 { - font-size: 2rem; -} - -.title.is-4 { - font-size: 1.5rem; -} - -.title.is-5 { - font-size: 1.25rem; -} - -.title.is-6 { - font-size: 1rem; -} - -.title.is-7 { - font-size: 0.75rem; -} - -.subtitle { - color: #4a4a4a; - font-size: 1.25rem; - font-weight: 400; - line-height: 1.25; -} - -.subtitle strong { - color: #363636; - font-weight: 600; -} - -.subtitle:not(.is-spaced) + .title { - margin-top: -1.25rem; -} - -.subtitle.is-1 { - font-size: 3rem; -} - -.subtitle.is-2 { - font-size: 2.5rem; -} - -.subtitle.is-3 { - font-size: 2rem; -} - -.subtitle.is-4 { - font-size: 1.5rem; -} - -.subtitle.is-5 { - font-size: 1.25rem; -} - -.subtitle.is-6 { - font-size: 1rem; -} - -.subtitle.is-7 { - font-size: 0.75rem; -} - -.heading { - display: block; - font-size: 11px; - letter-spacing: 1px; - margin-bottom: 5px; - text-transform: uppercase; -} - -.highlight { - font-weight: 400; - max-width: 100%; - overflow: hidden; - padding: 0; -} - -.highlight pre { - overflow: auto; - max-width: 100%; -} - -.number { - align-items: center; - background-color: whitesmoke; - border-radius: 290486px; - display: inline-flex; - font-size: 1.25rem; - height: 2em; - justify-content: center; - margin-right: 1.5rem; - min-width: 2.5em; - padding: 0.25rem 0.5rem; - text-align: center; - vertical-align: top; -} - -.breadcrumb { - font-size: 1rem; - white-space: nowrap; -} - -.breadcrumb a { - align-items: center; - color: #3273dc; - display: flex; - justify-content: center; - padding: 0 0.75em; -} - -.breadcrumb a:hover { - color: #363636; -} - -.breadcrumb li { - align-items: center; - display: flex; -} - -.breadcrumb li:first-child a { - padding-left: 0; -} - -.breadcrumb li.is-active a { - color: #363636; - cursor: default; - pointer-events: none; -} - -.breadcrumb li + li::before { - color: #b5b5b5; - content: "\0002f"; -} - -.breadcrumb ul, -.breadcrumb ol { - align-items: flex-start; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; -} - -.breadcrumb .icon:first-child { - margin-right: 0.5em; -} - -.breadcrumb .icon:last-child { - margin-left: 0.5em; -} - -.breadcrumb.is-centered ol, -.breadcrumb.is-centered ul { - justify-content: center; -} - -.breadcrumb.is-right ol, -.breadcrumb.is-right ul { - justify-content: flex-end; -} - -.breadcrumb.is-small { - font-size: 0.75rem; -} - -.breadcrumb.is-medium { - font-size: 1.25rem; -} - -.breadcrumb.is-large { - font-size: 1.5rem; -} - -.breadcrumb.has-arrow-separator li + li::before { - content: "\02192"; -} - -.breadcrumb.has-bullet-separator li + li::before { - content: "\02022"; -} - -.breadcrumb.has-dot-separator li + li::before { - content: "\000b7"; -} - -.breadcrumb.has-succeeds-separator li + li::before { - content: "\0227B"; -} - -.card { - background-color: white; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - color: #4a4a4a; - max-width: 100%; - position: relative; -} - -.card-header { - background-color: transparent; - align-items: stretch; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - display: flex; -} - -.card-header-title { - align-items: center; - color: #363636; - display: flex; - flex-grow: 1; - font-weight: 700; - padding: 0.75rem; -} - -.card-header-title.is-centered { - justify-content: center; -} - -.card-header-icon { - align-items: center; - cursor: pointer; - display: flex; - justify-content: center; - padding: 0.75rem; -} - -.card-image { - display: block; - position: relative; -} - -.card-content { - background-color: transparent; - padding: 1.5rem; -} - -.card-footer { - background-color: transparent; - border-top: 1px solid #dbdbdb; - align-items: stretch; - display: flex; -} - -.card-footer-item { - align-items: center; - display: flex; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - justify-content: center; - padding: 0.75rem; -} - -.card-footer-item:not(:last-child) { - border-right: 1px solid #dbdbdb; -} - -.card .media:not(:last-child) { - margin-bottom: 0.75rem; -} - -.dropdown { - display: inline-flex; - position: relative; - vertical-align: top; -} - -.dropdown.is-active .dropdown-menu, .dropdown.is-hoverable:hover .dropdown-menu { - display: block; -} - -.dropdown.is-right .dropdown-menu { - left: auto; - right: 0; -} - -.dropdown.is-up .dropdown-menu { - bottom: 100%; - padding-bottom: 4px; - padding-top: initial; - top: auto; -} - -.dropdown-menu { - display: none; - left: 0; - min-width: 12rem; - padding-top: 4px; - position: absolute; - top: 100%; - z-index: 20; -} - -.dropdown-content { - background-color: white; - border-radius: 4px; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - padding-bottom: 0.5rem; - padding-top: 0.5rem; -} - -.dropdown-item { - color: #4a4a4a; - display: block; - font-size: 0.875rem; - line-height: 1.5; - padding: 0.375rem 1rem; - position: relative; -} - -a.dropdown-item, -button.dropdown-item { - padding-right: 3rem; - text-align: left; - white-space: nowrap; - width: 100%; -} - -a.dropdown-item:hover, -button.dropdown-item:hover { - background-color: whitesmoke; - color: #0a0a0a; -} - -a.dropdown-item.is-active, -button.dropdown-item.is-active { - background-color: #3273dc; - color: #fff; -} - -.dropdown-divider { - background-color: #dbdbdb; - border: none; - display: block; - height: 1px; - margin: 0.5rem 0; -} - -.level { - align-items: center; - justify-content: space-between; -} - -.level code { - border-radius: 4px; -} - -.level img { - display: inline-block; - vertical-align: top; -} - -.level.is-mobile { - display: flex; -} - -.level.is-mobile .level-left, -.level.is-mobile .level-right { - display: flex; -} - -.level.is-mobile .level-left + .level-right { - margin-top: 0; -} - -.level.is-mobile .level-item:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; -} - -.level.is-mobile .level-item:not(.is-narrow) { - flex-grow: 1; -} - -@media screen and (min-width: 769px), print { - .level { - display: flex; - } - .level > .level-item:not(.is-narrow) { - flex-grow: 1; - } -} - -.level-item { - align-items: center; - display: flex; - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; - justify-content: center; -} - -.level-item .title, -.level-item .subtitle { - margin-bottom: 0; -} - -@media screen and (max-width: 768px) { - .level-item:not(:last-child) { - margin-bottom: 0.75rem; - } -} - -.level-left, -.level-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; -} - -.level-left .level-item.is-flexible, -.level-right .level-item.is-flexible { - flex-grow: 1; -} - -@media screen and (min-width: 769px), print { - .level-left .level-item:not(:last-child), - .level-right .level-item:not(:last-child) { - margin-right: 0.75rem; - } -} - -.level-left { - align-items: center; - justify-content: flex-start; -} - -@media screen and (max-width: 768px) { - .level-left + .level-right { - margin-top: 1.5rem; - } -} - -@media screen and (min-width: 769px), print { - .level-left { - display: flex; - } -} - -.level-right { - align-items: center; - justify-content: flex-end; -} - -@media screen and (min-width: 769px), print { - .level-right { - display: flex; - } -} - -.list { - background-color: white; - border-radius: 4px; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); -} - -.list-item { - display: block; - padding: 0.5em 1em; -} - -.list-item:not(a) { - color: #4a4a4a; -} - -.list-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} - -.list-item:last-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} - -.list-item:not(:last-child) { - border-bottom: 1px solid #dbdbdb; -} - -.list-item.is-active { - background-color: #3273dc; - color: #fff; -} - -a.list-item { - background-color: whitesmoke; - cursor: pointer; -} - -.media { - align-items: flex-start; - display: flex; - text-align: left; -} - -.media .content:not(:last-child) { - margin-bottom: 0.75rem; -} - -.media .media { - border-top: 1px solid rgba(219, 219, 219, 0.5); - display: flex; - padding-top: 0.75rem; -} - -.media .media .content:not(:last-child), -.media .media .control:not(:last-child) { - margin-bottom: 0.5rem; -} - -.media .media .media { - padding-top: 0.5rem; -} - -.media .media .media + .media { - margin-top: 0.5rem; -} - -.media + .media { - border-top: 1px solid rgba(219, 219, 219, 0.5); - margin-top: 1rem; - padding-top: 1rem; -} - -.media.is-large + .media { - margin-top: 1.5rem; - padding-top: 1.5rem; -} - -.media-left, -.media-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; -} - -.media-left { - margin-right: 1rem; -} - -.media-right { - margin-left: 1rem; -} - -.media-content { - flex-basis: auto; - flex-grow: 1; - flex-shrink: 1; - text-align: left; -} - -@media screen and (max-width: 768px) { - .media-content { - overflow-x: auto; - } -} - -.menu { - font-size: 1rem; -} - -.menu.is-small { - font-size: 0.75rem; -} - -.menu.is-medium { - font-size: 1.25rem; -} - -.menu.is-large { - font-size: 1.5rem; -} - -.menu-list { - line-height: 1.25; -} - -.menu-list a { - border-radius: 2px; - color: #4a4a4a; - display: block; - padding: 0.5em 0.75em; -} - -.menu-list a:hover { - background-color: whitesmoke; - color: #363636; -} - -.menu-list a.is-active { - background-color: #3273dc; - color: #fff; -} - -.menu-list li ul { - border-left: 1px solid #dbdbdb; - margin: 0.75em; - padding-left: 0.75em; -} - -.menu-label { - color: #7a7a7a; - font-size: 0.75em; - letter-spacing: 0.1em; - text-transform: uppercase; -} - -.menu-label:not(:first-child) { - margin-top: 1em; -} - -.menu-label:not(:last-child) { - margin-bottom: 1em; -} - -.message { - background-color: whitesmoke; - border-radius: 4px; - font-size: 1rem; -} - -.message strong { - color: currentColor; -} - -.message a:not(.button):not(.tag):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; -} - -.message.is-small { - font-size: 0.75rem; -} - -.message.is-medium { - font-size: 1.25rem; -} - -.message.is-large { - font-size: 1.5rem; -} - -.message.is-white { - background-color: white; -} - -.message.is-white .message-header { - background-color: white; - color: #0a0a0a; -} - -.message.is-white .message-body { - border-color: white; - color: #4d4d4d; -} - -.message.is-black { - background-color: #fafafa; -} - -.message.is-black .message-header { - background-color: #0a0a0a; - color: white; -} - -.message.is-black .message-body { - border-color: #0a0a0a; - color: #090909; -} - -.message.is-light { - background-color: #fafafa; -} - -.message.is-light .message-header { - background-color: whitesmoke; - color: #363636; -} - -.message.is-light .message-body { - border-color: whitesmoke; - color: #505050; -} - -.message.is-dark { - background-color: #fafafa; -} - -.message.is-dark .message-header { - background-color: #363636; - color: whitesmoke; -} - -.message.is-dark .message-body { - border-color: #363636; - color: #2a2a2a; -} - -.message.is-primary { - background-color: #f5fffd; -} - -.message.is-primary .message-header { - background-color: #00d1b2; - color: #fff; -} - -.message.is-primary .message-body { - border-color: #00d1b2; - color: #021310; -} - -.message.is-link { - background-color: #f6f9fe; -} - -.message.is-link .message-header { - background-color: #3273dc; - color: #fff; -} - -.message.is-link .message-body { - border-color: #3273dc; - color: #22509a; -} - -.message.is-info { - background-color: #f6fbfe; -} - -.message.is-info .message-header { - background-color: #209cee; - color: #fff; -} - -.message.is-info .message-body { - border-color: #209cee; - color: #12537e; -} - -.message.is-success { - background-color: #f6fef9; -} - -.message.is-success .message-header { - background-color: #23d160; - color: #fff; -} - -.message.is-success .message-body { - border-color: #23d160; - color: #0e301a; -} - -.message.is-warning { - background-color: #fffdf5; -} - -.message.is-warning .message-header { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); -} - -.message.is-warning .message-body { - border-color: #ffdd57; - color: #3b3108; -} - -.message.is-danger { - background-color: #fff5f7; -} - -.message.is-danger .message-header { - background-color: #ff3860; - color: #fff; -} - -.message.is-danger .message-body { - border-color: #ff3860; - color: #cd0930; -} - -.message-header { - align-items: center; - background-color: #4a4a4a; - border-radius: 4px 4px 0 0; - color: #fff; - display: flex; - font-weight: 700; - justify-content: space-between; - line-height: 1.25; - padding: 0.75em 1em; - position: relative; -} - -.message-header .delete { - flex-grow: 0; - flex-shrink: 0; - margin-left: 0.75em; -} - -.message-header + .message-body { - border-width: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.message-body { - border-color: #dbdbdb; - border-radius: 4px; - border-style: solid; - border-width: 0 0 0 4px; - color: #4a4a4a; - padding: 1.25em 1.5em; -} - -.message-body code, -.message-body pre { - background-color: white; -} - -.message-body pre code { - background-color: transparent; -} - -.modal { - align-items: center; - display: none; - flex-direction: column; - justify-content: center; - overflow: hidden; - position: fixed; - z-index: 40; -} - -.modal.is-active { - display: flex; -} - -.modal-background { - background-color: rgba(10, 10, 10, 0.86); -} - -.modal-content, -.modal-card { - margin: 0 20px; - max-height: calc(100vh - 160px); - overflow: auto; - position: relative; - width: 100%; -} - -@media screen and (min-width: 769px), print { - .modal-content, - .modal-card { - margin: 0 auto; - max-height: calc(100vh - 40px); - width: 640px; - } -} - -.modal-close { - background: none; - height: 40px; - position: fixed; - right: 20px; - top: 20px; - width: 40px; -} - -.modal-card { - display: flex; - flex-direction: column; - max-height: calc(100vh - 40px); - overflow: hidden; - -ms-overflow-y: visible; -} - -.modal-card-head, -.modal-card-foot { - align-items: center; - background-color: whitesmoke; - display: flex; - flex-shrink: 0; - justify-content: flex-start; - padding: 20px; - position: relative; -} - -.modal-card-head { - border-bottom: 1px solid #dbdbdb; - border-top-left-radius: 6px; - border-top-right-radius: 6px; -} - -.modal-card-title { - color: #363636; - flex-grow: 1; - flex-shrink: 0; - font-size: 1.5rem; - line-height: 1; -} - -.modal-card-foot { - border-bottom-left-radius: 6px; - border-bottom-right-radius: 6px; - border-top: 1px solid #dbdbdb; -} - -.modal-card-foot .button:not(:last-child) { - margin-right: 10px; -} - -.modal-card-body { - -webkit-overflow-scrolling: touch; - background-color: white; - flex-grow: 1; - flex-shrink: 1; - overflow: auto; - padding: 20px; -} - -.navbar { - background-color: white; - min-height: 3.25rem; - position: relative; - z-index: 30; -} - -.navbar.is-white { - background-color: white; - color: #0a0a0a; -} - -.navbar.is-white .navbar-brand > .navbar-item, -.navbar.is-white .navbar-brand .navbar-link { - color: #0a0a0a; -} - -.navbar.is-white .navbar-brand > a.navbar-item:hover, .navbar.is-white .navbar-brand > a.navbar-item.is-active, -.navbar.is-white .navbar-brand .navbar-link:hover, -.navbar.is-white .navbar-brand .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; -} - -.navbar.is-white .navbar-brand .navbar-link::after { - border-color: #0a0a0a; -} - -.navbar.is-white .navbar-burger { - color: #0a0a0a; -} - -@media screen and (min-width: 1088px) { - .navbar.is-white .navbar-start > .navbar-item, - .navbar.is-white .navbar-start .navbar-link, - .navbar.is-white .navbar-end > .navbar-item, - .navbar.is-white .navbar-end .navbar-link { - color: #0a0a0a; - } - .navbar.is-white .navbar-start > a.navbar-item:hover, .navbar.is-white .navbar-start > a.navbar-item.is-active, - .navbar.is-white .navbar-start .navbar-link:hover, - .navbar.is-white .navbar-start .navbar-link.is-active, - .navbar.is-white .navbar-end > a.navbar-item:hover, - .navbar.is-white .navbar-end > a.navbar-item.is-active, - .navbar.is-white .navbar-end .navbar-link:hover, - .navbar.is-white .navbar-end .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; - } - .navbar.is-white .navbar-start .navbar-link::after, - .navbar.is-white .navbar-end .navbar-link::after { - border-color: #0a0a0a; - } - .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #f2f2f2; - color: #0a0a0a; - } - .navbar.is-white .navbar-dropdown a.navbar-item.is-active { - background-color: white; - color: #0a0a0a; - } -} - -.navbar.is-black { - background-color: #0a0a0a; - color: white; -} - -.navbar.is-black .navbar-brand > .navbar-item, -.navbar.is-black .navbar-brand .navbar-link { - color: white; -} - -.navbar.is-black .navbar-brand > a.navbar-item:hover, .navbar.is-black .navbar-brand > a.navbar-item.is-active, -.navbar.is-black .navbar-brand .navbar-link:hover, -.navbar.is-black .navbar-brand .navbar-link.is-active { - background-color: black; - color: white; -} - -.navbar.is-black .navbar-brand .navbar-link::after { - border-color: white; -} - -.navbar.is-black .navbar-burger { - color: white; -} - -@media screen and (min-width: 1088px) { - .navbar.is-black .navbar-start > .navbar-item, - .navbar.is-black .navbar-start .navbar-link, - .navbar.is-black .navbar-end > .navbar-item, - .navbar.is-black .navbar-end .navbar-link { - color: white; - } - .navbar.is-black .navbar-start > a.navbar-item:hover, .navbar.is-black .navbar-start > a.navbar-item.is-active, - .navbar.is-black .navbar-start .navbar-link:hover, - .navbar.is-black .navbar-start .navbar-link.is-active, - .navbar.is-black .navbar-end > a.navbar-item:hover, - .navbar.is-black .navbar-end > a.navbar-item.is-active, - .navbar.is-black .navbar-end .navbar-link:hover, - .navbar.is-black .navbar-end .navbar-link.is-active { - background-color: black; - color: white; - } - .navbar.is-black .navbar-start .navbar-link::after, - .navbar.is-black .navbar-end .navbar-link::after { - border-color: white; - } - .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { - background-color: black; - color: white; - } - .navbar.is-black .navbar-dropdown a.navbar-item.is-active { - background-color: #0a0a0a; - color: white; - } -} - -.navbar.is-light { - background-color: whitesmoke; - color: #363636; -} - -.navbar.is-light .navbar-brand > .navbar-item, -.navbar.is-light .navbar-brand .navbar-link { - color: #363636; -} - -.navbar.is-light .navbar-brand > a.navbar-item:hover, .navbar.is-light .navbar-brand > a.navbar-item.is-active, -.navbar.is-light .navbar-brand .navbar-link:hover, -.navbar.is-light .navbar-brand .navbar-link.is-active { - background-color: #e8e8e8; - color: #363636; -} - -.navbar.is-light .navbar-brand .navbar-link::after { - border-color: #363636; -} - -.navbar.is-light .navbar-burger { - color: #363636; -} - -@media screen and (min-width: 1088px) { - .navbar.is-light .navbar-start > .navbar-item, - .navbar.is-light .navbar-start .navbar-link, - .navbar.is-light .navbar-end > .navbar-item, - .navbar.is-light .navbar-end .navbar-link { - color: #363636; - } - .navbar.is-light .navbar-start > a.navbar-item:hover, .navbar.is-light .navbar-start > a.navbar-item.is-active, - .navbar.is-light .navbar-start .navbar-link:hover, - .navbar.is-light .navbar-start .navbar-link.is-active, - .navbar.is-light .navbar-end > a.navbar-item:hover, - .navbar.is-light .navbar-end > a.navbar-item.is-active, - .navbar.is-light .navbar-end .navbar-link:hover, - .navbar.is-light .navbar-end .navbar-link.is-active { - background-color: #e8e8e8; - color: #363636; - } - .navbar.is-light .navbar-start .navbar-link::after, - .navbar.is-light .navbar-end .navbar-link::after { - border-color: #363636; - } - .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #e8e8e8; - color: #363636; - } - .navbar.is-light .navbar-dropdown a.navbar-item.is-active { - background-color: whitesmoke; - color: #363636; - } -} - -.navbar.is-dark { - background-color: #363636; - color: whitesmoke; -} - -.navbar.is-dark .navbar-brand > .navbar-item, -.navbar.is-dark .navbar-brand .navbar-link { - color: whitesmoke; -} - -.navbar.is-dark .navbar-brand > a.navbar-item:hover, .navbar.is-dark .navbar-brand > a.navbar-item.is-active, -.navbar.is-dark .navbar-brand .navbar-link:hover, -.navbar.is-dark .navbar-brand .navbar-link.is-active { - background-color: #292929; - color: whitesmoke; -} - -.navbar.is-dark .navbar-brand .navbar-link::after { - border-color: whitesmoke; -} - -.navbar.is-dark .navbar-burger { - color: whitesmoke; -} - -@media screen and (min-width: 1088px) { - .navbar.is-dark .navbar-start > .navbar-item, - .navbar.is-dark .navbar-start .navbar-link, - .navbar.is-dark .navbar-end > .navbar-item, - .navbar.is-dark .navbar-end .navbar-link { - color: whitesmoke; - } - .navbar.is-dark .navbar-start > a.navbar-item:hover, .navbar.is-dark .navbar-start > a.navbar-item.is-active, - .navbar.is-dark .navbar-start .navbar-link:hover, - .navbar.is-dark .navbar-start .navbar-link.is-active, - .navbar.is-dark .navbar-end > a.navbar-item:hover, - .navbar.is-dark .navbar-end > a.navbar-item.is-active, - .navbar.is-dark .navbar-end .navbar-link:hover, - .navbar.is-dark .navbar-end .navbar-link.is-active { - background-color: #292929; - color: whitesmoke; - } - .navbar.is-dark .navbar-start .navbar-link::after, - .navbar.is-dark .navbar-end .navbar-link::after { - border-color: whitesmoke; - } - .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #292929; - color: whitesmoke; - } - .navbar.is-dark .navbar-dropdown a.navbar-item.is-active { - background-color: #363636; - color: whitesmoke; - } -} - -.navbar.is-primary { - background-color: #00d1b2; - color: #fff; -} - -.navbar.is-primary .navbar-brand > .navbar-item, -.navbar.is-primary .navbar-brand .navbar-link { - color: #fff; -} - -.navbar.is-primary .navbar-brand > a.navbar-item:hover, .navbar.is-primary .navbar-brand > a.navbar-item.is-active, -.navbar.is-primary .navbar-brand .navbar-link:hover, -.navbar.is-primary .navbar-brand .navbar-link.is-active { - background-color: #00b89c; - color: #fff; -} - -.navbar.is-primary .navbar-brand .navbar-link::after { - border-color: #fff; -} - -.navbar.is-primary .navbar-burger { - color: #fff; -} - -@media screen and (min-width: 1088px) { - .navbar.is-primary .navbar-start > .navbar-item, - .navbar.is-primary .navbar-start .navbar-link, - .navbar.is-primary .navbar-end > .navbar-item, - .navbar.is-primary .navbar-end .navbar-link { - color: #fff; - } - .navbar.is-primary .navbar-start > a.navbar-item:hover, .navbar.is-primary .navbar-start > a.navbar-item.is-active, - .navbar.is-primary .navbar-start .navbar-link:hover, - .navbar.is-primary .navbar-start .navbar-link.is-active, - .navbar.is-primary .navbar-end > a.navbar-item:hover, - .navbar.is-primary .navbar-end > a.navbar-item.is-active, - .navbar.is-primary .navbar-end .navbar-link:hover, - .navbar.is-primary .navbar-end .navbar-link.is-active { - background-color: #00b89c; - color: #fff; - } - .navbar.is-primary .navbar-start .navbar-link::after, - .navbar.is-primary .navbar-end .navbar-link::after { - border-color: #fff; - } - .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #00b89c; - color: #fff; - } - .navbar.is-primary .navbar-dropdown a.navbar-item.is-active { - background-color: #00d1b2; - color: #fff; - } -} - -.navbar.is-link { - background-color: #3273dc; - color: #fff; -} - -.navbar.is-link .navbar-brand > .navbar-item, -.navbar.is-link .navbar-brand .navbar-link { - color: #fff; -} - -.navbar.is-link .navbar-brand > a.navbar-item:hover, .navbar.is-link .navbar-brand > a.navbar-item.is-active, -.navbar.is-link .navbar-brand .navbar-link:hover, -.navbar.is-link .navbar-brand .navbar-link.is-active { - background-color: #2366d1; - color: #fff; -} - -.navbar.is-link .navbar-brand .navbar-link::after { - border-color: #fff; -} - -.navbar.is-link .navbar-burger { - color: #fff; -} - -@media screen and (min-width: 1088px) { - .navbar.is-link .navbar-start > .navbar-item, - .navbar.is-link .navbar-start .navbar-link, - .navbar.is-link .navbar-end > .navbar-item, - .navbar.is-link .navbar-end .navbar-link { - color: #fff; - } - .navbar.is-link .navbar-start > a.navbar-item:hover, .navbar.is-link .navbar-start > a.navbar-item.is-active, - .navbar.is-link .navbar-start .navbar-link:hover, - .navbar.is-link .navbar-start .navbar-link.is-active, - .navbar.is-link .navbar-end > a.navbar-item:hover, - .navbar.is-link .navbar-end > a.navbar-item.is-active, - .navbar.is-link .navbar-end .navbar-link:hover, - .navbar.is-link .navbar-end .navbar-link.is-active { - background-color: #2366d1; - color: #fff; - } - .navbar.is-link .navbar-start .navbar-link::after, - .navbar.is-link .navbar-end .navbar-link::after { - border-color: #fff; - } - .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #2366d1; - color: #fff; - } - .navbar.is-link .navbar-dropdown a.navbar-item.is-active { - background-color: #3273dc; - color: #fff; - } -} - -.navbar.is-info { - background-color: #209cee; - color: #fff; -} - -.navbar.is-info .navbar-brand > .navbar-item, -.navbar.is-info .navbar-brand .navbar-link { - color: #fff; -} - -.navbar.is-info .navbar-brand > a.navbar-item:hover, .navbar.is-info .navbar-brand > a.navbar-item.is-active, -.navbar.is-info .navbar-brand .navbar-link:hover, -.navbar.is-info .navbar-brand .navbar-link.is-active { - background-color: #118fe4; - color: #fff; -} - -.navbar.is-info .navbar-brand .navbar-link::after { - border-color: #fff; -} - -.navbar.is-info .navbar-burger { - color: #fff; -} - -@media screen and (min-width: 1088px) { - .navbar.is-info .navbar-start > .navbar-item, - .navbar.is-info .navbar-start .navbar-link, - .navbar.is-info .navbar-end > .navbar-item, - .navbar.is-info .navbar-end .navbar-link { - color: #fff; - } - .navbar.is-info .navbar-start > a.navbar-item:hover, .navbar.is-info .navbar-start > a.navbar-item.is-active, - .navbar.is-info .navbar-start .navbar-link:hover, - .navbar.is-info .navbar-start .navbar-link.is-active, - .navbar.is-info .navbar-end > a.navbar-item:hover, - .navbar.is-info .navbar-end > a.navbar-item.is-active, - .navbar.is-info .navbar-end .navbar-link:hover, - .navbar.is-info .navbar-end .navbar-link.is-active { - background-color: #118fe4; - color: #fff; - } - .navbar.is-info .navbar-start .navbar-link::after, - .navbar.is-info .navbar-end .navbar-link::after { - border-color: #fff; - } - .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #118fe4; - color: #fff; - } - .navbar.is-info .navbar-dropdown a.navbar-item.is-active { - background-color: #209cee; - color: #fff; - } -} - -.navbar.is-success { - background-color: #23d160; - color: #fff; -} - -.navbar.is-success .navbar-brand > .navbar-item, -.navbar.is-success .navbar-brand .navbar-link { - color: #fff; -} - -.navbar.is-success .navbar-brand > a.navbar-item:hover, .navbar.is-success .navbar-brand > a.navbar-item.is-active, -.navbar.is-success .navbar-brand .navbar-link:hover, -.navbar.is-success .navbar-brand .navbar-link.is-active { - background-color: #20bc56; - color: #fff; -} - -.navbar.is-success .navbar-brand .navbar-link::after { - border-color: #fff; -} - -.navbar.is-success .navbar-burger { - color: #fff; -} - -@media screen and (min-width: 1088px) { - .navbar.is-success .navbar-start > .navbar-item, - .navbar.is-success .navbar-start .navbar-link, - .navbar.is-success .navbar-end > .navbar-item, - .navbar.is-success .navbar-end .navbar-link { - color: #fff; - } - .navbar.is-success .navbar-start > a.navbar-item:hover, .navbar.is-success .navbar-start > a.navbar-item.is-active, - .navbar.is-success .navbar-start .navbar-link:hover, - .navbar.is-success .navbar-start .navbar-link.is-active, - .navbar.is-success .navbar-end > a.navbar-item:hover, - .navbar.is-success .navbar-end > a.navbar-item.is-active, - .navbar.is-success .navbar-end .navbar-link:hover, - .navbar.is-success .navbar-end .navbar-link.is-active { - background-color: #20bc56; - color: #fff; - } - .navbar.is-success .navbar-start .navbar-link::after, - .navbar.is-success .navbar-end .navbar-link::after { - border-color: #fff; - } - .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #20bc56; - color: #fff; - } - .navbar.is-success .navbar-dropdown a.navbar-item.is-active { - background-color: #23d160; - color: #fff; - } -} - -.navbar.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); -} - -.navbar.is-warning .navbar-brand > .navbar-item, -.navbar.is-warning .navbar-brand .navbar-link { - color: rgba(0, 0, 0, 0.7); -} - -.navbar.is-warning .navbar-brand > a.navbar-item:hover, .navbar.is-warning .navbar-brand > a.navbar-item.is-active, -.navbar.is-warning .navbar-brand .navbar-link:hover, -.navbar.is-warning .navbar-brand .navbar-link.is-active { - background-color: #ffd83d; - color: rgba(0, 0, 0, 0.7); -} - -.navbar.is-warning .navbar-brand .navbar-link::after { - border-color: rgba(0, 0, 0, 0.7); -} - -.navbar.is-warning .navbar-burger { - color: rgba(0, 0, 0, 0.7); -} - -@media screen and (min-width: 1088px) { - .navbar.is-warning .navbar-start > .navbar-item, - .navbar.is-warning .navbar-start .navbar-link, - .navbar.is-warning .navbar-end > .navbar-item, - .navbar.is-warning .navbar-end .navbar-link { - color: rgba(0, 0, 0, 0.7); - } - .navbar.is-warning .navbar-start > a.navbar-item:hover, .navbar.is-warning .navbar-start > a.navbar-item.is-active, - .navbar.is-warning .navbar-start .navbar-link:hover, - .navbar.is-warning .navbar-start .navbar-link.is-active, - .navbar.is-warning .navbar-end > a.navbar-item:hover, - .navbar.is-warning .navbar-end > a.navbar-item.is-active, - .navbar.is-warning .navbar-end .navbar-link:hover, - .navbar.is-warning .navbar-end .navbar-link.is-active { - background-color: #ffd83d; - color: rgba(0, 0, 0, 0.7); - } - .navbar.is-warning .navbar-start .navbar-link::after, - .navbar.is-warning .navbar-end .navbar-link::after { - border-color: rgba(0, 0, 0, 0.7); - } - .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #ffd83d; - color: rgba(0, 0, 0, 0.7); - } - .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); - } -} - -.navbar.is-danger { - background-color: #ff3860; - color: #fff; -} - -.navbar.is-danger .navbar-brand > .navbar-item, -.navbar.is-danger .navbar-brand .navbar-link { - color: #fff; -} - -.navbar.is-danger .navbar-brand > a.navbar-item:hover, .navbar.is-danger .navbar-brand > a.navbar-item.is-active, -.navbar.is-danger .navbar-brand .navbar-link:hover, -.navbar.is-danger .navbar-brand .navbar-link.is-active { - background-color: #ff1f4b; - color: #fff; -} - -.navbar.is-danger .navbar-brand .navbar-link::after { - border-color: #fff; -} - -.navbar.is-danger .navbar-burger { - color: #fff; -} - -@media screen and (min-width: 1088px) { - .navbar.is-danger .navbar-start > .navbar-item, - .navbar.is-danger .navbar-start .navbar-link, - .navbar.is-danger .navbar-end > .navbar-item, - .navbar.is-danger .navbar-end .navbar-link { - color: #fff; - } - .navbar.is-danger .navbar-start > a.navbar-item:hover, .navbar.is-danger .navbar-start > a.navbar-item.is-active, - .navbar.is-danger .navbar-start .navbar-link:hover, - .navbar.is-danger .navbar-start .navbar-link.is-active, - .navbar.is-danger .navbar-end > a.navbar-item:hover, - .navbar.is-danger .navbar-end > a.navbar-item.is-active, - .navbar.is-danger .navbar-end .navbar-link:hover, - .navbar.is-danger .navbar-end .navbar-link.is-active { - background-color: #ff1f4b; - color: #fff; - } - .navbar.is-danger .navbar-start .navbar-link::after, - .navbar.is-danger .navbar-end .navbar-link::after { - border-color: #fff; - } - .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #ff1f4b; - color: #fff; - } - .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { - background-color: #ff3860; - color: #fff; - } -} - -.navbar > .container { - align-items: stretch; - display: flex; - min-height: 3.25rem; - width: 100%; -} - -.navbar.has-shadow { - box-shadow: 0 2px 0 0 whitesmoke; -} - -.navbar.is-fixed-bottom, .navbar.is-fixed-top { - left: 0; - position: fixed; - right: 0; - z-index: 30; -} - -.navbar.is-fixed-bottom { - bottom: 0; -} - -.navbar.is-fixed-bottom.has-shadow { - box-shadow: 0 -2px 0 0 whitesmoke; -} - -.navbar.is-fixed-top { - top: 0; -} - -html.has-navbar-fixed-top, -body.has-navbar-fixed-top { - padding-top: 3.25rem; -} - -html.has-navbar-fixed-bottom, -body.has-navbar-fixed-bottom { - padding-bottom: 3.25rem; -} - -.navbar-brand, -.navbar-tabs { - align-items: stretch; - display: flex; - flex-shrink: 0; - min-height: 3.25rem; -} - -.navbar-brand a.navbar-item:hover { - background-color: transparent; -} - -.navbar-tabs { - -webkit-overflow-scrolling: touch; - max-width: 100vw; - overflow-x: auto; - overflow-y: hidden; -} - -.navbar-burger { - color: #4a4a4a; - cursor: pointer; - display: block; - height: 3.25rem; - position: relative; - width: 3.25rem; - margin-left: auto; -} - -.navbar-burger span { - background-color: currentColor; - display: block; - height: 1px; - left: calc(50% - 8px); - position: absolute; - -webkit-transform-origin: center; - transform-origin: center; - transition-duration: 86ms; - transition-property: background-color, opacity, -webkit-transform; - transition-property: background-color, opacity, transform; - transition-property: background-color, opacity, transform, -webkit-transform; - transition-timing-function: ease-out; - width: 16px; -} - -.navbar-burger span:nth-child(1) { - top: calc(50% - 6px); -} - -.navbar-burger span:nth-child(2) { - top: calc(50% - 1px); -} - -.navbar-burger span:nth-child(3) { - top: calc(50% + 4px); -} - -.navbar-burger:hover { - background-color: rgba(0, 0, 0, 0.05); -} - -.navbar-burger.is-active span:nth-child(1) { - -webkit-transform: translateY(5px) rotate(45deg); - transform: translateY(5px) rotate(45deg); -} - -.navbar-burger.is-active span:nth-child(2) { - opacity: 0; -} - -.navbar-burger.is-active span:nth-child(3) { - -webkit-transform: translateY(-5px) rotate(-45deg); - transform: translateY(-5px) rotate(-45deg); -} - -.navbar-menu { - display: none; -} - -.navbar-item, -.navbar-link { - color: #4a4a4a; - display: block; - line-height: 1.5; - padding: 0.5rem 0.75rem; - position: relative; -} - -.navbar-item .icon:only-child, -.navbar-link .icon:only-child { - margin-left: -0.25rem; - margin-right: -0.25rem; -} - -a.navbar-item, -.navbar-link { - cursor: pointer; -} - -a.navbar-item:hover, a.navbar-item.is-active, -.navbar-link:hover, -.navbar-link.is-active { - background-color: #fafafa; - color: #3273dc; -} - -.navbar-item { - display: block; - flex-grow: 0; - flex-shrink: 0; -} - -.navbar-item img { - max-height: 1.75rem; -} - -.navbar-item.has-dropdown { - padding: 0; -} - -.navbar-item.is-expanded { - flex-grow: 1; - flex-shrink: 1; -} - -.navbar-item.is-tab { - border-bottom: 1px solid transparent; - min-height: 3.25rem; - padding-bottom: calc(0.5rem - 1px); -} - -.navbar-item.is-tab:hover { - background-color: transparent; - border-bottom-color: #3273dc; -} - -.navbar-item.is-tab.is-active { - background-color: transparent; - border-bottom-color: #3273dc; - border-bottom-style: solid; - border-bottom-width: 3px; - color: #3273dc; - padding-bottom: calc(0.5rem - 3px); -} - -.navbar-content { - flex-grow: 1; - flex-shrink: 1; -} - -.navbar-link:not(.is-arrowless) { - padding-right: 2.5em; -} - -.navbar-link:not(.is-arrowless)::after { - border-color: #3273dc; - margin-top: -0.375em; - right: 1.125em; -} - -.navbar-dropdown { - font-size: 0.875rem; - padding-bottom: 0.5rem; - padding-top: 0.5rem; -} - -.navbar-dropdown .navbar-item { - padding-left: 1.5rem; - padding-right: 1.5rem; -} - -.navbar-divider { - background-color: whitesmoke; - border: none; - display: none; - height: 2px; - margin: 0.5rem 0; -} - -@media screen and (max-width: 1087px) { - .navbar > .container { - display: block; - } - .navbar-brand .navbar-item, - .navbar-tabs .navbar-item { - align-items: center; - display: flex; - } - .navbar-link::after { - display: none; - } - .navbar-menu { - background-color: white; - box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); - padding: 0.5rem 0; - } - .navbar-menu.is-active { - display: block; - } - .navbar.is-fixed-bottom-touch, .navbar.is-fixed-top-touch { - left: 0; - position: fixed; - right: 0; - z-index: 30; - } - .navbar.is-fixed-bottom-touch { - bottom: 0; - } - .navbar.is-fixed-bottom-touch.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); - } - .navbar.is-fixed-top-touch { - top: 0; - } - .navbar.is-fixed-top .navbar-menu, .navbar.is-fixed-top-touch .navbar-menu { - -webkit-overflow-scrolling: touch; - max-height: calc(100vh - 3.25rem); - overflow: auto; - } - html.has-navbar-fixed-top-touch, - body.has-navbar-fixed-top-touch { - padding-top: 3.25rem; - } - html.has-navbar-fixed-bottom-touch, - body.has-navbar-fixed-bottom-touch { - padding-bottom: 3.25rem; - } -} - -@media screen and (min-width: 1088px) { - .navbar, - .navbar-menu, - .navbar-start, - .navbar-end { - align-items: stretch; - display: flex; - } - .navbar { - min-height: 3.25rem; - } - .navbar.is-spaced { - padding: 1rem 2rem; - } - .navbar.is-spaced .navbar-start, - .navbar.is-spaced .navbar-end { - align-items: center; - } - .navbar.is-spaced a.navbar-item, - .navbar.is-spaced .navbar-link { - border-radius: 4px; - } - .navbar.is-transparent a.navbar-item:hover, .navbar.is-transparent a.navbar-item.is-active, - .navbar.is-transparent .navbar-link:hover, - .navbar.is-transparent .navbar-link.is-active { - background-color: transparent !important; - } - .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { - background-color: transparent !important; - } - .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { - background-color: whitesmoke; - color: #0a0a0a; - } - .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { - background-color: whitesmoke; - color: #3273dc; - } - .navbar-burger { - display: none; - } - .navbar-item, - .navbar-link { - align-items: center; - display: flex; - } - .navbar-item { - display: flex; - } - .navbar-item.has-dropdown { - align-items: stretch; - } - .navbar-item.has-dropdown-up .navbar-link::after { - -webkit-transform: rotate(135deg) translate(0.25em, -0.25em); - transform: rotate(135deg) translate(0.25em, -0.25em); - } - .navbar-item.has-dropdown-up .navbar-dropdown { - border-bottom: 2px solid #dbdbdb; - border-radius: 6px 6px 0 0; - border-top: none; - bottom: 100%; - box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); - top: auto; - } - .navbar-item.is-active .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown { - display: block; - } - .navbar.is-spaced .navbar-item.is-active .navbar-dropdown, .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { - opacity: 1; - pointer-events: auto; - -webkit-transform: translateY(0); - transform: translateY(0); - } - .navbar-menu { - flex-grow: 1; - flex-shrink: 0; - } - .navbar-start { - justify-content: flex-start; - margin-right: auto; - } - .navbar-end { - justify-content: flex-end; - margin-left: auto; - } - .navbar-dropdown { - background-color: white; - border-bottom-left-radius: 6px; - border-bottom-right-radius: 6px; - border-top: 2px solid #dbdbdb; - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); - display: none; - font-size: 0.875rem; - left: 0; - min-width: 100%; - position: absolute; - top: 100%; - z-index: 20; - } - .navbar-dropdown .navbar-item { - padding: 0.375rem 1rem; - white-space: nowrap; - } - .navbar-dropdown a.navbar-item { - padding-right: 3rem; - } - .navbar-dropdown a.navbar-item:hover { - background-color: whitesmoke; - color: #0a0a0a; - } - .navbar-dropdown a.navbar-item.is-active { - background-color: whitesmoke; - color: #3273dc; - } - .navbar.is-spaced .navbar-dropdown, .navbar-dropdown.is-boxed { - border-radius: 6px; - border-top: none; - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - display: block; - opacity: 0; - pointer-events: none; - top: calc(100% + (-4px)); - -webkit-transform: translateY(-5px); - transform: translateY(-5px); - transition-duration: 86ms; - transition-property: opacity, -webkit-transform; - transition-property: opacity, transform; - transition-property: opacity, transform, -webkit-transform; - } - .navbar-dropdown.is-right { - left: auto; - right: 0; - } - .navbar-divider { - display: block; - } - .navbar > .container .navbar-brand, - .container > .navbar .navbar-brand { - margin-left: -.75rem; - } - .navbar > .container .navbar-menu, - .container > .navbar .navbar-menu { - margin-right: -.75rem; - } - .navbar.is-fixed-bottom-desktop, .navbar.is-fixed-top-desktop { - left: 0; - position: fixed; - right: 0; - z-index: 30; - } - .navbar.is-fixed-bottom-desktop { - bottom: 0; - } - .navbar.is-fixed-bottom-desktop.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); - } - .navbar.is-fixed-top-desktop { - top: 0; - } - html.has-navbar-fixed-top-desktop, - body.has-navbar-fixed-top-desktop { - padding-top: 3.25rem; - } - html.has-navbar-fixed-bottom-desktop, - body.has-navbar-fixed-bottom-desktop { - padding-bottom: 3.25rem; - } - html.has-spaced-navbar-fixed-top, - body.has-spaced-navbar-fixed-top { - padding-top: 5.25rem; - } - html.has-spaced-navbar-fixed-bottom, - body.has-spaced-navbar-fixed-bottom { - padding-bottom: 5.25rem; - } - a.navbar-item.is-active, - .navbar-link.is-active { - color: #0a0a0a; - } - a.navbar-item.is-active:not(:hover), - .navbar-link.is-active:not(:hover) { - background-color: transparent; - } - .navbar-item.has-dropdown:hover .navbar-link, .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #fafafa; - } -} - -.hero.is-fullheight-with-navbar { - min-height: calc(100vh - 3.25rem); -} - -.pagination { - font-size: 1rem; - margin: -0.25rem; -} - -.pagination.is-small { - font-size: 0.75rem; -} - -.pagination.is-medium { - font-size: 1.25rem; -} - -.pagination.is-large { - font-size: 1.5rem; -} - -.pagination.is-rounded .pagination-previous, -.pagination.is-rounded .pagination-next { - padding-left: 1em; - padding-right: 1em; - border-radius: 290486px; -} - -.pagination.is-rounded .pagination-link { - border-radius: 290486px; -} - -.pagination, -.pagination-list { - align-items: center; - display: flex; - justify-content: center; - text-align: center; -} - -.pagination-previous, -.pagination-next, -.pagination-link, -.pagination-ellipsis { - font-size: 1em; - padding-left: 0.5em; - padding-right: 0.5em; - justify-content: center; - margin: 0.25rem; - text-align: center; -} - -.pagination-previous, -.pagination-next, -.pagination-link { - border-color: #dbdbdb; - color: #363636; - min-width: 2.25em; -} - -.pagination-previous:hover, -.pagination-next:hover, -.pagination-link:hover { - border-color: #b5b5b5; - color: #363636; -} - -.pagination-previous:focus, -.pagination-next:focus, -.pagination-link:focus { - border-color: #3273dc; -} - -.pagination-previous:active, -.pagination-next:active, -.pagination-link:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); -} - -.pagination-previous[disabled], -.pagination-next[disabled], -.pagination-link[disabled] { - background-color: #dbdbdb; - border-color: #dbdbdb; - box-shadow: none; - color: #7a7a7a; - opacity: 0.5; -} - -.pagination-previous, -.pagination-next { - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; -} - -.pagination-link.is-current { - background-color: #3273dc; - border-color: #3273dc; - color: #fff; -} - -.pagination-ellipsis { - color: #b5b5b5; - pointer-events: none; -} - -.pagination-list { - flex-wrap: wrap; -} - -@media screen and (max-width: 768px) { - .pagination { - flex-wrap: wrap; - } - .pagination-previous, - .pagination-next { - flex-grow: 1; - flex-shrink: 1; - } - .pagination-list li { - flex-grow: 1; - flex-shrink: 1; - } -} - -@media screen and (min-width: 769px), print { - .pagination-list { - flex-grow: 1; - flex-shrink: 1; - justify-content: flex-start; - order: 1; - } - .pagination-previous { - order: 2; - } - .pagination-next { - order: 3; - } - .pagination { - justify-content: space-between; - } - .pagination.is-centered .pagination-previous { - order: 1; - } - .pagination.is-centered .pagination-list { - justify-content: center; - order: 2; - } - .pagination.is-centered .pagination-next { - order: 3; - } - .pagination.is-right .pagination-previous { - order: 1; - } - .pagination.is-right .pagination-next { - order: 2; - } - .pagination.is-right .pagination-list { - justify-content: flex-end; - order: 3; - } -} - -.panel { - font-size: 1rem; -} - -.panel:not(:last-child) { - margin-bottom: 1.5rem; -} - -.panel-heading, -.panel-tabs, -.panel-block { - border-bottom: 1px solid #dbdbdb; - border-left: 1px solid #dbdbdb; - border-right: 1px solid #dbdbdb; -} - -.panel-heading:first-child, -.panel-tabs:first-child, -.panel-block:first-child { - border-top: 1px solid #dbdbdb; -} - -.panel-heading { - background-color: whitesmoke; - border-radius: 4px 4px 0 0; - color: #363636; - font-size: 1.25em; - font-weight: 300; - line-height: 1.25; - padding: 0.5em 0.75em; -} - -.panel-tabs { - align-items: flex-end; - display: flex; - font-size: 0.875em; - justify-content: center; -} - -.panel-tabs a { - border-bottom: 1px solid #dbdbdb; - margin-bottom: -1px; - padding: 0.5em; -} - -.panel-tabs a.is-active { - border-bottom-color: #4a4a4a; - color: #363636; -} - -.panel-list a { - color: #4a4a4a; -} - -.panel-list a:hover { - color: #3273dc; -} - -.panel-block { - align-items: center; - color: #363636; - display: flex; - justify-content: flex-start; - padding: 0.5em 0.75em; -} - -.panel-block input[type="checkbox"] { - margin-right: 0.75em; -} - -.panel-block > .control { - flex-grow: 1; - flex-shrink: 1; - width: 100%; -} - -.panel-block.is-wrapped { - flex-wrap: wrap; -} - -.panel-block.is-active { - border-left-color: #3273dc; - color: #363636; -} - -.panel-block.is-active .panel-icon { - color: #3273dc; -} - -a.panel-block, -label.panel-block { - cursor: pointer; -} - -a.panel-block:hover, -label.panel-block:hover { - background-color: whitesmoke; -} - -.panel-icon { - display: inline-block; - font-size: 14px; - height: 1em; - line-height: 1em; - text-align: center; - vertical-align: top; - width: 1em; - color: #7a7a7a; - margin-right: 0.75em; -} - -.panel-icon .fa { - font-size: inherit; - line-height: inherit; -} - -.tabs { - -webkit-overflow-scrolling: touch; - align-items: stretch; - display: flex; - font-size: 1rem; - justify-content: space-between; - overflow: hidden; - overflow-x: auto; - white-space: nowrap; -} - -.tabs a { - align-items: center; - border-bottom-color: #dbdbdb; - border-bottom-style: solid; - border-bottom-width: 1px; - color: #4a4a4a; - display: flex; - justify-content: center; - margin-bottom: -1px; - padding: 0.5em 1em; - vertical-align: top; -} - -.tabs a:hover { - border-bottom-color: #363636; - color: #363636; -} - -.tabs li { - display: block; -} - -.tabs li.is-active a { - border-bottom-color: #3273dc; - color: #3273dc; -} - -.tabs ul { - align-items: center; - border-bottom-color: #dbdbdb; - border-bottom-style: solid; - border-bottom-width: 1px; - display: flex; - flex-grow: 1; - flex-shrink: 0; - justify-content: flex-start; -} - -.tabs ul.is-left { - padding-right: 0.75em; -} - -.tabs ul.is-center { - flex: none; - justify-content: center; - padding-left: 0.75em; - padding-right: 0.75em; -} - -.tabs ul.is-right { - justify-content: flex-end; - padding-left: 0.75em; -} - -.tabs .icon:first-child { - margin-right: 0.5em; -} - -.tabs .icon:last-child { - margin-left: 0.5em; -} - -.tabs.is-centered ul { - justify-content: center; -} - -.tabs.is-right ul { - justify-content: flex-end; -} - -.tabs.is-boxed a { - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} - -.tabs.is-boxed a:hover { - background-color: whitesmoke; - border-bottom-color: #dbdbdb; -} - -.tabs.is-boxed li.is-active a { - background-color: white; - border-color: #dbdbdb; - border-bottom-color: transparent !important; -} - -.tabs.is-fullwidth li { - flex-grow: 1; - flex-shrink: 0; -} - -.tabs.is-toggle a { - border-color: #dbdbdb; - border-style: solid; - border-width: 1px; - margin-bottom: 0; - position: relative; -} - -.tabs.is-toggle a:hover { - background-color: whitesmoke; - border-color: #b5b5b5; - z-index: 2; -} - -.tabs.is-toggle li + li { - margin-left: -1px; -} - -.tabs.is-toggle li:first-child a { - border-radius: 4px 0 0 4px; -} - -.tabs.is-toggle li:last-child a { - border-radius: 0 4px 4px 0; -} - -.tabs.is-toggle li.is-active a { - background-color: #3273dc; - border-color: #3273dc; - color: #fff; - z-index: 1; -} - -.tabs.is-toggle ul { - border-bottom: none; -} - -.tabs.is-toggle.is-toggle-rounded li:first-child a { - border-bottom-left-radius: 290486px; - border-top-left-radius: 290486px; - padding-left: 1.25em; -} - -.tabs.is-toggle.is-toggle-rounded li:last-child a { - border-bottom-right-radius: 290486px; - border-top-right-radius: 290486px; - padding-right: 1.25em; -} - -.tabs.is-small { - font-size: 0.75rem; -} - -.tabs.is-medium { - font-size: 1.25rem; -} - -.tabs.is-large { - font-size: 1.5rem; -} - -.column { - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - padding: 0.75rem; -} - -.columns.is-mobile > .column.is-narrow { - flex: none; -} - -.columns.is-mobile > .column.is-full { - flex: none; - width: 100%; -} - -.columns.is-mobile > .column.is-three-quarters { - flex: none; - width: 75%; -} - -.columns.is-mobile > .column.is-two-thirds { - flex: none; - width: 66.6666%; -} - -.columns.is-mobile > .column.is-half { - flex: none; - width: 50%; -} - -.columns.is-mobile > .column.is-one-third { - flex: none; - width: 33.3333%; -} - -.columns.is-mobile > .column.is-one-quarter { - flex: none; - width: 25%; -} - -.columns.is-mobile > .column.is-one-fifth { - flex: none; - width: 20%; -} - -.columns.is-mobile > .column.is-two-fifths { - flex: none; - width: 40%; -} - -.columns.is-mobile > .column.is-three-fifths { - flex: none; - width: 60%; -} - -.columns.is-mobile > .column.is-four-fifths { - flex: none; - width: 80%; -} - -.columns.is-mobile > .column.is-offset-three-quarters { - margin-left: 75%; -} - -.columns.is-mobile > .column.is-offset-two-thirds { - margin-left: 66.6666%; -} - -.columns.is-mobile > .column.is-offset-half { - margin-left: 50%; -} - -.columns.is-mobile > .column.is-offset-one-third { - margin-left: 33.3333%; -} - -.columns.is-mobile > .column.is-offset-one-quarter { - margin-left: 25%; -} - -.columns.is-mobile > .column.is-offset-one-fifth { - margin-left: 20%; -} - -.columns.is-mobile > .column.is-offset-two-fifths { - margin-left: 40%; -} - -.columns.is-mobile > .column.is-offset-three-fifths { - margin-left: 60%; -} - -.columns.is-mobile > .column.is-offset-four-fifths { - margin-left: 80%; -} - -.columns.is-mobile > .column.is-1 { - flex: none; - width: 8.33333%; -} - -.columns.is-mobile > .column.is-offset-1 { - margin-left: 8.33333%; -} - -.columns.is-mobile > .column.is-2 { - flex: none; - width: 16.66667%; -} - -.columns.is-mobile > .column.is-offset-2 { - margin-left: 16.66667%; -} - -.columns.is-mobile > .column.is-3 { - flex: none; - width: 25%; -} - -.columns.is-mobile > .column.is-offset-3 { - margin-left: 25%; -} - -.columns.is-mobile > .column.is-4 { - flex: none; - width: 33.33333%; -} - -.columns.is-mobile > .column.is-offset-4 { - margin-left: 33.33333%; -} - -.columns.is-mobile > .column.is-5 { - flex: none; - width: 41.66667%; -} - -.columns.is-mobile > .column.is-offset-5 { - margin-left: 41.66667%; -} - -.columns.is-mobile > .column.is-6 { - flex: none; - width: 50%; -} - -.columns.is-mobile > .column.is-offset-6 { - margin-left: 50%; -} - -.columns.is-mobile > .column.is-7 { - flex: none; - width: 58.33333%; -} - -.columns.is-mobile > .column.is-offset-7 { - margin-left: 58.33333%; -} - -.columns.is-mobile > .column.is-8 { - flex: none; - width: 66.66667%; -} - -.columns.is-mobile > .column.is-offset-8 { - margin-left: 66.66667%; -} - -.columns.is-mobile > .column.is-9 { - flex: none; - width: 75%; -} - -.columns.is-mobile > .column.is-offset-9 { - margin-left: 75%; -} - -.columns.is-mobile > .column.is-10 { - flex: none; - width: 83.33333%; -} - -.columns.is-mobile > .column.is-offset-10 { - margin-left: 83.33333%; -} - -.columns.is-mobile > .column.is-11 { - flex: none; - width: 91.66667%; -} - -.columns.is-mobile > .column.is-offset-11 { - margin-left: 91.66667%; -} - -.columns.is-mobile > .column.is-12 { - flex: none; - width: 100%; -} - -.columns.is-mobile > .column.is-offset-12 { - margin-left: 100%; -} - -@media screen and (max-width: 768px) { - .column.is-narrow-mobile { - flex: none; - } - .column.is-full-mobile { - flex: none; - width: 100%; - } - .column.is-three-quarters-mobile { - flex: none; - width: 75%; - } - .column.is-two-thirds-mobile { - flex: none; - width: 66.6666%; - } - .column.is-half-mobile { - flex: none; - width: 50%; - } - .column.is-one-third-mobile { - flex: none; - width: 33.3333%; - } - .column.is-one-quarter-mobile { - flex: none; - width: 25%; - } - .column.is-one-fifth-mobile { - flex: none; - width: 20%; - } - .column.is-two-fifths-mobile { - flex: none; - width: 40%; - } - .column.is-three-fifths-mobile { - flex: none; - width: 60%; - } - .column.is-four-fifths-mobile { - flex: none; - width: 80%; - } - .column.is-offset-three-quarters-mobile { - margin-left: 75%; - } - .column.is-offset-two-thirds-mobile { - margin-left: 66.6666%; - } - .column.is-offset-half-mobile { - margin-left: 50%; - } - .column.is-offset-one-third-mobile { - margin-left: 33.3333%; - } - .column.is-offset-one-quarter-mobile { - margin-left: 25%; - } - .column.is-offset-one-fifth-mobile { - margin-left: 20%; - } - .column.is-offset-two-fifths-mobile { - margin-left: 40%; - } - .column.is-offset-three-fifths-mobile { - margin-left: 60%; - } - .column.is-offset-four-fifths-mobile { - margin-left: 80%; - } - .column.is-1-mobile { - flex: none; - width: 8.33333%; - } - .column.is-offset-1-mobile { - margin-left: 8.33333%; - } - .column.is-2-mobile { - flex: none; - width: 16.66667%; - } - .column.is-offset-2-mobile { - margin-left: 16.66667%; - } - .column.is-3-mobile { - flex: none; - width: 25%; - } - .column.is-offset-3-mobile { - margin-left: 25%; - } - .column.is-4-mobile { - flex: none; - width: 33.33333%; - } - .column.is-offset-4-mobile { - margin-left: 33.33333%; - } - .column.is-5-mobile { - flex: none; - width: 41.66667%; - } - .column.is-offset-5-mobile { - margin-left: 41.66667%; - } - .column.is-6-mobile { - flex: none; - width: 50%; - } - .column.is-offset-6-mobile { - margin-left: 50%; - } - .column.is-7-mobile { - flex: none; - width: 58.33333%; - } - .column.is-offset-7-mobile { - margin-left: 58.33333%; - } - .column.is-8-mobile { - flex: none; - width: 66.66667%; - } - .column.is-offset-8-mobile { - margin-left: 66.66667%; - } - .column.is-9-mobile { - flex: none; - width: 75%; - } - .column.is-offset-9-mobile { - margin-left: 75%; - } - .column.is-10-mobile { - flex: none; - width: 83.33333%; - } - .column.is-offset-10-mobile { - margin-left: 83.33333%; - } - .column.is-11-mobile { - flex: none; - width: 91.66667%; - } - .column.is-offset-11-mobile { - margin-left: 91.66667%; - } - .column.is-12-mobile { - flex: none; - width: 100%; - } - .column.is-offset-12-mobile { - margin-left: 100%; - } -} - -@media screen and (min-width: 769px), print { - .column.is-narrow, .column.is-narrow-tablet { - flex: none; - } - .column.is-full, .column.is-full-tablet { - flex: none; - width: 100%; - } - .column.is-three-quarters, .column.is-three-quarters-tablet { - flex: none; - width: 75%; - } - .column.is-two-thirds, .column.is-two-thirds-tablet { - flex: none; - width: 66.6666%; - } - .column.is-half, .column.is-half-tablet { - flex: none; - width: 50%; - } - .column.is-one-third, .column.is-one-third-tablet { - flex: none; - width: 33.3333%; - } - .column.is-one-quarter, .column.is-one-quarter-tablet { - flex: none; - width: 25%; - } - .column.is-one-fifth, .column.is-one-fifth-tablet { - flex: none; - width: 20%; - } - .column.is-two-fifths, .column.is-two-fifths-tablet { - flex: none; - width: 40%; - } - .column.is-three-fifths, .column.is-three-fifths-tablet { - flex: none; - width: 60%; - } - .column.is-four-fifths, .column.is-four-fifths-tablet { - flex: none; - width: 80%; - } - .column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet { - margin-left: 75%; - } - .column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet { - margin-left: 66.6666%; - } - .column.is-offset-half, .column.is-offset-half-tablet { - margin-left: 50%; - } - .column.is-offset-one-third, .column.is-offset-one-third-tablet { - margin-left: 33.3333%; - } - .column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet { - margin-left: 25%; - } - .column.is-offset-one-fifth, .column.is-offset-one-fifth-tablet { - margin-left: 20%; - } - .column.is-offset-two-fifths, .column.is-offset-two-fifths-tablet { - margin-left: 40%; - } - .column.is-offset-three-fifths, .column.is-offset-three-fifths-tablet { - margin-left: 60%; - } - .column.is-offset-four-fifths, .column.is-offset-four-fifths-tablet { - margin-left: 80%; - } - .column.is-1, .column.is-1-tablet { - flex: none; - width: 8.33333%; - } - .column.is-offset-1, .column.is-offset-1-tablet { - margin-left: 8.33333%; - } - .column.is-2, .column.is-2-tablet { - flex: none; - width: 16.66667%; - } - .column.is-offset-2, .column.is-offset-2-tablet { - margin-left: 16.66667%; - } - .column.is-3, .column.is-3-tablet { - flex: none; - width: 25%; - } - .column.is-offset-3, .column.is-offset-3-tablet { - margin-left: 25%; - } - .column.is-4, .column.is-4-tablet { - flex: none; - width: 33.33333%; - } - .column.is-offset-4, .column.is-offset-4-tablet { - margin-left: 33.33333%; - } - .column.is-5, .column.is-5-tablet { - flex: none; - width: 41.66667%; - } - .column.is-offset-5, .column.is-offset-5-tablet { - margin-left: 41.66667%; - } - .column.is-6, .column.is-6-tablet { - flex: none; - width: 50%; - } - .column.is-offset-6, .column.is-offset-6-tablet { - margin-left: 50%; - } - .column.is-7, .column.is-7-tablet { - flex: none; - width: 58.33333%; - } - .column.is-offset-7, .column.is-offset-7-tablet { - margin-left: 58.33333%; - } - .column.is-8, .column.is-8-tablet { - flex: none; - width: 66.66667%; - } - .column.is-offset-8, .column.is-offset-8-tablet { - margin-left: 66.66667%; - } - .column.is-9, .column.is-9-tablet { - flex: none; - width: 75%; - } - .column.is-offset-9, .column.is-offset-9-tablet { - margin-left: 75%; - } - .column.is-10, .column.is-10-tablet { - flex: none; - width: 83.33333%; - } - .column.is-offset-10, .column.is-offset-10-tablet { - margin-left: 83.33333%; - } - .column.is-11, .column.is-11-tablet { - flex: none; - width: 91.66667%; - } - .column.is-offset-11, .column.is-offset-11-tablet { - margin-left: 91.66667%; - } - .column.is-12, .column.is-12-tablet { - flex: none; - width: 100%; - } - .column.is-offset-12, .column.is-offset-12-tablet { - margin-left: 100%; - } -} - -@media screen and (max-width: 1087px) { - .column.is-narrow-touch { - flex: none; - } - .column.is-full-touch { - flex: none; - width: 100%; - } - .column.is-three-quarters-touch { - flex: none; - width: 75%; - } - .column.is-two-thirds-touch { - flex: none; - width: 66.6666%; - } - .column.is-half-touch { - flex: none; - width: 50%; - } - .column.is-one-third-touch { - flex: none; - width: 33.3333%; - } - .column.is-one-quarter-touch { - flex: none; - width: 25%; - } - .column.is-one-fifth-touch { - flex: none; - width: 20%; - } - .column.is-two-fifths-touch { - flex: none; - width: 40%; - } - .column.is-three-fifths-touch { - flex: none; - width: 60%; - } - .column.is-four-fifths-touch { - flex: none; - width: 80%; - } - .column.is-offset-three-quarters-touch { - margin-left: 75%; - } - .column.is-offset-two-thirds-touch { - margin-left: 66.6666%; - } - .column.is-offset-half-touch { - margin-left: 50%; - } - .column.is-offset-one-third-touch { - margin-left: 33.3333%; - } - .column.is-offset-one-quarter-touch { - margin-left: 25%; - } - .column.is-offset-one-fifth-touch { - margin-left: 20%; - } - .column.is-offset-two-fifths-touch { - margin-left: 40%; - } - .column.is-offset-three-fifths-touch { - margin-left: 60%; - } - .column.is-offset-four-fifths-touch { - margin-left: 80%; - } - .column.is-1-touch { - flex: none; - width: 8.33333%; - } - .column.is-offset-1-touch { - margin-left: 8.33333%; - } - .column.is-2-touch { - flex: none; - width: 16.66667%; - } - .column.is-offset-2-touch { - margin-left: 16.66667%; - } - .column.is-3-touch { - flex: none; - width: 25%; - } - .column.is-offset-3-touch { - margin-left: 25%; - } - .column.is-4-touch { - flex: none; - width: 33.33333%; - } - .column.is-offset-4-touch { - margin-left: 33.33333%; - } - .column.is-5-touch { - flex: none; - width: 41.66667%; - } - .column.is-offset-5-touch { - margin-left: 41.66667%; - } - .column.is-6-touch { - flex: none; - width: 50%; - } - .column.is-offset-6-touch { - margin-left: 50%; - } - .column.is-7-touch { - flex: none; - width: 58.33333%; - } - .column.is-offset-7-touch { - margin-left: 58.33333%; - } - .column.is-8-touch { - flex: none; - width: 66.66667%; - } - .column.is-offset-8-touch { - margin-left: 66.66667%; - } - .column.is-9-touch { - flex: none; - width: 75%; - } - .column.is-offset-9-touch { - margin-left: 75%; - } - .column.is-10-touch { - flex: none; - width: 83.33333%; - } - .column.is-offset-10-touch { - margin-left: 83.33333%; - } - .column.is-11-touch { - flex: none; - width: 91.66667%; - } - .column.is-offset-11-touch { - margin-left: 91.66667%; - } - .column.is-12-touch { - flex: none; - width: 100%; - } - .column.is-offset-12-touch { - margin-left: 100%; - } -} - -@media screen and (min-width: 1088px) { - .column.is-narrow-desktop { - flex: none; - } - .column.is-full-desktop { - flex: none; - width: 100%; - } - .column.is-three-quarters-desktop { - flex: none; - width: 75%; - } - .column.is-two-thirds-desktop { - flex: none; - width: 66.6666%; - } - .column.is-half-desktop { - flex: none; - width: 50%; - } - .column.is-one-third-desktop { - flex: none; - width: 33.3333%; - } - .column.is-one-quarter-desktop { - flex: none; - width: 25%; - } - .column.is-one-fifth-desktop { - flex: none; - width: 20%; - } - .column.is-two-fifths-desktop { - flex: none; - width: 40%; - } - .column.is-three-fifths-desktop { - flex: none; - width: 60%; - } - .column.is-four-fifths-desktop { - flex: none; - width: 80%; - } - .column.is-offset-three-quarters-desktop { - margin-left: 75%; - } - .column.is-offset-two-thirds-desktop { - margin-left: 66.6666%; - } - .column.is-offset-half-desktop { - margin-left: 50%; - } - .column.is-offset-one-third-desktop { - margin-left: 33.3333%; - } - .column.is-offset-one-quarter-desktop { - margin-left: 25%; - } - .column.is-offset-one-fifth-desktop { - margin-left: 20%; - } - .column.is-offset-two-fifths-desktop { - margin-left: 40%; - } - .column.is-offset-three-fifths-desktop { - margin-left: 60%; - } - .column.is-offset-four-fifths-desktop { - margin-left: 80%; - } - .column.is-1-desktop { - flex: none; - width: 8.33333%; - } - .column.is-offset-1-desktop { - margin-left: 8.33333%; - } - .column.is-2-desktop { - flex: none; - width: 16.66667%; - } - .column.is-offset-2-desktop { - margin-left: 16.66667%; - } - .column.is-3-desktop { - flex: none; - width: 25%; - } - .column.is-offset-3-desktop { - margin-left: 25%; - } - .column.is-4-desktop { - flex: none; - width: 33.33333%; - } - .column.is-offset-4-desktop { - margin-left: 33.33333%; - } - .column.is-5-desktop { - flex: none; - width: 41.66667%; - } - .column.is-offset-5-desktop { - margin-left: 41.66667%; - } - .column.is-6-desktop { - flex: none; - width: 50%; - } - .column.is-offset-6-desktop { - margin-left: 50%; - } - .column.is-7-desktop { - flex: none; - width: 58.33333%; - } - .column.is-offset-7-desktop { - margin-left: 58.33333%; - } - .column.is-8-desktop { - flex: none; - width: 66.66667%; - } - .column.is-offset-8-desktop { - margin-left: 66.66667%; - } - .column.is-9-desktop { - flex: none; - width: 75%; - } - .column.is-offset-9-desktop { - margin-left: 75%; - } - .column.is-10-desktop { - flex: none; - width: 83.33333%; - } - .column.is-offset-10-desktop { - margin-left: 83.33333%; - } - .column.is-11-desktop { - flex: none; - width: 91.66667%; - } - .column.is-offset-11-desktop { - margin-left: 91.66667%; - } - .column.is-12-desktop { - flex: none; - width: 100%; - } - .column.is-offset-12-desktop { - margin-left: 100%; - } -} - -@media screen and (min-width: 1280px) { - .column.is-narrow-widescreen { - flex: none; - } - .column.is-full-widescreen { - flex: none; - width: 100%; - } - .column.is-three-quarters-widescreen { - flex: none; - width: 75%; - } - .column.is-two-thirds-widescreen { - flex: none; - width: 66.6666%; - } - .column.is-half-widescreen { - flex: none; - width: 50%; - } - .column.is-one-third-widescreen { - flex: none; - width: 33.3333%; - } - .column.is-one-quarter-widescreen { - flex: none; - width: 25%; - } - .column.is-one-fifth-widescreen { - flex: none; - width: 20%; - } - .column.is-two-fifths-widescreen { - flex: none; - width: 40%; - } - .column.is-three-fifths-widescreen { - flex: none; - width: 60%; - } - .column.is-four-fifths-widescreen { - flex: none; - width: 80%; - } - .column.is-offset-three-quarters-widescreen { - margin-left: 75%; - } - .column.is-offset-two-thirds-widescreen { - margin-left: 66.6666%; - } - .column.is-offset-half-widescreen { - margin-left: 50%; - } - .column.is-offset-one-third-widescreen { - margin-left: 33.3333%; - } - .column.is-offset-one-quarter-widescreen { - margin-left: 25%; - } - .column.is-offset-one-fifth-widescreen { - margin-left: 20%; - } - .column.is-offset-two-fifths-widescreen { - margin-left: 40%; - } - .column.is-offset-three-fifths-widescreen { - margin-left: 60%; - } - .column.is-offset-four-fifths-widescreen { - margin-left: 80%; - } - .column.is-1-widescreen { - flex: none; - width: 8.33333%; - } - .column.is-offset-1-widescreen { - margin-left: 8.33333%; - } - .column.is-2-widescreen { - flex: none; - width: 16.66667%; - } - .column.is-offset-2-widescreen { - margin-left: 16.66667%; - } - .column.is-3-widescreen { - flex: none; - width: 25%; - } - .column.is-offset-3-widescreen { - margin-left: 25%; - } - .column.is-4-widescreen { - flex: none; - width: 33.33333%; - } - .column.is-offset-4-widescreen { - margin-left: 33.33333%; - } - .column.is-5-widescreen { - flex: none; - width: 41.66667%; - } - .column.is-offset-5-widescreen { - margin-left: 41.66667%; - } - .column.is-6-widescreen { - flex: none; - width: 50%; - } - .column.is-offset-6-widescreen { - margin-left: 50%; - } - .column.is-7-widescreen { - flex: none; - width: 58.33333%; - } - .column.is-offset-7-widescreen { - margin-left: 58.33333%; - } - .column.is-8-widescreen { - flex: none; - width: 66.66667%; - } - .column.is-offset-8-widescreen { - margin-left: 66.66667%; - } - .column.is-9-widescreen { - flex: none; - width: 75%; - } - .column.is-offset-9-widescreen { - margin-left: 75%; - } - .column.is-10-widescreen { - flex: none; - width: 83.33333%; - } - .column.is-offset-10-widescreen { - margin-left: 83.33333%; - } - .column.is-11-widescreen { - flex: none; - width: 91.66667%; - } - .column.is-offset-11-widescreen { - margin-left: 91.66667%; - } - .column.is-12-widescreen { - flex: none; - width: 100%; - } - .column.is-offset-12-widescreen { - margin-left: 100%; - } -} - -@media screen and (min-width: 1472px) { - .column.is-narrow-fullhd { - flex: none; - } - .column.is-full-fullhd { - flex: none; - width: 100%; - } - .column.is-three-quarters-fullhd { - flex: none; - width: 75%; - } - .column.is-two-thirds-fullhd { - flex: none; - width: 66.6666%; - } - .column.is-half-fullhd { - flex: none; - width: 50%; - } - .column.is-one-third-fullhd { - flex: none; - width: 33.3333%; - } - .column.is-one-quarter-fullhd { - flex: none; - width: 25%; - } - .column.is-one-fifth-fullhd { - flex: none; - width: 20%; - } - .column.is-two-fifths-fullhd { - flex: none; - width: 40%; - } - .column.is-three-fifths-fullhd { - flex: none; - width: 60%; - } - .column.is-four-fifths-fullhd { - flex: none; - width: 80%; - } - .column.is-offset-three-quarters-fullhd { - margin-left: 75%; - } - .column.is-offset-two-thirds-fullhd { - margin-left: 66.6666%; - } - .column.is-offset-half-fullhd { - margin-left: 50%; - } - .column.is-offset-one-third-fullhd { - margin-left: 33.3333%; - } - .column.is-offset-one-quarter-fullhd { - margin-left: 25%; - } - .column.is-offset-one-fifth-fullhd { - margin-left: 20%; - } - .column.is-offset-two-fifths-fullhd { - margin-left: 40%; - } - .column.is-offset-three-fifths-fullhd { - margin-left: 60%; - } - .column.is-offset-four-fifths-fullhd { - margin-left: 80%; - } - .column.is-1-fullhd { - flex: none; - width: 8.33333%; - } - .column.is-offset-1-fullhd { - margin-left: 8.33333%; - } - .column.is-2-fullhd { - flex: none; - width: 16.66667%; - } - .column.is-offset-2-fullhd { - margin-left: 16.66667%; - } - .column.is-3-fullhd { - flex: none; - width: 25%; - } - .column.is-offset-3-fullhd { - margin-left: 25%; - } - .column.is-4-fullhd { - flex: none; - width: 33.33333%; - } - .column.is-offset-4-fullhd { - margin-left: 33.33333%; - } - .column.is-5-fullhd { - flex: none; - width: 41.66667%; - } - .column.is-offset-5-fullhd { - margin-left: 41.66667%; - } - .column.is-6-fullhd { - flex: none; - width: 50%; - } - .column.is-offset-6-fullhd { - margin-left: 50%; - } - .column.is-7-fullhd { - flex: none; - width: 58.33333%; - } - .column.is-offset-7-fullhd { - margin-left: 58.33333%; - } - .column.is-8-fullhd { - flex: none; - width: 66.66667%; - } - .column.is-offset-8-fullhd { - margin-left: 66.66667%; - } - .column.is-9-fullhd { - flex: none; - width: 75%; - } - .column.is-offset-9-fullhd { - margin-left: 75%; - } - .column.is-10-fullhd { - flex: none; - width: 83.33333%; - } - .column.is-offset-10-fullhd { - margin-left: 83.33333%; - } - .column.is-11-fullhd { - flex: none; - width: 91.66667%; - } - .column.is-offset-11-fullhd { - margin-left: 91.66667%; - } - .column.is-12-fullhd { - flex: none; - width: 100%; - } - .column.is-offset-12-fullhd { - margin-left: 100%; - } -} - -.columns { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; -} - -.columns:last-child { - margin-bottom: -0.75rem; -} - -.columns:not(:last-child) { - margin-bottom: calc(1.5rem - 0.75rem); -} - -.columns.is-centered { - justify-content: center; -} - -.columns.is-gapless { - margin-left: 0; - margin-right: 0; - margin-top: 0; -} - -.columns.is-gapless > .column { - margin: 0; - padding: 0 !important; -} - -.columns.is-gapless:not(:last-child) { - margin-bottom: 1.5rem; -} - -.columns.is-gapless:last-child { - margin-bottom: 0; -} - -.columns.is-mobile { - display: flex; -} - -.columns.is-multiline { - flex-wrap: wrap; -} - -.columns.is-vcentered { - align-items: center; -} - -@media screen and (min-width: 769px), print { - .columns:not(.is-desktop) { - display: flex; - } -} - -@media screen and (min-width: 1088px) { - .columns.is-desktop { - display: flex; - } -} - -.columns.is-variable { - --columnGap: 0.75rem; - margin-left: calc(-1 * var(--columnGap)); - margin-right: calc(-1 * var(--columnGap)); -} - -.columns.is-variable .column { - padding-left: var(--columnGap); - padding-right: var(--columnGap); -} - -.columns.is-variable.is-0 { - --columnGap: 0rem; -} - -@media screen and (max-width: 768px) { - .columns.is-variable.is-0-mobile { - --columnGap: 0rem; - } -} - -@media screen and (min-width: 769px), print { - .columns.is-variable.is-0-tablet { - --columnGap: 0rem; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .columns.is-variable.is-0-tablet-only { - --columnGap: 0rem; - } -} - -@media screen and (max-width: 1087px) { - .columns.is-variable.is-0-touch { - --columnGap: 0rem; - } -} - -@media screen and (min-width: 1088px) { - .columns.is-variable.is-0-desktop { - --columnGap: 0rem; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .columns.is-variable.is-0-desktop-only { - --columnGap: 0rem; - } -} - -@media screen and (min-width: 1280px) { - .columns.is-variable.is-0-widescreen { - --columnGap: 0rem; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .columns.is-variable.is-0-widescreen-only { - --columnGap: 0rem; - } -} - -@media screen and (min-width: 1472px) { - .columns.is-variable.is-0-fullhd { - --columnGap: 0rem; - } -} - -.columns.is-variable.is-1 { - --columnGap: 0.25rem; -} - -@media screen and (max-width: 768px) { - .columns.is-variable.is-1-mobile { - --columnGap: 0.25rem; - } -} - -@media screen and (min-width: 769px), print { - .columns.is-variable.is-1-tablet { - --columnGap: 0.25rem; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .columns.is-variable.is-1-tablet-only { - --columnGap: 0.25rem; - } -} - -@media screen and (max-width: 1087px) { - .columns.is-variable.is-1-touch { - --columnGap: 0.25rem; - } -} - -@media screen and (min-width: 1088px) { - .columns.is-variable.is-1-desktop { - --columnGap: 0.25rem; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .columns.is-variable.is-1-desktop-only { - --columnGap: 0.25rem; - } -} - -@media screen and (min-width: 1280px) { - .columns.is-variable.is-1-widescreen { - --columnGap: 0.25rem; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .columns.is-variable.is-1-widescreen-only { - --columnGap: 0.25rem; - } -} - -@media screen and (min-width: 1472px) { - .columns.is-variable.is-1-fullhd { - --columnGap: 0.25rem; - } -} - -.columns.is-variable.is-2 { - --columnGap: 0.5rem; -} - -@media screen and (max-width: 768px) { - .columns.is-variable.is-2-mobile { - --columnGap: 0.5rem; - } -} - -@media screen and (min-width: 769px), print { - .columns.is-variable.is-2-tablet { - --columnGap: 0.5rem; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .columns.is-variable.is-2-tablet-only { - --columnGap: 0.5rem; - } -} - -@media screen and (max-width: 1087px) { - .columns.is-variable.is-2-touch { - --columnGap: 0.5rem; - } -} - -@media screen and (min-width: 1088px) { - .columns.is-variable.is-2-desktop { - --columnGap: 0.5rem; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .columns.is-variable.is-2-desktop-only { - --columnGap: 0.5rem; - } -} - -@media screen and (min-width: 1280px) { - .columns.is-variable.is-2-widescreen { - --columnGap: 0.5rem; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .columns.is-variable.is-2-widescreen-only { - --columnGap: 0.5rem; - } -} - -@media screen and (min-width: 1472px) { - .columns.is-variable.is-2-fullhd { - --columnGap: 0.5rem; - } -} - -.columns.is-variable.is-3 { - --columnGap: 0.75rem; -} - -@media screen and (max-width: 768px) { - .columns.is-variable.is-3-mobile { - --columnGap: 0.75rem; - } -} - -@media screen and (min-width: 769px), print { - .columns.is-variable.is-3-tablet { - --columnGap: 0.75rem; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .columns.is-variable.is-3-tablet-only { - --columnGap: 0.75rem; - } -} - -@media screen and (max-width: 1087px) { - .columns.is-variable.is-3-touch { - --columnGap: 0.75rem; - } -} - -@media screen and (min-width: 1088px) { - .columns.is-variable.is-3-desktop { - --columnGap: 0.75rem; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .columns.is-variable.is-3-desktop-only { - --columnGap: 0.75rem; - } -} - -@media screen and (min-width: 1280px) { - .columns.is-variable.is-3-widescreen { - --columnGap: 0.75rem; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .columns.is-variable.is-3-widescreen-only { - --columnGap: 0.75rem; - } -} - -@media screen and (min-width: 1472px) { - .columns.is-variable.is-3-fullhd { - --columnGap: 0.75rem; - } -} - -.columns.is-variable.is-4 { - --columnGap: 1rem; -} - -@media screen and (max-width: 768px) { - .columns.is-variable.is-4-mobile { - --columnGap: 1rem; - } -} - -@media screen and (min-width: 769px), print { - .columns.is-variable.is-4-tablet { - --columnGap: 1rem; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .columns.is-variable.is-4-tablet-only { - --columnGap: 1rem; - } -} - -@media screen and (max-width: 1087px) { - .columns.is-variable.is-4-touch { - --columnGap: 1rem; - } -} - -@media screen and (min-width: 1088px) { - .columns.is-variable.is-4-desktop { - --columnGap: 1rem; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .columns.is-variable.is-4-desktop-only { - --columnGap: 1rem; - } -} - -@media screen and (min-width: 1280px) { - .columns.is-variable.is-4-widescreen { - --columnGap: 1rem; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .columns.is-variable.is-4-widescreen-only { - --columnGap: 1rem; - } -} - -@media screen and (min-width: 1472px) { - .columns.is-variable.is-4-fullhd { - --columnGap: 1rem; - } -} - -.columns.is-variable.is-5 { - --columnGap: 1.25rem; -} - -@media screen and (max-width: 768px) { - .columns.is-variable.is-5-mobile { - --columnGap: 1.25rem; - } -} - -@media screen and (min-width: 769px), print { - .columns.is-variable.is-5-tablet { - --columnGap: 1.25rem; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .columns.is-variable.is-5-tablet-only { - --columnGap: 1.25rem; - } -} - -@media screen and (max-width: 1087px) { - .columns.is-variable.is-5-touch { - --columnGap: 1.25rem; - } -} - -@media screen and (min-width: 1088px) { - .columns.is-variable.is-5-desktop { - --columnGap: 1.25rem; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .columns.is-variable.is-5-desktop-only { - --columnGap: 1.25rem; - } -} - -@media screen and (min-width: 1280px) { - .columns.is-variable.is-5-widescreen { - --columnGap: 1.25rem; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .columns.is-variable.is-5-widescreen-only { - --columnGap: 1.25rem; - } -} - -@media screen and (min-width: 1472px) { - .columns.is-variable.is-5-fullhd { - --columnGap: 1.25rem; - } -} - -.columns.is-variable.is-6 { - --columnGap: 1.5rem; -} - -@media screen and (max-width: 768px) { - .columns.is-variable.is-6-mobile { - --columnGap: 1.5rem; - } -} - -@media screen and (min-width: 769px), print { - .columns.is-variable.is-6-tablet { - --columnGap: 1.5rem; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .columns.is-variable.is-6-tablet-only { - --columnGap: 1.5rem; - } -} - -@media screen and (max-width: 1087px) { - .columns.is-variable.is-6-touch { - --columnGap: 1.5rem; - } -} - -@media screen and (min-width: 1088px) { - .columns.is-variable.is-6-desktop { - --columnGap: 1.5rem; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .columns.is-variable.is-6-desktop-only { - --columnGap: 1.5rem; - } -} - -@media screen and (min-width: 1280px) { - .columns.is-variable.is-6-widescreen { - --columnGap: 1.5rem; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .columns.is-variable.is-6-widescreen-only { - --columnGap: 1.5rem; - } -} - -@media screen and (min-width: 1472px) { - .columns.is-variable.is-6-fullhd { - --columnGap: 1.5rem; - } -} - -.columns.is-variable.is-7 { - --columnGap: 1.75rem; -} - -@media screen and (max-width: 768px) { - .columns.is-variable.is-7-mobile { - --columnGap: 1.75rem; - } -} - -@media screen and (min-width: 769px), print { - .columns.is-variable.is-7-tablet { - --columnGap: 1.75rem; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .columns.is-variable.is-7-tablet-only { - --columnGap: 1.75rem; - } -} - -@media screen and (max-width: 1087px) { - .columns.is-variable.is-7-touch { - --columnGap: 1.75rem; - } -} - -@media screen and (min-width: 1088px) { - .columns.is-variable.is-7-desktop { - --columnGap: 1.75rem; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .columns.is-variable.is-7-desktop-only { - --columnGap: 1.75rem; - } -} - -@media screen and (min-width: 1280px) { - .columns.is-variable.is-7-widescreen { - --columnGap: 1.75rem; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .columns.is-variable.is-7-widescreen-only { - --columnGap: 1.75rem; - } -} - -@media screen and (min-width: 1472px) { - .columns.is-variable.is-7-fullhd { - --columnGap: 1.75rem; - } -} - -.columns.is-variable.is-8 { - --columnGap: 2rem; -} - -@media screen and (max-width: 768px) { - .columns.is-variable.is-8-mobile { - --columnGap: 2rem; - } -} - -@media screen and (min-width: 769px), print { - .columns.is-variable.is-8-tablet { - --columnGap: 2rem; - } -} - -@media screen and (min-width: 769px) and (max-width: 1087px) { - .columns.is-variable.is-8-tablet-only { - --columnGap: 2rem; - } -} - -@media screen and (max-width: 1087px) { - .columns.is-variable.is-8-touch { - --columnGap: 2rem; - } -} - -@media screen and (min-width: 1088px) { - .columns.is-variable.is-8-desktop { - --columnGap: 2rem; - } -} - -@media screen and (min-width: 1088px) and (max-width: 1279px) { - .columns.is-variable.is-8-desktop-only { - --columnGap: 2rem; - } -} - -@media screen and (min-width: 1280px) { - .columns.is-variable.is-8-widescreen { - --columnGap: 2rem; - } -} - -@media screen and (min-width: 1280px) and (max-width: 1471px) { - .columns.is-variable.is-8-widescreen-only { - --columnGap: 2rem; - } -} - -@media screen and (min-width: 1472px) { - .columns.is-variable.is-8-fullhd { - --columnGap: 2rem; - } -} - -.tile { - align-items: stretch; - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - min-height: -webkit-min-content; - min-height: -moz-min-content; - min-height: min-content; -} - -.tile.is-ancestor { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; -} - -.tile.is-ancestor:last-child { - margin-bottom: -0.75rem; -} - -.tile.is-ancestor:not(:last-child) { - margin-bottom: 0.75rem; -} - -.tile.is-child { - margin: 0 !important; -} - -.tile.is-parent { - padding: 0.75rem; -} - -.tile.is-vertical { - flex-direction: column; -} - -.tile.is-vertical > .tile.is-child:not(:last-child) { - margin-bottom: 1.5rem !important; -} - -@media screen and (min-width: 769px), print { - .tile:not(.is-child) { - display: flex; - } - .tile.is-1 { - flex: none; - width: 8.33333%; - } - .tile.is-2 { - flex: none; - width: 16.66667%; - } - .tile.is-3 { - flex: none; - width: 25%; - } - .tile.is-4 { - flex: none; - width: 33.33333%; - } - .tile.is-5 { - flex: none; - width: 41.66667%; - } - .tile.is-6 { - flex: none; - width: 50%; - } - .tile.is-7 { - flex: none; - width: 58.33333%; - } - .tile.is-8 { - flex: none; - width: 66.66667%; - } - .tile.is-9 { - flex: none; - width: 75%; - } - .tile.is-10 { - flex: none; - width: 83.33333%; - } - .tile.is-11 { - flex: none; - width: 91.66667%; - } - .tile.is-12 { - flex: none; - width: 100%; - } -} - -.hero { - align-items: stretch; - display: flex; - flex-direction: column; - justify-content: space-between; -} - -.hero .navbar { - background: none; -} - -.hero .tabs ul { - border-bottom: none; -} - -.hero.is-white { - background-color: white; - color: #0a0a0a; -} - -.hero.is-white a:not(.button):not(.dropdown-item):not(.tag), -.hero.is-white strong { - color: inherit; -} - -.hero.is-white .title { - color: #0a0a0a; -} - -.hero.is-white .subtitle { - color: rgba(10, 10, 10, 0.9); -} - -.hero.is-white .subtitle a:not(.button), -.hero.is-white .subtitle strong { - color: #0a0a0a; -} - -@media screen and (max-width: 1087px) { - .hero.is-white .navbar-menu { - background-color: white; - } -} - -.hero.is-white .navbar-item, -.hero.is-white .navbar-link { - color: rgba(10, 10, 10, 0.7); -} - -.hero.is-white a.navbar-item:hover, .hero.is-white a.navbar-item.is-active, -.hero.is-white .navbar-link:hover, -.hero.is-white .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; -} - -.hero.is-white .tabs a { - color: #0a0a0a; - opacity: 0.9; -} - -.hero.is-white .tabs a:hover { - opacity: 1; -} - -.hero.is-white .tabs li.is-active a { - opacity: 1; -} - -.hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a { - color: #0a0a0a; -} - -.hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; -} - -.hero.is-white.is-bold { - background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-white.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%); - } -} - -.hero.is-black { - background-color: #0a0a0a; - color: white; -} - -.hero.is-black a:not(.button):not(.dropdown-item):not(.tag), -.hero.is-black strong { - color: inherit; -} - -.hero.is-black .title { - color: white; -} - -.hero.is-black .subtitle { - color: rgba(255, 255, 255, 0.9); -} - -.hero.is-black .subtitle a:not(.button), -.hero.is-black .subtitle strong { - color: white; -} - -@media screen and (max-width: 1087px) { - .hero.is-black .navbar-menu { - background-color: #0a0a0a; - } -} - -.hero.is-black .navbar-item, -.hero.is-black .navbar-link { - color: rgba(255, 255, 255, 0.7); -} - -.hero.is-black a.navbar-item:hover, .hero.is-black a.navbar-item.is-active, -.hero.is-black .navbar-link:hover, -.hero.is-black .navbar-link.is-active { - background-color: black; - color: white; -} - -.hero.is-black .tabs a { - color: white; - opacity: 0.9; -} - -.hero.is-black .tabs a:hover { - opacity: 1; -} - -.hero.is-black .tabs li.is-active a { - opacity: 1; -} - -.hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a { - color: white; -} - -.hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover { - background-color: white; - border-color: white; - color: #0a0a0a; -} - -.hero.is-black.is-bold { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-black.is-bold .navbar-menu { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); - } -} - -.hero.is-light { - background-color: whitesmoke; - color: #363636; -} - -.hero.is-light a:not(.button):not(.dropdown-item):not(.tag), -.hero.is-light strong { - color: inherit; -} - -.hero.is-light .title { - color: #363636; -} - -.hero.is-light .subtitle { - color: rgba(54, 54, 54, 0.9); -} - -.hero.is-light .subtitle a:not(.button), -.hero.is-light .subtitle strong { - color: #363636; -} - -@media screen and (max-width: 1087px) { - .hero.is-light .navbar-menu { - background-color: whitesmoke; - } -} - -.hero.is-light .navbar-item, -.hero.is-light .navbar-link { - color: rgba(54, 54, 54, 0.7); -} - -.hero.is-light a.navbar-item:hover, .hero.is-light a.navbar-item.is-active, -.hero.is-light .navbar-link:hover, -.hero.is-light .navbar-link.is-active { - background-color: #e8e8e8; - color: #363636; -} - -.hero.is-light .tabs a { - color: #363636; - opacity: 0.9; -} - -.hero.is-light .tabs a:hover { - opacity: 1; -} - -.hero.is-light .tabs li.is-active a { - opacity: 1; -} - -.hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a { - color: #363636; -} - -.hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover { - background-color: #363636; - border-color: #363636; - color: whitesmoke; -} - -.hero.is-light.is-bold { - background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-light.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); - } -} - -.hero.is-dark { - background-color: #363636; - color: whitesmoke; -} - -.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag), -.hero.is-dark strong { - color: inherit; -} - -.hero.is-dark .title { - color: whitesmoke; -} - -.hero.is-dark .subtitle { - color: rgba(245, 245, 245, 0.9); -} - -.hero.is-dark .subtitle a:not(.button), -.hero.is-dark .subtitle strong { - color: whitesmoke; -} - -@media screen and (max-width: 1087px) { - .hero.is-dark .navbar-menu { - background-color: #363636; - } -} - -.hero.is-dark .navbar-item, -.hero.is-dark .navbar-link { - color: rgba(245, 245, 245, 0.7); -} - -.hero.is-dark a.navbar-item:hover, .hero.is-dark a.navbar-item.is-active, -.hero.is-dark .navbar-link:hover, -.hero.is-dark .navbar-link.is-active { - background-color: #292929; - color: whitesmoke; -} - -.hero.is-dark .tabs a { - color: whitesmoke; - opacity: 0.9; -} - -.hero.is-dark .tabs a:hover { - opacity: 1; -} - -.hero.is-dark .tabs li.is-active a { - opacity: 1; -} - -.hero.is-dark .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a { - color: whitesmoke; -} - -.hero.is-dark .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-dark .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; -} - -.hero.is-dark.is-bold { - background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-dark.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); - } -} - -.hero.is-primary { - background-color: #00d1b2; - color: #fff; -} - -.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag), -.hero.is-primary strong { - color: inherit; -} - -.hero.is-primary .title { - color: #fff; -} - -.hero.is-primary .subtitle { - color: rgba(255, 255, 255, 0.9); -} - -.hero.is-primary .subtitle a:not(.button), -.hero.is-primary .subtitle strong { - color: #fff; -} - -@media screen and (max-width: 1087px) { - .hero.is-primary .navbar-menu { - background-color: #00d1b2; - } -} - -.hero.is-primary .navbar-item, -.hero.is-primary .navbar-link { - color: rgba(255, 255, 255, 0.7); -} - -.hero.is-primary a.navbar-item:hover, .hero.is-primary a.navbar-item.is-active, -.hero.is-primary .navbar-link:hover, -.hero.is-primary .navbar-link.is-active { - background-color: #00b89c; - color: #fff; -} - -.hero.is-primary .tabs a { - color: #fff; - opacity: 0.9; -} - -.hero.is-primary .tabs a:hover { - opacity: 1; -} - -.hero.is-primary .tabs li.is-active a { - opacity: 1; -} - -.hero.is-primary .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a { - color: #fff; -} - -.hero.is-primary .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-primary .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #00d1b2; -} - -.hero.is-primary.is-bold { - background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-primary.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); - } -} - -.hero.is-link { - background-color: #3273dc; - color: #fff; -} - -.hero.is-link a:not(.button):not(.dropdown-item):not(.tag), -.hero.is-link strong { - color: inherit; -} - -.hero.is-link .title { - color: #fff; -} - -.hero.is-link .subtitle { - color: rgba(255, 255, 255, 0.9); -} - -.hero.is-link .subtitle a:not(.button), -.hero.is-link .subtitle strong { - color: #fff; -} - -@media screen and (max-width: 1087px) { - .hero.is-link .navbar-menu { - background-color: #3273dc; - } -} - -.hero.is-link .navbar-item, -.hero.is-link .navbar-link { - color: rgba(255, 255, 255, 0.7); -} - -.hero.is-link a.navbar-item:hover, .hero.is-link a.navbar-item.is-active, -.hero.is-link .navbar-link:hover, -.hero.is-link .navbar-link.is-active { - background-color: #2366d1; - color: #fff; -} - -.hero.is-link .tabs a { - color: #fff; - opacity: 0.9; -} - -.hero.is-link .tabs a:hover { - opacity: 1; -} - -.hero.is-link .tabs li.is-active a { - opacity: 1; -} - -.hero.is-link .tabs.is-boxed a, .hero.is-link .tabs.is-toggle a { - color: #fff; -} - -.hero.is-link .tabs.is-boxed a:hover, .hero.is-link .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-link .tabs.is-boxed li.is-active a, .hero.is-link .tabs.is-boxed li.is-active a:hover, .hero.is-link .tabs.is-toggle li.is-active a, .hero.is-link .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #3273dc; -} - -.hero.is-link.is-bold { - background-image: linear-gradient(141deg, #1577c6 0%, #3273dc 71%, #4366e5 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-link.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #1577c6 0%, #3273dc 71%, #4366e5 100%); - } -} - -.hero.is-info { - background-color: #209cee; - color: #fff; -} - -.hero.is-info a:not(.button):not(.dropdown-item):not(.tag), -.hero.is-info strong { - color: inherit; -} - -.hero.is-info .title { - color: #fff; -} - -.hero.is-info .subtitle { - color: rgba(255, 255, 255, 0.9); -} - -.hero.is-info .subtitle a:not(.button), -.hero.is-info .subtitle strong { - color: #fff; -} - -@media screen and (max-width: 1087px) { - .hero.is-info .navbar-menu { - background-color: #209cee; - } -} - -.hero.is-info .navbar-item, -.hero.is-info .navbar-link { - color: rgba(255, 255, 255, 0.7); -} - -.hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active, -.hero.is-info .navbar-link:hover, -.hero.is-info .navbar-link.is-active { - background-color: #118fe4; - color: #fff; -} - -.hero.is-info .tabs a { - color: #fff; - opacity: 0.9; -} - -.hero.is-info .tabs a:hover { - opacity: 1; -} - -.hero.is-info .tabs li.is-active a { - opacity: 1; -} - -.hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a { - color: #fff; -} - -.hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #209cee; -} - -.hero.is-info.is-bold { - background-image: linear-gradient(141deg, #04a6d7 0%, #209cee 71%, #3287f5 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-info.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #04a6d7 0%, #209cee 71%, #3287f5 100%); - } -} - -.hero.is-success { - background-color: #23d160; - color: #fff; -} - -.hero.is-success a:not(.button):not(.dropdown-item):not(.tag), -.hero.is-success strong { - color: inherit; -} - -.hero.is-success .title { - color: #fff; -} - -.hero.is-success .subtitle { - color: rgba(255, 255, 255, 0.9); -} - -.hero.is-success .subtitle a:not(.button), -.hero.is-success .subtitle strong { - color: #fff; -} - -@media screen and (max-width: 1087px) { - .hero.is-success .navbar-menu { - background-color: #23d160; - } -} - -.hero.is-success .navbar-item, -.hero.is-success .navbar-link { - color: rgba(255, 255, 255, 0.7); -} - -.hero.is-success a.navbar-item:hover, .hero.is-success a.navbar-item.is-active, -.hero.is-success .navbar-link:hover, -.hero.is-success .navbar-link.is-active { - background-color: #20bc56; - color: #fff; -} - -.hero.is-success .tabs a { - color: #fff; - opacity: 0.9; -} - -.hero.is-success .tabs a:hover { - opacity: 1; -} - -.hero.is-success .tabs li.is-active a { - opacity: 1; -} - -.hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a { - color: #fff; -} - -.hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #23d160; -} - -.hero.is-success.is-bold { - background-image: linear-gradient(141deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-success.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); - } -} - -.hero.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); -} - -.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag), -.hero.is-warning strong { - color: inherit; -} - -.hero.is-warning .title { - color: rgba(0, 0, 0, 0.7); -} - -.hero.is-warning .subtitle { - color: rgba(0, 0, 0, 0.9); -} - -.hero.is-warning .subtitle a:not(.button), -.hero.is-warning .subtitle strong { - color: rgba(0, 0, 0, 0.7); -} - -@media screen and (max-width: 1087px) { - .hero.is-warning .navbar-menu { - background-color: #ffdd57; - } -} - -.hero.is-warning .navbar-item, -.hero.is-warning .navbar-link { - color: rgba(0, 0, 0, 0.7); -} - -.hero.is-warning a.navbar-item:hover, .hero.is-warning a.navbar-item.is-active, -.hero.is-warning .navbar-link:hover, -.hero.is-warning .navbar-link.is-active { - background-color: #ffd83d; - color: rgba(0, 0, 0, 0.7); -} - -.hero.is-warning .tabs a { - color: rgba(0, 0, 0, 0.7); - opacity: 0.9; -} - -.hero.is-warning .tabs a:hover { - opacity: 1; -} - -.hero.is-warning .tabs li.is-active a { - opacity: 1; -} - -.hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a { - color: rgba(0, 0, 0, 0.7); -} - -.hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover { - background-color: rgba(0, 0, 0, 0.7); - border-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; -} - -.hero.is-warning.is-bold { - background-image: linear-gradient(141deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-warning.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); - } -} - -.hero.is-danger { - background-color: #ff3860; - color: #fff; -} - -.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag), -.hero.is-danger strong { - color: inherit; -} - -.hero.is-danger .title { - color: #fff; -} - -.hero.is-danger .subtitle { - color: rgba(255, 255, 255, 0.9); -} - -.hero.is-danger .subtitle a:not(.button), -.hero.is-danger .subtitle strong { - color: #fff; -} - -@media screen and (max-width: 1087px) { - .hero.is-danger .navbar-menu { - background-color: #ff3860; - } -} - -.hero.is-danger .navbar-item, -.hero.is-danger .navbar-link { - color: rgba(255, 255, 255, 0.7); -} - -.hero.is-danger a.navbar-item:hover, .hero.is-danger a.navbar-item.is-active, -.hero.is-danger .navbar-link:hover, -.hero.is-danger .navbar-link.is-active { - background-color: #ff1f4b; - color: #fff; -} - -.hero.is-danger .tabs a { - color: #fff; - opacity: 0.9; -} - -.hero.is-danger .tabs a:hover { - opacity: 1; -} - -.hero.is-danger .tabs li.is-active a { - opacity: 1; -} - -.hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a { - color: #fff; -} - -.hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #ff3860; -} - -.hero.is-danger.is-bold { - background-image: linear-gradient(141deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-danger.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); - } -} - -.hero.is-small .hero-body { - padding-bottom: 1.5rem; - padding-top: 1.5rem; -} - -@media screen and (min-width: 769px), print { - .hero.is-medium .hero-body { - padding-bottom: 9rem; - padding-top: 9rem; - } -} - -@media screen and (min-width: 769px), print { - .hero.is-large .hero-body { - padding-bottom: 18rem; - padding-top: 18rem; - } -} - -.hero.is-halfheight .hero-body, .hero.is-fullheight .hero-body, .hero.is-fullheight-with-navbar .hero-body { - align-items: center; - display: flex; -} - -.hero.is-halfheight .hero-body > .container, .hero.is-fullheight .hero-body > .container, .hero.is-fullheight-with-navbar .hero-body > .container { - flex-grow: 1; - flex-shrink: 1; -} - -.hero.is-halfheight { - min-height: 50vh; -} - -.hero.is-fullheight { - min-height: 100vh; -} - -.hero-video { - overflow: hidden; -} - -.hero-video video { - left: 50%; - min-height: 100%; - min-width: 100%; - position: absolute; - top: 50%; - -webkit-transform: translate3d(-50%, -50%, 0); - transform: translate3d(-50%, -50%, 0); -} - -.hero-video.is-transparent { - opacity: 0.3; -} - -@media screen and (max-width: 768px) { - .hero-video { - display: none; - } -} - -.hero-buttons { - margin-top: 1.5rem; -} - -@media screen and (max-width: 768px) { - .hero-buttons .button { - display: flex; - } - .hero-buttons .button:not(:last-child) { - margin-bottom: 0.75rem; - } -} - -@media screen and (min-width: 769px), print { - .hero-buttons { - display: flex; - justify-content: center; - } - .hero-buttons .button:not(:last-child) { - margin-right: 1.5rem; - } -} - -.hero-head, -.hero-foot { - flex-grow: 0; - flex-shrink: 0; -} - -.hero-body { - flex-grow: 1; - flex-shrink: 0; - padding: 3rem 1.5rem; -} - -.section { - padding: 3rem 1.5rem; -} - -@media screen and (min-width: 1088px) { - .section.is-medium { - padding: 9rem 1.5rem; - } - .section.is-large { - padding: 18rem 1.5rem; - } -} - -.footer { - background-color: #fafafa; - padding: 3rem 1.5rem 6rem; -} diff --git a/apps/myfeed/static/js/axios.min.js b/apps/myfeed/static/js/axios.min.js deleted file mode 100644 index 2d030546a..000000000 --- a/apps/myfeed/static/js/axios.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/* axios v0.20.0 | (c) 2020 by Matt Zabriskie */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new s(e),n=i(s.prototype.request,t);return o.extend(n,s.prototype,t),o.extend(n,t),n}var o=n(2),i=n(3),s=n(4),a=n(22),u=n(10),c=r(u);c.Axios=s,c.create=function(e){return r(a(c.defaults,e))},c.Cancel=n(23),c.CancelToken=n(24),c.isCancel=n(9),c.all=function(e){return Promise.all(e)},c.spread=n(25),e.exports=c,e.exports.default=c},function(e,t,n){"use strict";function r(e){return"[object Array]"===R.call(e)}function o(e){return"undefined"==typeof e}function i(e){return null!==e&&!o(e)&&null!==e.constructor&&!o(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function s(e){return"[object ArrayBuffer]"===R.call(e)}function a(e){return"undefined"!=typeof FormData&&e instanceof FormData}function u(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function c(e){return"string"==typeof e}function f(e){return"number"==typeof e}function p(e){return null!==e&&"object"==typeof e}function d(e){if("[object Object]"!==R.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function l(e){return"[object Date]"===R.call(e)}function h(e){return"[object File]"===R.call(e)}function m(e){return"[object Blob]"===R.call(e)}function y(e){return"[object Function]"===R.call(e)}function g(e){return p(e)&&y(e.pipe)}function v(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function x(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function w(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function b(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],function(e){u.headers[e]={}}),i.forEach(["post","put","patch"],function(e){u.headers[e]=i.merge(a)}),e.exports=u},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(13),i=n(16),s=n(5),a=n(17),u=n(20),c=n(21),f=n(14);e.exports=function(e){return new Promise(function(t,n){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"],(r.isBlob(p)||r.isFile(p))&&p.type&&delete d["Content-Type"];var l=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=unescape(encodeURIComponent(e.auth.password))||"";d.Authorization="Basic "+btoa(h+":"+m)}var y=a(e.baseURL,e.url);if(l.open(e.method.toUpperCase(),s(y,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l.onreadystatechange=function(){if(l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var r="getAllResponseHeaders"in l?u(l.getAllResponseHeaders()):null,i=e.responseType&&"text"!==e.responseType?l.response:l.responseText,s={data:i,status:l.status,statusText:l.statusText,headers:r,config:e,request:l};o(t,n,s),l=null}},l.onabort=function(){l&&(n(f("Request aborted",e,"ECONNABORTED",l)),l=null)},l.onerror=function(){n(f("Network Error",e,null,l)),l=null},l.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(f(t,e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=(e.withCredentials||c(y))&&e.xsrfCookieName?i.read(e.xsrfCookieName):void 0;g&&(d[e.xsrfHeaderName]=g)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),r.isUndefined(e.withCredentials)||(l.withCredentials=!!e.withCredentials),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),n(e),l=null)}),p||(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var r=n(15);e.exports=function(e,t,n,o,i){var s=new Error(e);return r(s,t,n,o,i)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,i,s){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(i)&&a.push("domain="+i),s===!0&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";var r=n(18),o=n(19);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,s={};return e?(r.forEach(e.split("\n"),function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(s[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?s[t]=(s[t]?s[t]:[]).concat([n]):s[t]=s[t]?s[t]+", "+n:n}}),s):s}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){function n(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function o(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(i[o]=n(void 0,e[o])):i[o]=n(e[o],t[o])}t=t||{};var i={},s=["url","method","data"],a=["headers","auth","proxy","params"],u=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],c=["validateStatus"];r.forEach(s,function(e){r.isUndefined(t[e])||(i[e]=n(void 0,t[e]))}),r.forEach(a,o),r.forEach(u,function(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(i[o]=n(void 0,e[o])):i[o]=n(void 0,t[o])}),r.forEach(c,function(r){r in t?i[r]=n(e[r],t[r]):r in e&&(i[r]=n(void 0,e[r]))});var f=s.concat(a).concat(u).concat(c),p=Object.keys(e).concat(Object.keys(t)).filter(function(e){return f.indexOf(e)===-1});return r.forEach(p,o),i}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}}])}); -//# sourceMappingURL=axios.min.map \ No newline at end of file diff --git a/apps/myfeed/static/js/vue.min.js b/apps/myfeed/static/js/vue.min.js deleted file mode 100644 index 41094e008..000000000 --- a/apps/myfeed/static/js/vue.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Vue.js v2.6.12 - * (c) 2014-2020 Evan You - * Released under the MIT License. - */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Vue=t()}(this,function(){"use strict";var e=Object.freeze({});function t(e){return null==e}function n(e){return null!=e}function r(e){return!0===e}function i(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function o(e){return null!==e&&"object"==typeof e}var a=Object.prototype.toString;function s(e){return"[object Object]"===a.call(e)}function c(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function u(e){return n(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function l(e){return null==e?"":Array.isArray(e)||s(e)&&e.toString===a?JSON.stringify(e,null,2):String(e)}function f(e){var t=parseFloat(e);return isNaN(t)?e:t}function p(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i-1)return e.splice(n,1)}}var m=Object.prototype.hasOwnProperty;function y(e,t){return m.call(e,t)}function g(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var _=/-(\w)/g,b=g(function(e){return e.replace(_,function(e,t){return t?t.toUpperCase():""})}),$=g(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),w=/\B([A-Z])/g,C=g(function(e){return e.replace(w,"-$1").toLowerCase()});var x=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function k(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function A(e,t){for(var n in t)e[n]=t[n];return e}function O(e){for(var t={},n=0;n0,Z=J&&J.indexOf("edge/")>0,G=(J&&J.indexOf("android"),J&&/iphone|ipad|ipod|ios/.test(J)||"ios"===K),X=(J&&/chrome\/\d+/.test(J),J&&/phantomjs/.test(J),J&&J.match(/firefox\/(\d+)/)),Y={}.watch,Q=!1;if(z)try{var ee={};Object.defineProperty(ee,"passive",{get:function(){Q=!0}}),window.addEventListener("test-passive",null,ee)}catch(e){}var te=function(){return void 0===B&&(B=!z&&!V&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),B},ne=z&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function re(e){return"function"==typeof e&&/native code/.test(e.toString())}var ie,oe="undefined"!=typeof Symbol&&re(Symbol)&&"undefined"!=typeof Reflect&&re(Reflect.ownKeys);ie="undefined"!=typeof Set&&re(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var ae=S,se=0,ce=function(){this.id=se++,this.subs=[]};ce.prototype.addSub=function(e){this.subs.push(e)},ce.prototype.removeSub=function(e){h(this.subs,e)},ce.prototype.depend=function(){ce.target&&ce.target.addDep(this)},ce.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t-1)if(o&&!y(i,"default"))a=!1;else if(""===a||a===C(e)){var c=Pe(String,i.type);(c<0||s0&&(st((u=e(u,(a||"")+"_"+c))[0])&&st(f)&&(s[l]=he(f.text+u[0].text),u.shift()),s.push.apply(s,u)):i(u)?st(f)?s[l]=he(f.text+u):""!==u&&s.push(he(u)):st(u)&&st(f)?s[l]=he(f.text+u.text):(r(o._isVList)&&n(u.tag)&&t(u.key)&&n(a)&&(u.key="__vlist"+a+"_"+c+"__"),s.push(u)));return s}(e):void 0}function st(e){return n(e)&&n(e.text)&&!1===e.isComment}function ct(e,t){if(e){for(var n=Object.create(null),r=oe?Reflect.ownKeys(e):Object.keys(e),i=0;i0,a=t?!!t.$stable:!o,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&r&&r!==e&&s===r.$key&&!o&&!r.$hasNormal)return r;for(var c in i={},t)t[c]&&"$"!==c[0]&&(i[c]=pt(n,c,t[c]))}else i={};for(var u in n)u in i||(i[u]=dt(n,u));return t&&Object.isExtensible(t)&&(t._normalized=i),R(i,"$stable",a),R(i,"$key",s),R(i,"$hasNormal",o),i}function pt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({});return(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:at(e))&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function dt(e,t){return function(){return e[t]}}function vt(e,t){var r,i,a,s,c;if(Array.isArray(e)||"string"==typeof e)for(r=new Array(e.length),i=0,a=e.length;idocument.createEvent("Event").timeStamp&&(sn=function(){return cn.now()})}function un(){var e,t;for(an=sn(),rn=!0,Qt.sort(function(e,t){return e.id-t.id}),on=0;onon&&Qt[n].id>e.id;)n--;Qt.splice(n+1,0,e)}else Qt.push(e);nn||(nn=!0,Ye(un))}}(this)},fn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||o(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Re(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},fn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},fn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},fn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||h(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var pn={enumerable:!0,configurable:!0,get:S,set:S};function dn(e,t,n){pn.get=function(){return this[t][n]},pn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,pn)}function vn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},i=e.$options._propKeys=[];e.$parent&&$e(!1);var o=function(o){i.push(o);var a=Me(o,t,n,e);xe(r,o,a),o in e||dn(e,"_props",o)};for(var a in t)o(a);$e(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?S:x(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;s(t=e._data="function"==typeof t?function(e,t){le();try{return e.call(t,t)}catch(e){return Re(e,t,"data()"),{}}finally{fe()}}(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,i=(e.$options.methods,n.length);for(;i--;){var o=n[i];r&&y(r,o)||(a=void 0,36!==(a=(o+"").charCodeAt(0))&&95!==a&&dn(e,"_data",o))}var a;Ce(t,!0)}(e):Ce(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=te();for(var i in t){var o=t[i],a="function"==typeof o?o:o.get;r||(n[i]=new fn(e,a||S,S,hn)),i in e||mn(e,i,o)}}(e,t.computed),t.watch&&t.watch!==Y&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i-1:"string"==typeof e?e.split(",").indexOf(t)>-1:(n=e,"[object RegExp]"===a.call(n)&&e.test(t));var n}function An(e,t){var n=e.cache,r=e.keys,i=e._vnode;for(var o in n){var a=n[o];if(a){var s=xn(a.componentOptions);s&&!t(s)&&On(n,o,r,i)}}}function On(e,t,n,r){var i=e[t];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),e[t]=null,h(n,t)}!function(t){t.prototype._init=function(t){var n=this;n._uid=bn++,n._isVue=!0,t&&t._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(n,t):n.$options=De($n(n.constructor),t||{},n),n._renderProxy=n,n._self=n,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(n),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&qt(e,t)}(n),function(t){t._vnode=null,t._staticTrees=null;var n=t.$options,r=t.$vnode=n._parentVnode,i=r&&r.context;t.$slots=ut(n._renderChildren,i),t.$scopedSlots=e,t._c=function(e,n,r,i){return Pt(t,e,n,r,i,!1)},t.$createElement=function(e,n,r,i){return Pt(t,e,n,r,i,!0)};var o=r&&r.data;xe(t,"$attrs",o&&o.attrs||e,null,!0),xe(t,"$listeners",n._parentListeners||e,null,!0)}(n),Yt(n,"beforeCreate"),function(e){var t=ct(e.$options.inject,e);t&&($e(!1),Object.keys(t).forEach(function(n){xe(e,n,t[n])}),$e(!0))}(n),vn(n),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(n),Yt(n,"created"),n.$options.el&&n.$mount(n.$options.el)}}(wn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=ke,e.prototype.$delete=Ae,e.prototype.$watch=function(e,t,n){if(s(t))return _n(this,e,t,n);(n=n||{}).user=!0;var r=new fn(this,e,t,n);if(n.immediate)try{t.call(this,r.value)}catch(e){Re(e,this,'callback for immediate watcher "'+r.expression+'"')}return function(){r.teardown()}}}(wn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var i=0,o=e.length;i1?k(t):t;for(var n=k(arguments,1),r='event handler for "'+e+'"',i=0,o=t.length;iparseInt(this.max)&&On(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return F}};Object.defineProperty(e,"config",t),e.util={warn:ae,extend:A,mergeOptions:De,defineReactive:xe},e.set=ke,e.delete=Ae,e.nextTick=Ye,e.observable=function(e){return Ce(e),e},e.options=Object.create(null),M.forEach(function(t){e.options[t+"s"]=Object.create(null)}),e.options._base=e,A(e.options.components,Tn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=k(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=De(this.options,e),this}}(e),Cn(e),function(e){M.forEach(function(t){e[t]=function(e,n){return n?("component"===t&&s(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}})}(e)}(wn),Object.defineProperty(wn.prototype,"$isServer",{get:te}),Object.defineProperty(wn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(wn,"FunctionalRenderContext",{value:Tt}),wn.version="2.6.12";var En=p("style,class"),Nn=p("input,textarea,option,select,progress"),jn=function(e,t,n){return"value"===n&&Nn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Dn=p("contenteditable,draggable,spellcheck"),Ln=p("events,caret,typing,plaintext-only"),Mn=function(e,t){return Hn(t)||"false"===t?"false":"contenteditable"===e&&Ln(t)?t:"true"},In=p("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),Fn="http://www.w3.org/1999/xlink",Pn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Rn=function(e){return Pn(e)?e.slice(6,e.length):""},Hn=function(e){return null==e||!1===e};function Bn(e){for(var t=e.data,r=e,i=e;n(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(t=Un(i.data,t));for(;n(r=r.parent);)r&&r.data&&(t=Un(t,r.data));return function(e,t){if(n(e)||n(t))return zn(e,Vn(t));return""}(t.staticClass,t.class)}function Un(e,t){return{staticClass:zn(e.staticClass,t.staticClass),class:n(e.class)?[e.class,t.class]:t.class}}function zn(e,t){return e?t?e+" "+t:e:t||""}function Vn(e){return Array.isArray(e)?function(e){for(var t,r="",i=0,o=e.length;i-1?hr(e,t,n):In(t)?Hn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Dn(t)?e.setAttribute(t,Mn(t,n)):Pn(t)?Hn(n)?e.removeAttributeNS(Fn,Rn(t)):e.setAttributeNS(Fn,t,n):hr(e,t,n)}function hr(e,t,n){if(Hn(n))e.removeAttribute(t);else{if(q&&!W&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var mr={create:dr,update:dr};function yr(e,r){var i=r.elm,o=r.data,a=e.data;if(!(t(o.staticClass)&&t(o.class)&&(t(a)||t(a.staticClass)&&t(a.class)))){var s=Bn(r),c=i._transitionClasses;n(c)&&(s=zn(s,Vn(c))),s!==i._prevClass&&(i.setAttribute("class",s),i._prevClass=s)}}var gr,_r,br,$r,wr,Cr,xr={create:yr,update:yr},kr=/[\w).+\-_$\]]/;function Ar(e){var t,n,r,i,o,a=!1,s=!1,c=!1,u=!1,l=0,f=0,p=0,d=0;for(r=0;r=0&&" "===(h=e.charAt(v));v--);h&&kr.test(h)||(u=!0)}}else void 0===i?(d=r+1,i=e.slice(0,r).trim()):m();function m(){(o||(o=[])).push(e.slice(d,r).trim()),d=r+1}if(void 0===i?i=e.slice(0,r).trim():0!==d&&m(),o)for(r=0;r-1?{exp:e.slice(0,$r),key:'"'+e.slice($r+1)+'"'}:{exp:e,key:null};_r=e,$r=wr=Cr=0;for(;!zr();)Vr(br=Ur())?Jr(br):91===br&&Kr(br);return{exp:e.slice(0,wr),key:e.slice(wr+1,Cr)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function Ur(){return _r.charCodeAt(++$r)}function zr(){return $r>=gr}function Vr(e){return 34===e||39===e}function Kr(e){var t=1;for(wr=$r;!zr();)if(Vr(e=Ur()))Jr(e);else if(91===e&&t++,93===e&&t--,0===t){Cr=$r;break}}function Jr(e){for(var t=e;!zr()&&(e=Ur())!==t;);}var qr,Wr="__r",Zr="__c";function Gr(e,t,n){var r=qr;return function i(){null!==t.apply(null,arguments)&&Qr(e,i,n,r)}}var Xr=Ve&&!(X&&Number(X[1])<=53);function Yr(e,t,n,r){if(Xr){var i=an,o=t;t=o._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=i||e.timeStamp<=0||e.target.ownerDocument!==document)return o.apply(this,arguments)}}qr.addEventListener(e,t,Q?{capture:n,passive:r}:n)}function Qr(e,t,n,r){(r||qr).removeEventListener(e,t._wrapper||t,n)}function ei(e,r){if(!t(e.data.on)||!t(r.data.on)){var i=r.data.on||{},o=e.data.on||{};qr=r.elm,function(e){if(n(e[Wr])){var t=q?"change":"input";e[t]=[].concat(e[Wr],e[t]||[]),delete e[Wr]}n(e[Zr])&&(e.change=[].concat(e[Zr],e.change||[]),delete e[Zr])}(i),rt(i,o,Yr,Qr,Gr,r.context),qr=void 0}}var ti,ni={create:ei,update:ei};function ri(e,r){if(!t(e.data.domProps)||!t(r.data.domProps)){var i,o,a=r.elm,s=e.data.domProps||{},c=r.data.domProps||{};for(i in n(c.__ob__)&&(c=r.data.domProps=A({},c)),s)i in c||(a[i]="");for(i in c){if(o=c[i],"textContent"===i||"innerHTML"===i){if(r.children&&(r.children.length=0),o===s[i])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===i&&"PROGRESS"!==a.tagName){a._value=o;var u=t(o)?"":String(o);ii(a,u)&&(a.value=u)}else if("innerHTML"===i&&qn(a.tagName)&&t(a.innerHTML)){(ti=ti||document.createElement("div")).innerHTML=""+o+"";for(var l=ti.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(o!==s[i])try{a[i]=o}catch(e){}}}}function ii(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var r=e.value,i=e._vModifiers;if(n(i)){if(i.number)return f(r)!==f(t);if(i.trim)return r.trim()!==t.trim()}return r!==t}(e,t))}var oi={create:ri,update:ri},ai=g(function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach(function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t});function si(e){var t=ci(e.style);return e.staticStyle?A(e.staticStyle,t):t}function ci(e){return Array.isArray(e)?O(e):"string"==typeof e?ai(e):e}var ui,li=/^--/,fi=/\s*!important$/,pi=function(e,t,n){if(li.test(t))e.style.setProperty(t,n);else if(fi.test(n))e.style.setProperty(C(t),n.replace(fi,""),"important");else{var r=vi(t);if(Array.isArray(n))for(var i=0,o=n.length;i-1?t.split(yi).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function _i(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(yi).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function bi(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&A(t,$i(e.name||"v")),A(t,e),t}return"string"==typeof e?$i(e):void 0}}var $i=g(function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}}),wi=z&&!W,Ci="transition",xi="animation",ki="transition",Ai="transitionend",Oi="animation",Si="animationend";wi&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(ki="WebkitTransition",Ai="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Oi="WebkitAnimation",Si="webkitAnimationEnd"));var Ti=z?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Ei(e){Ti(function(){Ti(e)})}function Ni(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),gi(e,t))}function ji(e,t){e._transitionClasses&&h(e._transitionClasses,t),_i(e,t)}function Di(e,t,n){var r=Mi(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Ci?Ai:Si,c=0,u=function(){e.removeEventListener(s,l),n()},l=function(t){t.target===e&&++c>=a&&u()};setTimeout(function(){c0&&(n=Ci,l=a,f=o.length):t===xi?u>0&&(n=xi,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?Ci:xi:null)?n===Ci?o.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===Ci&&Li.test(r[ki+"Property"])}}function Ii(e,t){for(;e.length1}function Ui(e,t){!0!==t.data.show&&Pi(t)}var zi=function(e){var o,a,s={},c=e.modules,u=e.nodeOps;for(o=0;ov?_(e,t(i[y+1])?null:i[y+1].elm,i,d,y,o):d>y&&$(r,p,v)}(p,h,y,o,l):n(y)?(n(e.text)&&u.setTextContent(p,""),_(p,null,y,0,y.length-1,o)):n(h)?$(h,0,h.length-1):n(e.text)&&u.setTextContent(p,""):e.text!==i.text&&u.setTextContent(p,i.text),n(v)&&n(d=v.hook)&&n(d=d.postpatch)&&d(e,i)}}}function k(e,t,i){if(r(i)&&n(e.parent))e.parent.data.pendingInsert=t;else for(var o=0;o-1,a.selected!==o&&(a.selected=o);else if(N(Wi(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function qi(e,t){return t.every(function(t){return!N(t,e)})}function Wi(e){return"_value"in e?e._value:e.value}function Zi(e){e.target.composing=!0}function Gi(e){e.target.composing&&(e.target.composing=!1,Xi(e.target,"input"))}function Xi(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Yi(e){return!e.componentInstance||e.data&&e.data.transition?e:Yi(e.componentInstance._vnode)}var Qi={model:Vi,show:{bind:function(e,t,n){var r=t.value,i=(n=Yi(n)).data&&n.data.transition,o=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&i?(n.data.show=!0,Pi(n,function(){e.style.display=o})):e.style.display=r?o:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=Yi(n)).data&&n.data.transition?(n.data.show=!0,r?Pi(n,function(){e.style.display=e.__vOriginalDisplay}):Ri(n,function(){e.style.display="none"})):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,i){i||(e.style.display=e.__vOriginalDisplay)}}},eo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function to(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?to(zt(t.children)):e}function no(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var i=n._parentListeners;for(var o in i)t[b(o)]=i[o];return t}function ro(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var io=function(e){return e.tag||Ut(e)},oo=function(e){return"show"===e.name},ao={name:"transition",props:eo,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(io)).length){var r=this.mode,o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var a=to(o);if(!a)return o;if(this._leaving)return ro(e,o);var s="__transition-"+this._uid+"-";a.key=null==a.key?a.isComment?s+"comment":s+a.tag:i(a.key)?0===String(a.key).indexOf(s)?a.key:s+a.key:a.key;var c=(a.data||(a.data={})).transition=no(this),u=this._vnode,l=to(u);if(a.data.directives&&a.data.directives.some(oo)&&(a.data.show=!0),l&&l.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(a,l)&&!Ut(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=A({},c);if("out-in"===r)return this._leaving=!0,it(f,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),ro(e,o);if("in-out"===r){if(Ut(a))return u;var p,d=function(){p()};it(c,"afterEnter",d),it(c,"enterCancelled",d),it(f,"delayLeave",function(e){p=e})}}return o}}},so=A({tag:String,moveClass:String},eo);function co(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function uo(e){e.data.newPos=e.elm.getBoundingClientRect()}function lo(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,i=t.top-n.top;if(r||i){e.data.moved=!0;var o=e.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}delete so.mode;var fo={Transition:ao,TransitionGroup:{props:so,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var i=Zt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,i(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=no(this),s=0;s-1?Gn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Gn[e]=/HTMLUnknownElement/.test(t.toString())},A(wn.options.directives,Qi),A(wn.options.components,fo),wn.prototype.__patch__=z?zi:S,wn.prototype.$mount=function(e,t){return function(e,t,n){var r;return e.$el=t,e.$options.render||(e.$options.render=ve),Yt(e,"beforeMount"),r=function(){e._update(e._render(),n)},new fn(e,r,S,{before:function(){e._isMounted&&!e._isDestroyed&&Yt(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,Yt(e,"mounted")),e}(this,e=e&&z?Yn(e):void 0,t)},z&&setTimeout(function(){F.devtools&&ne&&ne.emit("init",wn)},0);var po=/\{\{((?:.|\r?\n)+?)\}\}/g,vo=/[-.*+?^${}()|[\]\/\\]/g,ho=g(function(e){var t=e[0].replace(vo,"\\$&"),n=e[1].replace(vo,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")});var mo={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=Fr(e,"class");n&&(e.staticClass=JSON.stringify(n));var r=Ir(e,"class",!1);r&&(e.classBinding=r)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var yo,go={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=Fr(e,"style");n&&(e.staticStyle=JSON.stringify(ai(n)));var r=Ir(e,"style",!1);r&&(e.styleBinding=r)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},_o=function(e){return(yo=yo||document.createElement("div")).innerHTML=e,yo.textContent},bo=p("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),$o=p("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),wo=p("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),Co=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,xo=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,ko="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+P.source+"]*",Ao="((?:"+ko+"\\:)?"+ko+")",Oo=new RegExp("^<"+Ao),So=/^\s*(\/?)>/,To=new RegExp("^<\\/"+Ao+"[^>]*>"),Eo=/^]+>/i,No=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Io=/&(?:lt|gt|quot|amp|#39);/g,Fo=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Po=p("pre,textarea",!0),Ro=function(e,t){return e&&Po(e)&&"\n"===t[0]};function Ho(e,t){var n=t?Fo:Io;return e.replace(n,function(e){return Mo[e]})}var Bo,Uo,zo,Vo,Ko,Jo,qo,Wo,Zo=/^@|^v-on:/,Go=/^v-|^@|^:|^#/,Xo=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Yo=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Qo=/^\(|\)$/g,ea=/^\[.*\]$/,ta=/:(.*)$/,na=/^:|^\.|^v-bind:/,ra=/\.[^.\]]+(?=[^\]]*$)/g,ia=/^v-slot(:|$)|^#/,oa=/[\r\n]/,aa=/\s+/g,sa=g(_o),ca="_empty_";function ua(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:ma(t),rawAttrsMap:{},parent:n,children:[]}}function la(e,t){Bo=t.warn||Sr,Jo=t.isPreTag||T,qo=t.mustUseProp||T,Wo=t.getTagNamespace||T;t.isReservedTag;zo=Tr(t.modules,"transformNode"),Vo=Tr(t.modules,"preTransformNode"),Ko=Tr(t.modules,"postTransformNode"),Uo=t.delimiters;var n,r,i=[],o=!1!==t.preserveWhitespace,a=t.whitespace,s=!1,c=!1;function u(e){if(l(e),s||e.processed||(e=fa(e,t)),i.length||e===n||n.if&&(e.elseif||e.else)&&da(n,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)a=e,(u=function(e){var t=e.length;for(;t--;){if(1===e[t].type)return e[t];e.pop()}}(r.children))&&u.if&&da(u,{exp:a.elseif,block:a});else{if(e.slotScope){var o=e.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[o]=e}r.children.push(e),e.parent=r}var a,u;e.children=e.children.filter(function(e){return!e.slotScope}),l(e),e.pre&&(s=!1),Jo(e.tag)&&(c=!1);for(var f=0;f]*>)","i")),p=e.replace(f,function(e,n,r){return u=r.length,Do(l)||"noscript"===l||(n=n.replace(//g,"$1").replace(//g,"$1")),Ro(l,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""});c+=e.length-p.length,e=p,A(l,c-u,c)}else{var d=e.indexOf("<");if(0===d){if(No.test(e)){var v=e.indexOf("--\x3e");if(v>=0){t.shouldKeepComment&&t.comment(e.substring(4,v),c,c+v+3),C(v+3);continue}}if(jo.test(e)){var h=e.indexOf("]>");if(h>=0){C(h+2);continue}}var m=e.match(Eo);if(m){C(m[0].length);continue}var y=e.match(To);if(y){var g=c;C(y[0].length),A(y[1],g,c);continue}var _=x();if(_){k(_),Ro(_.tagName,e)&&C(1);continue}}var b=void 0,$=void 0,w=void 0;if(d>=0){for($=e.slice(d);!(To.test($)||Oo.test($)||No.test($)||jo.test($)||(w=$.indexOf("<",1))<0);)d+=w,$=e.slice(d);b=e.substring(0,d)}d<0&&(b=e),b&&C(b.length),t.chars&&b&&t.chars(b,c-b.length,c)}if(e===n){t.chars&&t.chars(e);break}}function C(t){c+=t,e=e.substring(t)}function x(){var t=e.match(Oo);if(t){var n,r,i={tagName:t[1],attrs:[],start:c};for(C(t[0].length);!(n=e.match(So))&&(r=e.match(xo)||e.match(Co));)r.start=c,C(r[0].length),r.end=c,i.attrs.push(r);if(n)return i.unarySlash=n[1],C(n[0].length),i.end=c,i}}function k(e){var n=e.tagName,c=e.unarySlash;o&&("p"===r&&wo(n)&&A(r),s(n)&&r===n&&A(n));for(var u=a(n)||!!c,l=e.attrs.length,f=new Array(l),p=0;p=0&&i[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var u=i.length-1;u>=a;u--)t.end&&t.end(i[u].tag,n,o);i.length=a,r=a&&i[a-1].tag}else"br"===s?t.start&&t.start(e,[],!0,n,o):"p"===s&&(t.start&&t.start(e,[],!1,n,o),t.end&&t.end(e,n,o))}A()}(e,{warn:Bo,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,o,a,l,f){var p=r&&r.ns||Wo(e);q&&"svg"===p&&(o=function(e){for(var t=[],n=0;nc&&(s.push(o=e.slice(c,i)),a.push(JSON.stringify(o)));var u=Ar(r[1].trim());a.push("_s("+u+")"),s.push({"@binding":u}),c=i+r[0].length}return c-1"+("true"===o?":("+t+")":":_q("+t+","+o+")")),Mr(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+o+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Br(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Br(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Br(t,"$$c")+"}",null,!0)}(e,r,i);else if("input"===o&&"radio"===a)!function(e,t,n){var r=n&&n.number,i=Ir(e,"value")||"null";Er(e,"checked","_q("+t+","+(i=r?"_n("+i+")":i)+")"),Mr(e,"change",Br(t,i),null,!0)}(e,r,i);else if("input"===o||"textarea"===o)!function(e,t,n){var r=e.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=!o&&"range"!==r,u=o?"change":"range"===r?Wr:"input",l="$event.target.value";s&&(l="$event.target.value.trim()"),a&&(l="_n("+l+")");var f=Br(t,l);c&&(f="if($event.target.composing)return;"+f),Er(e,"value","("+t+")"),Mr(e,u,f,null,!0),(s||a)&&Mr(e,"blur","$forceUpdate()")}(e,r,i);else if(!F.isReservedTag(o))return Hr(e,r,i),!1;return!0},text:function(e,t){t.value&&Er(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Er(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:bo,mustUseProp:jn,canBeLeftOpenTag:$o,isReservedTag:Wn,getTagNamespace:Zn,staticKeys:function(e){return e.reduce(function(e,t){return e.concat(t.staticKeys||[])},[]).join(",")}(ba)},xa=g(function(e){return p("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))});function ka(e,t){e&&($a=xa(t.staticKeys||""),wa=t.isReservedTag||T,function e(t){t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||d(e.tag)||!wa(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every($a)))}(t);if(1===t.type){if(!wa(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,r=t.children.length;n|^function(?:\s+[\w$]+)?\s*\(/,Oa=/\([^)]*?\);*$/,Sa=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Ta={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Ea={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Na=function(e){return"if("+e+")return null;"},ja={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Na("$event.target !== $event.currentTarget"),ctrl:Na("!$event.ctrlKey"),shift:Na("!$event.shiftKey"),alt:Na("!$event.altKey"),meta:Na("!$event.metaKey"),left:Na("'button' in $event && $event.button !== 0"),middle:Na("'button' in $event && $event.button !== 1"),right:Na("'button' in $event && $event.button !== 2")};function Da(e,t){var n=t?"nativeOn:":"on:",r="",i="";for(var o in e){var a=La(e[o]);e[o]&&e[o].dynamic?i+=o+","+a+",":r+='"'+o+'":'+a+","}return r="{"+r.slice(0,-1)+"}",i?n+"_d("+r+",["+i.slice(0,-1)+"])":n+r}function La(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map(function(e){return La(e)}).join(",")+"]";var t=Sa.test(e.value),n=Aa.test(e.value),r=Sa.test(e.value.replace(Oa,""));if(e.modifiers){var i="",o="",a=[];for(var s in e.modifiers)if(ja[s])o+=ja[s],Ta[s]&&a.push(s);else if("exact"===s){var c=e.modifiers;o+=Na(["ctrl","shift","alt","meta"].filter(function(e){return!c[e]}).map(function(e){return"$event."+e+"Key"}).join("||"))}else a.push(s);return a.length&&(i+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Ma).join("&&")+")return null;"}(a)),o&&(i+=o),"function($event){"+i+(t?"return "+e.value+"($event)":n?"return ("+e.value+")($event)":r?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(r?"return "+e.value:e.value)+"}"}function Ma(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=Ta[e],r=Ea[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var Ia={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:S},Fa=function(e){this.options=e,this.warn=e.warn||Sr,this.transforms=Tr(e.modules,"transformCode"),this.dataGenFns=Tr(e.modules,"genData"),this.directives=A(A({},Ia),e.directives);var t=e.isReservedTag||T;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Pa(e,t){var n=new Fa(t);return{render:"with(this){return "+(e?Ra(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Ra(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Ha(e,t);if(e.once&&!e.onceProcessed)return Ba(e,t);if(e.for&&!e.forProcessed)return za(e,t);if(e.if&&!e.ifProcessed)return Ua(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',r=qa(e,t),i="_t("+n+(r?","+r:""),o=e.attrs||e.dynamicAttrs?Ga((e.attrs||[]).concat(e.dynamicAttrs||[]).map(function(e){return{name:b(e.name),value:e.value,dynamic:e.dynamic}})):null,a=e.attrsMap["v-bind"];!o&&!a||r||(i+=",null");o&&(i+=","+o);a&&(i+=(o?"":",null")+","+a);return i+")"}(e,t);var n;if(e.component)n=function(e,t,n){var r=t.inlineTemplate?null:qa(t,n,!0);return"_c("+e+","+Va(t,n)+(r?","+r:"")+")"}(e.component,e,t);else{var r;(!e.plain||e.pre&&t.maybeComponent(e))&&(r=Va(e,t));var i=e.inlineTemplate?null:qa(e,t,!0);n="_c('"+e.tag+"'"+(r?","+r:"")+(i?","+i:"")+")"}for(var o=0;o>>0}(a):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var o=function(e,t){var n=e.children[0];if(n&&1===n.type){var r=Pa(n,t.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map(function(e){return"function(){"+e+"}"}).join(",")+"]}"}}(e,t);o&&(n+=o+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+Ga(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Ka(e){return 1===e.type&&("slot"===e.tag||e.children.some(Ka))}function Ja(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return Ua(e,t,Ja,"null");if(e.for&&!e.forProcessed)return za(e,t,Ja);var r=e.slotScope===ca?"":String(e.slotScope),i="function("+r+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(qa(e,t)||"undefined")+":undefined":qa(e,t)||"undefined":Ra(e,t))+"}",o=r?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+i+o+"}"}function qa(e,t,n,r,i){var o=e.children;if(o.length){var a=o[0];if(1===o.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var s=n?t.maybeComponent(a)?",1":",0":"";return""+(r||Ra)(a,t)+s}var c=n?function(e,t){for(var n=0,r=0;r':'
    ',ts.innerHTML.indexOf(" ")>0}var os=!!z&&is(!1),as=!!z&&is(!0),ss=g(function(e){var t=Yn(e);return t&&t.innerHTML}),cs=wn.prototype.$mount;return wn.prototype.$mount=function(e,t){if((e=e&&Yn(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=ss(r));else{if(!r.nodeType)return this;r=r.innerHTML}else e&&(r=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(r){var i=rs(r,{outputSourceRange:!1,shouldDecodeNewlines:os,shouldDecodeNewlinesForHref:as,delimiters:n.delimiters,comments:n.comments},this),o=i.render,a=i.staticRenderFns;n.render=o,n.staticRenderFns=a}}return cs.call(this,e,t)},wn.compile=rs,wn}); \ No newline at end of file diff --git a/apps/myfeed/templates/auth.html b/apps/myfeed/templates/auth.html deleted file mode 100644 index 82afa84f2..000000000 --- a/apps/myfeed/templates/auth.html +++ /dev/null @@ -1,13 +0,0 @@ -[[extend "layout.html"]] -
    -
    -
    - -
    -
    -
    -[[block page_scripts]] - - - -[[end]] diff --git a/apps/myfeed/templates/friends.html b/apps/myfeed/templates/friends.html deleted file mode 100644 index 86f027eb2..000000000 --- a/apps/myfeed/templates/friends.html +++ /dev/null @@ -1,45 +0,0 @@ -[[extend "layout.html"]] -

    Friends Search

    - -[[=form]] - - - [[for user in users:]] - - - - - - - [[pass]] -
    [[=user.first_name]][[=user.last_name]][[=user.username]][[=request_friendship.button('Request')(id=user.id)]]
    - -

    Requests received

    - - [[for r in requests_received:]] - - - - - - - - [[pass]] -
    [[=r.auth_user.first_name]][[=r.auth_user.last_name]][[=r.auth_user.username]][[=r.friend_request.status]] - [[if r.friend_request.status == 'pending':]] - [[=accept_friendship.button('Accept')(id=r.friend_request.id)]] - [[=reject_friendship.button('Reject')(id=r.friend_request.id)]] - [[pass]] -
    - -

    Requests sent

    - - [[for r in requests_sent:]] - - - - - - - [[pass]] -
    [[=r.auth_user.first_name]][[=r.auth_user.last_name]][[=r.auth_user.username]][[=r.friend_request.status]]
    diff --git a/apps/myfeed/templates/home.html b/apps/myfeed/templates/home.html deleted file mode 100644 index 66daeb2bf..000000000 --- a/apps/myfeed/templates/home.html +++ /dev/null @@ -1,15 +0,0 @@ -[[extend "layout.html"]] - -

    Home for [[= user['username'] ]]

    - -[[for item in items:]] -
    - - [[=item.created_by.first_name]] - [[=item.created_by.last_name]] - - on [[=item.created_on]] says -
    [[=item.body]]
    - [[=like.button('Like', _class=("clicked" if item.liked else ""))(id=item.id)]] -
    -[[pass]] diff --git a/apps/myfeed/templates/index.html b/apps/myfeed/templates/index.html deleted file mode 100644 index 8a84454c9..000000000 --- a/apps/myfeed/templates/index.html +++ /dev/null @@ -1,17 +0,0 @@ -[[extend "layout.html"]] - -

    Your Feed

    - -[[=form]] - -[[for item in items:]] -
    - - [[=item.created_by.first_name]] - [[=item.created_by.last_name]] - - on [[=item.created_on]] says -
    [[=item.body]]
    - [[=like.button('Like', _class=("clicked" if item.liked else ""))(id=item.id)]] -
    -[[pass]] diff --git a/apps/myfeed/templates/layout.html b/apps/myfeed/templates/layout.html deleted file mode 100644 index 972bdfd5f..000000000 --- a/apps/myfeed/templates/layout.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - [[block page_head]][[end]] - - - - -
    - - [[include]] - -
    -
    -
    - Made with py4web -
    -
    - - - - - [[block page_scripts]][[end]] - diff --git a/apps/showcase/__init__.py b/apps/showcase/__init__.py new file mode 100644 index 000000000..da8bfb0cf --- /dev/null +++ b/apps/showcase/__init__.py @@ -0,0 +1,101 @@ +import os +import re + +from py4web import HTTP, action, request + +MODE = os.environ.get("PY4WEB_DASHBOARD_MODE", "none") + +from .examples.component_loader import component_loader +from .examples.count import count +from .examples.example_helpers import example_helpers +from .examples.flash_example_fixture import flash_example_fixture +from .examples.flash_example_naive import flash_example_naive +from .examples.hcaptcha_form import hcaptcha_form +from .examples.hello import hello +from .examples.page_with_error import page_with_error +from .examples.page_with_parameters import page_with_parameters +from .examples.page_with_postback import page_with_postback +from .examples.page_with_query import page_with_query +from .examples.page_with_raise import page_with_raise +from .examples.page_with_redirect import page_with_redirect, target +from .examples.page_with_template import page_with_template +from .examples.page_without_template import page_without_template +from .examples.page_with_tailwindcss import page_with_tailwindcss +from .examples.rest import rest +from .examples.rpc import rpc +from .examples.session_clear import session_clear +from .examples.session_counter import session_counter +from .examples.tagsinput_form import tagsinput_form +from .vue_components_examples.vue_file_uploader import vue_file_uploader +from .vue_components_examples.vue_grid import vue_grid +from .vue_components_examples.vue_star_rater import vue_star_rater + +if MODE == "full": + from .vue_components_examples.models import db + from .examples.auth_form import auth_form + from .examples.auth_forms import auth_forms + from .examples.create_form import create_form + from .examples.custom_form import custom_form + from .examples.example_ajax_grid import example_ajax_grid + from .examples.example_html_grid import example_html_grid + from .examples.example_multiple_forms import example_multiple_forms + from .examples.hello_world import hello_world + from .examples.hello_world_msg import hello_world_msg + from .examples.show_a_button import show_a_button + from .examples.socketio import index as socketio + from .examples.test_expose import test_expose1, test_expose2, test_expose3 + from .examples.update_form import update_form + from .examples.ws import index as ws + from .vue_components_examples.vue_edit_form import vue_edit_form + from .vue_components_examples.vue_grid_and_forms import vue_grid_and_forms + from .vue_components_examples.vue_insert_form import vue_insert_form + from .vue_components_examples.vue_view_form import vue_view_form + + +@action("index") +@action.uses("index.html") +def index(): + return {"mode": MODE} + + +@action("show/") +@action.uses("show.html") +def show(name): + path = name + name = name.rstrip("/0123456789") + data = [] + here = os.path.dirname(__file__) + filename = f"{here}/{name}.md" + if os.path.exists(filename): + with open(filename) as stream: + metadata = stream.read().strip() + data.append({"name": f"{name}.md", "content": metadata, "language": "markdown"}) + filename = f"{here}/{name}.py" + if not os.path.exists(filename): + raise HTTP(404) + with open(filename) as stream: + controller = stream.read().strip() + data.append({"name": f"{name}.py", "content": controller, "language": "python"}) + templates = re.compile(r"[/\w]+\.html").findall(controller) + for template in templates: + with open(f"{here}/templates/{template}") as stream: + content = stream.read().strip() + data.append( + { + "name": f"templates/{template}", + "content": content, + "language": "html", + } + ) + others = re.compile(r"from [.](\S+)").findall(controller) + for other in others: + if not other.startswith("."): + continue + filename = other[1:].replace(".", "/") + ".py" + with open(f"{here}/{filename}") as stream: + content = stream.read().strip() + data.append({"shortname": filename, "content": content, "language": "python"}) + # drop the subfolder name + path = "/".join(path.split("/")[1:]) + executable = MODE == "full" or name.split("/")[-1] in globals() + return {"files": data, "mode": MODE, "path": path, "executable": executable} diff --git a/apps/showcase/examples/auth_form.py b/apps/showcase/examples/auth_form.py new file mode 100644 index 000000000..9e540b001 --- /dev/null +++ b/apps/showcase/examples/auth_form.py @@ -0,0 +1,16 @@ +from py4web import action + +from .common import T, auth, db, session + + +@action("auth_form/", method=["GET", "POST"]) +@action.uses("examples/auth_form.html", db, session, T, auth) +def auth_form(name): + form = auth.form(name) + if form.submitted: + pass + elif form.accepted: + pass + elif form.errors: + pass + return dict(form=auth.form(name)) diff --git a/apps/showcase/examples/auth_forms.py b/apps/showcase/examples/auth_forms.py new file mode 100644 index 000000000..ac976f769 --- /dev/null +++ b/apps/showcase/examples/auth_forms.py @@ -0,0 +1,19 @@ +from py4web import action + +from .common import T, auth, db, session + + +@action("auth_forms", method=["GET", "POST"]) +@action.uses("examples/auth_forms.html", db, session, T, auth) +def auth_forms(): + disabled = False + # this is experimntal, we must disable forms that require a logged in user + if not auth.is_logged_in: + disabled = "disabled" + return dict( + register_form=auth.form("register"), + login_form=auth.form("login"), + reset_password_form=auth.form("reset_password"), + change_password_form=disabled or auth.form("change_password"), + profile_form=disabled or auth.form("profile"), + ) diff --git a/apps/showcase/examples/common.py b/apps/showcase/examples/common.py new file mode 100644 index 000000000..3e4c8d9c1 --- /dev/null +++ b/apps/showcase/examples/common.py @@ -0,0 +1,133 @@ +""" +This file defines cache, session, and translator T object for the app +These are fixtures that every app needs so probably you will not be editing this file +""" +import logging +import os +import sys + +# used to validate hcapcha response +import requests +from pydal.tools.tags import Tags + +from py4web import DAL, Cache, Field, Flash, Session, Translator, action +from py4web.utils.auth import Auth +from py4web.utils.downloader import downloader +from py4web.utils.factories import ActionFactory +from py4web.utils.mailer import Mailer + +from . import settings + +# ####################################################### +# implement custom loggers form settings.LOGGERS +# ####################################################### +logger = logging.getLogger("py4web:" + settings.APP_NAME) +formatter = logging.Formatter( + "%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s" +) +for item in settings.LOGGERS: + level, filename = item.split(":", 1) + if filename in ("stdout", "stderr"): + handler = logging.StreamHandler(getattr(sys, filename)) + else: + handler = logging.FileHandler(filename) + handler.setFormatter(formatter) + logger.setLevel(getattr(logging, level.upper(), "DEBUG")) + logger.addHandler(handler) + +# ####################################################### +# create required folders +# ####################################################### + +for folder in [settings.DB_FOLDER, settings.T_FOLDER, settings.UPLOAD_FOLDER]: + if not os.path.exists(folder): + os.mkdir(folder) + +# ####################################################### +# connect to db +# ####################################################### +db = DAL( + settings.DB_URI, + folder=settings.DB_FOLDER, + pool_size=settings.DB_POOL_SIZE, + migrate=settings.DB_MIGRATE, + fake_migrate=settings.DB_FAKE_MIGRATE, +) + +# ####################################################### +# define global objects that may or may not be used by the actions +# ####################################################### +cache = Cache(size=1000) +T = Translator(settings.T_FOLDER) +flash = Flash() + +# ####################################################### +# pick the session type that suits you best +# ####################################################### +if settings.SESSION_TYPE == "cookies": + session = Session(secret=settings.SESSION_SECRET_KEY) +elif settings.SESSION_TYPE == "redis": + import redis + + host, port = settings.REDIS_SERVER.split(":") + # for more options: https://github.com/andymccurdy/redis-py/blob/master/redis/client.py + conn = redis.Redis(host=host, port=int(port)) + conn.set = ( + lambda k, v, e, cs=conn.set, ct=conn.ttl: cs(k, v, ct(k)) + if ct(k) >= 0 + else cs(k, v, e) + ) + session = Session(secret=settings.SESSION_SECRET_KEY, storage=conn) +elif settings.SESSION_TYPE == "memcache": + import time + + import memcache + + conn = memcache.Client(settings.MEMCACHE_CLIENTS, debug=0) + session = Session(secret=settings.SESSION_SECRET_KEY, storage=conn) +elif settings.SESSION_TYPE == "database": + from py4web.utils.dbstore import DBStore + + session = Session(secret=settings.SESSION_SECRET_KEY, storage=DBStore(db)) + +# ####################################################### +# Instantiate the object and actions that handle auth +# ####################################################### +auth = Auth(session, db, define_tables=False) +auth.use_username = True +auth.param.registration_requires_confirmation = settings.VERIFY_EMAIL +auth.param.registration_requires_approval = settings.REQUIRES_APPROVAL +auth.allowed_actions = ["all"] +auth.login_expiration_time = 3600 +auth.password_complexity = {"entropy": 50} +auth.block_previous_password_num = 3 +auth.define_tables() + +# ####################################################### +# Configure email sender for auth +# ####################################################### +if settings.SMTP_SERVER: + auth.sender = Mailer( + server=settings.SMTP_SERVER, + sender=settings.SMTP_SENDER, + login=settings.SMTP_LOGIN, + tls=settings.SMTP_TLS, + ssl=settings.SMTP_SSL, + ) + +# ####################################################### +# Create a table to tag users as group members +# ####################################################### +if auth.db: + groups = Tags(db.auth_user, "groups") + +# ####################################################### +# Enable authentication +# ####################################################### +auth.enable(uses=(session, T, db), env=dict(T=T)) + +# ####################################################### +# Define convenience decorators +# ####################################################### +unauthenticated = ActionFactory(db, session, T, flash, auth) +authenticated = ActionFactory(db, session, T, flash, auth.user) diff --git a/apps/showcase/examples/component_loader.py b/apps/showcase/examples/component_loader.py new file mode 100644 index 000000000..c96a2c1ba --- /dev/null +++ b/apps/showcase/examples/component_loader.py @@ -0,0 +1,28 @@ +from yatl.helpers import DIV + +from py4web import Field, action, request +from py4web.utils.form import Form + +from .common import flash + + +@action("mycomponent.load", method=["GET", "POST"]) +@action.uses(flash) +def mycomponent(): + # create a form object + form = Form([Field("your_name")]) + # if the form is not submmitted show a welcome flash message + if not request.forms: + flash.set("Welcome") + # if the form is submitted and accepted display another message + elif form.accepted: + flash.set("Welcome " + request.forms["your_name"]) + # return the form if it has not already been submitted and accepted + return DIV(form if not form.accepted else "done!").xml() + + +# a page that loads the above compnent via ajax +@action("component_loader") +@action.uses("examples/component_loader.html", flash) +def component_loader(): + return dict() diff --git a/apps/showcase/examples/count.py b/apps/showcase/examples/count.py new file mode 100644 index 000000000..ab1738dc4 --- /dev/null +++ b/apps/showcase/examples/count.py @@ -0,0 +1,16 @@ +import os + +from yatl.helpers import BODY, H1, HTML, A + +from py4web import URL, action + +from .common import T + + +@action("count") +@action("count/") +@action.uses(T) +def count(number=1): + message = T("Cat").format(n=number) + link = A(T("more"), _href=URL("count/%s" % (number + 1))) + return HTML(BODY(H1(message, " ", link))).xml() diff --git a/apps/showcase/examples/create_form.py b/apps/showcase/examples/create_form.py new file mode 100644 index 000000000..ddf552a2e --- /dev/null +++ b/apps/showcase/examples/create_form.py @@ -0,0 +1,16 @@ +import os + +from py4web import action +from py4web.utils.form import Form, FormStyleDefault + +from .common import T, session +from .models import db + + +# exposed as /examples/create_form or /examples/update_form/ +@action("create_form", method=["GET", "POST"]) +@action.uses("examples/form.html", db, session, T) +def create_form(): + form = Form(db.person, formstyle=FormStyleDefault) + rows = db(db.person).select() + return dict(form=form, rows=rows) diff --git a/apps/showcase/examples/custom_form.py b/apps/showcase/examples/custom_form.py new file mode 100644 index 000000000..73a977f4d --- /dev/null +++ b/apps/showcase/examples/custom_form.py @@ -0,0 +1,12 @@ +from py4web import action +from py4web.utils.form import Form, FormStyleDefault + +from .common import T, db, session + + +@action("custom_form", method=["GET", "POST"]) +@action.uses("examples/custom_form.html", db, session, T) +def custom_form(id=None): + form = Form(db.person, id, deletable=False, formstyle=FormStyleDefault) + rows = db(db.person).select() + return dict(form=form, rows=rows) diff --git a/apps/showcase/examples/example_ajax_grid.py b/apps/showcase/examples/example_ajax_grid.py new file mode 100644 index 000000000..bb40b55ad --- /dev/null +++ b/apps/showcase/examples/example_ajax_grid.py @@ -0,0 +1,13 @@ +from py4web import action +from py4web.utils.publisher import ALLOW_ALL_POLICY, Publisher + +from .common import db + +# exposes services necessary to access the db.thing via ajax +publisher = Publisher(db, policy=ALLOW_ALL_POLICY) + + +@action("example_ajax_grid") +@action.uses("examples/ajax_grid.html") +def example_ajax_grid(): + return dict(grid=publisher.grid(db.person)) diff --git a/apps/showcase/examples/example_helpers.py b/apps/showcase/examples/example_helpers.py new file mode 100644 index 000000000..1d149d9ab --- /dev/null +++ b/apps/showcase/examples/example_helpers.py @@ -0,0 +1,9 @@ +from yatl.helpers import H1, INPUT + +from py4web import action + + +@action("example_helpers") +@action.uses("examples/generic.html") +def example_helpers(): + return dict(a=H1("I am a title"), b=2, c=dict(d=3, e=4, x=INPUT(_name="test"))) diff --git a/apps/showcase/examples/example_html_grid.py b/apps/showcase/examples/example_html_grid.py new file mode 100644 index 000000000..9544fbd6f --- /dev/null +++ b/apps/showcase/examples/example_html_grid.py @@ -0,0 +1,56 @@ +from yatl.helpers import A, I + +from py4web import URL, action, redirect +from py4web.utils.form import FormStyleDefault +from py4web.utils.grid import Column, Grid, GridClassStyle, IconStyleFontawsome + +from .common import T, auth, db, session + + +@action("example_html_grid") +def example_html_grid(): + redirect(URL("example_html_grid/select")) + + +@action("example_html_grid/", method=["POST", "GET"]) +@action.uses("examples/html_grid.html", session, db, auth, T) +def example_html_grid(path=None): + # controllers and used for all grids in the app + grid_param = dict( + rows_per_page=5, + include_action_button_text=True, + search_button_text="Filter", + formstyle=FormStyleDefault, + grid_class_style=GridClassStyle, + icon_style=IconStyleFontawsome, + ) + + search_queries = [ + ["By Name", lambda value: db.thing.name.contains(value)], + ["By Color", lambda value: db.thing.color == value], + [ + "By Name or Color", + lambda value: db.thing.name.contains(value) | (db.thing.color == value), + ], + ] + + query = db.thing.id > 0 + orderby = [db.thing.name] + columns = [field for field in db.thing if field.readable] + columns.insert(0, Column("Custom", lambda row: A("click me"))) + grid = Grid( + path, + query, + columns=columns, + search_queries=search_queries, + orderby=orderby, + show_id=False, + T=T, + **grid_param, + ) + + grid.columns[3].represent = lambda row: I( + _class="fa fa-circle", _style="color:" + row.color + ) + + return dict(grid=grid) diff --git a/apps/showcase/examples/example_multiple_forms.py b/apps/showcase/examples/example_multiple_forms.py new file mode 100644 index 000000000..96d4744af --- /dev/null +++ b/apps/showcase/examples/example_multiple_forms.py @@ -0,0 +1,60 @@ +from pydal.validators import IS_IN_DB, IS_IN_SET, IS_INT_IN_RANGE, IS_NOT_EMPTY + +from py4web import Field, action +from py4web.utils.form import Form, FormStyleDefault + +from .common import T, db, flash, session + + +@action("example_multiple_forms", method=["GET", "POST"]) +@action.uses("examples/forms.html", session, db, T) +def example_multiple_forms(): + name = Field("name", requires=IS_NOT_EMPTY()) + forms = [ + Form( + [Field("name", requires=IS_NOT_EMPTY())], + form_name="1", + formstyle=FormStyleDefault, + ), + Form( + [Field("name", requires=IS_NOT_EMPTY())], + form_name="2", + keep_values=True, + formstyle=FormStyleDefault, + ), + Form( + [Field("name", requires=IS_NOT_EMPTY()), Field("age", "integer")], + form_name="3", + formstyle=FormStyleDefault, + ), + Form( + [Field("name", requires=IS_NOT_EMPTY()), Field("insane", "boolean")], + form_name="4", + formstyle=FormStyleDefault, + ), + Form( + [ + Field("name", requires=IS_NOT_EMPTY()), + Field("color", requires=IS_IN_SET(["red", "blue", "green"])), + ], + form_name="5", + formstyle=FormStyleDefault, + ), + Form( + [ + Field("name", requires=IS_NOT_EMPTY()), + Field( + "favorite_hero", requires=IS_IN_DB(db, "person.id", "person.name") + ), + ], + form_name="6", + formstyle=FormStyleDefault, + ), + ] + messages = [] + for form in forms: + if form.accepted: + messages.append("form %s accepted with: %s " % (form.form_name, form.vars)) + elif form.errors: + messages.append("form %s has errors: %s " % (form.form_name, form.errors)) + return dict(forms=forms, messages=messages) diff --git a/apps/showcase/examples/flash_example_fixture.py b/apps/showcase/examples/flash_example_fixture.py new file mode 100644 index 000000000..1a38c0502 --- /dev/null +++ b/apps/showcase/examples/flash_example_fixture.py @@ -0,0 +1,16 @@ +from py4web import action, redirect + +from .common import flash, session + + +@action("flash_example_fixture") +@action.uses(flash) +def flash_example_fixture(): + flash.set("you have been redirected ", sanitize=True) + redirect("flash_next") + + +@action("flash_next") +@action.uses("examples/flash_example_next.html", flash) +def flash_example_next(): + return dict() diff --git a/apps/showcase/examples/flash_example_naive.py b/apps/showcase/examples/flash_example_naive.py new file mode 100644 index 000000000..9832b67fa --- /dev/null +++ b/apps/showcase/examples/flash_example_naive.py @@ -0,0 +1,9 @@ +from py4web import action + +from .common import flash, session + + +@action("flash_example_naive") +@action.uses("examples/flash_example.html") +def flash_example_naive(): + return dict(flash={"message": "hello", "class": "error"}) diff --git a/apps/showcase/examples/hcaptcha_form.py b/apps/showcase/examples/hcaptcha_form.py new file mode 100644 index 000000000..74dc68daa --- /dev/null +++ b/apps/showcase/examples/hcaptcha_form.py @@ -0,0 +1,59 @@ +import requests +from yatl.helpers import XML + +from py4web import Field, action, request +from py4web.utils.form import Form + +from .common import session +from .settings import (HCAPTCHA_SECRET_KEY, HCAPTCHA_SITE_KEY, + HCAPTCHA_VERIFY_URL) + + +def hCaptcha(token): + + # Retrieve token from post data with key 'h-captcha-response'. + + # Build payload with secret key and token. + data = {"secret": HCAPTCHA_SECRET_KEY, "response": token} + + # Make POST request with data payload to hCaptcha API endpoint. + response = requests.post(url=HCAPTCHA_VERIFY_URL, data=data) + + # Parse JSON from response. Check for success or error codes. + response_json = response.json() + success = response_json["success"] + + return success + + +@action("hcaptcha_form") +@action.uses("examples/hcaptcha_form.html", session) +def hcaptcha_form(): + + form = Form( + [ + Field( + "dummy_form", + "string", + ) + ] + ) + + form.structure.append( + XML('
    '.format(HCAPTCHA_SITE_KEY)) + ) + if form.accepted: + r = hCaptcha(request.forms.get("g-recaptcha-response")) + if r == True: + # do something with form data + form.structure.append( + XML( + '
    Captcha was solved succesfully!
    ' + ) + ) + else: + form.structure.append( + XML('
    invalid captcha
    ') + ) + + return dict(form=form) diff --git a/apps/showcase/examples/hello.py b/apps/showcase/examples/hello.py new file mode 100644 index 000000000..66db64a18 --- /dev/null +++ b/apps/showcase/examples/hello.py @@ -0,0 +1,9 @@ +from py4web import action + +from .common import T + + +@action("hello") +@action.uses(T) +def hello(): + return str(T("Hello World")) diff --git a/apps/showcase/examples/hello_world.py b/apps/showcase/examples/hello_world.py new file mode 100644 index 000000000..a6728c9f6 --- /dev/null +++ b/apps/showcase/examples/hello_world.py @@ -0,0 +1,6 @@ +from .common import unauthenticated + + +@unauthenticated.get() # exposed as /hello_world +def hello_world(): + return dict() diff --git a/apps/showcase/examples/hello_world_msg.py b/apps/showcase/examples/hello_world_msg.py new file mode 100644 index 000000000..f88a79967 --- /dev/null +++ b/apps/showcase/examples/hello_world_msg.py @@ -0,0 +1,6 @@ +from .common import unauthenticated + + +@unauthenticated.get() # exposed as /hello_world/ +def hello_world_msg(msg): + return dict(msg=msg) diff --git a/apps/showcase/examples/models.py b/apps/showcase/examples/models.py new file mode 100644 index 000000000..519bfb7bc --- /dev/null +++ b/apps/showcase/examples/models.py @@ -0,0 +1,86 @@ +""" +This file defines the database models +""" +import datetime + +from pydal.validators import * +from pydal.validators import IS_DATETIME, ValidationError + +from py4web.utils.populate import populate + +from .common import Field, T, auth, db + +# simple table example +db.define_table( + "person", + Field("name", requires=IS_NOT_IN_DB(db, "person.name"), label=T("name")), + Field("job", requires=IS_NOT_EMPTY(), label=T("job")), + format="%(name)s", +) + +# simple reference example +db.define_table( + "superhero", + Field("name", requires=IS_NOT_IN_DB(db, "superhero.name")), + Field("real_identity", "reference person"), + format="%(name)s", +) + +db.define_table("superpower", Field("description"), format="%(description)s") + +# many to many example +db.define_table( + "tag", + Field("superhero", "reference superhero"), + Field("superpower", "reference superpower"), + Field("strength", "integer"), +) + +if not db(db.person).count(): + db.person.insert( + name="Clark Kent", + job="Journalist", + ) + db.person.insert(name="Peter Park", job="Photographer") + db.person.insert(name="Bruce Wayne", job="CEO") + db.superhero.insert(name="Superman", real_identity=1) + db.superhero.insert(name="Spiderman", real_identity=2) + db.superhero.insert(name="Batman", real_identity=3) + db.superpower.insert(description="Flight") + db.superpower.insert(description="Strength") + db.superpower.insert(description="Speed") + db.superpower.insert(description="Durability") + db.tag.insert(superhero=1, superpower=1, strength=100) + db.tag.insert(superhero=1, superpower=2, strength=100) + db.tag.insert(superhero=1, superpower=3, strength=100) + db.tag.insert(superhero=1, superpower=4, strength=100) + db.tag.insert(superhero=2, superpower=2, strength=50) + db.tag.insert(superhero=2, superpower=3, strength=75) + db.tag.insert(superhero=2, superpower=4, strength=10) + db.tag.insert(superhero=3, superpower=2, strength=80) + db.tag.insert(superhero=3, superpower=3, strength=20) + db.tag.insert(superhero=3, superpower=4, strength=70) + +# Used for examples of forms. +def get_user_email(): + return None if auth.current_user is None else auth.current_user.get("email") + + +def get_time(): + return datetime.datetime.utcnow() + + +db.define_table( + "thing", + Field("name", required=True), + Field("color", options=("red", "green", "blue")), + Field("is_ready", "boolean"), + Field("time_created", "time"), + Field("date_created", "date"), + Field("timetime_created", "datetime"), +) + +if db(db.thing).isempty(): + populate(db.thing, 100) + +db.commit() diff --git a/apps/showcase/examples/page_with_error.py b/apps/showcase/examples/page_with_error.py new file mode 100644 index 000000000..d875eb685 --- /dev/null +++ b/apps/showcase/examples/page_with_error.py @@ -0,0 +1,6 @@ +from py4web import action + + +@action("page_with_error") +def page_with_error(): + 1 / 0 diff --git a/apps/showcase/examples/page_with_parameters.py b/apps/showcase/examples/page_with_parameters.py new file mode 100644 index 000000000..529abf4c8 --- /dev/null +++ b/apps/showcase/examples/page_with_parameters.py @@ -0,0 +1,11 @@ +from py4web import URL, action, redirect + + +@action("page_with_parameters") +def page_with_parameters(): + return redirect(URL("page_with_parameters/a/b/c")) + + +@action("page_with_parameters///") +def page_with_parameters(x, y, z): + return repr({"x": x, "y": y, "z": z}) diff --git a/apps/showcase/examples/page_with_postback.py b/apps/showcase/examples/page_with_postback.py new file mode 100644 index 000000000..b19554250 --- /dev/null +++ b/apps/showcase/examples/page_with_postback.py @@ -0,0 +1,11 @@ +from py4web import URL, action, request + + +@action("page_with_postback", method=["GET", "POST"]) +def page_with_postback(): + return ( + "
    %s
    " + + '
    ' + + '' + + "
    " + ) % (dict(request.forms), URL("page_with_postback")) diff --git a/apps/showcase/examples/page_with_query.py b/apps/showcase/examples/page_with_query.py new file mode 100644 index 000000000..44b508b9c --- /dev/null +++ b/apps/showcase/examples/page_with_query.py @@ -0,0 +1,8 @@ +from py4web import URL, action, redirect, request + + +@action("page_with_query") +def page_with_query(): + if not request.query: + redirect(URL("page_with_query", vars=dict(x=1, y=2))) + return repr(dict(request.query)) diff --git a/apps/showcase/examples/page_with_raise.py b/apps/showcase/examples/page_with_raise.py new file mode 100644 index 000000000..6355e2f29 --- /dev/null +++ b/apps/showcase/examples/page_with_raise.py @@ -0,0 +1,6 @@ +from py4web import HTTP, action + + +@action("page_with_raise") +def page_with_raise(): + raise HTTP(400, "oops") diff --git a/apps/showcase/examples/page_with_redirect.py b/apps/showcase/examples/page_with_redirect.py new file mode 100644 index 000000000..337f41bd8 --- /dev/null +++ b/apps/showcase/examples/page_with_redirect.py @@ -0,0 +1,11 @@ +from py4web import URL, action, redirect + + +@action("page_with_redirect") +def page_with_redirect(): + redirect(URL("target")) + + +@action("target") +def target(): + return "target" diff --git a/apps/showcase/examples/page_with_tailwindcss.py b/apps/showcase/examples/page_with_tailwindcss.py new file mode 100644 index 000000000..b0f34045b --- /dev/null +++ b/apps/showcase/examples/page_with_tailwindcss.py @@ -0,0 +1,144 @@ +from py4web import action, Field +from py4web.utils.grid import Grid +from py4web.core import DAL +from .common import session + +# Import TailwindCSS for Grid and Form +from py4web.utils.form import FormStyleTailwind +from py4web.utils.grid import GridClassStyleTailwind + +# Define a persistent SQLite database +db = DAL("sqlite://storage_tailwindcss.sqlite") + +# Define the products table +def define_tables(): + # Only define if it doesn't exist + if not hasattr(db, 'products'): + db.define_table( + "products", + Field("name", "string"), + Field("category", "string"), + Field("price", "float"), + migrate=True + ) + return db.products + +# Initialize the products table +products = define_tables() + +def initialize_data(): + if db(db.products).select().first() is None: # Check if table is empty + db.products.bulk_insert([ + {'name': "Laptop", 'category': "Electronics", 'price': 999.99}, + {'name': "Desk Chair", 'category': "Furniture", 'price': 149.99}, + {'name': "Coffee Maker", 'category': "Appliances", 'price': 79.99} + ]) + db.commit() + +# Initialize data after table creation +initialize_data() + + +@action("page_with_tailwindcss", method=['POST', 'GET']) +@action('page_with_tailwindcss/', method=['POST', 'GET', 'DELETE']) +@action.uses("examples/page_with_tailwindcss.html", session, db) +def page_with_tailwindcss(path=None): + """Creates a simple Grid with TailwindCSS.""" + p = db.products + grid = Grid(path, + query=(p.id > 0), + columns=[p.name, p.category, p.price], + headings=["Name", "Category", "Price"], + search_queries=[ + ("Search by Name", lambda val: p.name.contains(val)), + ("Search by Category", lambda val: p.category.contains(val)), + ], + orderby=[p.name], + formstyle=FormStyleTailwind, + grid_class_style=GridClassStyleTailwind + ) + return dict(grid=grid) + +if False: + # How FormStyleTailwind and GridClassStyleTailwind are defined in py4web/utils/form.py and py4web/utils/grid.py + from py4web.utils.grid import GridClassStyle + from py4web.utils.form import FormStyleFactory + + FormStyleTailwind = FormStyleFactory() + FormStyleTailwind.classes.update( + { + "outer": "mb-4", + "inner": "w-full flex flex-col space-y-1", + "label": "block text-gray-700 font-medium", + "info": "text-gray-500 text-sm", + "error": "text-red-600 text-sm mt-1", + "submit": "px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition", + "input": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "input[type=text]": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "input[type=date]": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "input[type=time]": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "input[type=datetime-local]": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "input[type=radio]": "form-radio h-5 w-5 text-blue-600", + "input[type=checkbox]": "form-checkbox h-5 w-5 text-blue-600", + "input[type=submit]": "px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition", + "input[type=password]": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "input[type=file]": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm", + "select": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "textarea": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + } + ) + + FormStyleTailwind.class_inner_exceptions = {"select": "w-full"} + + class GridClassStyleTailwind(GridClassStyle): + classes = { + "grid-wrapper": "grid-wrapper space-y-4 bg-white shadow-md rounded-lg p-4", + "grid-header": "grid-header flex justify-between items-center pb-4 border-b border-gray-300", + "grid-new-button": "grid-new-button px-4 py-2 bg-green-500 text-white rounded hover:bg-green-600", + "grid-search": "grid-search flex items-center gap-2", + "grid-table-wrapper": "grid-table-wrapper overflow-x-auto", + "grid-table": "grid-table w-full border-collapse bg-white shadow-md rounded-lg overflow-hidden", + "grid-sorter-icon-up": "grid-sort-icon-up fas fa-sort-up text-gray-600", + "grid-sorter-icon-down": "grid-sort-icon-down fas fa-sort-down text-gray-600", + "grid-thead": "bg-gray-200 text-gray-700", + "grid-tr": "border-b border-gray-300", + "grid-th": "px-4 py-2 text-left font-semibold", + "grid-td": "px-4 py-2 text-gray-700", + "grid-td-buttons": "px-4 py-2 flex gap-2", + "grid-button": "px-3 py-1 bg-blue-500 text-white rounded hover:bg-blue-600 shadow", + "grid-details-button": "px-3 py-1 bg-gray-500 text-white rounded hover:bg-gray-600 shadow", + "grid-edit-button": "px-3 py-1 bg-yellow-500 text-white rounded hover:bg-yellow-600 shadow", + "grid-delete-button": "px-3 py-1 bg-red-500 text-white rounded hover:bg-red-600 shadow", + "grid-search-button": "px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition", + "grid-clear-button": "px-4 py-2 bg-gray-500 text-white rounded hover:bg-gray-600 transition", + "grid-footer": "grid-footer flex justify-between items-center pt-4 border-t border-gray-300", + "grid-info": "grid-info text-gray-600", + "grid-pagination": "grid-pagination flex gap-2", + "grid-pagination-button": "px-3 py-1 bg-gray-200 rounded hover:bg-gray-300", + "grid-pagination-button-current": "px-3 py-1 bg-blue-500 text-white rounded", + + # Cell styling + "grid-cell-type-string": "text-left", + "grid-cell-type-text": "text-left", + "grid-cell-type-boolean": "text-center", + "grid-cell-type-float": "text-right", + "grid-cell-type-decimal": "text-right", + "grid-cell-type-int": "text-right", + "grid-cell-type-date": "text-center", + "grid-cell-type-time": "text-center", + "grid-cell-type-datetime": "text-center", + "grid-cell-type-upload": "text-center", + "grid-cell-type-list": "text-left", + "grid-cell-type-id": "text-center", + + # Search form + "grid-search-form": "flex flex-wrap gap-2 items-center border p-2 rounded-lg bg-gray-100", + "grid-search-form-table": "w-full", + "grid-search-form-tr": "border-b border-gray-300", + "grid-search-form-td": "p-2", + "grid-search-form-input": "px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 w-full", + "grid-search-form-select": "px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 w-full", + "grid-search-boolean": "form-checkbox h-5 w-5 text-blue-600", + "grid-header-element": "px-3 py-1 bg-gray-500 text-white rounded hover:bg-gray-600", + "grid-footer-element": "px-3 py-1 bg-gray-500 text-white rounded hover:bg-gray-600", + } \ No newline at end of file diff --git a/apps/showcase/examples/page_with_template.py b/apps/showcase/examples/page_with_template.py new file mode 100644 index 000000000..b5afffadc --- /dev/null +++ b/apps/showcase/examples/page_with_template.py @@ -0,0 +1,7 @@ +from py4web import action + + +@action("page_with_template") +@action.uses("examples/page_with_template.html") +def page_with_template(): + return {"message": "Hello World"} diff --git a/apps/showcase/examples/page_without_template.py b/apps/showcase/examples/page_without_template.py new file mode 100644 index 000000000..f2920dcb8 --- /dev/null +++ b/apps/showcase/examples/page_without_template.py @@ -0,0 +1,6 @@ +from py4web import action + + +@action("page_without_template") +def page_without_template(): + return "ok" diff --git a/apps/showcase/examples/rest.py b/apps/showcase/examples/rest.py new file mode 100644 index 000000000..67f7988a7 --- /dev/null +++ b/apps/showcase/examples/rest.py @@ -0,0 +1,100 @@ +import json +import uuid + +from py4web.core import Fixture, action, request, response + +from .models import Field, db + +# for demo purposes we create a table of tokens +# in practice you want to link them to users +db.define_table("user_token", Field("token"), Field("user_id", db.auth_user)) + +# we also create a storage where to put raw data +# in practice you want to use something more structured +db.define_table("dummy", Field("token"), Field("name"), Field("raw", "json")) + + +# let's create a fixture to check auth token exists +def get_token(): + return request.headers.get("Authentication") + + +class AuthTokenVerify(Fixture): + def on_request(self, context): + # response.headers = "Content-Type: application/json" + token = get_token() + if not db(db.user_token.token == token).count(): + raise HTTP(401) + + +auth_token_verify = AuthTokenVerify() + +# put the id into the raw dict +def to_dict(item): + if not item or not item.raw: + return {} + raw = dict(item.raw) + raw["id"] = item.id + return raw + + +# return records filetered by name and token +def my_stuff(name): + return db(db.dummy.token == get_token())(db.dummy.name == name) + + +# select all records +@action("rest/", method="GET") +@action.uses(db, auth_token_verify) +def rest(name): + items = [to_dict(item) for item in my_stuff(name).select(cacheable=True)] + print(items) + return {"items": items} + + +# select one record +@action("rest//", method="GET") +@action.uses(db, auth_token_verify) +def rest(name, id): + token = request.headers.get("Authentication") + item = my_stuff(name)(db.dummy.id == id).select(cacheable=True).first() + return to_dict(item) + + +# create a record +@action("rest/", method="POST") +@action.uses(db, auth_token_verify) +def rest(name): + token = request.headers.get("Authentication") + id = db.dummy.insert(token=get_token(), name=name, raw=request.json) + return {"id": id} + + +# update a record +@action("rest//", method="PUT") +@action.uses(db, auth_token_verify) +def rest(name, id): + item = my_stuff(name)(db.dummy.id == id).select(cacheable=True).first() + if item: + raw = item.raw + raw.update(**request.json) + my_stuff(name)(db.dummy.id == id).update(raw=raw) + return to_dict(item) + + +# delete a record +@action("rest//", method="DELETE") +@action.uses(db, auth_token_verify) +def rest(name, id): + my_stuff(name)(db.dummy.id == id).delete() + return {} + + +@action("rest") +@action.uses("examples/rest_info.html", db) +def rest(): + new_token = str(uuid.uuid4()) + id = db.user_token.insert(token=new_token) + # expire old user tokens + db(db.user_token.id < max(1, id - 1000)).delete() + return dict(token=new_token) diff --git a/apps/showcase/examples/rpc.py b/apps/showcase/examples/rpc.py new file mode 100644 index 000000000..f662e5ebc --- /dev/null +++ b/apps/showcase/examples/rpc.py @@ -0,0 +1,28 @@ +import requests + +from py4web import action, request +from py4web.utils.jsonrpc import JsonRpc + + +# define a function you want to expose +def add(x, y): + return x + y + + +# register your functions +service = JsonRpc() +service.methods['add'] = add + + +# expose the server +@action("rpc", method=["GET", "POST"]) +def rpc(): + return service(request.query or request.json) + + +# example of a client +def example_jsonrpc(): + import jsonrpc.proxy + p = jsonrpc.proxy.JSONRPCProxy(URL('rpc')) + assert p.add(1,2) == 3 + assert p.add(x=1, y=2) == 3 diff --git a/apps/showcase/examples/session_clear.py b/apps/showcase/examples/session_clear.py new file mode 100644 index 000000000..6e2f1109f --- /dev/null +++ b/apps/showcase/examples/session_clear.py @@ -0,0 +1,10 @@ +from py4web import URL, action, redirect + +from .common import session + + +@action("session_clear") +@action.uses(session) +def session_clear(): + session.clear() + redirect(URL("session_counter")) diff --git a/apps/showcase/examples/session_counter.py b/apps/showcase/examples/session_counter.py new file mode 100644 index 000000000..f00f06dcb --- /dev/null +++ b/apps/showcase/examples/session_counter.py @@ -0,0 +1,10 @@ +from py4web import action + +from .common import session + + +@action("session_counter") +@action.uses("examples/session_counter.html", session) +def session_counter(): + session["counter"] = session.get("counter", 0) + 1 + return {"counter": session.get("counter")} diff --git a/apps/myfeed/settings.py b/apps/showcase/examples/settings.py similarity index 57% rename from apps/myfeed/settings.py rename to apps/showcase/examples/settings.py index 9c52a7880..deb0e3285 100644 --- a/apps/myfeed/settings.py +++ b/apps/showcase/examples/settings.py @@ -7,20 +7,29 @@ """ import os +MODE = os.environ.get("PY4WEB_DASHBOARD_MODE", "none") # db settings -APP_FOLDER = os.path.dirname(__file__) +APP_FOLDER = os.path.dirname(os.path.dirname(__file__)) APP_NAME = os.path.split(APP_FOLDER)[-1] # DB_FOLDER: Sets the place where migration files will be created # and is the store location for SQLite databases DB_FOLDER = os.path.join(APP_FOLDER, "databases") DB_URI = "sqlite://storage.db" DB_POOL_SIZE = 1 +DB_MIGRATE = MODE == "full" +DB_FAKE_MIGRATE = False # maybe? + +# location where to store uploaded files: +UPLOAD_FOLDER = os.path.join(APP_FOLDER, "uploads") # send email on regstration VERIFY_EMAIL = False -PASSWORD_COMPLEXITY = None + +# account requires to be approved ? +REQUIRES_APPROVAL = False # email settings +SMTP_SSL = False SMTP_SERVER = None SMTP_SENDER = "you@example.com" SMTP_LOGIN = "username:password" @@ -28,7 +37,7 @@ # session settings SESSION_TYPE = "cookies" -SESSION_SECRET_KEY = "" +SESSION_SECRET_KEY = None # or replace with your own secret MEMCACHE_CLIENTS = ["127.0.0.1:11211"] REDIS_SERVER = "localhost:6379" @@ -37,34 +46,11 @@ "warning:stdout" ] # syntax "severity:filename" filename can be stderr or stdout -# single sign on Google (will be used if provided) -OAUTH2GOOGLE_CLIENT_ID = None -OAUTH2GOOGLE_CLIENT_SECRET = None - -# single sign on Google (will be used if provided) -OAUTH2FACEBOOK_CLIENT_ID = None -OAUTH2FACEBOOK_CLIENT_SECRET = None - -# enable PAM -USE_PAM = False - -# enable LDAP -USE_LDAP = False -LDAP_SETTING = { - "mode": "ad", - "server": "my.domain.controller", - "base_dn": "ou=Users,dc=domain,dc=com", -} # i18n settings T_FOLDER = os.path.join(APP_FOLDER, "translations") -# Celery settings -USE_CELERY = False -CELERY_BROKER = "redis://localhost:6379/0" - -# try import private settings -try: - from .settings_private import * -except: - pass +## hcaptcha config +HCAPTCHA_SITE_KEY = "" +HCAPTCHA_SECRET_KEY = "" +HCAPTCHA_VERIFY_URL = "https://hcaptcha.com/siteverify" diff --git a/apps/showcase/examples/show_a_button.py b/apps/showcase/examples/show_a_button.py new file mode 100644 index 000000000..a99912479 --- /dev/null +++ b/apps/showcase/examples/show_a_button.py @@ -0,0 +1,13 @@ +import logging + +from .common import unauthenticated + + +@unauthenticated.callback("click me") +def a_callback(msg): + logging.info(msg) + + +@unauthenticated.get() +def show_a_button(): + return dict(mybutton=a_callback.button("clickme")(msg="hello world")) diff --git a/apps/showcase/examples/socketio.py b/apps/showcase/examples/socketio.py new file mode 100644 index 000000000..e41ff4698 --- /dev/null +++ b/apps/showcase/examples/socketio.py @@ -0,0 +1,20 @@ +from py4web import action, request + +# pls, run socketio server - look into py4web/utils/wsservers.py.txt +# test example for python-socketio +# +# sio examples https://github.com/ali96343/lvsio +# https://github.com/ali96343/capp + + +@action("socketio/index") +@action.uses("socketio/socketio_index.html") +def index(): + sio_url = "http://localhost:8000" + return dict(sio_url=sio_url) + + +@action("socketio/echo/", method=["GET", "POST"]) +def echo(path=None): + print(path) + print("GET from sio-server") diff --git a/apps/showcase/examples/tagsinput_form.py b/apps/showcase/examples/tagsinput_form.py new file mode 100644 index 000000000..ba85250aa --- /dev/null +++ b/apps/showcase/examples/tagsinput_form.py @@ -0,0 +1,11 @@ +from py4web import HTTP, URL, Field, abort, action, redirect, request +from py4web.utils.form import Form, FormStyleDefault + +from .common import session + + +@action("tagsinput_form", method=["GET", "POST"]) +@action.uses("examples/tagsinput_form.html", session) +def tagsinput_form(): + form = Form([Field("colors", "list:string")], keep_values=True) + return dict(form=form) diff --git a/apps/showcase/examples/test_expose.py b/apps/showcase/examples/test_expose.py new file mode 100644 index 000000000..244199937 --- /dev/null +++ b/apps/showcase/examples/test_expose.py @@ -0,0 +1,21 @@ +from py4web import action +from py4web.utils.factories import ActionFactory, Inject + +from .common import T, auth, db + +expose = ActionFactory(auth, T, Inject(message="Hello World")) + + +@expose.get("test_expose1", template="examples/generic.html") +def test_expose1(): + return dict() + + +@expose.get("test_expose2") +def test_expose2(): + return dict() + + +@expose("test_expose3") +def test_expose3(): + return dict() diff --git a/apps/showcase/examples/update_form.py b/apps/showcase/examples/update_form.py new file mode 100644 index 000000000..43fba7132 --- /dev/null +++ b/apps/showcase/examples/update_form.py @@ -0,0 +1,15 @@ +import os + +from py4web import action +from py4web.utils.form import Form, FormStyleDefault + +from .common import T, db, session + + +# exposed as /examples/create_form or /examples/update_form/ +@action("update_form/", method=["GET", "POST"]) +@action.uses("examples/form.html", db, session, T) +def update_form(id): + form = Form(db.person, id, deletable=False, formstyle=FormStyleDefault) + rows = db(db.person).select() + return dict(form=form, rows=rows) diff --git a/apps/showcase/examples/ws.py b/apps/showcase/examples/ws.py new file mode 100644 index 000000000..551a23960 --- /dev/null +++ b/apps/showcase/examples/ws.py @@ -0,0 +1,11 @@ +from py4web import action, request + +# pls, run websockets server - look into py4web/utils/wsservers.py.txt +# test example for websockets + + +@action("ws/index") +@action.uses("ws/ws_index.html") +def index(): + ws_url = "ws://127.0.0.1:8000/" + return dict(ws_url=ws_url) diff --git a/apps/examples/ws/test-websocket.py b/apps/showcase/examples/ws_client_example.py similarity index 80% rename from apps/examples/ws/test-websocket.py rename to apps/showcase/examples/ws_client_example.py index 90af958b0..8c6904f72 100755 --- a/apps/examples/ws/test-websocket.py +++ b/apps/showcase/examples/ws_client_example.py @@ -1,8 +1,7 @@ #!/usr/bin/env python from websocket import create_connection -#pip install websocket-client - +# pip install websocket-client def short_lived_connection(): @@ -12,10 +11,10 @@ def short_lived_connection(): ws.send("Hello, Server") print("Sent") print("Receiving...") - result = ws.recv() + result = ws.recv() print("Received '%s'" % result) ws.close() -if __name__ == '__main__': - short_lived_connection() +if __name__ == "__main__": + short_lived_connection() diff --git a/apps/examples/static/components-bulma/fileupload/fileupload.css b/apps/showcase/static/components-bulma/fileupload/fileupload.css similarity index 100% rename from apps/examples/static/components-bulma/fileupload/fileupload.css rename to apps/showcase/static/components-bulma/fileupload/fileupload.css diff --git a/apps/examples/static/components-bulma/fileupload/fileupload.html b/apps/showcase/static/components-bulma/fileupload/fileupload.html similarity index 100% rename from apps/examples/static/components-bulma/fileupload/fileupload.html rename to apps/showcase/static/components-bulma/fileupload/fileupload.html diff --git a/apps/examples/static/components-bulma/fileupload/fileupload.js b/apps/showcase/static/components-bulma/fileupload/fileupload.js similarity index 100% rename from apps/examples/static/components-bulma/fileupload/fileupload.js rename to apps/showcase/static/components-bulma/fileupload/fileupload.js diff --git a/apps/showcase/static/components-bulma/grid/grid.css b/apps/showcase/static/components-bulma/grid/grid.css new file mode 100644 index 000000000..de56c36c4 --- /dev/null +++ b/apps/showcase/static/components-bulma/grid/grid.css @@ -0,0 +1,28 @@ +.pagination .grid_page_number { + margin-right: 0.5em; + margin-left: 0.5em; +} +span.disabled { + color: lightgray; +} +th.clickable { + cursor: pointer; +} +.pagination { + direction: rtl; +} +.pagination-symbols { + direction: ltr; +} + +input.search { + width: 100%; +} + +.table.is-striped tr:nth-child(even) { + background-color: #fafafa; +} + +.table.is-striped tr:hover { + background-color: #faf7f0; +} \ No newline at end of file diff --git a/apps/showcase/static/components-bulma/grid/grid.html b/apps/showcase/static/components-bulma/grid/grid.html new file mode 100644 index 000000000..f0cbc225b --- /dev/null +++ b/apps/showcase/static/components-bulma/grid/grid.html @@ -0,0 +1,84 @@ +
    +
    + + + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    + + + + + + +
    + +
    +
    + No results. +
    +
    diff --git a/apps/examples/static/components-bulma/grid/grid.js b/apps/showcase/static/components-bulma/grid/grid.js similarity index 62% rename from apps/examples/static/components-bulma/grid/grid.js rename to apps/showcase/static/components-bulma/grid/grid.js index c0d871b53..9bce7ff52 100644 --- a/apps/examples/static/components-bulma/grid/grid.js +++ b/apps/showcase/static/components-bulma/grid/grid.js @@ -6,15 +6,21 @@ methods: {} }; + var delete_row_idx = null; + grid.data = function() { var data = { server_url: this.url, has_previous: false, has_more: false, + has_search: false, + has_delete: false, search_placeholder: '', search_text: '', page: 1, rows: [], + confirm_delete_text: '', + confirm_delete_active: false, }; grid.methods.load.call(data); return data; @@ -26,6 +32,29 @@ a.map(function(e) {e._idx = k++;}); }; + grid.transform_time_and_date = function (c) { + // Transforms dates and times to present them well. + // Times are also put into localtimes. + if (c.text === null) { + c.text = ""; + } else { + if (c.type === 'date') { + let m = luxon.DateTime.fromISO(c.text, {zone: "UTC"}); + c.text = m.toLocaleString(luxon.DateTime.DATE_HUGE); + } + if (c.type === 'datetime') { + let m = luxon.DateTime.fromISO(c.text, {zone: "UTC"}); + let local_m = m.setZone(self.time_zone); + c.text = local_m.toLocaleString({ + year: "numeric", month: "long", + day: "numeric", weekday: "long", + hour: "numeric", minute: "numeric", + timeZoneName: "short", + }); + } + } + } + grid.methods.do_search = function () { let self = this; self.page = 1; // Restart from page 1 for every search. @@ -68,6 +97,31 @@ self.load(); } + grid.methods.delete_row = function (row_idx) { + let self = this; + delete_row_idx = row_idx; + self.confirm_delete_text = self.rows[row_idx].confirm; + self.confirm_delete_active = true; + }; + + grid.methods.delete_cancel = function () { + let self = this; + delete_row_idx = null; + self.confirm_delete_active = false; + self.confirm_delete_text = ''; + }; + + grid.methods.delete_confirm = function () { + let self = this; + let row = self.rows[delete_row_idx]; + axios.get(row.delete).then(function () { + self.rows.splice(delete_row_idx, 1); + self.delete_cancel(); + }).catch(function () { + self.delete_cancel(); + }) + }; + grid.methods.load = function () { // In use, self will correspond to the data of the table, // as this is called via grid.methods.load @@ -81,8 +135,10 @@ page: self.page, q: self.search_text, sort_order: sort_order, - }}).then(function(res) { + }}).then(function (res) { self.page = res.data.page; + self.has_search = res.data.has_search; + self.has_delete = res.data.has_delete; self.has_more = res.data.has_more; self.has_previous = self.page > 1; self.search_placeholder = res.data.search_placeholder; @@ -91,6 +147,7 @@ for (let r of rows) { grid.enumerate(r.cells); for (let c of r.cells) { + grid.transform_time_and_date(c); if (!c.sort) { // Note that on purpose, we can have sorted fields // that are not sortable via a UI click. diff --git a/apps/examples/static/components-bulma/vueform/luxon.js b/apps/showcase/static/components-bulma/grid/luxon.js similarity index 100% rename from apps/examples/static/components-bulma/vueform/luxon.js rename to apps/showcase/static/components-bulma/grid/luxon.js diff --git a/apps/examples/static/components/mtable.html b/apps/showcase/static/components-bulma/mtable.html similarity index 58% rename from apps/examples/static/components/mtable.html rename to apps/showcase/static/components-bulma/mtable.html index dfa399306..5a69f5455 100644 --- a/apps/examples/static/components/mtable.html +++ b/apps/showcase/static/components-bulma/mtable.html @@ -2,7 +2,7 @@ @@ -65,8 +77,8 @@ @@ -77,10 +89,15 @@ [{{item[field.name]}}] {{item[field.name]}} + (json){{item[field.name]}} + {{item[field.name]}}{{item[field.name]}} + {{item[field.name]}}{{item[field.name]}}{{item[field.name]}} + {{JSON.stringify(item[field.name])}} + {{JSON.stringify(item[field.name])}}{{(item[field.name]||'').replace('T','@').substr(0,16)}}{{item[field.name]}} @@ -94,7 +111,7 @@ -
    - + @@ -24,21 +24,33 @@
    {{field.label}} - - + + True False None - - - - - - + + + + + + + + + + + + +
    {{errors[field.name]}}
    {{field.label}} - - + +
    +
    diff --git a/apps/examples/static/components/mtable.js b/apps/showcase/static/components-bulma/mtable.js similarity index 53% rename from apps/examples/static/components/mtable.js rename to apps/showcase/static/components-bulma/mtable.js index 697c0e301..7a42bb508 100644 --- a/apps/examples/static/components/mtable.js +++ b/apps/showcase/static/components-bulma/mtable.js @@ -2,15 +2,18 @@ var mtable = { props: ['url', 'filter', 'order', 'editable', 'create', 'deletable', 'render'], data: null, methods: {}}; - mtable.data = function() { - var data = {mtUrl: this.url, + mtable.data = function() { + var data = {url: this.url, busy: false, - mtFilter: this.filter || '', - mtOrder: this.order || '', + filter: this.filter || '', + order: this.order || '', errors: {}, item: null, message: '', - table: { model: [], items: [], count: 0}}; + reference_options: {}, + table: { model: [], items: [], count: 0}, + string_values: {} + }; mtable.methods.load.call(data); return data; }; @@ -21,9 +24,9 @@ mtable.methods.load = function() { let self = this; let length = this.table.items.length; - let url = this.mtUrl + '?@limit=20'; + let url = this.url + '?@limit=20'; if (length) url+='&@offset='+length; else url+='&@model=true'; - let filters = self.mtFilter.split(' and ').filter((f)=>{return f.trim() != ''}); + let filters = self.filter.split(' and ').filter((f)=>{return f.trim() != ''}); filters = filters.filter((f)=>{return f.trim();}).map((f)=>{ let parts = (f .replace(/ equals? /,'==') @@ -47,19 +50,19 @@ '=' + parts[parts.length-1].replace(/^ /,'')); }); if (filters.length) url += '&'+filters.join('&'); - if (self.mtOrder) url += '&@order='+self.mtOrder; + if (self.order) url += '&@order='+self.order; self.busy = true; - axios.get(url).then(function (res) { + Q.get(url).then(function (res) { self.busy = false; - if(!length) self.table = res.data; - else self.table.items = self.table.items.concat(res.data.items); + if(!length) self.table = res.json(); + else self.table.items = self.table.items.concat(res.json().items); }); }; mtable.methods.reorder = function (field) { - if (this.mtOrder == '~' + field.name) this.mtOrder = null; - else if (this.mtOrder == field.name) this.mtOrder = '~'+field.name; - else this.mtOrder = field.name; + if (this.order == '~' + field.name) this.order = null; + else if (this.order == field.name) this.order = '~'+field.name; + else this.order = field.name; this.table.items = []; this.load(); }; @@ -72,55 +75,106 @@ mtable.methods.open_create = function () { this.item = {}; - for(var field in this.model) this.item[field.name] = field.default||''; + this.prepare_fields(this.item); }; - + mtable.methods.open_edit = function (item) { this.item = {}; this.item = item; + this.prepare_fields(this.item); }; - + + mtable.methods.prepare_fields = function(item){ + let self = this; + for(var field of this.table.model){ + if(field.type == "list:string" || field.type == "list:integer" || field.type.substr(0,14) == "list:reference"){ + self.string_values[field.name] = JSON.stringify(item[field.name]); + } else if (field.type == "datetime") { + output = field.default != null ? field.default : ''; + output = output.split('.')[0]; + Vue.set(this.item, field.name, output); + } else if(field.type == "reference"){ + if (!(field.references in this.reference_options)){ + Vue.set(this.reference_options, field.references, []); + let reference_table_url = self.url.split('/'); + reference_table_url.pop() + reference_table_url.push(field.references) + reference_table_url = reference_table_url.join('/') + '?@options_list=true'; + Q.get(reference_table_url).then(function (res) { + let url_components = res.json().config.url.split('?')[0].split('/'); + self.reference_options[url_components[url_components.length - 1 ]] = res.data.items; + }); + + } + } + } + this.$nextTick(function(){ + Q("input[type=text].type-list-string,input[type=text].type-list-integer,input[type=text].type-list-reference").forEach( + function(elem){Q.tags_input(elem); + }); + }); + }; + + mtable.methods.parse_and_validate_json = function(event){ + try { + event.target.style.borderColor = ""; + return JSON.parse(event.target.value); + } + catch (error) { + event.target.style.borderColor = "#ff0000"; + } + } + mtable.methods.trash = function (item) { if (window.confirm("Really delete record?")) { - let url = this.mtUrl + '/' + item.id; + let url = this.url + '/' + item.id; this.table.items = this.table.items.filter((i)=>{return i.id != item.id;}); - axios.delete(url); + Q.delete(url); if (item==this.item) this.item = null; } }; mtable.methods.save = function (item) { - let url = this.mtUrl; + let url = this.url; self.busy = true; + for(var field of this.table.model) { + var is_list_integer = field.type == "list:integer" || field.type.substr(0,14) == "list:reference"; + if(field.type == "list:string" || is_list_integer) { + try { + item[field.name] = JSON.parse(this.string_values[field.name]); + } catch(err) { + alert("Invalid field value: " + field.name); + break; + } + } + } if (item.id) { url += '/' + item.id; - axios.put(url, item).then(mtable.handle_response('put', this), - mtable.handle_response('put', this)); + var data = JSON.parse(JSON.stringify(item)); + delete data["id"]; + Q.put(url, data).then(mtable.handle_response('put', this), + mtable.handle_response('put', this)); } else { - axios.post(url, item).then(mtable.handle_response('post', this), - mtable.handle_response('post', this)); - } + Q.post(url, item).then(mtable.handle_response('post', this), + mtable.handle_response('post', this)); + } }; mtable.handle_response = function(method, data) { self.busy = false; return function(res) { - if (res.response) res = res.response; // deal with error weirdness + res = res.json(); if (method == 'post') { data.table.items = []; - console.log(data); mtable.methods.load.call(data); } - console.log('a'); - console.log(res); - if (res.data.status == 'success') { + if (res.status == 'success') { data.clear(); + location.reload(); } else { - console.log('b') - data.errors = res.data.errors; - data.message = res.data.message; + data.errors = res.errors; + data.message = res.message; } - console.log('c'); }; }; @@ -155,8 +209,8 @@ var scripts = document.getElementsByTagName('script'); var src = scripts[scripts.length-1].src; var path = src.substr(0, src.length-3) + '.html'; - Q.register_vue_component('mtable', path, function(template) { - mtable.template = template.data; - return mtable; - }); + Q.register_vue_component('mtable', path, function(template) { + mtable.template = template.data; + return mtable; + }); })(); diff --git a/apps/showcase/static/components-bulma/starrater/starrater.css b/apps/showcase/static/components-bulma/starrater/starrater.css new file mode 100644 index 000000000..e69de29bb diff --git a/apps/examples/static/components-bulma/starrater/starrater.html b/apps/showcase/static/components-bulma/starrater/starrater.html similarity index 100% rename from apps/examples/static/components-bulma/starrater/starrater.html rename to apps/showcase/static/components-bulma/starrater/starrater.html diff --git a/apps/examples/static/components-bulma/starrater/starrater.js b/apps/showcase/static/components-bulma/starrater/starrater.js similarity index 100% rename from apps/examples/static/components-bulma/starrater/starrater.js rename to apps/showcase/static/components-bulma/starrater/starrater.js diff --git a/apps/examples/static/components/vueform/luxon.js b/apps/showcase/static/components-bulma/vueform/luxon.js similarity index 100% rename from apps/examples/static/components/vueform/luxon.js rename to apps/showcase/static/components-bulma/vueform/luxon.js diff --git a/apps/examples/static/components-bulma/vueform/luxon.min.js b/apps/showcase/static/components-bulma/vueform/luxon.min.js similarity index 100% rename from apps/examples/static/components-bulma/vueform/luxon.min.js rename to apps/showcase/static/components-bulma/vueform/luxon.min.js diff --git a/apps/examples/static/components-bulma/vueform/vueform.css b/apps/showcase/static/components-bulma/vueform/vueform.css similarity index 100% rename from apps/examples/static/components-bulma/vueform/vueform.css rename to apps/showcase/static/components-bulma/vueform/vueform.css diff --git a/apps/examples/static/components-bulma/vueform/vueform.html b/apps/showcase/static/components-bulma/vueform/vueform.html similarity index 59% rename from apps/examples/static/components-bulma/vueform/vueform.html rename to apps/showcase/static/components-bulma/vueform/vueform.html index fd8de43ac..c9aa0dffa 100644 --- a/apps/examples/static/components-bulma/vueform/vueform.html +++ b/apps/showcase/static/components-bulma/vueform/vueform.html @@ -14,24 +14,38 @@
    + type="text" v-model="field.time" @change="set_readable_date(field._idx)"> Timezone: {{time_zone}}
    + +
    + + +
    + readonly class="input is-static" v-model="field.text">
    - + - + Yes + No + None +

    +
    - +

    Please fix the above errors

    + +
    diff --git a/apps/showcase/static/components-bulma/vueform/vueform.js b/apps/showcase/static/components-bulma/vueform/vueform.js new file mode 100644 index 000000000..4088bc1fb --- /dev/null +++ b/apps/showcase/static/components-bulma/vueform/vueform.js @@ -0,0 +1,225 @@ +(function(){ + + var form = { + props: ['url', 'check_url', 'cancel_url'], + data: null, + readonly: false, + methods: {}, + computed: {some_error: has_some_error} + }; + + form.data = function() { + var data = { + server_url: this.url, + validation_url: this.check_url, + cancel_url_: this.cancel_url, + fields: [], + readonly: false, + time_offset: luxon.DateTime.local().offsetNameShort, + time_zone: luxon.DateTime.local().zoneName, + }; + form.methods.load.call(data); + return data; + }; + + form.decorate = function (a) { + let k=0; + a.map(function(e) { + e._idx = k++; + e._modified = false; + }); + }; + + form.methods.load = function () { + // This method loads the structure and values for the form. + let self = this; + axios.get(self.server_url, {params: {page: self.page}}) + .then(function(res) { + set_results(self, res); + }) + }; + + form.methods.cancel = function () { + let self = this; + if (self.cancel_url_) { + window.location = self.cancel_url_; + } + } + + function set_results(self, res) { + // This either sets new values (including errors) for the form, + // or it implements the redirection that one may wish after the post. + if (res.data.redirect_url) { + window.location = res.data.redirect_url; + } else { + self.fields = preprocess_fields(self, res.data.fields); + console.log("Set fields:", self.fields); + self.readonly = res.data.readonly; + form.decorate(self.fields); + } + } + + function preprocess_fields(self, fields) { + // Preprocesses the fields. + for (let f of fields) { + f.readonly = !f.writable; + if (f.type === 'datetime') { + if (f.value === null) { + f.time = null; + f.date = null; + f.date_readonly = null; + f.datetime_readonly = null; + } else { + console.log("converting time", f.value) + let m = luxon.DateTime.fromISO(f.value, {zone: "UTC"}); + console.log("parsed:", m); + let local_m = m.setZone(self.time_zone); + f.date = local_m.toFormat("y-MM-dd"); + f.time = local_m.toLocaleString(luxon.DateTime.TIME_SIMPLE); + f.date_readonly = local_m.toLocaleString(luxon.DateTime.DATETIME_HUGE); + f.datetime_readonly = local_m.toLocaleString({ + year: "numeric", month: "long", + day: "numeric", weekday: "long", + hour: "numeric", minute: "numeric", + timeZoneName: "short", + }); + } + } + if (f.type === 'date') { + if (f.value == null) { + f.date = null; + f.date_readonly = null; + } else { + let m = luxon.DateTime.fromISO(f.value, {zone: "UTC"}); + f.date = m.toFormat("y-MM-dd"); + f.date_readonly = m.toLocaleString(luxon.DateTime.DATE_HUGE); + } + } + if (f.type === 'dropdown' && f.readonly) { + f.text = ''; + for (let labtext of f.values) { + if (labtext.label === f.value) { + f.text = labtext.text; + } + } + } + } + return fields; + } + + function has_some_error() { + let self = this; + for (let field of self.fields) { + if (field.error) { + return true; + } + } + return false; + } + + function get_datetime_luxon(field) { + let field_date = ""; + let field_time = ""; + if (field.date !== null) { + field_date = field.date; + } + if (field.time !== null) { + field_time = field.time; + } + console.log("Getting date of:", field_date + " " + field_time); + let d = Sugar.Date(field_date + " " + field_time); + return luxon.DateTime.fromISO(d.raw.toISOString()); + } + + function get_datetime_field_value(field) { + let local_t = get_datetime_luxon(field); + let utc_t = local_t.setZone("utc"); + return utc_t.toISO(); + } + + function get_date_field_value(field) { + // Parses the date, and puts it into the field value. + let d = Sugar.Date(field.value); + return Sugar.Date.format(d, "%Y-%m-%d"); + } + + function get_field_value(field) { + if (field.type === "datetime") { + return get_datetime_field_value(field); + } else if (field.type === "date") { + return get_date_field_value(field); + } else { + return field.value; + } + } + + form.methods.submit = function () { + let self = this; + let d = {}; + let ok = true; + for (let field of self.fields) { + try { + d[field.name] = get_field_value(field); + } catch (e) { + field.error = "Invalid format"; + ok = false; + } + } + if (ok) { + console.log("Posting:", d); + axios.post(self.server_url, d).then(function (res) { + set_results(self, res); + }); + } + }; + + form.methods.mark_field = function (field_idx) { + let self = this; + let field = self.fields[field_idx]; + field._modified = true; + }; + + form.methods.set_readable_date = function(field_idx) { + let self = this; + let field = self.fields[field_idx]; + if (field.type === 'datetime') { + try { + local_m = get_datetime_luxon(field); + field.date_readonly = local_m.toLocaleString(luxon.DateTime.DATETIME_HUGE); + } catch (e) { + field.date_readonly = ""; + } + } + }; + + form.methods.validate_field = function (field_idx) { + let self = this; + let field = self.fields[field_idx]; + if (field._modified) { + // Gets a parsed value, so we fix the presentation of dates. + let obtained = false; + let parsed_value = null; + try { + parsed_value = get_field_value(field); + obtained = true; + } catch (e) { + field.error = "Invalid format"; + } + if (obtained) { + field._modified = false; + axios.post(self.validation_url, { + name: field.name, + value: parsed_value, + }).then(function (res) { + field.error = res.data.error; + }); + } + } + }; + + Q.register_vue_component('vueform', 'components-bulma/vueform/vueform.html', + function(template) { + form.template = template.data; + return form; + }); +})(); diff --git a/apps/examples/static/components/fileupload/fileupload.css b/apps/showcase/static/components/fileupload/fileupload.css similarity index 100% rename from apps/examples/static/components/fileupload/fileupload.css rename to apps/showcase/static/components/fileupload/fileupload.css diff --git a/apps/examples/static/components/fileupload/fileupload.html b/apps/showcase/static/components/fileupload/fileupload.html similarity index 100% rename from apps/examples/static/components/fileupload/fileupload.html rename to apps/showcase/static/components/fileupload/fileupload.html diff --git a/apps/examples/static/components/fileupload/fileupload.js b/apps/showcase/static/components/fileupload/fileupload.js similarity index 100% rename from apps/examples/static/components/fileupload/fileupload.js rename to apps/showcase/static/components/fileupload/fileupload.js diff --git a/apps/showcase/static/components/grid/grid.css b/apps/showcase/static/components/grid/grid.css new file mode 100644 index 000000000..de56c36c4 --- /dev/null +++ b/apps/showcase/static/components/grid/grid.css @@ -0,0 +1,28 @@ +.pagination .grid_page_number { + margin-right: 0.5em; + margin-left: 0.5em; +} +span.disabled { + color: lightgray; +} +th.clickable { + cursor: pointer; +} +.pagination { + direction: rtl; +} +.pagination-symbols { + direction: ltr; +} + +input.search { + width: 100%; +} + +.table.is-striped tr:nth-child(even) { + background-color: #fafafa; +} + +.table.is-striped tr:hover { + background-color: #faf7f0; +} \ No newline at end of file diff --git a/apps/examples/static/components-bulma/grid/grid.html b/apps/showcase/static/components/grid/grid.html similarity index 64% rename from apps/examples/static/components-bulma/grid/grid.html rename to apps/showcase/static/components/grid/grid.html index 0d96d6954..786af73c8 100644 --- a/apps/examples/static/components-bulma/grid/grid.html +++ b/apps/showcase/static/components/grid/grid.html @@ -1,7 +1,19 @@
    + + -
    +
    @@ -33,6 +45,7 @@ {{cell.text}} + + + + - diff --git a/apps/examples/static/components/grid/grid.js b/apps/showcase/static/components/grid/grid.js similarity index 60% rename from apps/examples/static/components/grid/grid.js rename to apps/showcase/static/components/grid/grid.js index 678cdfcb9..9bce7ff52 100644 --- a/apps/examples/static/components/grid/grid.js +++ b/apps/showcase/static/components/grid/grid.js @@ -6,15 +6,21 @@ methods: {} }; + var delete_row_idx = null; + grid.data = function() { var data = { server_url: this.url, has_previous: false, has_more: false, + has_search: false, + has_delete: false, search_placeholder: '', search_text: '', page: 1, rows: [], + confirm_delete_text: '', + confirm_delete_active: false, }; grid.methods.load.call(data); return data; @@ -26,6 +32,29 @@ a.map(function(e) {e._idx = k++;}); }; + grid.transform_time_and_date = function (c) { + // Transforms dates and times to present them well. + // Times are also put into localtimes. + if (c.text === null) { + c.text = ""; + } else { + if (c.type === 'date') { + let m = luxon.DateTime.fromISO(c.text, {zone: "UTC"}); + c.text = m.toLocaleString(luxon.DateTime.DATE_HUGE); + } + if (c.type === 'datetime') { + let m = luxon.DateTime.fromISO(c.text, {zone: "UTC"}); + let local_m = m.setZone(self.time_zone); + c.text = local_m.toLocaleString({ + year: "numeric", month: "long", + day: "numeric", weekday: "long", + hour: "numeric", minute: "numeric", + timeZoneName: "short", + }); + } + } + } + grid.methods.do_search = function () { let self = this; self.page = 1; // Restart from page 1 for every search. @@ -68,6 +97,31 @@ self.load(); } + grid.methods.delete_row = function (row_idx) { + let self = this; + delete_row_idx = row_idx; + self.confirm_delete_text = self.rows[row_idx].confirm; + self.confirm_delete_active = true; + }; + + grid.methods.delete_cancel = function () { + let self = this; + delete_row_idx = null; + self.confirm_delete_active = false; + self.confirm_delete_text = ''; + }; + + grid.methods.delete_confirm = function () { + let self = this; + let row = self.rows[delete_row_idx]; + axios.get(row.delete).then(function () { + self.rows.splice(delete_row_idx, 1); + self.delete_cancel(); + }).catch(function () { + self.delete_cancel(); + }) + }; + grid.methods.load = function () { // In use, self will correspond to the data of the table, // as this is called via grid.methods.load @@ -81,8 +135,10 @@ page: self.page, q: self.search_text, sort_order: sort_order, - }}).then(function(res) { + }}).then(function (res) { self.page = res.data.page; + self.has_search = res.data.has_search; + self.has_delete = res.data.has_delete; self.has_more = res.data.has_more; self.has_previous = self.page > 1; self.search_placeholder = res.data.search_placeholder; @@ -91,6 +147,7 @@ for (let r of rows) { grid.enumerate(r.cells); for (let c of r.cells) { + grid.transform_time_and_date(c); if (!c.sort) { // Note that on purpose, we can have sorted fields // that are not sortable via a UI click. @@ -111,7 +168,7 @@ } }; - Q.register_vue_component('grid', 'components/grid/grid.html', function(template) { + Q.register_vue_component('grid', 'components-bulma/grid/grid.html', function(template) { grid.template = template.data; return grid; }); diff --git a/apps/examples/static/components-bulma/mtable.html b/apps/showcase/static/components/mtable.html similarity index 58% rename from apps/examples/static/components-bulma/mtable.html rename to apps/showcase/static/components/mtable.html index dfa399306..5a69f5455 100644 --- a/apps/examples/static/components-bulma/mtable.html +++ b/apps/showcase/static/components/mtable.html @@ -2,7 +2,7 @@ @@ -65,8 +77,8 @@ @@ -77,10 +89,15 @@ [{{item[field.name]}}] {{item[field.name]}} + (json){{item[field.name]}} + {{item[field.name]}}{{item[field.name]}} + {{item[field.name]}}{{item[field.name]}}{{item[field.name]}} + {{JSON.stringify(item[field.name])}} + {{JSON.stringify(item[field.name])}}{{(item[field.name]||'').replace('T','@').substr(0,16)}}{{item[field.name]}} @@ -94,7 +111,7 @@ -
    - + @@ -24,21 +24,33 @@
    {{field.label}} - - + + True False None - - - - - - + + + + + + + + + + + + +
    {{errors[field.name]}}
    {{field.label}} - - + +
    +
    diff --git a/apps/examples/static/components-bulma/mtable.js b/apps/showcase/static/components/mtable.js similarity index 53% rename from apps/examples/static/components-bulma/mtable.js rename to apps/showcase/static/components/mtable.js index 697c0e301..7a42bb508 100644 --- a/apps/examples/static/components-bulma/mtable.js +++ b/apps/showcase/static/components/mtable.js @@ -2,15 +2,18 @@ var mtable = { props: ['url', 'filter', 'order', 'editable', 'create', 'deletable', 'render'], data: null, methods: {}}; - mtable.data = function() { - var data = {mtUrl: this.url, + mtable.data = function() { + var data = {url: this.url, busy: false, - mtFilter: this.filter || '', - mtOrder: this.order || '', + filter: this.filter || '', + order: this.order || '', errors: {}, item: null, message: '', - table: { model: [], items: [], count: 0}}; + reference_options: {}, + table: { model: [], items: [], count: 0}, + string_values: {} + }; mtable.methods.load.call(data); return data; }; @@ -21,9 +24,9 @@ mtable.methods.load = function() { let self = this; let length = this.table.items.length; - let url = this.mtUrl + '?@limit=20'; + let url = this.url + '?@limit=20'; if (length) url+='&@offset='+length; else url+='&@model=true'; - let filters = self.mtFilter.split(' and ').filter((f)=>{return f.trim() != ''}); + let filters = self.filter.split(' and ').filter((f)=>{return f.trim() != ''}); filters = filters.filter((f)=>{return f.trim();}).map((f)=>{ let parts = (f .replace(/ equals? /,'==') @@ -47,19 +50,19 @@ '=' + parts[parts.length-1].replace(/^ /,'')); }); if (filters.length) url += '&'+filters.join('&'); - if (self.mtOrder) url += '&@order='+self.mtOrder; + if (self.order) url += '&@order='+self.order; self.busy = true; - axios.get(url).then(function (res) { + Q.get(url).then(function (res) { self.busy = false; - if(!length) self.table = res.data; - else self.table.items = self.table.items.concat(res.data.items); + if(!length) self.table = res.json(); + else self.table.items = self.table.items.concat(res.json().items); }); }; mtable.methods.reorder = function (field) { - if (this.mtOrder == '~' + field.name) this.mtOrder = null; - else if (this.mtOrder == field.name) this.mtOrder = '~'+field.name; - else this.mtOrder = field.name; + if (this.order == '~' + field.name) this.order = null; + else if (this.order == field.name) this.order = '~'+field.name; + else this.order = field.name; this.table.items = []; this.load(); }; @@ -72,55 +75,106 @@ mtable.methods.open_create = function () { this.item = {}; - for(var field in this.model) this.item[field.name] = field.default||''; + this.prepare_fields(this.item); }; - + mtable.methods.open_edit = function (item) { this.item = {}; this.item = item; + this.prepare_fields(this.item); }; - + + mtable.methods.prepare_fields = function(item){ + let self = this; + for(var field of this.table.model){ + if(field.type == "list:string" || field.type == "list:integer" || field.type.substr(0,14) == "list:reference"){ + self.string_values[field.name] = JSON.stringify(item[field.name]); + } else if (field.type == "datetime") { + output = field.default != null ? field.default : ''; + output = output.split('.')[0]; + Vue.set(this.item, field.name, output); + } else if(field.type == "reference"){ + if (!(field.references in this.reference_options)){ + Vue.set(this.reference_options, field.references, []); + let reference_table_url = self.url.split('/'); + reference_table_url.pop() + reference_table_url.push(field.references) + reference_table_url = reference_table_url.join('/') + '?@options_list=true'; + Q.get(reference_table_url).then(function (res) { + let url_components = res.json().config.url.split('?')[0].split('/'); + self.reference_options[url_components[url_components.length - 1 ]] = res.data.items; + }); + + } + } + } + this.$nextTick(function(){ + Q("input[type=text].type-list-string,input[type=text].type-list-integer,input[type=text].type-list-reference").forEach( + function(elem){Q.tags_input(elem); + }); + }); + }; + + mtable.methods.parse_and_validate_json = function(event){ + try { + event.target.style.borderColor = ""; + return JSON.parse(event.target.value); + } + catch (error) { + event.target.style.borderColor = "#ff0000"; + } + } + mtable.methods.trash = function (item) { if (window.confirm("Really delete record?")) { - let url = this.mtUrl + '/' + item.id; + let url = this.url + '/' + item.id; this.table.items = this.table.items.filter((i)=>{return i.id != item.id;}); - axios.delete(url); + Q.delete(url); if (item==this.item) this.item = null; } }; mtable.methods.save = function (item) { - let url = this.mtUrl; + let url = this.url; self.busy = true; + for(var field of this.table.model) { + var is_list_integer = field.type == "list:integer" || field.type.substr(0,14) == "list:reference"; + if(field.type == "list:string" || is_list_integer) { + try { + item[field.name] = JSON.parse(this.string_values[field.name]); + } catch(err) { + alert("Invalid field value: " + field.name); + break; + } + } + } if (item.id) { url += '/' + item.id; - axios.put(url, item).then(mtable.handle_response('put', this), - mtable.handle_response('put', this)); + var data = JSON.parse(JSON.stringify(item)); + delete data["id"]; + Q.put(url, data).then(mtable.handle_response('put', this), + mtable.handle_response('put', this)); } else { - axios.post(url, item).then(mtable.handle_response('post', this), - mtable.handle_response('post', this)); - } + Q.post(url, item).then(mtable.handle_response('post', this), + mtable.handle_response('post', this)); + } }; mtable.handle_response = function(method, data) { self.busy = false; return function(res) { - if (res.response) res = res.response; // deal with error weirdness + res = res.json(); if (method == 'post') { data.table.items = []; - console.log(data); mtable.methods.load.call(data); } - console.log('a'); - console.log(res); - if (res.data.status == 'success') { + if (res.status == 'success') { data.clear(); + location.reload(); } else { - console.log('b') - data.errors = res.data.errors; - data.message = res.data.message; + data.errors = res.errors; + data.message = res.message; } - console.log('c'); }; }; @@ -155,8 +209,8 @@ var scripts = document.getElementsByTagName('script'); var src = scripts[scripts.length-1].src; var path = src.substr(0, src.length-3) + '.html'; - Q.register_vue_component('mtable', path, function(template) { - mtable.template = template.data; - return mtable; - }); + Q.register_vue_component('mtable', path, function(template) { + mtable.template = template.data; + return mtable; + }); })(); diff --git a/apps/showcase/static/components/starrater/starrater.css b/apps/showcase/static/components/starrater/starrater.css new file mode 100644 index 000000000..e69de29bb diff --git a/apps/examples/static/components/starrater/starrater.html b/apps/showcase/static/components/starrater/starrater.html similarity index 100% rename from apps/examples/static/components/starrater/starrater.html rename to apps/showcase/static/components/starrater/starrater.html diff --git a/apps/examples/static/components/starrater/starrater.js b/apps/showcase/static/components/starrater/starrater.js similarity index 100% rename from apps/examples/static/components/starrater/starrater.js rename to apps/showcase/static/components/starrater/starrater.js diff --git a/apps/showcase/static/components/vueform/luxon.js b/apps/showcase/static/components/vueform/luxon.js new file mode 100644 index 000000000..afa875459 --- /dev/null +++ b/apps/showcase/static/components/vueform/luxon.js @@ -0,0 +1,8258 @@ +var luxon = (function (exports) { + 'use strict'; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; + } + + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); + } + + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + + try { + Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); + return true; + } catch (e) { + return false; + } + } + + function _construct(Parent, args, Class) { + if (_isNativeReflectConstruct()) { + _construct = Reflect.construct; + } else { + _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) _setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + + return _construct.apply(null, arguments); + } + + function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; + } + + function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : undefined; + + _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (Class === null || !_isNativeFunction(Class)) return Class; + + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + + _cache.set(Class, Wrapper); + } + + function Wrapper() { + return _construct(Class, arguments, _getPrototypeOf(this).constructor); + } + + Wrapper.prototype = Object.create(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class); + }; + + return _wrapNativeSuper(Class); + } + + function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + + return target; + } + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(n); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + + return arr2; + } + + function _createForOfIteratorHelperLoose(o) { + var i = 0; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + i = o[Symbol.iterator](); + return i.next.bind(i); + } + + // these aren't really private, but nor are they really useful to document + + /** + * @private + */ + var LuxonError = /*#__PURE__*/function (_Error) { + _inheritsLoose(LuxonError, _Error); + + function LuxonError() { + return _Error.apply(this, arguments) || this; + } + + return LuxonError; + }( /*#__PURE__*/_wrapNativeSuper(Error)); + /** + * @private + */ + + + var InvalidDateTimeError = /*#__PURE__*/function (_LuxonError) { + _inheritsLoose(InvalidDateTimeError, _LuxonError); + + function InvalidDateTimeError(reason) { + return _LuxonError.call(this, "Invalid DateTime: " + reason.toMessage()) || this; + } + + return InvalidDateTimeError; + }(LuxonError); + /** + * @private + */ + + var InvalidIntervalError = /*#__PURE__*/function (_LuxonError2) { + _inheritsLoose(InvalidIntervalError, _LuxonError2); + + function InvalidIntervalError(reason) { + return _LuxonError2.call(this, "Invalid Interval: " + reason.toMessage()) || this; + } + + return InvalidIntervalError; + }(LuxonError); + /** + * @private + */ + + var InvalidDurationError = /*#__PURE__*/function (_LuxonError3) { + _inheritsLoose(InvalidDurationError, _LuxonError3); + + function InvalidDurationError(reason) { + return _LuxonError3.call(this, "Invalid Duration: " + reason.toMessage()) || this; + } + + return InvalidDurationError; + }(LuxonError); + /** + * @private + */ + + var ConflictingSpecificationError = /*#__PURE__*/function (_LuxonError4) { + _inheritsLoose(ConflictingSpecificationError, _LuxonError4); + + function ConflictingSpecificationError() { + return _LuxonError4.apply(this, arguments) || this; + } + + return ConflictingSpecificationError; + }(LuxonError); + /** + * @private + */ + + var InvalidUnitError = /*#__PURE__*/function (_LuxonError5) { + _inheritsLoose(InvalidUnitError, _LuxonError5); + + function InvalidUnitError(unit) { + return _LuxonError5.call(this, "Invalid unit " + unit) || this; + } + + return InvalidUnitError; + }(LuxonError); + /** + * @private + */ + + var InvalidArgumentError = /*#__PURE__*/function (_LuxonError6) { + _inheritsLoose(InvalidArgumentError, _LuxonError6); + + function InvalidArgumentError() { + return _LuxonError6.apply(this, arguments) || this; + } + + return InvalidArgumentError; + }(LuxonError); + /** + * @private + */ + + var ZoneIsAbstractError = /*#__PURE__*/function (_LuxonError7) { + _inheritsLoose(ZoneIsAbstractError, _LuxonError7); + + function ZoneIsAbstractError() { + return _LuxonError7.call(this, "Zone is an abstract class") || this; + } + + return ZoneIsAbstractError; + }(LuxonError); + + /** + * @private + */ + var n = "numeric", + s = "short", + l = "long"; + var DATE_SHORT = { + year: n, + month: n, + day: n + }; + var DATE_MED = { + year: n, + month: s, + day: n + }; + var DATE_FULL = { + year: n, + month: l, + day: n + }; + var DATE_HUGE = { + year: n, + month: l, + day: n, + weekday: l + }; + var TIME_SIMPLE = { + hour: n, + minute: n + }; + var TIME_WITH_SECONDS = { + hour: n, + minute: n, + second: n + }; + var TIME_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var TIME_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + var TIME_24_SIMPLE = { + hour: n, + minute: n, + hour12: false + }; + /** + * {@link toLocaleString}; format like '09:30:23', always 24-hour. + */ + + var TIME_24_WITH_SECONDS = { + hour: n, + minute: n, + second: n, + hour12: false + }; + /** + * {@link toLocaleString}; format like '09:30:23 EDT', always 24-hour. + */ + + var TIME_24_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + hour12: false, + timeZoneName: s + }; + /** + * {@link toLocaleString}; format like '09:30:23 Eastern Daylight Time', always 24-hour. + */ + + var TIME_24_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + hour12: false, + timeZoneName: l + }; + /** + * {@link toLocaleString}; format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. + */ + + var DATETIME_SHORT = { + year: n, + month: n, + day: n, + hour: n, + minute: n + }; + /** + * {@link toLocaleString}; format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. + */ + + var DATETIME_SHORT_WITH_SECONDS = { + year: n, + month: n, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED = { + year: n, + month: s, + day: n, + hour: n, + minute: n + }; + var DATETIME_MED_WITH_SECONDS = { + year: n, + month: s, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, + hour: n, + minute: n + }; + var DATETIME_FULL = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + timeZoneName: s + }; + var DATETIME_FULL_WITH_SECONDS = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var DATETIME_HUGE = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + timeZoneName: l + }; + var DATETIME_HUGE_WITH_SECONDS = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + + /* + This is just a junk drawer, containing anything used across multiple classes. + Because Luxon is small(ish), this should stay small and we won't worry about splitting + it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area. + */ + /** + * @private + */ + // TYPES + + function isUndefined(o) { + return typeof o === "undefined"; + } + function isNumber(o) { + return typeof o === "number"; + } + function isInteger(o) { + return typeof o === "number" && o % 1 === 0; + } + function isString(o) { + return typeof o === "string"; + } + function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; + } // CAPABILITIES + + function hasIntl() { + try { + return typeof Intl !== "undefined" && Intl.DateTimeFormat; + } catch (e) { + return false; + } + } + function hasFormatToParts() { + return !isUndefined(Intl.DateTimeFormat.prototype.formatToParts); + } + function hasRelative() { + try { + return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; + } catch (e) { + return false; + } + } // OBJECTS AND ARRAYS + + function maybeArray(thing) { + return Array.isArray(thing) ? thing : [thing]; + } + function bestBy(arr, by, compare) { + if (arr.length === 0) { + return undefined; + } + + return arr.reduce(function (best, next) { + var pair = [by(next), next]; + + if (!best) { + return pair; + } else if (compare(best[0], pair[0]) === best[0]) { + return best; + } else { + return pair; + } + }, null)[1]; + } + function pick(obj, keys) { + return keys.reduce(function (a, k) { + a[k] = obj[k]; + return a; + }, {}); + } + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } // NUMBERS AND STRINGS + + function integerBetween(thing, bottom, top) { + return isInteger(thing) && thing >= bottom && thing <= top; + } // x % n but takes the sign of n instead of x + + function floorMod(x, n) { + return x - n * Math.floor(x / n); + } + function padStart(input, n) { + if (n === void 0) { + n = 2; + } + + if (input.toString().length < n) { + return ("0".repeat(n) + input).slice(-n); + } else { + return input.toString(); + } + } + function parseInteger(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseInt(string, 10); + } + } + function parseMillis(fraction) { + // Return undefined (instead of 0) in these cases, where fraction is not set + if (isUndefined(fraction) || fraction === null || fraction === "") { + return undefined; + } else { + var f = parseFloat("0." + fraction) * 1000; + return Math.floor(f); + } + } + function roundTo(number, digits, towardZero) { + if (towardZero === void 0) { + towardZero = false; + } + + var factor = Math.pow(10, digits), + rounder = towardZero ? Math.trunc : Math.round; + return rounder(number * factor) / factor; + } // DATE BASICS + + function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + } + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + function daysInMonth(year, month) { + var modMonth = floorMod(month - 1, 12) + 1, + modYear = year + (month - modMonth) / 12; + + if (modMonth === 2) { + return isLeapYear(modYear) ? 29 : 28; + } else { + return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; + } + } // covert a calendar object to a local timestamp (epoch, but with the offset baked in) + + function objToLocalTS(obj) { + var d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that + + if (obj.year < 100 && obj.year >= 0) { + d = new Date(d); + d.setUTCFullYear(d.getUTCFullYear() - 1900); + } + + return +d; + } + function weeksInWeekYear(weekYear) { + var p1 = (weekYear + Math.floor(weekYear / 4) - Math.floor(weekYear / 100) + Math.floor(weekYear / 400)) % 7, + last = weekYear - 1, + p2 = (last + Math.floor(last / 4) - Math.floor(last / 100) + Math.floor(last / 400)) % 7; + return p1 === 4 || p2 === 3 ? 53 : 52; + } + function untruncateYear(year) { + if (year > 99) { + return year; + } else return year > 60 ? 1900 + year : 2000 + year; + } // PARSING + + function parseZoneInfo(ts, offsetFormat, locale, timeZone) { + if (timeZone === void 0) { + timeZone = null; + } + + var date = new Date(ts), + intlOpts = { + hour12: false, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit" + }; + + if (timeZone) { + intlOpts.timeZone = timeZone; + } + + var modified = Object.assign({ + timeZoneName: offsetFormat + }, intlOpts), + intl = hasIntl(); + + if (intl && hasFormatToParts()) { + var parsed = new Intl.DateTimeFormat(locale, modified).formatToParts(date).find(function (m) { + return m.type.toLowerCase() === "timezonename"; + }); + return parsed ? parsed.value : null; + } else if (intl) { + // this probably doesn't work for all locales + var without = new Intl.DateTimeFormat(locale, intlOpts).format(date), + included = new Intl.DateTimeFormat(locale, modified).format(date), + diffed = included.substring(without.length), + trimmed = diffed.replace(/^[, \u200e]+/, ""); + return trimmed; + } else { + return null; + } + } // signedOffset('-5', '30') -> -330 + + function signedOffset(offHourStr, offMinuteStr) { + var offHour = parseInt(offHourStr, 10); // don't || this because we want to preserve -0 + + if (Number.isNaN(offHour)) { + offHour = 0; + } + + var offMin = parseInt(offMinuteStr, 10) || 0, + offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; + return offHour * 60 + offMinSigned; + } // COERCION + + function asNumber(value) { + var numericValue = Number(value); + if (typeof value === "boolean" || value === "" || Number.isNaN(numericValue)) throw new InvalidArgumentError("Invalid unit value " + value); + return numericValue; + } + function normalizeObject(obj, normalizer, nonUnitKeys) { + var normalized = {}; + + for (var u in obj) { + if (hasOwnProperty(obj, u)) { + if (nonUnitKeys.indexOf(u) >= 0) continue; + var v = obj[u]; + if (v === undefined || v === null) continue; + normalized[normalizer(u)] = asNumber(v); + } + } + + return normalized; + } + function formatOffset(offset, format) { + var hours = Math.trunc(offset / 60), + minutes = Math.abs(offset % 60), + sign = hours >= 0 && !Object.is(hours, -0) ? "+" : "-", + base = "" + sign + Math.abs(hours); + + switch (format) { + case "short": + return "" + sign + padStart(Math.abs(hours), 2) + ":" + padStart(minutes, 2); + + case "narrow": + return minutes > 0 ? base + ":" + minutes : base; + + case "techie": + return "" + sign + padStart(Math.abs(hours), 2) + padStart(minutes, 2); + + default: + throw new RangeError("Value format " + format + " is out of range for property format"); + } + } + function timeObject(obj) { + return pick(obj, ["hour", "minute", "second", "millisecond"]); + } + var ianaRegex = /[A-Za-z_+-]{1,256}(:?\/[A-Za-z_+-]{1,256}(\/[A-Za-z_+-]{1,256})?)?/; + + function stringify(obj) { + return JSON.stringify(obj, Object.keys(obj).sort()); + } + /** + * @private + */ + + + var monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + var monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + var monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; + function months(length) { + switch (length) { + case "narrow": + return monthsNarrow; + + case "short": + return monthsShort; + + case "long": + return monthsLong; + + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; + + case "2-digit": + return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; + + default: + return null; + } + } + var weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; + var weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + var weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; + function weekdays(length) { + switch (length) { + case "narrow": + return weekdaysNarrow; + + case "short": + return weekdaysShort; + + case "long": + return weekdaysLong; + + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7"]; + + default: + return null; + } + } + var meridiems = ["AM", "PM"]; + var erasLong = ["Before Christ", "Anno Domini"]; + var erasShort = ["BC", "AD"]; + var erasNarrow = ["B", "A"]; + function eras(length) { + switch (length) { + case "narrow": + return erasNarrow; + + case "short": + return erasShort; + + case "long": + return erasLong; + + default: + return null; + } + } + function meridiemForDateTime(dt) { + return meridiems[dt.hour < 12 ? 0 : 1]; + } + function weekdayForDateTime(dt, length) { + return weekdays(length)[dt.weekday - 1]; + } + function monthForDateTime(dt, length) { + return months(length)[dt.month - 1]; + } + function eraForDateTime(dt, length) { + return eras(length)[dt.year < 0 ? 0 : 1]; + } + function formatRelativeTime(unit, count, numeric, narrow) { + if (numeric === void 0) { + numeric = "always"; + } + + if (narrow === void 0) { + narrow = false; + } + + var units = { + years: ["year", "yr."], + quarters: ["quarter", "qtr."], + months: ["month", "mo."], + weeks: ["week", "wk."], + days: ["day", "day", "days"], + hours: ["hour", "hr."], + minutes: ["minute", "min."], + seconds: ["second", "sec."] + }; + var lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; + + if (numeric === "auto" && lastable) { + var isDay = unit === "days"; + + switch (count) { + case 1: + return isDay ? "tomorrow" : "next " + units[unit][0]; + + case -1: + return isDay ? "yesterday" : "last " + units[unit][0]; + + case 0: + return isDay ? "today" : "this " + units[unit][0]; + + } + } + + var isInPast = Object.is(count, -0) || count < 0, + fmtValue = Math.abs(count), + singular = fmtValue === 1, + lilUnits = units[unit], + fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; + return isInPast ? fmtValue + " " + fmtUnit + " ago" : "in " + fmtValue + " " + fmtUnit; + } + function formatString(knownFormat) { + // these all have the offsets removed because we don't have access to them + // without all the intl stuff this is backfilling + var filtered = pick(knownFormat, ["weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName", "hour12"]), + key = stringify(filtered), + dateTimeHuge = "EEEE, LLLL d, yyyy, h:mm a"; + + switch (key) { + case stringify(DATE_SHORT): + return "M/d/yyyy"; + + case stringify(DATE_MED): + return "LLL d, yyyy"; + + case stringify(DATE_FULL): + return "LLLL d, yyyy"; + + case stringify(DATE_HUGE): + return "EEEE, LLLL d, yyyy"; + + case stringify(TIME_SIMPLE): + return "h:mm a"; + + case stringify(TIME_WITH_SECONDS): + return "h:mm:ss a"; + + case stringify(TIME_WITH_SHORT_OFFSET): + return "h:mm a"; + + case stringify(TIME_WITH_LONG_OFFSET): + return "h:mm a"; + + case stringify(TIME_24_SIMPLE): + return "HH:mm"; + + case stringify(TIME_24_WITH_SECONDS): + return "HH:mm:ss"; + + case stringify(TIME_24_WITH_SHORT_OFFSET): + return "HH:mm"; + + case stringify(TIME_24_WITH_LONG_OFFSET): + return "HH:mm"; + + case stringify(DATETIME_SHORT): + return "M/d/yyyy, h:mm a"; + + case stringify(DATETIME_MED): + return "LLL d, yyyy, h:mm a"; + + case stringify(DATETIME_FULL): + return "LLLL d, yyyy, h:mm a"; + + case stringify(DATETIME_HUGE): + return dateTimeHuge; + + case stringify(DATETIME_SHORT_WITH_SECONDS): + return "M/d/yyyy, h:mm:ss a"; + + case stringify(DATETIME_MED_WITH_SECONDS): + return "LLL d, yyyy, h:mm:ss a"; + + case stringify(DATETIME_MED_WITH_WEEKDAY): + return "EEE, d LLL yyyy, h:mm a"; + + case stringify(DATETIME_FULL_WITH_SECONDS): + return "LLLL d, yyyy, h:mm:ss a"; + + case stringify(DATETIME_HUGE_WITH_SECONDS): + return "EEEE, LLLL d, yyyy, h:mm:ss a"; + + default: + return dateTimeHuge; + } + } + + function stringifyTokens(splits, tokenToString) { + var s = ""; + + for (var _iterator = _createForOfIteratorHelperLoose(splits), _step; !(_step = _iterator()).done;) { + var token = _step.value; + + if (token.literal) { + s += token.val; + } else { + s += tokenToString(token.val); + } + } + + return s; + } + + var _macroTokenToFormatOpts = { + D: DATE_SHORT, + DD: DATE_MED, + DDD: DATE_FULL, + DDDD: DATE_HUGE, + t: TIME_SIMPLE, + tt: TIME_WITH_SECONDS, + ttt: TIME_WITH_SHORT_OFFSET, + tttt: TIME_WITH_LONG_OFFSET, + T: TIME_24_SIMPLE, + TT: TIME_24_WITH_SECONDS, + TTT: TIME_24_WITH_SHORT_OFFSET, + TTTT: TIME_24_WITH_LONG_OFFSET, + f: DATETIME_SHORT, + ff: DATETIME_MED, + fff: DATETIME_FULL, + ffff: DATETIME_HUGE, + F: DATETIME_SHORT_WITH_SECONDS, + FF: DATETIME_MED_WITH_SECONDS, + FFF: DATETIME_FULL_WITH_SECONDS, + FFFF: DATETIME_HUGE_WITH_SECONDS + }; + /** + * @private + */ + + var Formatter = /*#__PURE__*/function () { + Formatter.create = function create(locale, opts) { + if (opts === void 0) { + opts = {}; + } + + return new Formatter(locale, opts); + }; + + Formatter.parseFormat = function parseFormat(fmt) { + var current = null, + currentFull = "", + bracketed = false; + var splits = []; + + for (var i = 0; i < fmt.length; i++) { + var c = fmt.charAt(i); + + if (c === "'") { + if (currentFull.length > 0) { + splits.push({ + literal: bracketed, + val: currentFull + }); + } + + current = null; + currentFull = ""; + bracketed = !bracketed; + } else if (bracketed) { + currentFull += c; + } else if (c === current) { + currentFull += c; + } else { + if (currentFull.length > 0) { + splits.push({ + literal: false, + val: currentFull + }); + } + + currentFull = c; + current = c; + } + } + + if (currentFull.length > 0) { + splits.push({ + literal: bracketed, + val: currentFull + }); + } + + return splits; + }; + + Formatter.macroTokenToFormatOpts = function macroTokenToFormatOpts(token) { + return _macroTokenToFormatOpts[token]; + }; + + function Formatter(locale, formatOpts) { + this.opts = formatOpts; + this.loc = locale; + this.systemLoc = null; + } + + var _proto = Formatter.prototype; + + _proto.formatWithSystemDefault = function formatWithSystemDefault(dt, opts) { + if (this.systemLoc === null) { + this.systemLoc = this.loc.redefaultToSystem(); + } + + var df = this.systemLoc.dtFormatter(dt, Object.assign({}, this.opts, opts)); + return df.format(); + }; + + _proto.formatDateTime = function formatDateTime(dt, opts) { + if (opts === void 0) { + opts = {}; + } + + var df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts)); + return df.format(); + }; + + _proto.formatDateTimeParts = function formatDateTimeParts(dt, opts) { + if (opts === void 0) { + opts = {}; + } + + var df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts)); + return df.formatToParts(); + }; + + _proto.resolvedOptions = function resolvedOptions(dt, opts) { + if (opts === void 0) { + opts = {}; + } + + var df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts)); + return df.resolvedOptions(); + }; + + _proto.num = function num(n, p) { + if (p === void 0) { + p = 0; + } + + // we get some perf out of doing this here, annoyingly + if (this.opts.forceSimple) { + return padStart(n, p); + } + + var opts = Object.assign({}, this.opts); + + if (p > 0) { + opts.padTo = p; + } + + return this.loc.numberFormatter(opts).format(n); + }; + + _proto.formatDateTimeFromString = function formatDateTimeFromString(dt, fmt) { + var _this = this; + + var knownEnglish = this.loc.listingMode() === "en", + useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory" && hasFormatToParts(), + string = function string(opts, extract) { + return _this.loc.extract(dt, opts, extract); + }, + formatOffset = function formatOffset(opts) { + if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { + return "Z"; + } + + return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; + }, + meridiem = function meridiem() { + return knownEnglish ? meridiemForDateTime(dt) : string({ + hour: "numeric", + hour12: true + }, "dayperiod"); + }, + month = function month(length, standalone) { + return knownEnglish ? monthForDateTime(dt, length) : string(standalone ? { + month: length + } : { + month: length, + day: "numeric" + }, "month"); + }, + weekday = function weekday(length, standalone) { + return knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? { + weekday: length + } : { + weekday: length, + month: "long", + day: "numeric" + }, "weekday"); + }, + maybeMacro = function maybeMacro(token) { + var formatOpts = Formatter.macroTokenToFormatOpts(token); + + if (formatOpts) { + return _this.formatWithSystemDefault(dt, formatOpts); + } else { + return token; + } + }, + era = function era(length) { + return knownEnglish ? eraForDateTime(dt, length) : string({ + era: length + }, "era"); + }, + tokenToString = function tokenToString(token) { + // Where possible: http://cldr.unicode.org/translation/date-time#TOC-Stand-Alone-vs.-Format-Styles + switch (token) { + // ms + case "S": + return _this.num(dt.millisecond); + + case "u": // falls through + + case "SSS": + return _this.num(dt.millisecond, 3); + // seconds + + case "s": + return _this.num(dt.second); + + case "ss": + return _this.num(dt.second, 2); + // minutes + + case "m": + return _this.num(dt.minute); + + case "mm": + return _this.num(dt.minute, 2); + // hours + + case "h": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); + + case "hh": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); + + case "H": + return _this.num(dt.hour); + + case "HH": + return _this.num(dt.hour, 2); + // offset + + case "Z": + // like +6 + return formatOffset({ + format: "narrow", + allowZ: _this.opts.allowZ + }); + + case "ZZ": + // like +06:00 + return formatOffset({ + format: "short", + allowZ: _this.opts.allowZ + }); + + case "ZZZ": + // like +0600 + return formatOffset({ + format: "techie", + allowZ: _this.opts.allowZ + }); + + case "ZZZZ": + // like EST + return dt.zone.offsetName(dt.ts, { + format: "short", + locale: _this.loc.locale + }); + + case "ZZZZZ": + // like Eastern Standard Time + return dt.zone.offsetName(dt.ts, { + format: "long", + locale: _this.loc.locale + }); + // zone + + case "z": + // like America/New_York + return dt.zoneName; + // meridiems + + case "a": + return meridiem(); + // dates + + case "d": + return useDateTimeFormatter ? string({ + day: "numeric" + }, "day") : _this.num(dt.day); + + case "dd": + return useDateTimeFormatter ? string({ + day: "2-digit" + }, "day") : _this.num(dt.day, 2); + // weekdays - standalone + + case "c": + // like 1 + return _this.num(dt.weekday); + + case "ccc": + // like 'Tues' + return weekday("short", true); + + case "cccc": + // like 'Tuesday' + return weekday("long", true); + + case "ccccc": + // like 'T' + return weekday("narrow", true); + // weekdays - format + + case "E": + // like 1 + return _this.num(dt.weekday); + + case "EEE": + // like 'Tues' + return weekday("short", false); + + case "EEEE": + // like 'Tuesday' + return weekday("long", false); + + case "EEEEE": + // like 'T' + return weekday("narrow", false); + // months - standalone + + case "L": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric", + day: "numeric" + }, "month") : _this.num(dt.month); + + case "LL": + // like 01, doesn't seem to work + return useDateTimeFormatter ? string({ + month: "2-digit", + day: "numeric" + }, "month") : _this.num(dt.month, 2); + + case "LLL": + // like Jan + return month("short", true); + + case "LLLL": + // like January + return month("long", true); + + case "LLLLL": + // like J + return month("narrow", true); + // months - format + + case "M": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric" + }, "month") : _this.num(dt.month); + + case "MM": + // like 01 + return useDateTimeFormatter ? string({ + month: "2-digit" + }, "month") : _this.num(dt.month, 2); + + case "MMM": + // like Jan + return month("short", false); + + case "MMMM": + // like January + return month("long", false); + + case "MMMMM": + // like J + return month("narrow", false); + // years + + case "y": + // like 2014 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year); + + case "yy": + // like 14 + return useDateTimeFormatter ? string({ + year: "2-digit" + }, "year") : _this.num(dt.year.toString().slice(-2), 2); + + case "yyyy": + // like 0012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 4); + + case "yyyyyy": + // like 000012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 6); + // eras + + case "G": + // like AD + return era("short"); + + case "GG": + // like Anno Domini + return era("long"); + + case "GGGGG": + return era("narrow"); + + case "kk": + return _this.num(dt.weekYear.toString().slice(-2), 2); + + case "kkkk": + return _this.num(dt.weekYear, 4); + + case "W": + return _this.num(dt.weekNumber); + + case "WW": + return _this.num(dt.weekNumber, 2); + + case "o": + return _this.num(dt.ordinal); + + case "ooo": + return _this.num(dt.ordinal, 3); + + case "q": + // like 1 + return _this.num(dt.quarter); + + case "qq": + // like 01 + return _this.num(dt.quarter, 2); + + case "X": + return _this.num(Math.floor(dt.ts / 1000)); + + case "x": + return _this.num(dt.ts); + + default: + return maybeMacro(token); + } + }; + + return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); + }; + + _proto.formatDurationFromString = function formatDurationFromString(dur, fmt) { + var _this2 = this; + + var tokenToField = function tokenToField(token) { + switch (token[0]) { + case "S": + return "millisecond"; + + case "s": + return "second"; + + case "m": + return "minute"; + + case "h": + return "hour"; + + case "d": + return "day"; + + case "M": + return "month"; + + case "y": + return "year"; + + default: + return null; + } + }, + tokenToString = function tokenToString(lildur) { + return function (token) { + var mapped = tokenToField(token); + + if (mapped) { + return _this2.num(lildur.get(mapped), token.length); + } else { + return token; + } + }; + }, + tokens = Formatter.parseFormat(fmt), + realTokens = tokens.reduce(function (found, _ref) { + var literal = _ref.literal, + val = _ref.val; + return literal ? found : found.concat(val); + }, []), + collapsed = dur.shiftTo.apply(dur, realTokens.map(tokenToField).filter(function (t) { + return t; + })); + + return stringifyTokens(tokens, tokenToString(collapsed)); + }; + + return Formatter; + }(); + + var Invalid = /*#__PURE__*/function () { + function Invalid(reason, explanation) { + this.reason = reason; + this.explanation = explanation; + } + + var _proto = Invalid.prototype; + + _proto.toMessage = function toMessage() { + if (this.explanation) { + return this.reason + ": " + this.explanation; + } else { + return this.reason; + } + }; + + return Invalid; + }(); + + /** + * @interface + */ + + var Zone = /*#__PURE__*/function () { + function Zone() {} + + var _proto = Zone.prototype; + + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + _proto.offsetName = function offsetName(ts, opts) { + throw new ZoneIsAbstractError(); + } + /** + * Returns the offset's value as a string + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + ; + + _proto.formatOffset = function formatOffset(ts, format) { + throw new ZoneIsAbstractError(); + } + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @abstract + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */ + ; + + _proto.offset = function offset(ts) { + throw new ZoneIsAbstractError(); + } + /** + * Return whether this Zone is equal to another zone + * @abstract + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */ + ; + + _proto.equals = function equals(otherZone) { + throw new ZoneIsAbstractError(); + } + /** + * Return whether this Zone is valid. + * @abstract + * @type {boolean} + */ + ; + + _createClass(Zone, [{ + key: "type", + + /** + * The type of zone + * @abstract + * @type {string} + */ + get: function get() { + throw new ZoneIsAbstractError(); + } + /** + * The name of this zone. + * @abstract + * @type {string} + */ + + }, { + key: "name", + get: function get() { + throw new ZoneIsAbstractError(); + } + /** + * Returns whether the offset is known to be fixed for the whole year. + * @abstract + * @type {boolean} + */ + + }, { + key: "universal", + get: function get() { + throw new ZoneIsAbstractError(); + } + }, { + key: "isValid", + get: function get() { + throw new ZoneIsAbstractError(); + } + }]); + + return Zone; + }(); + + var singleton = null; + /** + * Represents the local zone for this Javascript environment. + * @implements {Zone} + */ + + var LocalZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(LocalZone, _Zone); + + function LocalZone() { + return _Zone.apply(this, arguments) || this; + } + + var _proto = LocalZone.prototype; + + /** @override **/ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale); + } + /** @override **/ + ; + + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + /** @override **/ + ; + + _proto.offset = function offset(ts) { + return -new Date(ts).getTimezoneOffset(); + } + /** @override **/ + ; + + _proto.equals = function equals(otherZone) { + return otherZone.type === "local"; + } + /** @override **/ + ; + + _createClass(LocalZone, [{ + key: "type", + + /** @override **/ + get: function get() { + return "local"; + } + /** @override **/ + + }, { + key: "name", + get: function get() { + if (hasIntl()) { + return new Intl.DateTimeFormat().resolvedOptions().timeZone; + } else return "local"; + } + /** @override **/ + + }, { + key: "universal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "instance", + + /** + * Get a singleton instance of the local zone + * @return {LocalZone} + */ + get: function get() { + if (singleton === null) { + singleton = new LocalZone(); + } + + return singleton; + } + }]); + + return LocalZone; + }(Zone); + + var matchingRegex = RegExp("^" + ianaRegex.source + "$"); + var dtfCache = {}; + + function makeDTF(zone) { + if (!dtfCache[zone]) { + dtfCache[zone] = new Intl.DateTimeFormat("en-US", { + hour12: false, + timeZone: zone, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit" + }); + } + + return dtfCache[zone]; + } + + var typeToPos = { + year: 0, + month: 1, + day: 2, + hour: 3, + minute: 4, + second: 5 + }; + + function hackyOffset(dtf, date) { + var formatted = dtf.format(date).replace(/\u200E/g, ""), + parsed = /(\d+)\/(\d+)\/(\d+),? (\d+):(\d+):(\d+)/.exec(formatted), + fMonth = parsed[1], + fDay = parsed[2], + fYear = parsed[3], + fHour = parsed[4], + fMinute = parsed[5], + fSecond = parsed[6]; + return [fYear, fMonth, fDay, fHour, fMinute, fSecond]; + } + + function partsOffset(dtf, date) { + var formatted = dtf.formatToParts(date), + filled = []; + + for (var i = 0; i < formatted.length; i++) { + var _formatted$i = formatted[i], + type = _formatted$i.type, + value = _formatted$i.value, + pos = typeToPos[type]; + + if (!isUndefined(pos)) { + filled[pos] = parseInt(value, 10); + } + } + + return filled; + } + + var ianaZoneCache = {}; + /** + * A zone identified by an IANA identifier, like America/New_York + * @implements {Zone} + */ + + var IANAZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(IANAZone, _Zone); + + /** + * @param {string} name - Zone name + * @return {IANAZone} + */ + IANAZone.create = function create(name) { + if (!ianaZoneCache[name]) { + ianaZoneCache[name] = new IANAZone(name); + } + + return ianaZoneCache[name]; + } + /** + * Reset local caches. Should only be necessary in testing scenarios. + * @return {void} + */ + ; + + IANAZone.resetCache = function resetCache() { + ianaZoneCache = {}; + dtfCache = {}; + } + /** + * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. + * @param {string} s - The string to check validity on + * @example IANAZone.isValidSpecifier("America/New_York") //=> true + * @example IANAZone.isValidSpecifier("Fantasia/Castle") //=> true + * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false + * @return {boolean} + */ + ; + + IANAZone.isValidSpecifier = function isValidSpecifier(s) { + return !!(s && s.match(matchingRegex)); + } + /** + * Returns whether the provided string identifies a real zone + * @param {string} zone - The string to check + * @example IANAZone.isValidZone("America/New_York") //=> true + * @example IANAZone.isValidZone("Fantasia/Castle") //=> false + * @example IANAZone.isValidZone("Sport~~blorp") //=> false + * @return {boolean} + */ + ; + + IANAZone.isValidZone = function isValidZone(zone) { + try { + new Intl.DateTimeFormat("en-US", { + timeZone: zone + }).format(); + return true; + } catch (e) { + return false; + } + } // Etc/GMT+8 -> -480 + + /** @ignore */ + ; + + IANAZone.parseGMTOffset = function parseGMTOffset(specifier) { + if (specifier) { + var match = specifier.match(/^Etc\/GMT([+-]\d{1,2})$/i); + + if (match) { + return -60 * parseInt(match[1]); + } + } + + return null; + }; + + function IANAZone(name) { + var _this; + + _this = _Zone.call(this) || this; + /** @private **/ + + _this.zoneName = name; + /** @private **/ + + _this.valid = IANAZone.isValidZone(name); + return _this; + } + /** @override **/ + + + var _proto = IANAZone.prototype; + + /** @override **/ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale, this.name); + } + /** @override **/ + ; + + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + /** @override **/ + ; + + _proto.offset = function offset(ts) { + var date = new Date(ts), + dtf = makeDTF(this.name), + _ref2 = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date), + year = _ref2[0], + month = _ref2[1], + day = _ref2[2], + hour = _ref2[3], + minute = _ref2[4], + second = _ref2[5], + adjustedHour = hour === 24 ? 0 : hour; + + var asUTC = objToLocalTS({ + year: year, + month: month, + day: day, + hour: adjustedHour, + minute: minute, + second: second, + millisecond: 0 + }); + var asTS = +date; + var over = asTS % 1000; + asTS -= over >= 0 ? over : 1000 + over; + return (asUTC - asTS) / (60 * 1000); + } + /** @override **/ + ; + + _proto.equals = function equals(otherZone) { + return otherZone.type === "iana" && otherZone.name === this.name; + } + /** @override **/ + ; + + _createClass(IANAZone, [{ + key: "type", + get: function get() { + return "iana"; + } + /** @override **/ + + }, { + key: "name", + get: function get() { + return this.zoneName; + } + /** @override **/ + + }, { + key: "universal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return this.valid; + } + }]); + + return IANAZone; + }(Zone); + + var singleton$1 = null; + /** + * A zone with a fixed offset (meaning no DST) + * @implements {Zone} + */ + + var FixedOffsetZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(FixedOffsetZone, _Zone); + + /** + * Get an instance with a specified offset + * @param {number} offset - The offset in minutes + * @return {FixedOffsetZone} + */ + FixedOffsetZone.instance = function instance(offset) { + return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); + } + /** + * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" + * @param {string} s - The offset string to parse + * @example FixedOffsetZone.parseSpecifier("UTC+6") + * @example FixedOffsetZone.parseSpecifier("UTC+06") + * @example FixedOffsetZone.parseSpecifier("UTC-6:00") + * @return {FixedOffsetZone} + */ + ; + + FixedOffsetZone.parseSpecifier = function parseSpecifier(s) { + if (s) { + var r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); + + if (r) { + return new FixedOffsetZone(signedOffset(r[1], r[2])); + } + } + + return null; + }; + + _createClass(FixedOffsetZone, null, [{ + key: "utcInstance", + + /** + * Get a singleton instance of UTC + * @return {FixedOffsetZone} + */ + get: function get() { + if (singleton$1 === null) { + singleton$1 = new FixedOffsetZone(0); + } + + return singleton$1; + } + }]); + + function FixedOffsetZone(offset) { + var _this; + + _this = _Zone.call(this) || this; + /** @private **/ + + _this.fixed = offset; + return _this; + } + /** @override **/ + + + var _proto = FixedOffsetZone.prototype; + + /** @override **/ + _proto.offsetName = function offsetName() { + return this.name; + } + /** @override **/ + ; + + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.fixed, format); + } + /** @override **/ + ; + + /** @override **/ + _proto.offset = function offset() { + return this.fixed; + } + /** @override **/ + ; + + _proto.equals = function equals(otherZone) { + return otherZone.type === "fixed" && otherZone.fixed === this.fixed; + } + /** @override **/ + ; + + _createClass(FixedOffsetZone, [{ + key: "type", + get: function get() { + return "fixed"; + } + /** @override **/ + + }, { + key: "name", + get: function get() { + return this.fixed === 0 ? "UTC" : "UTC" + formatOffset(this.fixed, "narrow"); + } + }, { + key: "universal", + get: function get() { + return true; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }]); + + return FixedOffsetZone; + }(Zone); + + /** + * A zone that failed to parse. You should never need to instantiate this. + * @implements {Zone} + */ + + var InvalidZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(InvalidZone, _Zone); + + function InvalidZone(zoneName) { + var _this; + + _this = _Zone.call(this) || this; + /** @private */ + + _this.zoneName = zoneName; + return _this; + } + /** @override **/ + + + var _proto = InvalidZone.prototype; + + /** @override **/ + _proto.offsetName = function offsetName() { + return null; + } + /** @override **/ + ; + + _proto.formatOffset = function formatOffset() { + return ""; + } + /** @override **/ + ; + + _proto.offset = function offset() { + return NaN; + } + /** @override **/ + ; + + _proto.equals = function equals() { + return false; + } + /** @override **/ + ; + + _createClass(InvalidZone, [{ + key: "type", + get: function get() { + return "invalid"; + } + /** @override **/ + + }, { + key: "name", + get: function get() { + return this.zoneName; + } + /** @override **/ + + }, { + key: "universal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return false; + } + }]); + + return InvalidZone; + }(Zone); + + /** + * @private + */ + function normalizeZone(input, defaultZone) { + var offset; + + if (isUndefined(input) || input === null) { + return defaultZone; + } else if (input instanceof Zone) { + return input; + } else if (isString(input)) { + var lowered = input.toLowerCase(); + if (lowered === "local") return defaultZone;else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance;else if ((offset = IANAZone.parseGMTOffset(input)) != null) { + // handle Etc/GMT-4, which V8 chokes on + return FixedOffsetZone.instance(offset); + } else if (IANAZone.isValidSpecifier(lowered)) return IANAZone.create(input);else return FixedOffsetZone.parseSpecifier(lowered) || new InvalidZone(input); + } else if (isNumber(input)) { + return FixedOffsetZone.instance(input); + } else if (typeof input === "object" && input.offset && typeof input.offset === "number") { + // This is dumb, but the instanceof check above doesn't seem to really work + // so we're duck checking it + return input; + } else { + return new InvalidZone(input); + } + } + + var now = function now() { + return Date.now(); + }, + defaultZone = null, + // not setting this directly to LocalZone.instance bc loading order issues + defaultLocale = null, + defaultNumberingSystem = null, + defaultOutputCalendar = null, + throwOnInvalid = false; + /** + * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. + */ + + + var Settings = /*#__PURE__*/function () { + function Settings() {} + + /** + * Reset Luxon's global caches. Should only be necessary in testing scenarios. + * @return {void} + */ + Settings.resetCaches = function resetCaches() { + Locale.resetCache(); + IANAZone.resetCache(); + }; + + _createClass(Settings, null, [{ + key: "now", + + /** + * Get the callback for returning the current timestamp. + * @type {function} + */ + get: function get() { + return now; + } + /** + * Set the callback for returning the current timestamp. + * The function should return a number, which will be interpreted as an Epoch millisecond count + * @type {function} + * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future + * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time + */ + , + set: function set(n) { + now = n; + } + /** + * Get the default time zone to create DateTimes in. + * @type {string} + */ + + }, { + key: "defaultZoneName", + get: function get() { + return Settings.defaultZone.name; + } + /** + * Set the default time zone to create DateTimes in. Does not affect existing instances. + * @type {string} + */ + , + set: function set(z) { + if (!z) { + defaultZone = null; + } else { + defaultZone = normalizeZone(z); + } + } + /** + * Get the default time zone object to create DateTimes in. Does not affect existing instances. + * @type {Zone} + */ + + }, { + key: "defaultZone", + get: function get() { + return defaultZone || LocalZone.instance; + } + /** + * Get the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + + }, { + key: "defaultLocale", + get: function get() { + return defaultLocale; + } + /** + * Set the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + , + set: function set(locale) { + defaultLocale = locale; + } + /** + * Get the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + + }, { + key: "defaultNumberingSystem", + get: function get() { + return defaultNumberingSystem; + } + /** + * Set the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + , + set: function set(numberingSystem) { + defaultNumberingSystem = numberingSystem; + } + /** + * Get the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + + }, { + key: "defaultOutputCalendar", + get: function get() { + return defaultOutputCalendar; + } + /** + * Set the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + , + set: function set(outputCalendar) { + defaultOutputCalendar = outputCalendar; + } + /** + * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + + }, { + key: "throwOnInvalid", + get: function get() { + return throwOnInvalid; + } + /** + * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + , + set: function set(t) { + throwOnInvalid = t; + } + }]); + + return Settings; + }(); + + var intlDTCache = {}; + + function getCachedDTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + + var key = JSON.stringify([locString, opts]); + var dtf = intlDTCache[key]; + + if (!dtf) { + dtf = new Intl.DateTimeFormat(locString, opts); + intlDTCache[key] = dtf; + } + + return dtf; + } + + var intlNumCache = {}; + + function getCachedINF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + + var key = JSON.stringify([locString, opts]); + var inf = intlNumCache[key]; + + if (!inf) { + inf = new Intl.NumberFormat(locString, opts); + intlNumCache[key] = inf; + } + + return inf; + } + + var intlRelCache = {}; + + function getCachedRTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + + var _opts = opts, + base = _opts.base, + cacheKeyOpts = _objectWithoutPropertiesLoose(_opts, ["base"]); // exclude `base` from the options + + + var key = JSON.stringify([locString, cacheKeyOpts]); + var inf = intlRelCache[key]; + + if (!inf) { + inf = new Intl.RelativeTimeFormat(locString, opts); + intlRelCache[key] = inf; + } + + return inf; + } + + var sysLocaleCache = null; + + function systemLocale() { + if (sysLocaleCache) { + return sysLocaleCache; + } else if (hasIntl()) { + var computedSys = new Intl.DateTimeFormat().resolvedOptions().locale; // node sometimes defaults to "und". Override that because that is dumb + + sysLocaleCache = !computedSys || computedSys === "und" ? "en-US" : computedSys; + return sysLocaleCache; + } else { + sysLocaleCache = "en-US"; + return sysLocaleCache; + } + } + + function parseLocaleString(localeStr) { + // I really want to avoid writing a BCP 47 parser + // see, e.g. https://github.com/wooorm/bcp-47 + // Instead, we'll do this: + // a) if the string has no -u extensions, just leave it alone + // b) if it does, use Intl to resolve everything + // c) if Intl fails, try again without the -u + var uIndex = localeStr.indexOf("-u-"); + + if (uIndex === -1) { + return [localeStr]; + } else { + var options; + var smaller = localeStr.substring(0, uIndex); + + try { + options = getCachedDTF(localeStr).resolvedOptions(); + } catch (e) { + options = getCachedDTF(smaller).resolvedOptions(); + } + + var _options = options, + numberingSystem = _options.numberingSystem, + calendar = _options.calendar; // return the smaller one so that we can append the calendar and numbering overrides to it + + return [smaller, numberingSystem, calendar]; + } + } + + function intlConfigString(localeStr, numberingSystem, outputCalendar) { + if (hasIntl()) { + if (outputCalendar || numberingSystem) { + localeStr += "-u"; + + if (outputCalendar) { + localeStr += "-ca-" + outputCalendar; + } + + if (numberingSystem) { + localeStr += "-nu-" + numberingSystem; + } + + return localeStr; + } else { + return localeStr; + } + } else { + return []; + } + } + + function mapMonths(f) { + var ms = []; + + for (var i = 1; i <= 12; i++) { + var dt = DateTime.utc(2016, i, 1); + ms.push(f(dt)); + } + + return ms; + } + + function mapWeekdays(f) { + var ms = []; + + for (var i = 1; i <= 7; i++) { + var dt = DateTime.utc(2016, 11, 13 + i); + ms.push(f(dt)); + } + + return ms; + } + + function listStuff(loc, length, defaultOK, englishFn, intlFn) { + var mode = loc.listingMode(defaultOK); + + if (mode === "error") { + return null; + } else if (mode === "en") { + return englishFn(length); + } else { + return intlFn(length); + } + } + + function supportsFastNumbers(loc) { + if (loc.numberingSystem && loc.numberingSystem !== "latn") { + return false; + } else { + return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || hasIntl() && new Intl.DateTimeFormat(loc.intl).resolvedOptions().numberingSystem === "latn"; + } + } + /** + * @private + */ + + + var PolyNumberFormatter = /*#__PURE__*/function () { + function PolyNumberFormatter(intl, forceSimple, opts) { + this.padTo = opts.padTo || 0; + this.floor = opts.floor || false; + + if (!forceSimple && hasIntl()) { + var intlOpts = { + useGrouping: false + }; + if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; + this.inf = getCachedINF(intl, intlOpts); + } + } + + var _proto = PolyNumberFormatter.prototype; + + _proto.format = function format(i) { + if (this.inf) { + var fixed = this.floor ? Math.floor(i) : i; + return this.inf.format(fixed); + } else { + // to match the browser's numberformatter defaults + var _fixed = this.floor ? Math.floor(i) : roundTo(i, 3); + + return padStart(_fixed, this.padTo); + } + }; + + return PolyNumberFormatter; + }(); + /** + * @private + */ + + + var PolyDateFormatter = /*#__PURE__*/function () { + function PolyDateFormatter(dt, intl, opts) { + this.opts = opts; + this.hasIntl = hasIntl(); + var z; + + if (dt.zone.universal && this.hasIntl) { + // Chromium doesn't support fixed-offset zones like Etc/GMT+8 in its formatter, + // See https://bugs.chromium.org/p/chromium/issues/detail?id=364374. + // So we have to make do. Two cases: + // 1. The format options tell us to show the zone. We can't do that, so the best + // we can do is format the date in UTC. + // 2. The format options don't tell us to show the zone. Then we can adjust them + // the time and tell the formatter to show it to us in UTC, so that the time is right + // and the bad zone doesn't show up. + // We can clean all this up when Chrome fixes this. + z = "UTC"; + + if (opts.timeZoneName) { + this.dt = dt; + } else { + this.dt = dt.offset === 0 ? dt : DateTime.fromMillis(dt.ts + dt.offset * 60 * 1000); + } + } else if (dt.zone.type === "local") { + this.dt = dt; + } else { + this.dt = dt; + z = dt.zone.name; + } + + if (this.hasIntl) { + var intlOpts = Object.assign({}, this.opts); + + if (z) { + intlOpts.timeZone = z; + } + + this.dtf = getCachedDTF(intl, intlOpts); + } + } + + var _proto2 = PolyDateFormatter.prototype; + + _proto2.format = function format() { + if (this.hasIntl) { + return this.dtf.format(this.dt.toJSDate()); + } else { + var tokenFormat = formatString(this.opts), + loc = Locale.create("en-US"); + return Formatter.create(loc).formatDateTimeFromString(this.dt, tokenFormat); + } + }; + + _proto2.formatToParts = function formatToParts() { + if (this.hasIntl && hasFormatToParts()) { + return this.dtf.formatToParts(this.dt.toJSDate()); + } else { + // This is kind of a cop out. We actually could do this for English. However, we couldn't do it for intl strings + // and IMO it's too weird to have an uncanny valley like that + return []; + } + }; + + _proto2.resolvedOptions = function resolvedOptions() { + if (this.hasIntl) { + return this.dtf.resolvedOptions(); + } else { + return { + locale: "en-US", + numberingSystem: "latn", + outputCalendar: "gregory" + }; + } + }; + + return PolyDateFormatter; + }(); + /** + * @private + */ + + + var PolyRelFormatter = /*#__PURE__*/function () { + function PolyRelFormatter(intl, isEnglish, opts) { + this.opts = Object.assign({ + style: "long" + }, opts); + + if (!isEnglish && hasRelative()) { + this.rtf = getCachedRTF(intl, opts); + } + } + + var _proto3 = PolyRelFormatter.prototype; + + _proto3.format = function format(count, unit) { + if (this.rtf) { + return this.rtf.format(count, unit); + } else { + return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); + } + }; + + _proto3.formatToParts = function formatToParts(count, unit) { + if (this.rtf) { + return this.rtf.formatToParts(count, unit); + } else { + return []; + } + }; + + return PolyRelFormatter; + }(); + /** + * @private + */ + + + var Locale = /*#__PURE__*/function () { + Locale.fromOpts = function fromOpts(opts) { + return Locale.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.defaultToEN); + }; + + Locale.create = function create(locale, numberingSystem, outputCalendar, defaultToEN) { + if (defaultToEN === void 0) { + defaultToEN = false; + } + + var specifiedLocale = locale || Settings.defaultLocale, + // the system locale is useful for human readable strings but annoying for parsing/formatting known formats + localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()), + numberingSystemR = numberingSystem || Settings.defaultNumberingSystem, + outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; + return new Locale(localeR, numberingSystemR, outputCalendarR, specifiedLocale); + }; + + Locale.resetCache = function resetCache() { + sysLocaleCache = null; + intlDTCache = {}; + intlNumCache = {}; + intlRelCache = {}; + }; + + Locale.fromObject = function fromObject(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + locale = _ref.locale, + numberingSystem = _ref.numberingSystem, + outputCalendar = _ref.outputCalendar; + + return Locale.create(locale, numberingSystem, outputCalendar); + }; + + function Locale(locale, numbering, outputCalendar, specifiedLocale) { + var _parseLocaleString = parseLocaleString(locale), + parsedLocale = _parseLocaleString[0], + parsedNumberingSystem = _parseLocaleString[1], + parsedOutputCalendar = _parseLocaleString[2]; + + this.locale = parsedLocale; + this.numberingSystem = numbering || parsedNumberingSystem || null; + this.outputCalendar = outputCalendar || parsedOutputCalendar || null; + this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); + this.weekdaysCache = { + format: {}, + standalone: {} + }; + this.monthsCache = { + format: {}, + standalone: {} + }; + this.meridiemCache = null; + this.eraCache = {}; + this.specifiedLocale = specifiedLocale; + this.fastNumbersCached = null; + } + + var _proto4 = Locale.prototype; + + _proto4.listingMode = function listingMode(defaultOK) { + if (defaultOK === void 0) { + defaultOK = true; + } + + var intl = hasIntl(), + hasFTP = intl && hasFormatToParts(), + isActuallyEn = this.isEnglish(), + hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); + + if (!hasFTP && !(isActuallyEn && hasNoWeirdness) && !defaultOK) { + return "error"; + } else if (!hasFTP || isActuallyEn && hasNoWeirdness) { + return "en"; + } else { + return "intl"; + } + }; + + _proto4.clone = function clone(alts) { + if (!alts || Object.getOwnPropertyNames(alts).length === 0) { + return this; + } else { + return Locale.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, alts.defaultToEN || false); + } + }; + + _proto4.redefaultToEN = function redefaultToEN(alts) { + if (alts === void 0) { + alts = {}; + } + + return this.clone(Object.assign({}, alts, { + defaultToEN: true + })); + }; + + _proto4.redefaultToSystem = function redefaultToSystem(alts) { + if (alts === void 0) { + alts = {}; + } + + return this.clone(Object.assign({}, alts, { + defaultToEN: false + })); + }; + + _proto4.months = function months$1(length, format, defaultOK) { + var _this = this; + + if (format === void 0) { + format = false; + } + + if (defaultOK === void 0) { + defaultOK = true; + } + + return listStuff(this, length, defaultOK, months, function () { + var intl = format ? { + month: length, + day: "numeric" + } : { + month: length + }, + formatStr = format ? "format" : "standalone"; + + if (!_this.monthsCache[formatStr][length]) { + _this.monthsCache[formatStr][length] = mapMonths(function (dt) { + return _this.extract(dt, intl, "month"); + }); + } + + return _this.monthsCache[formatStr][length]; + }); + }; + + _proto4.weekdays = function weekdays$1(length, format, defaultOK) { + var _this2 = this; + + if (format === void 0) { + format = false; + } + + if (defaultOK === void 0) { + defaultOK = true; + } + + return listStuff(this, length, defaultOK, weekdays, function () { + var intl = format ? { + weekday: length, + year: "numeric", + month: "long", + day: "numeric" + } : { + weekday: length + }, + formatStr = format ? "format" : "standalone"; + + if (!_this2.weekdaysCache[formatStr][length]) { + _this2.weekdaysCache[formatStr][length] = mapWeekdays(function (dt) { + return _this2.extract(dt, intl, "weekday"); + }); + } + + return _this2.weekdaysCache[formatStr][length]; + }); + }; + + _proto4.meridiems = function meridiems$1(defaultOK) { + var _this3 = this; + + if (defaultOK === void 0) { + defaultOK = true; + } + + return listStuff(this, undefined, defaultOK, function () { + return meridiems; + }, function () { + // In theory there could be aribitrary day periods. We're gonna assume there are exactly two + // for AM and PM. This is probably wrong, but it's makes parsing way easier. + if (!_this3.meridiemCache) { + var intl = { + hour: "numeric", + hour12: true + }; + _this3.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(function (dt) { + return _this3.extract(dt, intl, "dayperiod"); + }); + } + + return _this3.meridiemCache; + }); + }; + + _proto4.eras = function eras$1(length, defaultOK) { + var _this4 = this; + + if (defaultOK === void 0) { + defaultOK = true; + } + + return listStuff(this, length, defaultOK, eras, function () { + var intl = { + era: length + }; // This is utter bullshit. Different calendars are going to define eras totally differently. What I need is the minimum set of dates + // to definitely enumerate them. + + if (!_this4.eraCache[length]) { + _this4.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map(function (dt) { + return _this4.extract(dt, intl, "era"); + }); + } + + return _this4.eraCache[length]; + }); + }; + + _proto4.extract = function extract(dt, intlOpts, field) { + var df = this.dtFormatter(dt, intlOpts), + results = df.formatToParts(), + matching = results.find(function (m) { + return m.type.toLowerCase() === field; + }); + return matching ? matching.value : null; + }; + + _proto4.numberFormatter = function numberFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + + // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) + // (in contrast, the rest of the condition is used heavily) + return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); + }; + + _proto4.dtFormatter = function dtFormatter(dt, intlOpts) { + if (intlOpts === void 0) { + intlOpts = {}; + } + + return new PolyDateFormatter(dt, this.intl, intlOpts); + }; + + _proto4.relFormatter = function relFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + + return new PolyRelFormatter(this.intl, this.isEnglish(), opts); + }; + + _proto4.isEnglish = function isEnglish() { + return this.locale === "en" || this.locale.toLowerCase() === "en-us" || hasIntl() && new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("en-us"); + }; + + _proto4.equals = function equals(other) { + return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar; + }; + + _createClass(Locale, [{ + key: "fastNumbers", + get: function get() { + if (this.fastNumbersCached == null) { + this.fastNumbersCached = supportsFastNumbers(this); + } + + return this.fastNumbersCached; + } + }]); + + return Locale; + }(); + + /* + * This file handles parsing for well-specified formats. Here's how it works: + * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. + * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object + * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. + * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. + * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. + * Some extractions are super dumb and simpleParse and fromStrings help DRY them. + */ + + function combineRegexes() { + for (var _len = arguments.length, regexes = new Array(_len), _key = 0; _key < _len; _key++) { + regexes[_key] = arguments[_key]; + } + + var full = regexes.reduce(function (f, r) { + return f + r.source; + }, ""); + return RegExp("^" + full + "$"); + } + + function combineExtractors() { + for (var _len2 = arguments.length, extractors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + extractors[_key2] = arguments[_key2]; + } + + return function (m) { + return extractors.reduce(function (_ref, ex) { + var mergedVals = _ref[0], + mergedZone = _ref[1], + cursor = _ref[2]; + + var _ex = ex(m, cursor), + val = _ex[0], + zone = _ex[1], + next = _ex[2]; + + return [Object.assign(mergedVals, val), mergedZone || zone, next]; + }, [{}, null, 1]).slice(0, 2); + }; + } + + function parse(s) { + if (s == null) { + return [null, null]; + } + + for (var _len3 = arguments.length, patterns = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + patterns[_key3 - 1] = arguments[_key3]; + } + + for (var _i = 0, _patterns = patterns; _i < _patterns.length; _i++) { + var _patterns$_i = _patterns[_i], + regex = _patterns$_i[0], + extractor = _patterns$_i[1]; + var m = regex.exec(s); + + if (m) { + return extractor(m); + } + } + + return [null, null]; + } + + function simpleParse() { + for (var _len4 = arguments.length, keys = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + keys[_key4] = arguments[_key4]; + } + + return function (match, cursor) { + var ret = {}; + var i; + + for (i = 0; i < keys.length; i++) { + ret[keys[i]] = parseInteger(match[cursor + i]); + } + + return [ret, null, cursor + i]; + }; + } // ISO and SQL parsing + + + var offsetRegex = /(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/, + isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,9}))?)?)?/, + isoTimeRegex = RegExp("" + isoTimeBaseRegex.source + offsetRegex.source + "?"), + isoTimeExtensionRegex = RegExp("(?:T" + isoTimeRegex.source + ")?"), + isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/, + isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/, + isoOrdinalRegex = /(\d{4})-?(\d{3})/, + extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"), + extractISOOrdinalData = simpleParse("year", "ordinal"), + sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/, + // dumbed-down version of the ISO one + sqlTimeRegex = RegExp(isoTimeBaseRegex.source + " ?(?:" + offsetRegex.source + "|(" + ianaRegex.source + "))?"), + sqlTimeExtensionRegex = RegExp("(?: " + sqlTimeRegex.source + ")?"); + + function int(match, pos, fallback) { + var m = match[pos]; + return isUndefined(m) ? fallback : parseInteger(m); + } + + function extractISOYmd(match, cursor) { + var item = { + year: int(match, cursor), + month: int(match, cursor + 1, 1), + day: int(match, cursor + 2, 1) + }; + return [item, null, cursor + 3]; + } + + function extractISOTime(match, cursor) { + var item = { + hour: int(match, cursor, 0), + minute: int(match, cursor + 1, 0), + second: int(match, cursor + 2, 0), + millisecond: parseMillis(match[cursor + 3]) + }; + return [item, null, cursor + 4]; + } + + function extractISOOffset(match, cursor) { + var local = !match[cursor] && !match[cursor + 1], + fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), + zone = local ? null : FixedOffsetZone.instance(fullOffset); + return [{}, zone, cursor + 3]; + } + + function extractIANAZone(match, cursor) { + var zone = match[cursor] ? IANAZone.create(match[cursor]) : null; + return [{}, zone, cursor + 1]; + } // ISO duration parsing + + + var isoDuration = /^-?P(?:(?:(-?\d{1,9})Y)?(?:(-?\d{1,9})M)?(?:(-?\d{1,9})W)?(?:(-?\d{1,9})D)?(?:T(?:(-?\d{1,9})H)?(?:(-?\d{1,9})M)?(?:(-?\d{1,9})(?:[.,](-?\d{1,9}))?S)?)?)$/; + + function extractISODuration(match) { + var s = match[0], + yearStr = match[1], + monthStr = match[2], + weekStr = match[3], + dayStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + millisecondsStr = match[8]; + var hasNegativePrefix = s[0] === "-"; + + var maybeNegate = function maybeNegate(num) { + return num && hasNegativePrefix ? -num : num; + }; + + return [{ + years: maybeNegate(parseInteger(yearStr)), + months: maybeNegate(parseInteger(monthStr)), + weeks: maybeNegate(parseInteger(weekStr)), + days: maybeNegate(parseInteger(dayStr)), + hours: maybeNegate(parseInteger(hourStr)), + minutes: maybeNegate(parseInteger(minuteStr)), + seconds: maybeNegate(parseInteger(secondStr)), + milliseconds: maybeNegate(parseMillis(millisecondsStr)) + }]; + } // These are a little braindead. EDT *should* tell us that we're in, say, America/New_York + // and not just that we're in -240 *right now*. But since I don't think these are used that often + // I'm just going to ignore that + + + var obsOffsets = { + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; + + function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = { + year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), + month: monthsShort.indexOf(monthStr) + 1, + day: parseInteger(dayStr), + hour: parseInteger(hourStr), + minute: parseInteger(minuteStr) + }; + if (secondStr) result.second = parseInteger(secondStr); + + if (weekdayStr) { + result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1; + } + + return result; + } // RFC 2822/5322 + + + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; + + function extractRFC2822(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + obsOffset = match[8], + milOffset = match[9], + offHourStr = match[10], + offMinuteStr = match[11], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + var offset; + + if (obsOffset) { + offset = obsOffsets[obsOffset]; + } else if (milOffset) { + offset = 0; + } else { + offset = signedOffset(offHourStr, offMinuteStr); + } + + return [result, new FixedOffsetZone(offset)]; + } + + function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^)]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim(); + } // http date + + + var rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, + rfc850 = /^(Monday|Tuesday|Wedsday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, + ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; + + function extractRFC1123Or850(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + + function extractASCII(match) { + var weekdayStr = match[1], + monthStr = match[2], + dayStr = match[3], + hourStr = match[4], + minuteStr = match[5], + secondStr = match[6], + yearStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + + var isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); + var isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); + var isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); + var isoTimeCombinedRegex = combineRegexes(isoTimeRegex); + var extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset); + var extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset); + var extractISOOrdinalDataAndTime = combineExtractors(extractISOOrdinalData, extractISOTime); + var extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset); + /** + * @private + */ + + function parseISODate(s) { + return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDataAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]); + } + function parseRFC2822Date(s) { + return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); + } + function parseHTTPDate(s) { + return parse(s, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]); + } + function parseISODuration(s) { + return parse(s, [isoDuration, extractISODuration]); + } + var sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); + var sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); + var extractISOYmdTimeOffsetAndIANAZone = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + function parseSQL(s) { + return parse(s, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeOffsetAndIANAZone], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]); + } + + var INVALID = "Invalid Duration"; // unit conversion constants + + var lowOrderMatrix = { + weeks: { + days: 7, + hours: 7 * 24, + minutes: 7 * 24 * 60, + seconds: 7 * 24 * 60 * 60, + milliseconds: 7 * 24 * 60 * 60 * 1000 + }, + days: { + hours: 24, + minutes: 24 * 60, + seconds: 24 * 60 * 60, + milliseconds: 24 * 60 * 60 * 1000 + }, + hours: { + minutes: 60, + seconds: 60 * 60, + milliseconds: 60 * 60 * 1000 + }, + minutes: { + seconds: 60, + milliseconds: 60 * 1000 + }, + seconds: { + milliseconds: 1000 + } + }, + casualMatrix = Object.assign({ + years: { + months: 12, + weeks: 52, + days: 365, + hours: 365 * 24, + minutes: 365 * 24 * 60, + seconds: 365 * 24 * 60 * 60, + milliseconds: 365 * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: 13, + days: 91, + hours: 91 * 24, + minutes: 91 * 24 * 60, + milliseconds: 91 * 24 * 60 * 60 * 1000 + }, + months: { + weeks: 4, + days: 30, + hours: 30 * 24, + minutes: 30 * 24 * 60, + seconds: 30 * 24 * 60 * 60, + milliseconds: 30 * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix), + daysInYearAccurate = 146097.0 / 400, + daysInMonthAccurate = 146097.0 / 4800, + accurateMatrix = Object.assign({ + years: { + months: 12, + weeks: daysInYearAccurate / 7, + days: daysInYearAccurate, + hours: daysInYearAccurate * 24, + minutes: daysInYearAccurate * 24 * 60, + seconds: daysInYearAccurate * 24 * 60 * 60, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: daysInYearAccurate / 28, + days: daysInYearAccurate / 4, + hours: daysInYearAccurate * 24 / 4, + minutes: daysInYearAccurate * 24 * 60 / 4, + seconds: daysInYearAccurate * 24 * 60 * 60 / 4, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 / 4 + }, + months: { + weeks: daysInMonthAccurate / 7, + days: daysInMonthAccurate, + hours: daysInMonthAccurate * 24, + minutes: daysInMonthAccurate * 24 * 60, + seconds: daysInMonthAccurate * 24 * 60 * 60, + milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix); // units ordered by size + + var orderedUnits = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"]; + var reverseUnits = orderedUnits.slice(0).reverse(); // clone really means "create another instance just like this one, but with these changes" + + function clone(dur, alts, clear) { + if (clear === void 0) { + clear = false; + } + + // deep merge for vals + var conf = { + values: clear ? alts.values : Object.assign({}, dur.values, alts.values || {}), + loc: dur.loc.clone(alts.loc), + conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy + }; + return new Duration(conf); + } + + function antiTrunc(n) { + return n < 0 ? Math.floor(n) : Math.ceil(n); + } // NB: mutates parameters + + + function convert(matrix, fromMap, fromUnit, toMap, toUnit) { + var conv = matrix[toUnit][fromUnit], + raw = fromMap[fromUnit] / conv, + sameSign = Math.sign(raw) === Math.sign(toMap[toUnit]), + // ok, so this is wild, but see the matrix in the tests + added = !sameSign && toMap[toUnit] !== 0 && Math.abs(raw) <= 1 ? antiTrunc(raw) : Math.trunc(raw); + toMap[toUnit] += added; + fromMap[fromUnit] -= added * conv; + } // NB: mutates parameters + + + function normalizeValues(matrix, vals) { + reverseUnits.reduce(function (previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + convert(matrix, vals, previous, vals, current); + } + + return current; + } else { + return previous; + } + }, null); + } + /** + * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime.plus} to add a Duration object to a DateTime, producing another DateTime. + * + * Here is a brief overview of commonly used methods and getters in Duration: + * + * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. + * * **Unit values** See the {@link Duration.years}, {@link Duration.months}, {@link Duration.weeks}, {@link Duration.days}, {@link Duration.hours}, {@link Duration.minutes}, {@link Duration.seconds}, {@link Duration.milliseconds} accessors. + * * **Configuration** See {@link Duration.locale} and {@link Duration.numberingSystem} accessors. + * * **Transformation** To create new Durations out of old ones use {@link Duration.plus}, {@link Duration.minus}, {@link Duration.normalize}, {@link Duration.set}, {@link Duration.reconfigure}, {@link Duration.shiftTo}, and {@link Duration.negate}. + * * **Output** To convert the Duration into other representations, see {@link Duration.as}, {@link Duration.toISO}, {@link Duration.toFormat}, and {@link Duration.toJSON} + * + * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. + */ + + + var Duration = /*#__PURE__*/function () { + /** + * @private + */ + function Duration(config) { + var accurate = config.conversionAccuracy === "longterm" || false; + /** + * @access private + */ + + this.values = config.values; + /** + * @access private + */ + + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + + this.conversionAccuracy = accurate ? "longterm" : "casual"; + /** + * @access private + */ + + this.invalid = config.invalid || null; + /** + * @access private + */ + + this.matrix = accurate ? accurateMatrix : casualMatrix; + /** + * @access private + */ + + this.isLuxonDuration = true; + } + /** + * Create Duration from a number of milliseconds. + * @param {number} count of milliseconds + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + + + Duration.fromMillis = function fromMillis(count, opts) { + return Duration.fromObject(Object.assign({ + milliseconds: count + }, opts)); + } + /** + * Create a Duration from a Javascript object with keys like 'years' and 'hours. + * If this object is empty then a zero milliseconds duration is returned. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.years + * @param {number} obj.quarters + * @param {number} obj.months + * @param {number} obj.weeks + * @param {number} obj.days + * @param {number} obj.hours + * @param {number} obj.minutes + * @param {number} obj.seconds + * @param {number} obj.milliseconds + * @param {string} [obj.locale='en-US'] - the locale to use + * @param {string} obj.numberingSystem - the numbering system to use + * @param {string} [obj.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + ; + + Duration.fromObject = function fromObject(obj) { + if (obj == null || typeof obj !== "object") { + throw new InvalidArgumentError("Duration.fromObject: argument expected to be an object, got " + (obj === null ? "null" : typeof obj)); + } + + return new Duration({ + values: normalizeObject(obj, Duration.normalizeUnit, ["locale", "numberingSystem", "conversionAccuracy", "zone" // a bit of debt; it's super inconvenient internally not to be able to blindly pass this + ]), + loc: Locale.fromObject(obj), + conversionAccuracy: obj.conversionAccuracy + }); + } + /** + * Create a Duration from an ISO 8601 duration string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } + * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } + * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } + * @return {Duration} + */ + ; + + Duration.fromISO = function fromISO(text, opts) { + var _parseISODuration = parseISODuration(text), + parsed = _parseISODuration[0]; + + if (parsed) { + var obj = Object.assign(parsed, opts); + return Duration.fromObject(obj); + } else { + return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + } + /** + * Create an invalid Duration. + * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Duration} + */ + ; + + Duration.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); + } + + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + + if (Settings.throwOnInvalid) { + throw new InvalidDurationError(invalid); + } else { + return new Duration({ + invalid: invalid + }); + } + } + /** + * @private + */ + ; + + Duration.normalizeUnit = function normalizeUnit(unit) { + var normalized = { + year: "years", + years: "years", + quarter: "quarters", + quarters: "quarters", + month: "months", + months: "months", + week: "weeks", + weeks: "weeks", + day: "days", + days: "days", + hour: "hours", + hours: "hours", + minute: "minutes", + minutes: "minutes", + second: "seconds", + seconds: "seconds", + millisecond: "milliseconds", + milliseconds: "milliseconds" + }[unit ? unit.toLowerCase() : unit]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } + /** + * Check if an object is a Duration. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + ; + + Duration.isDuration = function isDuration(o) { + return o && o.isLuxonDuration || false; + } + /** + * Get the locale of a Duration, such 'en-GB' + * @type {string} + */ + ; + + var _proto = Duration.prototype; + + /** + * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: + * * `S` for milliseconds + * * `s` for seconds + * * `m` for minutes + * * `h` for hours + * * `d` for days + * * `M` for months + * * `y` for years + * Notes: + * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits + * * The duration will be converted to the set of units in the format string using {@link Duration.shiftTo} and the Durations's conversion accuracy setting. + * @param {string} fmt - the format string + * @param {Object} opts - options + * @param {boolean} [opts.floor=true] - floor numerical values + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" + * @return {string} + */ + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + + // reverse-compat since 1.2; we always round down now, never up, and we do it by default + var fmtOpts = Object.assign({}, opts, { + floor: opts.round !== false && opts.floor !== false + }); + return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID; + } + /** + * Returns a Javascript object with this Duration's values. + * @param opts - options for generating the object + * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } + * @return {Object} + */ + ; + + _proto.toObject = function toObject(opts) { + if (opts === void 0) { + opts = {}; + } + + if (!this.isValid) return {}; + var base = Object.assign({}, this.values); + + if (opts.includeConfig) { + base.conversionAccuracy = this.conversionAccuracy; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + + return base; + } + /** + * Returns an ISO 8601-compliant string representation of this Duration. + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' + * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' + * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' + * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' + * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' + * @return {string} + */ + ; + + _proto.toISO = function toISO() { + // we could use the formatter, but this is an easier way to get the minimum string + if (!this.isValid) return null; + var s = "P"; + if (this.years !== 0) s += this.years + "Y"; + if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; + if (this.weeks !== 0) s += this.weeks + "W"; + if (this.days !== 0) s += this.days + "D"; + if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) s += "T"; + if (this.hours !== 0) s += this.hours + "H"; + if (this.minutes !== 0) s += this.minutes + "M"; + if (this.seconds !== 0 || this.milliseconds !== 0) // this will handle "floating point madness" by removing extra decimal places + // https://stackoverflow.com/questions/588004/is-floating-point-math-broken + s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; + if (s === "P") s += "T0S"; + return s; + } + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. + * @return {string} + */ + ; + + _proto.toJSON = function toJSON() { + return this.toISO(); + } + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. + * @return {string} + */ + ; + + _proto.toString = function toString() { + return this.toISO(); + } + /** + * Returns an milliseconds value of this Duration. + * @return {number} + */ + ; + + _proto.valueOf = function valueOf() { + return this.as("milliseconds"); + } + /** + * Make this Duration longer by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */ + ; + + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = friendlyDuration(duration), + result = {}; + + for (var _iterator = _createForOfIteratorHelperLoose(orderedUnits), _step; !(_step = _iterator()).done;) { + var k = _step.value; + + if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { + result[k] = dur.get(k) + this.get(k); + } + } + + return clone(this, { + values: result + }, true); + } + /** + * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */ + ; + + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = friendlyDuration(duration); + return this.plus(dur.negate()); + } + /** + * Scale this Duration by the specified amount. Return a newly-constructed Duration. + * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnit(x => x * 2) //=> { hours: 2, minutes: 60 } + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnit((x, u) => u === "hour" ? x * 2 : x) //=> { hours: 2, minutes: 30 } + * @return {Duration} + */ + ; + + _proto.mapUnits = function mapUnits(fn) { + if (!this.isValid) return this; + var result = {}; + + for (var _i = 0, _Object$keys = Object.keys(this.values); _i < _Object$keys.length; _i++) { + var k = _Object$keys[_i]; + result[k] = asNumber(fn(this.values[k], k)); + } + + return clone(this, { + values: result + }, true); + } + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example Duration.fromObject({years: 2, days: 3}).years //=> 2 + * @example Duration.fromObject({years: 2, days: 3}).months //=> 0 + * @example Duration.fromObject({years: 2, days: 3}).days //=> 3 + * @return {number} + */ + ; + + _proto.get = function get(unit) { + return this[Duration.normalizeUnit(unit)]; + } + /** + * "Set" the values of specified units. Return a newly-constructed Duration. + * @param {Object} values - a mapping of units to numbers + * @example dur.set({ years: 2017 }) + * @example dur.set({ hours: 8, minutes: 30 }) + * @return {Duration} + */ + ; + + _proto.set = function set(values) { + if (!this.isValid) return this; + var mixed = Object.assign(this.values, normalizeObject(values, Duration.normalizeUnit, [])); + return clone(this, { + values: mixed + }); + } + /** + * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. + * @example dur.reconfigure({ locale: 'en-GB' }) + * @return {Duration} + */ + ; + + _proto.reconfigure = function reconfigure(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + locale = _ref.locale, + numberingSystem = _ref.numberingSystem, + conversionAccuracy = _ref.conversionAccuracy; + + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem + }), + opts = { + loc: loc + }; + + if (conversionAccuracy) { + opts.conversionAccuracy = conversionAccuracy; + } + + return clone(this, opts); + } + /** + * Return the length of the duration in the specified unit. + * @param {string} unit - a unit such as 'minutes' or 'days' + * @example Duration.fromObject({years: 1}).as('days') //=> 365 + * @example Duration.fromObject({years: 1}).as('months') //=> 12 + * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 + * @return {number} + */ + ; + + _proto.as = function as(unit) { + return this.isValid ? this.shiftTo(unit).get(unit) : NaN; + } + /** + * Reduce this Duration to its canonical representation in its current units. + * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } + * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } + * @return {Duration} + */ + ; + + _proto.normalize = function normalize() { + if (!this.isValid) return this; + var vals = this.toObject(); + normalizeValues(this.matrix, vals); + return clone(this, { + values: vals + }, true); + } + /** + * Convert this Duration into its representation in a different set of units. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } + * @return {Duration} + */ + ; + + _proto.shiftTo = function shiftTo() { + for (var _len = arguments.length, units = new Array(_len), _key = 0; _key < _len; _key++) { + units[_key] = arguments[_key]; + } + + if (!this.isValid) return this; + + if (units.length === 0) { + return this; + } + + units = units.map(function (u) { + return Duration.normalizeUnit(u); + }); + var built = {}, + accumulated = {}, + vals = this.toObject(); + var lastUnit; + normalizeValues(this.matrix, vals); + + for (var _iterator2 = _createForOfIteratorHelperLoose(orderedUnits), _step2; !(_step2 = _iterator2()).done;) { + var k = _step2.value; + + if (units.indexOf(k) >= 0) { + lastUnit = k; + var own = 0; // anything we haven't boiled down yet should get boiled to this unit + + for (var ak in accumulated) { + own += this.matrix[ak][k] * accumulated[ak]; + accumulated[ak] = 0; + } // plus anything that's already in this unit + + + if (isNumber(vals[k])) { + own += vals[k]; + } + + var i = Math.trunc(own); + built[k] = i; + accumulated[k] = own - i; // we'd like to absorb these fractions in another unit + // plus anything further down the chain that should be rolled up in to this + + for (var down in vals) { + if (orderedUnits.indexOf(down) > orderedUnits.indexOf(k)) { + convert(this.matrix, vals, down, built, k); + } + } // otherwise, keep it in the wings to boil it later + + } else if (isNumber(vals[k])) { + accumulated[k] = vals[k]; + } + } // anything leftover becomes the decimal for the last unit + // lastUnit must be defined since units is not empty + + + for (var key in accumulated) { + if (accumulated[key] !== 0) { + built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; + } + } + + return clone(this, { + values: built + }, true).normalize(); + } + /** + * Return the negative of this Duration. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } + * @return {Duration} + */ + ; + + _proto.negate = function negate() { + if (!this.isValid) return this; + var negated = {}; + + for (var _i2 = 0, _Object$keys2 = Object.keys(this.values); _i2 < _Object$keys2.length; _i2++) { + var k = _Object$keys2[_i2]; + negated[k] = -this.values[k]; + } + + return clone(this, { + values: negated + }, true); + } + /** + * Get the years. + * @type {number} + */ + ; + + /** + * Equality check + * Two Durations are equal iff they have the same units and the same values for each unit. + * @param {Duration} other + * @return {boolean} + */ + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + + if (!this.loc.equals(other.loc)) { + return false; + } + + for (var _iterator3 = _createForOfIteratorHelperLoose(orderedUnits), _step3; !(_step3 = _iterator3()).done;) { + var u = _step3.value; + + if (this.values[u] !== other.values[u]) { + return false; + } + } + + return true; + }; + + _createClass(Duration, [{ + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + /** + * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration + * + * @type {string} + */ + + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + }, { + key: "years", + get: function get() { + return this.isValid ? this.values.years || 0 : NaN; + } + /** + * Get the quarters. + * @type {number} + */ + + }, { + key: "quarters", + get: function get() { + return this.isValid ? this.values.quarters || 0 : NaN; + } + /** + * Get the months. + * @type {number} + */ + + }, { + key: "months", + get: function get() { + return this.isValid ? this.values.months || 0 : NaN; + } + /** + * Get the weeks + * @type {number} + */ + + }, { + key: "weeks", + get: function get() { + return this.isValid ? this.values.weeks || 0 : NaN; + } + /** + * Get the days. + * @type {number} + */ + + }, { + key: "days", + get: function get() { + return this.isValid ? this.values.days || 0 : NaN; + } + /** + * Get the hours. + * @type {number} + */ + + }, { + key: "hours", + get: function get() { + return this.isValid ? this.values.hours || 0 : NaN; + } + /** + * Get the minutes. + * @type {number} + */ + + }, { + key: "minutes", + get: function get() { + return this.isValid ? this.values.minutes || 0 : NaN; + } + /** + * Get the seconds. + * @return {number} + */ + + }, { + key: "seconds", + get: function get() { + return this.isValid ? this.values.seconds || 0 : NaN; + } + /** + * Get the milliseconds. + * @return {number} + */ + + }, { + key: "milliseconds", + get: function get() { + return this.isValid ? this.values.milliseconds || 0 : NaN; + } + /** + * Returns whether the Duration is invalid. Invalid durations are returned by diff operations + * on invalid DateTimes or Intervals. + * @return {boolean} + */ + + }, { + key: "isValid", + get: function get() { + return this.invalid === null; + } + /** + * Returns an error code if this Duration became invalid, or null if the Duration is valid + * @return {string} + */ + + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + /** + * Returns an explanation of why this Duration became invalid, or null if the Duration is valid + * @type {string} + */ + + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + + return Duration; + }(); + function friendlyDuration(durationish) { + if (isNumber(durationish)) { + return Duration.fromMillis(durationish); + } else if (Duration.isDuration(durationish)) { + return durationish; + } else if (typeof durationish === "object") { + return Duration.fromObject(durationish); + } else { + throw new InvalidArgumentError("Unknown duration argument " + durationish + " of type " + typeof durationish); + } + } + + var INVALID$1 = "Invalid Interval"; // checks if the start is equal to or before the end + + function validateStartEnd(start, end) { + if (!start || !start.isValid) { + return Interval.invalid("missing or invalid start"); + } else if (!end || !end.isValid) { + return Interval.invalid("missing or invalid end"); + } else if (end < start) { + return Interval.invalid("end before start", "The end of an interval must be after its start, but you had start=" + start.toISO() + " and end=" + end.toISO()); + } else { + return null; + } + } + /** + * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. + * + * Here is a brief overview of the most commonly used methods and getters in Interval: + * + * * **Creation** To create an Interval, use {@link fromDateTimes}, {@link after}, {@link before}, or {@link fromISO}. + * * **Accessors** Use {@link start} and {@link end} to get the start and end. + * * **Interrogation** To analyze the Interval, use {@link count}, {@link length}, {@link hasSame}, {@link contains}, {@link isAfter}, or {@link isBefore}. + * * **Transformation** To create other Intervals out of this one, use {@link set}, {@link splitAt}, {@link splitBy}, {@link divideEqually}, {@link merge}, {@link xor}, {@link union}, {@link intersection}, or {@link difference}. + * * **Comparison** To compare this Interval to another one, use {@link equals}, {@link overlaps}, {@link abutsStart}, {@link abutsEnd}, {@link engulfs} + * * **Output** To convert the Interval into other representations, see {@link toString}, {@link toISO}, {@link toISODate}, {@link toISOTime}, {@link toFormat}, and {@link toDuration}. + */ + + + var Interval = /*#__PURE__*/function () { + /** + * @private + */ + function Interval(config) { + /** + * @access private + */ + this.s = config.start; + /** + * @access private + */ + + this.e = config.end; + /** + * @access private + */ + + this.invalid = config.invalid || null; + /** + * @access private + */ + + this.isLuxonInterval = true; + } + /** + * Create an invalid Interval. + * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Interval} + */ + + + Interval.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); + } + + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + + if (Settings.throwOnInvalid) { + throw new InvalidIntervalError(invalid); + } else { + return new Interval({ + invalid: invalid + }); + } + } + /** + * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. + * @param {DateTime|Date|Object} start + * @param {DateTime|Date|Object} end + * @return {Interval} + */ + ; + + Interval.fromDateTimes = function fromDateTimes(start, end) { + var builtStart = friendlyDateTime(start), + builtEnd = friendlyDateTime(end); + var validateError = validateStartEnd(builtStart, builtEnd); + + if (validateError == null) { + return new Interval({ + start: builtStart, + end: builtEnd + }); + } else { + return validateError; + } + } + /** + * Create an Interval from a start DateTime and a Duration to extend to. + * @param {DateTime|Date|Object} start + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */ + ; + + Interval.after = function after(start, duration) { + var dur = friendlyDuration(duration), + dt = friendlyDateTime(start); + return Interval.fromDateTimes(dt, dt.plus(dur)); + } + /** + * Create an Interval from an end DateTime and a Duration to extend backwards to. + * @param {DateTime|Date|Object} end + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */ + ; + + Interval.before = function before(end, duration) { + var dur = friendlyDuration(duration), + dt = friendlyDateTime(end); + return Interval.fromDateTimes(dt.minus(dur), dt); + } + /** + * Create an Interval from an ISO 8601 string. + * Accepts `/`, `/`, and `/` formats. + * @param {string} text - the ISO string to parse + * @param {Object} [opts] - options to pass {@link DateTime.fromISO} and optionally {@link Duration.fromISO} + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {Interval} + */ + ; + + Interval.fromISO = function fromISO(text, opts) { + var _split = (text || "").split("/", 2), + s = _split[0], + e = _split[1]; + + if (s && e) { + var start = DateTime.fromISO(s, opts), + end = DateTime.fromISO(e, opts); + + if (start.isValid && end.isValid) { + return Interval.fromDateTimes(start, end); + } + + if (start.isValid) { + var dur = Duration.fromISO(e, opts); + + if (dur.isValid) { + return Interval.after(start, dur); + } + } else if (end.isValid) { + var _dur = Duration.fromISO(s, opts); + + if (_dur.isValid) { + return Interval.before(end, _dur); + } + } + } + + return Interval.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + /** + * Check if an object is an Interval. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + ; + + Interval.isInterval = function isInterval(o) { + return o && o.isLuxonInterval || false; + } + /** + * Returns the start of the Interval + * @type {DateTime} + */ + ; + + var _proto = Interval.prototype; + + /** + * Returns the length of the Interval in the specified unit. + * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. + * @return {number} + */ + _proto.length = function length(unit) { + if (unit === void 0) { + unit = "milliseconds"; + } + + return this.isValid ? this.toDuration.apply(this, [unit]).get(unit) : NaN; + } + /** + * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. + * Unlike {@link length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' + * asks 'what dates are included in this interval?', not 'how many days long is this interval?' + * @param {string} [unit='milliseconds'] - the unit of time to count. + * @return {number} + */ + ; + + _proto.count = function count(unit) { + if (unit === void 0) { + unit = "milliseconds"; + } + + if (!this.isValid) return NaN; + var start = this.start.startOf(unit), + end = this.end.startOf(unit); + return Math.floor(end.diff(start, unit).get(unit)) + 1; + } + /** + * Returns whether this Interval's start and end are both in the same unit of time + * @param {string} unit - the unit of time to check sameness on + * @return {boolean} + */ + ; + + _proto.hasSame = function hasSame(unit) { + return this.isValid ? this.e.minus(1).hasSame(this.s, unit) : false; + } + /** + * Return whether this Interval has the same start and end DateTimes. + * @return {boolean} + */ + ; + + _proto.isEmpty = function isEmpty() { + return this.s.valueOf() === this.e.valueOf(); + } + /** + * Return whether this Interval's start is after the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + ; + + _proto.isAfter = function isAfter(dateTime) { + if (!this.isValid) return false; + return this.s > dateTime; + } + /** + * Return whether this Interval's end is before the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + ; + + _proto.isBefore = function isBefore(dateTime) { + if (!this.isValid) return false; + return this.e <= dateTime; + } + /** + * Return whether this Interval contains the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + ; + + _proto.contains = function contains(dateTime) { + if (!this.isValid) return false; + return this.s <= dateTime && this.e > dateTime; + } + /** + * "Sets" the start and/or end dates. Returns a newly-constructed Interval. + * @param {Object} values - the values to set + * @param {DateTime} values.start - the starting DateTime + * @param {DateTime} values.end - the ending DateTime + * @return {Interval} + */ + ; + + _proto.set = function set(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + start = _ref.start, + end = _ref.end; + + if (!this.isValid) return this; + return Interval.fromDateTimes(start || this.s, end || this.e); + } + /** + * Split this Interval at each of the specified DateTimes + * @param {...[DateTime]} dateTimes - the unit of time to count. + * @return {[Interval]} + */ + ; + + _proto.splitAt = function splitAt() { + var _this = this; + + if (!this.isValid) return []; + + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + + var sorted = dateTimes.map(friendlyDateTime).filter(function (d) { + return _this.contains(d); + }).sort(), + results = []; + var s = this.s, + i = 0; + + while (s < this.e) { + var added = sorted[i] || this.e, + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + i += 1; + } + + return results; + } + /** + * Split this Interval into smaller Intervals, each of the specified length. + * Left over time is grouped into a smaller interval + * @param {Duration|Object|number} duration - The length of each resulting interval. + * @return {[Interval]} + */ + ; + + _proto.splitBy = function splitBy(duration) { + var dur = friendlyDuration(duration); + + if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { + return []; + } + + var s = this.s, + added, + next; + var results = []; + + while (s < this.e) { + added = s.plus(dur); + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + } + + return results; + } + /** + * Split this Interval into the specified number of smaller intervals. + * @param {number} numberOfParts - The number of Intervals to divide the Interval into. + * @return {[Interval]} + */ + ; + + _proto.divideEqually = function divideEqually(numberOfParts) { + if (!this.isValid) return []; + return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); + } + /** + * Return whether this Interval overlaps with the specified Interval + * @param {Interval} other + * @return {boolean} + */ + ; + + _proto.overlaps = function overlaps(other) { + return this.e > other.s && this.s < other.e; + } + /** + * Return whether this Interval's end is adjacent to the specified Interval's start. + * @param {Interval} other + * @return {boolean} + */ + ; + + _proto.abutsStart = function abutsStart(other) { + if (!this.isValid) return false; + return +this.e === +other.s; + } + /** + * Return whether this Interval's start is adjacent to the specified Interval's end. + * @param {Interval} other + * @return {boolean} + */ + ; + + _proto.abutsEnd = function abutsEnd(other) { + if (!this.isValid) return false; + return +other.e === +this.s; + } + /** + * Return whether this Interval engulfs the start and end of the specified Interval. + * @param {Interval} other + * @return {boolean} + */ + ; + + _proto.engulfs = function engulfs(other) { + if (!this.isValid) return false; + return this.s <= other.s && this.e >= other.e; + } + /** + * Return whether this Interval has the same start and end as the specified Interval. + * @param {Interval} other + * @return {boolean} + */ + ; + + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + + return this.s.equals(other.s) && this.e.equals(other.e); + } + /** + * Return an Interval representing the intersection of this Interval and the specified Interval. + * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. + * Returns null if the intersection is empty, meaning, the intervals don't intersect. + * @param {Interval} other + * @return {Interval} + */ + ; + + _proto.intersection = function intersection(other) { + if (!this.isValid) return this; + var s = this.s > other.s ? this.s : other.s, + e = this.e < other.e ? this.e : other.e; + + if (s > e) { + return null; + } else { + return Interval.fromDateTimes(s, e); + } + } + /** + * Return an Interval representing the union of this Interval and the specified Interval. + * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. + * @param {Interval} other + * @return {Interval} + */ + ; + + _proto.union = function union(other) { + if (!this.isValid) return this; + var s = this.s < other.s ? this.s : other.s, + e = this.e > other.e ? this.e : other.e; + return Interval.fromDateTimes(s, e); + } + /** + * Merge an array of Intervals into a equivalent minimal set of Intervals. + * Combines overlapping and adjacent Intervals. + * @param {[Interval]} intervals + * @return {[Interval]} + */ + ; + + Interval.merge = function merge(intervals) { + var _intervals$sort$reduc = intervals.sort(function (a, b) { + return a.s - b.s; + }).reduce(function (_ref2, item) { + var sofar = _ref2[0], + current = _ref2[1]; + + if (!current) { + return [sofar, item]; + } else if (current.overlaps(item) || current.abutsStart(item)) { + return [sofar, current.union(item)]; + } else { + return [sofar.concat([current]), item]; + } + }, [[], null]), + found = _intervals$sort$reduc[0], + final = _intervals$sort$reduc[1]; + + if (final) { + found.push(final); + } + + return found; + } + /** + * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. + * @param {[Interval]} intervals + * @return {[Interval]} + */ + ; + + Interval.xor = function xor(intervals) { + var _Array$prototype; + + var start = null, + currentCount = 0; + + var results = [], + ends = intervals.map(function (i) { + return [{ + time: i.s, + type: "s" + }, { + time: i.e, + type: "e" + }]; + }), + flattened = (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, ends), + arr = flattened.sort(function (a, b) { + return a.time - b.time; + }); + + for (var _iterator = _createForOfIteratorHelperLoose(arr), _step; !(_step = _iterator()).done;) { + var i = _step.value; + currentCount += i.type === "s" ? 1 : -1; + + if (currentCount === 1) { + start = i.time; + } else { + if (start && +start !== +i.time) { + results.push(Interval.fromDateTimes(start, i.time)); + } + + start = null; + } + } + + return Interval.merge(results); + } + /** + * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. + * @param {...Interval} intervals + * @return {[Interval]} + */ + ; + + _proto.difference = function difference() { + var _this2 = this; + + for (var _len2 = arguments.length, intervals = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + intervals[_key2] = arguments[_key2]; + } + + return Interval.xor([this].concat(intervals)).map(function (i) { + return _this2.intersection(i); + }).filter(function (i) { + return i && !i.isEmpty(); + }); + } + /** + * Returns a string representation of this Interval appropriate for debugging. + * @return {string} + */ + ; + + _proto.toString = function toString() { + if (!this.isValid) return INVALID$1; + return "[" + this.s.toISO() + " \u2013 " + this.e.toISO() + ")"; + } + /** + * Returns an ISO 8601-compliant string representation of this Interval. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime.toISO} + * @return {string} + */ + ; + + _proto.toISO = function toISO(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISO(opts) + "/" + this.e.toISO(opts); + } + /** + * Returns an ISO 8601-compliant string representation of date of this Interval. + * The time components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {string} + */ + ; + + _proto.toISODate = function toISODate() { + if (!this.isValid) return INVALID$1; + return this.s.toISODate() + "/" + this.e.toISODate(); + } + /** + * Returns an ISO 8601-compliant string representation of time of this Interval. + * The date components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime.toISO} + * @return {string} + */ + ; + + _proto.toISOTime = function toISOTime(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISOTime(opts) + "/" + this.e.toISOTime(opts); + } + /** + * Returns a string representation of this Interval formatted according to the specified format string. + * @param {string} dateFormat - the format string. This string formats the start and end time. See {@link DateTime.toFormat} for details. + * @param {Object} opts - options + * @param {string} [opts.separator = ' – '] - a separator to place between the start and end representations + * @return {string} + */ + ; + + _proto.toFormat = function toFormat(dateFormat, _temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, + _ref3$separator = _ref3.separator, + separator = _ref3$separator === void 0 ? " – " : _ref3$separator; + + if (!this.isValid) return INVALID$1; + return "" + this.s.toFormat(dateFormat) + separator + this.e.toFormat(dateFormat); + } + /** + * Return a Duration representing the time spanned by this interval. + * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } + * @return {Duration} + */ + ; + + _proto.toDuration = function toDuration(unit, opts) { + if (!this.isValid) { + return Duration.invalid(this.invalidReason); + } + + return this.e.diff(this.s, unit, opts); + } + /** + * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes + * @param {function} mapFn + * @return {Interval} + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) + */ + ; + + _proto.mapEndpoints = function mapEndpoints(mapFn) { + return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); + }; + + _createClass(Interval, [{ + key: "start", + get: function get() { + return this.isValid ? this.s : null; + } + /** + * Returns the end of the Interval + * @type {DateTime} + */ + + }, { + key: "end", + get: function get() { + return this.isValid ? this.e : null; + } + /** + * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. + * @type {boolean} + */ + + }, { + key: "isValid", + get: function get() { + return this.invalidReason === null; + } + /** + * Returns an error code if this Interval is invalid, or null if the Interval is valid + * @type {string} + */ + + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + /** + * Returns an explanation of why this Interval became invalid, or null if the Interval is valid + * @type {string} + */ + + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + + return Interval; + }(); + + /** + * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. + */ + + var Info = /*#__PURE__*/function () { + function Info() {} + + /** + * Return whether the specified zone contains a DST. + * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. + * @return {boolean} + */ + Info.hasDST = function hasDST(zone) { + if (zone === void 0) { + zone = Settings.defaultZone; + } + + var proto = DateTime.local().setZone(zone).set({ + month: 12 + }); + return !zone.universal && proto.offset !== proto.set({ + month: 6 + }).offset; + } + /** + * Return whether the specified zone is a valid IANA specifier. + * @param {string} zone - Zone to check + * @return {boolean} + */ + ; + + Info.isValidIANAZone = function isValidIANAZone(zone) { + return IANAZone.isValidSpecifier(zone) && IANAZone.isValidZone(zone); + } + /** + * Converts the input into a {@link Zone} instance. + * + * * If `input` is already a Zone instance, it is returned unchanged. + * * If `input` is a string containing a valid time zone name, a Zone instance + * with that name is returned. + * * If `input` is a string that doesn't refer to a known time zone, a Zone + * instance with {@link Zone.isValid} == false is returned. + * * If `input is a number, a Zone instance with the specified fixed offset + * in minutes is returned. + * * If `input` is `null` or `undefined`, the default zone is returned. + * @param {string|Zone|number} [input] - the value to be converted + * @return {Zone} + */ + ; + + Info.normalizeZone = function normalizeZone$1(input) { + return normalizeZone(input, Settings.defaultZone); + } + /** + * Return an array of standalone month names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @example Info.months()[0] //=> 'January' + * @example Info.months('short')[0] //=> 'Jan' + * @example Info.months('numeric')[0] //=> '1' + * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' + * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' + * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' + * @return {[string]} + */ + ; + + Info.months = function months(length, _temp) { + if (length === void 0) { + length = "long"; + } + + var _ref = _temp === void 0 ? {} : _temp, + _ref$locale = _ref.locale, + locale = _ref$locale === void 0 ? null : _ref$locale, + _ref$numberingSystem = _ref.numberingSystem, + numberingSystem = _ref$numberingSystem === void 0 ? null : _ref$numberingSystem, + _ref$outputCalendar = _ref.outputCalendar, + outputCalendar = _ref$outputCalendar === void 0 ? "gregory" : _ref$outputCalendar; + + return Locale.create(locale, numberingSystem, outputCalendar).months(length); + } + /** + * Return an array of format month names. + * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that + * changes the string. + * See {@link months} + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @return {[string]} + */ + ; + + Info.monthsFormat = function monthsFormat(length, _temp2) { + if (length === void 0) { + length = "long"; + } + + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$locale = _ref2.locale, + locale = _ref2$locale === void 0 ? null : _ref2$locale, + _ref2$numberingSystem = _ref2.numberingSystem, + numberingSystem = _ref2$numberingSystem === void 0 ? null : _ref2$numberingSystem, + _ref2$outputCalendar = _ref2.outputCalendar, + outputCalendar = _ref2$outputCalendar === void 0 ? "gregory" : _ref2$outputCalendar; + + return Locale.create(locale, numberingSystem, outputCalendar).months(length, true); + } + /** + * Return an array of standalone week names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the month representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @example Info.weekdays()[0] //=> 'Monday' + * @example Info.weekdays('short')[0] //=> 'Mon' + * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' + * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' + * @return {[string]} + */ + ; + + Info.weekdays = function weekdays(length, _temp3) { + if (length === void 0) { + length = "long"; + } + + var _ref3 = _temp3 === void 0 ? {} : _temp3, + _ref3$locale = _ref3.locale, + locale = _ref3$locale === void 0 ? null : _ref3$locale, + _ref3$numberingSystem = _ref3.numberingSystem, + numberingSystem = _ref3$numberingSystem === void 0 ? null : _ref3$numberingSystem; + + return Locale.create(locale, numberingSystem, null).weekdays(length); + } + /** + * Return an array of format week names. + * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that + * changes the string. + * See {@link weekdays} + * @param {string} [length='long'] - the length of the month representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale=null] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @return {[string]} + */ + ; + + Info.weekdaysFormat = function weekdaysFormat(length, _temp4) { + if (length === void 0) { + length = "long"; + } + + var _ref4 = _temp4 === void 0 ? {} : _temp4, + _ref4$locale = _ref4.locale, + locale = _ref4$locale === void 0 ? null : _ref4$locale, + _ref4$numberingSystem = _ref4.numberingSystem, + numberingSystem = _ref4$numberingSystem === void 0 ? null : _ref4$numberingSystem; + + return Locale.create(locale, numberingSystem, null).weekdays(length, true); + } + /** + * Return an array of meridiems. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.meridiems() //=> [ 'AM', 'PM' ] + * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] + * @return {[string]} + */ + ; + + Info.meridiems = function meridiems(_temp5) { + var _ref5 = _temp5 === void 0 ? {} : _temp5, + _ref5$locale = _ref5.locale, + locale = _ref5$locale === void 0 ? null : _ref5$locale; + + return Locale.create(locale).meridiems(); + } + /** + * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. + * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.eras() //=> [ 'BC', 'AD' ] + * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] + * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] + * @return {[string]} + */ + ; + + Info.eras = function eras(length, _temp6) { + if (length === void 0) { + length = "short"; + } + + var _ref6 = _temp6 === void 0 ? {} : _temp6, + _ref6$locale = _ref6.locale, + locale = _ref6$locale === void 0 ? null : _ref6$locale; + + return Locale.create(locale, null, "gregory").eras(length); + } + /** + * Return the set of available features in this environment. + * Some features of Luxon are not available in all environments. For example, on older browsers, timezone support is not available. Use this function to figure out if that's the case. + * Keys: + * * `zones`: whether this environment supports IANA timezones + * * `intlTokens`: whether this environment supports internationalized token-based formatting/parsing + * * `intl`: whether this environment supports general internationalization + * * `relative`: whether this environment supports relative time formatting + * @example Info.features() //=> { intl: true, intlTokens: false, zones: true, relative: false } + * @return {Object} + */ + ; + + Info.features = function features() { + var intl = false, + intlTokens = false, + zones = false, + relative = false; + + if (hasIntl()) { + intl = true; + intlTokens = hasFormatToParts(); + relative = hasRelative(); + + try { + zones = new Intl.DateTimeFormat("en", { + timeZone: "America/New_York" + }).resolvedOptions().timeZone === "America/New_York"; + } catch (e) { + zones = false; + } + } + + return { + intl: intl, + intlTokens: intlTokens, + zones: zones, + relative: relative + }; + }; + + return Info; + }(); + + function dayDiff(earlier, later) { + var utcDayStart = function utcDayStart(dt) { + return dt.toUTC(0, { + keepLocalTime: true + }).startOf("day").valueOf(); + }, + ms = utcDayStart(later) - utcDayStart(earlier); + + return Math.floor(Duration.fromMillis(ms).as("days")); + } + + function highOrderDiffs(cursor, later, units) { + var differs = [["years", function (a, b) { + return b.year - a.year; + }], ["months", function (a, b) { + return b.month - a.month + (b.year - a.year) * 12; + }], ["weeks", function (a, b) { + var days = dayDiff(a, b); + return (days - days % 7) / 7; + }], ["days", dayDiff]]; + var results = {}; + var lowestOrder, highWater; + + for (var _i = 0, _differs = differs; _i < _differs.length; _i++) { + var _differs$_i = _differs[_i], + unit = _differs$_i[0], + differ = _differs$_i[1]; + + if (units.indexOf(unit) >= 0) { + var _cursor$plus; + + lowestOrder = unit; + var delta = differ(cursor, later); + highWater = cursor.plus((_cursor$plus = {}, _cursor$plus[unit] = delta, _cursor$plus)); + + if (highWater > later) { + var _cursor$plus2; + + cursor = cursor.plus((_cursor$plus2 = {}, _cursor$plus2[unit] = delta - 1, _cursor$plus2)); + delta -= 1; + } else { + cursor = highWater; + } + + results[unit] = delta; + } + } + + return [cursor, results, highWater, lowestOrder]; + } + + function _diff (earlier, later, units, opts) { + var _highOrderDiffs = highOrderDiffs(earlier, later, units), + cursor = _highOrderDiffs[0], + results = _highOrderDiffs[1], + highWater = _highOrderDiffs[2], + lowestOrder = _highOrderDiffs[3]; + + var remainingMillis = later - cursor; + var lowerOrderUnits = units.filter(function (u) { + return ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0; + }); + + if (lowerOrderUnits.length === 0) { + if (highWater < later) { + var _cursor$plus3; + + highWater = cursor.plus((_cursor$plus3 = {}, _cursor$plus3[lowestOrder] = 1, _cursor$plus3)); + } + + if (highWater !== cursor) { + results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); + } + } + + var duration = Duration.fromObject(Object.assign(results, opts)); + + if (lowerOrderUnits.length > 0) { + var _Duration$fromMillis; + + return (_Duration$fromMillis = Duration.fromMillis(remainingMillis, opts)).shiftTo.apply(_Duration$fromMillis, lowerOrderUnits).plus(duration); + } else { + return duration; + } + } + + var numberingSystems = { + arab: "[\u0660-\u0669]", + arabext: "[\u06F0-\u06F9]", + bali: "[\u1B50-\u1B59]", + beng: "[\u09E6-\u09EF]", + deva: "[\u0966-\u096F]", + fullwide: "[\uFF10-\uFF19]", + gujr: "[\u0AE6-\u0AEF]", + hanidec: "[〇|一|二|三|四|五|六|七|八|九]", + khmr: "[\u17E0-\u17E9]", + knda: "[\u0CE6-\u0CEF]", + laoo: "[\u0ED0-\u0ED9]", + limb: "[\u1946-\u194F]", + mlym: "[\u0D66-\u0D6F]", + mong: "[\u1810-\u1819]", + mymr: "[\u1040-\u1049]", + orya: "[\u0B66-\u0B6F]", + tamldec: "[\u0BE6-\u0BEF]", + telu: "[\u0C66-\u0C6F]", + thai: "[\u0E50-\u0E59]", + tibt: "[\u0F20-\u0F29]", + latn: "\\d" + }; + var numberingSystemsUTF16 = { + arab: [1632, 1641], + arabext: [1776, 1785], + bali: [6992, 7001], + beng: [2534, 2543], + deva: [2406, 2415], + fullwide: [65296, 65303], + gujr: [2790, 2799], + khmr: [6112, 6121], + knda: [3302, 3311], + laoo: [3792, 3801], + limb: [6470, 6479], + mlym: [3430, 3439], + mong: [6160, 6169], + mymr: [4160, 4169], + orya: [2918, 2927], + tamldec: [3046, 3055], + telu: [3174, 3183], + thai: [3664, 3673], + tibt: [3872, 3881] + }; // eslint-disable-next-line + + var hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); + function parseDigits(str) { + var value = parseInt(str, 10); + + if (isNaN(value)) { + value = ""; + + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); + + if (str[i].search(numberingSystems.hanidec) !== -1) { + value += hanidecChars.indexOf(str[i]); + } else { + for (var key in numberingSystemsUTF16) { + var _numberingSystemsUTF = numberingSystemsUTF16[key], + min = _numberingSystemsUTF[0], + max = _numberingSystemsUTF[1]; + + if (code >= min && code <= max) { + value += code - min; + } + } + } + } + + return parseInt(value, 10); + } else { + return value; + } + } + function digitRegex(_ref, append) { + var numberingSystem = _ref.numberingSystem; + + if (append === void 0) { + append = ""; + } + + return new RegExp("" + numberingSystems[numberingSystem || "latn"] + append); + } + + var MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; + + function intUnit(regex, post) { + if (post === void 0) { + post = function post(i) { + return i; + }; + } + + return { + regex: regex, + deser: function deser(_ref) { + var s = _ref[0]; + return post(parseDigits(s)); + } + }; + } + + function fixListRegex(s) { + // make dots optional and also make them literal + return s.replace(/\./, "\\.?"); + } + + function stripInsensitivities(s) { + return s.replace(/\./, "").toLowerCase(); + } + + function oneOf(strings, startIndex) { + if (strings === null) { + return null; + } else { + return { + regex: RegExp(strings.map(fixListRegex).join("|")), + deser: function deser(_ref2) { + var s = _ref2[0]; + return strings.findIndex(function (i) { + return stripInsensitivities(s) === stripInsensitivities(i); + }) + startIndex; + } + }; + } + } + + function offset(regex, groups) { + return { + regex: regex, + deser: function deser(_ref3) { + var h = _ref3[1], + m = _ref3[2]; + return signedOffset(h, m); + }, + groups: groups + }; + } + + function simple(regex) { + return { + regex: regex, + deser: function deser(_ref4) { + var s = _ref4[0]; + return s; + } + }; + } + + function escapeToken(value) { + // eslint-disable-next-line no-useless-escape + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); + } + + function unitForToken(token, loc) { + var one = digitRegex(loc), + two = digitRegex(loc, "{2}"), + three = digitRegex(loc, "{3}"), + four = digitRegex(loc, "{4}"), + six = digitRegex(loc, "{6}"), + oneOrTwo = digitRegex(loc, "{1,2}"), + oneToThree = digitRegex(loc, "{1,3}"), + oneToSix = digitRegex(loc, "{1,6}"), + oneToNine = digitRegex(loc, "{1,9}"), + twoToFour = digitRegex(loc, "{2,4}"), + fourToSix = digitRegex(loc, "{4,6}"), + literal = function literal(t) { + return { + regex: RegExp(escapeToken(t.val)), + deser: function deser(_ref5) { + var s = _ref5[0]; + return s; + }, + literal: true + }; + }, + unitate = function unitate(t) { + if (token.literal) { + return literal(t); + } + + switch (t.val) { + // era + case "G": + return oneOf(loc.eras("short", false), 0); + + case "GG": + return oneOf(loc.eras("long", false), 0); + // years + + case "y": + return intUnit(oneToSix); + + case "yy": + return intUnit(twoToFour, untruncateYear); + + case "yyyy": + return intUnit(four); + + case "yyyyy": + return intUnit(fourToSix); + + case "yyyyyy": + return intUnit(six); + // months + + case "M": + return intUnit(oneOrTwo); + + case "MM": + return intUnit(two); + + case "MMM": + return oneOf(loc.months("short", true, false), 1); + + case "MMMM": + return oneOf(loc.months("long", true, false), 1); + + case "L": + return intUnit(oneOrTwo); + + case "LL": + return intUnit(two); + + case "LLL": + return oneOf(loc.months("short", false, false), 1); + + case "LLLL": + return oneOf(loc.months("long", false, false), 1); + // dates + + case "d": + return intUnit(oneOrTwo); + + case "dd": + return intUnit(two); + // ordinals + + case "o": + return intUnit(oneToThree); + + case "ooo": + return intUnit(three); + // time + + case "HH": + return intUnit(two); + + case "H": + return intUnit(oneOrTwo); + + case "hh": + return intUnit(two); + + case "h": + return intUnit(oneOrTwo); + + case "mm": + return intUnit(two); + + case "m": + return intUnit(oneOrTwo); + + case "q": + return intUnit(oneOrTwo); + + case "qq": + return intUnit(two); + + case "s": + return intUnit(oneOrTwo); + + case "ss": + return intUnit(two); + + case "S": + return intUnit(oneToThree); + + case "SSS": + return intUnit(three); + + case "u": + return simple(oneToNine); + // meridiem + + case "a": + return oneOf(loc.meridiems(), 0); + // weekYear (k) + + case "kkkk": + return intUnit(four); + + case "kk": + return intUnit(twoToFour, untruncateYear); + // weekNumber (W) + + case "W": + return intUnit(oneOrTwo); + + case "WW": + return intUnit(two); + // weekdays + + case "E": + case "c": + return intUnit(one); + + case "EEE": + return oneOf(loc.weekdays("short", false, false), 1); + + case "EEEE": + return oneOf(loc.weekdays("long", false, false), 1); + + case "ccc": + return oneOf(loc.weekdays("short", true, false), 1); + + case "cccc": + return oneOf(loc.weekdays("long", true, false), 1); + // offset/zone + + case "Z": + case "ZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(?::(" + two.source + "))?"), 2); + + case "ZZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(" + two.source + ")?"), 2); + // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing + // because we don't have any way to figure out what they are + + case "z": + return simple(/[a-z_+-/]{1,256}?/i); + + default: + return literal(t); + } + }; + + var unit = unitate(token) || { + invalidReason: MISSING_FTP + }; + unit.token = token; + return unit; + } + + var partTypeStyleToTokenVal = { + year: { + "2-digit": "yy", + numeric: "yyyyy" + }, + month: { + numeric: "M", + "2-digit": "MM", + short: "MMM", + long: "MMMM" + }, + day: { + numeric: "d", + "2-digit": "dd" + }, + weekday: { + short: "EEE", + long: "EEEE" + }, + dayperiod: "a", + dayPeriod: "a", + hour: { + numeric: "h", + "2-digit": "hh" + }, + minute: { + numeric: "m", + "2-digit": "mm" + }, + second: { + numeric: "s", + "2-digit": "ss" + } + }; + + function tokenForPart(part, locale, formatOpts) { + var type = part.type, + value = part.value; + + if (type === "literal") { + return { + literal: true, + val: value + }; + } + + var style = formatOpts[type]; + var val = partTypeStyleToTokenVal[type]; + + if (typeof val === "object") { + val = val[style]; + } + + if (val) { + return { + literal: false, + val: val + }; + } + + return undefined; + } + + function buildRegex(units) { + var re = units.map(function (u) { + return u.regex; + }).reduce(function (f, r) { + return f + "(" + r.source + ")"; + }, ""); + return ["^" + re + "$", units]; + } + + function match(input, regex, handlers) { + var matches = input.match(regex); + + if (matches) { + var all = {}; + var matchIndex = 1; + + for (var i in handlers) { + if (hasOwnProperty(handlers, i)) { + var h = handlers[i], + groups = h.groups ? h.groups + 1 : 1; + + if (!h.literal && h.token) { + all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + } + + matchIndex += groups; + } + } + + return [matches, all]; + } else { + return [matches, {}]; + } + } + + function dateTimeFromMatches(matches) { + var toField = function toField(token) { + switch (token) { + case "S": + return "millisecond"; + + case "s": + return "second"; + + case "m": + return "minute"; + + case "h": + case "H": + return "hour"; + + case "d": + return "day"; + + case "o": + return "ordinal"; + + case "L": + case "M": + return "month"; + + case "y": + return "year"; + + case "E": + case "c": + return "weekday"; + + case "W": + return "weekNumber"; + + case "k": + return "weekYear"; + + case "q": + return "quarter"; + + default: + return null; + } + }; + + var zone; + + if (!isUndefined(matches.Z)) { + zone = new FixedOffsetZone(matches.Z); + } else if (!isUndefined(matches.z)) { + zone = IANAZone.create(matches.z); + } else { + zone = null; + } + + if (!isUndefined(matches.q)) { + matches.M = (matches.q - 1) * 3 + 1; + } + + if (!isUndefined(matches.h)) { + if (matches.h < 12 && matches.a === 1) { + matches.h += 12; + } else if (matches.h === 12 && matches.a === 0) { + matches.h = 0; + } + } + + if (matches.G === 0 && matches.y) { + matches.y = -matches.y; + } + + if (!isUndefined(matches.u)) { + matches.S = parseMillis(matches.u); + } + + var vals = Object.keys(matches).reduce(function (r, k) { + var f = toField(k); + + if (f) { + r[f] = matches[k]; + } + + return r; + }, {}); + return [vals, zone]; + } + + var dummyDateTimeCache = null; + + function getDummyDateTime() { + if (!dummyDateTimeCache) { + dummyDateTimeCache = DateTime.fromMillis(1555555555555); + } + + return dummyDateTimeCache; + } + + function maybeExpandMacroToken(token, locale) { + if (token.literal) { + return token; + } + + var formatOpts = Formatter.macroTokenToFormatOpts(token.val); + + if (!formatOpts) { + return token; + } + + var formatter = Formatter.create(locale, formatOpts); + var parts = formatter.formatDateTimeParts(getDummyDateTime()); + var tokens = parts.map(function (p) { + return tokenForPart(p, locale, formatOpts); + }); + + if (tokens.includes(undefined)) { + return token; + } + + return tokens; + } + + function expandMacroTokens(tokens, locale) { + var _Array$prototype; + + return (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, tokens.map(function (t) { + return maybeExpandMacroToken(t, locale); + })); + } + /** + * @private + */ + + + function explainFromTokens(locale, input, format) { + var tokens = expandMacroTokens(Formatter.parseFormat(format), locale), + units = tokens.map(function (t) { + return unitForToken(t, locale); + }), + disqualifyingUnit = units.find(function (t) { + return t.invalidReason; + }); + + if (disqualifyingUnit) { + return { + input: input, + tokens: tokens, + invalidReason: disqualifyingUnit.invalidReason + }; + } else { + var _buildRegex = buildRegex(units), + regexString = _buildRegex[0], + handlers = _buildRegex[1], + regex = RegExp(regexString, "i"), + _match = match(input, regex, handlers), + rawMatches = _match[0], + matches = _match[1], + _ref6 = matches ? dateTimeFromMatches(matches) : [null, null], + result = _ref6[0], + zone = _ref6[1]; + + if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { + throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format"); + } + + return { + input: input, + tokens: tokens, + regex: regex, + rawMatches: rawMatches, + matches: matches, + result: result, + zone: zone + }; + } + } + function parseFromTokens(locale, input, format) { + var _explainFromTokens = explainFromTokens(locale, input, format), + result = _explainFromTokens.result, + zone = _explainFromTokens.zone, + invalidReason = _explainFromTokens.invalidReason; + + return [result, zone, invalidReason]; + } + + var nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], + leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; + + function unitOutOfRange(unit, value) { + return new Invalid("unit out of range", "you specified " + value + " (of type " + typeof value + ") as a " + unit + ", which is invalid"); + } + + function dayOfWeek(year, month, day) { + var js = new Date(Date.UTC(year, month - 1, day)).getUTCDay(); + return js === 0 ? 7 : js; + } + + function computeOrdinal(year, month, day) { + return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; + } + + function uncomputeOrdinal(year, ordinal) { + var table = isLeapYear(year) ? leapLadder : nonLeapLadder, + month0 = table.findIndex(function (i) { + return i < ordinal; + }), + day = ordinal - table[month0]; + return { + month: month0 + 1, + day: day + }; + } + /** + * @private + */ + + + function gregorianToWeek(gregObj) { + var year = gregObj.year, + month = gregObj.month, + day = gregObj.day, + ordinal = computeOrdinal(year, month, day), + weekday = dayOfWeek(year, month, day); + var weekNumber = Math.floor((ordinal - weekday + 10) / 7), + weekYear; + + if (weekNumber < 1) { + weekYear = year - 1; + weekNumber = weeksInWeekYear(weekYear); + } else if (weekNumber > weeksInWeekYear(year)) { + weekYear = year + 1; + weekNumber = 1; + } else { + weekYear = year; + } + + return Object.assign({ + weekYear: weekYear, + weekNumber: weekNumber, + weekday: weekday + }, timeObject(gregObj)); + } + function weekToGregorian(weekData) { + var weekYear = weekData.weekYear, + weekNumber = weekData.weekNumber, + weekday = weekData.weekday, + weekdayOfJan4 = dayOfWeek(weekYear, 1, 4), + yearInDays = daysInYear(weekYear); + var ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 3, + year; + + if (ordinal < 1) { + year = weekYear - 1; + ordinal += daysInYear(year); + } else if (ordinal > yearInDays) { + year = weekYear + 1; + ordinal -= daysInYear(weekYear); + } else { + year = weekYear; + } + + var _uncomputeOrdinal = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal.month, + day = _uncomputeOrdinal.day; + + return Object.assign({ + year: year, + month: month, + day: day + }, timeObject(weekData)); + } + function gregorianToOrdinal(gregData) { + var year = gregData.year, + month = gregData.month, + day = gregData.day, + ordinal = computeOrdinal(year, month, day); + return Object.assign({ + year: year, + ordinal: ordinal + }, timeObject(gregData)); + } + function ordinalToGregorian(ordinalData) { + var year = ordinalData.year, + ordinal = ordinalData.ordinal, + _uncomputeOrdinal2 = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal2.month, + day = _uncomputeOrdinal2.day; + + return Object.assign({ + year: year, + month: month, + day: day + }, timeObject(ordinalData)); + } + function hasInvalidWeekData(obj) { + var validYear = isInteger(obj.weekYear), + validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear)), + validWeekday = integerBetween(obj.weekday, 1, 7); + + if (!validYear) { + return unitOutOfRange("weekYear", obj.weekYear); + } else if (!validWeek) { + return unitOutOfRange("week", obj.week); + } else if (!validWeekday) { + return unitOutOfRange("weekday", obj.weekday); + } else return false; + } + function hasInvalidOrdinalData(obj) { + var validYear = isInteger(obj.year), + validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); + + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validOrdinal) { + return unitOutOfRange("ordinal", obj.ordinal); + } else return false; + } + function hasInvalidGregorianData(obj) { + var validYear = isInteger(obj.year), + validMonth = integerBetween(obj.month, 1, 12), + validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); + + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validMonth) { + return unitOutOfRange("month", obj.month); + } else if (!validDay) { + return unitOutOfRange("day", obj.day); + } else return false; + } + function hasInvalidTimeData(obj) { + var hour = obj.hour, + minute = obj.minute, + second = obj.second, + millisecond = obj.millisecond; + var validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, + validMinute = integerBetween(minute, 0, 59), + validSecond = integerBetween(second, 0, 59), + validMillisecond = integerBetween(millisecond, 0, 999); + + if (!validHour) { + return unitOutOfRange("hour", hour); + } else if (!validMinute) { + return unitOutOfRange("minute", minute); + } else if (!validSecond) { + return unitOutOfRange("second", second); + } else if (!validMillisecond) { + return unitOutOfRange("millisecond", millisecond); + } else return false; + } + + var INVALID$2 = "Invalid DateTime"; + var MAX_DATE = 8.64e15; + + function unsupportedZone(zone) { + return new Invalid("unsupported zone", "the zone \"" + zone.name + "\" is not supported"); + } // we cache week data on the DT object and this intermediates the cache + + + function possiblyCachedWeekData(dt) { + if (dt.weekData === null) { + dt.weekData = gregorianToWeek(dt.c); + } + + return dt.weekData; + } // clone really means, "make a new object with these modifications". all "setters" really use this + // to create a new object while only changing some of the properties + + + function clone$1(inst, alts) { + var current = { + ts: inst.ts, + zone: inst.zone, + c: inst.c, + o: inst.o, + loc: inst.loc, + invalid: inst.invalid + }; + return new DateTime(Object.assign({}, current, alts, { + old: current + })); + } // find the right offset a given local time. The o input is our guess, which determines which + // offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) + + + function fixOffset(localTS, o, tz) { + // Our UTC time is just a guess because our offset is just a guess + var utcGuess = localTS - o * 60 * 1000; // Test whether the zone matches the offset for this ts + + var o2 = tz.offset(utcGuess); // If so, offset didn't change and we're done + + if (o === o2) { + return [utcGuess, o]; + } // If not, change the ts by the difference in the offset + + + utcGuess -= (o2 - o) * 60 * 1000; // If that gives us the local time we want, we're done + + var o3 = tz.offset(utcGuess); + + if (o2 === o3) { + return [utcGuess, o2]; + } // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time + + + return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; + } // convert an epoch timestamp into a calendar object with the given offset + + + function tsToObj(ts, offset) { + ts += offset * 60 * 1000; + var d = new Date(ts); + return { + year: d.getUTCFullYear(), + month: d.getUTCMonth() + 1, + day: d.getUTCDate(), + hour: d.getUTCHours(), + minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), + millisecond: d.getUTCMilliseconds() + }; + } // convert a calendar object to a epoch timestamp + + + function objToTS(obj, offset, zone) { + return fixOffset(objToLocalTS(obj), offset, zone); + } // create a new DT instance by adding a duration, adjusting for DSTs + + + function adjustTime(inst, dur) { + var _dur; + + var keys = Object.keys(dur.values); + + if (keys.indexOf("milliseconds") === -1) { + keys.push("milliseconds"); + } + + dur = (_dur = dur).shiftTo.apply(_dur, keys); + var oPre = inst.o, + year = inst.c.year + dur.years, + month = inst.c.month + dur.months + dur.quarters * 3, + c = Object.assign({}, inst.c, { + year: year, + month: month, + day: Math.min(inst.c.day, daysInMonth(year, month)) + dur.days + dur.weeks * 7 + }), + millisToAdd = Duration.fromObject({ + hours: dur.hours, + minutes: dur.minutes, + seconds: dur.seconds, + milliseconds: dur.milliseconds + }).as("milliseconds"), + localTS = objToLocalTS(c); + + var _fixOffset = fixOffset(localTS, oPre, inst.zone), + ts = _fixOffset[0], + o = _fixOffset[1]; + + if (millisToAdd !== 0) { + ts += millisToAdd; // that could have changed the offset by going over a DST, but we want to keep the ts the same + + o = inst.zone.offset(ts); + } + + return { + ts: ts, + o: o + }; + } // helper useful in turning the results of parsing into real dates + // by handling the zone options + + + function parseDataToDateTime(parsed, parsedZone, opts, format, text) { + var setZone = opts.setZone, + zone = opts.zone; + + if (parsed && Object.keys(parsed).length !== 0) { + var interpretationZone = parsedZone || zone, + inst = DateTime.fromObject(Object.assign(parsed, opts, { + zone: interpretationZone, + // setZone is a valid option in the calling methods, but not in fromObject + setZone: undefined + })); + return setZone ? inst : inst.setZone(zone); + } else { + return DateTime.invalid(new Invalid("unparsable", "the input \"" + text + "\" can't be parsed as " + format)); + } + } // if you want to output a technical format (e.g. RFC 2822), this helper + // helps handle the details + + + function toTechFormat(dt, format, allowZ) { + if (allowZ === void 0) { + allowZ = true; + } + + return dt.isValid ? Formatter.create(Locale.create("en-US"), { + allowZ: allowZ, + forceSimple: true + }).formatDateTimeFromString(dt, format) : null; + } // technical time formats (e.g. the time part of ISO 8601), take some options + // and this commonizes their handling + + + function toTechTimeFormat(dt, _ref) { + var _ref$suppressSeconds = _ref.suppressSeconds, + suppressSeconds = _ref$suppressSeconds === void 0 ? false : _ref$suppressSeconds, + _ref$suppressMillisec = _ref.suppressMilliseconds, + suppressMilliseconds = _ref$suppressMillisec === void 0 ? false : _ref$suppressMillisec, + includeOffset = _ref.includeOffset, + _ref$includeZone = _ref.includeZone, + includeZone = _ref$includeZone === void 0 ? false : _ref$includeZone, + _ref$spaceZone = _ref.spaceZone, + spaceZone = _ref$spaceZone === void 0 ? false : _ref$spaceZone, + _ref$format = _ref.format, + format = _ref$format === void 0 ? "extended" : _ref$format; + var fmt = format === "basic" ? "HHmm" : "HH:mm"; + + if (!suppressSeconds || dt.second !== 0 || dt.millisecond !== 0) { + fmt += format === "basic" ? "ss" : ":ss"; + + if (!suppressMilliseconds || dt.millisecond !== 0) { + fmt += ".SSS"; + } + } + + if ((includeZone || includeOffset) && spaceZone) { + fmt += " "; + } + + if (includeZone) { + fmt += "z"; + } else if (includeOffset) { + fmt += format === "basic" ? "ZZZ" : "ZZ"; + } + + return toTechFormat(dt, fmt); + } // defaults for unspecified units in the supported calendars + + + var defaultUnitValues = { + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultWeekUnitValues = { + weekNumber: 1, + weekday: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultOrdinalUnitValues = { + ordinal: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; // Units in the supported calendars, sorted by bigness + + var orderedUnits$1 = ["year", "month", "day", "hour", "minute", "second", "millisecond"], + orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"], + orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; // standardize case and plurality in units + + function normalizeUnit(unit) { + var normalized = { + year: "year", + years: "year", + month: "month", + months: "month", + day: "day", + days: "day", + hour: "hour", + hours: "hour", + minute: "minute", + minutes: "minute", + quarter: "quarter", + quarters: "quarter", + second: "second", + seconds: "second", + millisecond: "millisecond", + milliseconds: "millisecond", + weekday: "weekday", + weekdays: "weekday", + weeknumber: "weekNumber", + weeksnumber: "weekNumber", + weeknumbers: "weekNumber", + weekyear: "weekYear", + weekyears: "weekYear", + ordinal: "ordinal" + }[unit.toLowerCase()]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } // this is a dumbed down version of fromObject() that runs about 60% faster + // but doesn't do any validation, makes a bunch of assumptions about what units + // are present, and so on. + + + function quickDT(obj, zone) { + // assume we have the higher-order units + for (var _iterator = _createForOfIteratorHelperLoose(orderedUnits$1), _step; !(_step = _iterator()).done;) { + var u = _step.value; + + if (isUndefined(obj[u])) { + obj[u] = defaultUnitValues[u]; + } + } + + var invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); + + if (invalid) { + return DateTime.invalid(invalid); + } + + var tsNow = Settings.now(), + offsetProvis = zone.offset(tsNow), + _objToTS = objToTS(obj, offsetProvis, zone), + ts = _objToTS[0], + o = _objToTS[1]; + + return new DateTime({ + ts: ts, + zone: zone, + o: o + }); + } + + function diffRelative(start, end, opts) { + var round = isUndefined(opts.round) ? true : opts.round, + format = function format(c, unit) { + c = roundTo(c, round || opts.calendary ? 0 : 2, true); + var formatter = end.loc.clone(opts).relFormatter(opts); + return formatter.format(c, unit); + }, + differ = function differ(unit) { + if (opts.calendary) { + if (!end.hasSame(start, unit)) { + return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); + } else return 0; + } else { + return end.diff(start, unit).get(unit); + } + }; + + if (opts.unit) { + return format(differ(opts.unit), opts.unit); + } + + for (var _iterator2 = _createForOfIteratorHelperLoose(opts.units), _step2; !(_step2 = _iterator2()).done;) { + var unit = _step2.value; + var count = differ(unit); + + if (Math.abs(count) >= 1) { + return format(count, unit); + } + } + + return format(0, opts.units[opts.units.length - 1]); + } + /** + * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. + * + * A DateTime comprises of: + * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. + * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). + * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. + * + * Here is a brief overview of the most commonly used functionality it provides: + * + * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link local}, {@link utc}, and (most flexibly) {@link fromObject}. To create one from a standard string format, use {@link fromISO}, {@link fromHTTP}, and {@link fromRFC2822}. To create one from a custom string format, use {@link fromFormat}. To create one from a native JS date, use {@link fromJSDate}. + * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link toObject}), use the {@link year}, {@link month}, + * {@link day}, {@link hour}, {@link minute}, {@link second}, {@link millisecond} accessors. + * * **Week calendar**: For ISO week calendar attributes, see the {@link weekYear}, {@link weekNumber}, and {@link weekday} accessors. + * * **Configuration** See the {@link locale} and {@link numberingSystem} accessors. + * * **Transformation**: To transform the DateTime into other DateTimes, use {@link set}, {@link reconfigure}, {@link setZone}, {@link setLocale}, {@link plus}, {@link minus}, {@link endOf}, {@link startOf}, {@link toUTC}, and {@link toLocal}. + * * **Output**: To convert the DateTime to other representations, use the {@link toRelative}, {@link toRelativeCalendar}, {@link toJSON}, {@link toISO}, {@link toHTTP}, {@link toObject}, {@link toRFC2822}, {@link toString}, {@link toLocaleString}, {@link toFormat}, {@link toMillis} and {@link toJSDate}. + * + * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. + */ + + + var DateTime = /*#__PURE__*/function () { + /** + * @access private + */ + function DateTime(config) { + var zone = config.zone || Settings.defaultZone; + var invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); + /** + * @access private + */ + + this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; + var c = null, + o = null; + + if (!invalid) { + var unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); + + if (unchanged) { + var _ref2 = [config.old.c, config.old.o]; + c = _ref2[0]; + o = _ref2[1]; + } else { + var ot = zone.offset(this.ts); + c = tsToObj(this.ts, ot); + invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; + c = invalid ? null : c; + o = invalid ? null : ot; + } + } + /** + * @access private + */ + + + this._zone = zone; + /** + * @access private + */ + + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + + this.invalid = invalid; + /** + * @access private + */ + + this.weekData = null; + /** + * @access private + */ + + this.c = c; + /** + * @access private + */ + + this.o = o; + /** + * @access private + */ + + this.isLuxonDateTime = true; + } // CONSTRUCT + + /** + * Create a local DateTime + * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @example DateTime.local() //~> now + * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 + * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 + * @example DateTime.local(2017, 3, 12) //~> 2017-03-12T00:00:00 + * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 + * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 + * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 + * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 + * @return {DateTime} + */ + + + DateTime.local = function local(year, month, day, hour, minute, second, millisecond) { + if (isUndefined(year)) { + return new DateTime({ + ts: Settings.now() + }); + } else { + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, Settings.defaultZone); + } + } + /** + * Create a DateTime in UTC + * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @example DateTime.utc() //~> now + * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z + * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z + * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z + * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z + * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765Z + * @return {DateTime} + */ + ; + + DateTime.utc = function utc(year, month, day, hour, minute, second, millisecond) { + if (isUndefined(year)) { + return new DateTime({ + ts: Settings.now(), + zone: FixedOffsetZone.utcInstance + }); + } else { + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, FixedOffsetZone.utcInstance); + } + } + /** + * Create a DateTime from a Javascript Date object. Uses the default zone. + * @param {Date} date - a Javascript Date object + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @return {DateTime} + */ + ; + + DateTime.fromJSDate = function fromJSDate(date, options) { + if (options === void 0) { + options = {}; + } + + var ts = isDate(date) ? date.valueOf() : NaN; + + if (Number.isNaN(ts)) { + return DateTime.invalid("invalid input"); + } + + var zoneToUse = normalizeZone(options.zone, Settings.defaultZone); + + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + + return new DateTime({ + ts: ts, + zone: zoneToUse, + loc: Locale.fromObject(options) + }); + } + /** + * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} milliseconds - a number of milliseconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @return {DateTime} + */ + ; + + DateTime.fromMillis = function fromMillis(milliseconds, options) { + if (options === void 0) { + options = {}; + } + + if (!isNumber(milliseconds)) { + throw new InvalidArgumentError("fromMillis requires a numerical input, but received a " + typeof milliseconds + " with value " + milliseconds); + } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { + // this isn't perfect because because we can still end up out of range because of additional shifting, but it's a start + return DateTime.invalid("Timestamp out of range"); + } else { + return new DateTime({ + ts: milliseconds, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + /** + * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} seconds - a number of seconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @return {DateTime} + */ + ; + + DateTime.fromSeconds = function fromSeconds(seconds, options) { + if (options === void 0) { + options = {}; + } + + if (!isNumber(seconds)) { + throw new InvalidArgumentError("fromSeconds requires a numerical input"); + } else { + return new DateTime({ + ts: seconds * 1000, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + /** + * Create a DateTime from a Javascript object with keys like 'year' and 'hour' with reasonable defaults. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.year - a year, such as 1987 + * @param {number} obj.month - a month, 1-12 + * @param {number} obj.day - a day of the month, 1-31, depending on the month + * @param {number} obj.ordinal - day of the year, 1-365 or 366 + * @param {number} obj.weekYear - an ISO week year + * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year + * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday + * @param {number} obj.hour - hour of the day, 0-23 + * @param {number} obj.minute - minute of the hour, 0-59 + * @param {number} obj.second - second of the minute, 0-59 + * @param {number} obj.millisecond - millisecond of the second, 0-999 + * @param {string|Zone} [obj.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() + * @param {string} [obj.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} obj.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} obj.numberingSystem - the numbering system to set on the resulting DateTime instance + * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' + * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6, zone: 'utc' }), + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6, zone: 'local' }) + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6, zone: 'America/New_York' }) + * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' + * @return {DateTime} + */ + ; + + DateTime.fromObject = function fromObject(obj) { + var zoneToUse = normalizeZone(obj.zone, Settings.defaultZone); + + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + + var tsNow = Settings.now(), + offsetProvis = zoneToUse.offset(tsNow), + normalized = normalizeObject(obj, normalizeUnit, ["zone", "locale", "outputCalendar", "numberingSystem"]), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber, + loc = Locale.fromObject(obj); // cases: + // just a weekday -> this week's instance of that weekday, no worries + // (gregorian data or ordinal) + (weekYear or weekNumber) -> error + // (gregorian month or day) + ordinal -> error + // otherwise just use weeks or ordinals or gregorian, depending on what's specified + + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + + var useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; // configure ourselves to deal with gregorian dates or week stuff + + var units, + defaultValues, + objNow = tsToObj(tsNow, offsetProvis); + + if (useWeekData) { + units = orderedWeekUnits; + defaultValues = defaultWeekUnitValues; + objNow = gregorianToWeek(objNow); + } else if (containsOrdinal) { + units = orderedOrdinalUnits; + defaultValues = defaultOrdinalUnitValues; + objNow = gregorianToOrdinal(objNow); + } else { + units = orderedUnits$1; + defaultValues = defaultUnitValues; + } // set default values for missing stuff + + + var foundFirst = false; + + for (var _iterator3 = _createForOfIteratorHelperLoose(units), _step3; !(_step3 = _iterator3()).done;) { + var u = _step3.value; + var v = normalized[u]; + + if (!isUndefined(v)) { + foundFirst = true; + } else if (foundFirst) { + normalized[u] = defaultValues[u]; + } else { + normalized[u] = objNow[u]; + } + } // make sure the values we have are in range + + + var higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), + invalid = higherOrderInvalid || hasInvalidTimeData(normalized); + + if (invalid) { + return DateTime.invalid(invalid); + } // compute the actual time + + + var gregorian = useWeekData ? weekToGregorian(normalized) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, + _objToTS2 = objToTS(gregorian, offsetProvis, zoneToUse), + tsFinal = _objToTS2[0], + offsetFinal = _objToTS2[1], + inst = new DateTime({ + ts: tsFinal, + zone: zoneToUse, + o: offsetFinal, + loc: loc + }); // gregorian data + weekday serves only to validate + + + if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { + return DateTime.invalid("mismatched weekday", "you can't specify both a weekday of " + normalized.weekday + " and a date of " + inst.toISO()); + } + + return inst; + } + /** + * Create a DateTime from an ISO 8601 string + * @param {string} text - the ISO string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @example DateTime.fromISO('2016-05-25T09:08:34.123') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) + * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) + * @example DateTime.fromISO('2016-W05-4') + * @return {DateTime} + */ + ; + + DateTime.fromISO = function fromISO(text, opts) { + if (opts === void 0) { + opts = {}; + } + + var _parseISODate = parseISODate(text), + vals = _parseISODate[0], + parsedZone = _parseISODate[1]; + + return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); + } + /** + * Create a DateTime from an RFC 2822 string + * @param {string} text - the RFC 2822 string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') + * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') + * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') + * @return {DateTime} + */ + ; + + DateTime.fromRFC2822 = function fromRFC2822(text, opts) { + if (opts === void 0) { + opts = {}; + } + + var _parseRFC2822Date = parseRFC2822Date(text), + vals = _parseRFC2822Date[0], + parsedZone = _parseRFC2822Date[1]; + + return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); + } + /** + * Create a DateTime from an HTTP header date + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @param {string} text - the HTTP header date + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') + * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') + * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') + * @return {DateTime} + */ + ; + + DateTime.fromHTTP = function fromHTTP(text, opts) { + if (opts === void 0) { + opts = {}; + } + + var _parseHTTPDate = parseHTTPDate(text), + vals = _parseHTTPDate[0], + parsedZone = _parseHTTPDate[1]; + + return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); + } + /** + * Create a DateTime from an input string and format string. + * Defaults to en-US if no locale has been specified, regardless of the system's locale. + * @see https://moment.github.io/luxon/docs/manual/parsing.html#table-of-tokens + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @return {DateTime} + */ + ; + + DateTime.fromFormat = function fromFormat(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + + if (isUndefined(text) || isUndefined(fmt)) { + throw new InvalidArgumentError("fromFormat requires an input string and a format"); + } + + var _opts = opts, + _opts$locale = _opts.locale, + locale = _opts$locale === void 0 ? null : _opts$locale, + _opts$numberingSystem = _opts.numberingSystem, + numberingSystem = _opts$numberingSystem === void 0 ? null : _opts$numberingSystem, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }), + _parseFromTokens = parseFromTokens(localeToUse, text, fmt), + vals = _parseFromTokens[0], + parsedZone = _parseFromTokens[1], + invalid = _parseFromTokens[2]; + + if (invalid) { + return DateTime.invalid(invalid); + } else { + return parseDataToDateTime(vals, parsedZone, opts, "format " + fmt, text); + } + } + /** + * @deprecated use fromFormat instead + */ + ; + + DateTime.fromString = function fromString(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + + return DateTime.fromFormat(text, fmt, opts); + } + /** + * Create a DateTime from a SQL date, time, or datetime + * Defaults to en-US if no locale has been specified, regardless of the system's locale + * @param {string} text - the string to parse + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @example DateTime.fromSQL('2017-05-15') + * @example DateTime.fromSQL('2017-05-15 09:12:34') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) + * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) + * @example DateTime.fromSQL('09:12:34.342') + * @return {DateTime} + */ + ; + + DateTime.fromSQL = function fromSQL(text, opts) { + if (opts === void 0) { + opts = {}; + } + + var _parseSQL = parseSQL(text), + vals = _parseSQL[0], + parsedZone = _parseSQL[1]; + + return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); + } + /** + * Create an invalid DateTime. + * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {DateTime} + */ + ; + + DateTime.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); + } + + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + + if (Settings.throwOnInvalid) { + throw new InvalidDateTimeError(invalid); + } else { + return new DateTime({ + invalid: invalid + }); + } + } + /** + * Check if an object is a DateTime. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + ; + + DateTime.isDateTime = function isDateTime(o) { + return o && o.isLuxonDateTime || false; + } // INFO + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 + * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 + * @return {number} + */ + ; + + var _proto = DateTime.prototype; + + _proto.get = function get(unit) { + return this[unit]; + } + /** + * Returns whether the DateTime is valid. Invalid DateTimes occur when: + * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 + * * The DateTime was created by an operation on another invalid date + * @type {boolean} + */ + ; + + /** + * Returns the resolved Intl options for this DateTime. + * This is useful in understanding the behavior of formatting methods + * @param {Object} opts - the same options as toLocaleString + * @return {Object} + */ + _proto.resolvedLocaleOpts = function resolvedLocaleOpts(opts) { + if (opts === void 0) { + opts = {}; + } + + var _Formatter$create$res = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this), + locale = _Formatter$create$res.locale, + numberingSystem = _Formatter$create$res.numberingSystem, + calendar = _Formatter$create$res.calendar; + + return { + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: calendar + }; + } // TRANSFORM + + /** + * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. + * + * Equivalent to {@link setZone}('utc') + * @param {number} [offset=0] - optionally, an offset from UTC in minutes + * @param {Object} [opts={}] - options to pass to `setZone()` + * @return {DateTime} + */ + ; + + _proto.toUTC = function toUTC(offset, opts) { + if (offset === void 0) { + offset = 0; + } + + if (opts === void 0) { + opts = {}; + } + + return this.setZone(FixedOffsetZone.instance(offset), opts); + } + /** + * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. + * + * Equivalent to `setZone('local')` + * @return {DateTime} + */ + ; + + _proto.toLocal = function toLocal() { + return this.setZone(Settings.defaultZone); + } + /** + * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. + * + * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link plus}. You may wish to use {@link toLocal} and {@link toUTC} which provide simple convenience wrappers for commonly used zones. + * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link Zone} class. + * @param {Object} opts - options + * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. + * @return {DateTime} + */ + ; + + _proto.setZone = function setZone(zone, _temp) { + var _ref3 = _temp === void 0 ? {} : _temp, + _ref3$keepLocalTime = _ref3.keepLocalTime, + keepLocalTime = _ref3$keepLocalTime === void 0 ? false : _ref3$keepLocalTime, + _ref3$keepCalendarTim = _ref3.keepCalendarTime, + keepCalendarTime = _ref3$keepCalendarTim === void 0 ? false : _ref3$keepCalendarTim; + + zone = normalizeZone(zone, Settings.defaultZone); + + if (zone.equals(this.zone)) { + return this; + } else if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } else { + var newTS = this.ts; + + if (keepLocalTime || keepCalendarTime) { + var offsetGuess = zone.offset(this.ts); + var asObj = this.toObject(); + + var _objToTS3 = objToTS(asObj, offsetGuess, zone); + + newTS = _objToTS3[0]; + } + + return clone$1(this, { + ts: newTS, + zone: zone + }); + } + } + /** + * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. + * @param {Object} properties - the properties to set + * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) + * @return {DateTime} + */ + ; + + _proto.reconfigure = function reconfigure(_temp2) { + var _ref4 = _temp2 === void 0 ? {} : _temp2, + locale = _ref4.locale, + numberingSystem = _ref4.numberingSystem, + outputCalendar = _ref4.outputCalendar; + + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: outputCalendar + }); + return clone$1(this, { + loc: loc + }); + } + /** + * "Set" the locale. Returns a newly-constructed DateTime. + * Just a convenient alias for reconfigure({ locale }) + * @example DateTime.local(2017, 5, 25).setLocale('en-GB') + * @return {DateTime} + */ + ; + + _proto.setLocale = function setLocale(locale) { + return this.reconfigure({ + locale: locale + }); + } + /** + * "Set" the values of specified units. Returns a newly-constructed DateTime. + * You can only set units with this method; for "setting" metadata, see {@link reconfigure} and {@link setZone}. + * @param {Object} values - a mapping of units to numbers + * @example dt.set({ year: 2017 }) + * @example dt.set({ hour: 8, minute: 30 }) + * @example dt.set({ weekday: 5 }) + * @example dt.set({ year: 2005, ordinal: 234 }) + * @return {DateTime} + */ + ; + + _proto.set = function set(values) { + if (!this.isValid) return this; + var normalized = normalizeObject(values, normalizeUnit, []), + settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday); + var mixed; + + if (settingWeekStuff) { + mixed = weekToGregorian(Object.assign(gregorianToWeek(this.c), normalized)); + } else if (!isUndefined(normalized.ordinal)) { + mixed = ordinalToGregorian(Object.assign(gregorianToOrdinal(this.c), normalized)); + } else { + mixed = Object.assign(this.toObject(), normalized); // if we didn't set the day but we ended up on an overflow date, + // use the last day of the right month + + if (isUndefined(normalized.day)) { + mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); + } + } + + var _objToTS4 = objToTS(mixed, this.o, this.zone), + ts = _objToTS4[0], + o = _objToTS4[1]; + + return clone$1(this, { + ts: ts, + o: o + }); + } + /** + * Add a period of time to this DateTime and return the resulting DateTime + * + * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @example DateTime.local().plus(123) //~> in 123 milliseconds + * @example DateTime.local().plus({ minutes: 15 }) //~> in 15 minutes + * @example DateTime.local().plus({ days: 1 }) //~> this time tomorrow + * @example DateTime.local().plus({ days: -1 }) //~> this time yesterday + * @example DateTime.local().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min + * @example DateTime.local().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min + * @return {DateTime} + */ + ; + + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = friendlyDuration(duration); + return clone$1(this, adjustTime(this, dur)); + } + /** + * Subtract a period of time to this DateTime and return the resulting DateTime + * See {@link plus} + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + @return {DateTime} + */ + ; + + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = friendlyDuration(duration).negate(); + return clone$1(this, adjustTime(this, dur)); + } + /** + * "Set" this DateTime to the beginning of a unit of time. + * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' + * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' + * @return {DateTime} + */ + ; + + _proto.startOf = function startOf(unit) { + if (!this.isValid) return this; + var o = {}, + normalizedUnit = Duration.normalizeUnit(unit); + + switch (normalizedUnit) { + case "years": + o.month = 1; + // falls through + + case "quarters": + case "months": + o.day = 1; + // falls through + + case "weeks": + case "days": + o.hour = 0; + // falls through + + case "hours": + o.minute = 0; + // falls through + + case "minutes": + o.second = 0; + // falls through + + case "seconds": + o.millisecond = 0; + break; + // no default, invalid units throw in normalizeUnit() + } + + if (normalizedUnit === "weeks") { + o.weekday = 1; + } + + if (normalizedUnit === "quarters") { + var q = Math.ceil(this.month / 3); + o.month = (q - 1) * 3 + 1; + } + + return this.set(o); + } + /** + * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time + * @param {string} unit - The unit to go to the end of. Can be 'year', 'month', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' + * @return {DateTime} + */ + ; + + _proto.endOf = function endOf(unit) { + var _this$plus; + + return this.isValid ? this.plus((_this$plus = {}, _this$plus[unit] = 1, _this$plus)).startOf(unit).minus(1) : this; + } // OUTPUT + + /** + * Returns a string representation of this DateTime formatted according to the specified format string. + * **You may not want this.** See {@link toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens). + * Defaults to en-US if no locale has been specified, regardless of the system's locale. + * @see https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens + * @param {string} fmt - the format string + * @param {Object} opts - opts to override the configuration options + * @example DateTime.local().toFormat('yyyy LLL dd') //=> '2017 Apr 22' + * @example DateTime.local().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' + * @example DateTime.local().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' + * @example DateTime.local().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' + * @return {string} + */ + ; + + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + + return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID$2; + } + /** + * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. + * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation + * of the DateTime in the assigned locale. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param opts {Object} - Intl.DateTimeFormat constructor options and configuration options + * @example DateTime.local().toLocaleString(); //=> 4/20/2017 + * @example DateTime.local().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' + * @example DateTime.local().toLocaleString({ locale: 'en-gb' }); //=> '20/04/2017' + * @example DateTime.local().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' + * @example DateTime.local().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' + * @example DateTime.local().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' + * @example DateTime.local().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' + * @example DateTime.local().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' + * @example DateTime.local().toLocaleString({ hour: '2-digit', minute: '2-digit', hour12: false }); //=> '11:32' + * @return {string} + */ + ; + + _proto.toLocaleString = function toLocaleString(opts) { + if (opts === void 0) { + opts = DATE_SHORT; + } + + return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTime(this) : INVALID$2; + } + /** + * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts + * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. + * @example DateTime.local().toLocaleParts(); //=> [ + * //=> { type: 'day', value: '25' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'month', value: '05' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'year', value: '1982' } + * //=> ] + */ + ; + + _proto.toLocaleParts = function toLocaleParts(opts) { + if (opts === void 0) { + opts = {}; + } + + return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; + } + /** + * Returns an ISO 8601-compliant string representation of this DateTime + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @example DateTime.utc(1982, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' + * @example DateTime.local().toISO() //=> '2017-04-22T20:47:05.335-04:00' + * @example DateTime.local().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' + * @example DateTime.local().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' + * @return {string} + */ + ; + + _proto.toISO = function toISO(opts) { + if (opts === void 0) { + opts = {}; + } + + if (!this.isValid) { + return null; + } + + return this.toISODate(opts) + "T" + this.toISOTime(opts); + } + /** + * Returns an ISO 8601-compliant string representation of this DateTime's date component + * @param {Object} opts - options + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' + * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' + * @return {string} + */ + ; + + _proto.toISODate = function toISODate(_temp3) { + var _ref5 = _temp3 === void 0 ? {} : _temp3, + _ref5$format = _ref5.format, + format = _ref5$format === void 0 ? "extended" : _ref5$format; + + var fmt = format === "basic" ? "yyyyMMdd" : "yyyy-MM-dd"; + + if (this.year > 9999) { + fmt = "+" + fmt; + } + + return toTechFormat(this, fmt); + } + /** + * Returns an ISO 8601-compliant string representation of this DateTime's week date + * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' + * @return {string} + */ + ; + + _proto.toISOWeekDate = function toISOWeekDate() { + return toTechFormat(this, "kkkk-'W'WW-c"); + } + /** + * Returns an ISO 8601-compliant string representation of this DateTime's time component + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' + * @return {string} + */ + ; + + _proto.toISOTime = function toISOTime(_temp4) { + var _ref6 = _temp4 === void 0 ? {} : _temp4, + _ref6$suppressMillise = _ref6.suppressMilliseconds, + suppressMilliseconds = _ref6$suppressMillise === void 0 ? false : _ref6$suppressMillise, + _ref6$suppressSeconds = _ref6.suppressSeconds, + suppressSeconds = _ref6$suppressSeconds === void 0 ? false : _ref6$suppressSeconds, + _ref6$includeOffset = _ref6.includeOffset, + includeOffset = _ref6$includeOffset === void 0 ? true : _ref6$includeOffset, + _ref6$format = _ref6.format, + format = _ref6$format === void 0 ? "extended" : _ref6$format; + + return toTechTimeFormat(this, { + suppressSeconds: suppressSeconds, + suppressMilliseconds: suppressMilliseconds, + includeOffset: includeOffset, + format: format + }); + } + /** + * Returns an RFC 2822-compatible string representation of this DateTime, always in UTC + * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' + * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' + * @return {string} + */ + ; + + _proto.toRFC2822 = function toRFC2822() { + return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); + } + /** + * Returns a string representation of this DateTime appropriate for use in HTTP headers. + * Specifically, the string conforms to RFC 1123. + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' + * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' + * @return {string} + */ + ; + + _proto.toHTTP = function toHTTP() { + return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); + } + /** + * Returns a string representation of this DateTime appropriate for use in SQL Date + * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' + * @return {string} + */ + ; + + _proto.toSQLDate = function toSQLDate() { + return toTechFormat(this, "yyyy-MM-dd"); + } + /** + * Returns a string representation of this DateTime appropriate for use in SQL Time + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @example DateTime.utc().toSQL() //=> '05:15:16.345' + * @example DateTime.local().toSQL() //=> '05:15:16.345 -04:00' + * @example DateTime.local().toSQL({ includeOffset: false }) //=> '05:15:16.345' + * @example DateTime.local().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' + * @return {string} + */ + ; + + _proto.toSQLTime = function toSQLTime(_temp5) { + var _ref7 = _temp5 === void 0 ? {} : _temp5, + _ref7$includeOffset = _ref7.includeOffset, + includeOffset = _ref7$includeOffset === void 0 ? true : _ref7$includeOffset, + _ref7$includeZone = _ref7.includeZone, + includeZone = _ref7$includeZone === void 0 ? false : _ref7$includeZone; + + return toTechTimeFormat(this, { + includeOffset: includeOffset, + includeZone: includeZone, + spaceZone: true + }); + } + /** + * Returns a string representation of this DateTime appropriate for use in SQL DateTime + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' + * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' + * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' + * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' + * @return {string} + */ + ; + + _proto.toSQL = function toSQL(opts) { + if (opts === void 0) { + opts = {}; + } + + if (!this.isValid) { + return null; + } + + return this.toSQLDate() + " " + this.toSQLTime(opts); + } + /** + * Returns a string representation of this DateTime appropriate for debugging + * @return {string} + */ + ; + + _proto.toString = function toString() { + return this.isValid ? this.toISO() : INVALID$2; + } + /** + * Returns the epoch milliseconds of this DateTime. Alias of {@link toMillis} + * @return {number} + */ + ; + + _proto.valueOf = function valueOf() { + return this.toMillis(); + } + /** + * Returns the epoch milliseconds of this DateTime. + * @return {number} + */ + ; + + _proto.toMillis = function toMillis() { + return this.isValid ? this.ts : NaN; + } + /** + * Returns the epoch seconds of this DateTime. + * @return {number} + */ + ; + + _proto.toSeconds = function toSeconds() { + return this.isValid ? this.ts / 1000 : NaN; + } + /** + * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. + * @return {string} + */ + ; + + _proto.toJSON = function toJSON() { + return this.toISO(); + } + /** + * Returns a BSON serializable equivalent to this DateTime. + * @return {Date} + */ + ; + + _proto.toBSON = function toBSON() { + return this.toJSDate(); + } + /** + * Returns a Javascript object with this DateTime's year, month, day, and so on. + * @param opts - options for generating the object + * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output + * @example DateTime.local().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } + * @return {Object} + */ + ; + + _proto.toObject = function toObject(opts) { + if (opts === void 0) { + opts = {}; + } + + if (!this.isValid) return {}; + var base = Object.assign({}, this.c); + + if (opts.includeConfig) { + base.outputCalendar = this.outputCalendar; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + + return base; + } + /** + * Returns a Javascript Date equivalent to this DateTime. + * @return {Date} + */ + ; + + _proto.toJSDate = function toJSDate() { + return new Date(this.isValid ? this.ts : NaN); + } // COMPARE + + /** + * Return the difference between two DateTimes as a Duration. + * @param {DateTime} otherDateTime - the DateTime to compare this one to + * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example + * var i1 = DateTime.fromISO('1982-05-25T09:45'), + * i2 = DateTime.fromISO('1983-10-14T10:30'); + * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } + * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } + * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } + * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } + * @return {Duration} + */ + ; + + _proto.diff = function diff(otherDateTime, unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + + if (opts === void 0) { + opts = {}; + } + + if (!this.isValid || !otherDateTime.isValid) { + return Duration.invalid(this.invalid || otherDateTime.invalid, "created by diffing an invalid DateTime"); + } + + var durOpts = Object.assign({ + locale: this.locale, + numberingSystem: this.numberingSystem + }, opts); + + var units = maybeArray(unit).map(Duration.normalizeUnit), + otherIsLater = otherDateTime.valueOf() > this.valueOf(), + earlier = otherIsLater ? this : otherDateTime, + later = otherIsLater ? otherDateTime : this, + diffed = _diff(earlier, later, units, durOpts); + + return otherIsLater ? diffed.negate() : diffed; + } + /** + * Return the difference between this DateTime and right now. + * See {@link diff} + * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + ; + + _proto.diffNow = function diffNow(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + + if (opts === void 0) { + opts = {}; + } + + return this.diff(DateTime.local(), unit, opts); + } + /** + * Return an Interval spanning between this DateTime and another DateTime + * @param {DateTime} otherDateTime - the other end point of the Interval + * @return {Interval} + */ + ; + + _proto.until = function until(otherDateTime) { + return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; + } + /** + * Return whether this DateTime is in the same unit of time as another DateTime + * @param {DateTime} otherDateTime - the other DateTime + * @param {string} unit - the unit of time to check sameness on + * @example DateTime.local().hasSame(otherDT, 'day'); //~> true if both the same calendar day + * @return {boolean} + */ + ; + + _proto.hasSame = function hasSame(otherDateTime, unit) { + if (!this.isValid) return false; + + if (unit === "millisecond") { + return this.valueOf() === otherDateTime.valueOf(); + } else { + var inputMs = otherDateTime.valueOf(); + return this.startOf(unit) <= inputMs && inputMs <= this.endOf(unit); + } + } + /** + * Equality check + * Two DateTimes are equal iff they represent the same millisecond, have the same zone and location, and are both valid. + * To compare just the millisecond values, use `+dt1 === +dt2`. + * @param {DateTime} other - the other DateTime + * @return {boolean} + */ + ; + + _proto.equals = function equals(other) { + return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc); + } + /** + * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your + * platform supports Intl.RelativeTimeFormat. Rounds down by default. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.local()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" + * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" + * @param {boolean} [options.round=true] - whether to round the numbers in the output. + * @param {boolean} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.local().plus({ days: 1 }).toRelative() //=> "in 1 day" + * @example DateTime.local().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" + * @example DateTime.local().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" + * @example DateTime.local().minus({ days: 2 }).toRelative() //=> "2 days ago" + * @example DateTime.local().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" + * @example DateTime.local().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" + */ + ; + + _proto.toRelative = function toRelative(options) { + if (options === void 0) { + options = {}; + } + + if (!this.isValid) return null; + var base = options.base || DateTime.fromObject({ + zone: this.zone + }), + padding = options.padding ? this < base ? -options.padding : options.padding : 0; + return diffRelative(base, this.plus(padding), Object.assign(options, { + numeric: "always", + units: ["years", "months", "days", "hours", "minutes", "seconds"] + })); + } + /** + * Returns a string representation of this date relative to today, such as "yesterday" or "next month". + * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.local()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.local().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" + * @example DateTime.local().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" + * @example DateTime.local().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" + * @example DateTime.local().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" + */ + ; + + _proto.toRelativeCalendar = function toRelativeCalendar(options) { + if (options === void 0) { + options = {}; + } + + if (!this.isValid) return null; + return diffRelative(options.base || DateTime.fromObject({ + zone: this.zone + }), this, Object.assign(options, { + numeric: "auto", + units: ["years", "months", "days"], + calendary: true + })); + } + /** + * Return the min of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum + * @return {DateTime} the min DateTime, or undefined if called with no argument + */ + ; + + DateTime.min = function min() { + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("min requires all arguments be DateTimes"); + } + + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.min); + } + /** + * Return the max of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum + * @return {DateTime} the max DateTime, or undefined if called with no argument + */ + ; + + DateTime.max = function max() { + for (var _len2 = arguments.length, dateTimes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + dateTimes[_key2] = arguments[_key2]; + } + + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("max requires all arguments be DateTimes"); + } + + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.max); + } // MISC + + /** + * Explain how a string would be parsed by fromFormat() + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see description) + * @param {Object} options - options taken by fromFormat() + * @return {Object} + */ + ; + + DateTime.fromFormatExplain = function fromFormatExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + _options$locale = _options.locale, + locale = _options$locale === void 0 ? null : _options$locale, + _options$numberingSys = _options.numberingSystem, + numberingSystem = _options$numberingSys === void 0 ? null : _options$numberingSys, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + return explainFromTokens(localeToUse, text, fmt); + } + /** + * @deprecated use fromFormatExplain instead + */ + ; + + DateTime.fromStringExplain = function fromStringExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + + return DateTime.fromFormatExplain(text, fmt, options); + } // FORMAT PRESETS + + /** + * {@link toLocaleString} format like 10/14/1983 + * @type {Object} + */ + ; + + _createClass(DateTime, [{ + key: "isValid", + get: function get() { + return this.invalid === null; + } + /** + * Returns an error code if this DateTime is invalid, or null if the DateTime is valid + * @type {string} + */ + + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + /** + * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid + * @type {string} + */ + + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + /** + * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime + * + * @type {string} + */ + + }, { + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + /** + * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime + * + * @type {string} + */ + + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + /** + * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime + * + * @type {string} + */ + + }, { + key: "outputCalendar", + get: function get() { + return this.isValid ? this.loc.outputCalendar : null; + } + /** + * Get the time zone associated with this DateTime. + * @type {Zone} + */ + + }, { + key: "zone", + get: function get() { + return this._zone; + } + /** + * Get the name of the time zone. + * @type {string} + */ + + }, { + key: "zoneName", + get: function get() { + return this.isValid ? this.zone.name : null; + } + /** + * Get the year + * @example DateTime.local(2017, 5, 25).year //=> 2017 + * @type {number} + */ + + }, { + key: "year", + get: function get() { + return this.isValid ? this.c.year : NaN; + } + /** + * Get the quarter + * @example DateTime.local(2017, 5, 25).quarter //=> 2 + * @type {number} + */ + + }, { + key: "quarter", + get: function get() { + return this.isValid ? Math.ceil(this.c.month / 3) : NaN; + } + /** + * Get the month (1-12). + * @example DateTime.local(2017, 5, 25).month //=> 5 + * @type {number} + */ + + }, { + key: "month", + get: function get() { + return this.isValid ? this.c.month : NaN; + } + /** + * Get the day of the month (1-30ish). + * @example DateTime.local(2017, 5, 25).day //=> 25 + * @type {number} + */ + + }, { + key: "day", + get: function get() { + return this.isValid ? this.c.day : NaN; + } + /** + * Get the hour of the day (0-23). + * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 + * @type {number} + */ + + }, { + key: "hour", + get: function get() { + return this.isValid ? this.c.hour : NaN; + } + /** + * Get the minute of the hour (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 + * @type {number} + */ + + }, { + key: "minute", + get: function get() { + return this.isValid ? this.c.minute : NaN; + } + /** + * Get the second of the minute (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 + * @type {number} + */ + + }, { + key: "second", + get: function get() { + return this.isValid ? this.c.second : NaN; + } + /** + * Get the millisecond of the second (0-999). + * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 + * @type {number} + */ + + }, { + key: "millisecond", + get: function get() { + return this.isValid ? this.c.millisecond : NaN; + } + /** + * Get the week year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 11, 31).weekYear //=> 2015 + * @type {number} + */ + + }, { + key: "weekYear", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; + } + /** + * Get the week number of the week year (1-52ish). + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 + * @type {number} + */ + + }, { + key: "weekNumber", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; + } + /** + * Get the day of the week. + * 1 is Monday and 7 is Sunday + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 11, 31).weekday //=> 4 + * @type {number} + */ + + }, { + key: "weekday", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; + } + /** + * Get the ordinal (meaning the day of the year) + * @example DateTime.local(2017, 5, 25).ordinal //=> 145 + * @type {number|DateTime} + */ + + }, { + key: "ordinal", + get: function get() { + return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; + } + /** + * Get the human readable short month name, such as 'Oct'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthShort //=> Oct + * @type {string} + */ + + }, { + key: "monthShort", + get: function get() { + return this.isValid ? Info.months("short", { + locale: this.locale + })[this.month - 1] : null; + } + /** + * Get the human readable long month name, such as 'October'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthLong //=> October + * @type {string} + */ + + }, { + key: "monthLong", + get: function get() { + return this.isValid ? Info.months("long", { + locale: this.locale + })[this.month - 1] : null; + } + /** + * Get the human readable short weekday, such as 'Mon'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon + * @type {string} + */ + + }, { + key: "weekdayShort", + get: function get() { + return this.isValid ? Info.weekdays("short", { + locale: this.locale + })[this.weekday - 1] : null; + } + /** + * Get the human readable long weekday, such as 'Monday'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday + * @type {string} + */ + + }, { + key: "weekdayLong", + get: function get() { + return this.isValid ? Info.weekdays("long", { + locale: this.locale + })[this.weekday - 1] : null; + } + /** + * Get the UTC offset of this DateTime in minutes + * @example DateTime.local().offset //=> -240 + * @example DateTime.utc().offset //=> 0 + * @type {number} + */ + + }, { + key: "offset", + get: function get() { + return this.isValid ? +this.o : NaN; + } + /** + * Get the short human name for the zone's current offset, for example "EST" or "EDT". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + + }, { + key: "offsetNameShort", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "short", + locale: this.locale + }); + } else { + return null; + } + } + /** + * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + + }, { + key: "offsetNameLong", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "long", + locale: this.locale + }); + } else { + return null; + } + } + /** + * Get whether this zone's offset ever changes, as in a DST. + * @type {boolean} + */ + + }, { + key: "isOffsetFixed", + get: function get() { + return this.isValid ? this.zone.universal : null; + } + /** + * Get whether the DateTime is in a DST. + * @type {boolean} + */ + + }, { + key: "isInDST", + get: function get() { + if (this.isOffsetFixed) { + return false; + } else { + return this.offset > this.set({ + month: 1 + }).offset || this.offset > this.set({ + month: 5 + }).offset; + } + } + /** + * Returns true if this DateTime is in a leap year, false otherwise + * @example DateTime.local(2016).isInLeapYear //=> true + * @example DateTime.local(2013).isInLeapYear //=> false + * @type {boolean} + */ + + }, { + key: "isInLeapYear", + get: function get() { + return isLeapYear(this.year); + } + /** + * Returns the number of days in this DateTime's month + * @example DateTime.local(2016, 2).daysInMonth //=> 29 + * @example DateTime.local(2016, 3).daysInMonth //=> 31 + * @type {number} + */ + + }, { + key: "daysInMonth", + get: function get() { + return daysInMonth(this.year, this.month); + } + /** + * Returns the number of days in this DateTime's year + * @example DateTime.local(2016).daysInYear //=> 366 + * @example DateTime.local(2013).daysInYear //=> 365 + * @type {number} + */ + + }, { + key: "daysInYear", + get: function get() { + return this.isValid ? daysInYear(this.year) : NaN; + } + /** + * Returns the number of weeks in this DateTime's year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2004).weeksInWeekYear //=> 53 + * @example DateTime.local(2013).weeksInWeekYear //=> 52 + * @type {number} + */ + + }, { + key: "weeksInWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + } + }], [{ + key: "DATE_SHORT", + get: function get() { + return DATE_SHORT; + } + /** + * {@link toLocaleString} format like 'Oct 14, 1983' + * @type {Object} + */ + + }, { + key: "DATE_MED", + get: function get() { + return DATE_MED; + } + /** + * {@link toLocaleString} format like 'October 14, 1983' + * @type {Object} + */ + + }, { + key: "DATE_FULL", + get: function get() { + return DATE_FULL; + } + /** + * {@link toLocaleString} format like 'Tuesday, October 14, 1983' + * @type {Object} + */ + + }, { + key: "DATE_HUGE", + get: function get() { + return DATE_HUGE; + } + /** + * {@link toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + + }, { + key: "TIME_SIMPLE", + get: function get() { + return TIME_SIMPLE; + } + /** + * {@link toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + + }, { + key: "TIME_WITH_SECONDS", + get: function get() { + return TIME_WITH_SECONDS; + } + /** + * {@link toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + + }, { + key: "TIME_WITH_SHORT_OFFSET", + get: function get() { + return TIME_WITH_SHORT_OFFSET; + } + /** + * {@link toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + + }, { + key: "TIME_WITH_LONG_OFFSET", + get: function get() { + return TIME_WITH_LONG_OFFSET; + } + /** + * {@link toLocaleString} format like '09:30', always 24-hour. + * @type {Object} + */ + + }, { + key: "TIME_24_SIMPLE", + get: function get() { + return TIME_24_SIMPLE; + } + /** + * {@link toLocaleString} format like '09:30:23', always 24-hour. + * @type {Object} + */ + + }, { + key: "TIME_24_WITH_SECONDS", + get: function get() { + return TIME_24_WITH_SECONDS; + } + /** + * {@link toLocaleString} format like '09:30:23 EDT', always 24-hour. + * @type {Object} + */ + + }, { + key: "TIME_24_WITH_SHORT_OFFSET", + get: function get() { + return TIME_24_WITH_SHORT_OFFSET; + } + /** + * {@link toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. + * @type {Object} + */ + + }, { + key: "TIME_24_WITH_LONG_OFFSET", + get: function get() { + return TIME_24_WITH_LONG_OFFSET; + } + /** + * {@link toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + + }, { + key: "DATETIME_SHORT", + get: function get() { + return DATETIME_SHORT; + } + /** + * {@link toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + + }, { + key: "DATETIME_SHORT_WITH_SECONDS", + get: function get() { + return DATETIME_SHORT_WITH_SECONDS; + } + /** + * {@link toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + + }, { + key: "DATETIME_MED", + get: function get() { + return DATETIME_MED; + } + /** + * {@link toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + + }, { + key: "DATETIME_MED_WITH_SECONDS", + get: function get() { + return DATETIME_MED_WITH_SECONDS; + } + /** + * {@link toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + + }, { + key: "DATETIME_MED_WITH_WEEKDAY", + get: function get() { + return DATETIME_MED_WITH_WEEKDAY; + } + /** + * {@link toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + + }, { + key: "DATETIME_FULL", + get: function get() { + return DATETIME_FULL; + } + /** + * {@link toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + + }, { + key: "DATETIME_FULL_WITH_SECONDS", + get: function get() { + return DATETIME_FULL_WITH_SECONDS; + } + /** + * {@link toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + + }, { + key: "DATETIME_HUGE", + get: function get() { + return DATETIME_HUGE; + } + /** + * {@link toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + + }, { + key: "DATETIME_HUGE_WITH_SECONDS", + get: function get() { + return DATETIME_HUGE_WITH_SECONDS; + } + }]); + + return DateTime; + }(); + function friendlyDateTime(dateTimeish) { + if (DateTime.isDateTime(dateTimeish)) { + return dateTimeish; + } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { + return DateTime.fromJSDate(dateTimeish); + } else if (dateTimeish && typeof dateTimeish === "object") { + return DateTime.fromObject(dateTimeish); + } else { + throw new InvalidArgumentError("Unknown datetime argument: " + dateTimeish + ", of type " + typeof dateTimeish); + } + } + + exports.DateTime = DateTime; + exports.Duration = Duration; + exports.FixedOffsetZone = FixedOffsetZone; + exports.IANAZone = IANAZone; + exports.Info = Info; + exports.Interval = Interval; + exports.InvalidZone = InvalidZone; + exports.LocalZone = LocalZone; + exports.Settings = Settings; + exports.Zone = Zone; + + return exports; + +}({})); +//# sourceMappingURL=luxon.js.map diff --git a/apps/examples/static/components/vueform/luxon.min.js b/apps/showcase/static/components/vueform/luxon.min.js similarity index 100% rename from apps/examples/static/components/vueform/luxon.min.js rename to apps/showcase/static/components/vueform/luxon.min.js diff --git a/apps/showcase/static/components/vueform/vueform.css b/apps/showcase/static/components/vueform/vueform.css new file mode 100644 index 000000000..72650a9a2 --- /dev/null +++ b/apps/showcase/static/components/vueform/vueform.css @@ -0,0 +1,3 @@ +div.vueform p.error { + color: crimson; +} \ No newline at end of file diff --git a/apps/examples/static/components/vueform/vueform.html b/apps/showcase/static/components/vueform/vueform.html similarity index 53% rename from apps/examples/static/components/vueform/vueform.html rename to apps/showcase/static/components/vueform/vueform.html index 478cd211d..c9aa0dffa 100644 --- a/apps/examples/static/components/vueform/vueform.html +++ b/apps/showcase/static/components/vueform/vueform.html @@ -6,32 +6,46 @@
    -
    -
    - +
    + {{field.date_readonly}}
    -
    - +
    + Timezone: {{time_zone}}
    + +
    + + +
    + readonly class="input is-static" v-model="field.text">
    - + - + Yes + No + None +

    +
    - +

    Please fix the above errors

    + +
    diff --git a/apps/showcase/static/components/vueform/vueform.js b/apps/showcase/static/components/vueform/vueform.js new file mode 100644 index 000000000..4f5821087 --- /dev/null +++ b/apps/showcase/static/components/vueform/vueform.js @@ -0,0 +1,225 @@ +(function(){ + + var form = { + props: ['url', 'check_url', 'cancel_url'], + data: null, + readonly: false, + methods: {}, + computed: {some_error: has_some_error} + }; + + form.data = function() { + var data = { + server_url: this.url, + validation_url: this.check_url, + cancel_url_: this.cancel_url, + fields: [], + readonly: false, + time_offset: luxon.DateTime.local().offsetNameShort, + time_zone: luxon.DateTime.local().zoneName, + }; + form.methods.load.call(data); + return data; + }; + + form.decorate = function (a) { + let k=0; + a.map(function(e) { + e._idx = k++; + e._modified = false; + }); + }; + + form.methods.load = function () { + // This method loads the structure and values for the form. + let self = this; + axios.get(self.server_url, {params: {page: self.page}}) + .then(function(res) { + set_results(self, res); + }) + }; + + form.methods.cancel = function () { + let self = this; + if (self.cancel_url_) { + window.location = self.cancel_url_; + } + } + + function set_results(self, res) { + // This either sets new values (including errors) for the form, + // or it implements the redirection that one may wish after the post. + if (res.data.redirect_url) { + window.location = res.data.redirect_url; + } else { + self.fields = preprocess_fields(self, res.data.fields); + console.log("Set fields:", self.fields); + self.readonly = res.data.readonly; + form.decorate(self.fields); + } + } + + function preprocess_fields(self, fields) { + // Preprocesses the fields. + for (let f of fields) { + f.readonly = !f.writable; + if (f.type === 'datetime') { + if (f.value === null) { + f.time = null; + f.date = null; + f.date_readonly = null; + f.datetime_readonly = null; + } else { + // console.log("converting time", f.value) + let m = luxon.DateTime.fromISO(f.value, {zone: "UTC"}); + // console.log("parsed:", m); + let local_m = m.setZone(self.time_zone); + f.date = local_m.toFormat("y-MM-dd"); + f.time = local_m.toLocaleString(luxon.DateTime.TIME_SIMPLE); + f.date_readonly = local_m.toLocaleString(luxon.DateTime.DATETIME_HUGE); + f.datetime_readonly = local_m.toLocaleString({ + year: "numeric", month: "long", + day: "numeric", weekday: "long", + hour: "numeric", minute: "numeric", + timeZoneName: "short", + }); + } + } + if (f.type === 'date') { + if (f.value == null) { + f.date = null; + f.date_readonly = null; + } else { + let m = luxon.DateTime.fromISO(f.value, {zone: "UTC"}); + f.date = m.toFormat("y-MM-dd"); + f.date_readonly = m.toLocaleString(luxon.DateTime.DATE_HUGE); + } + } + if (f.type === 'dropdown' && f.readonly) { + f.text = ''; + for (let labtext of f.values) { + if (labtext.label === f.value) { + f.text = labtext.text; + } + } + } + } + return fields; + } + + function has_some_error() { + let self = this; + for (let field of self.fields) { + if (field.error) { + return true; + } + } + return false; + } + + function get_datetime_luxon(field) { + let field_date = ""; + let field_time = ""; + if (field.date !== null) { + field_date = field.date; + } + if (field.time !== null) { + field_time = field.time; + } + console.log("Getting date of:", field_date + " " + field_time); + let d = Sugar.Date(field_date + " " + field_time); + return luxon.DateTime.fromISO(d.raw.toISOString()); + } + + function get_datetime_field_value(field) { + let local_t = get_datetime_luxon(field); + let utc_t = local_t.setZone("utc"); + return utc_t.toISO(); + } + + function get_date_field_value(field) { + // Parses the date, and puts it into the field value. + let d = Sugar.Date(field.value); + return Sugar.Date.format(d, "%Y-%m-%d"); + } + + function get_field_value(field) { + if (field.type === "datetime") { + return get_datetime_field_value(field); + } else if (field.type === "date") { + return get_date_field_value(field); + } else { + return field.value; + } + } + + form.methods.submit = function () { + let self = this; + let d = {}; + let ok = true; + for (let field of self.fields) { + try { + d[field.name] = get_field_value(field); + } catch (e) { + field.error = "Invalid format"; + ok = false; + } + } + if (ok) { + console.log("Posting:", d); + axios.post(self.server_url, d).then(function (res) { + set_results(self, res); + }); + } + }; + + form.methods.mark_field = function (field_idx) { + let self = this; + let field = self.fields[field_idx]; + field._modified = true; + }; + + form.methods.set_readable_date = function(field_idx) { + let self = this; + let field = self.fields[field_idx]; + if (field.type === 'datetime') { + try { + local_m = get_datetime_luxon(field); + field.date_readonly = local_m.toLocaleString(luxon.DateTime.DATETIME_HUGE); + } catch (e) { + field.date_readonly = ""; + } + } + }; + + form.methods.validate_field = function (field_idx) { + let self = this; + let field = self.fields[field_idx]; + if (field._modified) { + // Gets a parsed value, so we fix the presentation of dates. + let obtained = false; + let parsed_value = null; + try { + parsed_value = get_field_value(field); + obtained = true; + } catch (e) { + field.error = "Invalid format"; + } + if (obtained) { + field._modified = false; + axios.post(self.validation_url, { + name: field.name, + value: parsed_value, + }).then(function (res) { + field.error = res.data.error; + }); + } + } + }; + + Q.register_vue_component('vueform', 'components-bulma/vueform/vueform.html', + function(template) { + form.template = template.data; + return form; + }); +})(); diff --git a/apps/examples/static/css/no.css b/apps/showcase/static/css/no.css similarity index 99% rename from apps/examples/static/css/no.css rename to apps/showcase/static/css/no.css index d1230fb0f..cfe5f519e 100644 --- a/apps/examples/static/css/no.css +++ b/apps/showcase/static/css/no.css @@ -115,7 +115,7 @@ header, footer { code { background: #f4f5f6; border-radius: .4rem; - font-size: 90; + font-size: 0.8em; margin: 0 .2rem; padding: .2rem .5rem; white-space: nowrap; @@ -540,4 +540,4 @@ ul.tags-list li { ul.tags-list li[data-selected=true] { opacity: 1.0; -} \ No newline at end of file +} diff --git a/apps/showcase/static/css/prism.css b/apps/showcase/static/css/prism.css new file mode 100644 index 000000000..221f20cfd --- /dev/null +++ b/apps/showcase/static/css/prism.css @@ -0,0 +1,3 @@ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+python&plugins=remove-initial-line-feed+normalize-whitespace */ +code[class*=language-],pre[class*=language-]{color:#ccc;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green} diff --git a/apps/showcase/static/data/uscities.json b/apps/showcase/static/data/uscities.json new file mode 100644 index 000000000..8315215c2 --- /dev/null +++ b/apps/showcase/static/data/uscities.json @@ -0,0 +1,341930 @@ +[ + { + "zip_code": 501, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Holtsville", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 544, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Holtsville", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 601, + "latitude": 18.165273, + "longitude": -66.722583, + "city": "Adjuntas", + "state": "PR", + "county": "Adjuntas" + }, + { + "zip_code": 602, + "latitude": 18.393103, + "longitude": -67.180953, + "city": "Aguada", + "state": "PR", + "county": "Aguada" + }, + { + "zip_code": 603, + "latitude": 18.455913, + "longitude": -67.14578, + "city": "Aguadilla", + "state": "PR", + "county": "Aguadilla" + }, + { + "zip_code": 604, + "latitude": 18.49352, + "longitude": -67.135883, + "city": "Aguadilla", + "state": "PR", + "county": "Aguadilla" + }, + { + "zip_code": 605, + "latitude": 18.465162, + "longitude": -67.141486, + "city": "Aguadilla", + "state": "PR", + "county": "Aguadilla" + }, + { + "zip_code": 606, + "latitude": 18.172947, + "longitude": -66.944111, + "city": "Maricao", + "state": "PR", + "county": "Maricao" + }, + { + "zip_code": 610, + "latitude": 18.288685, + "longitude": -67.139696, + "city": "Anasco", + "state": "PR", + "county": "Anasco" + }, + { + "zip_code": 611, + "latitude": 18.279531, + "longitude": -66.80217, + "city": "Angeles", + "state": "PR", + "county": "Utuado" + }, + { + "zip_code": 612, + "latitude": 18.450674, + "longitude": -66.698262, + "city": "Arecibo", + "state": "PR", + "county": "Arecibo" + }, + { + "zip_code": 613, + "latitude": 18.458093, + "longitude": -66.732732, + "city": "Arecibo", + "state": "PR", + "county": "Arecibo" + }, + { + "zip_code": 614, + "latitude": 18.429675, + "longitude": -66.674506, + "city": "Arecibo", + "state": "PR", + "county": "Arecibo" + }, + { + "zip_code": 616, + "latitude": 18.444792, + "longitude": -66.640678, + "city": "Bajadero", + "state": "PR", + "county": "Arecibo" + }, + { + "zip_code": 617, + "latitude": 18.447092, + "longitude": -66.544255, + "city": "Barceloneta", + "state": "PR", + "county": "Barceloneta" + }, + { + "zip_code": 622, + "latitude": 17.998531, + "longitude": -67.187318, + "city": "Boqueron", + "state": "PR", + "county": "Cabo Rojo" + }, + { + "zip_code": 623, + "latitude": 18.062201, + "longitude": -67.149541, + "city": "Cabo Rojo", + "state": "PR", + "county": "Cabo Rojo" + }, + { + "zip_code": 624, + "latitude": 18.023535, + "longitude": -66.726156, + "city": "Penuelas", + "state": "PR", + "county": "Penuelas" + }, + { + "zip_code": 627, + "latitude": 18.477891, + "longitude": -66.85477, + "city": "Camuy", + "state": "PR", + "county": "Camuy" + }, + { + "zip_code": 631, + "latitude": 18.269187, + "longitude": -66.864993, + "city": "Castaner", + "state": "PR", + "county": "Lares" + }, + { + "zip_code": 636, + "latitude": 18.113284, + "longitude": -67.039706, + "city": "Rosario", + "state": "PR", + "county": "San German" + }, + { + "zip_code": 637, + "latitude": 18.087322, + "longitude": -66.934911, + "city": "Sabana Grande", + "state": "PR", + "county": "Sabana Grande" + }, + { + "zip_code": 638, + "latitude": 18.33616, + "longitude": -66.472087, + "city": "Ciales", + "state": "PR", + "county": "Ciales" + }, + { + "zip_code": 641, + "latitude": 18.250027, + "longitude": -66.698957, + "city": "Utuado", + "state": "PR", + "county": "Utuado" + }, + { + "zip_code": 646, + "latitude": 18.43606, + "longitude": -66.281954, + "city": "Dorado", + "state": "PR", + "county": "Dorado" + }, + { + "zip_code": 647, + "latitude": 17.969594, + "longitude": -66.939754, + "city": "Ensenada", + "state": "PR", + "county": "Guanica" + }, + { + "zip_code": 650, + "latitude": 18.360125, + "longitude": -66.562311, + "city": "Florida", + "state": "PR", + "county": "Florida" + }, + { + "zip_code": 652, + "latitude": 18.457254, + "longitude": -66.603358, + "city": "Garrochales", + "state": "PR", + "county": "Arecibo" + }, + { + "zip_code": 653, + "latitude": 17.972468, + "longitude": -66.898661, + "city": "Guanica", + "state": "PR", + "county": "Guanica" + }, + { + "zip_code": 656, + "latitude": 18.02328, + "longitude": -66.786909, + "city": "Guayanilla", + "state": "PR", + "county": "Guayanilla" + }, + { + "zip_code": 659, + "latitude": 18.481391, + "longitude": -66.808696, + "city": "Hatillo", + "state": "PR", + "county": "Hatillo" + }, + { + "zip_code": 660, + "latitude": 18.145486, + "longitude": -67.135323, + "city": "Hormigueros", + "state": "PR", + "county": "Hormigueros" + }, + { + "zip_code": 662, + "latitude": 18.480285, + "longitude": -67.028155, + "city": "Isabela", + "state": "PR", + "county": "Isabela" + }, + { + "zip_code": 664, + "latitude": 18.217606, + "longitude": -66.598306, + "city": "Jayuya", + "state": "PR", + "county": "Jayuya" + }, + { + "zip_code": 667, + "latitude": 18.015099, + "longitude": -67.055973, + "city": "Lajas", + "state": "PR", + "county": "Lajas" + }, + { + "zip_code": 669, + "latitude": 18.295952, + "longitude": -66.881925, + "city": "Lares", + "state": "PR", + "county": "Lares" + }, + { + "zip_code": 670, + "latitude": 18.252135, + "longitude": -66.990967, + "city": "Las Marias", + "state": "PR", + "county": "Las Marias" + }, + { + "zip_code": 674, + "latitude": 18.44553, + "longitude": -66.490268, + "city": "Manati", + "state": "PR", + "county": "Manati" + }, + { + "zip_code": 676, + "latitude": 18.383727, + "longitude": -67.080799, + "city": "Moca", + "state": "PR", + "county": "Moca" + }, + { + "zip_code": 677, + "latitude": 18.335781, + "longitude": -67.252547, + "city": "Rincon", + "state": "PR", + "county": "Rincon" + }, + { + "zip_code": 678, + "latitude": 18.45303, + "longitude": -66.933689, + "city": "Quebradillas", + "state": "PR", + "county": "Quebradillas" + }, + { + "zip_code": 680, + "latitude": 18.219023, + "longitude": -67.508068, + "city": "Mayaguez", + "state": "PR", + "county": "Mayaguez" + }, + { + "zip_code": 681, + "latitude": 18.219023, + "longitude": -67.508068, + "city": "Mayaguez", + "state": "PR", + "county": "Mayaguez" + }, + { + "zip_code": 682, + "latitude": 18.219023, + "longitude": -67.508068, + "city": "Mayaguez", + "state": "PR", + "county": "Mayaguez" + }, + { + "zip_code": 683, + "latitude": 18.113284, + "longitude": -67.039706, + "city": "San German", + "state": "PR", + "county": "San German" + }, + { + "zip_code": 685, + "latitude": 18.3236, + "longitude": -66.972227, + "city": "San Sebastian", + "state": "PR", + "county": "San Sebastian" + }, + { + "zip_code": 687, + "latitude": 18.316976, + "longitude": -66.415207, + "city": "Morovis", + "state": "PR", + "county": "Morovis" + }, + { + "zip_code": 688, + "latitude": 18.429675, + "longitude": -66.674506, + "city": "Sabana Hoyos", + "state": "PR", + "county": "Arecibo" + }, + { + "zip_code": 690, + "latitude": 18.476196, + "longitude": -67.139597, + "city": "San Antonio", + "state": "PR", + "county": "Aguadilla" + }, + { + "zip_code": 692, + "latitude": 18.435818, + "longitude": -66.338523, + "city": "Vega Alta", + "state": "PR", + "county": "Vega Alta" + }, + { + "zip_code": 693, + "latitude": 18.443109, + "longitude": -66.398302, + "city": "Vega Baja", + "state": "PR", + "county": "Vega Baja" + }, + { + "zip_code": 694, + "latitude": 18.443109, + "longitude": -66.398302, + "city": "Vega Baja", + "state": "PR", + "county": "Vega Baja" + }, + { + "zip_code": 698, + "latitude": 18.06104, + "longitude": -66.861164, + "city": "Yauco", + "state": "PR", + "county": "Yauco" + }, + { + "zip_code": 703, + "latitude": 18.250398, + "longitude": -66.12845, + "city": "Aguas Buenas", + "state": "PR", + "county": "Aguas Buenas" + }, + { + "zip_code": 704, + "latitude": 17.99229, + "longitude": -66.139253, + "city": "Aguirre", + "state": "PR", + "county": "Guayama" + }, + { + "zip_code": 705, + "latitude": 18.128092, + "longitude": -66.268717, + "city": "Aibonito", + "state": "PR", + "county": "Aibonito" + }, + { + "zip_code": 707, + "latitude": 18.007014, + "longitude": -65.898719, + "city": "Maunabo", + "state": "PR", + "county": "Maunabo" + }, + { + "zip_code": 714, + "latitude": 17.96751, + "longitude": -66.04138, + "city": "Arroyo", + "state": "PR", + "county": "Arroyo" + }, + { + "zip_code": 715, + "latitude": 18.011854, + "longitude": -66.563721, + "city": "Mercedita", + "state": "PR", + "county": "Ponce" + }, + { + "zip_code": 716, + "latitude": 18.001995, + "longitude": -66.607429, + "city": "Ponce", + "state": "PR", + "county": "Ponce" + }, + { + "zip_code": 717, + "latitude": 18.001995, + "longitude": -66.607429, + "city": "Ponce", + "state": "PR", + "county": "Ponce" + }, + { + "zip_code": 718, + "latitude": 18.22139, + "longitude": -65.77831, + "city": "Naguabo", + "state": "PR", + "county": "Naguabo" + }, + { + "zip_code": 719, + "latitude": 18.298017, + "longitude": -66.229751, + "city": "Naranjito", + "state": "PR", + "county": "Naranjito" + }, + { + "zip_code": 720, + "latitude": 18.226862, + "longitude": -66.39402, + "city": "Orocovis", + "state": "PR", + "county": "Orocovis" + }, + { + "zip_code": 721, + "latitude": 18.364161, + "longitude": -65.778288, + "city": "Palmer", + "state": "PR", + "county": "Rio Grande" + }, + { + "zip_code": 723, + "latitude": 18.009994, + "longitude": -66.010572, + "city": "Patillas", + "state": "PR", + "county": "Patillas" + }, + { + "zip_code": 725, + "latitude": 18.212965, + "longitude": -66.058033, + "city": "Caguas", + "state": "PR", + "county": "Caguas" + }, + { + "zip_code": 726, + "latitude": 18.212965, + "longitude": -66.058033, + "city": "Caguas", + "state": "PR", + "county": "Caguas" + }, + { + "zip_code": 727, + "latitude": 18.212965, + "longitude": -66.058033, + "city": "Caguas", + "state": "PR", + "county": "Caguas" + }, + { + "zip_code": 728, + "latitude": 18.001995, + "longitude": -66.607429, + "city": "Ponce", + "state": "PR", + "county": "Ponce" + }, + { + "zip_code": 729, + "latitude": 18.333093, + "longitude": -65.883864, + "city": "Canovanas", + "state": "PR", + "county": "Canovanas" + }, + { + "zip_code": 730, + "latitude": 18.001995, + "longitude": -66.607429, + "city": "Ponce", + "state": "PR", + "county": "Ponce" + }, + { + "zip_code": 731, + "latitude": 18.03831, + "longitude": -66.626344, + "city": "Ponce", + "state": "PR", + "county": "Ponce" + }, + { + "zip_code": 732, + "latitude": 18.021781, + "longitude": -66.613742, + "city": "Ponce", + "state": "PR", + "county": "Ponce" + }, + { + "zip_code": 733, + "latitude": 18.019331, + "longitude": -66.619165, + "city": "Ponce", + "state": "PR", + "county": "Ponce" + }, + { + "zip_code": 734, + "latitude": 17.999499, + "longitude": -66.643934, + "city": "Ponce", + "state": "PR", + "county": "Ponce" + }, + { + "zip_code": 735, + "latitude": 18.264872, + "longitude": -65.594769, + "city": "Ceiba", + "state": "PR", + "county": "Ceiba" + }, + { + "zip_code": 736, + "latitude": 18.102967, + "longitude": -66.139274, + "city": "Cayey", + "state": "PR", + "county": "Cayey" + }, + { + "zip_code": 737, + "latitude": 18.102967, + "longitude": -66.139274, + "city": "Cayey", + "state": "PR", + "county": "Cayey" + }, + { + "zip_code": 738, + "latitude": 18.359381, + "longitude": -65.611361, + "city": "Fajardo", + "state": "PR", + "county": "Fajardo" + }, + { + "zip_code": 739, + "latitude": 18.181469, + "longitude": -66.169519, + "city": "Cidra", + "state": "PR", + "county": "Cidra" + }, + { + "zip_code": 740, + "latitude": 18.331958, + "longitude": -65.63878, + "city": "Puerto Real", + "state": "PR", + "county": "Fajardo" + }, + { + "zip_code": 741, + "latitude": 18.162156, + "longitude": -65.753485, + "city": "Punta Santiago", + "state": "PR", + "county": "Humacao" + }, + { + "zip_code": 742, + "latitude": 18.264872, + "longitude": -65.594769, + "city": "Roosevelt Roads", + "state": "PR", + "county": "Ceiba" + }, + { + "zip_code": 744, + "latitude": 18.206329, + "longitude": -65.743058, + "city": "Rio Blanco", + "state": "PR", + "county": "Naguabo" + }, + { + "zip_code": 745, + "latitude": 18.367347, + "longitude": -65.816583, + "city": "Rio Grande", + "state": "PR", + "county": "Rio Grande" + }, + { + "zip_code": 751, + "latitude": 17.99852, + "longitude": -66.264825, + "city": "Salinas", + "state": "PR", + "county": "Salinas" + }, + { + "zip_code": 754, + "latitude": 18.187584, + "longitude": -65.962389, + "city": "San Lorenzo", + "state": "PR", + "county": "San Lorenzo" + }, + { + "zip_code": 757, + "latitude": 17.991233, + "longitude": -66.395543, + "city": "Santa Isabel", + "state": "PR", + "county": "Santa Isabel" + }, + { + "zip_code": 765, + "latitude": 18.123347, + "longitude": -65.460356, + "city": "Vieques", + "state": "PR", + "county": "Vieques" + }, + { + "zip_code": 766, + "latitude": 18.120519, + "longitude": -66.496607, + "city": "Villalba", + "state": "PR", + "county": "Villalba" + }, + { + "zip_code": 767, + "latitude": 18.045522, + "longitude": -65.886988, + "city": "Yabucoa", + "state": "PR", + "county": "Yabucoa" + }, + { + "zip_code": 769, + "latitude": 18.095992, + "longitude": -66.35081, + "city": "Coamo", + "state": "PR", + "county": "Coamo" + }, + { + "zip_code": 771, + "latitude": 18.196576, + "longitude": -65.87197, + "city": "Las Piedras", + "state": "PR", + "county": "Las Piedras" + }, + { + "zip_code": 772, + "latitude": 18.447406, + "longitude": -65.899357, + "city": "Loiza", + "state": "PR", + "county": "Loiza" + }, + { + "zip_code": 773, + "latitude": 18.366027, + "longitude": -65.708138, + "city": "Luquillo", + "state": "PR", + "county": "Luquillo" + }, + { + "zip_code": 775, + "latitude": 18.323736, + "longitude": -65.296467, + "city": "Culebra", + "state": "PR", + "county": "Culebra" + }, + { + "zip_code": 777, + "latitude": 18.206489, + "longitude": -65.901774, + "city": "Juncos", + "state": "PR", + "county": "Juncos" + }, + { + "zip_code": 778, + "latitude": 18.259092, + "longitude": -65.974641, + "city": "Gurabo", + "state": "PR", + "county": "Gurabo" + }, + { + "zip_code": 780, + "latitude": 18.001995, + "longitude": -66.607429, + "city": "Coto Laurel", + "state": "PR", + "county": "Ponce" + }, + { + "zip_code": 782, + "latitude": 18.224958, + "longitude": -66.219885, + "city": "Comerio", + "state": "PR", + "county": "Comerio" + }, + { + "zip_code": 783, + "latitude": 18.304369, + "longitude": -66.330525, + "city": "Corozal", + "state": "PR", + "county": "Corozal" + }, + { + "zip_code": 784, + "latitude": 17.99229, + "longitude": -66.139253, + "city": "Guayama", + "state": "PR", + "county": "Guayama" + }, + { + "zip_code": 785, + "latitude": 18.018822, + "longitude": -66.795603, + "city": "Guayama", + "state": "PR", + "county": "Guayanilla" + }, + { + "zip_code": 786, + "latitude": 18.128092, + "longitude": -66.268717, + "city": "La Plata", + "state": "PR", + "county": "Aibonito" + }, + { + "zip_code": 791, + "latitude": 18.138029, + "longitude": -65.788499, + "city": "Humacao", + "state": "PR", + "county": "Humacao" + }, + { + "zip_code": 792, + "latitude": 18.138029, + "longitude": -65.788499, + "city": "Humacao", + "state": "PR", + "county": "Humacao" + }, + { + "zip_code": 794, + "latitude": 18.200898, + "longitude": -66.307236, + "city": "Barranquitas", + "state": "PR", + "county": "Barranquitas" + }, + { + "zip_code": 795, + "latitude": 17.997367, + "longitude": -66.493218, + "city": "Juana Diaz", + "state": "PR", + "county": "Juana Diaz" + }, + { + "zip_code": 801, + "latitude": 18.322285, + "longitude": -64.963715, + "city": "St Thomas", + "state": "VI", + "county": "Saint Thomas" + }, + { + "zip_code": 802, + "latitude": 18.322285, + "longitude": -64.963715, + "city": "St Thomas", + "state": "VI", + "county": "Saint Thomas" + }, + { + "zip_code": 803, + "latitude": 18.322285, + "longitude": -64.963715, + "city": "St Thomas", + "state": "VI", + "county": "Saint Thomas" + }, + { + "zip_code": 804, + "latitude": 18.322285, + "longitude": -64.963715, + "city": "St Thomas", + "state": "VI", + "county": "Saint Thomas" + }, + { + "zip_code": 805, + "latitude": 18.322285, + "longitude": -64.963715, + "city": "St Thomas", + "state": "VI", + "county": "Saint Thomas" + }, + { + "zip_code": 820, + "latitude": 17.734211, + "longitude": -64.734694, + "city": "Christiansted", + "state": "VI", + "county": "Saint Croix" + }, + { + "zip_code": 821, + "latitude": 17.734211, + "longitude": -64.734694, + "city": "Christiansted", + "state": "VI", + "county": "Saint Croix" + }, + { + "zip_code": 822, + "latitude": 17.734211, + "longitude": -64.734694, + "city": "Christiansted", + "state": "VI", + "county": "Saint Croix" + }, + { + "zip_code": 823, + "latitude": 17.734211, + "longitude": -64.734694, + "city": "Christiansted", + "state": "VI", + "county": "Saint Croix" + }, + { + "zip_code": 824, + "latitude": 17.734211, + "longitude": -64.734694, + "city": "Christiansted", + "state": "VI", + "county": "Saint Croix" + }, + { + "zip_code": 830, + "latitude": 18.32816, + "longitude": -64.740737, + "city": "St John", + "state": "VI", + "county": "Saint John" + }, + { + "zip_code": 831, + "latitude": 18.32816, + "longitude": -64.740737, + "city": "St John", + "state": "VI", + "county": "Saint John" + }, + { + "zip_code": 840, + "latitude": 17.734211, + "longitude": -64.734694, + "city": "Frederiksted", + "state": "VI", + "county": "Saint Croix" + }, + { + "zip_code": 841, + "latitude": 17.734211, + "longitude": -64.734694, + "city": "Frederiksted", + "state": "VI", + "county": "Saint Croix" + }, + { + "zip_code": 850, + "latitude": 17.734211, + "longitude": -64.734694, + "city": "Kingshill", + "state": "VI", + "county": "Saint Croix" + }, + { + "zip_code": 851, + "latitude": 17.734211, + "longitude": -64.734694, + "city": "Kingshill", + "state": "VI", + "county": "Saint Croix" + }, + { + "zip_code": 901, + "latitude": 18.465901, + "longitude": -66.103568, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 902, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 906, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 907, + "latitude": 18.451647, + "longitude": -66.077003, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 908, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 909, + "latitude": 18.443384, + "longitude": -66.068133, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 910, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 911, + "latitude": 18.450828, + "longitude": -66.057859, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 912, + "latitude": 18.444187, + "longitude": -66.059859, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 913, + "latitude": 18.450735, + "longitude": -66.043352, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 914, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 915, + "latitude": 18.437896, + "longitude": -66.048087, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 916, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 917, + "latitude": 18.422018, + "longitude": -66.050602, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 918, + "latitude": 18.419069, + "longitude": -66.062319, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 919, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 920, + "latitude": 18.406808, + "longitude": -66.091885, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 921, + "latitude": 18.390429, + "longitude": -66.066124, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 922, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 923, + "latitude": 18.410775, + "longitude": -66.036708, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 924, + "latitude": 18.396392, + "longitude": -66.01146, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 925, + "latitude": 18.401055, + "longitude": -66.049773, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 926, + "latitude": 18.369376, + "longitude": -66.062804, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 927, + "latitude": 18.385174, + "longitude": -66.071959, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 928, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 929, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 930, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 931, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 933, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 934, + "latitude": 18.34487, + "longitude": -66.166014, + "city": "Fort Buchanan", + "state": "PR", + "county": "Bayamon" + }, + { + "zip_code": 935, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 936, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 937, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 938, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 939, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 940, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 949, + "latitude": 18.431911, + "longitude": -66.199692, + "city": "Toa Baja", + "state": "PR", + "county": "Toa Baja" + }, + { + "zip_code": 950, + "latitude": 18.457761, + "longitude": -66.196503, + "city": "Toa Baja", + "state": "PR", + "county": "Toa Baja" + }, + { + "zip_code": 951, + "latitude": 18.457761, + "longitude": -66.196503, + "city": "Toa Baja", + "state": "PR", + "county": "Toa Baja" + }, + { + "zip_code": 952, + "latitude": 18.457761, + "longitude": -66.196503, + "city": "Sabana Seca", + "state": "PR", + "county": "Toa Baja" + }, + { + "zip_code": 953, + "latitude": 18.356795, + "longitude": -66.25701, + "city": "Toa Alta", + "state": "PR", + "county": "Toa Alta" + }, + { + "zip_code": 954, + "latitude": 18.358939, + "longitude": -66.258108, + "city": "Toa Alta", + "state": "PR", + "county": "Toa Alta" + }, + { + "zip_code": 955, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 956, + "latitude": 18.326702, + "longitude": -66.174176, + "city": "Bayamon", + "state": "PR", + "county": "Bayamon" + }, + { + "zip_code": 957, + "latitude": 18.366645, + "longitude": -66.183907, + "city": "Bayamon", + "state": "PR", + "county": "Bayamon" + }, + { + "zip_code": 958, + "latitude": 18.34487, + "longitude": -66.166014, + "city": "Bayamon", + "state": "PR", + "county": "Bayamon" + }, + { + "zip_code": 959, + "latitude": 18.387058, + "longitude": -66.159044, + "city": "Bayamon", + "state": "PR", + "county": "Bayamon" + }, + { + "zip_code": 960, + "latitude": 18.34487, + "longitude": -66.166014, + "city": "Bayamon", + "state": "PR", + "county": "Bayamon" + }, + { + "zip_code": 961, + "latitude": 18.413195, + "longitude": -66.168651, + "city": "Bayamon", + "state": "PR", + "county": "Bayamon" + }, + { + "zip_code": 962, + "latitude": 18.437644, + "longitude": -66.140407, + "city": "Catano", + "state": "PR", + "county": "Catano" + }, + { + "zip_code": 963, + "latitude": 18.443217, + "longitude": -66.139293, + "city": "Catano", + "state": "PR", + "county": "Catano" + }, + { + "zip_code": 965, + "latitude": 18.428784, + "longitude": -66.11539, + "city": "Guaynabo", + "state": "PR", + "county": "Guaynabo" + }, + { + "zip_code": 966, + "latitude": 18.396815, + "longitude": -66.114889, + "city": "Guaynabo", + "state": "PR", + "county": "Guaynabo" + }, + { + "zip_code": 968, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "Guaynabo", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 969, + "latitude": 18.362322, + "longitude": -66.113729, + "city": "Guaynabo", + "state": "PR", + "county": "Guaynabo" + }, + { + "zip_code": 970, + "latitude": 18.359143, + "longitude": -66.112295, + "city": "Guaynabo", + "state": "PR", + "county": "Guaynabo" + }, + { + "zip_code": 971, + "latitude": 18.30942, + "longitude": -66.113606, + "city": "Guaynabo", + "state": "PR", + "county": "Guaynabo" + }, + { + "zip_code": 975, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "San Juan", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 976, + "latitude": 18.338133, + "longitude": -65.989229, + "city": "Trujillo Alto", + "state": "PR", + "county": "Trujillo Alto" + }, + { + "zip_code": 977, + "latitude": 18.337004, + "longitude": -65.990099, + "city": "Trujillo Alto", + "state": "PR", + "county": "Trujillo Alto" + }, + { + "zip_code": 978, + "latitude": 18.337004, + "longitude": -65.990099, + "city": "Saint Just Contract", + "state": "PR", + "county": "Trujillo Alto" + }, + { + "zip_code": 979, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "Carolina", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 981, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "Carolina", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 982, + "latitude": 18.410462, + "longitude": -66.060533, + "city": "Carolina", + "state": "PR", + "county": "San Juan" + }, + { + "zip_code": 983, + "latitude": 18.413452, + "longitude": -65.977659, + "city": "Carolina", + "state": "PR", + "county": "Carolina" + }, + { + "zip_code": 984, + "latitude": 18.393355, + "longitude": -65.972495, + "city": "Carolina", + "state": "PR", + "county": "Carolina" + }, + { + "zip_code": 985, + "latitude": 18.345741, + "longitude": -65.93888, + "city": "Carolina", + "state": "PR", + "county": "Carolina" + }, + { + "zip_code": 986, + "latitude": 18.393355, + "longitude": -65.972495, + "city": "Carolina", + "state": "PR", + "county": "Carolina" + }, + { + "zip_code": 987, + "latitude": 18.373466, + "longitude": -65.959932, + "city": "Carolina", + "state": "PR", + "county": "Carolina" + }, + { + "zip_code": 988, + "latitude": 18.393355, + "longitude": -65.972495, + "city": "Carolina", + "state": "PR", + "county": "Carolina" + }, + { + "zip_code": 1001, + "latitude": 42.140549, + "longitude": -72.788661, + "city": "Agawam", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1002, + "latitude": 42.367092, + "longitude": -72.464571, + "city": "Amherst", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1003, + "latitude": 42.369562, + "longitude": -72.63599, + "city": "Amherst", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1004, + "latitude": 42.384494, + "longitude": -72.513183, + "city": "Amherst", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1005, + "latitude": 42.32916, + "longitude": -72.139465, + "city": "Barre", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1007, + "latitude": 42.280267, + "longitude": -72.402056, + "city": "Belchertown", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1008, + "latitude": 42.177833, + "longitude": -72.958359, + "city": "Blandford", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1009, + "latitude": 42.206092, + "longitude": -72.340486, + "city": "Bondsville", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1010, + "latitude": 42.108585, + "longitude": -72.20448, + "city": "Brimfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1011, + "latitude": 42.294259, + "longitude": -72.952776, + "city": "Chester", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1012, + "latitude": 42.392274, + "longitude": -72.825607, + "city": "Chesterfield", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1013, + "latitude": 42.161492, + "longitude": -72.667341, + "city": "Chicopee", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1014, + "latitude": 42.170731, + "longitude": -72.604842, + "city": "Chicopee", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1020, + "latitude": 42.177492, + "longitude": -72.562563, + "city": "Chicopee", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1021, + "latitude": 42.170731, + "longitude": -72.604842, + "city": "Chicopee", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1022, + "latitude": 42.193392, + "longitude": -72.55436, + "city": "Chicopee", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1026, + "latitude": 42.428617, + "longitude": -72.909841, + "city": "Cummington", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1027, + "latitude": 42.368303, + "longitude": -72.768839, + "city": "Easthampton", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1028, + "latitude": 42.062009, + "longitude": -72.49874, + "city": "East Longmeadow", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1029, + "latitude": 42.190904, + "longitude": -73.051661, + "city": "East Otis", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1030, + "latitude": 42.189335, + "longitude": -72.79774, + "city": "Feeding Hills", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1031, + "latitude": 42.352554, + "longitude": -72.205724, + "city": "Gilbertville", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1032, + "latitude": 42.443837, + "longitude": -72.819446, + "city": "Goshen", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1033, + "latitude": 42.262285, + "longitude": -72.504086, + "city": "Granby", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1034, + "latitude": 42.112748, + "longitude": -72.952003, + "city": "Granville", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1035, + "latitude": 42.356804, + "longitude": -72.576613, + "city": "Hadley", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1036, + "latitude": 42.067614, + "longitude": -72.417507, + "city": "Hampden", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1037, + "latitude": 42.347856, + "longitude": -72.225251, + "city": "Hardwick", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1038, + "latitude": 42.387269, + "longitude": -72.643081, + "city": "Hatfield", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1039, + "latitude": 42.35641, + "longitude": -72.682127, + "city": "Haydenville", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1040, + "latitude": 42.198291, + "longitude": -72.64207, + "city": "Holyoke", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1041, + "latitude": 42.170731, + "longitude": -72.604842, + "city": "Holyoke", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1050, + "latitude": 42.313427, + "longitude": -72.903677, + "city": "Huntington", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1053, + "latitude": 42.353838, + "longitude": -72.704385, + "city": "Leeds", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1054, + "latitude": 42.474681, + "longitude": -72.467543, + "city": "Leverett", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1056, + "latitude": 42.173276, + "longitude": -72.627038, + "city": "Ludlow", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1057, + "latitude": 42.095323, + "longitude": -72.282063, + "city": "Monson", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1059, + "latitude": 42.369562, + "longitude": -72.63599, + "city": "North Amherst", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1060, + "latitude": 42.415154, + "longitude": -72.76927, + "city": "Northampton", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1061, + "latitude": 42.369562, + "longitude": -72.63599, + "city": "Northampton", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1062, + "latitude": 42.328838, + "longitude": -72.845227, + "city": "Florence", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1063, + "latitude": 42.317939, + "longitude": -72.640234, + "city": "Northampton", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1066, + "latitude": 42.406697, + "longitude": -72.633901, + "city": "North Hatfield", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1068, + "latitude": 42.346144, + "longitude": -72.058847, + "city": "Oakham", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1069, + "latitude": 42.176131, + "longitude": -72.31457, + "city": "Palmer", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1070, + "latitude": 42.448984, + "longitude": -72.958397, + "city": "Plainfield", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1071, + "latitude": 42.177432, + "longitude": -72.864558, + "city": "Russell", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1072, + "latitude": 42.471562, + "longitude": -72.44017, + "city": "Shutesbury", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1073, + "latitude": 42.230008, + "longitude": -72.728463, + "city": "Southampton", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1074, + "latitude": 42.375998, + "longitude": -72.149388, + "city": "South Barre", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1075, + "latitude": 42.24984, + "longitude": -72.58152, + "city": "South Hadley", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1077, + "latitude": 42.066644, + "longitude": -72.541205, + "city": "Southwick", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1079, + "latitude": 42.192892, + "longitude": -72.329574, + "city": "Thorndike", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1080, + "latitude": 42.179805, + "longitude": -72.517813, + "city": "Three Rivers", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1081, + "latitude": 42.061948, + "longitude": -72.213598, + "city": "Wales", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1082, + "latitude": 42.377471, + "longitude": -72.548549, + "city": "Ware", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1083, + "latitude": 42.204027, + "longitude": -72.199439, + "city": "Warren", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1084, + "latitude": 42.390303, + "longitude": -72.870857, + "city": "West Chesterfield", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1085, + "latitude": 42.14869, + "longitude": -72.501887, + "city": "Westfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1086, + "latitude": 42.173428, + "longitude": -72.847964, + "city": "Westfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1088, + "latitude": 42.390583, + "longitude": -72.646894, + "city": "West Hatfield", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1089, + "latitude": 42.125793, + "longitude": -72.645334, + "city": "West Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1090, + "latitude": 42.170731, + "longitude": -72.604842, + "city": "West Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1092, + "latitude": 42.202887, + "longitude": -72.229025, + "city": "West Warren", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1093, + "latitude": 42.442673, + "longitude": -72.652511, + "city": "Whately", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1094, + "latitude": 42.358201, + "longitude": -72.140846, + "city": "Wheelwright", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1095, + "latitude": 42.125974, + "longitude": -72.489988, + "city": "Wilbraham", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1096, + "latitude": 42.413069, + "longitude": -72.821653, + "city": "Williamsburg", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1097, + "latitude": 42.161743, + "longitude": -72.845912, + "city": "Woronoco", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1098, + "latitude": 42.40494, + "longitude": -72.896133, + "city": "Worthington", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1101, + "latitude": 42.170731, + "longitude": -72.604842, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1102, + "latitude": 42.170731, + "longitude": -72.604842, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1103, + "latitude": 42.103044, + "longitude": -72.590783, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1104, + "latitude": 42.128605, + "longitude": -72.567966, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1105, + "latitude": 42.099793, + "longitude": -72.577732, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1106, + "latitude": 42.049194, + "longitude": -72.567882, + "city": "Longmeadow", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1107, + "latitude": 42.126237, + "longitude": -72.586733, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1108, + "latitude": 42.080594, + "longitude": -72.558081, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1109, + "latitude": 42.119293, + "longitude": -72.548981, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1111, + "latitude": 42.170731, + "longitude": -72.604842, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1114, + "latitude": 42.170731, + "longitude": -72.604842, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1115, + "latitude": 42.102894, + "longitude": -72.591633, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1116, + "latitude": 42.170731, + "longitude": -72.604842, + "city": "Longmeadow", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1118, + "latitude": 42.093894, + "longitude": -72.523227, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1119, + "latitude": 42.124943, + "longitude": -72.526705, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1128, + "latitude": 42.094616, + "longitude": -72.487229, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1129, + "latitude": 42.124485, + "longitude": -72.489479, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1133, + "latitude": 42.170731, + "longitude": -72.604842, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1138, + "latitude": 42.170731, + "longitude": -72.604842, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1139, + "latitude": 42.170731, + "longitude": -72.604842, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1144, + "latitude": 42.101796, + "longitude": -72.59151, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1151, + "latitude": 42.150593, + "longitude": -72.51278, + "city": "Indian Orchard", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1152, + "latitude": 42.170731, + "longitude": -72.604842, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1199, + "latitude": 42.119943, + "longitude": -72.604983, + "city": "Springfield", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1201, + "latitude": 42.479475, + "longitude": -73.24807, + "city": "Pittsfield", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1202, + "latitude": 42.3929, + "longitude": -73.228483, + "city": "Pittsfield", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1203, + "latitude": 42.3929, + "longitude": -73.228483, + "city": "Pittsfield", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1220, + "latitude": 42.385595, + "longitude": -73.172166, + "city": "Adams", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1222, + "latitude": 42.185969, + "longitude": -73.318695, + "city": "Ashley Falls", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1223, + "latitude": 42.3418, + "longitude": -73.103468, + "city": "Becket", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1224, + "latitude": 42.3929, + "longitude": -73.228483, + "city": "Berkshire", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1225, + "latitude": 42.482125, + "longitude": -73.127483, + "city": "Cheshire", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1226, + "latitude": 42.470296, + "longitude": -73.08895, + "city": "Dalton", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1227, + "latitude": 42.516145, + "longitude": -73.092852, + "city": "Dalton", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1229, + "latitude": 42.279292, + "longitude": -73.343545, + "city": "Glendale", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1230, + "latitude": 42.299392, + "longitude": -73.26665, + "city": "Great Barrington", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1235, + "latitude": 42.29237, + "longitude": -73.22164, + "city": "Hinsdale", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1236, + "latitude": 42.291299, + "longitude": -73.358798, + "city": "Housatonic", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1237, + "latitude": 42.487569, + "longitude": -73.235048, + "city": "Lanesboro", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1238, + "latitude": 42.369856, + "longitude": -73.267465, + "city": "Lee", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1240, + "latitude": 42.459202, + "longitude": -73.219858, + "city": "Lenox", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1242, + "latitude": 42.338594, + "longitude": -73.250891, + "city": "Lenox Dale", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1243, + "latitude": 42.356088, + "longitude": -73.010448, + "city": "Middlefield", + "state": "MA", + "county": "Hampshire" + }, + { + "zip_code": 1244, + "latitude": 42.122827, + "longitude": -73.253983, + "city": "Mill River", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1245, + "latitude": 42.18669, + "longitude": -73.206498, + "city": "Monterey", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1247, + "latitude": 42.426974, + "longitude": -73.18632, + "city": "North Adams", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1252, + "latitude": 42.198648, + "longitude": -73.446234, + "city": "North Egremont", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1253, + "latitude": 42.213156, + "longitude": -73.090434, + "city": "Otis", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1254, + "latitude": 42.233105, + "longitude": -73.238358, + "city": "Richmond", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1255, + "latitude": 42.148975, + "longitude": -73.14861, + "city": "Sandisfield", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1256, + "latitude": 42.367341, + "longitude": -73.128528, + "city": "Savoy", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1257, + "latitude": 42.314564, + "longitude": -73.267694, + "city": "Sheffield", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1258, + "latitude": 42.128075, + "longitude": -73.36089, + "city": "South Egremont", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1259, + "latitude": 42.198712, + "longitude": -73.278543, + "city": "Southfield", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1260, + "latitude": 42.286586, + "longitude": -73.313274, + "city": "South Lee", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1262, + "latitude": 42.304604, + "longitude": -73.330001, + "city": "Stockbridge", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1263, + "latitude": 42.3929, + "longitude": -73.228483, + "city": "Stockbridge", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1264, + "latitude": 42.220001, + "longitude": -73.197865, + "city": "Tyringham", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1266, + "latitude": 42.360482, + "longitude": -73.265354, + "city": "West Stockbridge", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1267, + "latitude": 42.642075, + "longitude": -73.257699, + "city": "Williamstown", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1270, + "latitude": 42.443726, + "longitude": -73.116127, + "city": "Windsor", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1301, + "latitude": 42.601335, + "longitude": -72.623619, + "city": "Greenfield", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1302, + "latitude": 42.522178, + "longitude": -72.624164, + "city": "Greenfield", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1330, + "latitude": 42.562391, + "longitude": -72.738152, + "city": "Ashfield", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1331, + "latitude": 42.547302, + "longitude": -72.183903, + "city": "Athol", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1337, + "latitude": 42.62706, + "longitude": -72.642888, + "city": "Bernardston", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1338, + "latitude": 42.573832, + "longitude": -72.769487, + "city": "Buckland", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1339, + "latitude": 42.594252, + "longitude": -72.665507, + "city": "Charlemont", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1340, + "latitude": 42.681539, + "longitude": -72.822986, + "city": "Colrain", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1341, + "latitude": 42.590824, + "longitude": -72.70976, + "city": "Conway", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1342, + "latitude": 42.54723, + "longitude": -72.607679, + "city": "Deerfield", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1343, + "latitude": 42.642666, + "longitude": -72.986231, + "city": "Drury", + "state": "MA", + "county": "Berkshire" + }, + { + "zip_code": 1344, + "latitude": 42.627072, + "longitude": -72.553654, + "city": "Erving", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1346, + "latitude": 42.618011, + "longitude": -72.788896, + "city": "Heath", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1347, + "latitude": 42.556558, + "longitude": -72.518104, + "city": "Lake Pleasant", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1349, + "latitude": 42.621412, + "longitude": -72.705633, + "city": "Turners Falls", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1350, + "latitude": 42.721456, + "longitude": -72.976204, + "city": "Monroe Bridge", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1351, + "latitude": 42.548107, + "longitude": -72.48693, + "city": "Montague", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1354, + "latitude": 42.522178, + "longitude": -72.624164, + "city": "Northfield", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1355, + "latitude": 42.518718, + "longitude": -72.534371, + "city": "New Salem", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1360, + "latitude": 42.614152, + "longitude": -72.528209, + "city": "Northfield", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1364, + "latitude": 42.578325, + "longitude": -72.556589, + "city": "Orange", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1366, + "latitude": 42.459632, + "longitude": -72.182962, + "city": "Petersham", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1367, + "latitude": 42.683065, + "longitude": -72.715667, + "city": "Rowe", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1368, + "latitude": 42.672182, + "longitude": -72.196376, + "city": "Royalston", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1369, + "latitude": 42.522178, + "longitude": -72.624164, + "city": "Shattuckville", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1370, + "latitude": 42.588812, + "longitude": -72.758781, + "city": "Shelburne Falls", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1373, + "latitude": 42.464522, + "longitude": -72.682346, + "city": "South Deerfield", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1375, + "latitude": 42.565346, + "longitude": -72.70094, + "city": "Sunderland", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1376, + "latitude": 42.654878, + "longitude": -72.718123, + "city": "Turners Falls", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1378, + "latitude": 42.667059, + "longitude": -72.339655, + "city": "Warwick", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1379, + "latitude": 42.581007, + "longitude": -72.437179, + "city": "Wendell", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1380, + "latitude": 42.553431, + "longitude": -72.392694, + "city": "Wendell Depot", + "state": "MA", + "county": "Franklin" + }, + { + "zip_code": 1420, + "latitude": 42.583689, + "longitude": -71.816767, + "city": "Fitchburg", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1430, + "latitude": 42.654906, + "longitude": -71.920942, + "city": "Ashburnham", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1431, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Ashby", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1432, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Ayer", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1436, + "latitude": 42.601427, + "longitude": -72.083838, + "city": "Baldwinville", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1438, + "latitude": 42.551681, + "longitude": -72.029434, + "city": "East Templeton", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1440, + "latitude": 42.582529, + "longitude": -72.025884, + "city": "Gardner", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1441, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "Westminster", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1450, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Groton", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1451, + "latitude": 42.500187, + "longitude": -71.575864, + "city": "Harvard", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1452, + "latitude": 42.483895, + "longitude": -72.011516, + "city": "Hubbardston", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1453, + "latitude": 42.471316, + "longitude": -71.837509, + "city": "Leominster", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1460, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Littleton", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1462, + "latitude": 42.583322, + "longitude": -71.752266, + "city": "Lunenburg", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1463, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Pepperell", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1464, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Shirley", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1467, + "latitude": 42.487056, + "longitude": -71.613078, + "city": "Still River", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1468, + "latitude": 42.555059, + "longitude": -72.072285, + "city": "Templeton", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1469, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Townsend", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1470, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Groton", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1471, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Groton", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1472, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "West Groton", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1473, + "latitude": 42.549489, + "longitude": -71.913219, + "city": "Westminster", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1474, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "West Townsend", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1475, + "latitude": 42.661612, + "longitude": -72.047876, + "city": "Winchendon", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1477, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "Winchendon Springs", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1501, + "latitude": 42.184835, + "longitude": -71.947184, + "city": "Auburn", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1503, + "latitude": 42.3129, + "longitude": -71.841656, + "city": "Berlin", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1504, + "latitude": 42.114078, + "longitude": -71.799785, + "city": "Blackstone", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1505, + "latitude": 42.300037, + "longitude": -71.943458, + "city": "Boylston", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1506, + "latitude": 42.19169, + "longitude": -72.105011, + "city": "Brookfield", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1507, + "latitude": 42.13277, + "longitude": -71.972627, + "city": "Charlton", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1508, + "latitude": 42.109748, + "longitude": -72.079455, + "city": "Charlton City", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1509, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "Charlton Depot", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1510, + "latitude": 42.413972, + "longitude": -71.687523, + "city": "Clinton", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1515, + "latitude": 42.205311, + "longitude": -72.049907, + "city": "East Brookfield", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1516, + "latitude": 42.113076, + "longitude": -71.891139, + "city": "Douglas", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1517, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "East Princeton", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1518, + "latitude": 42.106405, + "longitude": -72.114045, + "city": "Fiskdale", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1519, + "latitude": 42.203944, + "longitude": -71.682862, + "city": "Grafton", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1520, + "latitude": 42.336791, + "longitude": -71.845316, + "city": "Holden", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1521, + "latitude": 42.061063, + "longitude": -72.163991, + "city": "Holland", + "state": "MA", + "county": "Hampden" + }, + { + "zip_code": 1522, + "latitude": 42.264629, + "longitude": -71.795442, + "city": "Jefferson", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1523, + "latitude": 42.427188, + "longitude": -71.91177, + "city": "Lancaster", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1524, + "latitude": 42.238192, + "longitude": -72.012379, + "city": "Leicester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1525, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "Linwood", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1526, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "Manchaug", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1527, + "latitude": 42.255642, + "longitude": -71.819961, + "city": "Millbury", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1529, + "latitude": 42.124662, + "longitude": -71.846943, + "city": "Millville", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1531, + "latitude": 42.320938, + "longitude": -72.128644, + "city": "New Braintree", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1532, + "latitude": 42.322118, + "longitude": -71.64282, + "city": "Northborough", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1534, + "latitude": 42.207191, + "longitude": -71.856807, + "city": "Northbridge", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1535, + "latitude": 42.275382, + "longitude": -72.089338, + "city": "North Brookfield", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1536, + "latitude": 42.407556, + "longitude": -71.860402, + "city": "North Grafton", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1537, + "latitude": 42.166241, + "longitude": -71.891052, + "city": "North Oxford", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1538, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "North Uxbridge", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1540, + "latitude": 42.109223, + "longitude": -71.855444, + "city": "Oxford", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1541, + "latitude": 42.451926, + "longitude": -71.880057, + "city": "Princeton", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1542, + "latitude": 42.220085, + "longitude": -71.914361, + "city": "Rochdale", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1543, + "latitude": 42.383516, + "longitude": -71.95463, + "city": "Rutland", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1545, + "latitude": 42.286992, + "longitude": -71.715313, + "city": "Shrewsbury", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1546, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "Shrewsbury", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1550, + "latitude": 42.129251, + "longitude": -72.031155, + "city": "Southbridge", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1560, + "latitude": 42.176544, + "longitude": -71.681912, + "city": "South Grafton", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1561, + "latitude": 42.443539, + "longitude": -71.686137, + "city": "South Lancaster", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1562, + "latitude": 42.254837, + "longitude": -72.065612, + "city": "Spencer", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1564, + "latitude": 42.366765, + "longitude": -71.939375, + "city": "Sterling", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1566, + "latitude": 42.10273, + "longitude": -72.080996, + "city": "Sturbridge", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1568, + "latitude": 42.175591, + "longitude": -71.603197, + "city": "Upton", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1569, + "latitude": 42.059736, + "longitude": -71.638438, + "city": "Uxbridge", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1570, + "latitude": 42.1351, + "longitude": -71.994169, + "city": "Webster", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1571, + "latitude": 42.059189, + "longitude": -71.937037, + "city": "Dudley", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1580, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "Westborough", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1581, + "latitude": 42.255222, + "longitude": -71.845865, + "city": "Westborough", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1582, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "Westborough", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1583, + "latitude": 42.362783, + "longitude": -71.781215, + "city": "West Boylston", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1585, + "latitude": 42.235638, + "longitude": -72.172523, + "city": "West Brookfield", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1586, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "West Millbury", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1588, + "latitude": 42.166554, + "longitude": -71.899484, + "city": "Whitinsville", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1590, + "latitude": 42.126575, + "longitude": -71.755193, + "city": "Sutton", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1601, + "latitude": 42.265275, + "longitude": -71.879415, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1602, + "latitude": 42.274595, + "longitude": -71.846966, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1603, + "latitude": 42.245442, + "longitude": -71.839257, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1604, + "latitude": 42.247955, + "longitude": -71.76678, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1605, + "latitude": 42.288792, + "longitude": -71.796128, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1606, + "latitude": 42.311834, + "longitude": -71.794465, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1607, + "latitude": 42.226452, + "longitude": -71.792506, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1608, + "latitude": 42.293501, + "longitude": -71.925696, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1609, + "latitude": 42.282565, + "longitude": -71.827685, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1610, + "latitude": 42.246483, + "longitude": -71.808915, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1611, + "latitude": 42.239392, + "longitude": -71.878716, + "city": "Cherry Valley", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1612, + "latitude": 42.304675, + "longitude": -71.892875, + "city": "Paxton", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1613, + "latitude": 42.293316, + "longitude": -71.801971, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1614, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1615, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1653, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1654, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1655, + "latitude": 42.364807, + "longitude": -71.896868, + "city": "Worcester", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1701, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Framingham", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1702, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Framingham", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1703, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Framingham", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1704, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Framingham", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1705, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Framingham", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1718, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Village Of Nagog Woods", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1719, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Boxborough", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1720, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Acton", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1721, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Ashland", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1730, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Bedford", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1731, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Hanscom Afb", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1740, + "latitude": 42.436043, + "longitude": -71.605916, + "city": "Bolton", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1741, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Carlisle", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1742, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Concord", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1745, + "latitude": 42.293442, + "longitude": -71.502762, + "city": "Fayville", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1746, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Holliston", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1747, + "latitude": 42.127515, + "longitude": -71.533138, + "city": "Hopedale", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1748, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Hopkinton", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1749, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Hudson", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1752, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Marlborough", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1754, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Maynard", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1756, + "latitude": 42.100352, + "longitude": -71.546961, + "city": "Mendon", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1757, + "latitude": 42.147087, + "longitude": -71.528085, + "city": "Milford", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1760, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Natick", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1770, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Sherborn", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1772, + "latitude": 42.296842, + "longitude": -71.533229, + "city": "Southborough", + "state": "MA", + "county": "Worcester" + }, + { + "zip_code": 1773, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Lincoln", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1775, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Stow", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1776, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Sudbury", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1778, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Wayland", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1784, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Woodville", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1801, + "latitude": 42.488595, + "longitude": -71.157271, + "city": "Woburn", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1803, + "latitude": 42.504844, + "longitude": -71.201539, + "city": "Burlington", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1805, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Burlington", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1806, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Woburn", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1807, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Woburn", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1808, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Woburn", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1810, + "latitude": 42.647991, + "longitude": -71.165685, + "city": "Andover", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1812, + "latitude": 42.647191, + "longitude": -71.184202, + "city": "Andover", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1813, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Woburn", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1815, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Woburn", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1821, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Billerica", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1822, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Billerica", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1824, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Chelmsford", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1826, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Dracut", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1827, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Dunstable", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1830, + "latitude": 42.792639, + "longitude": -71.072501, + "city": "Haverhill", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1831, + "latitude": 42.771095, + "longitude": -71.122054, + "city": "Haverhill", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1832, + "latitude": 42.789627, + "longitude": -71.126562, + "city": "Haverhill", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1833, + "latitude": 42.72377, + "longitude": -70.981298, + "city": "Georgetown", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1834, + "latitude": 42.751074, + "longitude": -71.021437, + "city": "Groveland", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1835, + "latitude": 42.752844, + "longitude": -71.084301, + "city": "Haverhill", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1840, + "latitude": 42.70734, + "longitude": -71.161052, + "city": "Lawrence", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1841, + "latitude": 42.70979, + "longitude": -71.164402, + "city": "Lawrence", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1842, + "latitude": 42.635443, + "longitude": -70.879123, + "city": "Lawrence", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1843, + "latitude": 42.71037, + "longitude": -71.088303, + "city": "Lawrence", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1844, + "latitude": 42.73184, + "longitude": -71.186915, + "city": "Methuen", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1845, + "latitude": 42.672835, + "longitude": -71.087689, + "city": "North Andover", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1850, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Lowell", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1851, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Lowell", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1852, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Lowell", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1853, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Lowell", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1854, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Lowell", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1860, + "latitude": 42.802441, + "longitude": -71.0896, + "city": "Merrimac", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1862, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "North Billerica", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1863, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "North Chelmsford", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1864, + "latitude": 42.581332, + "longitude": -71.083725, + "city": "North Reading", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1865, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Nutting Lake", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1866, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Pinehurst", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1867, + "latitude": 42.537065, + "longitude": -71.107172, + "city": "Reading", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1876, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Tewksbury", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1879, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Tyngsboro", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1880, + "latitude": 42.499891, + "longitude": -71.068829, + "city": "Wakefield", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1885, + "latitude": 42.635443, + "longitude": -70.879123, + "city": "West Boxford", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1886, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Westford", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1887, + "latitude": 42.561782, + "longitude": -71.173888, + "city": "Wilmington", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1888, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Woburn", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1889, + "latitude": 42.571633, + "longitude": -71.109646, + "city": "North Reading", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1890, + "latitude": 42.454545, + "longitude": -71.148779, + "city": "Winchester", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 1899, + "latitude": 42.635443, + "longitude": -70.879123, + "city": "Andover", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1901, + "latitude": 42.461246, + "longitude": -70.946743, + "city": "Lynn", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1902, + "latitude": 42.473195, + "longitude": -70.928593, + "city": "Lynn", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1903, + "latitude": 42.635443, + "longitude": -70.879123, + "city": "Lynn", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1904, + "latitude": 42.488896, + "longitude": -70.964694, + "city": "Lynn", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1905, + "latitude": 42.469395, + "longitude": -70.972844, + "city": "Lynn", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1906, + "latitude": 42.472112, + "longitude": -70.997794, + "city": "Saugus", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1907, + "latitude": 42.513295, + "longitude": -70.905893, + "city": "Swampscott", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1908, + "latitude": 42.427296, + "longitude": -70.922442, + "city": "Nahant", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1910, + "latitude": 42.454796, + "longitude": -70.974694, + "city": "Lynn", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1913, + "latitude": 42.853539, + "longitude": -70.948211, + "city": "Amesbury", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1915, + "latitude": 42.565145, + "longitude": -70.853843, + "city": "Beverly", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1921, + "latitude": 42.683256, + "longitude": -71.017403, + "city": "Boxford", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1922, + "latitude": 42.763216, + "longitude": -70.92812, + "city": "Byfield", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1923, + "latitude": 42.577188, + "longitude": -70.949245, + "city": "Danvers", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1929, + "latitude": 42.62781, + "longitude": -70.780576, + "city": "Essex", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1930, + "latitude": 42.630011, + "longitude": -70.694179, + "city": "Gloucester", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1931, + "latitude": 42.635443, + "longitude": -70.879123, + "city": "Gloucester", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1936, + "latitude": 42.635443, + "longitude": -70.879123, + "city": "Hamilton", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1937, + "latitude": 42.635443, + "longitude": -70.879123, + "city": "Hathorne", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1938, + "latitude": 42.68571, + "longitude": -70.864132, + "city": "Ipswich", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1940, + "latitude": 42.533732, + "longitude": -71.028775, + "city": "Lynnfield", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1944, + "latitude": 42.579503, + "longitude": -70.755062, + "city": "Manchester", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1945, + "latitude": 42.56142, + "longitude": -70.770768, + "city": "Marblehead", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1949, + "latitude": 42.644942, + "longitude": -71.087905, + "city": "Middleton", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1950, + "latitude": 42.80965, + "longitude": -70.873196, + "city": "Newburyport", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1951, + "latitude": 42.777524, + "longitude": -70.867246, + "city": "Newbury", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1952, + "latitude": 42.851234, + "longitude": -70.865667, + "city": "Salisbury", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1960, + "latitude": 42.536996, + "longitude": -70.973646, + "city": "Peabody", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1961, + "latitude": 42.635443, + "longitude": -70.879123, + "city": "Peabody", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1965, + "latitude": 42.558113, + "longitude": -70.825743, + "city": "Prides Crossing", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1966, + "latitude": 42.657866, + "longitude": -70.618057, + "city": "Rockport", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1969, + "latitude": 42.716155, + "longitude": -70.892754, + "city": "Rowley", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1970, + "latitude": 42.512946, + "longitude": -70.904237, + "city": "Salem", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1971, + "latitude": 42.635443, + "longitude": -70.879123, + "city": "Salem", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1982, + "latitude": 42.626664, + "longitude": -70.851125, + "city": "South Hamilton", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1983, + "latitude": 42.661793, + "longitude": -70.954487, + "city": "Topsfield", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1984, + "latitude": 42.597691, + "longitude": -70.8732, + "city": "Wenham", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 1985, + "latitude": 42.79414, + "longitude": -70.971068, + "city": "West Newbury", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 2018, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "Accord", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2019, + "latitude": 42.076501, + "longitude": -71.470464, + "city": "Bellingham", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2020, + "latitude": 42.081825, + "longitude": -70.643868, + "city": "Brant Rock", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2021, + "latitude": 42.179146, + "longitude": -71.121185, + "city": "Canton", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2025, + "latitude": 42.233938, + "longitude": -70.815826, + "city": "Cohasset", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2026, + "latitude": 42.244733, + "longitude": -71.181141, + "city": "Dedham", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2027, + "latitude": 42.180048, + "longitude": -71.08923, + "city": "Dedham", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2030, + "latitude": 42.236114, + "longitude": -71.283072, + "city": "Dover", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2031, + "latitude": 41.998799, + "longitude": -71.200894, + "city": "East Mansfield", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2032, + "latitude": 42.153786, + "longitude": -71.21455, + "city": "East Walpole", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2035, + "latitude": 42.062204, + "longitude": -71.235774, + "city": "Foxboro", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2038, + "latitude": 42.08868, + "longitude": -71.404814, + "city": "Franklin", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2040, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "Greenbush", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2041, + "latitude": 42.069642, + "longitude": -70.649075, + "city": "Green Harbor", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2043, + "latitude": 42.212105, + "longitude": -70.884989, + "city": "Hingham", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2044, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "Hingham", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2045, + "latitude": 42.284413, + "longitude": -70.873659, + "city": "Hull", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2047, + "latitude": 42.142836, + "longitude": -70.69353, + "city": "Humarock", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2048, + "latitude": 42.013182, + "longitude": -71.218373, + "city": "Mansfield", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2050, + "latitude": 42.111805, + "longitude": -70.710744, + "city": "Marshfield", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2051, + "latitude": 42.151202, + "longitude": -70.734146, + "city": "Marshfield Hills", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2052, + "latitude": 42.181265, + "longitude": -71.309934, + "city": "Medfield", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2053, + "latitude": 42.156282, + "longitude": -71.427663, + "city": "Medway", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2054, + "latitude": 42.165249, + "longitude": -71.36126, + "city": "Millis", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2055, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "Minot", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2056, + "latitude": 42.117511, + "longitude": -71.331793, + "city": "Norfolk", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2059, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "North Marshfield", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2060, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "North Scituate", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2061, + "latitude": 42.154145, + "longitude": -70.823035, + "city": "Norwell", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2062, + "latitude": 42.182798, + "longitude": -71.196277, + "city": "Norwood", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2065, + "latitude": 42.097219, + "longitude": -70.651567, + "city": "Ocean Bluff", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2066, + "latitude": 42.207254, + "longitude": -70.770188, + "city": "Scituate", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2067, + "latitude": 42.105288, + "longitude": -71.184785, + "city": "Sharon", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2070, + "latitude": 42.180048, + "longitude": -71.08923, + "city": "Sheldonville", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2071, + "latitude": 42.100399, + "longitude": -71.270933, + "city": "South Walpole", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2072, + "latitude": 42.118416, + "longitude": -71.105733, + "city": "Stoughton", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2081, + "latitude": 42.148624, + "longitude": -71.255533, + "city": "Walpole", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2090, + "latitude": 42.220548, + "longitude": -71.199238, + "city": "Westwood", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2093, + "latitude": 42.054311, + "longitude": -71.371169, + "city": "Wrentham", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2101, + "latitude": 42.370567, + "longitude": -71.026964, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2102, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2103, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2104, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2105, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2106, + "latitude": 42.354318, + "longitude": -71.073449, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2107, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2108, + "latitude": 42.353806, + "longitude": -71.102446, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2109, + "latitude": 42.360027, + "longitude": -71.054495, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2110, + "latitude": 42.352847, + "longitude": -71.051466, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2111, + "latitude": 42.351047, + "longitude": -71.059365, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2112, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2113, + "latitude": 42.365398, + "longitude": -71.055001, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2114, + "latitude": 42.362097, + "longitude": -71.023661, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2115, + "latitude": 42.342043, + "longitude": -71.096848, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2116, + "latitude": 42.347207, + "longitude": -71.086095, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2117, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2118, + "latitude": 42.336162, + "longitude": -71.072854, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2119, + "latitude": 42.323077, + "longitude": -71.084608, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2120, + "latitude": 42.332484, + "longitude": -71.096416, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2121, + "latitude": 42.307098, + "longitude": -71.081645, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2122, + "latitude": 42.29658, + "longitude": -71.055215, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2123, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2124, + "latitude": 42.286784, + "longitude": -71.071045, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2125, + "latitude": 42.31476, + "longitude": -71.067244, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2126, + "latitude": 42.301247, + "longitude": -71.105195, + "city": "Mattapan", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2127, + "latitude": 42.329023, + "longitude": -71.020343, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2128, + "latitude": 42.364197, + "longitude": -71.025694, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2129, + "latitude": 42.382588, + "longitude": -71.065287, + "city": "Charlestown", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2130, + "latitude": 42.309661, + "longitude": -71.121097, + "city": "Jamaica Plain", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2131, + "latitude": 42.284197, + "longitude": -71.120896, + "city": "Roslindale", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2132, + "latitude": 42.277897, + "longitude": -71.155833, + "city": "West Roxbury", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2133, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2134, + "latitude": 42.357169, + "longitude": -71.112646, + "city": "Allston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2135, + "latitude": 42.349768, + "longitude": -71.104888, + "city": "Brighton", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2136, + "latitude": 42.254248, + "longitude": -71.129321, + "city": "Hyde Park", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2137, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Readville", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2138, + "latitude": 42.380442, + "longitude": -71.132947, + "city": "Cambridge", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2139, + "latitude": 42.365146, + "longitude": -71.101842, + "city": "Cambridge", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2140, + "latitude": 42.393246, + "longitude": -71.133833, + "city": "Cambridge", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2141, + "latitude": 42.368673, + "longitude": -71.083596, + "city": "Cambridge", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2142, + "latitude": 42.36284, + "longitude": -71.084814, + "city": "Cambridge", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2143, + "latitude": 42.38092, + "longitude": -71.098896, + "city": "Somerville", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2144, + "latitude": 42.402696, + "longitude": -71.12022, + "city": "Somerville", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2145, + "latitude": 42.391046, + "longitude": -71.095146, + "city": "Somerville", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2148, + "latitude": 42.436545, + "longitude": -71.085396, + "city": "Malden", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2149, + "latitude": 42.407396, + "longitude": -71.051183, + "city": "Everett", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2150, + "latitude": 42.378197, + "longitude": -71.038894, + "city": "Chelsea", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2151, + "latitude": 42.366303, + "longitude": -71.020494, + "city": "Revere", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2152, + "latitude": 42.378447, + "longitude": -70.981679, + "city": "Winthrop", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2153, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Medford", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2155, + "latitude": 42.422095, + "longitude": -71.109297, + "city": "Medford", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2156, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "West Medford", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2163, + "latitude": 42.32532, + "longitude": -71.112159, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2169, + "latitude": 42.241799, + "longitude": -71.006042, + "city": "Quincy", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2170, + "latitude": 42.267248, + "longitude": -71.016742, + "city": "Quincy", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2171, + "latitude": 42.284898, + "longitude": -71.014243, + "city": "Quincy", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2176, + "latitude": 42.458995, + "longitude": -71.053095, + "city": "Melrose", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2177, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Melrose", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2180, + "latitude": 42.474595, + "longitude": -71.098146, + "city": "Stoneham", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2184, + "latitude": 42.202216, + "longitude": -71.005192, + "city": "Braintree", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2185, + "latitude": 42.180048, + "longitude": -71.08923, + "city": "Braintree", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2186, + "latitude": 42.240598, + "longitude": -71.078494, + "city": "Milton", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2187, + "latitude": 42.180048, + "longitude": -71.08923, + "city": "Milton Village", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2188, + "latitude": 42.20794, + "longitude": -70.95514, + "city": "Weymouth", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2189, + "latitude": 42.210649, + "longitude": -70.932318, + "city": "Weymouth", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2190, + "latitude": 42.167841, + "longitude": -70.95074, + "city": "Weymouth", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2191, + "latitude": 42.251499, + "longitude": -70.94484, + "city": "Weymouth", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2196, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2199, + "latitude": 42.347247, + "longitude": -71.082395, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2201, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2202, + "latitude": 42.361094, + "longitude": -71.061814, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2203, + "latitude": 42.361485, + "longitude": -71.060364, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2204, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2205, + "latitude": 42.350334, + "longitude": -71.053877, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2206, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2207, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2208, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2209, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2210, + "latitude": 42.347547, + "longitude": -71.040645, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2211, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2212, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Boston", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2215, + "latitude": 42.345079, + "longitude": -71.107653, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2216, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2217, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2222, + "latitude": 42.364381, + "longitude": -71.063314, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2228, + "latitude": "", + "longitude": "", + "city": "East Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2238, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Cambridge", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2239, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Cambridge", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2241, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2266, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2269, + "latitude": 42.180048, + "longitude": -71.08923, + "city": "Quincy", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2283, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2284, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2293, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2295, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2297, + "latitude": 42.338947, + "longitude": -70.919635, + "city": "Boston", + "state": "MA", + "county": "Suffolk" + }, + { + "zip_code": 2301, + "latitude": 42.079399, + "longitude": -71.03999, + "city": "Brockton", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2302, + "latitude": 42.08475, + "longitude": -71.000189, + "city": "Brockton", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2303, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "Brockton", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2304, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "Brockton", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2305, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "Brockton", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2322, + "latitude": 42.126049, + "longitude": -71.048216, + "city": "Avon", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2324, + "latitude": 41.973741, + "longitude": -70.976558, + "city": "Bridgewater", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2325, + "latitude": 41.98725, + "longitude": -70.972786, + "city": "Bridgewater", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2327, + "latitude": 42.040708, + "longitude": -70.827245, + "city": "Bryantville", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2330, + "latitude": 41.896238, + "longitude": -70.759689, + "city": "Carver", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2331, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "Duxbury", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2332, + "latitude": 42.052985, + "longitude": -70.710808, + "city": "Duxbury", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2333, + "latitude": 42.02285, + "longitude": -70.931056, + "city": "East Bridgewater", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2334, + "latitude": 42.023528, + "longitude": -71.132397, + "city": "Easton", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2337, + "latitude": 42.022225, + "longitude": -70.931588, + "city": "Elmwood", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2338, + "latitude": 41.988351, + "longitude": -70.860578, + "city": "Halifax", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2339, + "latitude": 42.123534, + "longitude": -70.851048, + "city": "Hanover", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2340, + "latitude": 42.123534, + "longitude": -70.851048, + "city": "Hanover", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2341, + "latitude": 42.055701, + "longitude": -70.875936, + "city": "Hanson", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2343, + "latitude": 42.144424, + "longitude": -71.00289, + "city": "Holbrook", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2344, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "Middleboro", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2345, + "latitude": 41.888198, + "longitude": -70.581029, + "city": "Manomet", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2346, + "latitude": 41.915054, + "longitude": -70.882035, + "city": "Middleboro", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2347, + "latitude": 41.843757, + "longitude": -70.959981, + "city": "Lakeville", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2348, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "Middleboro", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2349, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "Middleboro", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2350, + "latitude": 42.018525, + "longitude": -70.847486, + "city": "Monponsett", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2351, + "latitude": 42.11749, + "longitude": -70.959888, + "city": "Abington", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2355, + "latitude": 41.916918, + "longitude": -70.801331, + "city": "North Carver", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2356, + "latitude": 42.053408, + "longitude": -71.12033, + "city": "North Easton", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2357, + "latitude": 42.064499, + "longitude": -71.087091, + "city": "North Easton", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2358, + "latitude": 41.95351, + "longitude": -70.713109, + "city": "North Pembroke", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2359, + "latitude": 42.065702, + "longitude": -70.800778, + "city": "Pembroke", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2360, + "latitude": 41.886207, + "longitude": -70.638717, + "city": "Plymouth", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2361, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "Plymouth", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2362, + "latitude": 41.970474, + "longitude": -70.701357, + "city": "Plymouth", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2364, + "latitude": 41.979405, + "longitude": -70.744813, + "city": "Kingston", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2366, + "latitude": 41.850087, + "longitude": -70.704431, + "city": "South Carver", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2367, + "latitude": 41.96914, + "longitude": -70.812299, + "city": "Plympton", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2368, + "latitude": 42.171467, + "longitude": -71.055602, + "city": "Randolph", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2370, + "latitude": 41.954199, + "longitude": -70.885095, + "city": "Rockland", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2375, + "latitude": 42.023199, + "longitude": -71.111091, + "city": "South Easton", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2379, + "latitude": 42.02165, + "longitude": -71.023588, + "city": "West Bridgewater", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2381, + "latitude": 41.931602, + "longitude": -70.561051, + "city": "White Horse Beach", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2382, + "latitude": 42.0785, + "longitude": -70.940837, + "city": "Whitman", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2420, + "latitude": 42.45631, + "longitude": -71.21665, + "city": "Lexington", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2421, + "latitude": 42.442567, + "longitude": -71.226453, + "city": "Lexington", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2445, + "latitude": 42.318097, + "longitude": -71.143697, + "city": "Brookline", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2446, + "latitude": 42.343097, + "longitude": -71.123046, + "city": "Brookline", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2447, + "latitude": 42.180048, + "longitude": -71.08923, + "city": "Brookline Village", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2451, + "latitude": 42.398588, + "longitude": -71.24505, + "city": "Waltham", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2452, + "latitude": 42.394319, + "longitude": -71.218049, + "city": "Waltham", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2453, + "latitude": 42.365396, + "longitude": -71.23165, + "city": "Waltham", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2454, + "latitude": 42.356719, + "longitude": -71.250479, + "city": "Waltham", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2455, + "latitude": "", + "longitude": "", + "city": "North Waltham", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2456, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "New Town", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2457, + "latitude": 42.180048, + "longitude": -71.08923, + "city": "Babson Park", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2458, + "latitude": 42.385096, + "longitude": -71.208399, + "city": "Newton", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2459, + "latitude": 42.334146, + "longitude": -71.183298, + "city": "Newton Center", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2460, + "latitude": 42.374296, + "longitude": -71.182371, + "city": "Newtonville", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2461, + "latitude": 42.361196, + "longitude": -71.205349, + "city": "Newton Highlands", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2462, + "latitude": 42.349496, + "longitude": -71.209699, + "city": "Newton Lower Falls", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2464, + "latitude": 42.36599, + "longitude": -71.221849, + "city": "Newton Upper Falls", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2465, + "latitude": 42.378145, + "longitude": -71.213199, + "city": "West Newton", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2466, + "latitude": 42.346696, + "longitude": -71.224957, + "city": "Auburndale", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2467, + "latitude": 42.357564, + "longitude": -71.211649, + "city": "Chestnut Hill", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2468, + "latitude": 42.327146, + "longitude": -71.231534, + "city": "Waban", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2471, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Watertown", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2472, + "latitude": 42.363096, + "longitude": -71.201398, + "city": "Watertown", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2474, + "latitude": 42.417595, + "longitude": -71.159696, + "city": "Arlington", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2475, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Arlington Heights", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2476, + "latitude": 42.379146, + "longitude": -71.184299, + "city": "Arlington", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2477, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Watertown", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2478, + "latitude": 42.412795, + "longitude": -71.204399, + "city": "Belmont", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2479, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Waverley", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2481, + "latitude": 42.310597, + "longitude": -71.274652, + "city": "Wellesley Hills", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2482, + "latitude": 42.294546, + "longitude": -71.299201, + "city": "Wellesley", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2492, + "latitude": 42.279797, + "longitude": -71.25006, + "city": "Needham", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2493, + "latitude": 42.375925, + "longitude": -71.227208, + "city": "Weston", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2494, + "latitude": 42.300147, + "longitude": -71.26315, + "city": "Needham Heights", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2495, + "latitude": 42.446396, + "longitude": -71.459405, + "city": "Nonantum", + "state": "MA", + "county": "Middlesex" + }, + { + "zip_code": 2532, + "latitude": 41.745505, + "longitude": -70.590471, + "city": "Buzzards Bay", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2534, + "latitude": 41.669373, + "longitude": -70.62337, + "city": "Cataumet", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2535, + "latitude": 41.379034, + "longitude": -70.673082, + "city": "Chilmark", + "state": "MA", + "county": "Dukes" + }, + { + "zip_code": 2536, + "latitude": 41.662506, + "longitude": -70.562843, + "city": "East Falmouth", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2537, + "latitude": 41.72832, + "longitude": -70.439975, + "city": "East Sandwich", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2538, + "latitude": 41.77544, + "longitude": -70.660562, + "city": "East Wareham", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2539, + "latitude": 41.401176, + "longitude": -70.552054, + "city": "Edgartown", + "state": "MA", + "county": "Dukes" + }, + { + "zip_code": 2540, + "latitude": 41.614199, + "longitude": -70.493263, + "city": "Falmouth", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2541, + "latitude": 41.799312, + "longitude": -70.308662, + "city": "Falmouth", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2542, + "latitude": 41.65308, + "longitude": -70.553727, + "city": "Buzzards Bay", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2543, + "latitude": 41.593809, + "longitude": -70.646442, + "city": "Woods Hole", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2552, + "latitude": 41.379836, + "longitude": -70.643092, + "city": "Menemsha", + "state": "MA", + "county": "Dukes" + }, + { + "zip_code": 2553, + "latitude": 41.67336, + "longitude": -70.608047, + "city": "Monument Beach", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2554, + "latitude": 41.287647, + "longitude": -70.08665, + "city": "Nantucket", + "state": "MA", + "county": "Nantucket" + }, + { + "zip_code": 2556, + "latitude": 41.652967, + "longitude": -70.375475, + "city": "North Falmouth", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2557, + "latitude": 41.417376, + "longitude": -70.560032, + "city": "Oak Bluffs", + "state": "MA", + "county": "Dukes" + }, + { + "zip_code": 2558, + "latitude": 41.74756, + "longitude": -70.658164, + "city": "Onset", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2559, + "latitude": 41.694771, + "longitude": -70.622769, + "city": "Pocasset", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2561, + "latitude": 41.770254, + "longitude": -70.533664, + "city": "Sagamore", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2562, + "latitude": 41.793263, + "longitude": -70.519584, + "city": "Sagamore Beach", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2563, + "latitude": 41.711291, + "longitude": -70.477482, + "city": "Sandwich", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2564, + "latitude": 41.273949, + "longitude": -70.015545, + "city": "Siasconset", + "state": "MA", + "county": "Nantucket" + }, + { + "zip_code": 2565, + "latitude": 41.799312, + "longitude": -70.308662, + "city": "Silver Beach", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2568, + "latitude": 41.41595, + "longitude": -70.595235, + "city": "Vineyard Haven", + "state": "MA", + "county": "Dukes" + }, + { + "zip_code": 2571, + "latitude": 41.760216, + "longitude": -70.694662, + "city": "Wareham", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2573, + "latitude": 41.379836, + "longitude": -70.643092, + "city": "West Chop", + "state": "MA", + "county": "Dukes" + }, + { + "zip_code": 2574, + "latitude": 41.603946, + "longitude": -70.638189, + "city": "West Falmouth", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2575, + "latitude": 41.42125, + "longitude": -70.642806, + "city": "West Tisbury", + "state": "MA", + "county": "Dukes" + }, + { + "zip_code": 2576, + "latitude": 41.769863, + "longitude": -70.749688, + "city": "West Wareham", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2584, + "latitude": 41.277794, + "longitude": -70.046019, + "city": "Nantucket", + "state": "MA", + "county": "Nantucket" + }, + { + "zip_code": 2601, + "latitude": 41.829813, + "longitude": -70.138834, + "city": "Hyannis", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2630, + "latitude": 41.697313, + "longitude": -70.301394, + "city": "Barnstable", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2631, + "latitude": 41.852997, + "longitude": -70.044462, + "city": "Brewster", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2632, + "latitude": 41.796311, + "longitude": -70.175129, + "city": "Centerville", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2633, + "latitude": 41.859559, + "longitude": -70.0468, + "city": "Chatham", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2634, + "latitude": 41.799312, + "longitude": -70.308662, + "city": "Centerville", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2635, + "latitude": 41.624341, + "longitude": -70.43638, + "city": "Cotuit", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2636, + "latitude": 41.799312, + "longitude": -70.308662, + "city": "Centerville", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2637, + "latitude": 41.701438, + "longitude": -70.277212, + "city": "Cummaquid", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2638, + "latitude": 41.725716, + "longitude": -70.089142, + "city": "Dennis", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2639, + "latitude": 41.750745, + "longitude": -70.071836, + "city": "Dennis Port", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2641, + "latitude": 41.734713, + "longitude": -70.20467, + "city": "East Dennis", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2642, + "latitude": 41.850612, + "longitude": -70.020648, + "city": "Eastham", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2643, + "latitude": 41.784308, + "longitude": -69.962034, + "city": "East Orleans", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2644, + "latitude": 41.790031, + "longitude": -70.268632, + "city": "Forestdale", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2645, + "latitude": 41.835582, + "longitude": -70.043359, + "city": "Harwich", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2646, + "latitude": 41.845717, + "longitude": -70.053544, + "city": "Harwich Port", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2647, + "latitude": 41.635004, + "longitude": -70.306336, + "city": "Hyannis Port", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2648, + "latitude": 41.813034, + "longitude": -70.246666, + "city": "Marstons Mills", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2649, + "latitude": 41.788337, + "longitude": -70.253543, + "city": "Mashpee", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2650, + "latitude": 41.73497, + "longitude": -70.029065, + "city": "North Chatham", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2651, + "latitude": 41.824264, + "longitude": -69.98176, + "city": "North Eastham", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2652, + "latitude": 41.931061, + "longitude": -70.283584, + "city": "North Truro", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2653, + "latitude": 41.852933, + "longitude": -70.01539, + "city": "Orleans", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2655, + "latitude": 41.810178, + "longitude": -70.191269, + "city": "Osterville", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2657, + "latitude": 41.888775, + "longitude": -70.091057, + "city": "Provincetown", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2659, + "latitude": 41.848932, + "longitude": -70.030194, + "city": "South Chatham", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2660, + "latitude": 41.80038, + "longitude": -70.089244, + "city": "South Dennis", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2661, + "latitude": 41.686205, + "longitude": -70.032858, + "city": "South Harwich", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2662, + "latitude": 41.756694, + "longitude": -69.984123, + "city": "South Orleans", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2663, + "latitude": 41.800531, + "longitude": -70.076776, + "city": "South Wellfleet", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2664, + "latitude": 41.82412, + "longitude": -70.084259, + "city": "South Yarmouth", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2666, + "latitude": 41.987377, + "longitude": -70.047163, + "city": "Truro", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2667, + "latitude": 41.821307, + "longitude": -70.022806, + "city": "Wellfleet", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2668, + "latitude": 41.79055, + "longitude": -70.201719, + "city": "West Barnstable", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2669, + "latitude": 41.698721, + "longitude": -70.004937, + "city": "West Chatham", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2670, + "latitude": 41.710855, + "longitude": -70.072195, + "city": "West Dennis", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2671, + "latitude": 41.846719, + "longitude": -70.038282, + "city": "West Harwich", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2672, + "latitude": 41.635635, + "longitude": -70.323307, + "city": "West Hyannisport", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2673, + "latitude": 41.776105, + "longitude": -70.150512, + "city": "West Yarmouth", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2675, + "latitude": 41.716271, + "longitude": -70.135884, + "city": "Yarmouth Port", + "state": "MA", + "county": "Barnstable" + }, + { + "zip_code": 2702, + "latitude": 41.782993, + "longitude": -71.017328, + "city": "Assonet", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2703, + "latitude": 41.938976, + "longitude": -71.302297, + "city": "Attleboro", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2712, + "latitude": 41.756214, + "longitude": -71.067062, + "city": "Chartley", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2713, + "latitude": 41.42178, + "longitude": -70.931309, + "city": "Cuttyhunk", + "state": "MA", + "county": "Dukes" + }, + { + "zip_code": 2714, + "latitude": 41.756214, + "longitude": -71.067062, + "city": "Dartmouth", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2715, + "latitude": 41.817659, + "longitude": -71.151787, + "city": "Dighton", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2717, + "latitude": 41.747358, + "longitude": -70.978947, + "city": "East Freetown", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2718, + "latitude": 41.871407, + "longitude": -71.013148, + "city": "East Taunton", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2719, + "latitude": 41.631672, + "longitude": -70.870045, + "city": "Fairhaven", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2720, + "latitude": 41.819766, + "longitude": -71.165971, + "city": "Fall River", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2721, + "latitude": 41.678895, + "longitude": -71.153648, + "city": "Fall River", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2722, + "latitude": 41.756214, + "longitude": -71.067062, + "city": "Fall River", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2723, + "latitude": 41.693802, + "longitude": -71.133088, + "city": "Fall River", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2724, + "latitude": 41.684202, + "longitude": -71.175139, + "city": "Fall River", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2725, + "latitude": 41.723851, + "longitude": -71.173989, + "city": "Somerset", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2726, + "latitude": 41.757951, + "longitude": -71.153639, + "city": "Somerset", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2738, + "latitude": 41.736735, + "longitude": -70.754015, + "city": "Marion", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2739, + "latitude": 41.664976, + "longitude": -70.810856, + "city": "Mattapoisett", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2740, + "latitude": 41.633416, + "longitude": -70.951045, + "city": "New Bedford", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2741, + "latitude": 41.756214, + "longitude": -71.067062, + "city": "New Bedford", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2742, + "latitude": 41.619557, + "longitude": -70.956346, + "city": "New Bedford", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2743, + "latitude": 41.711894, + "longitude": -70.908286, + "city": "Acushnet", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2744, + "latitude": 41.609354, + "longitude": -70.916181, + "city": "New Bedford", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2745, + "latitude": 41.7087, + "longitude": -70.946883, + "city": "New Bedford", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2746, + "latitude": 41.665704, + "longitude": -70.943021, + "city": "New Bedford", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2747, + "latitude": 41.639261, + "longitude": -71.007578, + "city": "North Dartmouth", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2748, + "latitude": 41.566464, + "longitude": -70.984253, + "city": "South Dartmouth", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2760, + "latitude": 41.964376, + "longitude": -71.326448, + "city": "North Attleboro", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2761, + "latitude": 41.756214, + "longitude": -71.067062, + "city": "North Attleboro", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2762, + "latitude": 42.013553, + "longitude": -71.334399, + "city": "Plainville", + "state": "MA", + "county": "Norfolk" + }, + { + "zip_code": 2763, + "latitude": 41.972584, + "longitude": -71.308229, + "city": "Attleboro Falls", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2764, + "latitude": 41.847791, + "longitude": -71.155797, + "city": "North Dighton", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2766, + "latitude": 41.959149, + "longitude": -71.180393, + "city": "Norton", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2767, + "latitude": 41.9367, + "longitude": -71.048941, + "city": "Raynham", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2768, + "latitude": 41.756214, + "longitude": -71.067062, + "city": "Raynham Center", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2769, + "latitude": 41.852989, + "longitude": -71.243061, + "city": "Rehoboth", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2770, + "latitude": 41.751812, + "longitude": -70.846041, + "city": "Rochester", + "state": "MA", + "county": "Plymouth" + }, + { + "zip_code": 2771, + "latitude": 41.840103, + "longitude": -71.318995, + "city": "Seekonk", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2777, + "latitude": 41.766629, + "longitude": -71.234443, + "city": "Swansea", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2779, + "latitude": 41.828249, + "longitude": -71.064135, + "city": "Berkley", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2780, + "latitude": 41.858851, + "longitude": -71.092827, + "city": "Taunton", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2783, + "latitude": 41.756214, + "longitude": -71.067062, + "city": "Taunton", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2790, + "latitude": 41.61547, + "longitude": -71.079636, + "city": "Westport", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2791, + "latitude": 41.519104, + "longitude": -71.085137, + "city": "Westport Point", + "state": "MA", + "county": "Bristol" + }, + { + "zip_code": 2801, + "latitude": 41.530131, + "longitude": -71.284066, + "city": "Adamsville", + "state": "RI", + "county": "Newport" + }, + { + "zip_code": 2802, + "latitude": 41.954098, + "longitude": -71.462053, + "city": "Albion", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2804, + "latitude": 41.322365, + "longitude": -71.679251, + "city": "Ashaway", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2806, + "latitude": 41.742501, + "longitude": -71.320395, + "city": "Barrington", + "state": "RI", + "county": "Bristol" + }, + { + "zip_code": 2807, + "latitude": 41.188888, + "longitude": -71.577696, + "city": "Block Island", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2808, + "latitude": 41.403784, + "longitude": -71.761665, + "city": "Bradford", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2809, + "latitude": 41.678378, + "longitude": -71.2704, + "city": "Bristol", + "state": "RI", + "county": "Bristol" + }, + { + "zip_code": 2812, + "latitude": 41.469148, + "longitude": -71.675092, + "city": "Carolina", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2813, + "latitude": 41.395079, + "longitude": -71.66542, + "city": "Charlestown", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2814, + "latitude": 41.888971, + "longitude": -71.688769, + "city": "Chepachet", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2815, + "latitude": 41.770525, + "longitude": -71.65585, + "city": "Clayville", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2816, + "latitude": 41.694251, + "longitude": -71.636786, + "city": "Coventry", + "state": "RI", + "county": "Kent" + }, + { + "zip_code": 2817, + "latitude": 41.631168, + "longitude": -71.667165, + "city": "West Greenwich", + "state": "RI", + "county": "Kent" + }, + { + "zip_code": 2818, + "latitude": 41.64335, + "longitude": -71.478002, + "city": "East Greenwich", + "state": "RI", + "county": "Kent" + }, + { + "zip_code": 2822, + "latitude": 41.5469, + "longitude": -71.650262, + "city": "Exeter", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2823, + "latitude": 41.7312, + "longitude": -71.546756, + "city": "Fiskeville", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2824, + "latitude": 42.000248, + "longitude": -71.563057, + "city": "Forestdale", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2825, + "latitude": 41.790569, + "longitude": -71.70644, + "city": "Foster", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2826, + "latitude": 41.982417, + "longitude": -71.600848, + "city": "Glendale", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2827, + "latitude": 41.691676, + "longitude": -71.727467, + "city": "Greene", + "state": "RI", + "county": "Kent" + }, + { + "zip_code": 2828, + "latitude": 41.879298, + "longitude": -71.551682, + "city": "Greenville", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2829, + "latitude": 41.879298, + "longitude": -71.589357, + "city": "Harmony", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2830, + "latitude": 41.97239, + "longitude": -71.648502, + "city": "Harrisville", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2831, + "latitude": 41.753594, + "longitude": -71.577746, + "city": "Hope", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2832, + "latitude": 41.509632, + "longitude": -71.733875, + "city": "Hope Valley", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2833, + "latitude": 41.475117, + "longitude": -71.772617, + "city": "Hopkinton", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2835, + "latitude": 41.51412, + "longitude": -71.377247, + "city": "Jamestown", + "state": "RI", + "county": "Newport" + }, + { + "zip_code": 2836, + "latitude": 41.447427, + "longitude": -71.620432, + "city": "Kenyon", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2837, + "latitude": 41.510257, + "longitude": -71.16634, + "city": "Little Compton", + "state": "RI", + "county": "Newport" + }, + { + "zip_code": 2838, + "latitude": 41.967848, + "longitude": -71.475604, + "city": "Manville", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2839, + "latitude": 41.941715, + "longitude": -71.637581, + "city": "Mapleville", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2840, + "latitude": 41.487552, + "longitude": -71.327084, + "city": "Newport", + "state": "RI", + "county": "Newport" + }, + { + "zip_code": 2841, + "latitude": 41.498977, + "longitude": -71.299004, + "city": "Newport", + "state": "RI", + "county": "Newport" + }, + { + "zip_code": 2842, + "latitude": 41.519757, + "longitude": -71.273101, + "city": "Middletown", + "state": "RI", + "county": "Newport" + }, + { + "zip_code": 2852, + "latitude": 41.586851, + "longitude": -71.464801, + "city": "North Kingstown", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2854, + "latitude": 41.375317, + "longitude": -71.64393, + "city": "North Kingstown", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2857, + "latitude": 41.838827, + "longitude": -71.655006, + "city": "North Scituate", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2858, + "latitude": 41.962303, + "longitude": -71.647542, + "city": "Oakland", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2859, + "latitude": 41.96415, + "longitude": -71.723316, + "city": "Pascoag", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2860, + "latitude": 41.875149, + "longitude": -71.392732, + "city": "Pawtucket", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2861, + "latitude": 41.878249, + "longitude": -71.369899, + "city": "Pawtucket", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2862, + "latitude": 41.86125, + "longitude": -71.369099, + "city": "Pawtucket", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2863, + "latitude": 41.889849, + "longitude": -71.394186, + "city": "Central Falls", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2864, + "latitude": 41.949498, + "longitude": -71.43269, + "city": "Cumberland", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2865, + "latitude": 41.925298, + "longitude": -71.493355, + "city": "Lincoln", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2871, + "latitude": 41.58523, + "longitude": -71.264197, + "city": "Portsmouth", + "state": "RI", + "county": "Newport" + }, + { + "zip_code": 2872, + "latitude": 41.707119, + "longitude": -71.286834, + "city": "Prudence Island", + "state": "RI", + "county": "Bristol" + }, + { + "zip_code": 2873, + "latitude": 41.519922, + "longitude": -71.774023, + "city": "Rockville", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2874, + "latitude": 41.478466, + "longitude": -71.471752, + "city": "Saunderstown", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2875, + "latitude": 41.456039, + "longitude": -71.635474, + "city": "Shannock", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2876, + "latitude": 41.998398, + "longitude": -71.576307, + "city": "Slatersville", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2877, + "latitude": 41.5289, + "longitude": -71.529854, + "city": "Slocum", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2878, + "latitude": 41.61018, + "longitude": -71.175183, + "city": "Tiverton", + "state": "RI", + "county": "Newport" + }, + { + "zip_code": 2879, + "latitude": 41.443653, + "longitude": -71.534202, + "city": "Wakefield", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2880, + "latitude": 41.375317, + "longitude": -71.64393, + "city": "Wakefield", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2881, + "latitude": 41.482901, + "longitude": -71.524317, + "city": "Kingston", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2882, + "latitude": 41.377185, + "longitude": -71.497793, + "city": "Narragansett", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2883, + "latitude": 41.375317, + "longitude": -71.64393, + "city": "Peace Dale", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2885, + "latitude": 41.727451, + "longitude": -71.257492, + "city": "Warren", + "state": "RI", + "county": "Bristol" + }, + { + "zip_code": 2886, + "latitude": 41.70247, + "longitude": -71.47902, + "city": "Warwick", + "state": "RI", + "county": "Kent" + }, + { + "zip_code": 2887, + "latitude": 41.682455, + "longitude": -71.557732, + "city": "Warwick", + "state": "RI", + "county": "Kent" + }, + { + "zip_code": 2888, + "latitude": 41.7473, + "longitude": -71.411088, + "city": "Warwick", + "state": "RI", + "county": "Kent" + }, + { + "zip_code": 2889, + "latitude": 41.689182, + "longitude": -71.496048, + "city": "Warwick", + "state": "RI", + "county": "Kent" + }, + { + "zip_code": 2891, + "latitude": 41.284494, + "longitude": -71.710708, + "city": "Westerly", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2892, + "latitude": 41.505764, + "longitude": -71.62114, + "city": "West Kingston", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2893, + "latitude": 41.696822, + "longitude": -71.507304, + "city": "West Warwick", + "state": "RI", + "county": "Kent" + }, + { + "zip_code": 2894, + "latitude": 41.45005, + "longitude": -71.70742, + "city": "Wood River Junction", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2895, + "latitude": 41.984598, + "longitude": -71.51939, + "city": "Woonsocket", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2896, + "latitude": 41.934348, + "longitude": -71.540506, + "city": "North Smithfield", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2898, + "latitude": 41.504089, + "longitude": -71.662954, + "city": "Wyoming", + "state": "RI", + "county": "Washington" + }, + { + "zip_code": 2901, + "latitude": 41.82275, + "longitude": -71.414451, + "city": "Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2902, + "latitude": 41.81835, + "longitude": -71.424851, + "city": "Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2903, + "latitude": 41.819459, + "longitude": -71.4115, + "city": "Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2904, + "latitude": 41.85414, + "longitude": -71.437752, + "city": "Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2905, + "latitude": 41.803799, + "longitude": -71.422547, + "city": "Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2906, + "latitude": 41.8374, + "longitude": -71.394717, + "city": "Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2907, + "latitude": 41.797065, + "longitude": -71.425501, + "city": "Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2908, + "latitude": 41.837399, + "longitude": -71.4399, + "city": "Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2909, + "latitude": 41.820599, + "longitude": -71.444302, + "city": "Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2910, + "latitude": 41.7917, + "longitude": -71.435251, + "city": "Cranston", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2911, + "latitude": 41.838749, + "longitude": -71.449202, + "city": "North Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2912, + "latitude": 41.826737, + "longitude": -71.397699, + "city": "Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2914, + "latitude": 41.813429, + "longitude": -71.363348, + "city": "East Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2915, + "latitude": 41.7743, + "longitude": -71.349697, + "city": "Riverside", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2916, + "latitude": 41.842727, + "longitude": -71.355798, + "city": "Rumford", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2917, + "latitude": 41.853899, + "longitude": -71.497804, + "city": "Smithfield", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2918, + "latitude": 41.841499, + "longitude": -71.440352, + "city": "Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2919, + "latitude": 41.870932, + "longitude": -71.497604, + "city": "Johnston", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2920, + "latitude": 41.7693, + "longitude": -71.471353, + "city": "Cranston", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2921, + "latitude": 41.76675, + "longitude": -71.476703, + "city": "Cranston", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 2940, + "latitude": 41.871766, + "longitude": -71.558518, + "city": "Providence", + "state": "RI", + "county": "Providence" + }, + { + "zip_code": 3031, + "latitude": 42.87474, + "longitude": -71.629365, + "city": "Amherst", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3032, + "latitude": 42.989151, + "longitude": -71.343576, + "city": "Auburn", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3033, + "latitude": 42.847268, + "longitude": -71.767437, + "city": "Brookline", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3034, + "latitude": 43.059283, + "longitude": -71.305437, + "city": "Candia", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3036, + "latitude": 42.961606, + "longitude": -71.251021, + "city": "Chester", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3037, + "latitude": 42.987495, + "longitude": -71.252719, + "city": "Deerfield", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3038, + "latitude": 42.950825, + "longitude": -71.197169, + "city": "Derry", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3040, + "latitude": 43.005895, + "longitude": -71.013202, + "city": "East Candia", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3041, + "latitude": 43.005895, + "longitude": -71.013202, + "city": "East Derry", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3042, + "latitude": 43.047595, + "longitude": -71.084411, + "city": "Epping", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3043, + "latitude": 42.916233, + "longitude": -71.816505, + "city": "Francestown", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3044, + "latitude": 42.992203, + "longitude": -71.127041, + "city": "Fremont", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3045, + "latitude": 42.94671, + "longitude": -71.687633, + "city": "Goffstown", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3046, + "latitude": "", + "longitude": "", + "city": "Dunbarton", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3047, + "latitude": 42.929346, + "longitude": -71.859087, + "city": "Greenfield", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3048, + "latitude": 42.875116, + "longitude": -71.717548, + "city": "Greenville", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3049, + "latitude": 42.859545, + "longitude": -71.581313, + "city": "Hollis", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3051, + "latitude": 42.766426, + "longitude": -71.61887, + "city": "Hudson", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3052, + "latitude": 42.886789, + "longitude": -71.485331, + "city": "Litchfield", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3053, + "latitude": 42.8712, + "longitude": -71.387776, + "city": "Londonderry", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3054, + "latitude": 42.924928, + "longitude": -71.667508, + "city": "Merrimack", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3055, + "latitude": 42.848787, + "longitude": -71.743882, + "city": "Milford", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3057, + "latitude": 42.850464, + "longitude": -71.727044, + "city": "Mont Vernon", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3060, + "latitude": 42.771537, + "longitude": -71.626336, + "city": "Nashua", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3061, + "latitude": 42.952124, + "longitude": -71.653939, + "city": "Nashua", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3062, + "latitude": 42.860117, + "longitude": -71.49976, + "city": "Nashua", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3063, + "latitude": 42.774427, + "longitude": -71.511111, + "city": "Nashua", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3064, + "latitude": 42.774237, + "longitude": -71.628611, + "city": "Nashua", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3070, + "latitude": 42.903497, + "longitude": -71.775889, + "city": "New Boston", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3071, + "latitude": 42.762946, + "longitude": -71.845164, + "city": "New Ipswich", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3073, + "latitude": 43.005895, + "longitude": -71.013202, + "city": "North Salem", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3076, + "latitude": 42.740651, + "longitude": -71.318715, + "city": "Pelham", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3077, + "latitude": 43.05932, + "longitude": -71.204521, + "city": "Raymond", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3079, + "latitude": 42.872045, + "longitude": -71.196195, + "city": "Salem", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3082, + "latitude": 42.902031, + "longitude": -71.773947, + "city": "Lyndeborough", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3084, + "latitude": 42.822275, + "longitude": -71.860983, + "city": "Temple", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3086, + "latitude": 42.894022, + "longitude": -71.730154, + "city": "Wilton", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3087, + "latitude": 42.892211, + "longitude": -71.234009, + "city": "Windham", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3101, + "latitude": 42.988483, + "longitude": -71.462111, + "city": "Manchester", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3102, + "latitude": 43.007883, + "longitude": -71.494561, + "city": "Manchester", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3103, + "latitude": 42.942463, + "longitude": -71.463761, + "city": "Manchester", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3104, + "latitude": 42.897524, + "longitude": -71.372208, + "city": "Manchester", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3105, + "latitude": 42.952124, + "longitude": -71.653939, + "city": "Manchester", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3106, + "latitude": 43.065097, + "longitude": -71.443616, + "city": "Hooksett", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3107, + "latitude": 42.952124, + "longitude": -71.653939, + "city": "Manchester", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3108, + "latitude": 42.952124, + "longitude": -71.653939, + "city": "Manchester", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3109, + "latitude": 42.970084, + "longitude": -71.405283, + "city": "Manchester", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3110, + "latitude": 42.93743, + "longitude": -71.535515, + "city": "Bedford", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3111, + "latitude": 42.952124, + "longitude": -71.653939, + "city": "Manchester", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3215, + "latitude": 43.930221, + "longitude": -71.534068, + "city": "Waterville Valley", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3216, + "latitude": 43.447006, + "longitude": -71.684093, + "city": "Andover", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3217, + "latitude": 43.715626, + "longitude": -71.639896, + "city": "Ashland", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3218, + "latitude": 43.417369, + "longitude": -71.373189, + "city": "Barnstead", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3220, + "latitude": 43.455551, + "longitude": -71.40709, + "city": "Belmont", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3221, + "latitude": 43.280961, + "longitude": -71.792489, + "city": "Bradford", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3222, + "latitude": 43.70781, + "longitude": -71.72158, + "city": "Bristol", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3223, + "latitude": 43.841799, + "longitude": -71.665223, + "city": "Campton", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3224, + "latitude": 43.378281, + "longitude": -71.604226, + "city": "Canterbury", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3225, + "latitude": 43.386652, + "longitude": -71.292981, + "city": "Center Barnstead", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3226, + "latitude": 43.69387, + "longitude": -71.466212, + "city": "Center Harbor", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3227, + "latitude": 43.694809, + "longitude": -71.323953, + "city": "Center Sandwich", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3229, + "latitude": 43.301308, + "longitude": -71.812943, + "city": "Contoocook", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3230, + "latitude": 43.514791, + "longitude": -71.882094, + "city": "Danbury", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3231, + "latitude": 43.466172, + "longitude": -71.736518, + "city": "East Andover", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3232, + "latitude": 43.967542, + "longitude": -71.840883, + "city": "East Hebron", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3233, + "latitude": 43.422706, + "longitude": -71.944794, + "city": "Elkins", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3234, + "latitude": 43.340736, + "longitude": -71.669712, + "city": "Epsom", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3235, + "latitude": 43.374297, + "longitude": -71.680021, + "city": "Franklin", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3237, + "latitude": 43.414064, + "longitude": -71.384213, + "city": "Gilmanton", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3238, + "latitude": 43.967542, + "longitude": -71.840883, + "city": "Glencliff", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3240, + "latitude": 43.967542, + "longitude": -71.840883, + "city": "Grafton", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3241, + "latitude": 43.718268, + "longitude": -71.889483, + "city": "Hebron", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3242, + "latitude": 43.180148, + "longitude": -71.81959, + "city": "Henniker", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3243, + "latitude": 43.443473, + "longitude": -71.762631, + "city": "Hill", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3244, + "latitude": 43.12295, + "longitude": -71.914287, + "city": "Hillsboro", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3245, + "latitude": 43.737831, + "longitude": -71.604406, + "city": "Holderness", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3246, + "latitude": 43.535461, + "longitude": -71.426997, + "city": "Laconia", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3247, + "latitude": 43.588972, + "longitude": -71.445452, + "city": "Laconia", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3249, + "latitude": "", + "longitude": "", + "city": "Gilford", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3251, + "latitude": 44.049183, + "longitude": -71.653505, + "city": "Lincoln", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3252, + "latitude": 43.468562, + "longitude": -71.537145, + "city": "Lochmere", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3253, + "latitude": 43.592239, + "longitude": -71.517479, + "city": "Meredith", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3254, + "latitude": 43.728235, + "longitude": -71.335248, + "city": "Moultonborough", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3255, + "latitude": 43.321723, + "longitude": -72.01184, + "city": "Newbury", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3256, + "latitude": 43.603288, + "longitude": -71.634674, + "city": "New Hampton", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3257, + "latitude": 43.301663, + "longitude": -71.733643, + "city": "New London", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3258, + "latitude": "", + "longitude": "", + "city": "Chichester", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3259, + "latitude": 43.85971, + "longitude": -71.37719, + "city": "North Sandwich", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3260, + "latitude": 43.365345, + "longitude": -71.934059, + "city": "North Sutton", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3261, + "latitude": 43.208676, + "longitude": -71.202568, + "city": "Northwood", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3262, + "latitude": 44.035391, + "longitude": -71.686326, + "city": "North Woodstock", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3263, + "latitude": 43.297834, + "longitude": -71.343707, + "city": "Pittsfield", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3264, + "latitude": 43.710919, + "longitude": -71.694017, + "city": "Plymouth", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3266, + "latitude": 43.752475, + "longitude": -71.788434, + "city": "Rumney", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3268, + "latitude": 43.361756, + "longitude": -71.558817, + "city": "Salisbury", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3269, + "latitude": 43.50178, + "longitude": -71.514248, + "city": "Sanbornton", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3272, + "latitude": 43.310279, + "longitude": -71.662928, + "city": "South Newbury", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3273, + "latitude": 43.304205, + "longitude": -71.928867, + "city": "South Sutton", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3274, + "latitude": 43.967542, + "longitude": -71.840883, + "city": "Stinson Lake", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3275, + "latitude": 43.286382, + "longitude": -71.599047, + "city": "Suncook", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3276, + "latitude": 43.536056, + "longitude": -71.49166, + "city": "Tilton", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3278, + "latitude": 43.310858, + "longitude": -71.842299, + "city": "Warner", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3279, + "latitude": 43.967542, + "longitude": -71.840883, + "city": "Warren", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3280, + "latitude": 43.17229, + "longitude": -72.100689, + "city": "Washington", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3281, + "latitude": 43.084176, + "longitude": -71.762578, + "city": "Weare", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3282, + "latitude": 43.967542, + "longitude": -71.840883, + "city": "Wentworth", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3284, + "latitude": 43.493812, + "longitude": -72.047018, + "city": "Springfield", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3287, + "latitude": 43.44853, + "longitude": -71.915826, + "city": "Wilmot", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3289, + "latitude": 43.496372, + "longitude": -71.519728, + "city": "Winnisquam", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3290, + "latitude": 43.124825, + "longitude": -71.125879, + "city": "Nottingham", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3291, + "latitude": 43.182251, + "longitude": -71.139551, + "city": "West Nottingham", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3293, + "latitude": 43.967542, + "longitude": -71.840883, + "city": "Woodstock", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3298, + "latitude": 43.524872, + "longitude": -71.445841, + "city": "Tilton", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3299, + "latitude": 43.524872, + "longitude": -71.445841, + "city": "Tilton", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3301, + "latitude": 43.230314, + "longitude": -71.536101, + "city": "Concord", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3302, + "latitude": 43.310279, + "longitude": -71.662928, + "city": "Concord", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3303, + "latitude": 43.281654, + "longitude": -71.659523, + "city": "Concord", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3304, + "latitude": 43.128256, + "longitude": -71.544599, + "city": "Bow", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3305, + "latitude": 43.2134, + "longitude": -71.517151, + "city": "Concord", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3307, + "latitude": 43.319339, + "longitude": -71.467006, + "city": "Loudon", + "state": "NH", + "county": "Merrimack" + }, + { + "zip_code": 3431, + "latitude": 42.903656, + "longitude": -72.248052, + "city": "Keene", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3435, + "latitude": 42.947098, + "longitude": -72.243029, + "city": "Keene", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3440, + "latitude": 43.044535, + "longitude": -71.971353, + "city": "Antrim", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3441, + "latitude": 42.777271, + "longitude": -72.444106, + "city": "Ashuelot", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3442, + "latitude": 43.002936, + "longitude": -71.908029, + "city": "Bennington", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3443, + "latitude": 42.883948, + "longitude": -72.454813, + "city": "Chesterfield", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3444, + "latitude": 42.889124, + "longitude": -72.018993, + "city": "Dublin", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3445, + "latitude": 42.998225, + "longitude": -72.201903, + "city": "Sullivan", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3446, + "latitude": 42.841079, + "longitude": -72.330145, + "city": "Swanzey", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3447, + "latitude": 42.881769, + "longitude": -72.248026, + "city": "Fitzwilliam", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3448, + "latitude": 42.936786, + "longitude": -72.210953, + "city": "Gilsum", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3449, + "latitude": 42.93924, + "longitude": -71.983797, + "city": "Hancock", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3450, + "latitude": 42.884548, + "longitude": -72.102634, + "city": "Harrisville", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3451, + "latitude": 42.894151, + "longitude": -72.280099, + "city": "Hinsdale", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3452, + "latitude": 42.821969, + "longitude": -72.082559, + "city": "Jaffrey", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3455, + "latitude": 42.88825, + "longitude": -72.279638, + "city": "Marlborough", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3456, + "latitude": 43.119294, + "longitude": -72.202564, + "city": "Marlow", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3457, + "latitude": 42.896623, + "longitude": -72.091677, + "city": "Nelson", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3458, + "latitude": 42.956433, + "longitude": -71.9372, + "city": "Peterborough", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3461, + "latitude": 42.76509, + "longitude": -72.00912, + "city": "Rindge", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3462, + "latitude": 42.870716, + "longitude": -72.239432, + "city": "Spofford", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3464, + "latitude": 42.95478, + "longitude": -72.102454, + "city": "Stoddard", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3465, + "latitude": 42.843617, + "longitude": -72.279814, + "city": "Troy", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3466, + "latitude": 42.858419, + "longitude": -72.432202, + "city": "West Chesterfield", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3467, + "latitude": 42.973867, + "longitude": -72.44256, + "city": "Westmoreland", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3468, + "latitude": 42.890804, + "longitude": -71.933396, + "city": "West Peterborough", + "state": "NH", + "county": "Hillsborough" + }, + { + "zip_code": 3469, + "latitude": 42.87341, + "longitude": -72.31509, + "city": "West Swanzey", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3470, + "latitude": 42.895797, + "longitude": -72.274928, + "city": "Winchester", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3561, + "latitude": 44.335289, + "longitude": -71.877638, + "city": "Littleton", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3570, + "latitude": 44.512344, + "longitude": -71.194226, + "city": "Berlin", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3574, + "latitude": 44.30632, + "longitude": -71.728049, + "city": "Bethlehem", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3575, + "latitude": 44.695648, + "longitude": -71.387387, + "city": "Bretton Woods", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3576, + "latitude": 44.902731, + "longitude": -71.500809, + "city": "Colebrook", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3579, + "latitude": 44.695648, + "longitude": -71.387387, + "city": "Errol", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3580, + "latitude": 44.212814, + "longitude": -71.737162, + "city": "Franconia", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3581, + "latitude": 44.404848, + "longitude": -71.154758, + "city": "Gorham", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3582, + "latitude": 44.75096, + "longitude": -71.422453, + "city": "Groveton", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3583, + "latitude": 44.695648, + "longitude": -71.387387, + "city": "Jefferson", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3584, + "latitude": 44.476575, + "longitude": -71.561225, + "city": "Lancaster", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3585, + "latitude": 44.245004, + "longitude": -71.888882, + "city": "Lisbon", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3587, + "latitude": 44.695648, + "longitude": -71.387387, + "city": "Meadows", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3588, + "latitude": 44.56532, + "longitude": -71.218672, + "city": "Milan", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3589, + "latitude": 44.695648, + "longitude": -71.387387, + "city": "Mount Washington", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3590, + "latitude": 44.695648, + "longitude": -71.387387, + "city": "North Stratford", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3592, + "latitude": 44.695648, + "longitude": -71.387387, + "city": "Pittsburg", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3595, + "latitude": 44.26895, + "longitude": -71.547061, + "city": "Twin Mountain", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3597, + "latitude": 44.695648, + "longitude": -71.387387, + "city": "West Stewartstown", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3598, + "latitude": 44.363681, + "longitude": -71.610189, + "city": "Whitefield", + "state": "NH", + "county": "Coos" + }, + { + "zip_code": 3601, + "latitude": 43.195982, + "longitude": -72.300075, + "city": "Acworth", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3602, + "latitude": 43.134412, + "longitude": -72.310623, + "city": "Alstead", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3603, + "latitude": 43.268117, + "longitude": -72.370222, + "city": "Charlestown", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3604, + "latitude": 42.947098, + "longitude": -72.243029, + "city": "Drewsville", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3605, + "latitude": 43.213615, + "longitude": -72.196758, + "city": "Lempster", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3607, + "latitude": 43.364504, + "longitude": -72.193966, + "city": "South Acworth", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3608, + "latitude": 43.072239, + "longitude": -72.390121, + "city": "Walpole", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3609, + "latitude": 43.138018, + "longitude": -72.407236, + "city": "North Walpole", + "state": "NH", + "county": "Cheshire" + }, + { + "zip_code": 3740, + "latitude": 44.114163, + "longitude": -71.948852, + "city": "Bath", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3741, + "latitude": 43.63123, + "longitude": -72.057312, + "city": "Canaan", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3743, + "latitude": 43.415993, + "longitude": -72.209819, + "city": "Claremont", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3745, + "latitude": 43.462156, + "longitude": -72.337149, + "city": "Cornish", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3746, + "latitude": 43.364504, + "longitude": -72.193966, + "city": "Cornish Flat", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3748, + "latitude": 43.630906, + "longitude": -72.116603, + "city": "Enfield", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3749, + "latitude": 43.579573, + "longitude": -72.08541, + "city": "Enfield Center", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3750, + "latitude": 43.697999, + "longitude": -72.215182, + "city": "Etna", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3751, + "latitude": 43.44872, + "longitude": -72.063675, + "city": "Georges Mills", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3752, + "latitude": 43.417705, + "longitude": -72.196718, + "city": "Goshen", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3753, + "latitude": 43.463101, + "longitude": -72.218445, + "city": "Grantham", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3754, + "latitude": 43.365618, + "longitude": -72.125562, + "city": "Guild", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3755, + "latitude": 43.861077, + "longitude": -72.120314, + "city": "Hanover", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3756, + "latitude": 43.967542, + "longitude": -71.840883, + "city": "Lebanon", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3765, + "latitude": 44.037549, + "longitude": -72.046692, + "city": "Haverhill", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3766, + "latitude": 43.637148, + "longitude": -72.23546, + "city": "Lebanon", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3768, + "latitude": 43.801656, + "longitude": -72.130495, + "city": "Lyme", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3769, + "latitude": 43.786267, + "longitude": -72.120468, + "city": "Lyme Center", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3770, + "latitude": 43.421675, + "longitude": -72.255638, + "city": "Meriden", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3771, + "latitude": 44.268612, + "longitude": -72.015317, + "city": "Monroe", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3773, + "latitude": 43.390485, + "longitude": -72.199659, + "city": "Newport", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3774, + "latitude": 44.077803, + "longitude": -72.014608, + "city": "North Haverhill", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3777, + "latitude": 43.927348, + "longitude": -72.10987, + "city": "Orford", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3779, + "latitude": 43.948343, + "longitude": -72.062132, + "city": "Piermont", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3780, + "latitude": 43.967542, + "longitude": -71.840883, + "city": "Pike", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3781, + "latitude": 43.432999, + "longitude": -72.282596, + "city": "Plainfield", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3782, + "latitude": 43.426838, + "longitude": -72.15471, + "city": "Sunapee", + "state": "NH", + "county": "Sullivan" + }, + { + "zip_code": 3784, + "latitude": 43.644367, + "longitude": -72.2348, + "city": "West Lebanon", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3785, + "latitude": 43.948644, + "longitude": -72.080708, + "city": "Woodsville", + "state": "NH", + "county": "Grafton" + }, + { + "zip_code": 3801, + "latitude": 43.009222, + "longitude": -70.950742, + "city": "Portsmouth", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3802, + "latitude": 43.005895, + "longitude": -71.013202, + "city": "Portsmouth", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3803, + "latitude": 42.92703, + "longitude": -71.444752, + "city": "Portsmouth", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3804, + "latitude": 43.005895, + "longitude": -71.013202, + "city": "Portsmouth", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3805, + "latitude": 43.285282, + "longitude": -70.930684, + "city": "Rollinsford", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3809, + "latitude": 43.462586, + "longitude": -71.222455, + "city": "Alton", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3810, + "latitude": 43.502514, + "longitude": -71.277387, + "city": "Alton Bay", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3811, + "latitude": 42.878366, + "longitude": -71.159035, + "city": "Atkinson", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3812, + "latitude": 43.883871, + "longitude": -71.257726, + "city": "Bartlett", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3813, + "latitude": 43.797391, + "longitude": -71.145357, + "city": "Center Conway", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3814, + "latitude": 43.762429, + "longitude": -71.122689, + "city": "Center Ossipee", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3815, + "latitude": 43.253739, + "longitude": -71.109825, + "city": "Center Strafford", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3816, + "latitude": 43.660752, + "longitude": -71.274458, + "city": "Center Tuftonboro", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3817, + "latitude": 43.74858, + "longitude": -71.089796, + "city": "Chocorua", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3818, + "latitude": 43.78892, + "longitude": -71.10261, + "city": "Conway", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3819, + "latitude": 42.926725, + "longitude": -71.082299, + "city": "Danville", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3820, + "latitude": 43.297309, + "longitude": -70.992042, + "city": "Dover", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3821, + "latitude": 43.326734, + "longitude": -71.028427, + "city": "Dover", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3822, + "latitude": 43.326734, + "longitude": -71.028427, + "city": "Dover", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3824, + "latitude": 43.165772, + "longitude": -70.962843, + "city": "Durham", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3825, + "latitude": 43.29779, + "longitude": -71.097423, + "city": "Barrington", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3826, + "latitude": 42.893629, + "longitude": -71.14269, + "city": "East Hampstead", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3827, + "latitude": 42.912071, + "longitude": -71.054245, + "city": "East Kingston", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3830, + "latitude": 43.635065, + "longitude": -71.009368, + "city": "East Wakefield", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3832, + "latitude": 43.883871, + "longitude": -71.257726, + "city": "Eaton Center", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3833, + "latitude": 42.951274, + "longitude": -70.922262, + "city": "Exeter", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3835, + "latitude": 43.306172, + "longitude": -71.003435, + "city": "Farmington", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3836, + "latitude": 43.823704, + "longitude": -71.093154, + "city": "Freedom", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3837, + "latitude": 43.446567, + "longitude": -71.299456, + "city": "Gilmanton Iron Works", + "state": "NH", + "county": "Belknap" + }, + { + "zip_code": 3838, + "latitude": 44.050111, + "longitude": -71.265371, + "city": "Glen", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3839, + "latitude": 43.309966, + "longitude": -70.998256, + "city": "Rochester", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3840, + "latitude": 43.038634, + "longitude": -70.809157, + "city": "Greenland", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3841, + "latitude": 42.877438, + "longitude": -71.139098, + "city": "Hampstead", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3842, + "latitude": 42.917389, + "longitude": -70.95095, + "city": "Hampton", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3843, + "latitude": 43.005895, + "longitude": -71.013202, + "city": "Hampton", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3844, + "latitude": 42.891888, + "longitude": -70.982601, + "city": "Hampton Falls", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3845, + "latitude": 44.082716, + "longitude": -71.134348, + "city": "Intervale", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3846, + "latitude": 43.883871, + "longitude": -71.257726, + "city": "Jackson", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3847, + "latitude": 43.883871, + "longitude": -71.257726, + "city": "Kearsarge", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3848, + "latitude": 42.909731, + "longitude": -71.102933, + "city": "Kingston", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3849, + "latitude": 43.902311, + "longitude": -71.124612, + "city": "Madison", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3850, + "latitude": 43.707657, + "longitude": -71.301681, + "city": "Melvin Village", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3851, + "latitude": 43.422942, + "longitude": -71.011369, + "city": "Milton", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3852, + "latitude": 43.326734, + "longitude": -71.028427, + "city": "Milton Mills", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3853, + "latitude": 43.646319, + "longitude": -71.282068, + "city": "Mirror Lake", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3854, + "latitude": 43.064938, + "longitude": -70.721596, + "city": "New Castle", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3855, + "latitude": 43.459503, + "longitude": -71.119055, + "city": "New Durham", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3856, + "latitude": 43.037363, + "longitude": -70.978211, + "city": "Newfields", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3857, + "latitude": 42.979021, + "longitude": -70.891642, + "city": "Newmarket", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3858, + "latitude": 42.937092, + "longitude": -71.006898, + "city": "Newton", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3859, + "latitude": 42.861915, + "longitude": -71.04002, + "city": "Newton Junction", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3860, + "latitude": 43.784643, + "longitude": -71.10263, + "city": "North Conway", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3862, + "latitude": 43.00027, + "longitude": -70.913947, + "city": "North Hampton", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3864, + "latitude": 43.667352, + "longitude": -71.153338, + "city": "Ossipee", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3865, + "latitude": 42.937838, + "longitude": -70.926206, + "city": "Plaistow", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3866, + "latitude": 43.41176, + "longitude": -71.027303, + "city": "Rochester", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3867, + "latitude": 43.326831, + "longitude": -70.993148, + "city": "Rochester", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3868, + "latitude": 43.349689, + "longitude": -70.945161, + "city": "Rochester", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3869, + "latitude": 43.16136, + "longitude": -70.942666, + "city": "Rollinsford", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3870, + "latitude": 43.010939, + "longitude": -70.764813, + "city": "Rye", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3871, + "latitude": 42.980639, + "longitude": -70.771896, + "city": "Rye Beach", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3872, + "latitude": 43.570694, + "longitude": -71.079427, + "city": "Sanbornville", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3873, + "latitude": 42.922666, + "longitude": -71.174262, + "city": "Sandown", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3874, + "latitude": 42.964415, + "longitude": -70.819897, + "city": "Seabrook", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3875, + "latitude": 43.855269, + "longitude": -71.176182, + "city": "Silver Lake", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3878, + "latitude": 43.229489, + "longitude": -70.958264, + "city": "Somersworth", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3882, + "latitude": 43.704702, + "longitude": -70.990155, + "city": "Effingham", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3883, + "latitude": 43.883871, + "longitude": -71.257726, + "city": "South Tamworth", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3884, + "latitude": 43.256871, + "longitude": -71.171886, + "city": "Strafford", + "state": "NH", + "county": "Strafford" + }, + { + "zip_code": 3885, + "latitude": 43.01295, + "longitude": -70.882134, + "city": "Stratham", + "state": "NH", + "county": "Rockingham" + }, + { + "zip_code": 3886, + "latitude": 43.647527, + "longitude": -71.277779, + "city": "Tamworth", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3887, + "latitude": 43.459999, + "longitude": -71.040842, + "city": "Union", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3890, + "latitude": 43.811782, + "longitude": -71.194586, + "city": "West Ossipee", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3894, + "latitude": 43.667102, + "longitude": -71.183597, + "city": "Wolfeboro", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3896, + "latitude": 43.589157, + "longitude": -71.218894, + "city": "Wolfeboro Falls", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3897, + "latitude": 43.883871, + "longitude": -71.257726, + "city": "Wonalancet", + "state": "NH", + "county": "Carroll" + }, + { + "zip_code": 3901, + "latitude": 43.279539, + "longitude": -70.740013, + "city": "Berwick", + "state": "ME", + "county": "York" + }, + { + "zip_code": 3902, + "latitude": 43.245785, + "longitude": -70.664719, + "city": "Cape Neddick", + "state": "ME", + "county": "York" + }, + { + "zip_code": 3903, + "latitude": 43.182729, + "longitude": -70.745759, + "city": "Eliot", + "state": "ME", + "county": "York" + }, + { + "zip_code": 3904, + "latitude": 43.191554, + "longitude": -70.684607, + "city": "Kittery", + "state": "ME", + "county": "York" + }, + { + "zip_code": 3905, + "latitude": 43.094746, + "longitude": -70.68928, + "city": "Kittery Point", + "state": "ME", + "county": "York" + }, + { + "zip_code": 3906, + "latitude": 43.340626, + "longitude": -70.753996, + "city": "North Berwick", + "state": "ME", + "county": "York" + }, + { + "zip_code": 3907, + "latitude": 43.350806, + "longitude": -70.731498, + "city": "Ogunquit", + "state": "ME", + "county": "York" + }, + { + "zip_code": 3908, + "latitude": 43.227549, + "longitude": -70.71171, + "city": "South Berwick", + "state": "ME", + "county": "York" + }, + { + "zip_code": 3909, + "latitude": 43.237891, + "longitude": -70.69099, + "city": "York", + "state": "ME", + "county": "York" + }, + { + "zip_code": 3910, + "latitude": 43.211674, + "longitude": -70.73201, + "city": "York Beach", + "state": "ME", + "county": "York" + }, + { + "zip_code": 3911, + "latitude": 43.155465, + "longitude": -70.635702, + "city": "York Harbor", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4001, + "latitude": 43.520752, + "longitude": -70.804588, + "city": "Acton", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4002, + "latitude": 43.467224, + "longitude": -70.738992, + "city": "Alfred", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4003, + "latitude": 43.735867, + "longitude": -69.995456, + "city": "Bailey Island", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4004, + "latitude": 43.365658, + "longitude": -70.604379, + "city": "Bar Mills", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4005, + "latitude": 43.532376, + "longitude": -70.651859, + "city": "Biddeford", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4006, + "latitude": 43.436049, + "longitude": -70.3598, + "city": "Biddeford Pool", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4007, + "latitude": 43.45813, + "longitude": -70.505301, + "city": "Biddeford", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4008, + "latitude": 44.023162, + "longitude": -69.875816, + "city": "Bowdoinham", + "state": "ME", + "county": "Sagadahoc" + }, + { + "zip_code": 4009, + "latitude": 43.939828, + "longitude": -70.747431, + "city": "Bridgton", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4010, + "latitude": 44.163033, + "longitude": -70.739823, + "city": "Brownfield", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4011, + "latitude": 43.935634, + "longitude": -70.340652, + "city": "Brunswick", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4013, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "Bustins Island", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4014, + "latitude": 43.365658, + "longitude": -70.604379, + "city": "Cape Porpoise", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4015, + "latitude": 43.962115, + "longitude": -70.524465, + "city": "Casco", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4016, + "latitude": 44.180965, + "longitude": -70.891727, + "city": "Center Lovell", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4017, + "latitude": 43.727806, + "longitude": -70.120437, + "city": "Chebeague Island", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4019, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "Cliff Island", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4020, + "latitude": 43.77397, + "longitude": -70.791727, + "city": "Cornish", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4021, + "latitude": 43.812676, + "longitude": -70.450494, + "city": "Cumberland Center", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4022, + "latitude": 44.566156, + "longitude": -70.661557, + "city": "Denmark", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4024, + "latitude": 43.844826, + "longitude": -70.688656, + "city": "East Baldwin", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4027, + "latitude": 43.459708, + "longitude": -70.91519, + "city": "Lebanon", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4028, + "latitude": 43.732391, + "longitude": -70.845114, + "city": "East Parsonfield", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4029, + "latitude": 43.867223, + "longitude": -70.547159, + "city": "Sebago", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4030, + "latitude": 43.596921, + "longitude": -70.689681, + "city": "East Waterboro", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4032, + "latitude": 43.864477, + "longitude": -70.097543, + "city": "Freeport", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4033, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "Freeport", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4034, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "Freeport", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4037, + "latitude": 44.044292, + "longitude": -70.964418, + "city": "Fryeburg", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4038, + "latitude": 43.803689, + "longitude": -70.355188, + "city": "Gorham", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4039, + "latitude": 43.878567, + "longitude": -70.328889, + "city": "Gray", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4040, + "latitude": 43.992681, + "longitude": -70.357119, + "city": "Harrison", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4041, + "latitude": 43.879628, + "longitude": -70.826188, + "city": "Hiram", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4042, + "latitude": 43.584232, + "longitude": -70.624391, + "city": "Hollis Center", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4043, + "latitude": 43.494679, + "longitude": -70.54921, + "city": "Kennebunk", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4046, + "latitude": 43.534125, + "longitude": -70.607475, + "city": "Kennebunkport", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4047, + "latitude": 43.744987, + "longitude": -70.909196, + "city": "Parsonsfield", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4048, + "latitude": 43.661222, + "longitude": -70.83448, + "city": "Limerick", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4049, + "latitude": 43.703854, + "longitude": -70.748668, + "city": "Limington", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4050, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "Long Island", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4051, + "latitude": 44.139839, + "longitude": -70.886741, + "city": "Lovell", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4053, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "Merepoint", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4054, + "latitude": 43.276341, + "longitude": -70.597752, + "city": "Moody", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4055, + "latitude": 43.957208, + "longitude": -70.639546, + "city": "Naples", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4056, + "latitude": 43.658378, + "longitude": -70.868871, + "city": "Newfield", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4057, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "North Bridgton", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4061, + "latitude": 43.54209, + "longitude": -70.710773, + "city": "North Waterboro", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4062, + "latitude": 43.911381, + "longitude": -70.396652, + "city": "Windham", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4063, + "latitude": 43.504889, + "longitude": -70.385703, + "city": "Ocean Park", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4064, + "latitude": 43.411837, + "longitude": -70.469526, + "city": "Old Orchard Beach", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4066, + "latitude": 43.779982, + "longitude": -69.975477, + "city": "Orrs Island", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4068, + "latitude": 43.848322, + "longitude": -70.935379, + "city": "Porter", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4069, + "latitude": 43.894983, + "longitude": -70.189159, + "city": "Pownal", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4070, + "latitude": 43.576983, + "longitude": -70.273642, + "city": "Scarborough", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4071, + "latitude": 43.906227, + "longitude": -70.465928, + "city": "Raymond", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4072, + "latitude": 43.541241, + "longitude": -70.666387, + "city": "Saco", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4073, + "latitude": 43.576196, + "longitude": -70.630569, + "city": "Sanford", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4074, + "latitude": 43.724562, + "longitude": -70.375162, + "city": "Scarborough", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4075, + "latitude": 43.796053, + "longitude": -70.552183, + "city": "Sebago Lake", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4076, + "latitude": 43.510275, + "longitude": -70.77159, + "city": "Shapleigh", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4077, + "latitude": 43.910029, + "longitude": -70.524524, + "city": "South Casco", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4078, + "latitude": 43.820774, + "longitude": -70.120781, + "city": "South Freeport", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4079, + "latitude": 43.78105, + "longitude": -69.995537, + "city": "Harpswell", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4081, + "latitude": 44.566156, + "longitude": -70.661557, + "city": "South Waterford", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4082, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "South Windham", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4083, + "latitude": 43.465941, + "longitude": -70.748295, + "city": "Springvale", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4084, + "latitude": 43.804454, + "longitude": -70.554905, + "city": "Standish", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4085, + "latitude": 43.771934, + "longitude": -70.639561, + "city": "Steep Falls", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4086, + "latitude": 43.981404, + "longitude": -69.937793, + "city": "Topsham", + "state": "ME", + "county": "Sagadahoc" + }, + { + "zip_code": 4087, + "latitude": 43.573684, + "longitude": -70.749181, + "city": "Waterboro", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4088, + "latitude": 44.566156, + "longitude": -70.661557, + "city": "Waterford", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4090, + "latitude": 43.429659, + "longitude": -70.671274, + "city": "Wells", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4091, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "West Baldwin", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4092, + "latitude": 43.855116, + "longitude": -70.568534, + "city": "Westbrook", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4093, + "latitude": 43.653805, + "longitude": -70.622959, + "city": "Buxton", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4094, + "latitude": 43.406101, + "longitude": -70.573255, + "city": "West Kennebunk", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4095, + "latitude": 43.601018, + "longitude": -70.902676, + "city": "West Newfield", + "state": "ME", + "county": "York" + }, + { + "zip_code": 4096, + "latitude": 43.798227, + "longitude": -70.171979, + "city": "Yarmouth", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4097, + "latitude": 43.837951, + "longitude": -70.200114, + "city": "North Yarmouth", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4098, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "Westbrook", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4101, + "latitude": 43.658784, + "longitude": -70.262393, + "city": "Portland", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4102, + "latitude": 43.74275, + "longitude": -70.44338, + "city": "Portland", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4103, + "latitude": 43.68826, + "longitude": -70.289844, + "city": "Portland", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4104, + "latitude": 43.84649, + "longitude": -70.464839, + "city": "Portland", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4105, + "latitude": 43.73928, + "longitude": -70.270696, + "city": "Falmouth", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4106, + "latitude": 43.627364, + "longitude": -70.289248, + "city": "South Portland", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4107, + "latitude": 43.595512, + "longitude": -70.239559, + "city": "Cape Elizabeth", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4108, + "latitude": 43.662809, + "longitude": -70.188442, + "city": "Peaks Island", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4109, + "latitude": 43.678339, + "longitude": -70.198742, + "city": "Portland", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4110, + "latitude": 43.759021, + "longitude": -70.199307, + "city": "Cumberland Foreside", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4112, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "Portland", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4116, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "South Portland", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4122, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "Portland", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4123, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "Portland", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4124, + "latitude": 44.408078, + "longitude": -70.470703, + "city": "Portland", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4210, + "latitude": 44.087422, + "longitude": -70.243848, + "city": "Auburn", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4211, + "latitude": 44.197009, + "longitude": -70.239485, + "city": "Auburn", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4212, + "latitude": 44.197009, + "longitude": -70.239485, + "city": "Auburn", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4216, + "latitude": 44.56816, + "longitude": -70.704051, + "city": "Andover", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4217, + "latitude": 44.428414, + "longitude": -70.770035, + "city": "Bethel", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4219, + "latitude": 44.265009, + "longitude": -70.587095, + "city": "Bryant Pond", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4220, + "latitude": 44.326165, + "longitude": -70.381112, + "city": "Buckfield", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4221, + "latitude": 44.38575, + "longitude": -70.311314, + "city": "Canton", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4222, + "latitude": 43.968378, + "longitude": -70.184618, + "city": "Durham", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4223, + "latitude": 44.023873, + "longitude": -70.285748, + "city": "Danville", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4224, + "latitude": 44.553968, + "longitude": -70.422541, + "city": "Dixfield", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4225, + "latitude": 44.602705, + "longitude": -70.22651, + "city": "Dryden", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4226, + "latitude": 44.555618, + "longitude": -70.691857, + "city": "East Andover", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4227, + "latitude": 44.579135, + "longitude": -70.326337, + "city": "East Dixfield", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4228, + "latitude": 44.197009, + "longitude": -70.239485, + "city": "East Livermore", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4230, + "latitude": 44.062672, + "longitude": -70.327049, + "city": "East Poland", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4231, + "latitude": 44.313283, + "longitude": -70.861797, + "city": "Stoneham", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4234, + "latitude": 44.617509, + "longitude": -70.182012, + "city": "East Wilton", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4236, + "latitude": 44.189655, + "longitude": -70.136683, + "city": "Greene", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4237, + "latitude": 44.494347, + "longitude": -70.735691, + "city": "Hanover", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4238, + "latitude": 44.22564, + "longitude": -70.372831, + "city": "Hebron", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4239, + "latitude": 44.541508, + "longitude": -70.208556, + "city": "Jay", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4240, + "latitude": 44.086323, + "longitude": -70.169297, + "city": "Lewiston", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4241, + "latitude": 44.197009, + "longitude": -70.239485, + "city": "Lewiston", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4243, + "latitude": 44.197009, + "longitude": -70.239485, + "city": "Lewiston", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4250, + "latitude": 44.033026, + "longitude": -70.101247, + "city": "Lisbon", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4252, + "latitude": 44.032476, + "longitude": -70.068046, + "city": "Lisbon Falls", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4253, + "latitude": 44.297416, + "longitude": -70.189139, + "city": "Livermore", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4254, + "latitude": 44.242189, + "longitude": -70.188508, + "city": "Livermore Falls", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4255, + "latitude": 44.401595, + "longitude": -70.708774, + "city": "Greenwood", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4256, + "latitude": 44.079644, + "longitude": -70.272624, + "city": "Mechanic Falls", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4257, + "latitude": 44.570265, + "longitude": -70.516131, + "city": "Mexico", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4258, + "latitude": 44.146121, + "longitude": -70.339859, + "city": "Minot", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4259, + "latitude": 44.349166, + "longitude": -69.870181, + "city": "Monmouth", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4260, + "latitude": 43.967474, + "longitude": -70.299687, + "city": "New Gloucester", + "state": "ME", + "county": "Cumberland" + }, + { + "zip_code": 4261, + "latitude": 44.689526, + "longitude": -71.011246, + "city": "Newry", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4262, + "latitude": 45.063384, + "longitude": -70.381639, + "city": "North Jay", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4263, + "latitude": 44.292089, + "longitude": -70.135366, + "city": "Leeds", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4265, + "latitude": 44.303359, + "longitude": -70.037848, + "city": "North Monmouth", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4266, + "latitude": 44.357987, + "longitude": -70.255783, + "city": "North Turner", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4267, + "latitude": 44.566156, + "longitude": -70.661557, + "city": "North Waterford", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4268, + "latitude": 44.280503, + "longitude": -70.691576, + "city": "Norway", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4270, + "latitude": 44.284385, + "longitude": -70.507791, + "city": "Oxford", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4271, + "latitude": 44.264111, + "longitude": -70.498513, + "city": "Paris", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4274, + "latitude": 44.047435, + "longitude": -70.389923, + "city": "Poland", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4275, + "latitude": 44.566156, + "longitude": -70.661557, + "city": "Roxbury", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4276, + "latitude": 44.523556, + "longitude": -70.638174, + "city": "Rumford", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4278, + "latitude": 44.377031, + "longitude": -70.568041, + "city": "Rumford Center", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4280, + "latitude": 44.126723, + "longitude": -70.126922, + "city": "Sabattus", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4281, + "latitude": 44.353052, + "longitude": -70.607841, + "city": "South Paris", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4282, + "latitude": 44.265473, + "longitude": -70.254155, + "city": "Turner", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4283, + "latitude": 44.197009, + "longitude": -70.239485, + "city": "Turner Center", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4284, + "latitude": 44.359835, + "longitude": -70.074555, + "city": "Wayne", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4285, + "latitude": 45.063384, + "longitude": -70.381639, + "city": "Weld", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4286, + "latitude": 44.40205, + "longitude": -70.860094, + "city": "West Bethel", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4287, + "latitude": 44.057514, + "longitude": -69.965553, + "city": "Bowdoin", + "state": "ME", + "county": "Sagadahoc" + }, + { + "zip_code": 4288, + "latitude": 44.197009, + "longitude": -70.239485, + "city": "West Minot", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4289, + "latitude": 44.340438, + "longitude": -70.543265, + "city": "West Paris", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4290, + "latitude": 44.477183, + "longitude": -70.436722, + "city": "Peru", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4291, + "latitude": 44.040857, + "longitude": -70.453006, + "city": "West Poland", + "state": "ME", + "county": "Androscoggin" + }, + { + "zip_code": 4292, + "latitude": 44.3189, + "longitude": -70.477506, + "city": "Sumner", + "state": "ME", + "county": "Oxford" + }, + { + "zip_code": 4294, + "latitude": 44.618873, + "longitude": -70.245935, + "city": "Wilton", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4330, + "latitude": 44.351642, + "longitude": -69.803773, + "city": "Augusta", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4332, + "latitude": 44.414056, + "longitude": -69.751913, + "city": "Augusta", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4333, + "latitude": 44.414056, + "longitude": -69.751913, + "city": "Augusta", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4336, + "latitude": 44.315693, + "longitude": -69.818009, + "city": "Augusta", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4338, + "latitude": 44.414056, + "longitude": -69.751913, + "city": "Augusta", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4341, + "latitude": 44.258771, + "longitude": -69.551024, + "city": "Coopers Mills", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4342, + "latitude": 44.077448, + "longitude": -69.738418, + "city": "Dresden", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4343, + "latitude": 44.414056, + "longitude": -69.751913, + "city": "East Winthrop", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4344, + "latitude": 44.256614, + "longitude": -69.797105, + "city": "Farmingdale", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4345, + "latitude": 44.296652, + "longitude": -69.796909, + "city": "Gardiner", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4346, + "latitude": 44.269959, + "longitude": -69.724135, + "city": "Randolph", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4347, + "latitude": 44.24913, + "longitude": -69.795037, + "city": "Hallowell", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4348, + "latitude": 44.220432, + "longitude": -69.513293, + "city": "Jefferson", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4349, + "latitude": 44.414056, + "longitude": -69.751913, + "city": "Kents Hill", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4350, + "latitude": 44.158104, + "longitude": -69.95404, + "city": "Litchfield", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4351, + "latitude": 44.358014, + "longitude": -69.867001, + "city": "Manchester", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4352, + "latitude": 44.461522, + "longitude": -69.986762, + "city": "Mount Vernon", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4353, + "latitude": 44.188406, + "longitude": -69.575119, + "city": "Whitefield", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4354, + "latitude": 44.39559, + "longitude": -69.4168, + "city": "Palermo", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4355, + "latitude": 44.38484, + "longitude": -69.953716, + "city": "Readfield", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4357, + "latitude": 44.108059, + "longitude": -69.827489, + "city": "Richmond", + "state": "ME", + "county": "Sagadahoc" + }, + { + "zip_code": 4358, + "latitude": 44.375578, + "longitude": -69.586327, + "city": "South China", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4359, + "latitude": 44.183266, + "longitude": -69.777196, + "city": "South Gardiner", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4360, + "latitude": 44.414056, + "longitude": -69.751913, + "city": "Vienna", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4363, + "latitude": 44.414056, + "longitude": -69.751913, + "city": "Windsor", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4364, + "latitude": 44.322865, + "longitude": -69.957627, + "city": "Winthrop", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4401, + "latitude": 45.061744, + "longitude": -68.878893, + "city": "Bangor", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4402, + "latitude": 45.519867, + "longitude": -68.647416, + "city": "Bangor", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4406, + "latitude": 45.184103, + "longitude": -69.233382, + "city": "Abbot", + "state": "ME", + "county": "Piscataquis" + }, + { + "zip_code": 4408, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Aurora", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4410, + "latitude": 45.058864, + "longitude": -68.95432, + "city": "Bradford", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4411, + "latitude": 44.914946, + "longitude": -68.625688, + "city": "Bradley", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4412, + "latitude": 44.83561, + "longitude": -68.783742, + "city": "Brewer", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4413, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Brookton", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4414, + "latitude": 45.310095, + "longitude": -69.029462, + "city": "Brownville", + "state": "ME", + "county": "Piscataquis" + }, + { + "zip_code": 4415, + "latitude": 45.351184, + "longitude": -69.058062, + "city": "Brownville Junction", + "state": "ME", + "county": "Piscataquis" + }, + { + "zip_code": 4416, + "latitude": 44.600448, + "longitude": -68.773241, + "city": "Bucksport", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4417, + "latitude": 44.81782, + "longitude": -68.817481, + "city": "Burlington", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4418, + "latitude": 45.049429, + "longitude": -68.581212, + "city": "Greenbush", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4419, + "latitude": 44.808062, + "longitude": -68.940624, + "city": "Carmel", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4420, + "latitude": 44.412968, + "longitude": -68.798047, + "city": "Castine", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4421, + "latitude": 44.415639, + "longitude": -68.792883, + "city": "Castine", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4422, + "latitude": 45.066999, + "longitude": -69.040695, + "city": "Charleston", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4423, + "latitude": 45.039478, + "longitude": -68.529182, + "city": "Costigan", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4424, + "latitude": 45.658831, + "longitude": -67.866054, + "city": "Danforth", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4426, + "latitude": 45.171605, + "longitude": -69.207725, + "city": "Dover Foxcroft", + "state": "ME", + "county": "Piscataquis" + }, + { + "zip_code": 4427, + "latitude": 44.989376, + "longitude": -68.865187, + "city": "Corinth", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4428, + "latitude": 44.79169, + "longitude": -68.577728, + "city": "Eddington", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4429, + "latitude": 44.894294, + "longitude": -68.818345, + "city": "Holden", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4430, + "latitude": 45.233408, + "longitude": -68.689174, + "city": "East Millinocket", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4431, + "latitude": 44.561174, + "longitude": -68.664735, + "city": "East Orland", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4434, + "latitude": 45.519867, + "longitude": -68.647416, + "city": "Etna", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4435, + "latitude": 44.966032, + "longitude": -69.13308, + "city": "Exeter", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4438, + "latitude": 44.632657, + "longitude": -68.849975, + "city": "Frankfort", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4441, + "latitude": 45.792364, + "longitude": -69.30463, + "city": "Greenville", + "state": "ME", + "county": "Piscataquis" + }, + { + "zip_code": 4442, + "latitude": 45.792364, + "longitude": -69.30463, + "city": "Greenville Junction", + "state": "ME", + "county": "Piscataquis" + }, + { + "zip_code": 4443, + "latitude": 45.315976, + "longitude": -69.457444, + "city": "Guilford", + "state": "ME", + "county": "Piscataquis" + }, + { + "zip_code": 4444, + "latitude": 44.835984, + "longitude": -68.829046, + "city": "Hampden", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4448, + "latitude": 45.245635, + "longitude": -68.666632, + "city": "Howland", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4449, + "latitude": 45.006054, + "longitude": -68.884621, + "city": "Hudson", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4450, + "latitude": 44.918877, + "longitude": -68.965803, + "city": "Kenduskeag", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4451, + "latitude": 45.519867, + "longitude": -68.647416, + "city": "Kingman", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4453, + "latitude": 44.787229, + "longitude": -69.21821, + "city": "Lagrange", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4454, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Lambert Lake", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4455, + "latitude": 45.519867, + "longitude": -68.647416, + "city": "Lee", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4456, + "latitude": 44.871231, + "longitude": -69.011636, + "city": "Levant", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4457, + "latitude": 45.366794, + "longitude": -68.49299, + "city": "Lincoln", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4459, + "latitude": 45.519867, + "longitude": -68.647416, + "city": "Mattawamkeag", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4460, + "latitude": 45.618608, + "longitude": -68.543602, + "city": "Medway", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4461, + "latitude": 45.0542, + "longitude": -68.595946, + "city": "Milford", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4462, + "latitude": 45.226479, + "longitude": -68.752091, + "city": "Millinocket", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4463, + "latitude": 45.244612, + "longitude": -68.975988, + "city": "Milo", + "state": "ME", + "county": "Piscataquis" + }, + { + "zip_code": 4464, + "latitude": 45.792364, + "longitude": -69.30463, + "city": "Monson", + "state": "ME", + "county": "Piscataquis" + }, + { + "zip_code": 4467, + "latitude": 45.519867, + "longitude": -68.647416, + "city": "Olamon", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4468, + "latitude": 45.040655, + "longitude": -68.722962, + "city": "Old Town", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4469, + "latitude": 45.002798, + "longitude": -68.63343, + "city": "Orono", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4471, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Orient", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4472, + "latitude": 44.409375, + "longitude": -68.625903, + "city": "Orland", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4473, + "latitude": 45.068848, + "longitude": -68.744361, + "city": "Orono", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4474, + "latitude": 44.842939, + "longitude": -68.782487, + "city": "Orrington", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4475, + "latitude": 45.040668, + "longitude": -68.618775, + "city": "Passadumkeag", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4476, + "latitude": 44.433911, + "longitude": -68.721716, + "city": "Penobscot", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4478, + "latitude": 45.28657, + "longitude": -70.054629, + "city": "Rockwood", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4479, + "latitude": 45.792364, + "longitude": -69.30463, + "city": "Sangerville", + "state": "ME", + "county": "Piscataquis" + }, + { + "zip_code": 4481, + "latitude": 45.792364, + "longitude": -69.30463, + "city": "Sebec", + "state": "ME", + "county": "Piscataquis" + }, + { + "zip_code": 4485, + "latitude": 45.792364, + "longitude": -69.30463, + "city": "Shirley Mills", + "state": "ME", + "county": "Piscataquis" + }, + { + "zip_code": 4487, + "latitude": 45.519867, + "longitude": -68.647416, + "city": "Springfield", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4488, + "latitude": 44.894697, + "longitude": -69.142341, + "city": "Stetson", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4489, + "latitude": 44.922368, + "longitude": -68.686796, + "city": "Stillwater", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4490, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Topsfield", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4491, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Vanceboro", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4492, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Waite", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4493, + "latitude": 45.519867, + "longitude": -68.647416, + "city": "West Enfield", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4495, + "latitude": 45.519867, + "longitude": -68.647416, + "city": "Winn", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4496, + "latitude": 44.65337, + "longitude": -68.917487, + "city": "Winterport", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4497, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Wytopitlock", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4530, + "latitude": 43.867892, + "longitude": -69.826495, + "city": "Bath", + "state": "ME", + "county": "Sagadahoc" + }, + { + "zip_code": 4535, + "latitude": 44.008962, + "longitude": -69.566684, + "city": "Alna", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4536, + "latitude": 44.021333, + "longitude": -69.523263, + "city": "Bayville", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4537, + "latitude": 43.894903, + "longitude": -69.627163, + "city": "Boothbay", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4538, + "latitude": 43.956167, + "longitude": -69.517161, + "city": "Boothbay Harbor", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4539, + "latitude": 43.928967, + "longitude": -69.598725, + "city": "Bristol", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4541, + "latitude": 43.884294, + "longitude": -69.479184, + "city": "Chamberlain", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4543, + "latitude": 43.986485, + "longitude": -69.424228, + "city": "Damariscotta", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4544, + "latitude": 43.82677, + "longitude": -69.597446, + "city": "East Boothbay", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4547, + "latitude": 44.010424, + "longitude": -69.231179, + "city": "Friendship", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4548, + "latitude": 43.805389, + "longitude": -69.745295, + "city": "Georgetown", + "state": "ME", + "county": "Sagadahoc" + }, + { + "zip_code": 4549, + "latitude": 44.021333, + "longitude": -69.523263, + "city": "Isle Of Springs", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4551, + "latitude": 44.010411, + "longitude": -69.440192, + "city": "Bremen", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4552, + "latitude": 44.021333, + "longitude": -69.523263, + "city": "Newagen", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4553, + "latitude": 43.991336, + "longitude": -69.503427, + "city": "Newcastle", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4554, + "latitude": 43.870936, + "longitude": -69.566313, + "city": "New Harbor", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4555, + "latitude": 44.074877, + "longitude": -69.536374, + "city": "Nobleboro", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4556, + "latitude": 43.931748, + "longitude": -69.587334, + "city": "Edgecomb", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4558, + "latitude": 43.896727, + "longitude": -69.509282, + "city": "Pemaquid", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4562, + "latitude": 43.789616, + "longitude": -69.810821, + "city": "Phippsburg", + "state": "ME", + "county": "Sagadahoc" + }, + { + "zip_code": 4563, + "latitude": 44.02301, + "longitude": -69.255572, + "city": "Cushing", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4564, + "latitude": 43.932449, + "longitude": -69.468052, + "city": "Round Pond", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4565, + "latitude": 43.773312, + "longitude": -69.863461, + "city": "Sebasco Estates", + "state": "ME", + "county": "Sagadahoc" + }, + { + "zip_code": 4567, + "latitude": 43.900856, + "longitude": -69.859541, + "city": "Small Point", + "state": "ME", + "county": "Sagadahoc" + }, + { + "zip_code": 4568, + "latitude": 43.877877, + "longitude": -69.612725, + "city": "South Bristol", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4570, + "latitude": 44.021333, + "longitude": -69.523263, + "city": "Squirrel Island", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4571, + "latitude": 43.88261, + "longitude": -69.680144, + "city": "Trevett", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4572, + "latitude": 44.038581, + "longitude": -69.415708, + "city": "Waldoboro", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4573, + "latitude": 43.929821, + "longitude": -69.592127, + "city": "Walpole", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4574, + "latitude": 44.162384, + "longitude": -69.387795, + "city": "Washington", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4575, + "latitude": 43.854534, + "longitude": -69.660795, + "city": "West Boothbay Harbor", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4576, + "latitude": 43.935605, + "longitude": -69.529648, + "city": "Southport", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4578, + "latitude": 43.964901, + "longitude": -69.597134, + "city": "Wiscasset", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4579, + "latitude": 43.938696, + "longitude": -69.764378, + "city": "Woolwich", + "state": "ME", + "county": "Sagadahoc" + }, + { + "zip_code": 4605, + "latitude": 44.477935, + "longitude": -68.356311, + "city": "Ellsworth", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4606, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Addison", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4607, + "latitude": 44.483471, + "longitude": -68.090339, + "city": "Gouldsboro", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4609, + "latitude": 44.362323, + "longitude": -68.305513, + "city": "Bar Harbor", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4611, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Beals", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4612, + "latitude": 44.239876, + "longitude": -68.354598, + "city": "Bernard", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4613, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Birch Harbor", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4614, + "latitude": 44.29691, + "longitude": -68.623927, + "city": "Blue Hill", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4615, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Blue Hill Falls", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4616, + "latitude": 44.258121, + "longitude": -68.567404, + "city": "Brooklin", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4617, + "latitude": 44.337581, + "longitude": -68.765568, + "city": "Brooksville", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4619, + "latitude": 45.188254, + "longitude": -67.389101, + "city": "Calais", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4622, + "latitude": 44.603258, + "longitude": -67.923248, + "city": "Cherryfield", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4623, + "latitude": 44.698608, + "longitude": -67.779881, + "city": "Columbia Falls", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4624, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Corea", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4625, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Cranberry Isles", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4626, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Cutler", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4627, + "latitude": 44.213503, + "longitude": -68.711691, + "city": "Deer Isle", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4628, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Dennysville", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4629, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "East Blue Hill", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4630, + "latitude": 44.70746, + "longitude": -67.46247, + "city": "East Machias", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4631, + "latitude": 45.036287, + "longitude": -67.136853, + "city": "Eastport", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4634, + "latitude": 44.595131, + "longitude": -68.233576, + "city": "Franklin", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4635, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Frenchboro", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4637, + "latitude": 45.185635, + "longitude": -67.601026, + "city": "Grand Lake Stream", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4640, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Hancock", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4642, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Harborside", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4643, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Harrington", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4644, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Hulls Cove", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4645, + "latitude": 44.032196, + "longitude": -69.148017, + "city": "Isle Au Haut", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4646, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Islesford", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4648, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Jonesboro", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4649, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Jonesport", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4650, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Little Deer Isle", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4652, + "latitude": 44.904288, + "longitude": -67.040767, + "city": "Lubec", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4653, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Bass Harbor", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4654, + "latitude": 44.660627, + "longitude": -67.469196, + "city": "Machias", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4655, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Machiasport", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4656, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Manset", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4657, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Meddybemps", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4658, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Milbridge", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4660, + "latitude": 44.334692, + "longitude": -68.308737, + "city": "Mount Desert", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4662, + "latitude": 44.294073, + "longitude": -68.284865, + "city": "Northeast Harbor", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4664, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Sullivan", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4665, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Otter Creek", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4666, + "latitude": 44.930092, + "longitude": -67.156533, + "city": "Pembroke", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4667, + "latitude": 45.013348, + "longitude": -67.097043, + "city": "Perry", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4668, + "latitude": 45.209229, + "longitude": -67.575432, + "city": "Princeton", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4669, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Prospect Harbor", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4671, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Robbinston", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4672, + "latitude": 44.413523, + "longitude": -68.251778, + "city": "Salsbury Cove", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4673, + "latitude": 44.313629, + "longitude": -68.686305, + "city": "Sargentville", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4674, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Seal Cove", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4675, + "latitude": 44.299037, + "longitude": -68.246314, + "city": "Seal Harbor", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4676, + "latitude": 44.399111, + "longitude": -68.701228, + "city": "Sedgwick", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4677, + "latitude": 44.491175, + "longitude": -68.19137, + "city": "Sorrento", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4679, + "latitude": 44.390897, + "longitude": -68.261568, + "city": "Southwest Harbor", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4680, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Steuben", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4681, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Stonington", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4683, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Sunset", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4684, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "Surry", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4685, + "latitude": 44.213118, + "longitude": -68.396479, + "city": "Swans Island", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4686, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Wesley", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4690, + "latitude": 44.641873, + "longitude": -68.391481, + "city": "West Tremont", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4691, + "latitude": 45.002969, + "longitude": -67.495548, + "city": "Whiting", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4693, + "latitude": 44.387188, + "longitude": -68.074964, + "city": "Winter Harbor", + "state": "ME", + "county": "Hancock" + }, + { + "zip_code": 4694, + "latitude": 45.152637, + "longitude": -67.37741, + "city": "Baileyville", + "state": "ME", + "county": "Washington" + }, + { + "zip_code": 4730, + "latitude": 46.121345, + "longitude": -67.833009, + "city": "Houlton", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4732, + "latitude": 46.975725, + "longitude": -68.39816, + "city": "Ashland", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4733, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Benedicta", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4734, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Blaine", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4735, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Bridgewater", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4736, + "latitude": 46.871355, + "longitude": -68.025442, + "city": "Caribou", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4737, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Clayton Lake", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4738, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Crouseville", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4739, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Eagle Lake", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4740, + "latitude": 46.611101, + "longitude": -67.85582, + "city": "Easton", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4741, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Estcourt Station", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4742, + "latitude": 46.746453, + "longitude": -67.841507, + "city": "Fort Fairfield", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4743, + "latitude": 47.056484, + "longitude": -68.255868, + "city": "Fort Kent", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4744, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Fort Kent Mills", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4745, + "latitude": 47.295289, + "longitude": -68.39192, + "city": "Frenchville", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4746, + "latitude": 47.00434, + "longitude": -67.998581, + "city": "Grand Isle", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4747, + "latitude": 46.011345, + "longitude": -68.273154, + "city": "Island Falls", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4750, + "latitude": 46.906749, + "longitude": -67.851979, + "city": "Limestone", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4751, + "latitude": 46.892918, + "longitude": -67.9643, + "city": "Limestone", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4756, + "latitude": 46.934538, + "longitude": -68.109616, + "city": "Madawaska", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4757, + "latitude": 47.007842, + "longitude": -68.182061, + "city": "Mapleton", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4758, + "latitude": 46.551571, + "longitude": -67.84817, + "city": "Mars Hill", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4759, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Masardis", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4760, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Monticello", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4761, + "latitude": 46.100442, + "longitude": -68.003376, + "city": "New Limerick", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4762, + "latitude": 46.976619, + "longitude": -68.205546, + "city": "New Sweden", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4763, + "latitude": 46.09998, + "longitude": -68.14487, + "city": "Oakfield", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4764, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Oxbow", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4765, + "latitude": 45.999084, + "longitude": -68.443112, + "city": "Patten", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4766, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Perham", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4768, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Portage", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4769, + "latitude": 46.715072, + "longitude": -68.012557, + "city": "Presque Isle", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4770, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Quimby", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4772, + "latitude": 47.263956, + "longitude": -68.335025, + "city": "Saint Agatha", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4773, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Saint David", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4774, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Saint Francis", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4775, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Sheridan", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4776, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Sherman Mills", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4777, + "latitude": 45.519867, + "longitude": -68.647416, + "city": "Sherman Station", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4779, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Sinclair", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4780, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Smyrna Mills", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4781, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Wallagrass", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4782, + "latitude": 45.519867, + "longitude": -68.647416, + "city": "Stacyville", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4783, + "latitude": 46.787807, + "longitude": -68.155212, + "city": "Stockholm", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4785, + "latitude": 46.986075, + "longitude": -68.042433, + "city": "Van Buren", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4786, + "latitude": 46.793032, + "longitude": -68.105233, + "city": "Washburn", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4787, + "latitude": 46.594523, + "longitude": -67.930172, + "city": "Westfield", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4788, + "latitude": 46.516166, + "longitude": -68.886826, + "city": "Winterville", + "state": "ME", + "county": "Aroostook" + }, + { + "zip_code": 4841, + "latitude": 44.128607, + "longitude": -69.068648, + "city": "Rockland", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4843, + "latitude": 44.12613, + "longitude": -69.029238, + "city": "Camden", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4846, + "latitude": 44.131005, + "longitude": -69.091111, + "city": "Glen Cove", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4847, + "latitude": 44.241072, + "longitude": -69.203015, + "city": "Hope", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4848, + "latitude": 44.309021, + "longitude": -68.900772, + "city": "Islesboro", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4849, + "latitude": 44.324832, + "longitude": -68.998255, + "city": "Lincolnville", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4850, + "latitude": 44.478694, + "longitude": -69.149559, + "city": "Lincolnville Center", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4851, + "latitude": 44.032196, + "longitude": -69.148017, + "city": "Matinicus", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4852, + "latitude": 44.021333, + "longitude": -69.523263, + "city": "Monhegan", + "state": "ME", + "county": "Lincoln" + }, + { + "zip_code": 4853, + "latitude": 44.113472, + "longitude": -68.855722, + "city": "North Haven", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4854, + "latitude": 44.07951, + "longitude": -69.085574, + "city": "Owls Head", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4855, + "latitude": 44.032196, + "longitude": -69.148017, + "city": "Port Clyde", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4856, + "latitude": 44.132144, + "longitude": -69.03416, + "city": "Rockport", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4857, + "latitude": 43.995024, + "longitude": -69.198524, + "city": "Saint George", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4858, + "latitude": 44.115186, + "longitude": -69.132883, + "city": "South Thomaston", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4859, + "latitude": 44.002248, + "longitude": -69.11955, + "city": "Spruce Head", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4860, + "latitude": 43.963129, + "longitude": -69.213329, + "city": "Tenants Harbor", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4861, + "latitude": 44.108131, + "longitude": -69.042704, + "city": "Thomaston", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4862, + "latitude": 44.231517, + "longitude": -69.219722, + "city": "Union", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4863, + "latitude": 44.08511, + "longitude": -68.841965, + "city": "Vinalhaven", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4864, + "latitude": 44.086333, + "longitude": -69.188163, + "city": "Warren", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4865, + "latitude": 44.192369, + "longitude": -69.121139, + "city": "West Rockport", + "state": "ME", + "county": "Knox" + }, + { + "zip_code": 4901, + "latitude": 44.554321, + "longitude": -69.617809, + "city": "Waterville", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4903, + "latitude": 44.549225, + "longitude": -69.713178, + "city": "Waterville", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4910, + "latitude": 44.530366, + "longitude": -69.639976, + "city": "Albion", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4911, + "latitude": 44.81062, + "longitude": -69.912885, + "city": "Anson", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4912, + "latitude": 44.9227, + "longitude": -69.67668, + "city": "Athens", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4915, + "latitude": 44.404619, + "longitude": -69.040297, + "city": "Belfast", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4917, + "latitude": 44.480594, + "longitude": -69.83253, + "city": "Belgrade", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4918, + "latitude": 44.414056, + "longitude": -69.751913, + "city": "Belgrade Lakes", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4920, + "latitude": 45.575731, + "longitude": -69.909773, + "city": "Bingham", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4921, + "latitude": 44.579387, + "longitude": -69.175448, + "city": "Brooks", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4922, + "latitude": 44.677388, + "longitude": -69.378829, + "city": "Burnham", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4923, + "latitude": 45.036055, + "longitude": -69.438697, + "city": "Cambridge", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4924, + "latitude": 44.743659, + "longitude": -69.585151, + "city": "Canaan", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4925, + "latitude": 45.575731, + "longitude": -69.909773, + "city": "Caratunk", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4926, + "latitude": 44.391167, + "longitude": -69.538257, + "city": "China Village", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4927, + "latitude": 44.621084, + "longitude": -69.512609, + "city": "Clinton", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4928, + "latitude": 44.944157, + "longitude": -69.228736, + "city": "Corinna", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4929, + "latitude": 44.761527, + "longitude": -69.322662, + "city": "Detroit", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4930, + "latitude": 44.964532, + "longitude": -69.203773, + "city": "Dexter", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4932, + "latitude": 44.6819, + "longitude": -69.121648, + "city": "Dixmont", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4933, + "latitude": 45.519867, + "longitude": -68.647416, + "city": "East Newport", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4935, + "latitude": 44.414056, + "longitude": -69.751913, + "city": "East Vassalboro", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4936, + "latitude": 45.063384, + "longitude": -70.381639, + "city": "Eustis", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4937, + "latitude": 44.646261, + "longitude": -69.680158, + "city": "Fairfield", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4938, + "latitude": 44.650311, + "longitude": -70.129267, + "city": "Farmington", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4939, + "latitude": 45.014913, + "longitude": -69.156965, + "city": "Garland", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4940, + "latitude": 44.622563, + "longitude": -70.075178, + "city": "Farmington Falls", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4941, + "latitude": 44.488583, + "longitude": -69.339221, + "city": "Freedom", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4942, + "latitude": 44.973047, + "longitude": -69.548148, + "city": "Harmony", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4943, + "latitude": 44.896404, + "longitude": -69.464092, + "city": "Hartland", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4944, + "latitude": 44.684737, + "longitude": -69.6425, + "city": "Hinckley", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4945, + "latitude": 44.883675, + "longitude": -69.452187, + "city": "Jackman", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4947, + "latitude": 45.063384, + "longitude": -70.381639, + "city": "Kingfield", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4949, + "latitude": 44.371549, + "longitude": -69.15555, + "city": "Liberty", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4950, + "latitude": 44.786404, + "longitude": -69.805662, + "city": "Madison", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4951, + "latitude": 44.478694, + "longitude": -69.149559, + "city": "Monroe", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4952, + "latitude": 44.39785, + "longitude": -69.142182, + "city": "Morrill", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4953, + "latitude": 44.863406, + "longitude": -69.266827, + "city": "Newport", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4954, + "latitude": 45.575731, + "longitude": -69.909773, + "city": "New Portland", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4955, + "latitude": 44.60363, + "longitude": -70.010292, + "city": "New Sharon", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4956, + "latitude": 44.952578, + "longitude": -70.183554, + "city": "New Vineyard", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4957, + "latitude": 44.707468, + "longitude": -69.818804, + "city": "Norridgewock", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4958, + "latitude": 44.8019, + "longitude": -69.946593, + "city": "North Anson", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4961, + "latitude": 45.575731, + "longitude": -69.909773, + "city": "North New Portland", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4962, + "latitude": 44.479288, + "longitude": -69.622006, + "city": "North Vassalboro", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4963, + "latitude": 44.557111, + "longitude": -69.826495, + "city": "Oakland", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4964, + "latitude": 45.063384, + "longitude": -70.381639, + "city": "Oquossoc", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4965, + "latitude": 44.802655, + "longitude": -69.537715, + "city": "Palmyra", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4966, + "latitude": 45.063384, + "longitude": -70.381639, + "city": "Phillips", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4967, + "latitude": 44.760948, + "longitude": -69.387705, + "city": "Pittsfield", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4969, + "latitude": 44.772503, + "longitude": -69.247539, + "city": "Plymouth", + "state": "ME", + "county": "Penobscot" + }, + { + "zip_code": 4970, + "latitude": 44.985998, + "longitude": -70.660181, + "city": "Rangeley", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4971, + "latitude": 44.93183, + "longitude": -69.403011, + "city": "Saint Albans", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4972, + "latitude": 44.478694, + "longitude": -69.149559, + "city": "Sandy Point", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4973, + "latitude": 44.357201, + "longitude": -69.215906, + "city": "Searsmont", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4974, + "latitude": 44.489412, + "longitude": -68.933051, + "city": "Searsport", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4975, + "latitude": 44.624515, + "longitude": -69.586852, + "city": "Shawmut", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4976, + "latitude": 44.769303, + "longitude": -69.593975, + "city": "Skowhegan", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4978, + "latitude": 44.62111, + "longitude": -69.770923, + "city": "Smithfield", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4979, + "latitude": 44.931415, + "longitude": -69.834764, + "city": "Solon", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4981, + "latitude": 44.501114, + "longitude": -68.891743, + "city": "Stockton Springs", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4982, + "latitude": 45.063384, + "longitude": -70.381639, + "city": "Stratton", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4983, + "latitude": 44.814175, + "longitude": -70.187221, + "city": "Strong", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4984, + "latitude": 44.670079, + "longitude": -70.196855, + "city": "Temple", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 4985, + "latitude": 45.575731, + "longitude": -69.909773, + "city": "West Forks", + "state": "ME", + "county": "Somerset" + }, + { + "zip_code": 4986, + "latitude": 44.513048, + "longitude": -69.183929, + "city": "Thorndike", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4987, + "latitude": 44.478694, + "longitude": -69.149559, + "city": "Troy", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4988, + "latitude": 44.601175, + "longitude": -69.357191, + "city": "Unity", + "state": "ME", + "county": "Waldo" + }, + { + "zip_code": 4989, + "latitude": 44.427757, + "longitude": -69.635908, + "city": "Vassalboro", + "state": "ME", + "county": "Kennebec" + }, + { + "zip_code": 4992, + "latitude": 44.662822, + "longitude": -70.153049, + "city": "West Farmington", + "state": "ME", + "county": "Franklin" + }, + { + "zip_code": 5001, + "latitude": 43.591821, + "longitude": -72.463589, + "city": "White River Junction", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5009, + "latitude": 43.592039, + "longitude": -72.588407, + "city": "White River Junction", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5030, + "latitude": 43.410672, + "longitude": -72.429777, + "city": "Ascutney", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5031, + "latitude": 43.657625, + "longitude": -72.54586, + "city": "Barnard", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5032, + "latitude": 43.758758, + "longitude": -72.688169, + "city": "Bethel", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5033, + "latitude": 44.004691, + "longitude": -72.15845, + "city": "Bradford", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5034, + "latitude": 43.592527, + "longitude": -72.621578, + "city": "Bridgewater", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5035, + "latitude": 43.599795, + "longitude": -72.675164, + "city": "Bridgewater Corners", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5036, + "latitude": 44.017782, + "longitude": -72.577365, + "city": "Brookfield", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5037, + "latitude": 43.467179, + "longitude": -72.488285, + "city": "Brownsville", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5038, + "latitude": 43.994212, + "longitude": -72.457153, + "city": "Chelsea", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5039, + "latitude": 44.033236, + "longitude": -72.293631, + "city": "Corinth", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5040, + "latitude": 44.077918, + "longitude": -72.210962, + "city": "East Corinth", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5041, + "latitude": 43.995961, + "longitude": -72.411393, + "city": "East Randolph", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5042, + "latitude": 44.359629, + "longitude": -72.086586, + "city": "East Ryegate", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5043, + "latitude": 43.807282, + "longitude": -72.214693, + "city": "East Thetford", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5045, + "latitude": 43.928681, + "longitude": -72.196635, + "city": "Fairlee", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5046, + "latitude": 44.281506, + "longitude": -72.207573, + "city": "Groton", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5047, + "latitude": 43.672103, + "longitude": -72.355539, + "city": "Hartford", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5048, + "latitude": 43.573379, + "longitude": -72.402698, + "city": "Hartland", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5049, + "latitude": 43.592039, + "longitude": -72.588407, + "city": "Hartland Four Corners", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5050, + "latitude": 44.46239, + "longitude": -72.135804, + "city": "Mc Indoe Falls", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5051, + "latitude": 44.068284, + "longitude": -72.118739, + "city": "Newbury", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5052, + "latitude": 43.591324, + "longitude": -72.34903, + "city": "North Hartland", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5053, + "latitude": 43.709919, + "longitude": -72.511882, + "city": "North Pomfret", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5054, + "latitude": 43.995961, + "longitude": -72.411393, + "city": "North Thetford", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5055, + "latitude": 43.717918, + "longitude": -72.3612, + "city": "Norwich", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5056, + "latitude": 43.526289, + "longitude": -72.724848, + "city": "Plymouth", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5058, + "latitude": 43.995961, + "longitude": -72.411393, + "city": "Post Mills", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5059, + "latitude": 43.664059, + "longitude": -72.433116, + "city": "Quechee", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5060, + "latitude": 43.985803, + "longitude": -72.694098, + "city": "Randolph", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5061, + "latitude": 43.928552, + "longitude": -72.569113, + "city": "Randolph Center", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5062, + "latitude": 43.47559, + "longitude": -72.572818, + "city": "Reading", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5065, + "latitude": 43.777365, + "longitude": -72.407132, + "city": "Sharon", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5067, + "latitude": 43.697055, + "longitude": -72.508042, + "city": "South Pomfret", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5068, + "latitude": 43.777096, + "longitude": -72.528249, + "city": "South Royalton", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5069, + "latitude": 44.19779, + "longitude": -72.110362, + "city": "South Ryegate", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5070, + "latitude": 43.844018, + "longitude": -72.378546, + "city": "South Strafford", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5071, + "latitude": 43.565888, + "longitude": -72.534106, + "city": "South Woodstock", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5072, + "latitude": 43.892586, + "longitude": -72.369563, + "city": "Strafford", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5073, + "latitude": 43.630897, + "longitude": -72.48908, + "city": "Taftsville", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5074, + "latitude": 43.995961, + "longitude": -72.411393, + "city": "Thetford", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5075, + "latitude": 43.854018, + "longitude": -72.254614, + "city": "Thetford Center", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5076, + "latitude": 43.995961, + "longitude": -72.411393, + "city": "East Corinth", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5077, + "latitude": 43.895465, + "longitude": -72.473372, + "city": "Tunbridge", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5079, + "latitude": 43.952586, + "longitude": -72.311252, + "city": "Vershire", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5081, + "latitude": 44.119395, + "longitude": -72.088869, + "city": "Wells River", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5083, + "latitude": 43.995961, + "longitude": -72.411393, + "city": "West Fairlee", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5084, + "latitude": 43.718535, + "longitude": -72.443862, + "city": "West Hartford", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5085, + "latitude": 43.995961, + "longitude": -72.411393, + "city": "West Newbury", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5086, + "latitude": 44.115326, + "longitude": -72.317918, + "city": "West Topsham", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5088, + "latitude": 43.673484, + "longitude": -72.31196, + "city": "Wilder", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5089, + "latitude": 43.5181, + "longitude": -72.418059, + "city": "Windsor", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5091, + "latitude": 43.631348, + "longitude": -72.512835, + "city": "Woodstock", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5101, + "latitude": 43.171185, + "longitude": -72.623106, + "city": "Bellows Falls", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5141, + "latitude": 42.99467, + "longitude": -72.720362, + "city": "Cambridgeport", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5142, + "latitude": 43.402135, + "longitude": -72.583854, + "city": "Cavendish", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5143, + "latitude": 43.298315, + "longitude": -72.667167, + "city": "Chester", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5144, + "latitude": 43.592039, + "longitude": -72.588407, + "city": "Chester Depot", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5146, + "latitude": 43.179936, + "longitude": -72.605636, + "city": "Grafton", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5148, + "latitude": 43.228101, + "longitude": -72.787995, + "city": "Londonderry", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5149, + "latitude": 43.376744, + "longitude": -72.706913, + "city": "Ludlow", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5150, + "latitude": 43.33803, + "longitude": -72.527652, + "city": "North Springfield", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5151, + "latitude": 43.409654, + "longitude": -72.495851, + "city": "Perkinsville", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5152, + "latitude": 43.09893, + "longitude": -73.034944, + "city": "Peru", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5153, + "latitude": 43.439854, + "longitude": -72.620659, + "city": "Proctorsville", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5154, + "latitude": 43.164738, + "longitude": -72.53194, + "city": "Saxtons River", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5155, + "latitude": 43.169854, + "longitude": -72.851525, + "city": "South Londonderry", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5156, + "latitude": 43.40971, + "longitude": -72.586064, + "city": "Springfield", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5158, + "latitude": 43.082635, + "longitude": -72.474882, + "city": "Westminster", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5159, + "latitude": 43.093972, + "longitude": -72.456492, + "city": "Westminster Station", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5161, + "latitude": 43.316142, + "longitude": -72.739715, + "city": "Weston", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5201, + "latitude": 42.934076, + "longitude": -73.105382, + "city": "Bennington", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5250, + "latitude": 43.065719, + "longitude": -73.134727, + "city": "Arlington", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5251, + "latitude": 43.261817, + "longitude": -73.139173, + "city": "Dorset", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5252, + "latitude": 43.069409, + "longitude": -73.165898, + "city": "East Arlington", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5253, + "latitude": 43.182502, + "longitude": -73.065443, + "city": "East Dorset", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5254, + "latitude": 43.177204, + "longitude": -73.045787, + "city": "Manchester", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5255, + "latitude": 43.169289, + "longitude": -73.047358, + "city": "Manchester Center", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5257, + "latitude": 42.966471, + "longitude": -73.250529, + "city": "North Bennington", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5260, + "latitude": 42.829469, + "longitude": -73.262496, + "city": "North Pownal", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5261, + "latitude": 42.790682, + "longitude": -73.201254, + "city": "Pownal", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5262, + "latitude": 42.979702, + "longitude": -73.192929, + "city": "Shaftsbury", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5301, + "latitude": 42.884281, + "longitude": -72.760753, + "city": "Brattleboro", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5302, + "latitude": 42.99467, + "longitude": -72.720362, + "city": "Brattleboro", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5303, + "latitude": 42.99467, + "longitude": -72.720362, + "city": "Brattleboro", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5304, + "latitude": 42.99467, + "longitude": -72.720362, + "city": "Brattleboro", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5340, + "latitude": 43.16409, + "longitude": -72.91514, + "city": "Bondville", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5341, + "latitude": 42.968046, + "longitude": -72.812012, + "city": "East Dover", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5342, + "latitude": 42.795363, + "longitude": -72.817838, + "city": "Jacksonville", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5343, + "latitude": 43.012776, + "longitude": -72.767275, + "city": "Jamaica", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5344, + "latitude": 42.99467, + "longitude": -72.720362, + "city": "Marlboro", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5345, + "latitude": 43.013138, + "longitude": -72.678725, + "city": "Newfane", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5346, + "latitude": 43.016096, + "longitude": -72.534025, + "city": "Putney", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5350, + "latitude": 42.785591, + "longitude": -72.971932, + "city": "Readsboro", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5351, + "latitude": 42.939071, + "longitude": -72.72923, + "city": "South Newfane", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5352, + "latitude": 42.782616, + "longitude": -73.067501, + "city": "Stamford", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5353, + "latitude": 43.070341, + "longitude": -72.672991, + "city": "Townshend", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5354, + "latitude": 42.773711, + "longitude": -72.520166, + "city": "Vernon", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5355, + "latitude": 43.00476, + "longitude": -72.792004, + "city": "Wardsboro", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5356, + "latitude": 43.013041, + "longitude": -72.793787, + "city": "West Dover", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5357, + "latitude": 42.957233, + "longitude": -72.62408, + "city": "West Dummerston", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5358, + "latitude": 42.766519, + "longitude": -72.745723, + "city": "West Halifax", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5359, + "latitude": 43.133864, + "longitude": -72.714573, + "city": "West Townshend", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5360, + "latitude": 43.050937, + "longitude": -72.825636, + "city": "West Wardsboro", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5361, + "latitude": 42.78318, + "longitude": -72.867891, + "city": "Whitingham", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5362, + "latitude": 42.975027, + "longitude": -72.673566, + "city": "Williamsville", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5363, + "latitude": 42.944039, + "longitude": -72.727518, + "city": "Wilmington", + "state": "VT", + "county": "Windham" + }, + { + "zip_code": 5401, + "latitude": 44.507404, + "longitude": -73.151384, + "city": "Burlington", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5402, + "latitude": 44.442117, + "longitude": -73.082525, + "city": "Burlington", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5403, + "latitude": 44.448119, + "longitude": -73.098238, + "city": "South Burlington", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5404, + "latitude": 44.498032, + "longitude": -73.182158, + "city": "Winooski", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5405, + "latitude": 44.442117, + "longitude": -73.082525, + "city": "Burlington", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5406, + "latitude": 44.442117, + "longitude": -73.082525, + "city": "Burlington", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5407, + "latitude": 44.442117, + "longitude": -73.082525, + "city": "South Burlington", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5439, + "latitude": 44.49518, + "longitude": -73.165092, + "city": "Colchester", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5440, + "latitude": 44.93606, + "longitude": -73.289065, + "city": "Alburg", + "state": "VT", + "county": "Grand Isle" + }, + { + "zip_code": 5441, + "latitude": 44.836967, + "longitude": -72.92169, + "city": "Bakersfield", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5442, + "latitude": 44.724842, + "longitude": -72.701554, + "city": "Belvidere Center", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5443, + "latitude": 44.157814, + "longitude": -73.071813, + "city": "Bristol", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5444, + "latitude": 44.62218, + "longitude": -72.881162, + "city": "Cambridge", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5445, + "latitude": 44.31658, + "longitude": -73.226034, + "city": "Charlotte", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5446, + "latitude": 44.535557, + "longitude": -73.103897, + "city": "Colchester", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5447, + "latitude": 44.824855, + "longitude": -72.895849, + "city": "East Berkshire", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5448, + "latitude": 44.741186, + "longitude": -72.882683, + "city": "East Fairfield", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5449, + "latitude": 44.442117, + "longitude": -73.082525, + "city": "Colchester", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5450, + "latitude": 44.902044, + "longitude": -72.782425, + "city": "Enosburg Falls", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5451, + "latitude": 44.50835, + "longitude": -73.050271, + "city": "Essex", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5452, + "latitude": 44.485558, + "longitude": -73.025271, + "city": "Essex Junction", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5453, + "latitude": 44.442117, + "longitude": -73.082525, + "city": "Essex Junction", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5454, + "latitude": 44.733486, + "longitude": -72.953478, + "city": "Fairfax", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5455, + "latitude": 44.816159, + "longitude": -72.969743, + "city": "Fairfield", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5456, + "latitude": 44.210886, + "longitude": -73.256629, + "city": "Ferrisburg", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5457, + "latitude": 44.96038, + "longitude": -72.913261, + "city": "Franklin", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5458, + "latitude": 44.723391, + "longitude": -73.303193, + "city": "Grand Isle", + "state": "VT", + "county": "Grand Isle" + }, + { + "zip_code": 5459, + "latitude": 44.962395, + "longitude": -73.033062, + "city": "Highgate Center", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5460, + "latitude": 44.974765, + "longitude": -73.105205, + "city": "Highgate Springs", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5461, + "latitude": 44.4553, + "longitude": -73.067858, + "city": "Hinesburg", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5462, + "latitude": 44.318091, + "longitude": -73.006184, + "city": "Huntington", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5463, + "latitude": 44.878094, + "longitude": -73.338597, + "city": "Isle La Motte", + "state": "VT", + "county": "Grand Isle" + }, + { + "zip_code": 5464, + "latitude": 44.638789, + "longitude": -72.82199, + "city": "Jeffersonville", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5465, + "latitude": 44.458996, + "longitude": -72.955175, + "city": "Jericho", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5466, + "latitude": 44.362504, + "longitude": -73.019801, + "city": "Jonesville", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5468, + "latitude": 44.643418, + "longitude": -73.121685, + "city": "Milton", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5469, + "latitude": 44.240375, + "longitude": -73.134702, + "city": "Monkton", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5470, + "latitude": 44.824855, + "longitude": -72.895849, + "city": "Montgomery", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5471, + "latitude": 44.848241, + "longitude": -72.619812, + "city": "Montgomery Center", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5472, + "latitude": 44.149509, + "longitude": -73.197156, + "city": "New Haven", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5473, + "latitude": 44.239233, + "longitude": -73.205939, + "city": "North Ferrisburg", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5474, + "latitude": 44.835274, + "longitude": -73.277846, + "city": "North Hero", + "state": "VT", + "county": "Grand Isle" + }, + { + "zip_code": 5476, + "latitude": 44.952669, + "longitude": -72.65435, + "city": "Richford", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5477, + "latitude": 44.387289, + "longitude": -72.953283, + "city": "Richmond", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5478, + "latitude": 44.779982, + "longitude": -72.908985, + "city": "Saint Albans", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5479, + "latitude": 44.824855, + "longitude": -72.895849, + "city": "Saint Albans", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5481, + "latitude": 44.824855, + "longitude": -72.895849, + "city": "Saint Albans Bay", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5482, + "latitude": 44.42493, + "longitude": -73.114047, + "city": "Shelburne", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5483, + "latitude": 44.897751, + "longitude": -72.961075, + "city": "Sheldon", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5485, + "latitude": 44.905573, + "longitude": -72.963154, + "city": "Sheldon Springs", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5486, + "latitude": 44.738156, + "longitude": -73.306352, + "city": "South Hero", + "state": "VT", + "county": "Grand Isle" + }, + { + "zip_code": 5487, + "latitude": 44.235203, + "longitude": -73.02086, + "city": "Starksboro", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5488, + "latitude": 44.902128, + "longitude": -72.948391, + "city": "Swanton", + "state": "VT", + "county": "Franklin" + }, + { + "zip_code": 5489, + "latitude": 44.565148, + "longitude": -72.907209, + "city": "Underhill", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5490, + "latitude": 44.504656, + "longitude": -72.885253, + "city": "Underhill Center", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5491, + "latitude": 44.145691, + "longitude": -73.260487, + "city": "Vergennes", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5492, + "latitude": 44.736083, + "longitude": -72.703199, + "city": "Waterville", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5494, + "latitude": 44.56959, + "longitude": -73.025541, + "city": "Westford", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5495, + "latitude": 44.430096, + "longitude": -73.026735, + "city": "Williston", + "state": "VT", + "county": "Chittenden" + }, + { + "zip_code": 5501, + "latitude": 42.647191, + "longitude": -71.184202, + "city": "Andover", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 5544, + "latitude": 42.647191, + "longitude": -71.184202, + "city": "Andover", + "state": "MA", + "county": "Essex" + }, + { + "zip_code": 5601, + "latitude": 44.19906, + "longitude": -72.559638, + "city": "Montpelier", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5602, + "latitude": 44.26829, + "longitude": -72.623619, + "city": "Montpelier", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5603, + "latitude": 44.156554, + "longitude": -72.655892, + "city": "Montpelier", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5604, + "latitude": 44.259518, + "longitude": -72.585018, + "city": "Montpelier", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5609, + "latitude": 44.259518, + "longitude": -72.585018, + "city": "Montpelier", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5620, + "latitude": 44.259518, + "longitude": -72.585018, + "city": "Montpelier", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5633, + "latitude": 44.259518, + "longitude": -72.585018, + "city": "Montpelier", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5640, + "latitude": 44.174872, + "longitude": -72.502235, + "city": "Adamant", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5641, + "latitude": 44.20896, + "longitude": -72.607693, + "city": "Barre", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5647, + "latitude": 44.266228, + "longitude": -72.530473, + "city": "Cabot", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5648, + "latitude": 44.259518, + "longitude": -72.585018, + "city": "Calais", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5649, + "latitude": 44.157636, + "longitude": -72.453261, + "city": "East Barre", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5650, + "latitude": 44.407044, + "longitude": -72.498572, + "city": "East Calais", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5651, + "latitude": 44.279376, + "longitude": -72.49657, + "city": "East Montpelier", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5652, + "latitude": 44.718619, + "longitude": -72.57821, + "city": "Eden", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5653, + "latitude": 44.701158, + "longitude": -72.479642, + "city": "Eden Mills", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5654, + "latitude": 44.155438, + "longitude": -72.484706, + "city": "Graniteville", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5655, + "latitude": 44.560808, + "longitude": -72.590031, + "city": "Hyde Park", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5656, + "latitude": 44.642603, + "longitude": -72.735911, + "city": "Johnson", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5657, + "latitude": 44.599905, + "longitude": -72.647519, + "city": "Lake Elmore", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5658, + "latitude": 44.374874, + "longitude": -72.329902, + "city": "Marshfield", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5660, + "latitude": 44.270817, + "longitude": -72.786431, + "city": "Moretown", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5661, + "latitude": 44.560179, + "longitude": -72.615346, + "city": "Morrisville", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5662, + "latitude": 44.442001, + "longitude": -72.718759, + "city": "Moscow", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5663, + "latitude": 44.180906, + "longitude": -72.678854, + "city": "Northfield", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5664, + "latitude": 44.183536, + "longitude": -72.646591, + "city": "Northfield Falls", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5665, + "latitude": 44.67307, + "longitude": -72.597057, + "city": "North Hyde Park", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5666, + "latitude": 44.259518, + "longitude": -72.585018, + "city": "North Montpelier", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5667, + "latitude": 44.283708, + "longitude": -72.552243, + "city": "Plainfield", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5669, + "latitude": 44.028005, + "longitude": -73.089655, + "city": "Roxbury", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5670, + "latitude": 44.175744, + "longitude": -72.50247, + "city": "South Barre", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5671, + "latitude": 44.259518, + "longitude": -72.585018, + "city": "Waterbury", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5672, + "latitude": 44.535179, + "longitude": -72.660043, + "city": "Stowe", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5673, + "latitude": 44.192186, + "longitude": -72.843868, + "city": "Waitsfield", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5674, + "latitude": 44.217175, + "longitude": -72.820401, + "city": "Warren", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5675, + "latitude": 44.078238, + "longitude": -72.426322, + "city": "Washington", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5676, + "latitude": 44.259608, + "longitude": -72.781143, + "city": "Waterbury", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5677, + "latitude": 44.389313, + "longitude": -72.708616, + "city": "Waterbury Center", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5678, + "latitude": 44.155782, + "longitude": -72.46581, + "city": "Websterville", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5679, + "latitude": 44.103841, + "longitude": -72.526916, + "city": "Williamstown", + "state": "VT", + "county": "Orange" + }, + { + "zip_code": 5680, + "latitude": 44.539539, + "longitude": -72.487589, + "city": "Wolcott", + "state": "VT", + "county": "Lamoille" + }, + { + "zip_code": 5681, + "latitude": 44.259518, + "longitude": -72.585018, + "city": "Woodbury", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5682, + "latitude": 44.343536, + "longitude": -72.575645, + "city": "Worcester", + "state": "VT", + "county": "Washington" + }, + { + "zip_code": 5701, + "latitude": 43.630346, + "longitude": -72.93586, + "city": "Rutland", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5702, + "latitude": 43.412792, + "longitude": -72.990632, + "city": "Rutland", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5730, + "latitude": 43.420978, + "longitude": -72.828524, + "city": "Belmont", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5731, + "latitude": 43.687677, + "longitude": -73.291868, + "city": "Benson", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5732, + "latitude": 43.643723, + "longitude": -73.209356, + "city": "Bomoseen", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5733, + "latitude": 43.655139, + "longitude": -73.121251, + "city": "Brandon", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5734, + "latitude": 43.982512, + "longitude": -73.331483, + "city": "Bridport", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5735, + "latitude": 43.636856, + "longitude": -73.126638, + "city": "Castleton", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5736, + "latitude": 43.594106, + "longitude": -73.008253, + "city": "Center Rutland", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5737, + "latitude": 43.713218, + "longitude": -72.925199, + "city": "Chittenden", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5738, + "latitude": 43.526706, + "longitude": -72.869165, + "city": "Cuttingsville", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5739, + "latitude": 43.34792, + "longitude": -73.027985, + "city": "Danby", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5740, + "latitude": 43.97153, + "longitude": -73.091416, + "city": "East Middlebury", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5741, + "latitude": 43.592039, + "longitude": -72.818121, + "city": "East Poultney", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5742, + "latitude": 43.446092, + "longitude": -72.92087, + "city": "East Wallingford", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5743, + "latitude": 43.634258, + "longitude": -73.182585, + "city": "Fair Haven", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5744, + "latitude": 43.576783, + "longitude": -73.107352, + "city": "Florence", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5745, + "latitude": 43.592039, + "longitude": -72.818121, + "city": "Forest Dale", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5746, + "latitude": 43.592039, + "longitude": -72.588407, + "city": "Gaysville", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5747, + "latitude": 44.0032, + "longitude": -72.817108, + "city": "Granville", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5748, + "latitude": 43.907858, + "longitude": -72.890031, + "city": "Hancock", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5750, + "latitude": 43.599381, + "longitude": -73.25104, + "city": "Hydeville", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5751, + "latitude": 43.656951, + "longitude": -72.782713, + "city": "Killington", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5753, + "latitude": 43.991942, + "longitude": -73.171578, + "city": "Middlebury", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5757, + "latitude": 43.478301, + "longitude": -73.060391, + "city": "Middletown Springs", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5758, + "latitude": 43.444535, + "longitude": -72.802413, + "city": "Mount Holly", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5759, + "latitude": 43.535739, + "longitude": -72.970114, + "city": "North Clarendon", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5760, + "latitude": 43.863158, + "longitude": -73.242322, + "city": "Orwell", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5761, + "latitude": 43.361439, + "longitude": -73.150683, + "city": "Pawlet", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5762, + "latitude": 43.592039, + "longitude": -72.818121, + "city": "Pittsfield", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5763, + "latitude": 43.72182, + "longitude": -72.999461, + "city": "Pittsford", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5764, + "latitude": 43.525395, + "longitude": -73.112878, + "city": "Poultney", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5765, + "latitude": 43.601975, + "longitude": -73.09589, + "city": "Proctor", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5766, + "latitude": 43.979315, + "longitude": -73.010663, + "city": "Ripton", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5767, + "latitude": 43.866832, + "longitude": -72.851495, + "city": "Rochester", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5768, + "latitude": 43.026984, + "longitude": -73.055156, + "city": "Rupert", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5769, + "latitude": 43.920297, + "longitude": -73.122709, + "city": "Salisbury", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5770, + "latitude": 43.912406, + "longitude": -73.279162, + "city": "Shoreham", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5772, + "latitude": 43.756978, + "longitude": -72.730177, + "city": "Stockbridge", + "state": "VT", + "county": "Windsor" + }, + { + "zip_code": 5773, + "latitude": 43.477386, + "longitude": -73.066066, + "city": "Wallingford", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5774, + "latitude": 43.429363, + "longitude": -73.161826, + "city": "Wells", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5775, + "latitude": 43.360006, + "longitude": -73.224211, + "city": "West Pawlet", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5776, + "latitude": 43.026984, + "longitude": -73.055156, + "city": "West Rupert", + "state": "VT", + "county": "Bennington" + }, + { + "zip_code": 5777, + "latitude": 43.588163, + "longitude": -73.065323, + "city": "West Rutland", + "state": "VT", + "county": "Rutland" + }, + { + "zip_code": 5778, + "latitude": 43.893982, + "longitude": -73.203001, + "city": "Whiting", + "state": "VT", + "county": "Addison" + }, + { + "zip_code": 5819, + "latitude": 44.426455, + "longitude": -72.114155, + "city": "Saint Johnsbury", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5820, + "latitude": 44.741679, + "longitude": -72.364639, + "city": "Albany", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5821, + "latitude": 44.313675, + "longitude": -72.11879, + "city": "Barnet", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5822, + "latitude": 44.73663, + "longitude": -72.199084, + "city": "Barton", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5823, + "latitude": 45.005783, + "longitude": -72.138347, + "city": "Beebe Plain", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5824, + "latitude": 44.581613, + "longitude": -71.833956, + "city": "Concord", + "state": "VT", + "county": "Essex" + }, + { + "zip_code": 5825, + "latitude": 44.775607, + "longitude": -72.22641, + "city": "Coventry", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5826, + "latitude": 44.641663, + "longitude": -72.388928, + "city": "Craftsbury", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5827, + "latitude": 44.678786, + "longitude": -72.35944, + "city": "Craftsbury Common", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5828, + "latitude": 44.437306, + "longitude": -72.123508, + "city": "Danville", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5829, + "latitude": 44.952347, + "longitude": -72.218616, + "city": "Derby", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5830, + "latitude": 44.97035, + "longitude": -72.036632, + "city": "Derby Line", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5832, + "latitude": 44.587962, + "longitude": -71.910223, + "city": "East Burke", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5833, + "latitude": 44.775607, + "longitude": -72.22641, + "city": "East Charleston", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5836, + "latitude": 44.496356, + "longitude": -72.17371, + "city": "East Hardwick", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5837, + "latitude": 44.667396, + "longitude": -71.813465, + "city": "East Haven", + "state": "VT", + "county": "Essex" + }, + { + "zip_code": 5838, + "latitude": 44.468494, + "longitude": -71.930077, + "city": "East Saint Johnsbury", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5839, + "latitude": 44.679528, + "longitude": -72.221912, + "city": "Glover", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5840, + "latitude": 44.680771, + "longitude": -71.719436, + "city": "Granby", + "state": "VT", + "county": "Essex" + }, + { + "zip_code": 5841, + "latitude": 44.600325, + "longitude": -72.286556, + "city": "Greensboro", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5842, + "latitude": 44.775607, + "longitude": -72.22641, + "city": "Greensboro Bend", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5843, + "latitude": 44.51609, + "longitude": -72.309822, + "city": "Hardwick", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5845, + "latitude": 44.783177, + "longitude": -72.301139, + "city": "Irasburg", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5846, + "latitude": 44.832535, + "longitude": -71.841125, + "city": "Island Pond", + "state": "VT", + "county": "Essex" + }, + { + "zip_code": 5847, + "latitude": 44.788925, + "longitude": -72.439455, + "city": "Lowell", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5848, + "latitude": 44.382103, + "longitude": -71.919518, + "city": "Lower Waterford", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5849, + "latitude": 44.497557, + "longitude": -71.950519, + "city": "Lyndon", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5850, + "latitude": 44.481915, + "longitude": -71.988258, + "city": "Lyndon Center", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5851, + "latitude": 44.5351, + "longitude": -72.056557, + "city": "Lyndonville", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5853, + "latitude": 44.878704, + "longitude": -71.971424, + "city": "Morgan", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5855, + "latitude": 44.907921, + "longitude": -72.203948, + "city": "Newport", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5857, + "latitude": 44.927018, + "longitude": -72.299191, + "city": "Newport Center", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5858, + "latitude": 44.512087, + "longitude": -71.795986, + "city": "North Concord", + "state": "VT", + "county": "Essex" + }, + { + "zip_code": 5859, + "latitude": 44.937769, + "longitude": -72.433354, + "city": "North Troy", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5860, + "latitude": 44.823782, + "longitude": -72.102019, + "city": "Orleans", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5861, + "latitude": 44.46239, + "longitude": -72.135804, + "city": "Passumpsic", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5862, + "latitude": 44.46239, + "longitude": -72.135804, + "city": "Peacham", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5863, + "latitude": 44.503403, + "longitude": -71.972088, + "city": "Saint Johnsbury Center", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5866, + "latitude": 44.639653, + "longitude": -72.132255, + "city": "Sheffield", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5867, + "latitude": 44.664521, + "longitude": -72.042415, + "city": "Sutton", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5868, + "latitude": 44.775607, + "longitude": -72.22641, + "city": "Troy", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5871, + "latitude": 44.683041, + "longitude": -71.936817, + "city": "West Burke", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5872, + "latitude": 44.849402, + "longitude": -72.03121, + "city": "West Charleston", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5873, + "latitude": 44.393366, + "longitude": -72.222424, + "city": "West Danville", + "state": "VT", + "county": "Caledonia" + }, + { + "zip_code": 5874, + "latitude": 44.869117, + "longitude": -72.450485, + "city": "Westfield", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5875, + "latitude": 44.710028, + "longitude": -72.258038, + "city": "West Glover", + "state": "VT", + "county": "Orleans" + }, + { + "zip_code": 5901, + "latitude": 44.680771, + "longitude": -71.719436, + "city": "Averill", + "state": "VT", + "county": "Essex" + }, + { + "zip_code": 5902, + "latitude": 44.680771, + "longitude": -71.719436, + "city": "Beecher Falls", + "state": "VT", + "county": "Essex" + }, + { + "zip_code": 5903, + "latitude": 44.930787, + "longitude": -71.597809, + "city": "Canaan", + "state": "VT", + "county": "Essex" + }, + { + "zip_code": 5904, + "latitude": 44.680771, + "longitude": -71.719436, + "city": "Gilman", + "state": "VT", + "county": "Essex" + }, + { + "zip_code": 5905, + "latitude": 44.671187, + "longitude": -71.662213, + "city": "Guildhall", + "state": "VT", + "county": "Essex" + }, + { + "zip_code": 5906, + "latitude": 44.680771, + "longitude": -71.719436, + "city": "Lunenburg", + "state": "VT", + "county": "Essex" + }, + { + "zip_code": 5907, + "latitude": 44.932643, + "longitude": -71.776359, + "city": "Norton", + "state": "VT", + "county": "Essex" + }, + { + "zip_code": 6001, + "latitude": 41.757944, + "longitude": -72.728272, + "city": "Avon", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6002, + "latitude": 41.851961, + "longitude": -72.738939, + "city": "Bloomfield", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6006, + "latitude": 41.879637, + "longitude": -72.734271, + "city": "Windsor", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6010, + "latitude": 41.681198, + "longitude": -72.939577, + "city": "Bristol", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6011, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Bristol", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6013, + "latitude": 41.761773, + "longitude": -72.95826, + "city": "Burlington", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6016, + "latitude": 41.842097, + "longitude": -72.708388, + "city": "Broad Brook", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6018, + "latitude": 42.001585, + "longitude": -73.295891, + "city": "Canaan", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6019, + "latitude": 41.842882, + "longitude": -72.899645, + "city": "Canton", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6020, + "latitude": 41.853921, + "longitude": -72.902811, + "city": "Canton Center", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6021, + "latitude": 42.005809, + "longitude": -73.118329, + "city": "Colebrook", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6022, + "latitude": 41.851597, + "longitude": -72.918127, + "city": "Collinsville", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6023, + "latitude": 41.613489, + "longitude": -72.7207, + "city": "East Berlin", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6024, + "latitude": 42.015806, + "longitude": -73.291299, + "city": "East Canaan", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6025, + "latitude": 41.688896, + "longitude": -72.534482, + "city": "East Glastonbury", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6026, + "latitude": 41.939096, + "longitude": -72.740538, + "city": "East Granby", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6027, + "latitude": 42.004978, + "longitude": -72.896907, + "city": "East Hartland", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6028, + "latitude": 41.859248, + "longitude": -72.603033, + "city": "East Windsor Hill", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6029, + "latitude": 41.849319, + "longitude": -72.411777, + "city": "Ellington", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6030, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Farmington", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6031, + "latitude": 41.949717, + "longitude": -73.304403, + "city": "Falls Village", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6032, + "latitude": 41.726769, + "longitude": -72.829543, + "city": "Farmington", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6033, + "latitude": 41.703451, + "longitude": -72.539332, + "city": "Glastonbury", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6034, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Farmington", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6035, + "latitude": 41.966062, + "longitude": -72.796407, + "city": "Granby", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6037, + "latitude": 41.602948, + "longitude": -72.769991, + "city": "Berlin", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6039, + "latitude": 41.951917, + "longitude": -73.38138, + "city": "Lakeville", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6040, + "latitude": 41.776048, + "longitude": -72.523748, + "city": "Manchester", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6041, + "latitude": 41.794681, + "longitude": -72.564832, + "city": "Manchester", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6043, + "latitude": 41.768648, + "longitude": -72.439278, + "city": "Bolton", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6045, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Manchester", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6049, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Melrose", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6050, + "latitude": 41.666049, + "longitude": -72.778391, + "city": "New Britain", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6051, + "latitude": 41.668449, + "longitude": -72.770441, + "city": "New Britain", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6052, + "latitude": 41.656748, + "longitude": -72.801892, + "city": "New Britain", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6053, + "latitude": 41.690249, + "longitude": -72.790991, + "city": "New Britain", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6057, + "latitude": 41.883102, + "longitude": -73.045918, + "city": "New Hartford", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6058, + "latitude": 41.886811, + "longitude": -73.184674, + "city": "Norfolk", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6059, + "latitude": 41.899683, + "longitude": -72.890744, + "city": "North Canton", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6060, + "latitude": 42.004694, + "longitude": -72.843205, + "city": "North Granby", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6061, + "latitude": 41.874382, + "longitude": -72.967958, + "city": "Pine Meadow", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6062, + "latitude": 41.672983, + "longitude": -72.859695, + "city": "Plainville", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6063, + "latitude": 41.93937, + "longitude": -72.990647, + "city": "Barkhamsted", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6064, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Poquonock", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6065, + "latitude": 41.968597, + "longitude": -73.014467, + "city": "Riverton", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6066, + "latitude": 41.8372, + "longitude": -72.454917, + "city": "Vernon Rockville", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6067, + "latitude": 41.657249, + "longitude": -72.670887, + "city": "Rocky Hill", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6068, + "latitude": 42.00579, + "longitude": -73.399336, + "city": "Salisbury", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6069, + "latitude": 41.874681, + "longitude": -73.433903, + "city": "Sharon", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6070, + "latitude": 41.868647, + "longitude": -72.819742, + "city": "Simsbury", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6071, + "latitude": 41.919603, + "longitude": -72.433046, + "city": "Somers", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6072, + "latitude": 41.976466, + "longitude": -72.490593, + "city": "Somersville", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6073, + "latitude": 41.657099, + "longitude": -72.572233, + "city": "South Glastonbury", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6074, + "latitude": 41.834198, + "longitude": -72.564632, + "city": "South Windsor", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6075, + "latitude": 41.81152, + "longitude": -72.308779, + "city": "Stafford", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6076, + "latitude": 41.900495, + "longitude": -72.27641, + "city": "Stafford Springs", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6077, + "latitude": 41.991645, + "longitude": -72.257735, + "city": "Staffordville", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6078, + "latitude": 41.989646, + "longitude": -72.658135, + "city": "Suffield", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6079, + "latitude": 42.032012, + "longitude": -73.403763, + "city": "Taconic", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6080, + "latitude": 41.948597, + "longitude": -72.628802, + "city": "Suffield", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6081, + "latitude": 41.905269, + "longitude": -72.767239, + "city": "Tariffville", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6082, + "latitude": 41.984646, + "longitude": -72.557731, + "city": "Enfield", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6083, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Enfield", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6084, + "latitude": 41.882553, + "longitude": -72.361039, + "city": "Tolland", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6085, + "latitude": 41.860009, + "longitude": -72.933467, + "city": "Unionville", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6087, + "latitude": 41.757616, + "longitude": -72.884953, + "city": "Unionville", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6088, + "latitude": 41.903347, + "longitude": -72.592883, + "city": "East Windsor", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6089, + "latitude": 41.889965, + "longitude": -72.704, + "city": "Weatogue", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6090, + "latitude": 41.955645, + "longitude": -72.861993, + "city": "West Granby", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6091, + "latitude": 42.003447, + "longitude": -72.992109, + "city": "West Hartland", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6092, + "latitude": 41.865597, + "longitude": -72.849854, + "city": "West Simsbury", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6093, + "latitude": 42.005795, + "longitude": -72.727337, + "city": "West Suffield", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6094, + "latitude": 41.896321, + "longitude": -73.146312, + "city": "Winchester Center", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6095, + "latitude": 41.909988, + "longitude": -72.804935, + "city": "Windsor", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6096, + "latitude": 41.933846, + "longitude": -72.660245, + "city": "Windsor Locks", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6098, + "latitude": 41.925671, + "longitude": -73.058157, + "city": "Winsted", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6101, + "latitude": 41.78007, + "longitude": -72.677099, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6102, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6103, + "latitude": 41.766349, + "longitude": -72.674636, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6104, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6105, + "latitude": 41.774499, + "longitude": -72.699537, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6106, + "latitude": 41.745049, + "longitude": -72.687787, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6107, + "latitude": 41.75325, + "longitude": -72.75804, + "city": "W Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6108, + "latitude": 41.779799, + "longitude": -72.621365, + "city": "East Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6109, + "latitude": 41.698899, + "longitude": -72.667887, + "city": "Wethersfield", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6110, + "latitude": 41.73425, + "longitude": -72.738139, + "city": "W Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6111, + "latitude": 41.685985, + "longitude": -72.729646, + "city": "Newington", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6112, + "latitude": 41.791337, + "longitude": -72.694337, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6114, + "latitude": 41.747399, + "longitude": -72.672237, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6115, + "latitude": 41.758849, + "longitude": -72.679387, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6117, + "latitude": 41.788688, + "longitude": -72.755739, + "city": "W Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6118, + "latitude": 41.748999, + "longitude": -72.609884, + "city": "East Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6119, + "latitude": 41.764349, + "longitude": -72.726388, + "city": "W Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6120, + "latitude": 41.785449, + "longitude": -72.669936, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6123, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6126, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6127, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "W Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6128, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "East Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6129, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Wethersfield", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6131, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Newington", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6132, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6133, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "W Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6134, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6137, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "W Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6138, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "East Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6140, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6141, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6142, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6143, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6144, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6145, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6146, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6147, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6150, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6151, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6152, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6153, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6154, + "latitude": 41.771499, + "longitude": -72.686687, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6155, + "latitude": 41.76928, + "longitude": -72.686465, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6156, + "latitude": 41.767949, + "longitude": -72.690687, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6160, + "latitude": 41.766499, + "longitude": -72.693337, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6161, + "latitude": 41.766049, + "longitude": -72.671837, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6167, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6176, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6180, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6183, + "latitude": 41.763849, + "longitude": -72.673037, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6199, + "latitude": 41.927447, + "longitude": -72.680386, + "city": "Hartford", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6226, + "latitude": 41.845504, + "longitude": -72.091889, + "city": "Willimantic", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6230, + "latitude": 41.847302, + "longitude": -72.02528, + "city": "Abington", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6231, + "latitude": 41.626377, + "longitude": -72.3728, + "city": "Amston", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6232, + "latitude": 41.731847, + "longitude": -72.374634, + "city": "Andover", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6233, + "latitude": 41.831565, + "longitude": -72.020137, + "city": "Ballouville", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6234, + "latitude": 41.847758, + "longitude": -71.983412, + "city": "Brooklyn", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6235, + "latitude": 41.80294, + "longitude": -72.126036, + "city": "Chaplin", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6237, + "latitude": 41.696124, + "longitude": -72.300043, + "city": "Columbia", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6238, + "latitude": 41.778623, + "longitude": -72.323642, + "city": "Coventry", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6239, + "latitude": 41.864901, + "longitude": -71.874354, + "city": "Danielson", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6241, + "latitude": 41.854975, + "longitude": -71.858826, + "city": "Dayville", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6242, + "latitude": 41.927524, + "longitude": -72.041112, + "city": "Eastford", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6243, + "latitude": 41.844885, + "longitude": -71.818941, + "city": "East Killingly", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6244, + "latitude": 41.984327, + "longitude": -71.981045, + "city": "East Woodstock", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6245, + "latitude": 42.019776, + "longitude": -71.941669, + "city": "Fabyan", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6246, + "latitude": 41.971116, + "longitude": -71.891732, + "city": "Grosvenor Dale", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6247, + "latitude": 41.788756, + "longitude": -71.975819, + "city": "Hampton", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6248, + "latitude": 41.689249, + "longitude": -72.398627, + "city": "Hebron", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6249, + "latitude": 41.628008, + "longitude": -72.245422, + "city": "Lebanon", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6250, + "latitude": 41.78155, + "longitude": -72.22554, + "city": "Mansfield Center", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6251, + "latitude": 41.799326, + "longitude": -72.306526, + "city": "Mansfield Depot", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6254, + "latitude": 41.609895, + "longitude": -72.150305, + "city": "North Franklin", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6255, + "latitude": 41.978392, + "longitude": -71.899716, + "city": "North Grosvenordale", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6256, + "latitude": 41.778469, + "longitude": -72.040003, + "city": "North Windham", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6258, + "latitude": 41.889048, + "longitude": -71.968232, + "city": "Pomfret", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6259, + "latitude": 41.863133, + "longitude": -72.00259, + "city": "Pomfret Center", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6260, + "latitude": 41.862904, + "longitude": -71.887712, + "city": "Putnam", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6262, + "latitude": 42.021536, + "longitude": -71.947077, + "city": "Quinebaug", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6263, + "latitude": 41.839051, + "longitude": -71.90634, + "city": "Rogers", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6264, + "latitude": 41.695803, + "longitude": -72.087045, + "city": "Scotland", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6265, + "latitude": 41.81152, + "longitude": -72.308779, + "city": "South Willington", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6266, + "latitude": 41.674079, + "longitude": -72.172298, + "city": "South Windham", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6267, + "latitude": 41.943902, + "longitude": -71.945253, + "city": "South Woodstock", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6268, + "latitude": 41.787937, + "longitude": -72.25248, + "city": "Storrs Mansfield", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6269, + "latitude": 41.808007, + "longitude": -72.250963, + "city": "Storrs Mansfield", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6277, + "latitude": 41.975796, + "longitude": -71.862047, + "city": "Thompson", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6278, + "latitude": 41.889043, + "longitude": -72.147561, + "city": "Ashford", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6279, + "latitude": 41.896623, + "longitude": -72.262236, + "city": "Willington", + "state": "CT", + "county": "Tolland" + }, + { + "zip_code": 6280, + "latitude": 41.693914, + "longitude": -72.137843, + "city": "Windham", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6281, + "latitude": 41.961991, + "longitude": -72.014108, + "city": "Woodstock", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6282, + "latitude": 41.952846, + "longitude": -72.057134, + "city": "Woodstock Valley", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6320, + "latitude": 41.413998, + "longitude": -72.10907, + "city": "New London", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6330, + "latitude": 41.501708, + "longitude": -72.044306, + "city": "Baltic", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6331, + "latitude": 41.696753, + "longitude": -71.998277, + "city": "Canterbury", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6332, + "latitude": 41.725694, + "longitude": -71.909019, + "city": "Central Village", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6333, + "latitude": 41.378842, + "longitude": -72.236794, + "city": "East Lyme", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6334, + "latitude": 41.544598, + "longitude": -72.177023, + "city": "Bozrah", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6335, + "latitude": 41.523377, + "longitude": -72.021165, + "city": "Gales Ferry", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6336, + "latitude": 41.579548, + "longitude": -72.196273, + "city": "Gilman", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6337, + "latitude": 41.559873, + "longitude": -71.889199, + "city": "Glasgo", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6339, + "latitude": 41.492843, + "longitude": -71.965554, + "city": "Ledyard", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6340, + "latitude": 41.355405, + "longitude": -72.038268, + "city": "Groton", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6349, + "latitude": 41.39973, + "longitude": -72.090357, + "city": "Groton", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6350, + "latitude": 41.644546, + "longitude": -72.06769, + "city": "Hanover", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6351, + "latitude": 41.599562, + "longitude": -71.982619, + "city": "Jewett City", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6353, + "latitude": 41.452548, + "longitude": -72.137471, + "city": "Montville", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6354, + "latitude": 41.704931, + "longitude": -71.849772, + "city": "Moosup", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6355, + "latitude": 41.485188, + "longitude": -72.000748, + "city": "Mystic", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6357, + "latitude": 41.323447, + "longitude": -72.215623, + "city": "Niantic", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6359, + "latitude": 41.466851, + "longitude": -71.880694, + "city": "North Stonington", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6360, + "latitude": 41.499398, + "longitude": -71.994757, + "city": "Norwich", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6365, + "latitude": 41.522369, + "longitude": -71.993427, + "city": "Preston", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6370, + "latitude": 41.512172, + "longitude": -72.102302, + "city": "Oakdale", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6371, + "latitude": 41.409397, + "longitude": -72.147665, + "city": "Old Lyme", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6372, + "latitude": 41.388216, + "longitude": -71.949548, + "city": "Old Mystic", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6373, + "latitude": 41.678546, + "longitude": -71.817759, + "city": "Oneco", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6374, + "latitude": 41.688121, + "longitude": -71.884113, + "city": "Plainfield", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6375, + "latitude": 41.401066, + "longitude": -72.140022, + "city": "Quaker Hill", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6376, + "latitude": 41.296668, + "longitude": -72.263296, + "city": "South Lyme", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6377, + "latitude": 41.719948, + "longitude": -71.823184, + "city": "Sterling", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6378, + "latitude": 41.378598, + "longitude": -71.917915, + "city": "Stonington", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6379, + "latitude": 41.455191, + "longitude": -71.895547, + "city": "Pawcatuck", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6380, + "latitude": 41.563998, + "longitude": -72.05522, + "city": "Taftville", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6382, + "latitude": 41.424507, + "longitude": -72.069578, + "city": "Uncasville", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6383, + "latitude": 41.601648, + "longitude": -72.04037, + "city": "Versailles", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6384, + "latitude": 41.576894, + "longitude": -71.866587, + "city": "Voluntown", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6385, + "latitude": 41.456698, + "longitude": -72.126498, + "city": "Waterford", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6386, + "latitude": 41.464758, + "longitude": -72.127301, + "city": "Waterford", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6387, + "latitude": 41.744527, + "longitude": -71.913339, + "city": "Wauregan", + "state": "CT", + "county": "Windham" + }, + { + "zip_code": 6388, + "latitude": 41.344098, + "longitude": -71.976467, + "city": "West Mystic", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6389, + "latitude": 41.559648, + "longitude": -72.122672, + "city": "Yantic", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6390, + "latitude": 40.992288, + "longitude": -72.723496, + "city": "Fishers Island", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 6401, + "latitude": 41.342514, + "longitude": -73.070301, + "city": "Ansonia", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6403, + "latitude": 41.435134, + "longitude": -73.058835, + "city": "Beacon Falls", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6404, + "latitude": 41.165097, + "longitude": -73.129186, + "city": "Botsford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6405, + "latitude": 41.284746, + "longitude": -72.796292, + "city": "Branford", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6408, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Cheshire", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6409, + "latitude": 41.349098, + "longitude": -72.41338, + "city": "Centerbrook", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6410, + "latitude": 41.460167, + "longitude": -72.97222, + "city": "Cheshire", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6411, + "latitude": 41.550097, + "longitude": -72.922235, + "city": "Cheshire", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6412, + "latitude": 41.39027, + "longitude": -72.461805, + "city": "Chester", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6413, + "latitude": 41.298201, + "longitude": -72.532934, + "city": "Clinton", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6414, + "latitude": 41.566668, + "longitude": -72.558055, + "city": "Cobalt", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6415, + "latitude": 41.546443, + "longitude": -72.338832, + "city": "Colchester", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6416, + "latitude": 41.608529, + "longitude": -72.667807, + "city": "Cromwell", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6417, + "latitude": 41.368124, + "longitude": -72.452284, + "city": "Deep River", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6418, + "latitude": 41.327246, + "longitude": -73.084252, + "city": "Derby", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6419, + "latitude": 41.417962, + "longitude": -72.493446, + "city": "Killingworth", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6420, + "latitude": 41.527441, + "longitude": -72.269141, + "city": "Salem", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6422, + "latitude": 41.462468, + "longitude": -72.682297, + "city": "Durham", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6423, + "latitude": 41.475478, + "longitude": -72.389729, + "city": "East Haddam", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6424, + "latitude": 41.559841, + "longitude": -72.494927, + "city": "East Hampton", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6426, + "latitude": 41.448179, + "longitude": -72.50426, + "city": "Essex", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6430, + "latitude": 41.175173, + "longitude": -73.282408, + "city": "Fairfield", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6431, + "latitude": 41.219093, + "longitude": -73.252696, + "city": "Fairfield", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6432, + "latitude": 41.196046, + "longitude": -73.252802, + "city": "Fairfield", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6436, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Greens Farms", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6437, + "latitude": 41.338847, + "longitude": -72.690089, + "city": "Guilford", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6438, + "latitude": 41.471457, + "longitude": -72.511376, + "city": "Haddam", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6439, + "latitude": 41.421198, + "longitude": -72.414095, + "city": "Hadlyme", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6440, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Hawleyville", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6441, + "latitude": 41.462718, + "longitude": -72.578971, + "city": "Higganum", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6442, + "latitude": 41.344076, + "longitude": -72.444369, + "city": "Ivoryton", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6443, + "latitude": 41.350397, + "longitude": -72.788392, + "city": "Madison", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6444, + "latitude": 41.791776, + "longitude": -72.718832, + "city": "Marion", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6447, + "latitude": 41.636949, + "longitude": -72.463179, + "city": "Marlborough", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6450, + "latitude": 41.536498, + "longitude": -72.801901, + "city": "Meriden", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6451, + "latitude": 41.54011, + "longitude": -72.81888, + "city": "Meriden", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6454, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Meriden", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6455, + "latitude": 41.515346, + "longitude": -72.712988, + "city": "Middlefield", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6456, + "latitude": 41.538017, + "longitude": -72.525208, + "city": "Middle Haddam", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6457, + "latitude": 41.550139, + "longitude": -72.655357, + "city": "Middletown", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6459, + "latitude": 41.556463, + "longitude": -72.658179, + "city": "Middletown", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6460, + "latitude": 41.343773, + "longitude": -72.951273, + "city": "Milford", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6467, + "latitude": 41.565697, + "longitude": -72.903746, + "city": "Milldale", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6468, + "latitude": 41.341845, + "longitude": -73.236918, + "city": "Monroe", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6469, + "latitude": 41.508904, + "longitude": -72.440086, + "city": "Moodus", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6470, + "latitude": 41.396295, + "longitude": -73.310561, + "city": "Newtown", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6471, + "latitude": 41.332347, + "longitude": -72.780892, + "city": "North Branford", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6472, + "latitude": 41.379797, + "longitude": -72.772991, + "city": "Northford", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6473, + "latitude": 41.384381, + "longitude": -72.862644, + "city": "North Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6474, + "latitude": 41.464758, + "longitude": -72.127301, + "city": "North Westchester", + "state": "CT", + "county": "New London" + }, + { + "zip_code": 6475, + "latitude": 41.300448, + "longitude": -72.389129, + "city": "Old Saybrook", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6477, + "latitude": 41.279896, + "longitude": -73.031018, + "city": "Orange", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6478, + "latitude": 41.432583, + "longitude": -73.138379, + "city": "Oxford", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6479, + "latitude": 41.577845, + "longitude": -72.902496, + "city": "Plantsville", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6480, + "latitude": 41.598339, + "longitude": -72.601307, + "city": "Portland", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6481, + "latitude": 41.542105, + "longitude": -72.666583, + "city": "Rockfall", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6482, + "latitude": 41.408137, + "longitude": -73.249671, + "city": "Sandy Hook", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6483, + "latitude": 41.417646, + "longitude": -73.102078, + "city": "Seymour", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6484, + "latitude": 41.314347, + "longitude": -73.137143, + "city": "Shelton", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6487, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "South Britain", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6488, + "latitude": 41.470921, + "longitude": -73.240839, + "city": "Southbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6489, + "latitude": 41.604786, + "longitude": -72.871945, + "city": "Southington", + "state": "CT", + "county": "Hartford" + }, + { + "zip_code": 6490, + "latitude": 41.143396, + "longitude": -73.289859, + "city": "Southport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6491, + "latitude": 41.386646, + "longitude": -73.187207, + "city": "Stevenson", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6492, + "latitude": 41.456205, + "longitude": -72.811047, + "city": "Wallingford", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6493, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Wallingford", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6494, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Wallingford", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6495, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Wallingford", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6497, + "latitude": 41.207146, + "longitude": -73.130503, + "city": "Stratford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6498, + "latitude": 41.307899, + "longitude": -72.463381, + "city": "Westbrook", + "state": "CT", + "county": "Middlesex" + }, + { + "zip_code": 6501, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6502, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6503, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6504, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6505, + "latitude": 41.305721, + "longitude": -72.779901, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6506, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6507, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6508, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6509, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6510, + "latitude": 41.309797, + "longitude": -72.922296, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6511, + "latitude": 41.310547, + "longitude": -72.926046, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6512, + "latitude": 41.290997, + "longitude": -72.865894, + "city": "East Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6513, + "latitude": 41.307197, + "longitude": -72.865365, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6514, + "latitude": 41.372723, + "longitude": -72.938747, + "city": "Hamden", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6515, + "latitude": 41.328697, + "longitude": -72.964247, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6516, + "latitude": 41.272452, + "longitude": -72.940335, + "city": "West Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6517, + "latitude": 41.362197, + "longitude": -72.911396, + "city": "Hamden", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6518, + "latitude": 41.416747, + "longitude": -72.906096, + "city": "Hamden", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6519, + "latitude": 41.296897, + "longitude": -72.938596, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6520, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6521, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6524, + "latitude": 41.428088, + "longitude": -72.996191, + "city": "Bethany", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6525, + "latitude": 41.353296, + "longitude": -73.013981, + "city": "Woodbridge", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6530, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6531, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6532, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6533, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6534, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6535, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6536, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6537, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6538, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6540, + "latitude": 41.299647, + "longitude": -72.918846, + "city": "New Haven", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6601, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Bridgeport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6602, + "latitude": 41.179846, + "longitude": -73.189006, + "city": "Bridgeport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6604, + "latitude": 41.192746, + "longitude": -73.213907, + "city": "Bridgeport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6605, + "latitude": 41.162573, + "longitude": -73.216557, + "city": "Bridgeport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6606, + "latitude": 41.208796, + "longitude": -73.211807, + "city": "Bridgeport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6607, + "latitude": 41.181596, + "longitude": -73.165604, + "city": "Bridgeport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6608, + "latitude": 41.188199, + "longitude": -73.180005, + "city": "Bridgeport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6610, + "latitude": 41.219847, + "longitude": -73.163955, + "city": "Bridgeport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6611, + "latitude": 41.259996, + "longitude": -73.206957, + "city": "Trumbull", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6612, + "latitude": 41.273016, + "longitude": -73.297721, + "city": "Easton", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6614, + "latitude": 41.216006, + "longitude": -73.130353, + "city": "Stratford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6615, + "latitude": 41.177046, + "longitude": -73.133574, + "city": "Stratford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6650, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Bridgeport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6673, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Bridgeport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6699, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Bridgeport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6701, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6702, + "latitude": 41.540696, + "longitude": -73.071124, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6703, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6704, + "latitude": 41.581797, + "longitude": -73.034451, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6705, + "latitude": 41.552893, + "longitude": -72.992749, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6706, + "latitude": 41.535346, + "longitude": -73.026951, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6708, + "latitude": 41.551496, + "longitude": -73.064152, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6710, + "latitude": 41.571496, + "longitude": -73.044035, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6712, + "latitude": 41.499097, + "longitude": -72.975694, + "city": "Prospect", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6716, + "latitude": 41.598347, + "longitude": -72.980578, + "city": "Wolcott", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6720, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6721, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6722, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6723, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6724, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6725, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6726, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6749, + "latitude": 41.365709, + "longitude": -72.927507, + "city": "Waterbury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6750, + "latitude": 41.714352, + "longitude": -73.251598, + "city": "Bantam", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6751, + "latitude": 41.6409, + "longitude": -73.209685, + "city": "Bethlehem", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6752, + "latitude": 41.520312, + "longitude": -73.363875, + "city": "Bridgewater", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6753, + "latitude": 41.828067, + "longitude": -73.332345, + "city": "Cornwall", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6754, + "latitude": 41.744373, + "longitude": -73.301922, + "city": "Cornwall Bridge", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6755, + "latitude": 41.634686, + "longitude": -73.472048, + "city": "Gaylordsville", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6756, + "latitude": 41.794278, + "longitude": -73.239023, + "city": "Goshen", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6757, + "latitude": 41.774725, + "longitude": -73.401908, + "city": "Kent", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6758, + "latitude": 41.739889, + "longitude": -73.222981, + "city": "Lakeside", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6759, + "latitude": 41.791598, + "longitude": -73.229787, + "city": "Litchfield", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6762, + "latitude": 41.528274, + "longitude": -73.116458, + "city": "Middlebury", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6763, + "latitude": 41.689616, + "longitude": -73.212587, + "city": "Morris", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6770, + "latitude": 41.491016, + "longitude": -73.052965, + "city": "Naugatuck", + "state": "CT", + "county": "New Haven" + }, + { + "zip_code": 6776, + "latitude": 41.658619, + "longitude": -73.366017, + "city": "New Milford", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6777, + "latitude": 41.690297, + "longitude": -73.310346, + "city": "New Preston Marble Dale", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6778, + "latitude": 41.707722, + "longitude": -73.108997, + "city": "Northfield", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6779, + "latitude": 41.604052, + "longitude": -73.216887, + "city": "Oakville", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6781, + "latitude": 41.669898, + "longitude": -72.99145, + "city": "Pequabuck", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6782, + "latitude": 41.65873, + "longitude": -73.044364, + "city": "Plymouth", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6783, + "latitude": 41.578971, + "longitude": -73.298344, + "city": "Roxbury", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6784, + "latitude": 41.525631, + "longitude": -73.490891, + "city": "Sherman", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6785, + "latitude": 41.682439, + "longitude": -73.305256, + "city": "South Kent", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6786, + "latitude": 41.66353, + "longitude": -73.022449, + "city": "Terryville", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6787, + "latitude": 41.658721, + "longitude": -73.098657, + "city": "Thomaston", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6790, + "latitude": 41.87484, + "longitude": -73.126763, + "city": "Torrington", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6791, + "latitude": 41.649639, + "longitude": -73.176163, + "city": "Harwinton", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6793, + "latitude": 41.718159, + "longitude": -73.294187, + "city": "Washington", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6794, + "latitude": 41.646347, + "longitude": -73.316951, + "city": "Washington Depot", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6795, + "latitude": 41.759427, + "longitude": -73.162003, + "city": "Watertown", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6796, + "latitude": 41.821529, + "longitude": -73.350384, + "city": "West Cornwall", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6798, + "latitude": 41.733106, + "longitude": -73.135499, + "city": "Woodbury", + "state": "CT", + "county": "Litchfield" + }, + { + "zip_code": 6801, + "latitude": 41.381244, + "longitude": -73.39908, + "city": "Bethel", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6804, + "latitude": 41.404799, + "longitude": -73.275562, + "city": "Brookfield", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6807, + "latitude": 41.058646, + "longitude": -73.587618, + "city": "Cos Cob", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6810, + "latitude": 41.376242, + "longitude": -73.471416, + "city": "Danbury", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6811, + "latitude": 41.42333, + "longitude": -73.478717, + "city": "Danbury", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6812, + "latitude": 41.486689, + "longitude": -73.491042, + "city": "New Fairfield", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6813, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Danbury", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6814, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Danbury", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6816, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Danbury", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6817, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Danbury", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6820, + "latitude": 41.075846, + "longitude": -73.480765, + "city": "Darien", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6829, + "latitude": 41.25553, + "longitude": -73.427915, + "city": "Georgetown", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6830, + "latitude": 41.042746, + "longitude": -73.62617, + "city": "Greenwich", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6831, + "latitude": 41.079983, + "longitude": -73.654472, + "city": "Greenwich", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6832, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Greenwich", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6836, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Greenwich", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6840, + "latitude": 41.162209, + "longitude": -73.501267, + "city": "New Canaan", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6842, + "latitude": 41.147096, + "longitude": -73.495366, + "city": "New Canaan", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6850, + "latitude": 41.126146, + "longitude": -73.442423, + "city": "Norwalk", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6851, + "latitude": 41.139796, + "longitude": -73.404963, + "city": "Norwalk", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6852, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Norwalk", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6853, + "latitude": 41.070396, + "longitude": -73.437563, + "city": "Norwalk", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6854, + "latitude": 41.090946, + "longitude": -73.432313, + "city": "Norwalk", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6855, + "latitude": 41.099196, + "longitude": -73.398362, + "city": "Norwalk", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6856, + "latitude": 41.111196, + "longitude": -73.420363, + "city": "Norwalk", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6857, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Norwalk", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6858, + "latitude": 41.110496, + "longitude": -73.416213, + "city": "Norwalk", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6859, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Norwalk", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6860, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Norwalk", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6870, + "latitude": 41.034946, + "longitude": -73.566968, + "city": "Old Greenwich", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6875, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Redding Center", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6876, + "latitude": 41.032647, + "longitude": -73.583569, + "city": "Redding Ridge", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6877, + "latitude": 41.308201, + "longitude": -73.494637, + "city": "Ridgefield", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6878, + "latitude": 41.035596, + "longitude": -73.580241, + "city": "Riverside", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6879, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Ridgefield", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6880, + "latitude": 41.144496, + "longitude": -73.343261, + "city": "Westport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6881, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Westport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6883, + "latitude": 41.222945, + "longitude": -73.376263, + "city": "Weston", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6888, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Westport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6889, + "latitude": 41.141005, + "longitude": -73.34689, + "city": "Westport", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6896, + "latitude": 41.271095, + "longitude": -73.38634, + "city": "Redding", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6897, + "latitude": 41.209695, + "longitude": -73.439165, + "city": "Wilton", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6901, + "latitude": 41.054082, + "longitude": -73.536216, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6902, + "latitude": 41.060196, + "longitude": -73.544477, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6903, + "latitude": 41.136773, + "longitude": -73.565919, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6904, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6905, + "latitude": 41.116751, + "longitude": -73.552752, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6906, + "latitude": 41.071246, + "longitude": -73.521416, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6907, + "latitude": 41.088346, + "longitude": -73.537217, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6910, + "latitude": 41.039147, + "longitude": -73.559118, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6911, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6912, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6913, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6914, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6920, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6921, + "latitude": 41.049866, + "longitude": -73.53796, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6922, + "latitude": 41.051551, + "longitude": -73.514344, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6925, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6926, + "latitude": 41.041197, + "longitude": -73.538567, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6927, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 6928, + "latitude": 41.308873, + "longitude": -73.363661, + "city": "Stamford", + "state": "CT", + "county": "Fairfield" + }, + { + "zip_code": 7001, + "latitude": 40.582845, + "longitude": -74.27524, + "city": "Avenel", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 7002, + "latitude": 40.670858, + "longitude": -74.109486, + "city": "Bayonne", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7003, + "latitude": 40.808549, + "longitude": -74.187005, + "city": "Bloomfield", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7004, + "latitude": 40.875948, + "longitude": -74.29681, + "city": "Fairfield", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7005, + "latitude": 40.918648, + "longitude": -74.430696, + "city": "Boonton", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7006, + "latitude": 40.854548, + "longitude": -74.278892, + "city": "Caldwell", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7007, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Caldwell", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7008, + "latitude": 40.583203, + "longitude": -74.234839, + "city": "Carteret", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 7009, + "latitude": 40.857049, + "longitude": -74.227109, + "city": "Cedar Grove", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7010, + "latitude": 40.820541, + "longitude": -73.98782, + "city": "Cliffside Park", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7011, + "latitude": 40.877949, + "longitude": -74.141237, + "city": "Clifton", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7012, + "latitude": 40.847699, + "longitude": -74.160538, + "city": "Clifton", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7013, + "latitude": 40.872898, + "longitude": -74.170138, + "city": "Clifton", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7014, + "latitude": 40.832449, + "longitude": -74.136937, + "city": "Clifton", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7015, + "latitude": 41.011428, + "longitude": -74.304793, + "city": "Clifton", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7016, + "latitude": 40.654802, + "longitude": -74.304792, + "city": "Cranford", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7017, + "latitude": 40.77185, + "longitude": -74.207039, + "city": "East Orange", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7018, + "latitude": 40.7566, + "longitude": -74.216839, + "city": "East Orange", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7019, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "East Orange", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7020, + "latitude": 40.82655, + "longitude": -73.978082, + "city": "Edgewater", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7021, + "latitude": 40.826158, + "longitude": -74.276591, + "city": "Essex Fells", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7022, + "latitude": 40.817537, + "longitude": -74.000883, + "city": "Fairview", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7023, + "latitude": 40.641902, + "longitude": -74.387044, + "city": "Fanwood", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7024, + "latitude": 40.848745, + "longitude": -73.974032, + "city": "Fort Lee", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7026, + "latitude": 40.884648, + "longitude": -74.110336, + "city": "Garfield", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7027, + "latitude": 40.651242, + "longitude": -74.322892, + "city": "Garwood", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7028, + "latitude": 40.807499, + "longitude": -74.205039, + "city": "Glen Ridge", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7029, + "latitude": 40.744501, + "longitude": -74.150787, + "city": "Harrison", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7030, + "latitude": 40.746851, + "longitude": -74.033934, + "city": "Hoboken", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7031, + "latitude": 40.787112, + "longitude": -74.127316, + "city": "North Arlington", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7032, + "latitude": 40.75175, + "longitude": -74.122937, + "city": "Kearny", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7033, + "latitude": 40.677601, + "longitude": -74.291191, + "city": "Kenilworth", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7034, + "latitude": 40.880649, + "longitude": -74.379745, + "city": "Lake Hiawatha", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7035, + "latitude": 40.926637, + "longitude": -74.303093, + "city": "Lincoln Park", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7036, + "latitude": 40.626953, + "longitude": -74.250939, + "city": "Linden", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7039, + "latitude": 40.787006, + "longitude": -74.325993, + "city": "Livingston", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7040, + "latitude": 40.7291, + "longitude": -74.266541, + "city": "Maplewood", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7041, + "latitude": 40.73365, + "longitude": -74.301692, + "city": "Millburn", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7042, + "latitude": 40.811908, + "longitude": -74.216389, + "city": "Montclair", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7043, + "latitude": 40.8034, + "longitude": -74.19448, + "city": "Montclair", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7044, + "latitude": 40.832849, + "longitude": -74.243895, + "city": "Verona", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7045, + "latitude": 40.906311, + "longitude": -74.363231, + "city": "Montville", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7046, + "latitude": 40.890502, + "longitude": -74.440898, + "city": "Mountain Lakes", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7047, + "latitude": 40.789724, + "longitude": -74.023234, + "city": "North Bergen", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7050, + "latitude": 40.7704, + "longitude": -74.23674, + "city": "Orange", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7051, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Orange", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7052, + "latitude": 40.789944, + "longitude": -74.22719, + "city": "West Orange", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7054, + "latitude": 40.852118, + "longitude": -74.407706, + "city": "Parsippany", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7055, + "latitude": 40.855103, + "longitude": -74.126916, + "city": "Passaic", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7057, + "latitude": 40.852799, + "longitude": -74.107325, + "city": "Wallington", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7058, + "latitude": 40.871014, + "longitude": -74.340144, + "city": "Pine Brook", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7059, + "latitude": 40.629101, + "longitude": -74.532449, + "city": "Warren", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 7060, + "latitude": 40.615202, + "longitude": -74.414995, + "city": "Plainfield", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7061, + "latitude": 40.665651, + "longitude": -74.299692, + "city": "Plainfield", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7062, + "latitude": 40.632252, + "longitude": -74.399736, + "city": "Plainfield", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7063, + "latitude": 40.604752, + "longitude": -74.442746, + "city": "Plainfield", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7064, + "latitude": 40.570254, + "longitude": -74.249739, + "city": "Port Reading", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 7065, + "latitude": 40.609553, + "longitude": -74.280641, + "city": "Rahway", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7066, + "latitude": 40.622502, + "longitude": -74.311092, + "city": "Clark", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7067, + "latitude": 40.590853, + "longitude": -74.314688, + "city": "Colonia", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 7068, + "latitude": 40.820499, + "longitude": -74.306093, + "city": "Roseland", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7069, + "latitude": "", + "longitude": "", + "city": "Watchung", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 7070, + "latitude": 40.827449, + "longitude": -74.109786, + "city": "Rutherford", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7071, + "latitude": 40.799549, + "longitude": -74.116517, + "city": "Lyndhurst", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7072, + "latitude": 40.828399, + "longitude": -74.076055, + "city": "Carlstadt", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7073, + "latitude": 40.828399, + "longitude": -74.093886, + "city": "East Rutherford", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7074, + "latitude": 40.839299, + "longitude": -74.060184, + "city": "Moonachie", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7075, + "latitude": 40.848599, + "longitude": -74.089585, + "city": "Wood Ridge", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7076, + "latitude": 40.637852, + "longitude": -74.368244, + "city": "Scotch Plains", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7077, + "latitude": 40.551804, + "longitude": -74.259139, + "city": "Sewaren", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 7078, + "latitude": 40.74055, + "longitude": -74.334443, + "city": "Short Hills", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7079, + "latitude": 40.745772, + "longitude": -74.267541, + "city": "South Orange", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7080, + "latitude": 40.572065, + "longitude": -74.413545, + "city": "South Plainfield", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 7081, + "latitude": 40.701101, + "longitude": -74.316301, + "city": "Springfield", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7082, + "latitude": 40.92769, + "longitude": -74.347695, + "city": "Towaco", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7083, + "latitude": 40.692651, + "longitude": -74.269841, + "city": "Union", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7086, + "latitude": "", + "longitude": "", + "city": "Weehawken", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7087, + "latitude": 40.758951, + "longitude": -74.056335, + "city": "Union City", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7088, + "latitude": 40.71789, + "longitude": -74.284341, + "city": "Vauxhall", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7090, + "latitude": 40.652851, + "longitude": -74.346764, + "city": "Westfield", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7091, + "latitude": 40.665651, + "longitude": -74.299692, + "city": "Westfield", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7092, + "latitude": 40.680701, + "longitude": -74.358394, + "city": "Mountainside", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7093, + "latitude": 40.7888, + "longitude": -74.011533, + "city": "West New York", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7094, + "latitude": 40.78885, + "longitude": -74.056035, + "city": "Secaucus", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7095, + "latitude": 40.553254, + "longitude": -74.288023, + "city": "Woodbridge", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 7096, + "latitude": 40.73276, + "longitude": -74.075485, + "city": "Secaucus", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7097, + "latitude": 40.73276, + "longitude": -74.075485, + "city": "Jersey City", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7099, + "latitude": 40.73276, + "longitude": -74.075485, + "city": "Kearny", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7101, + "latitude": 40.736101, + "longitude": -74.22509, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7102, + "latitude": 40.735642, + "longitude": -74.173988, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7103, + "latitude": 40.738901, + "longitude": -74.194839, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7104, + "latitude": 40.76435, + "longitude": -74.151788, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7105, + "latitude": 40.723606, + "longitude": -74.147337, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7106, + "latitude": 40.74245, + "longitude": -74.23114, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7107, + "latitude": 40.7646, + "longitude": -74.188029, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7108, + "latitude": 40.722496, + "longitude": -74.200649, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7109, + "latitude": 40.7821, + "longitude": -74.167488, + "city": "Belleville", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7110, + "latitude": 40.821299, + "longitude": -74.159449, + "city": "Nutley", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7111, + "latitude": 40.726231, + "longitude": -74.23294, + "city": "Irvington", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7112, + "latitude": 40.711151, + "longitude": -74.211265, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7114, + "latitude": 40.705401, + "longitude": -74.169538, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7175, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7182, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7184, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7188, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7189, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7191, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7192, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7193, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7194, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7195, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7197, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7198, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7199, + "latitude": 40.79185, + "longitude": -74.245241, + "city": "Newark", + "state": "NJ", + "county": "Essex" + }, + { + "zip_code": 7201, + "latitude": 40.672052, + "longitude": -74.183438, + "city": "Elizabeth", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7202, + "latitude": 40.650902, + "longitude": -74.217189, + "city": "Elizabeth", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7203, + "latitude": 40.650152, + "longitude": -74.25879, + "city": "Roselle", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7204, + "latitude": 40.665652, + "longitude": -74.26674, + "city": "Roselle Park", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7205, + "latitude": 40.693823, + "longitude": -74.229889, + "city": "Hillside", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7206, + "latitude": 40.652152, + "longitude": -74.191814, + "city": "Elizabeth", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7207, + "latitude": 40.665651, + "longitude": -74.299692, + "city": "Elizabeth", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7208, + "latitude": 40.677102, + "longitude": -74.229289, + "city": "Elizabeth", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7302, + "latitude": 40.726001, + "longitude": -74.047304, + "city": "Jersey City", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7303, + "latitude": 40.73276, + "longitude": -74.075485, + "city": "Jersey City", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7304, + "latitude": 40.716101, + "longitude": -74.065535, + "city": "Jersey City", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7305, + "latitude": 40.696661, + "longitude": -74.081135, + "city": "Jersey City", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7306, + "latitude": 40.734951, + "longitude": -74.068685, + "city": "Jersey City", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7307, + "latitude": 40.749801, + "longitude": -74.054285, + "city": "Jersey City", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7308, + "latitude": 40.73276, + "longitude": -74.075485, + "city": "Jersey City", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7309, + "latitude": 40.73276, + "longitude": -74.075485, + "city": "Jersey City", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7310, + "latitude": 40.732728, + "longitude": -74.037168, + "city": "Jersey City", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7311, + "latitude": 40.73235, + "longitude": -74.075391, + "city": "Jersey City", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7399, + "latitude": 40.73235, + "longitude": -74.075391, + "city": "Jersey City", + "state": "NJ", + "county": "Hudson" + }, + { + "zip_code": 7401, + "latitude": 41.017446, + "longitude": -74.062774, + "city": "Allendale", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7403, + "latitude": 41.023414, + "longitude": -74.334444, + "city": "Bloomingdale", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7405, + "latitude": 40.998797, + "longitude": -74.426148, + "city": "Butler", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7407, + "latitude": 40.905848, + "longitude": -74.117736, + "city": "Elmwood Park", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7410, + "latitude": 40.935348, + "longitude": -74.119236, + "city": "Fair Lawn", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7416, + "latitude": 41.115723, + "longitude": -74.593439, + "city": "Franklin", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7417, + "latitude": 41.010464, + "longitude": -74.20831, + "city": "Franklin Lakes", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7418, + "latitude": 41.228102, + "longitude": -74.477351, + "city": "Glenwood", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7419, + "latitude": 41.159187, + "longitude": -74.57688, + "city": "Hamburg", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7420, + "latitude": 41.028396, + "longitude": -74.304516, + "city": "Haskell", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7421, + "latitude": 41.151395, + "longitude": -74.357893, + "city": "Hewitt", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7422, + "latitude": 41.187468, + "longitude": -74.458935, + "city": "Highland Lakes", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7423, + "latitude": 40.998882, + "longitude": -74.096848, + "city": "Ho Ho Kus", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7424, + "latitude": 40.883548, + "longitude": -74.214388, + "city": "Little Falls", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7428, + "latitude": 41.206509, + "longitude": -74.538144, + "city": "Mc Afee", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7430, + "latitude": 41.053446, + "longitude": -74.172766, + "city": "Mahwah", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7432, + "latitude": 40.994697, + "longitude": -74.142287, + "city": "Midland Park", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7435, + "latitude": 41.053096, + "longitude": -74.439356, + "city": "Newfoundland", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7436, + "latitude": 41.023402, + "longitude": -74.238623, + "city": "Oakland", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7438, + "latitude": 41.099796, + "longitude": -74.443399, + "city": "Oak Ridge", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7439, + "latitude": 41.078346, + "longitude": -74.594104, + "city": "Ogdensburg", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7440, + "latitude": 40.948208, + "longitude": -74.295592, + "city": "Pequannock", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7442, + "latitude": 40.999597, + "longitude": -74.297725, + "city": "Pompton Lakes", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7444, + "latitude": 41.008797, + "longitude": -74.402663, + "city": "Pompton Plains", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7446, + "latitude": 41.059124, + "longitude": -74.133441, + "city": "Ramsey", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7450, + "latitude": 40.982247, + "longitude": -74.11207, + "city": "Ridgewood", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7451, + "latitude": 40.948054, + "longitude": -74.083231, + "city": "Ridgewood", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7452, + "latitude": 40.960347, + "longitude": -74.125036, + "city": "Glen Rock", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7456, + "latitude": 41.110445, + "longitude": -74.293271, + "city": "Ringwood", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7457, + "latitude": 40.992647, + "longitude": -74.312443, + "city": "Riverdale", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7458, + "latitude": 41.044324, + "longitude": -74.098093, + "city": "Saddle River", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7460, + "latitude": 41.138101, + "longitude": -74.561915, + "city": "Stockholm", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7461, + "latitude": 41.242702, + "longitude": -74.596734, + "city": "Sussex", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7462, + "latitude": 41.189046, + "longitude": -74.51434, + "city": "Vernon", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7463, + "latitude": 41.041225, + "longitude": -74.128326, + "city": "Waldwick", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7465, + "latitude": 41.065596, + "longitude": -74.297393, + "city": "Wanaque", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7470, + "latitude": 40.948689, + "longitude": -74.241168, + "city": "Wayne", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7474, + "latitude": 41.011428, + "longitude": -74.304793, + "city": "Wayne", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7477, + "latitude": 41.011428, + "longitude": -74.304793, + "city": "Wayne", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7480, + "latitude": 41.047296, + "longitude": -74.294243, + "city": "West Milford", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7481, + "latitude": 40.998387, + "longitude": -74.165733, + "city": "Wyckoff", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7495, + "latitude": 40.948054, + "longitude": -74.083231, + "city": "Mahwah", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7498, + "latitude": 40.948054, + "longitude": -74.083231, + "city": "Mahwah", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7501, + "latitude": 40.915045, + "longitude": -74.174488, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7502, + "latitude": 40.918698, + "longitude": -74.194989, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7503, + "latitude": 40.898098, + "longitude": -74.151837, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7504, + "latitude": 40.911248, + "longitude": -74.144087, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7505, + "latitude": 40.916648, + "longitude": -74.174038, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7506, + "latitude": 40.954375, + "longitude": -74.161788, + "city": "Hawthorne", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7507, + "latitude": 41.011428, + "longitude": -74.304793, + "city": "Hawthorne", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7508, + "latitude": 40.951587, + "longitude": -74.186269, + "city": "Haledon", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7509, + "latitude": 41.011428, + "longitude": -74.304793, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7510, + "latitude": 41.011428, + "longitude": -74.304793, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7511, + "latitude": 41.011428, + "longitude": -74.304793, + "city": "Totowa", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7512, + "latitude": 40.901698, + "longitude": -74.22199, + "city": "Totowa", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7513, + "latitude": 40.907698, + "longitude": -74.146515, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7514, + "latitude": 40.928748, + "longitude": -74.143187, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7522, + "latitude": 40.923798, + "longitude": -74.179488, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7524, + "latitude": 40.932498, + "longitude": -74.156971, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7533, + "latitude": 41.011428, + "longitude": -74.304793, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7538, + "latitude": 41.011428, + "longitude": -74.304793, + "city": "Haledon", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7543, + "latitude": 41.011428, + "longitude": -74.304793, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7544, + "latitude": 41.011428, + "longitude": -74.304793, + "city": "Paterson", + "state": "NJ", + "county": "Passaic" + }, + { + "zip_code": 7601, + "latitude": 40.913482, + "longitude": -74.001623, + "city": "Hackensack", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7602, + "latitude": 40.948054, + "longitude": -74.083231, + "city": "Hackensack", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7603, + "latitude": 40.874773, + "longitude": -74.030484, + "city": "Bogota", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7604, + "latitude": 40.862349, + "longitude": -74.075585, + "city": "Hasbrouck Heights", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7605, + "latitude": 40.863499, + "longitude": -73.987132, + "city": "Leonia", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7606, + "latitude": 40.857899, + "longitude": -74.048884, + "city": "South Hackensack", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7607, + "latitude": 40.90181, + "longitude": -74.061784, + "city": "Maywood", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7608, + "latitude": 40.863954, + "longitude": -74.055584, + "city": "Teterboro", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7620, + "latitude": 40.958975, + "longitude": -73.927906, + "city": "Alpine", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7621, + "latitude": 40.923498, + "longitude": -73.998332, + "city": "Bergenfield", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7624, + "latitude": 40.970621, + "longitude": -73.960164, + "city": "Closter", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7626, + "latitude": 40.972898, + "longitude": -74.098841, + "city": "Cresskill", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7627, + "latitude": 40.954198, + "longitude": -73.957623, + "city": "Demarest", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7628, + "latitude": 40.955018, + "longitude": -73.989911, + "city": "Dumont", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7630, + "latitude": 40.973199, + "longitude": -74.021118, + "city": "Emerson", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7631, + "latitude": 40.889498, + "longitude": -73.971782, + "city": "Englewood", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7632, + "latitude": 40.883949, + "longitude": -73.952423, + "city": "Englewood Cliffs", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7640, + "latitude": 40.991696, + "longitude": -73.98486, + "city": "Harrington Park", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7641, + "latitude": 40.963867, + "longitude": -73.99358, + "city": "Haworth", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7642, + "latitude": 41.008367, + "longitude": -74.048576, + "city": "Hillsdale", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7643, + "latitude": 40.925361, + "longitude": -74.076029, + "city": "Little Ferry", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7644, + "latitude": 40.878349, + "longitude": -74.081335, + "city": "Lodi", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7645, + "latitude": 41.054651, + "longitude": -74.045425, + "city": "Montvale", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7646, + "latitude": 40.932998, + "longitude": -74.017633, + "city": "New Milford", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7647, + "latitude": 41.008636, + "longitude": -73.93893, + "city": "Northvale", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7648, + "latitude": 40.992921, + "longitude": -73.949747, + "city": "Norwood", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7649, + "latitude": 40.955347, + "longitude": -74.026983, + "city": "Oradell", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7650, + "latitude": 40.939673, + "longitude": -74.010792, + "city": "Palisades Park", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7652, + "latitude": 40.944997, + "longitude": -74.068964, + "city": "Paramus", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7653, + "latitude": 40.948054, + "longitude": -74.083231, + "city": "Paramus", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7656, + "latitude": 41.032868, + "longitude": -74.042948, + "city": "Park Ridge", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7657, + "latitude": 40.83315, + "longitude": -74.004233, + "city": "Ridgefield", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7660, + "latitude": 40.853449, + "longitude": -74.021233, + "city": "Ridgefield Park", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7661, + "latitude": 40.926248, + "longitude": -74.038533, + "city": "River Edge", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7662, + "latitude": 40.905698, + "longitude": -74.079035, + "city": "Rochelle Park", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7663, + "latitude": 40.942101, + "longitude": -74.094685, + "city": "Saddle Brook", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7666, + "latitude": 40.914616, + "longitude": -73.986334, + "city": "Teaneck", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7670, + "latitude": 40.919298, + "longitude": -73.960481, + "city": "Tenafly", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7675, + "latitude": 41.011453, + "longitude": -74.021278, + "city": "Westwood", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7676, + "latitude": "", + "longitude": "", + "city": "Township Of Washington", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7677, + "latitude": "", + "longitude": "", + "city": "Woodcliff Lake", + "state": "NJ", + "county": "Bergen" + }, + { + "zip_code": 7701, + "latitude": 40.358409, + "longitude": -74.068143, + "city": "Red Bank", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7702, + "latitude": 40.325361, + "longitude": -74.107943, + "city": "Shrewsbury", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7703, + "latitude": 40.314531, + "longitude": -74.041654, + "city": "Fort Monmouth", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7704, + "latitude": 40.358459, + "longitude": -74.036433, + "city": "Fair Haven", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7709, + "latitude": 40.302718, + "longitude": -74.24928, + "city": "Allenhurst", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7710, + "latitude": 40.302718, + "longitude": -74.24928, + "city": "Adelphia", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7711, + "latitude": 40.237111, + "longitude": -74.008581, + "city": "Allenhurst", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7712, + "latitude": 40.250725, + "longitude": -74.048582, + "city": "Asbury Park", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7715, + "latitude": 40.302718, + "longitude": -74.24928, + "city": "Belmar", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7716, + "latitude": 40.404762, + "longitude": -74.05617, + "city": "Atlantic Highlands", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7717, + "latitude": 40.191913, + "longitude": -74.015931, + "city": "Avon By The Sea", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7718, + "latitude": 40.417707, + "longitude": -74.088534, + "city": "Belford", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7719, + "latitude": 40.257461, + "longitude": -74.112134, + "city": "Belmar", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7720, + "latitude": 40.202113, + "longitude": -74.012581, + "city": "Bradley Beach", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7721, + "latitude": 40.38633, + "longitude": -74.115229, + "city": "Cliffwood", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7722, + "latitude": 40.302848, + "longitude": -74.160911, + "city": "Colts Neck", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7723, + "latitude": 40.250861, + "longitude": -74.004581, + "city": "Deal", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7724, + "latitude": 40.30466, + "longitude": -74.073433, + "city": "Eatontown", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7726, + "latitude": 40.2697, + "longitude": -74.265539, + "city": "Englishtown", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7727, + "latitude": 40.285211, + "longitude": -74.161571, + "city": "Farmingdale", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7728, + "latitude": 40.236423, + "longitude": -74.306284, + "city": "Freehold", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7730, + "latitude": 40.423057, + "longitude": -74.176036, + "city": "Hazlet", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7731, + "latitude": 40.258361, + "longitude": -74.19678, + "city": "Howell", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7732, + "latitude": 40.401078, + "longitude": -74.000582, + "city": "Highlands", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7733, + "latitude": 40.376408, + "longitude": -74.170037, + "city": "Holmdel", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7734, + "latitude": 40.438145, + "longitude": -74.127883, + "city": "Keansburg", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7735, + "latitude": 40.438398, + "longitude": -74.188087, + "city": "Keyport", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7737, + "latitude": 40.409391, + "longitude": -74.059884, + "city": "Leonardo", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7738, + "latitude": 40.346629, + "longitude": -74.125401, + "city": "Lincroft", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7739, + "latitude": 40.382028, + "longitude": -74.168941, + "city": "Little Silver", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7740, + "latitude": 40.345361, + "longitude": -74.1109, + "city": "Long Branch", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7746, + "latitude": 40.351277, + "longitude": -74.141236, + "city": "Marlboro", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7747, + "latitude": 40.407507, + "longitude": -74.233788, + "city": "Matawan", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7748, + "latitude": 40.400997, + "longitude": -74.144636, + "city": "Middletown", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7750, + "latitude": 40.277757, + "longitude": -74.194702, + "city": "Monmouth Beach", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7751, + "latitude": 40.319979, + "longitude": -74.214488, + "city": "Morganville", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7752, + "latitude": 40.402277, + "longitude": -74.027285, + "city": "Navesink", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7753, + "latitude": 40.209551, + "longitude": -74.071351, + "city": "Neptune", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7754, + "latitude": 40.302718, + "longitude": -74.24928, + "city": "Neptune", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7755, + "latitude": 40.261158, + "longitude": -74.021382, + "city": "Oakhurst", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7756, + "latitude": 40.278922, + "longitude": -74.123285, + "city": "Ocean Grove", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7757, + "latitude": 40.31496, + "longitude": -74.019032, + "city": "Oceanport", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7758, + "latitude": 40.429731, + "longitude": -74.106535, + "city": "Port Monmouth", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7760, + "latitude": 40.370684, + "longitude": -74.008432, + "city": "Rumson", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7762, + "latitude": 40.176013, + "longitude": -74.031331, + "city": "Spring Lake", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7763, + "latitude": 40.302718, + "longitude": -74.24928, + "city": "Tennent", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7764, + "latitude": 40.283511, + "longitude": -74.018282, + "city": "West Long Branch", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7765, + "latitude": 40.302718, + "longitude": -74.24928, + "city": "Wickatunk", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7777, + "latitude": 40.302718, + "longitude": -74.24928, + "city": "Holmdel", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7799, + "latitude": 40.302718, + "longitude": -74.24928, + "city": "Eatontown", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 7801, + "latitude": 40.917598, + "longitude": -74.546651, + "city": "Dover", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7802, + "latitude": 40.867331, + "longitude": -74.578269, + "city": "Dover", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7803, + "latitude": 40.877099, + "longitude": -74.584453, + "city": "Mine Hill", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7806, + "latitude": 40.867331, + "longitude": -74.578269, + "city": "Picatinny Arsenal", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7820, + "latitude": 40.869648, + "longitude": -74.849661, + "city": "Allamuchy", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7821, + "latitude": 41.092778, + "longitude": -74.718969, + "city": "Andover", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7822, + "latitude": 41.161241, + "longitude": -74.6174, + "city": "Augusta", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7823, + "latitude": 40.819772, + "longitude": -75.030961, + "city": "Belvidere", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7825, + "latitude": 40.942238, + "longitude": -74.937487, + "city": "Blairstown", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7826, + "latitude": 41.188035, + "longitude": -74.824675, + "city": "Branchville", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7827, + "latitude": 41.255279, + "longitude": -74.644746, + "city": "Montague", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7828, + "latitude": 40.880028, + "longitude": -74.75756, + "city": "Budd Lake", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7829, + "latitude": 40.84335, + "longitude": -74.985914, + "city": "Buttzville", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7830, + "latitude": 40.717424, + "longitude": -74.813951, + "city": "Califon", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 7831, + "latitude": 40.739382, + "longitude": -74.944756, + "city": "Changewater", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7832, + "latitude": 40.893979, + "longitude": -75.029163, + "city": "Columbia", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7833, + "latitude": 40.906906, + "longitude": -75.075377, + "city": "Delaware", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7834, + "latitude": 40.881248, + "longitude": -74.489349, + "city": "Denville", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7836, + "latitude": 40.850884, + "longitude": -74.701558, + "city": "Flanders", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7837, + "latitude": 41.12831, + "longitude": -74.678956, + "city": "Glasser", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7838, + "latitude": 40.888834, + "longitude": -74.937714, + "city": "Great Meadows", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7839, + "latitude": 41.12831, + "longitude": -74.678956, + "city": "Greendell", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7840, + "latitude": 40.868804, + "longitude": -74.844734, + "city": "Hackettstown", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7842, + "latitude": 40.867331, + "longitude": -74.578269, + "city": "Hibernia", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7843, + "latitude": 40.936753, + "longitude": -74.659969, + "city": "Hopatcong", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7844, + "latitude": 40.919658, + "longitude": -74.984628, + "city": "Hope", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7845, + "latitude": 40.867331, + "longitude": -74.578269, + "city": "Ironia", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7846, + "latitude": 40.968998, + "longitude": -74.873265, + "city": "Johnsonburg", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7847, + "latitude": 40.876098, + "longitude": -74.695309, + "city": "Kenvil", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7848, + "latitude": 41.128183, + "longitude": -74.731759, + "city": "Lafayette", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7849, + "latitude": 40.950597, + "longitude": -74.612904, + "city": "Lake Hopatcong", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7850, + "latitude": 40.906298, + "longitude": -74.664605, + "city": "Landing", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7851, + "latitude": 41.178266, + "longitude": -74.89306, + "city": "Layton", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7852, + "latitude": 40.863318, + "longitude": -74.721224, + "city": "Ledgewood", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7853, + "latitude": 40.806849, + "longitude": -74.794595, + "city": "Long Valley", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7855, + "latitude": 41.12831, + "longitude": -74.678956, + "city": "Middleville", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7856, + "latitude": 40.874049, + "longitude": -74.73433, + "city": "Mount Arlington", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7857, + "latitude": 40.897808, + "longitude": -74.700159, + "city": "Netcong", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7860, + "latitude": 41.069522, + "longitude": -74.806938, + "city": "Newton", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7863, + "latitude": 40.820044, + "longitude": -74.941392, + "city": "Oxford", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7865, + "latitude": 40.810748, + "longitude": -74.87427, + "city": "Port Murray", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7866, + "latitude": 40.960111, + "longitude": -74.501551, + "city": "Rockaway", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7869, + "latitude": 40.837399, + "longitude": -74.586052, + "city": "Randolph", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7870, + "latitude": 40.810362, + "longitude": -74.819318, + "city": "Schooleys Mountain", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7871, + "latitude": 41.040597, + "longitude": -74.718191, + "city": "Sparta", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7874, + "latitude": 40.930937, + "longitude": -74.713557, + "city": "Stanhope", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7875, + "latitude": 41.043858, + "longitude": -74.871981, + "city": "Stillwater", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7876, + "latitude": 40.855286, + "longitude": -74.655255, + "city": "Succasunna", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7877, + "latitude": 41.10289, + "longitude": -74.850759, + "city": "Swartswood", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7878, + "latitude": 40.871099, + "longitude": -74.477699, + "city": "Mount Tabor", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7879, + "latitude": 40.955934, + "longitude": -74.788108, + "city": "Tranquility", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7880, + "latitude": 40.864844, + "longitude": -74.897002, + "city": "Vienna", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7881, + "latitude": 41.125646, + "longitude": -74.917711, + "city": "Wallpack Center", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7882, + "latitude": 40.747698, + "longitude": -75.008713, + "city": "Washington", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 7885, + "latitude": 40.935349, + "longitude": -74.577102, + "city": "Wharton", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7890, + "latitude": 41.12831, + "longitude": -74.678956, + "city": "Branchville", + "state": "NJ", + "county": "Sussex" + }, + { + "zip_code": 7901, + "latitude": 40.71275, + "longitude": -74.361594, + "city": "Summit", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7902, + "latitude": 40.665651, + "longitude": -74.299692, + "city": "Summit", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7920, + "latitude": 40.682651, + "longitude": -74.573001, + "city": "Basking Ridge", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 7921, + "latitude": 40.659151, + "longitude": -74.676788, + "city": "Bedminster", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 7922, + "latitude": 40.675451, + "longitude": -74.422196, + "city": "Berkeley Heights", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7924, + "latitude": 40.72575, + "longitude": -74.593552, + "city": "Bernardsville", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 7926, + "latitude": 40.800353, + "longitude": -74.571785, + "city": "Brookside", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7927, + "latitude": 40.820799, + "longitude": -74.456198, + "city": "Cedar Knolls", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7928, + "latitude": 40.759477, + "longitude": -74.496806, + "city": "Chatham", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7930, + "latitude": 40.782111, + "longitude": -74.683861, + "city": "Chester", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7931, + "latitude": 40.699572, + "longitude": -74.653603, + "city": "Far Hills", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 7932, + "latitude": 40.7735, + "longitude": -74.397996, + "city": "Florham Park", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7933, + "latitude": 40.689339, + "longitude": -74.472198, + "city": "Gillette", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7934, + "latitude": 40.715359, + "longitude": -74.682767, + "city": "Gladstone", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 7935, + "latitude": 40.739782, + "longitude": -74.448747, + "city": "Green Village", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7936, + "latitude": 40.816349, + "longitude": -74.367747, + "city": "East Hanover", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7938, + "latitude": 40.655399, + "longitude": -74.586151, + "city": "Liberty Corner", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 7939, + "latitude": 40.566553, + "longitude": -74.599801, + "city": "Lyons", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 7940, + "latitude": 40.7582, + "longitude": -74.423019, + "city": "Madison", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7945, + "latitude": 40.786699, + "longitude": -74.5938, + "city": "Mendham", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7946, + "latitude": 40.678701, + "longitude": -74.505399, + "city": "Millington", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7950, + "latitude": 40.843399, + "longitude": -74.540341, + "city": "Morris Plains", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7960, + "latitude": 40.77165, + "longitude": -74.506256, + "city": "Morristown", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7961, + "latitude": 40.77975, + "longitude": -74.442797, + "city": "Morristown", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7962, + "latitude": 40.867331, + "longitude": -74.578269, + "city": "Morristown", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7963, + "latitude": 40.867331, + "longitude": -74.578269, + "city": "Morristown", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7970, + "latitude": 40.805549, + "longitude": -74.573832, + "city": "Mount Freedom", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7974, + "latitude": 40.697851, + "longitude": -74.405595, + "city": "New Providence", + "state": "NJ", + "county": "Union" + }, + { + "zip_code": 7976, + "latitude": 40.739599, + "longitude": -74.483413, + "city": "New Vernon", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7977, + "latitude": 40.707876, + "longitude": -74.654131, + "city": "Peapack", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 7978, + "latitude": 40.642491, + "longitude": -74.639597, + "city": "Pluckemin", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 7979, + "latitude": 40.708241, + "longitude": -74.748389, + "city": "Pottersville", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 7980, + "latitude": 40.69835, + "longitude": -74.450197, + "city": "Stirling", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7981, + "latitude": 40.823899, + "longitude": -74.419097, + "city": "Whippany", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7983, + "latitude": 40.867331, + "longitude": -74.578269, + "city": "Whippany", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 7999, + "latitude": 40.867331, + "longitude": -74.578269, + "city": "Whippany", + "state": "NJ", + "county": "Morris" + }, + { + "zip_code": 8001, + "latitude": 39.559077, + "longitude": -75.350573, + "city": "Alloway", + "state": "NJ", + "county": "Salem" + }, + { + "zip_code": 8002, + "latitude": 39.908663, + "longitude": -75.010307, + "city": "Cherry Hill", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8003, + "latitude": 39.889763, + "longitude": -74.972761, + "city": "Cherry Hill", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8004, + "latitude": 39.760048, + "longitude": -74.866534, + "city": "Atco", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8005, + "latitude": 39.753858, + "longitude": -74.293989, + "city": "Barnegat", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8006, + "latitude": 39.751214, + "longitude": -74.114631, + "city": "Barnegat Light", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8007, + "latitude": 39.863813, + "longitude": -75.053765, + "city": "Barrington", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8008, + "latitude": 39.641062, + "longitude": -74.192228, + "city": "Beach Haven", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8009, + "latitude": 39.761231, + "longitude": -74.92701, + "city": "Berlin", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8010, + "latitude": 40.049948, + "longitude": -74.917061, + "city": "Beverly", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8011, + "latitude": 39.976041, + "longitude": -74.711429, + "city": "Birmingham", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8012, + "latitude": 39.790131, + "longitude": -75.036652, + "city": "Blackwood", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8014, + "latitude": 39.802163, + "longitude": -75.339215, + "city": "Bridgeport", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8015, + "latitude": 39.924179, + "longitude": -74.670408, + "city": "Browns Mills", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8016, + "latitude": 40.089874, + "longitude": -74.751146, + "city": "Burlington", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8018, + "latitude": 39.80237, + "longitude": -74.938259, + "city": "Cedar Brook", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8019, + "latitude": 39.749506, + "longitude": -74.558941, + "city": "Chatsworth", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8020, + "latitude": 39.796706, + "longitude": -75.218852, + "city": "Clarksboro", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8021, + "latitude": 39.80364, + "longitude": -75.005762, + "city": "Clementon", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8022, + "latitude": 40.049355, + "longitude": -74.702475, + "city": "Columbus", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8023, + "latitude": 39.681545, + "longitude": -75.493433, + "city": "Deepwater", + "state": "NJ", + "county": "Salem" + }, + { + "zip_code": 8025, + "latitude": 39.701526, + "longitude": -75.162903, + "city": "Ewan", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8026, + "latitude": 39.833114, + "longitude": -74.967496, + "city": "Gibbsboro", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8027, + "latitude": 39.771133, + "longitude": -75.272137, + "city": "Gibbstown", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8028, + "latitude": 39.696661, + "longitude": -75.127183, + "city": "Glassboro", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8029, + "latitude": 39.837113, + "longitude": -75.062315, + "city": "Glendora", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8030, + "latitude": 39.890413, + "longitude": -75.112619, + "city": "Gloucester City", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8031, + "latitude": 39.805543, + "longitude": -75.067729, + "city": "Bellmawr", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8032, + "latitude": 39.77875, + "longitude": -75.060114, + "city": "Grenloch", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8033, + "latitude": 39.876313, + "longitude": -75.033414, + "city": "Haddonfield", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8034, + "latitude": 39.899962, + "longitude": -75.035015, + "city": "Cherry Hill", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8035, + "latitude": 39.879163, + "longitude": -75.065666, + "city": "Haddon Heights", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8036, + "latitude": 39.987212, + "longitude": -74.829308, + "city": "Hainesport", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8037, + "latitude": 39.563616, + "longitude": -74.711081, + "city": "Hammonton", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8038, + "latitude": 39.569805, + "longitude": -75.312703, + "city": "Hancocks Bridge", + "state": "NJ", + "county": "Salem" + }, + { + "zip_code": 8039, + "latitude": 39.693067, + "longitude": -75.271114, + "city": "Harrisonville", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8041, + "latitude": 40.044129, + "longitude": -74.679579, + "city": "Jobstown", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8042, + "latitude": 40.012273, + "longitude": -74.66464, + "city": "Juliustown", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8043, + "latitude": 39.839156, + "longitude": -74.965057, + "city": "Voorhees", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8045, + "latitude": 39.868113, + "longitude": -75.032114, + "city": "Lawnside", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8046, + "latitude": 40.013737, + "longitude": -74.805773, + "city": "Willingboro", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8048, + "latitude": 39.962299, + "longitude": -74.80007, + "city": "Lumberton", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8049, + "latitude": 39.854363, + "longitude": -75.036214, + "city": "Magnolia", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8050, + "latitude": 39.702978, + "longitude": -74.257677, + "city": "Manahawkin", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8051, + "latitude": 39.751571, + "longitude": -75.212842, + "city": "Mantua", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8052, + "latitude": 39.951212, + "longitude": -74.992163, + "city": "Maple Shade", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8053, + "latitude": 39.892263, + "longitude": -74.94075, + "city": "Marlton", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8054, + "latitude": 39.955912, + "longitude": -74.91731, + "city": "Mount Laurel", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8055, + "latitude": 39.874549, + "longitude": -74.762083, + "city": "Medford", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8056, + "latitude": 39.787913, + "longitude": -75.246687, + "city": "Mickleton", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8057, + "latitude": 40.054255, + "longitude": -74.840115, + "city": "Moorestown", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8059, + "latitude": 39.886463, + "longitude": -75.094068, + "city": "Mount Ephraim", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8060, + "latitude": 40.044956, + "longitude": -74.801869, + "city": "Mount Holly", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8061, + "latitude": 39.808643, + "longitude": -75.212943, + "city": "Mount Royal", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8062, + "latitude": 39.715857, + "longitude": -75.235017, + "city": "Mullica Hill", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8063, + "latitude": 39.779654, + "longitude": -75.218413, + "city": "National Park", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8064, + "latitude": 39.862433, + "longitude": -74.725079, + "city": "New Lisbon", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8065, + "latitude": 40.031291, + "longitude": -74.861971, + "city": "Palmyra", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8066, + "latitude": 39.81569, + "longitude": -75.238849, + "city": "Paulsboro", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8067, + "latitude": 39.733769, + "longitude": -75.408412, + "city": "Pedricktown", + "state": "NJ", + "county": "Salem" + }, + { + "zip_code": 8068, + "latitude": 39.966394, + "longitude": -74.709185, + "city": "Pemberton", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8069, + "latitude": 39.619937, + "longitude": -75.288423, + "city": "Penns Grove", + "state": "NJ", + "county": "Salem" + }, + { + "zip_code": 8070, + "latitude": 39.637683, + "longitude": -75.512699, + "city": "Pennsville", + "state": "NJ", + "county": "Salem" + }, + { + "zip_code": 8071, + "latitude": 39.734928, + "longitude": -75.136809, + "city": "Pitman", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8072, + "latitude": 39.541055, + "longitude": -75.383689, + "city": "Quinton", + "state": "NJ", + "county": "Salem" + }, + { + "zip_code": 8073, + "latitude": 39.862433, + "longitude": -74.725079, + "city": "Rancocas", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8074, + "latitude": 39.720622, + "longitude": -75.168141, + "city": "Richwood", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8075, + "latitude": 40.063293, + "longitude": -74.853307, + "city": "Riverside", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8076, + "latitude": 39.862433, + "longitude": -74.725079, + "city": "Riverton", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8077, + "latitude": 39.999211, + "longitude": -74.90871, + "city": "Riverton", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8078, + "latitude": 39.850163, + "longitude": -75.070672, + "city": "Runnemede", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8079, + "latitude": 39.587729, + "longitude": -75.439362, + "city": "Salem", + "state": "NJ", + "county": "Salem" + }, + { + "zip_code": 8080, + "latitude": 39.75521, + "longitude": -75.201593, + "city": "Sewell", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8081, + "latitude": 39.747558, + "longitude": -74.970462, + "city": "Sicklerville", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8083, + "latitude": 39.844063, + "longitude": -75.022163, + "city": "Somerdale", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8084, + "latitude": 39.829763, + "longitude": -75.012012, + "city": "Stratford", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8085, + "latitude": 39.75274, + "longitude": -75.318049, + "city": "Swedesboro", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8086, + "latitude": 39.838721, + "longitude": -75.24861, + "city": "Thorofare", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8087, + "latitude": 39.671687, + "longitude": -74.288092, + "city": "Tuckerton", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8088, + "latitude": 39.860351, + "longitude": -74.669346, + "city": "Vincentown", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8089, + "latitude": 39.723037, + "longitude": -74.836939, + "city": "Waterford Works", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8090, + "latitude": 39.798313, + "longitude": -75.148071, + "city": "Wenonah", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8091, + "latitude": 39.734923, + "longitude": -74.950993, + "city": "West Berlin", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8092, + "latitude": 39.656391, + "longitude": -74.295555, + "city": "West Creek", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8093, + "latitude": 39.85781, + "longitude": -75.13732, + "city": "Westville", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8094, + "latitude": 39.725538, + "longitude": -75.058082, + "city": "Williamstown", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8095, + "latitude": 39.654885, + "longitude": -74.868531, + "city": "Winslow", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8096, + "latitude": 39.822013, + "longitude": -75.129669, + "city": "Woodbury", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8097, + "latitude": 39.762971, + "longitude": -75.19787, + "city": "Woodbury Heights", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8098, + "latitude": 39.586, + "longitude": -75.379897, + "city": "Woodstown", + "state": "NJ", + "county": "Salem" + }, + { + "zip_code": 8099, + "latitude": 39.779179, + "longitude": -74.962071, + "city": "Bellmawr", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8101, + "latitude": 39.80237, + "longitude": -74.938259, + "city": "Camden", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8102, + "latitude": 39.950912, + "longitude": -75.118869, + "city": "Camden", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8103, + "latitude": 39.933174, + "longitude": -75.108519, + "city": "Camden", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8104, + "latitude": 39.916612, + "longitude": -75.109169, + "city": "Camden", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8105, + "latitude": 39.920162, + "longitude": -75.084667, + "city": "Camden", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8106, + "latitude": 39.828349, + "longitude": -74.994647, + "city": "Audubon", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8107, + "latitude": 39.872001, + "longitude": -75.053114, + "city": "Oaklyn", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8108, + "latitude": 39.834003, + "longitude": -74.991268, + "city": "Collingswood", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8109, + "latitude": 39.950312, + "longitude": -75.059916, + "city": "Merchantville", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8110, + "latitude": 39.839405, + "longitude": -74.945624, + "city": "Pennsauken", + "state": "NJ", + "county": "Camden" + }, + { + "zip_code": 8201, + "latitude": 39.48909, + "longitude": -74.680323, + "city": "Absecon", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8202, + "latitude": 39.112027, + "longitude": -74.731427, + "city": "Avalon", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8203, + "latitude": 39.370172, + "longitude": -74.49401, + "city": "Brigantine", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8204, + "latitude": 39.110337, + "longitude": -74.767939, + "city": "Cape May", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8205, + "latitude": "", + "longitude": "", + "city": "Absecon", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8210, + "latitude": 39.137841, + "longitude": -74.78056, + "city": "Cape May Court House", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8212, + "latitude": 38.937168, + "longitude": -74.965385, + "city": "Cape May Point", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8213, + "latitude": 39.509208, + "longitude": -74.608557, + "city": "Cologne", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8214, + "latitude": 39.056521, + "longitude": -74.816619, + "city": "Dennisville", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8215, + "latitude": 39.530539, + "longitude": -74.638341, + "city": "Egg Harbor City", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8217, + "latitude": 39.573741, + "longitude": -74.719989, + "city": "Elwood", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8218, + "latitude": 39.056521, + "longitude": -74.816619, + "city": "Goshen", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8219, + "latitude": 39.056521, + "longitude": -74.816619, + "city": "Green Creek", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8220, + "latitude": 39.509208, + "longitude": -74.608557, + "city": "Leeds Point", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8221, + "latitude": 39.427786, + "longitude": -74.622112, + "city": "Linwood", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8223, + "latitude": 39.13952, + "longitude": -74.73038, + "city": "Marmora", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8224, + "latitude": 39.595197, + "longitude": -74.435683, + "city": "New Gretna", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8225, + "latitude": 39.421922, + "longitude": -74.572227, + "city": "Northfield", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8226, + "latitude": 39.24853, + "longitude": -74.604409, + "city": "Ocean City", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8230, + "latitude": 39.205183, + "longitude": -74.778293, + "city": "Ocean View", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8231, + "latitude": 39.509208, + "longitude": -74.608557, + "city": "Oceanville", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8232, + "latitude": 39.470869, + "longitude": -74.686004, + "city": "Pleasantville", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8234, + "latitude": 39.374067, + "longitude": -74.611764, + "city": "Egg Harbor Township", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8240, + "latitude": 39.487717, + "longitude": -74.554334, + "city": "Pomona", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8241, + "latitude": 39.521785, + "longitude": -74.694414, + "city": "Port Republic", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8242, + "latitude": 39.017283, + "longitude": -74.883671, + "city": "Rio Grande", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8243, + "latitude": 39.154028, + "longitude": -74.700502, + "city": "Sea Isle City", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8244, + "latitude": 39.425655, + "longitude": -74.664422, + "city": "Somers Point", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8245, + "latitude": 39.09998, + "longitude": -74.848733, + "city": "South Dennis", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8246, + "latitude": 39.056521, + "longitude": -74.816619, + "city": "South Seaville", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8247, + "latitude": 39.047882, + "longitude": -74.77505, + "city": "Stone Harbor", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8248, + "latitude": 39.192018, + "longitude": -74.661977, + "city": "Strathmere", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8250, + "latitude": 39.056521, + "longitude": -74.816619, + "city": "Tuckahoe", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8251, + "latitude": 39.140921, + "longitude": -74.851181, + "city": "Villas", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8252, + "latitude": 39.042124, + "longitude": -74.861792, + "city": "Whitesboro", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8260, + "latitude": 39.067777, + "longitude": -74.77674, + "city": "Wildwood", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8270, + "latitude": 39.158165, + "longitude": -74.786886, + "city": "Woodbine", + "state": "NJ", + "county": "Cape May" + }, + { + "zip_code": 8302, + "latitude": 39.3762, + "longitude": -75.1617, + "city": "Bridgeton", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8310, + "latitude": 39.523712, + "longitude": -74.899762, + "city": "Buena", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8311, + "latitude": 39.330611, + "longitude": -75.117761, + "city": "Cedarville", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8312, + "latitude": 39.653531, + "longitude": -75.078625, + "city": "Clayton", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8313, + "latitude": 39.529261, + "longitude": -75.224865, + "city": "Deerfield Street", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8314, + "latitude": 39.358151, + "longitude": -74.977352, + "city": "Delmont", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8315, + "latitude": 39.273214, + "longitude": -75.095025, + "city": "Dividing Creek", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8316, + "latitude": 39.267898, + "longitude": -74.979118, + "city": "Dorchester", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8317, + "latitude": 39.425858, + "longitude": -74.826057, + "city": "Dorothy", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8318, + "latitude": 39.548074, + "longitude": -75.198368, + "city": "Elmer", + "state": "NJ", + "county": "Salem" + }, + { + "zip_code": 8319, + "latitude": 39.376144, + "longitude": -74.805412, + "city": "Estell Manor", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8320, + "latitude": 39.379906, + "longitude": -75.221681, + "city": "Fairton", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8321, + "latitude": 39.273034, + "longitude": -75.19137, + "city": "Fortescue", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8322, + "latitude": 39.59823, + "longitude": -75.035749, + "city": "Franklinville", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8323, + "latitude": 39.405498, + "longitude": -75.320881, + "city": "Greenwich", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8324, + "latitude": 39.224047, + "longitude": -74.994184, + "city": "Heislerville", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8326, + "latitude": 39.533843, + "longitude": -74.934493, + "city": "Landisville", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8327, + "latitude": 39.387948, + "longitude": -75.007418, + "city": "Leesburg", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8328, + "latitude": 39.58101, + "longitude": -75.055482, + "city": "Malaga", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8329, + "latitude": 39.285278, + "longitude": -74.998319, + "city": "Mauricetown", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8330, + "latitude": 39.47204, + "longitude": -74.71588, + "city": "Mays Landing", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8332, + "latitude": 39.370401, + "longitude": -75.04282, + "city": "Millville", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8340, + "latitude": 39.447855, + "longitude": -74.869885, + "city": "Milmay", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8341, + "latitude": 39.530779, + "longitude": -74.940036, + "city": "Minotola", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8342, + "latitude": 39.50208, + "longitude": -74.833469, + "city": "Mizpah", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8343, + "latitude": 39.641089, + "longitude": -75.144475, + "city": "Monroeville", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8344, + "latitude": 39.565465, + "longitude": -75.014084, + "city": "Newfield", + "state": "NJ", + "county": "Gloucester" + }, + { + "zip_code": 8345, + "latitude": 39.304244, + "longitude": -75.109132, + "city": "Newport", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8346, + "latitude": 39.557607, + "longitude": -74.870807, + "city": "Newtonville", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8347, + "latitude": 39.499765, + "longitude": -75.082022, + "city": "Norma", + "state": "NJ", + "county": "Salem" + }, + { + "zip_code": 8348, + "latitude": 39.313114, + "longitude": -74.980668, + "city": "Port Elizabeth", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8349, + "latitude": 39.283259, + "longitude": -75.098448, + "city": "Port Norris", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8350, + "latitude": 39.491351, + "longitude": -74.875543, + "city": "Richland", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8352, + "latitude": 39.469515, + "longitude": -75.146176, + "city": "Rosenhayn", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8353, + "latitude": 39.42165, + "longitude": -75.207667, + "city": "Shiloh", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8360, + "latitude": 39.392671, + "longitude": -75.025676, + "city": "Vineland", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8361, + "latitude": 39.465465, + "longitude": -74.965279, + "city": "Vineland", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8362, + "latitude": 39.271264, + "longitude": -75.027671, + "city": "Vineland", + "state": "NJ", + "county": "Cumberland" + }, + { + "zip_code": 8401, + "latitude": 39.486848, + "longitude": -74.643014, + "city": "Atlantic City", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8402, + "latitude": 39.442068, + "longitude": -74.666123, + "city": "Margate City", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8403, + "latitude": 39.324265, + "longitude": -74.513497, + "city": "Longport", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8404, + "latitude": 39.509208, + "longitude": -74.608557, + "city": "Atlantic City", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8405, + "latitude": 39.509208, + "longitude": -74.608557, + "city": "Atlantic City", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8406, + "latitude": 39.414646, + "longitude": -74.66415, + "city": "Ventnor City", + "state": "NJ", + "county": "Atlantic" + }, + { + "zip_code": 8501, + "latitude": 40.149712, + "longitude": -74.539598, + "city": "Allentown", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 8502, + "latitude": 40.461504, + "longitude": -74.648302, + "city": "Belle Mead", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8504, + "latitude": 40.425369, + "longitude": -74.668753, + "city": "Blawenburg", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8505, + "latitude": 40.101535, + "longitude": -74.724711, + "city": "Bordentown", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8510, + "latitude": 40.193311, + "longitude": -74.442803, + "city": "Clarksburg", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 8511, + "latitude": 40.049551, + "longitude": -74.557215, + "city": "Cookstown", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8512, + "latitude": 40.323116, + "longitude": -74.516597, + "city": "Cranbury", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8514, + "latitude": 40.139913, + "longitude": -74.465018, + "city": "Cream Ridge", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 8515, + "latitude": 40.147555, + "longitude": -74.661474, + "city": "Crosswicks", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8518, + "latitude": 40.12486, + "longitude": -74.738863, + "city": "Florence", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8520, + "latitude": 40.281558, + "longitude": -74.572449, + "city": "Hightstown", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8525, + "latitude": 40.389675, + "longitude": -74.783956, + "city": "Hopewell", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8526, + "latitude": 40.162275, + "longitude": -74.475936, + "city": "Imlaystown", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 8527, + "latitude": 40.105164, + "longitude": -74.352814, + "city": "Jackson", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8528, + "latitude": 40.382756, + "longitude": -74.609551, + "city": "Kingston", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8530, + "latitude": 40.37936, + "longitude": -74.901535, + "city": "Lambertville", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8533, + "latitude": 40.08294, + "longitude": -74.498741, + "city": "New Egypt", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8534, + "latitude": 40.32863, + "longitude": -74.813557, + "city": "Pennington", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8535, + "latitude": 40.22586, + "longitude": -74.452293, + "city": "Perrineville", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 8536, + "latitude": 40.342197, + "longitude": -74.582062, + "city": "Plainsboro", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8540, + "latitude": 40.343625, + "longitude": -74.693953, + "city": "Princeton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8541, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Princeton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8542, + "latitude": 40.350456, + "longitude": -74.658852, + "city": "Princeton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8543, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Princeton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8544, + "latitude": 40.349206, + "longitude": -74.652811, + "city": "Princeton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8550, + "latitude": 40.266858, + "longitude": -74.651101, + "city": "Princeton Junction", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8551, + "latitude": 40.445602, + "longitude": -74.840322, + "city": "Ringoes", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8553, + "latitude": 40.412705, + "longitude": -74.632256, + "city": "Rocky Hill", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8554, + "latitude": 40.071829, + "longitude": -74.711814, + "city": "Roebling", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8555, + "latitude": 40.22136, + "longitude": -74.474745, + "city": "Roosevelt", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 8556, + "latitude": 40.419965, + "longitude": -74.988619, + "city": "Rosemont", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8557, + "latitude": 40.563654, + "longitude": -74.949409, + "city": "Sergeantsville", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8558, + "latitude": 40.434255, + "longitude": -74.708525, + "city": "Skillman", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8559, + "latitude": 40.436413, + "longitude": -74.970597, + "city": "Stockton", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8560, + "latitude": 40.311826, + "longitude": -74.863858, + "city": "Titusville", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8561, + "latitude": 40.242313, + "longitude": -74.578709, + "city": "Windsor", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8562, + "latitude": 40.0751, + "longitude": -74.608402, + "city": "Wrightstown", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8570, + "latitude": 40.430006, + "longitude": -74.417344, + "city": "Cranbury", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8601, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8602, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8603, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8604, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8605, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8606, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8607, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8608, + "latitude": 40.220108, + "longitude": -74.764055, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8609, + "latitude": 40.224808, + "longitude": -74.741004, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8610, + "latitude": 40.201609, + "longitude": -74.704953, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8611, + "latitude": 40.196658, + "longitude": -74.741554, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8618, + "latitude": 40.223608, + "longitude": -74.732504, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8619, + "latitude": 40.241808, + "longitude": -74.696151, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8620, + "latitude": 40.194664, + "longitude": -74.639852, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8625, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8628, + "latitude": 40.265457, + "longitude": -74.816757, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8629, + "latitude": 40.219558, + "longitude": -74.733404, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8638, + "latitude": 40.232908, + "longitude": -74.716954, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8640, + "latitude": 40.009789, + "longitude": -74.605198, + "city": "Trenton", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8641, + "latitude": 39.968787, + "longitude": -74.62405, + "city": "Trenton", + "state": "NJ", + "county": "Burlington" + }, + { + "zip_code": 8645, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8646, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8647, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8648, + "latitude": 40.279457, + "longitude": -74.69118, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8650, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8666, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8677, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8690, + "latitude": 40.233577, + "longitude": -74.657602, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8691, + "latitude": 40.219738, + "longitude": -74.593949, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8695, + "latitude": 40.280531, + "longitude": -74.712018, + "city": "Trenton", + "state": "NJ", + "county": "Mercer" + }, + { + "zip_code": 8701, + "latitude": 39.94517, + "longitude": -74.149784, + "city": "Lakewood", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8720, + "latitude": 40.138878, + "longitude": -74.11221, + "city": "Allenwood", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 8721, + "latitude": 39.966604, + "longitude": -74.300023, + "city": "Bayville", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8722, + "latitude": 39.927521, + "longitude": -74.198585, + "city": "Beachwood", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8723, + "latitude": 39.940021, + "longitude": -74.122989, + "city": "Brick", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8724, + "latitude": 39.938047, + "longitude": -74.17109, + "city": "Brick", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8730, + "latitude": 40.107614, + "longitude": -74.065081, + "city": "Brielle", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 8731, + "latitude": 39.876031, + "longitude": -74.230522, + "city": "Forked River", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8732, + "latitude": 39.983267, + "longitude": -74.128482, + "city": "Island Heights", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8733, + "latitude": 39.992317, + "longitude": -74.28224, + "city": "Lakehurst", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8734, + "latitude": 39.863489, + "longitude": -74.168217, + "city": "Lanoka Harbor", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8735, + "latitude": 39.980917, + "longitude": -74.07203, + "city": "Lavallette", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8736, + "latitude": 40.121514, + "longitude": -74.069963, + "city": "Manasquan", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 8738, + "latitude": 40.029916, + "longitude": -74.05688, + "city": "Mantoloking", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8739, + "latitude": 40.000759, + "longitude": -74.24928, + "city": "Normandy Beach", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8740, + "latitude": 39.926628, + "longitude": -74.133332, + "city": "Ocean Gate", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8741, + "latitude": 40.003246, + "longitude": -74.109626, + "city": "Pine Beach", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8742, + "latitude": 39.954807, + "longitude": -74.157056, + "city": "Point Pleasant Beach", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8750, + "latitude": 40.161392, + "longitude": -74.043772, + "city": "Sea Girt", + "state": "NJ", + "county": "Monmouth" + }, + { + "zip_code": 8751, + "latitude": 39.945991, + "longitude": -74.181649, + "city": "Seaside Heights", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8752, + "latitude": 39.805832, + "longitude": -74.145694, + "city": "Seaside Park", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8753, + "latitude": 39.958851, + "longitude": -74.215336, + "city": "Toms River", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8754, + "latitude": 40.000759, + "longitude": -74.24928, + "city": "Toms River", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8755, + "latitude": 40.000696, + "longitude": -74.256821, + "city": "Toms River", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8756, + "latitude": 39.787966, + "longitude": -74.191058, + "city": "Toms River", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8757, + "latitude": 39.943064, + "longitude": -74.264068, + "city": "Toms River", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8758, + "latitude": 39.787943, + "longitude": -74.246662, + "city": "Waretown", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8759, + "latitude": 39.945798, + "longitude": -74.29782, + "city": "Manchester Township", + "state": "NJ", + "county": "Ocean" + }, + { + "zip_code": 8801, + "latitude": 40.631008, + "longitude": -74.890685, + "city": "Annandale", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8802, + "latitude": 40.695034, + "longitude": -75.028089, + "city": "Asbury", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 8803, + "latitude": 40.563654, + "longitude": -74.949409, + "city": "Baptistown", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8804, + "latitude": 40.646294, + "longitude": -75.092934, + "city": "Bloomsbury", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8805, + "latitude": 40.575402, + "longitude": -74.538249, + "city": "Bound Brook", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8807, + "latitude": 40.598702, + "longitude": -74.607518, + "city": "Bridgewater", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8808, + "latitude": 40.737213, + "longitude": -75.046926, + "city": "Broadway", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 8809, + "latitude": 40.5305, + "longitude": -74.845574, + "city": "Clinton", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8810, + "latitude": 40.372306, + "longitude": -74.494889, + "city": "Dayton", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8812, + "latitude": 40.589702, + "longitude": -74.463947, + "city": "Dunellen", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8816, + "latitude": 40.427697, + "longitude": -74.421695, + "city": "East Brunswick", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8817, + "latitude": 40.519753, + "longitude": -74.393444, + "city": "Edison", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8818, + "latitude": 40.430006, + "longitude": -74.417344, + "city": "Edison", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8820, + "latitude": 40.576611, + "longitude": -74.362616, + "city": "Edison", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8821, + "latitude": 40.566553, + "longitude": -74.599801, + "city": "Flagtown", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8822, + "latitude": 40.50786, + "longitude": -74.863283, + "city": "Flemington", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8823, + "latitude": 40.440604, + "longitude": -74.560249, + "city": "Franklin Park", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8824, + "latitude": 40.422955, + "longitude": -74.549761, + "city": "Kendall Park", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8825, + "latitude": 40.58119, + "longitude": -75.012655, + "city": "Frenchtown", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8826, + "latitude": 40.578191, + "longitude": -74.904575, + "city": "Glen Gardner", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8827, + "latitude": 40.6667, + "longitude": -74.964692, + "city": "Hampton", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8828, + "latitude": 40.37554, + "longitude": -74.421644, + "city": "Helmetta", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8829, + "latitude": 40.668163, + "longitude": -74.889823, + "city": "High Bridge", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8830, + "latitude": 40.569211, + "longitude": -74.315042, + "city": "Iselin", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8831, + "latitude": 40.343757, + "longitude": -74.42887, + "city": "Monroe Township", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8832, + "latitude": 40.517559, + "longitude": -74.306961, + "city": "Keasbey", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8833, + "latitude": 40.635369, + "longitude": -74.829976, + "city": "Lebanon", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8834, + "latitude": 40.563654, + "longitude": -74.949409, + "city": "Little York", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8835, + "latitude": 40.541053, + "longitude": -74.589225, + "city": "Manville", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8836, + "latitude": 40.604352, + "longitude": -74.5538, + "city": "Martinsville", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8837, + "latitude": 40.527054, + "longitude": -74.350393, + "city": "Edison", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8840, + "latitude": 40.472224, + "longitude": -74.45194, + "city": "Metuchen", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8844, + "latitude": "", + "longitude": "", + "city": "Hillsborough", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8846, + "latitude": 40.575202, + "longitude": -74.499398, + "city": "Middlesex", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8848, + "latitude": 40.664749, + "longitude": -74.970542, + "city": "Milford", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8850, + "latitude": 40.448255, + "longitude": -74.444395, + "city": "Milltown", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8852, + "latitude": 40.386942, + "longitude": -74.555799, + "city": "Monmouth Junction", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8853, + "latitude": 40.492604, + "longitude": -74.726555, + "city": "Neshanic Station", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8854, + "latitude": 40.552925, + "longitude": -74.457746, + "city": "Piscataway", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8855, + "latitude": 40.430006, + "longitude": -74.417344, + "city": "Piscataway", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8857, + "latitude": 40.407319, + "longitude": -74.314319, + "city": "Old Bridge", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8858, + "latitude": 40.691798, + "longitude": -74.752537, + "city": "Oldwick", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8859, + "latitude": 40.459205, + "longitude": -74.306956, + "city": "Parlin", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8861, + "latitude": 40.520654, + "longitude": -74.279144, + "city": "Perth Amboy", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8862, + "latitude": 40.430006, + "longitude": -74.417344, + "city": "Perth Amboy", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8863, + "latitude": 40.53139, + "longitude": -74.31525, + "city": "Fords", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8865, + "latitude": 40.765309, + "longitude": -74.98743, + "city": "Phillipsburg", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 8867, + "latitude": 40.585926, + "longitude": -74.976982, + "city": "Pittstown", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8868, + "latitude": 40.565493, + "longitude": -74.938931, + "city": "Quakertown", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8869, + "latitude": 40.573802, + "longitude": -74.642649, + "city": "Raritan", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8870, + "latitude": 40.563654, + "longitude": -74.949409, + "city": "Readington", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8871, + "latitude": 40.430006, + "longitude": -74.417344, + "city": "Sayreville", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8872, + "latitude": 40.453358, + "longitude": -74.334192, + "city": "Sayreville", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8873, + "latitude": 40.491002, + "longitude": -74.523648, + "city": "Somerset", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8875, + "latitude": 40.580918, + "longitude": -74.711731, + "city": "Somerset", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8876, + "latitude": 40.560314, + "longitude": -74.66165, + "city": "Somerville", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8877, + "latitude": 40.430006, + "longitude": -74.417344, + "city": "South River", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8878, + "latitude": 40.436865, + "longitude": -74.250942, + "city": "South Amboy", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8879, + "latitude": 40.46397, + "longitude": -74.274168, + "city": "South Amboy", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8880, + "latitude": 40.552253, + "longitude": -74.531149, + "city": "South Bound Brook", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8882, + "latitude": 40.445905, + "longitude": -74.381768, + "city": "South River", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8884, + "latitude": 40.385707, + "longitude": -74.393249, + "city": "Spotswood", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8885, + "latitude": 40.576372, + "longitude": -74.831105, + "city": "Stanton", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8886, + "latitude": 40.717349, + "longitude": -75.072957, + "city": "Stewartsville", + "state": "NJ", + "county": "Warren" + }, + { + "zip_code": 8887, + "latitude": 40.52057, + "longitude": -74.794632, + "city": "Three Bridges", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8888, + "latitude": 40.619412, + "longitude": -74.740597, + "city": "Whitehouse", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8889, + "latitude": 40.615577, + "longitude": -74.772376, + "city": "Whitehouse Station", + "state": "NJ", + "county": "Hunterdon" + }, + { + "zip_code": 8890, + "latitude": 40.536069, + "longitude": -74.578872, + "city": "Zarephath", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8896, + "latitude": 40.566553, + "longitude": -74.599801, + "city": "Raritan", + "state": "NJ", + "county": "Somerset" + }, + { + "zip_code": 8899, + "latitude": 40.520254, + "longitude": -74.420545, + "city": "Edison", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8901, + "latitude": 40.486754, + "longitude": -74.444395, + "city": "New Brunswick", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8902, + "latitude": 40.437705, + "longitude": -74.488547, + "city": "North Brunswick", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8903, + "latitude": 40.513854, + "longitude": -74.445098, + "city": "New Brunswick", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8904, + "latitude": 40.499866, + "longitude": -74.428095, + "city": "Highland Park", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8905, + "latitude": 40.430006, + "longitude": -74.417344, + "city": "New Brunswick", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8906, + "latitude": 40.430006, + "longitude": -74.417344, + "city": "New Brunswick", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8922, + "latitude": 40.430006, + "longitude": -74.417344, + "city": "New Brunswick", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8933, + "latitude": 40.430006, + "longitude": -74.417344, + "city": "New Brunswick", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8988, + "latitude": 40.430006, + "longitude": -74.417344, + "city": "New Brunswick", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 8989, + "latitude": 40.430006, + "longitude": -74.417344, + "city": "New Brunswick", + "state": "NJ", + "county": "Middlesex" + }, + { + "zip_code": 9007, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9009, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9012, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9013, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9014, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9021, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9028, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9029, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9031, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9033, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9034, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9036, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9037, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9042, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9045, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9046, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9050, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9053, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9054, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9056, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9058, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9059, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9060, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9063, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9067, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9069, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9072, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9074, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9076, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9080, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9081, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9086, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9089, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9090, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9094, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9095, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9096, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9098, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9099, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9100, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9102, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9103, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9104, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9106, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9107, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9110, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9111, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9112, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9114, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9123, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9126, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9128, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9131, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9136, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9137, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9138, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9139, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9140, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9142, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9143, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9154, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9157, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9164, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9165, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9166, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9169, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9172, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9173, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9175, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9177, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9178, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9180, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9182, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9183, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9185, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9186, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9189, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9211, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9212, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9213, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9214, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9220, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9222, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9225, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9226, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9227, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9229, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9234, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9237, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9239, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9244, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9245, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9250, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9252, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9262, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9263, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9264, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9265, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9266, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9267, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9269, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9275, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9302, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9303, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9304, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9305, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9340, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9391, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9396, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9397, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9398, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9409, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9419, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9420, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9421, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9447, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9448, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9449, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9454, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9456, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9459, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9461, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9463, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9464, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9468, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9469, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9470, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9494, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9496, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9498, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9499, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9501, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9502, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9503, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9504, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9505, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9506, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9507, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9508, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9509, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9510, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9511, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9517, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9521, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9524, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9532, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9534, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9536, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9543, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9544, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9545, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9549, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9550, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9551, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9554, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9556, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9557, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9558, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9563, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9564, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9565, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9566, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9567, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9568, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9569, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9570, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9573, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9574, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9575, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9576, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9577, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9578, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9579, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9581, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9582, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9586, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9587, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9588, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9589, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9590, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9591, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9593, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9594, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9595, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9596, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9599, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9601, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9603, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9604, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9609, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9610, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9612, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9613, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9617, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9618, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9619, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9620, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9621, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9622, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9623, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9624, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9625, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9626, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9627, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9628, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9630, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9631, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9636, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9638, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9642, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9643, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9644, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9645, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9647, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9649, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9703, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9704, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9705, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9706, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9707, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9708, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9709, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9710, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9711, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9713, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9714, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9715, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9716, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9717, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9718, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9720, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9721, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9722, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9723, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9724, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9725, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9726, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9727, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9728, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9729, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9730, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9731, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9732, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9733, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9734, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9735, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9777, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9779, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9780, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9782, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9783, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9784, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9789, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9790, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9791, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9792, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9793, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9795, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9796, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9797, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9802, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9803, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9804, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9805, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9808, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9809, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9810, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9811, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9812, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9813, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9814, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9815, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9816, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9819, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9821, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9822, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9823, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9824, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9825, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9826, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9827, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9828, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9829, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9830, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9831, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9832, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9833, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9834, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9835, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9836, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9837, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9838, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9839, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9841, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9842, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9843, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9844, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9852, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9853, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9854, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9855, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9858, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9865, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9866, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9867, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9868, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9871, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9876, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9880, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9882, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9888, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9889, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9890, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9892, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9894, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9898, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 9899, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AE", + "county": "" + }, + { + "zip_code": 10001, + "latitude": 40.750422, + "longitude": -73.996328, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10002, + "latitude": 40.718758, + "longitude": -73.986427, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10003, + "latitude": 40.730223, + "longitude": -73.988564, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10004, + "latitude": 40.696355, + "longitude": -74.025276, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10005, + "latitude": 40.706903, + "longitude": -74.008654, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10006, + "latitude": 40.708834, + "longitude": -74.013168, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10007, + "latitude": 40.713941, + "longitude": -74.007401, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10008, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10009, + "latitude": 40.72775, + "longitude": -73.980396, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10010, + "latitude": 40.739024, + "longitude": -73.983542, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10011, + "latitude": 40.740916, + "longitude": -73.999769, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10012, + "latitude": 40.729124, + "longitude": -73.991582, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10013, + "latitude": 40.722105, + "longitude": -74.003497, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10014, + "latitude": 40.738088, + "longitude": -74.005095, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10015, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10016, + "latitude": 40.745527, + "longitude": -73.978449, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10017, + "latitude": 40.752955, + "longitude": -73.973196, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10018, + "latitude": 40.755332, + "longitude": -73.993172, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10019, + "latitude": 40.765926, + "longitude": -73.985443, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10020, + "latitude": 40.735449, + "longitude": -73.996788, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10021, + "latitude": 40.768823, + "longitude": -73.960257, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10022, + "latitude": 40.758775, + "longitude": -73.967842, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10023, + "latitude": 40.776765, + "longitude": -73.982213, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10024, + "latitude": 40.80813, + "longitude": -73.965653, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10025, + "latitude": 40.798664, + "longitude": -73.967778, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10026, + "latitude": 40.802918, + "longitude": -73.953107, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10027, + "latitude": 40.812242, + "longitude": -73.9532, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10028, + "latitude": 40.776629, + "longitude": -73.953914, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10029, + "latitude": 40.791884, + "longitude": -73.943517, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10030, + "latitude": 40.818474, + "longitude": -73.94329, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10031, + "latitude": 40.823438, + "longitude": -73.949039, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10032, + "latitude": 40.839137, + "longitude": -73.942181, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10033, + "latitude": 40.851293, + "longitude": -73.934764, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10034, + "latitude": 40.863194, + "longitude": -73.926959, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10035, + "latitude": 40.801913, + "longitude": -73.9347, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10036, + "latitude": 40.75953, + "longitude": -73.989847, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10037, + "latitude": 40.813884, + "longitude": -73.938498, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10038, + "latitude": 40.710223, + "longitude": -74.003368, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10039, + "latitude": 40.826736, + "longitude": -73.939398, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10040, + "latitude": 40.858692, + "longitude": -73.930999, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10041, + "latitude": 40.703801, + "longitude": -74.009814, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10043, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10044, + "latitude": 40.761812, + "longitude": -73.950521, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10045, + "latitude": 40.70859, + "longitude": -74.008687, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10046, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10047, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10048, + "latitude": 40.71254, + "longitude": -74.013289, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10055, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10060, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10069, + "latitude": 40.777952, + "longitude": -73.988381, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10072, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10079, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10080, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10081, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10082, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10087, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10090, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10094, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10095, + "latitude": 40.748181, + "longitude": -73.988421, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10096, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10098, + "latitude": 40.748181, + "longitude": -73.988421, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10099, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10101, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10102, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10103, + "latitude": 40.760264, + "longitude": -73.97624, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10104, + "latitude": 40.760943, + "longitude": -73.979908, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10105, + "latitude": 40.762808, + "longitude": -73.978534, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10106, + "latitude": 40.765243, + "longitude": -73.980438, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10107, + "latitude": 40.766429, + "longitude": -73.982728, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10108, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10109, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10110, + "latitude": 40.753987, + "longitude": -73.980811, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10111, + "latitude": 40.759224, + "longitude": -73.977762, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10112, + "latitude": 40.759287, + "longitude": -73.979808, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10113, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10114, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10115, + "latitude": 40.811115, + "longitude": -73.96423, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10116, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10117, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10118, + "latitude": 40.748998, + "longitude": -73.986467, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10119, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10120, + "latitude": 40.750629, + "longitude": -73.989426, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10121, + "latitude": 40.74964, + "longitude": -73.991889, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10122, + "latitude": 40.751757, + "longitude": -73.992171, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10123, + "latitude": 40.751489, + "longitude": -73.990537, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10124, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10125, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10126, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10128, + "latitude": 40.780989, + "longitude": -73.95158, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10129, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10130, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10131, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10132, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10133, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10138, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10149, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10150, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10151, + "latitude": 40.763419, + "longitude": -73.973971, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10152, + "latitude": 40.758937, + "longitude": -73.97302, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10153, + "latitude": 40.764068, + "longitude": -73.97348, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10154, + "latitude": 40.758304, + "longitude": -73.973468, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10155, + "latitude": 40.761104, + "longitude": -73.968036, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10156, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10157, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10158, + "latitude": 40.749435, + "longitude": -73.9758, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10159, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10160, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10161, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10162, + "latitude": 40.769945, + "longitude": -73.951117, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10163, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10164, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10165, + "latitude": 40.752351, + "longitude": -73.979132, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10166, + "latitude": 40.754591, + "longitude": -73.976238, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10167, + "latitude": 40.754858, + "longitude": -73.97497, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10168, + "latitude": 40.751933, + "longitude": -73.976794, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10169, + "latitude": 40.75474, + "longitude": -73.976595, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10170, + "latitude": 40.752621, + "longitude": -73.97548, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10171, + "latitude": 40.756447, + "longitude": -73.974821, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10172, + "latitude": 40.755839, + "longitude": -73.975279, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10173, + "latitude": 40.754305, + "longitude": -73.979564, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10174, + "latitude": 40.751656, + "longitude": -73.97516, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10175, + "latitude": 40.754305, + "longitude": -73.979782, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10176, + "latitude": 40.75557, + "longitude": -73.978877, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10177, + "latitude": 40.755332, + "longitude": -73.976082, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10178, + "latitude": 40.751378, + "longitude": -73.978507, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10179, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10184, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10185, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10196, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10197, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10199, + "latitude": 40.750308, + "longitude": -74.00058, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10203, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10211, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10212, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10213, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10242, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10249, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10256, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10257, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10258, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10259, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10260, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10261, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10265, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10268, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10269, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10270, + "latitude": 40.706925, + "longitude": -74.008154, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10271, + "latitude": 40.708918, + "longitude": -74.011066, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10272, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10273, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10274, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10275, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10276, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10277, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10278, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10279, + "latitude": 40.712697, + "longitude": -74.007812, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10280, + "latitude": 40.708857, + "longitude": -74.016217, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10281, + "latitude": 40.714643, + "longitude": -74.014958, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10282, + "latitude": 40.716597, + "longitude": -74.01459, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10285, + "latitude": 40.71533, + "longitude": -74.016306, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10286, + "latitude": 40.714231, + "longitude": -74.011895, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10292, + "latitude": 40.780751, + "longitude": -73.977182, + "city": "New York", + "state": "NY", + "county": "New York" + }, + { + "zip_code": 10301, + "latitude": 40.623632, + "longitude": -74.093323, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10302, + "latitude": 40.628923, + "longitude": -74.137947, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10303, + "latitude": 40.631697, + "longitude": -74.165016, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10304, + "latitude": 40.608389, + "longitude": -74.093684, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10305, + "latitude": 40.596828, + "longitude": -74.077837, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10306, + "latitude": 40.559668, + "longitude": -74.12241, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10307, + "latitude": 40.510723, + "longitude": -74.24194, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10308, + "latitude": 40.551191, + "longitude": -74.148893, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10309, + "latitude": 40.531767, + "longitude": -74.218779, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10310, + "latitude": 40.632943, + "longitude": -74.118669, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10311, + "latitude": 40.605245, + "longitude": -74.179485, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10312, + "latitude": 40.545163, + "longitude": -74.174692, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10313, + "latitude": 40.564393, + "longitude": -74.146836, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10314, + "latitude": 40.591006, + "longitude": -74.150741, + "city": "Staten Island", + "state": "NY", + "county": "Richmond" + }, + { + "zip_code": 10451, + "latitude": 40.819329, + "longitude": -73.920355, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10452, + "latitude": 40.838729, + "longitude": -73.921605, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10453, + "latitude": 40.852728, + "longitude": -73.912455, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10454, + "latitude": 40.807129, + "longitude": -73.918405, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10455, + "latitude": 40.815029, + "longitude": -73.908355, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10456, + "latitude": 40.830529, + "longitude": -73.908655, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10457, + "latitude": 40.846129, + "longitude": -73.898255, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10458, + "latitude": 40.864728, + "longitude": -73.889855, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10459, + "latitude": 40.825629, + "longitude": -73.893605, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10460, + "latitude": 40.841829, + "longitude": -73.879004, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10461, + "latitude": 40.845279, + "longitude": -73.843103, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10462, + "latitude": 40.842729, + "longitude": -73.854703, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10463, + "latitude": 40.879528, + "longitude": -73.904355, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10464, + "latitude": 40.863028, + "longitude": -73.799802, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10465, + "latitude": 40.826879, + "longitude": -73.825153, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10466, + "latitude": 40.859878, + "longitude": -73.841003, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10467, + "latitude": 40.876328, + "longitude": -73.870404, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10468, + "latitude": 40.870978, + "longitude": -73.900505, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10469, + "latitude": 40.869978, + "longitude": -73.844903, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10470, + "latitude": 40.87143, + "longitude": -73.862303, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10471, + "latitude": 40.899178, + "longitude": -73.898677, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10472, + "latitude": 40.829529, + "longitude": -73.865704, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10473, + "latitude": 40.816229, + "longitude": -73.860304, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10474, + "latitude": 40.813929, + "longitude": -73.884104, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10475, + "latitude": 40.874878, + "longitude": -73.827653, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10499, + "latitude": 40.851549, + "longitude": -73.840908, + "city": "Bronx", + "state": "NY", + "county": "Bronx" + }, + { + "zip_code": 10501, + "latitude": 41.293169, + "longitude": -73.759033, + "city": "Amawalk", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10502, + "latitude": 41.015096, + "longitude": -73.841478, + "city": "Ardsley", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10503, + "latitude": 41.025947, + "longitude": -73.87185, + "city": "Ardsley On Hudson", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10504, + "latitude": 41.075185, + "longitude": -73.761247, + "city": "Armonk", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10505, + "latitude": 41.33431, + "longitude": -73.749244, + "city": "Baldwin Place", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10506, + "latitude": 41.123741, + "longitude": -73.718481, + "city": "Bedford", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10507, + "latitude": 41.229037, + "longitude": -73.697998, + "city": "Bedford Hills", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10509, + "latitude": 41.415979, + "longitude": -73.725197, + "city": "Brewster", + "state": "NY", + "county": "Putnam" + }, + { + "zip_code": 10510, + "latitude": 41.05978, + "longitude": -73.829802, + "city": "Briarcliff Manor", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10511, + "latitude": 41.259961, + "longitude": -73.943495, + "city": "Buchanan", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10512, + "latitude": 41.429571, + "longitude": -73.777626, + "city": "Carmel", + "state": "NY", + "county": "Putnam" + }, + { + "zip_code": 10514, + "latitude": 41.078957, + "longitude": -73.775547, + "city": "Chappaqua", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10516, + "latitude": 41.455213, + "longitude": -73.812479, + "city": "Cold Spring", + "state": "NY", + "county": "Putnam" + }, + { + "zip_code": 10517, + "latitude": 41.300561, + "longitude": -73.861217, + "city": "Crompond", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10518, + "latitude": 41.269896, + "longitude": -73.612074, + "city": "Cross River", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10519, + "latitude": 41.347727, + "longitude": -73.661014, + "city": "Croton Falls", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10520, + "latitude": 41.122622, + "longitude": -73.867258, + "city": "Croton On Hudson", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10521, + "latitude": 41.234256, + "longitude": -73.926165, + "city": "Croton On Hudson", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10522, + "latitude": 41.011147, + "longitude": -73.865178, + "city": "Dobbs Ferry", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10523, + "latitude": 41.058732, + "longitude": -73.836784, + "city": "Elmsford", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10524, + "latitude": 41.375016, + "longitude": -73.931844, + "city": "Garrison", + "state": "NY", + "county": "Putnam" + }, + { + "zip_code": 10526, + "latitude": 41.300361, + "longitude": -73.647891, + "city": "Goldens Bridge", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10527, + "latitude": 41.323246, + "longitude": -73.757911, + "city": "Granite Springs", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10528, + "latitude": 40.979118, + "longitude": -73.723036, + "city": "Harrison", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10530, + "latitude": 41.019105, + "longitude": -73.812077, + "city": "Hartsdale", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10532, + "latitude": 41.013742, + "longitude": -73.835421, + "city": "Hawthorne", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10533, + "latitude": 41.079553, + "longitude": -73.856051, + "city": "Irvington", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10535, + "latitude": 41.338568, + "longitude": -73.735548, + "city": "Jefferson Valley", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10536, + "latitude": 41.271614, + "longitude": -73.687334, + "city": "Katonah", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10537, + "latitude": 41.394819, + "longitude": -73.718016, + "city": "Lake Peekskill", + "state": "NY", + "county": "Putnam" + }, + { + "zip_code": 10538, + "latitude": 41.090197, + "longitude": -73.755284, + "city": "Larchmont", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10540, + "latitude": 41.333398, + "longitude": -73.724257, + "city": "Lincolndale", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10541, + "latitude": 41.412395, + "longitude": -73.752059, + "city": "Mahopac", + "state": "NY", + "county": "Putnam" + }, + { + "zip_code": 10542, + "latitude": 41.372581, + "longitude": -73.760132, + "city": "Mahopac Falls", + "state": "NY", + "county": "Putnam" + }, + { + "zip_code": 10543, + "latitude": 40.949199, + "longitude": -73.738779, + "city": "Mamaroneck", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10545, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "Maryknoll", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10546, + "latitude": 41.201373, + "longitude": -73.796456, + "city": "Millwood", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10547, + "latitude": 41.281975, + "longitude": -73.797555, + "city": "Mohegan Lake", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10548, + "latitude": 41.25126, + "longitude": -73.942877, + "city": "Montrose", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10549, + "latitude": 41.197329, + "longitude": -73.72286, + "city": "Mount Kisco", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10550, + "latitude": 40.909838, + "longitude": -73.83389, + "city": "Mount Vernon", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10551, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "Mount Vernon", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10552, + "latitude": 41.011586, + "longitude": -73.798391, + "city": "Mount Vernon", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10553, + "latitude": 40.909449, + "longitude": -73.822109, + "city": "Mount Vernon", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10557, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "Mount Vernon", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10558, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "Mount Vernon", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10559, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "Mount Vernon", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10560, + "latitude": 41.331814, + "longitude": -73.608451, + "city": "North Salem", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10562, + "latitude": 41.109701, + "longitude": -73.827995, + "city": "Ossining", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10566, + "latitude": 41.28383, + "longitude": -73.893116, + "city": "Peekskill", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10567, + "latitude": 41.284044, + "longitude": -73.893116, + "city": "Cortlandt Manor", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10570, + "latitude": 41.131069, + "longitude": -73.792214, + "city": "Pleasantville", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10571, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "Pleasantville", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10572, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "Pleasantville", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10573, + "latitude": 41.022193, + "longitude": -73.679799, + "city": "Port Chester", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10576, + "latitude": 41.208519, + "longitude": -73.568126, + "city": "Pound Ridge", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10577, + "latitude": 41.002757, + "longitude": -73.751025, + "city": "Purchase", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10578, + "latitude": 41.315779, + "longitude": -73.645145, + "city": "Purdys", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10579, + "latitude": 41.399262, + "longitude": -73.776871, + "city": "Putnam Valley", + "state": "NY", + "county": "Putnam" + }, + { + "zip_code": 10580, + "latitude": 40.955237, + "longitude": -73.744725, + "city": "Rye", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10581, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "Rye", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10583, + "latitude": 40.992686, + "longitude": -73.799476, + "city": "Scarsdale", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10587, + "latitude": 41.328737, + "longitude": -73.742268, + "city": "Shenorock", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10588, + "latitude": 41.330892, + "longitude": -73.823549, + "city": "Shrub Oak", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10589, + "latitude": 41.326544, + "longitude": -73.693685, + "city": "Somers", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10590, + "latitude": 41.254331, + "longitude": -73.542714, + "city": "South Salem", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10591, + "latitude": 41.089703, + "longitude": -73.844034, + "city": "Tarrytown", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10592, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "Tarrytown", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10594, + "latitude": 41.117214, + "longitude": -73.771469, + "city": "Thornwood", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10595, + "latitude": 41.090218, + "longitude": -73.784768, + "city": "Valhalla", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10596, + "latitude": 41.254823, + "longitude": -73.958727, + "city": "Verplanck", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10597, + "latitude": 41.297198, + "longitude": -73.597979, + "city": "Waccabuc", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10598, + "latitude": 41.287329, + "longitude": -73.790284, + "city": "Yorktown Heights", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10601, + "latitude": 41.031397, + "longitude": -73.769626, + "city": "White Plains", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10602, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "White Plains", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10603, + "latitude": 41.048958, + "longitude": -73.783036, + "city": "White Plains", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10604, + "latitude": 41.156215, + "longitude": -73.805176, + "city": "West Harrison", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10605, + "latitude": 41.007597, + "longitude": -73.748575, + "city": "White Plains", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10606, + "latitude": 41.021686, + "longitude": -73.766044, + "city": "White Plains", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10607, + "latitude": 41.039235, + "longitude": -73.807293, + "city": "White Plains", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10610, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "White Plains", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10625, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "White Plains", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10629, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "White Plains", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10633, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "White Plains", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10650, + "latitude": 41.013696, + "longitude": -73.705975, + "city": "White Plains", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10701, + "latitude": 40.946107, + "longitude": -73.866926, + "city": "Yonkers", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10702, + "latitude": 41.119008, + "longitude": -73.732996, + "city": "Yonkers", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10703, + "latitude": 40.959347, + "longitude": -73.881329, + "city": "Yonkers", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10704, + "latitude": 40.922938, + "longitude": -73.861941, + "city": "Yonkers", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10705, + "latitude": 40.926538, + "longitude": -73.872529, + "city": "Yonkers", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10706, + "latitude": 40.987797, + "longitude": -73.862969, + "city": "Hastings On Hudson", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10707, + "latitude": 40.960498, + "longitude": -73.816127, + "city": "Tuckahoe", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10708, + "latitude": 40.938448, + "longitude": -73.829978, + "city": "Bronxville", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10709, + "latitude": 40.956098, + "longitude": -73.812177, + "city": "Eastchester", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10710, + "latitude": 40.967946, + "longitude": -73.84736, + "city": "Yonkers", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10801, + "latitude": 41.035123, + "longitude": -73.801401, + "city": "New Rochelle", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10802, + "latitude": 40.948274, + "longitude": -73.795361, + "city": "New Rochelle", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10803, + "latitude": 40.904538, + "longitude": -73.806277, + "city": "Pelham", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10804, + "latitude": 40.951498, + "longitude": -73.786526, + "city": "New Rochelle", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10805, + "latitude": 40.899599, + "longitude": -73.780976, + "city": "New Rochelle", + "state": "NY", + "county": "Westchester" + }, + { + "zip_code": 10901, + "latitude": 41.137295, + "longitude": -74.105737, + "city": "Suffern", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10910, + "latitude": 41.386195, + "longitude": -74.125718, + "city": "Arden", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10911, + "latitude": 41.160945, + "longitude": -74.060826, + "city": "Bear Mountain", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10912, + "latitude": 41.387822, + "longitude": -74.354699, + "city": "Bellvale", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10913, + "latitude": 41.068782, + "longitude": -73.957282, + "city": "Blauvelt", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10914, + "latitude": 41.464867, + "longitude": -74.255646, + "city": "Blooming Grove", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10915, + "latitude": 41.555634, + "longitude": -74.328805, + "city": "Bullville", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10916, + "latitude": 41.443168, + "longitude": -74.258172, + "city": "Campbell Hall", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10917, + "latitude": 41.329224, + "longitude": -74.121764, + "city": "Central Valley", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10918, + "latitude": 41.414188, + "longitude": -74.348151, + "city": "Chester", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10919, + "latitude": 41.53156, + "longitude": -74.370569, + "city": "Circleville", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10920, + "latitude": 41.152545, + "longitude": -73.936305, + "city": "Congers", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10921, + "latitude": 41.319956, + "longitude": -74.36699, + "city": "Florida", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10922, + "latitude": 41.334557, + "longitude": -73.99175, + "city": "Fort Montgomery", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10923, + "latitude": 41.203984, + "longitude": -74.003167, + "city": "Garnerville", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10924, + "latitude": 41.357428, + "longitude": -74.210608, + "city": "Goshen", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10925, + "latitude": 41.297325, + "longitude": -74.26484, + "city": "Greenwood Lake", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10926, + "latitude": 41.300486, + "longitude": -74.124934, + "city": "Harriman", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10927, + "latitude": 41.191694, + "longitude": -73.964933, + "city": "Haverstraw", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10928, + "latitude": 41.398883, + "longitude": -74.255846, + "city": "Highland Falls", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10930, + "latitude": 41.372924, + "longitude": -74.245108, + "city": "Highland Mills", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10931, + "latitude": 41.120195, + "longitude": -74.170639, + "city": "Hillburn", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10932, + "latitude": 41.485227, + "longitude": -74.484249, + "city": "Howells", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10933, + "latitude": 41.365286, + "longitude": -74.510918, + "city": "Johnson", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10940, + "latitude": 41.390109, + "longitude": -74.340401, + "city": "Middletown", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10941, + "latitude": 41.370586, + "longitude": -74.354017, + "city": "Middletown", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10943, + "latitude": 41.387822, + "longitude": -74.354699, + "city": "Middletown", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10950, + "latitude": 41.343092, + "longitude": -74.316824, + "city": "Monroe", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10952, + "latitude": 41.118595, + "longitude": -74.084536, + "city": "Monsey", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10953, + "latitude": 41.409284, + "longitude": -74.083045, + "city": "Mountainville", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10954, + "latitude": 41.097716, + "longitude": -74.010934, + "city": "Nanuet", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10956, + "latitude": 41.149494, + "longitude": -73.98827, + "city": "New City", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10958, + "latitude": 41.375634, + "longitude": -74.43375, + "city": "New Hampton", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10959, + "latitude": 41.387822, + "longitude": -74.354699, + "city": "New Milford", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10960, + "latitude": 41.080474, + "longitude": -73.930179, + "city": "Nyack", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10962, + "latitude": 41.057496, + "longitude": -73.953181, + "city": "Orangeburg", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10963, + "latitude": 41.401702, + "longitude": -74.536702, + "city": "Otisville", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10964, + "latitude": 41.008947, + "longitude": -73.92093, + "city": "Palisades", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10965, + "latitude": 41.061476, + "longitude": -74.018283, + "city": "Pearl River", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10968, + "latitude": 41.040946, + "longitude": -73.918205, + "city": "Piermont", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10969, + "latitude": 41.325856, + "longitude": -74.488954, + "city": "Pine Island", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10970, + "latitude": 41.18416, + "longitude": -74.045358, + "city": "Pomona", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10973, + "latitude": 41.386099, + "longitude": -74.480395, + "city": "Slate Hill", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10974, + "latitude": 41.157473, + "longitude": -74.200784, + "city": "Sloatsburg", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10975, + "latitude": 41.332379, + "longitude": -74.113857, + "city": "Southfields", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10976, + "latitude": 41.083784, + "longitude": -74.061335, + "city": "Sparkill", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10977, + "latitude": 41.115833, + "longitude": -74.047384, + "city": "Spring Valley", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10979, + "latitude": 41.182344, + "longitude": -74.318354, + "city": "Sterling Forest", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10980, + "latitude": 41.235675, + "longitude": -74.028095, + "city": "Stony Point", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10981, + "latitude": 41.323172, + "longitude": -74.288565, + "city": "Sugar Loaf", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10982, + "latitude": 41.160945, + "longitude": -74.060826, + "city": "Tallman", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10983, + "latitude": 41.027646, + "longitude": -73.948404, + "city": "Tappan", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10984, + "latitude": 41.206898, + "longitude": -74.015411, + "city": "Thiells", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10985, + "latitude": 41.574986, + "longitude": -74.322534, + "city": "Thompson Ridge", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10986, + "latitude": 41.265953, + "longitude": -73.982912, + "city": "Tomkins Cove", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10987, + "latitude": 41.28142, + "longitude": -74.204924, + "city": "Tuxedo Park", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10988, + "latitude": 41.314931, + "longitude": -74.550346, + "city": "Unionville", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10989, + "latitude": 41.122868, + "longitude": -73.934844, + "city": "Valley Cottage", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10990, + "latitude": 41.350681, + "longitude": -74.32116, + "city": "Warwick", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10992, + "latitude": 41.407974, + "longitude": -74.345433, + "city": "Washingtonville", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10993, + "latitude": 41.208044, + "longitude": -73.975833, + "city": "West Haverstraw", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10994, + "latitude": 41.100622, + "longitude": -73.970482, + "city": "West Nyack", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10995, + "latitude": 41.160945, + "longitude": -74.060826, + "city": "West Nyack", + "state": "NY", + "county": "Rockland" + }, + { + "zip_code": 10996, + "latitude": 41.36471, + "longitude": -73.998375, + "city": "West Point", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10997, + "latitude": 41.387822, + "longitude": -74.354699, + "city": "West Point", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 10998, + "latitude": 41.331044, + "longitude": -74.456673, + "city": "Westtown", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 11001, + "latitude": 40.720051, + "longitude": -73.706783, + "city": "Floral Park", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11002, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Floral Park", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11003, + "latitude": 40.697558, + "longitude": -73.704946, + "city": "Elmont", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11004, + "latitude": 40.745263, + "longitude": -73.711159, + "city": "Glen Oaks", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11005, + "latitude": 40.757057, + "longitude": -73.7182, + "city": "Floral Park", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11010, + "latitude": 40.700101, + "longitude": -73.674074, + "city": "Franklin Square", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11020, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Great Neck", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11021, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Great Neck", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11022, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Great Neck", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11023, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Great Neck", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11024, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Great Neck", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11025, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Great Neck", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11026, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Great Neck", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11027, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Great Neck", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11030, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Manhasset", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11040, + "latitude": 40.729351, + "longitude": -73.682824, + "city": "New Hyde Park", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11041, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "New Hyde Park", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11042, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "New Hyde Park", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11043, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "New Hyde Park", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11044, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "New Hyde Park", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11050, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Port Washington", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11051, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Port Washington", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11052, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Port Washington", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11053, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Port Washington", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11054, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Port Washington", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11055, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Port Washington", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11096, + "latitude": 40.620492, + "longitude": -73.747376, + "city": "Inwood", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11099, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "New Hyde Park", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11101, + "latitude": 40.744622, + "longitude": -73.934502, + "city": "Long Island City", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11102, + "latitude": 40.770808, + "longitude": -73.92516, + "city": "Astoria", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11103, + "latitude": 40.761884, + "longitude": -73.911642, + "city": "Astoria", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11104, + "latitude": 40.742794, + "longitude": -73.918216, + "city": "Sunnyside", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11105, + "latitude": 40.776468, + "longitude": -73.908761, + "city": "Astoria", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11106, + "latitude": 40.760601, + "longitude": -73.930984, + "city": "Astoria", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11109, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Long Island City", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11120, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Long Island City", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11201, + "latitude": 40.694481, + "longitude": -73.989319, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11202, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11203, + "latitude": 40.663551, + "longitude": -73.949389, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11204, + "latitude": 40.603838, + "longitude": -73.987635, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11205, + "latitude": 40.682507, + "longitude": -73.936274, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11206, + "latitude": 40.700453, + "longitude": -73.949255, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11207, + "latitude": 40.670925, + "longitude": -73.895216, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11208, + "latitude": 40.662195, + "longitude": -73.912945, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11209, + "latitude": 40.622459, + "longitude": -74.028749, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11210, + "latitude": 40.625468, + "longitude": -73.945521, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11211, + "latitude": 40.707789, + "longitude": -73.945344, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11212, + "latitude": 40.663845, + "longitude": -73.916406, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11213, + "latitude": 40.67317, + "longitude": -73.936055, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11214, + "latitude": 40.599523, + "longitude": -73.998594, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11215, + "latitude": 40.664322, + "longitude": -73.984132, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11216, + "latitude": 40.680474, + "longitude": -73.946829, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11217, + "latitude": 40.684948, + "longitude": -73.980613, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11218, + "latitude": 40.64434, + "longitude": -73.978411, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11219, + "latitude": 40.633157, + "longitude": -73.996953, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11220, + "latitude": 40.634873, + "longitude": -74.016905, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11221, + "latitude": 40.700418, + "longitude": -73.936764, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11222, + "latitude": 40.728388, + "longitude": -73.945754, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11223, + "latitude": 40.633801, + "longitude": -73.954405, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11224, + "latitude": 40.635444, + "longitude": -73.968536, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11225, + "latitude": 40.661096, + "longitude": -73.952295, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11226, + "latitude": 40.644962, + "longitude": -73.956304, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11228, + "latitude": 40.624552, + "longitude": -73.989853, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11229, + "latitude": 40.600988, + "longitude": -73.939998, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11230, + "latitude": 40.62251, + "longitude": -73.966109, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11231, + "latitude": 40.676521, + "longitude": -74.003322, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11232, + "latitude": 40.671186, + "longitude": -73.971708, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11233, + "latitude": 40.682088, + "longitude": -73.920638, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11234, + "latitude": 40.610947, + "longitude": -73.913892, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11235, + "latitude": 40.584455, + "longitude": -73.948402, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11236, + "latitude": 40.65701, + "longitude": -73.91581, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11237, + "latitude": 40.702192, + "longitude": -73.91807, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11238, + "latitude": 40.680593, + "longitude": -73.963928, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11239, + "latitude": 40.649207, + "longitude": -73.876754, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11240, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11241, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11242, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11243, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11244, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11245, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11247, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11248, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11249, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11251, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11252, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11254, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11255, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11256, + "latitude": 40.645099, + "longitude": -73.945032, + "city": "Brooklyn", + "state": "NY", + "county": "Kings" + }, + { + "zip_code": 11351, + "latitude": 40.781703, + "longitude": -73.831698, + "city": "Flushing", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11352, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Flushing", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11354, + "latitude": 40.766382, + "longitude": -73.82619, + "city": "Flushing", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11355, + "latitude": 40.750317, + "longitude": -73.813903, + "city": "Flushing", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11356, + "latitude": 40.784369, + "longitude": -73.843641, + "city": "College Point", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11357, + "latitude": 40.786173, + "longitude": -73.819069, + "city": "Whitestone", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11358, + "latitude": 40.760426, + "longitude": -73.795788, + "city": "Flushing", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11359, + "latitude": 40.79278, + "longitude": -73.776701, + "city": "Bayside", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11360, + "latitude": 40.756745, + "longitude": -73.803301, + "city": "Bayside", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11361, + "latitude": 40.764438, + "longitude": -73.773026, + "city": "Bayside", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11362, + "latitude": 40.758364, + "longitude": -73.735759, + "city": "Little Neck", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11363, + "latitude": 40.771467, + "longitude": -73.745323, + "city": "Little Neck", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11364, + "latitude": 40.742772, + "longitude": -73.758831, + "city": "Oakland Gardens", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11365, + "latitude": 40.738884, + "longitude": -73.790067, + "city": "Fresh Meadows", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11366, + "latitude": 40.727277, + "longitude": -73.790772, + "city": "Fresh Meadows", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11367, + "latitude": 40.730164, + "longitude": -73.821997, + "city": "Flushing", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11368, + "latitude": 40.748751, + "longitude": -73.854333, + "city": "Corona", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11369, + "latitude": 40.762741, + "longitude": -73.869969, + "city": "East Elmhurst", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11370, + "latitude": 40.763771, + "longitude": -73.891451, + "city": "East Elmhurst", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11371, + "latitude": 40.7712, + "longitude": -73.867514, + "city": "Flushing", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11372, + "latitude": 40.751146, + "longitude": -73.882508, + "city": "Jackson Heights", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11373, + "latitude": 40.73509, + "longitude": -73.877562, + "city": "Elmhurst", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11374, + "latitude": 40.722861, + "longitude": -73.862069, + "city": "Rego Park", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11375, + "latitude": 40.723041, + "longitude": -73.843688, + "city": "Forest Hills", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11377, + "latitude": 40.748372, + "longitude": -73.905445, + "city": "Woodside", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11378, + "latitude": 40.722848, + "longitude": -73.908413, + "city": "Maspeth", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11379, + "latitude": 40.71924, + "longitude": -73.892791, + "city": "Middle Village", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11380, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Elmhurst", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11381, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Flushing", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11385, + "latitude": 40.702404, + "longitude": -73.885979, + "city": "Ridgewood", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11386, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Ridgewood", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11390, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Flushing", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11405, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11411, + "latitude": 40.685535, + "longitude": -73.737064, + "city": "Cambria Heights", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11412, + "latitude": 40.695829, + "longitude": -73.761747, + "city": "Saint Albans", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11413, + "latitude": 40.664542, + "longitude": -73.755926, + "city": "Springfield Gardens", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11414, + "latitude": 40.658825, + "longitude": -73.84382, + "city": "Howard Beach", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11415, + "latitude": 40.707133, + "longitude": -73.829247, + "city": "Kew Gardens", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11416, + "latitude": 40.684546, + "longitude": -73.850708, + "city": "Ozone Park", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11417, + "latitude": 40.675056, + "longitude": -73.844315, + "city": "Ozone Park", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11418, + "latitude": 40.698566, + "longitude": -73.83127, + "city": "Richmond Hill", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11419, + "latitude": 40.686769, + "longitude": -73.822979, + "city": "South Richmond Hill", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11420, + "latitude": 40.674432, + "longitude": -73.819013, + "city": "South Ozone Park", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11421, + "latitude": 40.691917, + "longitude": -73.85666, + "city": "Woodhaven", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11422, + "latitude": 40.659418, + "longitude": -73.736866, + "city": "Rosedale", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11423, + "latitude": 40.716888, + "longitude": -73.766897, + "city": "Hollis", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11424, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11425, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11426, + "latitude": 40.736798, + "longitude": -73.723176, + "city": "Bellerose", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11427, + "latitude": 40.729293, + "longitude": -73.749811, + "city": "Queens Village", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11428, + "latitude": 40.720639, + "longitude": -73.742099, + "city": "Queens Village", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11429, + "latitude": 40.710076, + "longitude": -73.740151, + "city": "Queens Village", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11430, + "latitude": 40.655246, + "longitude": -73.797769, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11431, + "latitude": 40.686903, + "longitude": -73.850143, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11432, + "latitude": 40.714531, + "longitude": -73.794435, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11433, + "latitude": 40.696533, + "longitude": -73.786776, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11434, + "latitude": 40.674583, + "longitude": -73.78156, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11435, + "latitude": 40.700229, + "longitude": -73.797278, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11436, + "latitude": 40.675283, + "longitude": -73.800696, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11439, + "latitude": 40.722008, + "longitude": -73.790822, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11451, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11484, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11499, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Jamaica", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11501, + "latitude": 40.735901, + "longitude": -73.638061, + "city": "Mineola", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11507, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Albertson", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11509, + "latitude": 40.588854, + "longitude": -73.72709, + "city": "Atlantic Beach", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11510, + "latitude": 40.654626, + "longitude": -73.608972, + "city": "Baldwin", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11514, + "latitude": 40.74435, + "longitude": -73.608422, + "city": "Carle Place", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11516, + "latitude": 40.626453, + "longitude": -73.725825, + "city": "Cedarhurst", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11518, + "latitude": 40.640387, + "longitude": -73.668224, + "city": "East Rockaway", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11520, + "latitude": 40.651251, + "longitude": -73.585222, + "city": "Freeport", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11530, + "latitude": 40.726801, + "longitude": -73.639723, + "city": "Garden City", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11531, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Garden City", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11535, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Garden City", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11536, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Garden City", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11542, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Glen Cove", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11545, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Glen Head", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11547, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Glenwood Landing", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11548, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Greenvale", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11549, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Hempstead", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11550, + "latitude": 40.700201, + "longitude": -73.620872, + "city": "Hempstead", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11551, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Hempstead", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11552, + "latitude": 40.690251, + "longitude": -73.653023, + "city": "West Hempstead", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11553, + "latitude": 40.705868, + "longitude": -73.591421, + "city": "Uniondale", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11554, + "latitude": 40.72135, + "longitude": -73.55877, + "city": "East Meadow", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11555, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Uniondale", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11556, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Uniondale", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11557, + "latitude": 40.638803, + "longitude": -73.693274, + "city": "Hewlett", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11558, + "latitude": 40.606953, + "longitude": -73.654724, + "city": "Island Park", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11559, + "latitude": 40.615435, + "longitude": -73.72642, + "city": "Lawrence", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11560, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Locust Valley", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11561, + "latitude": 40.589139, + "longitude": -73.642323, + "city": "Long Beach", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11563, + "latitude": 40.657602, + "longitude": -73.672574, + "city": "Lynbrook", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11564, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Lynbrook", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11565, + "latitude": 40.674652, + "longitude": -73.673324, + "city": "Malverne", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11566, + "latitude": 40.668501, + "longitude": -73.553628, + "city": "Merrick", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11568, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Old Westbury", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11569, + "latitude": 40.590503, + "longitude": -73.580822, + "city": "Point Lookout", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11570, + "latitude": 40.667352, + "longitude": -73.638523, + "city": "Rockville Centre", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11571, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Rockville Centre", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11572, + "latitude": 40.635252, + "longitude": -73.636923, + "city": "Oceanside", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11575, + "latitude": 40.680451, + "longitude": -73.590071, + "city": "Roosevelt", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11576, + "latitude": 40.656802, + "longitude": -73.622523, + "city": "Roslyn", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11577, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Roslyn Heights", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11579, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Sea Cliff", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11580, + "latitude": 40.676052, + "longitude": -73.697828, + "city": "Valley Stream", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11581, + "latitude": 40.652253, + "longitude": -73.711775, + "city": "Valley Stream", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11582, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Valley Stream", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11583, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Valley Stream", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11588, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Uniondale", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11590, + "latitude": 40.74505, + "longitude": -73.571521, + "city": "Westbury", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11592, + "latitude": 40.621753, + "longitude": -73.632673, + "city": "Rockville Centre", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11593, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Westbury", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11594, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Westbury", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11595, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Westbury", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11596, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Williston Park", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11597, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Westbury", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11598, + "latitude": 40.633103, + "longitude": -73.712025, + "city": "Woodmere", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11599, + "latitude": 40.607574, + "longitude": -73.742691, + "city": "Garden City", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11690, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Far Rockaway", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11691, + "latitude": 40.601475, + "longitude": -73.76191, + "city": "Far Rockaway", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11692, + "latitude": 40.5923, + "longitude": -73.793273, + "city": "Arverne", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11693, + "latitude": 40.59846, + "longitude": -73.81427, + "city": "Far Rockaway", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11694, + "latitude": 40.57661, + "longitude": -73.84276, + "city": "Rockaway Park", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11695, + "latitude": 40.651378, + "longitude": -73.870779, + "city": "Far Rockaway", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11697, + "latitude": 40.559365, + "longitude": -73.906713, + "city": "Breezy Point", + "state": "NY", + "county": "Queens" + }, + { + "zip_code": 11701, + "latitude": 40.686249, + "longitude": -73.411866, + "city": "Amityville", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11702, + "latitude": 40.66415, + "longitude": -73.340984, + "city": "Babylon", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11703, + "latitude": 40.732348, + "longitude": -73.325363, + "city": "North Babylon", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11704, + "latitude": 40.709098, + "longitude": -73.356164, + "city": "West Babylon", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11705, + "latitude": 40.748364, + "longitude": -73.057026, + "city": "Bayport", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11706, + "latitude": 40.705138, + "longitude": -73.243004, + "city": "Bay Shore", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11707, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "West Babylon", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11708, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Amityville", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11709, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Bayville", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11710, + "latitude": 40.6729, + "longitude": -73.53652, + "city": "Bellmore", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11713, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Bellport", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11714, + "latitude": 40.728449, + "longitude": -73.495369, + "city": "Bethpage", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11715, + "latitude": 40.75673, + "longitude": -73.043481, + "city": "Blue Point", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11716, + "latitude": 40.76902, + "longitude": -73.113366, + "city": "Bohemia", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11717, + "latitude": 40.780882, + "longitude": -73.250336, + "city": "Brentwood", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11718, + "latitude": 40.715424, + "longitude": -73.260912, + "city": "Brightwaters", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11719, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Brookhaven", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11720, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Centereach", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11721, + "latitude": 40.893197, + "longitude": -73.370462, + "city": "Centerport", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11722, + "latitude": 40.78193, + "longitude": -73.196148, + "city": "Central Islip", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11724, + "latitude": 40.860098, + "longitude": -73.442315, + "city": "Cold Spring Harbor", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11725, + "latitude": 40.842247, + "longitude": -73.280935, + "city": "Commack", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11726, + "latitude": 40.68022, + "longitude": -73.394762, + "city": "Copiague", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11727, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Coram", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11729, + "latitude": 40.762574, + "longitude": -73.323061, + "city": "Deer Park", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11730, + "latitude": 40.724146, + "longitude": -73.175926, + "city": "East Islip", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11731, + "latitude": 40.856997, + "longitude": -73.314561, + "city": "East Northport", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11732, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "East Norwich", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11733, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "East Setauket", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11735, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Farmingdale", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11736, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Farmingdale", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11737, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Farmingdale", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11738, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Farmingville", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11739, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Great River", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11740, + "latitude": 40.866948, + "longitude": -73.362512, + "city": "Greenlawn", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11741, + "latitude": 40.78791, + "longitude": -73.066689, + "city": "Holbrook", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11742, + "latitude": 40.798994, + "longitude": -73.048985, + "city": "Holtsville", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11743, + "latitude": 40.867647, + "longitude": -73.410218, + "city": "Huntington", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11745, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Smithtown", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11746, + "latitude": 40.814348, + "longitude": -73.363363, + "city": "Huntington Station", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11747, + "latitude": 40.787248, + "longitude": -73.405573, + "city": "Melville", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11749, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Islandia", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11750, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Huntington Station", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11751, + "latitude": 40.72813, + "longitude": -73.217871, + "city": "Islip", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11752, + "latitude": 40.757226, + "longitude": -73.182854, + "city": "Islip Terrace", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11753, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Jericho", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11754, + "latitude": 40.80323, + "longitude": -73.30485, + "city": "Kings Park", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11755, + "latitude": 40.85185, + "longitude": -73.129003, + "city": "Lake Grove", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11756, + "latitude": 40.7228, + "longitude": -73.515819, + "city": "Levittown", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11757, + "latitude": 40.688799, + "longitude": -73.376475, + "city": "Lindenhurst", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11758, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Massapequa", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11760, + "latitude": 40.810246, + "longitude": -73.191789, + "city": "Islandia", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11762, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Massapequa Park", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11763, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Medford", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11764, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Miller Place", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11765, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Mill Neck", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11766, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Mount Sinai", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11767, + "latitude": 40.846678, + "longitude": -73.146763, + "city": "Nesconset", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11768, + "latitude": 40.914289, + "longitude": -73.33268, + "city": "Northport", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11769, + "latitude": 40.738322, + "longitude": -73.131797, + "city": "Oakdale", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11770, + "latitude": 40.644344, + "longitude": -73.161286, + "city": "Ocean Beach", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11771, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Oyster Bay", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11772, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Patchogue", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11773, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Syosset", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11774, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Farmingdale", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11775, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Melville", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11776, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Port Jefferson Station", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11777, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Port Jefferson", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11778, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Rocky Point", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11779, + "latitude": 40.808322, + "longitude": -73.130469, + "city": "Ronkonkoma", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11780, + "latitude": 40.889314, + "longitude": -73.174435, + "city": "Saint James", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11782, + "latitude": 40.745866, + "longitude": -73.085858, + "city": "Sayville", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11783, + "latitude": 40.683897, + "longitude": -73.496169, + "city": "Seaford", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11784, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Selden", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11786, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Shoreham", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11787, + "latitude": 40.856793, + "longitude": -73.208278, + "city": "Smithtown", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11788, + "latitude": 40.819074, + "longitude": -73.2122, + "city": "Hauppauge", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11789, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Sound Beach", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11790, + "latitude": 40.90129, + "longitude": -73.182803, + "city": "Stony Brook", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11791, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Syosset", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11792, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Wading River", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11793, + "latitude": 40.67815, + "longitude": -73.509519, + "city": "Wantagh", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11794, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Stony Brook", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11795, + "latitude": 40.699825, + "longitude": -73.290905, + "city": "West Islip", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11796, + "latitude": 40.732304, + "longitude": -73.10002, + "city": "West Sayville", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11797, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Woodbury", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11798, + "latitude": 40.73417, + "longitude": -73.351354, + "city": "Wyandanch", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11801, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Hicksville", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11802, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Hicksville", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11803, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Plainview", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11804, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Old Bethpage", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11805, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Mid Island", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11815, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Hicksville", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11819, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Hicksville", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11853, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Jericho", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11854, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Hicksville", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11855, + "latitude": 40.754757, + "longitude": -73.601772, + "city": "Hicksville", + "state": "NY", + "county": "Nassau" + }, + { + "zip_code": 11901, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Riverhead", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11930, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Amagansett", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11931, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Aquebogue", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11932, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Bridgehampton", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11933, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Calverton", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11934, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Center Moriches", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11935, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Cutchogue", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11937, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "East Hampton", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11939, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "East Marion", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11940, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "East Moriches", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11941, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Eastport", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11942, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "East Quogue", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11944, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Greenport", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11946, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Hampton Bays", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11947, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Jamesport", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11948, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Laurel", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11949, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Manorville", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11950, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Mastic", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11951, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Mastic Beach", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11952, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Mattituck", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11953, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Middle Island", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11954, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Montauk", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11955, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Moriches", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11956, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "New Suffolk", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11957, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Orient", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11958, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Peconic", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11959, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Quogue", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11960, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Remsenburg", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11961, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Ridge", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11962, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Sagaponack", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11963, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Sag Harbor", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11964, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Shelter Island", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11965, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Shelter Island Heights", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11967, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Shirley", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11968, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Southampton", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11969, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Southampton", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11970, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "South Jamesport", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11971, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Southold", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11972, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Speonk", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11973, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Upton", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11975, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Wainscott", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11976, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Water Mill", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11977, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Westhampton", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11978, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Westhampton Beach", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 11980, + "latitude": 40.922326, + "longitude": -72.637078, + "city": "Yaphank", + "state": "NY", + "county": "Suffolk" + }, + { + "zip_code": 12007, + "latitude": 42.482455, + "longitude": -73.936671, + "city": "Alcove", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12008, + "latitude": 42.859176, + "longitude": -73.902117, + "city": "Alplaus", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12009, + "latitude": 42.688731, + "longitude": -74.030596, + "city": "Altamont", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12010, + "latitude": 42.906298, + "longitude": -74.229042, + "city": "Amsterdam", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 12015, + "latitude": 42.28004, + "longitude": -73.837035, + "city": "Athens", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12016, + "latitude": 42.910206, + "longitude": -74.423606, + "city": "Auriesville", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 12017, + "latitude": 42.309805, + "longitude": -73.565617, + "city": "Austerlitz", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12018, + "latitude": 42.670645, + "longitude": -73.55142, + "city": "Averill Park", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12019, + "latitude": 42.934416, + "longitude": -73.848971, + "city": "Ballston Lake", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12020, + "latitude": 42.983588, + "longitude": -73.882538, + "city": "Ballston Spa", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12022, + "latitude": 42.67051, + "longitude": -73.357825, + "city": "Berlin", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12023, + "latitude": 42.602236, + "longitude": -74.154615, + "city": "Berne", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12024, + "latitude": 42.494981, + "longitude": -73.510676, + "city": "Brainard", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12025, + "latitude": 43.082793, + "longitude": -74.160753, + "city": "Broadalbin", + "state": "NY", + "county": "Fulton" + }, + { + "zip_code": 12027, + "latitude": 42.923676, + "longitude": -73.911768, + "city": "Burnt Hills", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12028, + "latitude": 42.851332, + "longitude": -73.454055, + "city": "Buskirk", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12029, + "latitude": 42.357057, + "longitude": -73.448944, + "city": "Canaan", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12031, + "latitude": 42.592287, + "longitude": -74.438129, + "city": "Carlisle", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12032, + "latitude": 43.15566, + "longitude": -74.494888, + "city": "Caroga Lake", + "state": "NY", + "county": "Fulton" + }, + { + "zip_code": 12033, + "latitude": 42.589158, + "longitude": -73.565925, + "city": "Castleton On Hudson", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12035, + "latitude": 42.721081, + "longitude": -74.382064, + "city": "Central Bridge", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12036, + "latitude": 42.541025, + "longitude": -74.655395, + "city": "Charlotteville", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12037, + "latitude": 42.335777, + "longitude": -73.528651, + "city": "Chatham", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12040, + "latitude": 42.646742, + "longitude": -73.371611, + "city": "Cherry Plain", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12041, + "latitude": 42.561988, + "longitude": -73.957345, + "city": "Clarksville", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12042, + "latitude": 42.411207, + "longitude": -73.927573, + "city": "Climax", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12043, + "latitude": 42.665376, + "longitude": -74.51884, + "city": "Cobleskill", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12045, + "latitude": 42.475704, + "longitude": -73.797722, + "city": "Coeymans", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12046, + "latitude": 42.492791, + "longitude": -73.928403, + "city": "Coeymans Hollow", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12047, + "latitude": 42.647039, + "longitude": -73.739349, + "city": "Cohoes", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12050, + "latitude": 42.317154, + "longitude": -73.748555, + "city": "Columbiaville", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12051, + "latitude": 42.355924, + "longitude": -73.847967, + "city": "Coxsackie", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12052, + "latitude": 42.670318, + "longitude": -73.549377, + "city": "Cropseyville", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12053, + "latitude": 42.77788, + "longitude": -74.197936, + "city": "Delanson", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12054, + "latitude": 42.605467, + "longitude": -73.8757, + "city": "Delmar", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12055, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Dormansville", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12056, + "latitude": 42.770065, + "longitude": -74.085963, + "city": "Duanesburg", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12057, + "latitude": 42.980783, + "longitude": -73.352206, + "city": "Eagle Bridge", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12058, + "latitude": 42.352969, + "longitude": -73.905306, + "city": "Earlton", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12059, + "latitude": 42.618248, + "longitude": -74.028108, + "city": "East Berne", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12060, + "latitude": 42.419964, + "longitude": -73.512815, + "city": "East Chatham", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12061, + "latitude": 42.570352, + "longitude": -73.655682, + "city": "East Greenbush", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12062, + "latitude": 42.537218, + "longitude": -73.503877, + "city": "East Nassau", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12063, + "latitude": 42.563685, + "longitude": -73.627428, + "city": "East Schodack", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12064, + "latitude": 42.632058, + "longitude": -74.667368, + "city": "East Worcester", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 12065, + "latitude": 42.850576, + "longitude": -73.792524, + "city": "Clifton Park", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12066, + "latitude": 42.801547, + "longitude": -74.342884, + "city": "Esperance", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 12067, + "latitude": 42.555446, + "longitude": -73.913714, + "city": "Feura Bush", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12068, + "latitude": 42.940975, + "longitude": -74.391459, + "city": "Fonda", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 12069, + "latitude": 42.945701, + "longitude": -74.263312, + "city": "Fort Hunter", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 12070, + "latitude": 42.969738, + "longitude": -74.292476, + "city": "Fort Johnson", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 12071, + "latitude": 42.592287, + "longitude": -74.438129, + "city": "Fultonham", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12072, + "latitude": 42.877533, + "longitude": -74.404477, + "city": "Fultonville", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 12073, + "latitude": 42.592287, + "longitude": -74.438129, + "city": "Gallupville", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12074, + "latitude": 43.082925, + "longitude": -74.043981, + "city": "Galway", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12075, + "latitude": 42.366064, + "longitude": -73.589731, + "city": "Ghent", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12076, + "latitude": 42.411096, + "longitude": -74.427506, + "city": "Gilboa", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12077, + "latitude": 42.595704, + "longitude": -73.787766, + "city": "Glenmont", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12078, + "latitude": 43.114958, + "longitude": -74.344328, + "city": "Gloversville", + "state": "NY", + "county": "Fulton" + }, + { + "zip_code": 12082, + "latitude": 42.772624, + "longitude": -73.446834, + "city": "Grafton", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12083, + "latitude": 42.382594, + "longitude": -73.951259, + "city": "Greenville", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12084, + "latitude": 42.703519, + "longitude": -73.960324, + "city": "Guilderland", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12085, + "latitude": 42.694777, + "longitude": -73.905271, + "city": "Guilderland Center", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12086, + "latitude": 42.969505, + "longitude": -74.155559, + "city": "Hagaman", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 12087, + "latitude": 42.411114, + "longitude": -73.881515, + "city": "Hannacroix", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12089, + "latitude": 42.866666, + "longitude": -73.318113, + "city": "Hoosick", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12090, + "latitude": 42.73531, + "longitude": -73.437943, + "city": "Hoosick Falls", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12092, + "latitude": 42.712176, + "longitude": -74.349066, + "city": "Howes Cave", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12093, + "latitude": 42.458932, + "longitude": -74.580562, + "city": "Jefferson", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12094, + "latitude": 42.879946, + "longitude": -73.48684, + "city": "Johnsonville", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12095, + "latitude": 43.090543, + "longitude": -74.355438, + "city": "Johnstown", + "state": "NY", + "county": "Fulton" + }, + { + "zip_code": 12106, + "latitude": 42.385231, + "longitude": -73.704442, + "city": "Kinderhook", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12107, + "latitude": 42.660046, + "longitude": -74.116812, + "city": "Knox", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12108, + "latitude": 43.667618, + "longitude": -74.456913, + "city": "Lake Pleasant", + "state": "NY", + "county": "Hamilton" + }, + { + "zip_code": 12110, + "latitude": 42.752928, + "longitude": -73.779714, + "city": "Latham", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12111, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Latham", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12115, + "latitude": 42.473718, + "longitude": -73.56733, + "city": "Malden Bridge", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12116, + "latitude": 42.551473, + "longitude": -74.913829, + "city": "Maryland", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 12117, + "latitude": 43.132167, + "longitude": -74.248494, + "city": "Mayfield", + "state": "NY", + "county": "Fulton" + }, + { + "zip_code": 12118, + "latitude": 43.033189, + "longitude": -73.897322, + "city": "Mechanicville", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12120, + "latitude": 42.478906, + "longitude": -74.147178, + "city": "Medusa", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12121, + "latitude": 42.712948, + "longitude": -73.601722, + "city": "Melrose", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12122, + "latitude": 42.560533, + "longitude": -74.295505, + "city": "Middleburgh", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12123, + "latitude": 42.565736, + "longitude": -73.629023, + "city": "Nassau", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12124, + "latitude": 42.444198, + "longitude": -73.788241, + "city": "New Baltimore", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12125, + "latitude": 42.466748, + "longitude": -73.567189, + "city": "New Lebanon", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12128, + "latitude": 42.724978, + "longitude": -73.764296, + "city": "Newtonville", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12130, + "latitude": 42.439983, + "longitude": -73.666343, + "city": "Niverville", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12131, + "latitude": 42.592287, + "longitude": -74.438129, + "city": "North Blenheim", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12132, + "latitude": 42.466061, + "longitude": -73.629296, + "city": "North Chatham", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12133, + "latitude": 42.926121, + "longitude": -73.346409, + "city": "North Hoosick", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12134, + "latitude": 43.176121, + "longitude": -74.248627, + "city": "Northville", + "state": "NY", + "county": "Fulton" + }, + { + "zip_code": 12136, + "latitude": 42.434992, + "longitude": -73.561172, + "city": "Old Chatham", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12137, + "latitude": 42.838578, + "longitude": -74.131734, + "city": "Pattersonville", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12138, + "latitude": 42.685947, + "longitude": -73.390627, + "city": "Petersburg", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12139, + "latitude": 43.428386, + "longitude": -74.526485, + "city": "Piseco", + "state": "NY", + "county": "Hamilton" + }, + { + "zip_code": 12140, + "latitude": 42.686757, + "longitude": -73.527434, + "city": "Poestenkill", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12141, + "latitude": 42.731771, + "longitude": -74.185395, + "city": "Quaker Street", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12143, + "latitude": 42.493642, + "longitude": -73.858352, + "city": "Ravena", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12144, + "latitude": 42.621627, + "longitude": -73.596089, + "city": "Rensselaer", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12147, + "latitude": 42.500258, + "longitude": -74.160591, + "city": "Rensselaerville", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12148, + "latitude": 42.841619, + "longitude": -73.847016, + "city": "Rexford", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12149, + "latitude": 42.609418, + "longitude": -74.594655, + "city": "Richmondville", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12150, + "latitude": 42.869961, + "longitude": -74.050083, + "city": "Rotterdam Junction", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12151, + "latitude": 42.924726, + "longitude": -73.785914, + "city": "Round Lake", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12153, + "latitude": 42.635503, + "longitude": -73.479705, + "city": "Sand Lake", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12154, + "latitude": 42.904445, + "longitude": -73.615618, + "city": "Schaghticoke", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12155, + "latitude": 42.605453, + "longitude": -74.820584, + "city": "Schenevus", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 12156, + "latitude": 42.491469, + "longitude": -73.723935, + "city": "Schodack Landing", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12157, + "latitude": 42.655569, + "longitude": -74.337322, + "city": "Schoharie", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12158, + "latitude": 42.529746, + "longitude": -73.840579, + "city": "Selkirk", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12159, + "latitude": 42.644278, + "longitude": -73.876338, + "city": "Slingerlands", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12160, + "latitude": 42.756876, + "longitude": -74.317361, + "city": "Sloansville", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12161, + "latitude": 42.521038, + "longitude": -73.851898, + "city": "South Bethlehem", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12164, + "latitude": 43.667618, + "longitude": -74.456913, + "city": "Speculator", + "state": "NY", + "county": "Hamilton" + }, + { + "zip_code": 12165, + "latitude": 42.331057, + "longitude": -73.529774, + "city": "Spencertown", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12166, + "latitude": 42.842006, + "longitude": -74.446, + "city": "Sprakers", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 12167, + "latitude": 42.413508, + "longitude": -74.61939, + "city": "Stamford", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 12168, + "latitude": 42.63593, + "longitude": -73.408789, + "city": "Stephentown", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12169, + "latitude": 42.585511, + "longitude": -73.415444, + "city": "Stephentown", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12170, + "latitude": 43.001932, + "longitude": -73.660897, + "city": "Stillwater", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12172, + "latitude": 42.285749, + "longitude": -73.733532, + "city": "Stottville", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12173, + "latitude": 42.399271, + "longitude": -73.622327, + "city": "Stuyvesant", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12174, + "latitude": 42.343986, + "longitude": -73.73477, + "city": "Stuyvesant Falls", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12175, + "latitude": 42.535029, + "longitude": -74.54525, + "city": "Summit", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12176, + "latitude": 42.385117, + "longitude": -73.958671, + "city": "Surprise", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12177, + "latitude": 42.95002, + "longitude": -74.296985, + "city": "Tribes Hill", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 12179, + "latitude": 42.71144, + "longitude": -73.525561, + "city": "Troy", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12180, + "latitude": 42.673701, + "longitude": -73.608792, + "city": "Troy", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12181, + "latitude": 42.738678, + "longitude": -73.673862, + "city": "Troy", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12182, + "latitude": 42.685792, + "longitude": -73.652374, + "city": "Troy", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12183, + "latitude": 42.745994, + "longitude": -73.694263, + "city": "Troy", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12184, + "latitude": 42.398503, + "longitude": -73.626548, + "city": "Valatie", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12185, + "latitude": 42.856307, + "longitude": -73.500679, + "city": "Valley Falls", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12186, + "latitude": 42.620654, + "longitude": -73.980441, + "city": "Voorheesville", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12187, + "latitude": 42.592287, + "longitude": -74.438129, + "city": "Warnerville", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12188, + "latitude": 42.845579, + "longitude": -73.702433, + "city": "Waterford", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12189, + "latitude": 42.736277, + "longitude": -73.720318, + "city": "Watervliet", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12190, + "latitude": 43.667618, + "longitude": -74.456913, + "city": "Wells", + "state": "NY", + "county": "Hamilton" + }, + { + "zip_code": 12192, + "latitude": 42.397703, + "longitude": -73.834836, + "city": "West Coxsackie", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12193, + "latitude": 42.521722, + "longitude": -74.03961, + "city": "Westerlo", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12194, + "latitude": 42.572934, + "longitude": -74.514163, + "city": "West Fulton", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 12195, + "latitude": 42.479384, + "longitude": -73.474809, + "city": "West Lebanon", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12196, + "latitude": 42.603715, + "longitude": -73.561566, + "city": "West Sand Lake", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12197, + "latitude": 42.606993, + "longitude": -74.732401, + "city": "Worcester", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 12198, + "latitude": 42.676167, + "longitude": -73.606194, + "city": "Wynantskill", + "state": "NY", + "county": "Rensselaer" + }, + { + "zip_code": 12201, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12202, + "latitude": 42.636371, + "longitude": -73.763564, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12203, + "latitude": 42.700345, + "longitude": -73.857496, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12204, + "latitude": 42.682978, + "longitude": -73.770714, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12205, + "latitude": 42.719799, + "longitude": -73.820666, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12206, + "latitude": 42.675779, + "longitude": -73.793065, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12207, + "latitude": 42.656029, + "longitude": -73.750764, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12208, + "latitude": 42.654658, + "longitude": -73.805866, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12209, + "latitude": 42.677953, + "longitude": -73.91019, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12210, + "latitude": 42.683079, + "longitude": -73.758115, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12211, + "latitude": 42.712973, + "longitude": -73.773868, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12212, + "latitude": 42.716774, + "longitude": -73.810373, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12214, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12220, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12222, + "latitude": 42.692909, + "longitude": -73.838035, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12223, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12224, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12225, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12226, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12227, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12228, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12229, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12230, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12231, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12232, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12233, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12234, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12235, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12236, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12237, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12238, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12239, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12240, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12241, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12242, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12243, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12244, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12245, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12246, + "latitude": 42.647079, + "longitude": -73.750314, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12247, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12248, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12249, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12250, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12252, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12255, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12256, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12257, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12260, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12261, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12262, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12288, + "latitude": 42.614852, + "longitude": -73.970812, + "city": "Albany", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12301, + "latitude": 42.833261, + "longitude": -74.058015, + "city": "Schenectady", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12302, + "latitude": 42.880035, + "longitude": -73.991321, + "city": "Schenectady", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12303, + "latitude": 42.782276, + "longitude": -73.944818, + "city": "Schenectady", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12304, + "latitude": 42.788176, + "longitude": -73.899917, + "city": "Schenectady", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12305, + "latitude": 42.812776, + "longitude": -73.943368, + "city": "Schenectady", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12306, + "latitude": 42.816438, + "longitude": -74.052713, + "city": "Schenectady", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12307, + "latitude": 42.805376, + "longitude": -73.934868, + "city": "Schenectady", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12308, + "latitude": 42.835926, + "longitude": -73.920467, + "city": "Schenectady", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12309, + "latitude": 42.809077, + "longitude": -73.869316, + "city": "Schenectady", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12325, + "latitude": 42.833261, + "longitude": -74.058015, + "city": "Schenectady", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12345, + "latitude": 42.833261, + "longitude": -74.058015, + "city": "Schenectady", + "state": "NY", + "county": "Schenectady" + }, + { + "zip_code": 12401, + "latitude": 41.96973, + "longitude": -74.06678, + "city": "Kingston", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12402, + "latitude": 41.878801, + "longitude": -74.345684, + "city": "Kingston", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12404, + "latitude": 41.949147, + "longitude": -74.130688, + "city": "Accord", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12405, + "latitude": 42.315975, + "longitude": -74.065515, + "city": "Acra", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12406, + "latitude": 42.141725, + "longitude": -74.572054, + "city": "Arkville", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 12407, + "latitude": 42.332859, + "longitude": -74.367866, + "city": "Ashland", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12409, + "latitude": 42.054666, + "longitude": -74.192451, + "city": "Bearsville", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12410, + "latitude": 42.073965, + "longitude": -74.453033, + "city": "Big Indian", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12411, + "latitude": 41.875232, + "longitude": -74.043557, + "city": "Bloomington", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12412, + "latitude": 41.998413, + "longitude": -74.265437, + "city": "Boiceville", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12413, + "latitude": 42.301789, + "longitude": -74.029434, + "city": "Cairo", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12414, + "latitude": 42.258459, + "longitude": -74.021968, + "city": "Catskill", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12416, + "latitude": 42.095023, + "longitude": -74.271661, + "city": "Chichester", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12417, + "latitude": 41.907604, + "longitude": -73.989254, + "city": "Connelly", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12418, + "latitude": 42.368277, + "longitude": -74.179384, + "city": "Cornwallville", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12419, + "latitude": 41.856903, + "longitude": -74.111235, + "city": "Cottekill", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12420, + "latitude": 41.669831, + "longitude": -74.380138, + "city": "Cragsmoor", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12421, + "latitude": 42.235727, + "longitude": -74.56969, + "city": "Denver", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 12422, + "latitude": 42.307188, + "longitude": -74.200237, + "city": "Durham", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12423, + "latitude": 42.377483, + "longitude": -74.123477, + "city": "East Durham", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12424, + "latitude": 42.28041, + "longitude": -74.15549, + "city": "East Jewett", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12427, + "latitude": 42.169082, + "longitude": -74.12958, + "city": "Elka Park", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12428, + "latitude": 41.897181, + "longitude": -74.253996, + "city": "Ellenville", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12429, + "latitude": 41.816228, + "longitude": -73.992565, + "city": "Esopus", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12430, + "latitude": 42.177175, + "longitude": -74.547279, + "city": "Fleischmanns", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 12431, + "latitude": 42.336112, + "longitude": -74.024147, + "city": "Freehold", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12432, + "latitude": 41.949795, + "longitude": -74.003246, + "city": "Glasco", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12433, + "latitude": 42.008413, + "longitude": -74.147995, + "city": "Glenford", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12434, + "latitude": 42.320684, + "longitude": -74.459223, + "city": "Grand Gorge", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 12435, + "latitude": 41.727613, + "longitude": -74.515647, + "city": "Greenfield Park", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12436, + "latitude": 42.19551, + "longitude": -74.102319, + "city": "Haines Falls", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12438, + "latitude": 42.183045, + "longitude": -74.925617, + "city": "Halcottsville", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 12439, + "latitude": 42.293905, + "longitude": -74.185279, + "city": "Hensonville", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12440, + "latitude": 41.872233, + "longitude": -74.146678, + "city": "High Falls", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12441, + "latitude": 41.878801, + "longitude": -74.345684, + "city": "Highmount", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12442, + "latitude": 42.233275, + "longitude": -74.241582, + "city": "Hunter", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12443, + "latitude": 41.853723, + "longitude": -74.115476, + "city": "Hurley", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12444, + "latitude": 42.264524, + "longitude": -74.295888, + "city": "Jewett", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12446, + "latitude": 41.884748, + "longitude": -74.232063, + "city": "Kerhonkson", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12448, + "latitude": 42.083209, + "longitude": -74.191963, + "city": "Lake Hill", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12449, + "latitude": 41.883711, + "longitude": -74.182479, + "city": "Lake Katrine", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12450, + "latitude": 42.208809, + "longitude": -74.163793, + "city": "Lanesville", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12451, + "latitude": 42.304064, + "longitude": -73.930812, + "city": "Leeds", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12452, + "latitude": 42.223407, + "longitude": -74.386635, + "city": "Lexington", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12453, + "latitude": 42.098698, + "longitude": -73.935418, + "city": "Malden On Hudson", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12454, + "latitude": 42.282466, + "longitude": -74.160193, + "city": "Maplecrest", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12455, + "latitude": 42.185189, + "longitude": -74.617819, + "city": "Margaretville", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 12456, + "latitude": 42.037136, + "longitude": -73.992829, + "city": "Mount Marion", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12457, + "latitude": 41.8743, + "longitude": -74.168979, + "city": "Mount Tremper", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12458, + "latitude": 41.80137, + "longitude": -74.420108, + "city": "Napanoch", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12459, + "latitude": 42.20943, + "longitude": -74.683726, + "city": "New Kingston", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 12460, + "latitude": 42.409721, + "longitude": -74.192105, + "city": "Oak Hill", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12461, + "latitude": 41.875001, + "longitude": -74.273362, + "city": "Olivebridge", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12463, + "latitude": 42.197886, + "longitude": -74.00995, + "city": "Palenville", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12464, + "latitude": 42.019668, + "longitude": -74.228732, + "city": "Phoenicia", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12465, + "latitude": 42.136293, + "longitude": -74.473639, + "city": "Pine Hill", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12466, + "latitude": 41.894812, + "longitude": -73.976653, + "city": "Port Ewen", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12468, + "latitude": 42.286917, + "longitude": -74.385762, + "city": "Prattsville", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12469, + "latitude": 42.464687, + "longitude": -74.213992, + "city": "Preston Hollow", + "state": "NY", + "county": "Albany" + }, + { + "zip_code": 12470, + "latitude": 42.282915, + "longitude": -74.018409, + "city": "Purling", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12471, + "latitude": 41.840304, + "longitude": -74.030611, + "city": "Rifton", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12472, + "latitude": 41.873367, + "longitude": -74.074621, + "city": "Rosendale", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12473, + "latitude": 42.276462, + "longitude": -74.044432, + "city": "Round Top", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12474, + "latitude": 42.295703, + "longitude": -74.563088, + "city": "Roxbury", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 12475, + "latitude": 42.017632, + "longitude": -74.007868, + "city": "Ruby", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12477, + "latitude": 41.996982, + "longitude": -74.202816, + "city": "Saugerties", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12480, + "latitude": 41.911181, + "longitude": -74.407894, + "city": "Shandaken", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12481, + "latitude": 41.970903, + "longitude": -74.218443, + "city": "Shokan", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12482, + "latitude": 42.267617, + "longitude": -73.986354, + "city": "South Cairo", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12483, + "latitude": 41.663895, + "longitude": -74.424533, + "city": "Spring Glen", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12484, + "latitude": 41.846274, + "longitude": -74.20731, + "city": "Stone Ridge", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12485, + "latitude": 42.195922, + "longitude": -74.137242, + "city": "Tannersville", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12486, + "latitude": 41.837953, + "longitude": -74.232241, + "city": "Tillson", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12487, + "latitude": 41.857076, + "longitude": -74.017907, + "city": "Ulster Park", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12489, + "latitude": 41.760604, + "longitude": -74.353531, + "city": "Wawarsing", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12490, + "latitude": 42.108689, + "longitude": -73.934577, + "city": "West Camp", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12491, + "latitude": 41.983752, + "longitude": -74.124371, + "city": "West Hurley", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12492, + "latitude": 42.206787, + "longitude": -74.375508, + "city": "West Kill", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12493, + "latitude": 41.795276, + "longitude": -73.980908, + "city": "West Park", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12494, + "latitude": 41.972572, + "longitude": -74.267623, + "city": "West Shokan", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12495, + "latitude": 42.046885, + "longitude": -74.203575, + "city": "Willow", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12496, + "latitude": 42.320273, + "longitude": -74.231589, + "city": "Windham", + "state": "NY", + "county": "Greene" + }, + { + "zip_code": 12498, + "latitude": 41.883076, + "longitude": -74.169764, + "city": "Woodstock", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12501, + "latitude": 41.826491, + "longitude": -73.710901, + "city": "Amenia", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12502, + "latitude": 42.067399, + "longitude": -73.657698, + "city": "Ancram", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12503, + "latitude": 42.043039, + "longitude": -73.587575, + "city": "Ancramdale", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12504, + "latitude": 42.035434, + "longitude": -73.909234, + "city": "Annandale On Hudson", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12506, + "latitude": 41.759905, + "longitude": -73.743714, + "city": "Bangall", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12507, + "latitude": 42.000547, + "longitude": -73.919899, + "city": "Barrytown", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12508, + "latitude": 41.712677, + "longitude": -73.773082, + "city": "Beacon", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12510, + "latitude": 41.759905, + "longitude": -73.743714, + "city": "Billings", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12511, + "latitude": 41.759905, + "longitude": -73.743714, + "city": "Castle Point", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12512, + "latitude": 41.552793, + "longitude": -73.968183, + "city": "Chelsea", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12513, + "latitude": 42.206862, + "longitude": -73.694642, + "city": "Claverack", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12514, + "latitude": 41.867364, + "longitude": -73.777256, + "city": "Clinton Corners", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12515, + "latitude": 41.682335, + "longitude": -74.05799, + "city": "Clintondale", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12516, + "latitude": 42.099322, + "longitude": -73.576102, + "city": "Copake", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12517, + "latitude": 42.130934, + "longitude": -73.548337, + "city": "Copake Falls", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12518, + "latitude": 41.348593, + "longitude": -74.135167, + "city": "Cornwall", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12520, + "latitude": 41.431474, + "longitude": -74.132883, + "city": "Cornwall On Hudson", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12521, + "latitude": 42.190488, + "longitude": -73.64465, + "city": "Craryville", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12522, + "latitude": 41.800316, + "longitude": -73.687324, + "city": "Dover Plains", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12523, + "latitude": 42.119528, + "longitude": -73.697297, + "city": "Elizaville", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12524, + "latitude": 41.61898, + "longitude": -73.847308, + "city": "Fishkill", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12525, + "latitude": 41.677151, + "longitude": -74.17387, + "city": "Gardiner", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12526, + "latitude": 42.121298, + "longitude": -73.792924, + "city": "Germantown", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12527, + "latitude": 41.520249, + "longitude": -73.933259, + "city": "Glenham", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12528, + "latitude": 41.720945, + "longitude": -74.009481, + "city": "Highland", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12529, + "latitude": 42.19327, + "longitude": -73.550028, + "city": "Hillsdale", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12530, + "latitude": 42.210991, + "longitude": -73.687001, + "city": "Hollowville", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12531, + "latitude": 41.549045, + "longitude": -73.670325, + "city": "Holmes", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12533, + "latitude": 41.748948, + "longitude": -73.766191, + "city": "Hopewell Junction", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12534, + "latitude": 42.184313, + "longitude": -73.742997, + "city": "Hudson", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12537, + "latitude": 41.582437, + "longitude": -73.936281, + "city": "Hughsonville", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12538, + "latitude": 41.813468, + "longitude": -73.814913, + "city": "Hyde Park", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12540, + "latitude": 41.633029, + "longitude": -73.743183, + "city": "Lagrangeville", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12541, + "latitude": 42.142068, + "longitude": -73.757399, + "city": "Livingston", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12542, + "latitude": 41.612647, + "longitude": -74.002802, + "city": "Marlboro", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12543, + "latitude": 41.357625, + "longitude": -74.230587, + "city": "Maybrook", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12544, + "latitude": 42.259623, + "longitude": -73.667962, + "city": "Mellenville", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12545, + "latitude": 41.832012, + "longitude": -73.637175, + "city": "Millbrook", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12546, + "latitude": 41.93846, + "longitude": -73.546336, + "city": "Millerton", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12547, + "latitude": 41.644832, + "longitude": -74.068056, + "city": "Milton", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12548, + "latitude": 41.672278, + "longitude": -74.103276, + "city": "Modena", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12549, + "latitude": 41.405901, + "longitude": -74.255717, + "city": "Montgomery", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12550, + "latitude": 41.38537, + "longitude": -74.185363, + "city": "Newburgh", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12551, + "latitude": 41.387822, + "longitude": -74.354699, + "city": "Newburgh", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12552, + "latitude": 41.387822, + "longitude": -74.354699, + "city": "Newburgh", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12553, + "latitude": 41.413667, + "longitude": -74.311974, + "city": "New Windsor", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12555, + "latitude": 41.387822, + "longitude": -74.354699, + "city": "Mid Hudson", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12561, + "latitude": 41.74638, + "longitude": -74.109241, + "city": "New Paltz", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12563, + "latitude": 41.485285, + "longitude": -73.595066, + "city": "Patterson", + "state": "NY", + "county": "Putnam" + }, + { + "zip_code": 12564, + "latitude": 41.663759, + "longitude": -73.590491, + "city": "Pawling", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12565, + "latitude": 42.250141, + "longitude": -73.659054, + "city": "Philmont", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12566, + "latitude": 41.405485, + "longitude": -74.219343, + "city": "Pine Bush", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12567, + "latitude": 41.952681, + "longitude": -73.63633, + "city": "Pine Plains", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12568, + "latitude": 41.641207, + "longitude": -74.07805, + "city": "Plattekill", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12569, + "latitude": 41.825708, + "longitude": -73.783655, + "city": "Pleasant Valley", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12570, + "latitude": 41.646389, + "longitude": -73.650107, + "city": "Poughquag", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12571, + "latitude": 41.808427, + "longitude": -73.786847, + "city": "Red Hook", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12572, + "latitude": 41.836548, + "longitude": -73.760423, + "city": "Rhinebeck", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12574, + "latitude": 41.915068, + "longitude": -73.95173, + "city": "Rhinecliff", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12575, + "latitude": 41.50755, + "longitude": -74.156394, + "city": "Rock Tavern", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12577, + "latitude": 41.437176, + "longitude": -74.121804, + "city": "Salisbury Mills", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12578, + "latitude": 41.81246, + "longitude": -73.786647, + "city": "Salt Point", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12580, + "latitude": 41.881636, + "longitude": -73.72455, + "city": "Staatsburg", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12581, + "latitude": 41.913511, + "longitude": -73.695442, + "city": "Stanfordville", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12582, + "latitude": 41.554509, + "longitude": -73.72667, + "city": "Stormville", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12583, + "latitude": 41.909683, + "longitude": -73.749214, + "city": "Tivoli", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12584, + "latitude": 41.464073, + "longitude": -74.059104, + "city": "Vails Gate", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12585, + "latitude": 41.716145, + "longitude": -73.690109, + "city": "Verbank", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12586, + "latitude": 41.406785, + "longitude": -74.26731, + "city": "Walden", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12588, + "latitude": 41.878801, + "longitude": -74.345684, + "city": "Walker Valley", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12589, + "latitude": 41.631653, + "longitude": -74.154472, + "city": "Wallkill", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12590, + "latitude": 41.736948, + "longitude": -73.741141, + "city": "Wappingers Falls", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12592, + "latitude": 41.802285, + "longitude": -73.560425, + "city": "Wassaic", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12593, + "latitude": 42.243991, + "longitude": -73.641076, + "city": "West Copake", + "state": "NY", + "county": "Columbia" + }, + { + "zip_code": 12594, + "latitude": 41.672789, + "longitude": -73.584346, + "city": "Wingdale", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12601, + "latitude": 41.695839, + "longitude": -73.896164, + "city": "Poughkeepsie", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12602, + "latitude": 41.759905, + "longitude": -73.743714, + "city": "Poughkeepsie", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12603, + "latitude": 41.690707, + "longitude": -73.862074, + "city": "Poughkeepsie", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12604, + "latitude": 41.759905, + "longitude": -73.743714, + "city": "Poughkeepsie", + "state": "NY", + "county": "Dutchess" + }, + { + "zip_code": 12701, + "latitude": 41.686944, + "longitude": -74.677156, + "city": "Monticello", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12719, + "latitude": 41.486186, + "longitude": -74.915176, + "city": "Barryville", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12720, + "latitude": 41.661466, + "longitude": -74.911474, + "city": "Bethel", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12721, + "latitude": 41.63868, + "longitude": -74.721754, + "city": "Bloomingburg", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12722, + "latitude": 41.719016, + "longitude": -74.755373, + "city": "Burlingham", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12723, + "latitude": 41.775202, + "longitude": -75.01807, + "city": "Callicoon", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12724, + "latitude": 41.719016, + "longitude": -74.755373, + "city": "Callicoon Center", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12725, + "latitude": 41.899285, + "longitude": -74.58802, + "city": "Claryville", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12726, + "latitude": 41.691959, + "longitude": -74.974074, + "city": "Cochecton", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12727, + "latitude": 41.719016, + "longitude": -74.755373, + "city": "Cochecton Center", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12729, + "latitude": 41.403723, + "longitude": -74.425265, + "city": "Cuddebackville", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12732, + "latitude": 41.517426, + "longitude": -74.845788, + "city": "Eldred", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12733, + "latitude": 41.647052, + "longitude": -74.537252, + "city": "Fallsburg", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12734, + "latitude": 41.734858, + "longitude": -74.734508, + "city": "Ferndale", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12736, + "latitude": 41.878194, + "longitude": -75.034258, + "city": "Fremont Center", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12737, + "latitude": 41.547309, + "longitude": -74.820881, + "city": "Glen Spey", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12738, + "latitude": 41.656753, + "longitude": -74.568565, + "city": "Glen Wild", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12739, + "latitude": 41.450914, + "longitude": -74.601097, + "city": "Godeffroy", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12740, + "latitude": 41.818383, + "longitude": -74.748053, + "city": "Grahamsville", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12741, + "latitude": 41.839135, + "longitude": -75.05342, + "city": "Hankins", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12742, + "latitude": 41.710156, + "longitude": -74.71536, + "city": "Harris", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12743, + "latitude": 41.531346, + "longitude": -74.849136, + "city": "Highland Lake", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12745, + "latitude": 41.762944, + "longitude": -75.030592, + "city": "Hortonville", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12746, + "latitude": 41.437689, + "longitude": -74.640019, + "city": "Huguenot", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12747, + "latitude": 41.770283, + "longitude": -74.726066, + "city": "Hurleyville", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12748, + "latitude": 41.782874, + "longitude": -74.905417, + "city": "Jeffersonville", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12749, + "latitude": 41.687384, + "longitude": -74.835807, + "city": "Kauneonga Lake", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12750, + "latitude": 41.729581, + "longitude": -74.961146, + "city": "Kenoza Lake", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12751, + "latitude": 41.694655, + "longitude": -74.682731, + "city": "Kiamesha Lake", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12752, + "latitude": 41.758563, + "longitude": -74.946306, + "city": "Lake Huntington", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12754, + "latitude": 41.71994, + "longitude": -74.66934, + "city": "Liberty", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12758, + "latitude": 41.818205, + "longitude": -74.802549, + "city": "Livingston Manor", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12759, + "latitude": 41.786516, + "longitude": -74.658843, + "city": "Loch Sheldrake", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12760, + "latitude": 41.871276, + "longitude": -75.076328, + "city": "Long Eddy", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12762, + "latitude": 41.686123, + "longitude": -74.783554, + "city": "Mongaup Valley", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12763, + "latitude": 41.80469, + "longitude": -74.696318, + "city": "Mountain Dale", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12764, + "latitude": 41.595908, + "longitude": -74.96233, + "city": "Narrowsburg", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12765, + "latitude": 41.865656, + "longitude": -74.60902, + "city": "Neversink", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12766, + "latitude": 41.820897, + "longitude": -74.995771, + "city": "North Branch", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12767, + "latitude": 41.719016, + "longitude": -74.755373, + "city": "Obernburg", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12768, + "latitude": 41.841414, + "longitude": -74.857261, + "city": "Parksville", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12769, + "latitude": 41.651453, + "longitude": -74.436159, + "city": "Phillipsport", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12770, + "latitude": 41.446322, + "longitude": -74.856932, + "city": "Pond Eddy", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12771, + "latitude": 41.357119, + "longitude": -74.498396, + "city": "Port Jervis", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12775, + "latitude": 41.619506, + "longitude": -74.575902, + "city": "Rock Hill", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12776, + "latitude": 41.819249, + "longitude": -74.951782, + "city": "Roscoe", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12777, + "latitude": 41.552911, + "longitude": -74.603366, + "city": "Forestburgh", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12778, + "latitude": 41.661538, + "longitude": -74.817751, + "city": "Smallwood", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12779, + "latitude": 41.770195, + "longitude": -74.716843, + "city": "South Fallsburg", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12780, + "latitude": 41.376892, + "longitude": -74.459687, + "city": "Sparrow Bush", + "state": "NY", + "county": "Orange" + }, + { + "zip_code": 12781, + "latitude": 41.719016, + "longitude": -74.755373, + "city": "Summitville", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12782, + "latitude": 41.881485, + "longitude": -74.430063, + "city": "Sundown", + "state": "NY", + "county": "Ulster" + }, + { + "zip_code": 12783, + "latitude": 41.657319, + "longitude": -74.840778, + "city": "Swan Lake", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12784, + "latitude": 41.714311, + "longitude": -74.584061, + "city": "Thompsonville", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12785, + "latitude": 41.719016, + "longitude": -74.755373, + "city": "Westbrookville", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12786, + "latitude": 41.64788, + "longitude": -74.811773, + "city": "White Lake", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12787, + "latitude": 41.800193, + "longitude": -74.828611, + "city": "White Sulphur Springs", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12788, + "latitude": 41.810974, + "longitude": -74.729403, + "city": "Woodbourne", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12789, + "latitude": 41.797345, + "longitude": -74.671013, + "city": "Woodridge", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12790, + "latitude": 41.592331, + "longitude": -74.552644, + "city": "Wurtsboro", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12791, + "latitude": 41.695449, + "longitude": -74.746874, + "city": "Youngsville", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12792, + "latitude": 41.591075, + "longitude": -74.749722, + "city": "Yulan", + "state": "NY", + "county": "Sullivan" + }, + { + "zip_code": 12801, + "latitude": 43.31888, + "longitude": -73.669061, + "city": "Glens Falls", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12803, + "latitude": 43.283561, + "longitude": -73.629401, + "city": "South Glens Falls", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12804, + "latitude": 43.489472, + "longitude": -73.789563, + "city": "Queensbury", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12808, + "latitude": 43.708338, + "longitude": -73.794147, + "city": "Adirondack", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12809, + "latitude": 43.280711, + "longitude": -73.484828, + "city": "Argyle", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12810, + "latitude": 43.59886, + "longitude": -73.943693, + "city": "Athol", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12811, + "latitude": 43.62422, + "longitude": -74.061201, + "city": "Bakers Mills", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12812, + "latitude": 43.667618, + "longitude": -74.456913, + "city": "Blue Mountain Lake", + "state": "NY", + "county": "Hamilton" + }, + { + "zip_code": 12814, + "latitude": 43.574329, + "longitude": -73.677564, + "city": "Bolton Landing", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12815, + "latitude": 43.677503, + "longitude": -73.773434, + "city": "Brant Lake", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12816, + "latitude": 43.068526, + "longitude": -73.392229, + "city": "Cambridge", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12817, + "latitude": 43.522364, + "longitude": -73.794491, + "city": "Chestertown", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12819, + "latitude": 43.614194, + "longitude": -73.503056, + "city": "Clemons", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12820, + "latitude": 43.47181, + "longitude": -73.639291, + "city": "Cleverdale", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12821, + "latitude": 43.46144, + "longitude": -73.403287, + "city": "Comstock", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12822, + "latitude": 43.241967, + "longitude": -73.890739, + "city": "Corinth", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12823, + "latitude": 43.154262, + "longitude": -73.458063, + "city": "Cossayuna", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12824, + "latitude": 43.560729, + "longitude": -73.755545, + "city": "Diamond Point", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12827, + "latitude": 43.443936, + "longitude": -73.489198, + "city": "Fort Ann", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12828, + "latitude": 43.371195, + "longitude": -73.434566, + "city": "Fort Edward", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12831, + "latitude": 43.204261, + "longitude": -73.707415, + "city": "Gansevoort", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12832, + "latitude": 43.369373, + "longitude": -73.331692, + "city": "Granville", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12833, + "latitude": 43.181214, + "longitude": -73.906293, + "city": "Greenfield Center", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12834, + "latitude": 43.212754, + "longitude": -73.434261, + "city": "Greenwich", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12835, + "latitude": 43.287589, + "longitude": -73.976958, + "city": "Hadley", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12836, + "latitude": 43.730225, + "longitude": -73.543498, + "city": "Hague", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12837, + "latitude": 43.492705, + "longitude": -73.278904, + "city": "Hampton", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12838, + "latitude": 43.354304, + "longitude": -73.404906, + "city": "Hartford", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12839, + "latitude": 43.203596, + "longitude": -73.468589, + "city": "Hudson Falls", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12841, + "latitude": 43.646953, + "longitude": -73.508308, + "city": "Huletts Landing", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12842, + "latitude": 43.749928, + "longitude": -74.327593, + "city": "Indian Lake", + "state": "NY", + "county": "Hamilton" + }, + { + "zip_code": 12843, + "latitude": 43.58596, + "longitude": -73.916498, + "city": "Johnsburg", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12844, + "latitude": 43.475353, + "longitude": -73.627156, + "city": "Kattskill Bay", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12845, + "latitude": 43.518611, + "longitude": -73.875462, + "city": "Lake George", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12846, + "latitude": 43.455598, + "longitude": -73.771547, + "city": "Lake Luzerne", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12847, + "latitude": 43.953253, + "longitude": -74.440029, + "city": "Long Lake", + "state": "NY", + "county": "Hamilton" + }, + { + "zip_code": 12848, + "latitude": 43.100123, + "longitude": -73.524554, + "city": "Middle Falls", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12849, + "latitude": 43.442087, + "longitude": -73.290902, + "city": "Middle Granville", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12850, + "latitude": 43.185956, + "longitude": -73.983737, + "city": "Middle Grove", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12851, + "latitude": 44.214452, + "longitude": -73.787317, + "city": "Minerva", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12852, + "latitude": 44.145678, + "longitude": -73.815204, + "city": "Newcomb", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12853, + "latitude": 43.622181, + "longitude": -73.922201, + "city": "North Creek", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12854, + "latitude": 43.452517, + "longitude": -73.34095, + "city": "North Granville", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12855, + "latitude": 43.970736, + "longitude": -73.721139, + "city": "North Hudson", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12856, + "latitude": 43.723665, + "longitude": -74.087329, + "city": "North River", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12857, + "latitude": 44.145678, + "longitude": -73.815204, + "city": "Olmstedville", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12858, + "latitude": 43.879451, + "longitude": -73.400254, + "city": "Paradox", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12859, + "latitude": 43.20138, + "longitude": -73.891854, + "city": "Porter Corners", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12860, + "latitude": 43.592829, + "longitude": -73.784407, + "city": "Pottersville", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12861, + "latitude": 43.743816, + "longitude": -73.422181, + "city": "Putnam Station", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12862, + "latitude": 43.675377, + "longitude": -73.932509, + "city": "Riparius", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12863, + "latitude": 43.061305, + "longitude": -73.92308, + "city": "Rock City Falls", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12864, + "latitude": 43.667618, + "longitude": -74.456913, + "city": "Sabael", + "state": "NY", + "county": "Hamilton" + }, + { + "zip_code": 12865, + "latitude": 43.225966, + "longitude": -73.348736, + "city": "Salem", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12866, + "latitude": 43.101145, + "longitude": -73.850623, + "city": "Saratoga Springs", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12870, + "latitude": 43.841273, + "longitude": -73.759213, + "city": "Schroon Lake", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12871, + "latitude": 43.130211, + "longitude": -73.643205, + "city": "Schuylerville", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12872, + "latitude": 44.145678, + "longitude": -73.815204, + "city": "Severance", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12873, + "latitude": 43.104587, + "longitude": -73.314179, + "city": "Shushan", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12874, + "latitude": 43.693173, + "longitude": -73.505019, + "city": "Silver Bay", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12878, + "latitude": 43.464398, + "longitude": -73.876364, + "city": "Stony Creek", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12879, + "latitude": 44.145678, + "longitude": -73.815204, + "city": "Newcomb", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12883, + "latitude": 43.852071, + "longitude": -73.478024, + "city": "Ticonderoga", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12884, + "latitude": 43.088397, + "longitude": -73.591652, + "city": "Victory Mills", + "state": "NY", + "county": "Saratoga" + }, + { + "zip_code": 12885, + "latitude": 43.570457, + "longitude": -73.859928, + "city": "Warrensburg", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12886, + "latitude": 43.631297, + "longitude": -73.936399, + "city": "Wevertown", + "state": "NY", + "county": "Warren" + }, + { + "zip_code": 12887, + "latitude": 43.492815, + "longitude": -73.421536, + "city": "Whitehall", + "state": "NY", + "county": "Washington" + }, + { + "zip_code": 12901, + "latitude": 44.71187, + "longitude": -73.637104, + "city": "Plattsburgh", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12903, + "latitude": 44.685411, + "longitude": -73.447398, + "city": "Plattsburgh", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12910, + "latitude": 44.865209, + "longitude": -73.577683, + "city": "Altona", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12911, + "latitude": 44.528081, + "longitude": -73.471946, + "city": "Keeseville", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12912, + "latitude": 44.711326, + "longitude": -73.648386, + "city": "Au Sable Forks", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12913, + "latitude": 44.401213, + "longitude": -74.070277, + "city": "Bloomingdale", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12914, + "latitude": 44.674942, + "longitude": -74.444789, + "city": "Bombay", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12915, + "latitude": 44.552725, + "longitude": -74.317958, + "city": "Brainardsville", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12916, + "latitude": 44.87763, + "longitude": -74.489379, + "city": "Brushton", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12917, + "latitude": 44.932057, + "longitude": -74.200948, + "city": "Burke", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12918, + "latitude": 44.686162, + "longitude": -73.670249, + "city": "Cadyville", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12919, + "latitude": 44.726056, + "longitude": -73.578285, + "city": "Champlain", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12920, + "latitude": 44.932727, + "longitude": -74.068371, + "city": "Chateaugay", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12921, + "latitude": 44.879906, + "longitude": -73.452578, + "city": "Chazy", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12922, + "latitude": 44.287829, + "longitude": -74.702338, + "city": "Childwold", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 12923, + "latitude": 44.916842, + "longitude": -73.932053, + "city": "Churubusco", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12924, + "latitude": 44.706561, + "longitude": -73.744555, + "city": "Keeseville", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12926, + "latitude": 44.944145, + "longitude": -74.327316, + "city": "Constable", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12927, + "latitude": 44.228969, + "longitude": -74.858103, + "city": "Cranberry Lake", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 12928, + "latitude": 43.930616, + "longitude": -73.58854, + "city": "Crown Point", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12929, + "latitude": 44.847709, + "longitude": -73.582317, + "city": "Dannemora", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12930, + "latitude": 44.552725, + "longitude": -74.317958, + "city": "Dickinson Center", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12932, + "latitude": 44.145678, + "longitude": -73.815204, + "city": "Elizabethtown", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12933, + "latitude": 44.881962, + "longitude": -73.963279, + "city": "Ellenburg", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12934, + "latitude": 44.892243, + "longitude": -73.907936, + "city": "Ellenburg Center", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12935, + "latitude": 44.801467, + "longitude": -73.739157, + "city": "Ellenburg Depot", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12936, + "latitude": 44.273412, + "longitude": -73.377434, + "city": "Essex", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12937, + "latitude": 44.955977, + "longitude": -74.48674, + "city": "Fort Covington", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12939, + "latitude": 44.552725, + "longitude": -74.317958, + "city": "Gabriels", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12941, + "latitude": 44.145678, + "longitude": -73.815204, + "city": "Jay", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12942, + "latitude": 44.145678, + "longitude": -73.815204, + "city": "Keene", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12943, + "latitude": 44.202397, + "longitude": -73.773111, + "city": "Keene Valley", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12944, + "latitude": 44.343063, + "longitude": -73.436913, + "city": "Keeseville", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12945, + "latitude": 44.552725, + "longitude": -74.317958, + "city": "Lake Clear", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12946, + "latitude": 44.130663, + "longitude": -73.734652, + "city": "Lake Placid", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12949, + "latitude": 44.746861, + "longitude": -74.660413, + "city": "Lawrenceville", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 12950, + "latitude": 44.145678, + "longitude": -73.815204, + "city": "Lewis", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12952, + "latitude": 44.734587, + "longitude": -73.900452, + "city": "Lyon Mountain", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12953, + "latitude": 44.859117, + "longitude": -74.288237, + "city": "Malone", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12955, + "latitude": 44.804316, + "longitude": -73.97299, + "city": "Lyon Mountain", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12956, + "latitude": 44.12404, + "longitude": -73.491335, + "city": "Mineville", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12957, + "latitude": 44.85688, + "longitude": -74.552321, + "city": "Moira", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12958, + "latitude": 44.792956, + "longitude": -73.661296, + "city": "Mooers", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12959, + "latitude": 44.76292, + "longitude": -73.615749, + "city": "Mooers Forks", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12960, + "latitude": 44.041863, + "longitude": -73.505265, + "city": "Moriah", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12961, + "latitude": 44.055155, + "longitude": -73.534677, + "city": "Moriah Center", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12962, + "latitude": 44.617784, + "longitude": -73.605062, + "city": "Morrisonville", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12964, + "latitude": 44.145678, + "longitude": -73.815204, + "city": "New Russia", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12965, + "latitude": 44.726424, + "longitude": -74.678121, + "city": "Nicholville", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 12966, + "latitude": 44.8532, + "longitude": -74.419121, + "city": "North Bangor", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12967, + "latitude": 44.761862, + "longitude": -74.680488, + "city": "North Lawrence", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 12969, + "latitude": 44.552725, + "longitude": -74.317958, + "city": "Owls Head", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12970, + "latitude": 44.552725, + "longitude": -74.317958, + "city": "Paul Smiths", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12972, + "latitude": 44.66607, + "longitude": -73.569167, + "city": "Peru", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12973, + "latitude": 44.234289, + "longitude": -74.555957, + "city": "Piercefield", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 12974, + "latitude": 44.087072, + "longitude": -73.461308, + "city": "Port Henry", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12975, + "latitude": 44.526437, + "longitude": -73.409243, + "city": "Port Kent", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12976, + "latitude": 44.552725, + "longitude": -74.317958, + "city": "Rainbow Lake", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12977, + "latitude": 44.145678, + "longitude": -73.815204, + "city": "Ray Brook", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12978, + "latitude": 44.664956, + "longitude": -73.761204, + "city": "Redford", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12979, + "latitude": 44.864633, + "longitude": -73.626615, + "city": "Rouses Point", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12980, + "latitude": 44.657819, + "longitude": -74.515511, + "city": "Saint Regis Falls", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12981, + "latitude": 44.624413, + "longitude": -73.809266, + "city": "Saranac", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12983, + "latitude": 44.583429, + "longitude": -74.272104, + "city": "Saranac Lake", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12985, + "latitude": 44.570072, + "longitude": -73.678749, + "city": "Schuyler Falls", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12986, + "latitude": 44.599971, + "longitude": -74.294012, + "city": "Tupper Lake", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12987, + "latitude": 44.145678, + "longitude": -73.815204, + "city": "Upper Jay", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12989, + "latitude": 44.552725, + "longitude": -74.317958, + "city": "Vermontville", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12992, + "latitude": 44.827274, + "longitude": -73.513225, + "city": "West Chazy", + "state": "NY", + "county": "Clinton" + }, + { + "zip_code": 12993, + "latitude": 44.18783, + "longitude": -73.434541, + "city": "Westport", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12995, + "latitude": 44.805681, + "longitude": -74.252254, + "city": "Whippleville", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 12996, + "latitude": 44.242261, + "longitude": -73.416202, + "city": "Willsboro", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12997, + "latitude": 44.145678, + "longitude": -73.815204, + "city": "Wilmington", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 12998, + "latitude": 44.08267, + "longitude": -73.530601, + "city": "Witherbee", + "state": "NY", + "county": "Essex" + }, + { + "zip_code": 13020, + "latitude": 42.823968, + "longitude": -76.062425, + "city": "Apulia Station", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13021, + "latitude": 42.894381, + "longitude": -76.565683, + "city": "Auburn", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13022, + "latitude": 43.163364, + "longitude": -76.509567, + "city": "Auburn", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13024, + "latitude": 43.163364, + "longitude": -76.509567, + "city": "Auburn", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13026, + "latitude": 42.755979, + "longitude": -76.646007, + "city": "Aurora", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13027, + "latitude": 43.158531, + "longitude": -76.360147, + "city": "Baldwinsville", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13028, + "latitude": 43.310494, + "longitude": -76.135765, + "city": "Bernhards Bay", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13029, + "latitude": 43.227448, + "longitude": -76.140648, + "city": "Brewerton", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13030, + "latitude": 43.165372, + "longitude": -75.993896, + "city": "Bridgeport", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13031, + "latitude": 43.049756, + "longitude": -76.348012, + "city": "Camillus", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13032, + "latitude": 43.005767, + "longitude": -75.798607, + "city": "Canastota", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13033, + "latitude": 43.185529, + "longitude": -76.579082, + "city": "Cato", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13034, + "latitude": 42.924315, + "longitude": -76.676419, + "city": "Cayuga", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13035, + "latitude": 42.939422, + "longitude": -75.775568, + "city": "Cazenovia", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13036, + "latitude": 43.330332, + "longitude": -76.17085, + "city": "Central Square", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13037, + "latitude": 43.009985, + "longitude": -75.806194, + "city": "Chittenango", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13039, + "latitude": 43.125491, + "longitude": -76.154128, + "city": "Cicero", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13040, + "latitude": 42.565932, + "longitude": -75.955301, + "city": "Cincinnatus", + "state": "NY", + "county": "Cortland" + }, + { + "zip_code": 13041, + "latitude": 43.119217, + "longitude": -76.131931, + "city": "Clay", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13042, + "latitude": 43.27637, + "longitude": -76.225752, + "city": "Cleveland", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13043, + "latitude": 43.042044, + "longitude": -75.740848, + "city": "Clockville", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13044, + "latitude": 43.301232, + "longitude": -75.982593, + "city": "Constantia", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13045, + "latitude": 42.614268, + "longitude": -76.120128, + "city": "Cortland", + "state": "NY", + "county": "Cortland" + }, + { + "zip_code": 13051, + "latitude": 42.870698, + "longitude": -75.91128, + "city": "Delphi Falls", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13052, + "latitude": 42.776527, + "longitude": -75.859458, + "city": "De Ruyter", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13053, + "latitude": 42.477712, + "longitude": -76.291224, + "city": "Dryden", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 13054, + "latitude": 43.14548, + "longitude": -75.559605, + "city": "Durhamville", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13056, + "latitude": 42.677155, + "longitude": -76.105201, + "city": "East Homer", + "state": "NY", + "county": "Cortland" + }, + { + "zip_code": 13057, + "latitude": 43.096216, + "longitude": -76.047426, + "city": "East Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13060, + "latitude": 43.027813, + "longitude": -76.416612, + "city": "Elbridge", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13061, + "latitude": 42.841725, + "longitude": -75.744589, + "city": "Erieville", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13062, + "latitude": 42.484352, + "longitude": -76.389023, + "city": "Etna", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 13063, + "latitude": 42.855631, + "longitude": -75.976158, + "city": "Fabius", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13064, + "latitude": 43.431311, + "longitude": -76.200448, + "city": "Fair Haven", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13065, + "latitude": 42.822662, + "longitude": -76.80197, + "city": "Fayette", + "state": "NY", + "county": "Seneca" + }, + { + "zip_code": 13066, + "latitude": 42.947789, + "longitude": -75.995518, + "city": "Fayetteville", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13068, + "latitude": 42.49653, + "longitude": -76.372864, + "city": "Freeville", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 13069, + "latitude": 43.345255, + "longitude": -76.227027, + "city": "Fulton", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13071, + "latitude": 42.673871, + "longitude": -76.526226, + "city": "Genoa", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13072, + "latitude": 42.768124, + "longitude": -75.788393, + "city": "Georgetown", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13073, + "latitude": 42.579298, + "longitude": -76.392709, + "city": "Groton", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 13074, + "latitude": 43.324451, + "longitude": -76.306549, + "city": "Hannibal", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13076, + "latitude": 43.338817, + "longitude": -76.189586, + "city": "Hastings", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13077, + "latitude": 42.678012, + "longitude": -76.175275, + "city": "Homer", + "state": "NY", + "county": "Cortland" + }, + { + "zip_code": 13078, + "latitude": 42.966136, + "longitude": -76.057658, + "city": "Jamesville", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13080, + "latitude": 43.067413, + "longitude": -76.439657, + "city": "Jordan", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13081, + "latitude": 42.876886, + "longitude": -76.631117, + "city": "King Ferry", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13082, + "latitude": 43.103886, + "longitude": -75.961597, + "city": "Kirkville", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13083, + "latitude": 43.642147, + "longitude": -76.029304, + "city": "Lacona", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13084, + "latitude": 42.891099, + "longitude": -76.128862, + "city": "La Fayette", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13087, + "latitude": 42.706981, + "longitude": -76.156103, + "city": "Little York", + "state": "NY", + "county": "Cortland" + }, + { + "zip_code": 13088, + "latitude": 43.124866, + "longitude": -76.207867, + "city": "Liverpool", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13089, + "latitude": 43.02143, + "longitude": -76.197701, + "city": "Liverpool", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13090, + "latitude": 43.152767, + "longitude": -76.223459, + "city": "Liverpool", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13092, + "latitude": 42.659466, + "longitude": -76.410528, + "city": "Locke", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13093, + "latitude": 43.431311, + "longitude": -76.200448, + "city": "Lycoming", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13101, + "latitude": 42.597468, + "longitude": -76.072949, + "city": "Mc Graw", + "state": "NY", + "county": "Cortland" + }, + { + "zip_code": 13102, + "latitude": 42.554215, + "longitude": -76.292723, + "city": "Mc Lean", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 13103, + "latitude": 43.339851, + "longitude": -76.096357, + "city": "Mallory", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13104, + "latitude": 42.955618, + "longitude": -75.96654, + "city": "Manlius", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13107, + "latitude": 43.457798, + "longitude": -76.153442, + "city": "Maple View", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13108, + "latitude": 42.948057, + "longitude": -76.329799, + "city": "Marcellus", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13110, + "latitude": 42.8809, + "longitude": -76.291265, + "city": "Marietta", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13111, + "latitude": 43.258337, + "longitude": -76.6292, + "city": "Martville", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13112, + "latitude": 43.098983, + "longitude": -76.413216, + "city": "Memphis", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13113, + "latitude": 43.089111, + "longitude": -76.621747, + "city": "Meridian", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13114, + "latitude": 43.398473, + "longitude": -76.204997, + "city": "Mexico", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13115, + "latitude": 43.397671, + "longitude": -76.482365, + "city": "Minetto", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13116, + "latitude": 43.076828, + "longitude": -76.006001, + "city": "Minoa", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13117, + "latitude": 43.002267, + "longitude": -76.704722, + "city": "Montezuma", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13118, + "latitude": 42.737724, + "longitude": -76.407811, + "city": "Moravia", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13119, + "latitude": 42.97446, + "longitude": -76.440833, + "city": "Mottville", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13120, + "latitude": 42.951126, + "longitude": -76.179845, + "city": "Nedrow", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13121, + "latitude": 43.483379, + "longitude": -76.315044, + "city": "New Haven", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13122, + "latitude": 42.825164, + "longitude": -75.85266, + "city": "New Woodstock", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13123, + "latitude": 43.236407, + "longitude": -75.776918, + "city": "North Bay", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13124, + "latitude": 42.479801, + "longitude": -75.622857, + "city": "North Pitcher", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13126, + "latitude": 43.465388, + "longitude": -76.342172, + "city": "Oswego", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13129, + "latitude": 42.712735, + "longitude": -75.731391, + "city": "Georgetown", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13131, + "latitude": 43.43397, + "longitude": -76.120904, + "city": "Parish", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13132, + "latitude": 43.296808, + "longitude": -76.229091, + "city": "Pennellville", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13134, + "latitude": 42.968619, + "longitude": -75.679351, + "city": "Peterboro", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13135, + "latitude": 43.33021, + "longitude": -76.260803, + "city": "Phoenix", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13136, + "latitude": 42.619466, + "longitude": -75.845544, + "city": "Pitcher", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13137, + "latitude": 43.157653, + "longitude": -76.44698, + "city": "Plainville", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13138, + "latitude": 42.89274, + "longitude": -76.026459, + "city": "Pompey", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13139, + "latitude": 42.742057, + "longitude": -76.628454, + "city": "Poplar Ridge", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13140, + "latitude": 42.886349, + "longitude": -76.541321, + "city": "Port Byron", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13141, + "latitude": 42.739682, + "longitude": -76.157108, + "city": "Preble", + "state": "NY", + "county": "Cortland" + }, + { + "zip_code": 13142, + "latitude": 43.560497, + "longitude": -76.15532, + "city": "Pulaski", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13143, + "latitude": 43.238248, + "longitude": -76.752077, + "city": "Red Creek", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 13144, + "latitude": 43.571095, + "longitude": -75.972208, + "city": "Richland", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13145, + "latitude": 43.621562, + "longitude": -76.11029, + "city": "Sandy Creek", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13146, + "latitude": 43.099386, + "longitude": -76.762705, + "city": "Savannah", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 13147, + "latitude": 42.770829, + "longitude": -76.586213, + "city": "Scipio Center", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13148, + "latitude": 42.905264, + "longitude": -76.794921, + "city": "Seneca Falls", + "state": "NY", + "county": "Seneca" + }, + { + "zip_code": 13152, + "latitude": 42.884394, + "longitude": -76.285202, + "city": "Skaneateles", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13153, + "latitude": 42.991112, + "longitude": -76.451147, + "city": "Skaneateles Falls", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13154, + "latitude": 43.134425, + "longitude": -76.765591, + "city": "South Butler", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 13155, + "latitude": 42.654768, + "longitude": -75.769855, + "city": "South Otselic", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13156, + "latitude": 43.341948, + "longitude": -76.665228, + "city": "Sterling", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13157, + "latitude": 43.209147, + "longitude": -75.72307, + "city": "Sylvan Beach", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13158, + "latitude": 42.696543, + "longitude": -75.98409, + "city": "Truxton", + "state": "NY", + "county": "Cortland" + }, + { + "zip_code": 13159, + "latitude": 42.830037, + "longitude": -76.124357, + "city": "Tully", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13160, + "latitude": 42.847447, + "longitude": -76.649164, + "city": "Union Springs", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13162, + "latitude": 43.18852, + "longitude": -75.712551, + "city": "Verona Beach", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13163, + "latitude": 43.078461, + "longitude": -75.701639, + "city": "Wampsville", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13164, + "latitude": 43.100588, + "longitude": -76.321678, + "city": "Warners", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13165, + "latitude": 42.892556, + "longitude": -76.882263, + "city": "Waterloo", + "state": "NY", + "county": "Seneca" + }, + { + "zip_code": 13166, + "latitude": 43.046493, + "longitude": -76.555316, + "city": "Weedsport", + "state": "NY", + "county": "Cayuga" + }, + { + "zip_code": 13167, + "latitude": 43.346453, + "longitude": -76.229719, + "city": "West Monroe", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13201, + "latitude": 43.02143, + "longitude": -76.197701, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13202, + "latitude": 43.043116, + "longitude": -76.150796, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13203, + "latitude": 43.062016, + "longitude": -76.134145, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13204, + "latitude": 43.055766, + "longitude": -76.177597, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13205, + "latitude": 43.006816, + "longitude": -76.142495, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13206, + "latitude": 43.076416, + "longitude": -76.109995, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13207, + "latitude": 43.012216, + "longitude": -76.170596, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13208, + "latitude": 43.074466, + "longitude": -76.145796, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13209, + "latitude": 43.084666, + "longitude": -76.240549, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13210, + "latitude": 43.031416, + "longitude": -76.110995, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13211, + "latitude": 43.091916, + "longitude": -76.124645, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13212, + "latitude": 43.122566, + "longitude": -76.128382, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13214, + "latitude": 43.039666, + "longitude": -76.072153, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13215, + "latitude": 42.972161, + "longitude": -76.227599, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13217, + "latitude": 43.02143, + "longitude": -76.197701, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13218, + "latitude": 43.02143, + "longitude": -76.197701, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13219, + "latitude": 43.041703, + "longitude": -76.222898, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13220, + "latitude": 43.123415, + "longitude": -76.12823, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13221, + "latitude": 43.02143, + "longitude": -76.197701, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13224, + "latitude": 43.038366, + "longitude": -76.099394, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13225, + "latitude": 43.02143, + "longitude": -76.197701, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13235, + "latitude": "", + "longitude": "", + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13244, + "latitude": 43.037716, + "longitude": -76.139646, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13250, + "latitude": 43.02143, + "longitude": -76.197701, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13251, + "latitude": 43.02143, + "longitude": -76.197701, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13252, + "latitude": 43.050966, + "longitude": -76.156696, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13260, + "latitude": 43.02143, + "longitude": -76.197701, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13261, + "latitude": 43.02143, + "longitude": -76.197701, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13290, + "latitude": 43.067576, + "longitude": -76.171351, + "city": "Syracuse", + "state": "NY", + "county": "Onondaga" + }, + { + "zip_code": 13301, + "latitude": 43.419596, + "longitude": -75.224784, + "city": "Alder Creek", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13302, + "latitude": 43.497512, + "longitude": -75.988154, + "city": "Altmar", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13303, + "latitude": 43.364242, + "longitude": -75.468514, + "city": "Ava", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13304, + "latitude": 43.244356, + "longitude": -75.166319, + "city": "Barneveld", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13305, + "latitude": 43.818705, + "longitude": -75.480342, + "city": "Beaver Falls", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13308, + "latitude": 43.137703, + "longitude": -75.523266, + "city": "Blossvale", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13309, + "latitude": 43.23331, + "longitude": -75.294896, + "city": "Boonville", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13310, + "latitude": 42.930711, + "longitude": -75.560937, + "city": "Bouckville", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13312, + "latitude": 43.818705, + "longitude": -75.480342, + "city": "Brantingham", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13313, + "latitude": 42.879227, + "longitude": -75.267172, + "city": "Bridgewater", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13314, + "latitude": 42.954541, + "longitude": -75.616793, + "city": "Brookfield", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13315, + "latitude": 42.734593, + "longitude": -75.133065, + "city": "Burlington Flats", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13316, + "latitude": 43.285739, + "longitude": -75.626755, + "city": "Camden", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13317, + "latitude": 42.867146, + "longitude": -74.595636, + "city": "Canajoharie", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 13318, + "latitude": 42.921786, + "longitude": -75.255163, + "city": "Cassville", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13319, + "latitude": 43.028469, + "longitude": -75.264008, + "city": "Chadwicks", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13320, + "latitude": 42.768195, + "longitude": -74.759734, + "city": "Cherry Valley", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13321, + "latitude": 43.090027, + "longitude": -75.387088, + "city": "Clark Mills", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13322, + "latitude": 42.961973, + "longitude": -75.233003, + "city": "Clayville", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13323, + "latitude": 43.036697, + "longitude": -75.382414, + "city": "Clinton", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13324, + "latitude": 43.271433, + "longitude": -75.04774, + "city": "Cold Brook", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13325, + "latitude": 43.56647, + "longitude": -75.425289, + "city": "Constableville", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13326, + "latitude": 42.714065, + "longitude": -74.890929, + "city": "Cooperstown", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13327, + "latitude": 43.909848, + "longitude": -75.365264, + "city": "Croghan", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13328, + "latitude": 42.983981, + "longitude": -75.422034, + "city": "Deansboro", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13329, + "latitude": 43.18486, + "longitude": -74.941747, + "city": "Dolgeville", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13331, + "latitude": 43.816675, + "longitude": -74.886163, + "city": "Eagle Bay", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13332, + "latitude": 42.719674, + "longitude": -75.558861, + "city": "Earlville", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13333, + "latitude": 42.793309, + "longitude": -74.837198, + "city": "East Springfield", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13334, + "latitude": 42.82982, + "longitude": -75.65364, + "city": "Eaton", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13335, + "latitude": 42.711712, + "longitude": -75.246539, + "city": "Edmeston", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13337, + "latitude": 42.755679, + "longitude": -74.876761, + "city": "Fly Creek", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13338, + "latitude": 43.500975, + "longitude": -75.153257, + "city": "Forestport", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13339, + "latitude": 42.924806, + "longitude": -74.616883, + "city": "Fort Plain", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 13340, + "latitude": 43.039203, + "longitude": -75.118168, + "city": "Frankfort", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13341, + "latitude": 43.036069, + "longitude": -75.396214, + "city": "Franklin Springs", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13342, + "latitude": 42.63153, + "longitude": -75.186593, + "city": "Garrattsville", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13343, + "latitude": 43.818705, + "longitude": -75.480342, + "city": "Glenfield", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13345, + "latitude": 43.818705, + "longitude": -75.480342, + "city": "Greig", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13346, + "latitude": 42.822667, + "longitude": -75.553153, + "city": "Hamilton", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13348, + "latitude": 42.690531, + "longitude": -75.063513, + "city": "Hartwick", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13350, + "latitude": 43.026867, + "longitude": -74.933404, + "city": "Herkimer", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13352, + "latitude": 43.328187, + "longitude": -75.117319, + "city": "Hinckley", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13353, + "latitude": 43.667618, + "longitude": -74.456913, + "city": "Hoffmeister", + "state": "NY", + "county": "Hamilton" + }, + { + "zip_code": 13354, + "latitude": 43.273266, + "longitude": -75.301263, + "city": "Holland Patent", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13355, + "latitude": 42.817286, + "longitude": -75.422764, + "city": "Hubbardsville", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13357, + "latitude": 43.013625, + "longitude": -74.958226, + "city": "Ilion", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13360, + "latitude": 43.667618, + "longitude": -74.456913, + "city": "Inlet", + "state": "NY", + "county": "Hamilton" + }, + { + "zip_code": 13361, + "latitude": 42.964369, + "longitude": -74.881228, + "city": "Jordanville", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13362, + "latitude": 42.980334, + "longitude": -75.518569, + "city": "Knoxboro", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13363, + "latitude": 43.328374, + "longitude": -75.520067, + "city": "Lee Center", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13364, + "latitude": 42.954541, + "longitude": -75.616793, + "city": "Leonardsville", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13365, + "latitude": 43.078904, + "longitude": -74.864422, + "city": "Little Falls", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13367, + "latitude": 43.789296, + "longitude": -75.415599, + "city": "Lowville", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13368, + "latitude": 43.621838, + "longitude": -75.365348, + "city": "Lyons Falls", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13401, + "latitude": 43.267243, + "longitude": -75.688223, + "city": "Mc Connellsville", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13402, + "latitude": 42.898322, + "longitude": -75.549372, + "city": "Madison", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13403, + "latitude": 43.172019, + "longitude": -75.27371, + "city": "Marcy", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13404, + "latitude": 43.818705, + "longitude": -75.480342, + "city": "Martinsburg", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13406, + "latitude": 43.135209, + "longitude": -74.934473, + "city": "Middleville", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13407, + "latitude": 43.029258, + "longitude": -75.011662, + "city": "Mohawk", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13408, + "latitude": 42.924089, + "longitude": -75.651484, + "city": "Morrisville", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13409, + "latitude": 42.972773, + "longitude": -75.600722, + "city": "Munnsville", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13410, + "latitude": 42.937863, + "longitude": -74.611711, + "city": "Nelliston", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 13411, + "latitude": 42.631807, + "longitude": -75.385073, + "city": "New Berlin", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13413, + "latitude": 43.067369, + "longitude": -75.290911, + "city": "New Hartford", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13415, + "latitude": 42.590419, + "longitude": -75.195695, + "city": "New Lisbon", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13416, + "latitude": 43.203313, + "longitude": -74.971893, + "city": "Newport", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13417, + "latitude": 43.100869, + "longitude": -75.29496, + "city": "New York Mills", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13418, + "latitude": 42.954541, + "longitude": -75.616793, + "city": "North Brookfield", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13420, + "latitude": 43.752203, + "longitude": -74.873176, + "city": "Old Forge", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13421, + "latitude": 43.047755, + "longitude": -75.640944, + "city": "Oneida", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13424, + "latitude": 43.056581, + "longitude": -75.38291, + "city": "Oriskany", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13425, + "latitude": 42.96965, + "longitude": -75.485421, + "city": "Oriskany Falls", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13426, + "latitude": 43.562757, + "longitude": -75.996773, + "city": "Orwell", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13428, + "latitude": 42.926617, + "longitude": -74.54472, + "city": "Palatine Bridge", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 13431, + "latitude": 43.232502, + "longitude": -75.07288, + "city": "Poland", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13433, + "latitude": 43.576823, + "longitude": -75.315816, + "city": "Port Leyden", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13435, + "latitude": 43.305156, + "longitude": -75.150183, + "city": "Prospect", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13436, + "latitude": 43.667618, + "longitude": -74.456913, + "city": "Raquette Lake", + "state": "NY", + "county": "Hamilton" + }, + { + "zip_code": 13437, + "latitude": 43.577131, + "longitude": -75.829419, + "city": "Redfield", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13438, + "latitude": 43.341666, + "longitude": -75.221046, + "city": "Remsen", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13439, + "latitude": 42.84018, + "longitude": -74.97159, + "city": "Richfield Springs", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13440, + "latitude": 43.20886, + "longitude": -75.383365, + "city": "Rome", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13441, + "latitude": 43.164312, + "longitude": -75.511301, + "city": "Rome", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13442, + "latitude": 43.239274, + "longitude": -75.47796, + "city": "Rome", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13449, + "latitude": 43.239274, + "longitude": -75.47796, + "city": "Rome", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13450, + "latitude": 42.70804, + "longitude": -74.802488, + "city": "Roseboom", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13452, + "latitude": 42.975134, + "longitude": -74.657384, + "city": "Saint Johnsville", + "state": "NY", + "county": "Montgomery" + }, + { + "zip_code": 13454, + "latitude": 43.460951, + "longitude": -74.957099, + "city": "Salisbury Center", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13455, + "latitude": 42.916235, + "longitude": -75.35448, + "city": "Sangerfield", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13456, + "latitude": 42.991124, + "longitude": -75.270758, + "city": "Sauquoit", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13457, + "latitude": 42.775805, + "longitude": -75.048502, + "city": "Schuyler Lake", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13459, + "latitude": 42.787077, + "longitude": -74.584971, + "city": "Sharon Springs", + "state": "NY", + "county": "Schoharie" + }, + { + "zip_code": 13460, + "latitude": 42.648204, + "longitude": -75.455824, + "city": "Sherburne", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13461, + "latitude": 43.074349, + "longitude": -75.580839, + "city": "Sherrill", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13464, + "latitude": 42.672573, + "longitude": -75.593362, + "city": "Smyrna", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13465, + "latitude": 42.954541, + "longitude": -75.616793, + "city": "Solsville", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13468, + "latitude": 42.83883, + "longitude": -74.85897, + "city": "Springfield Center", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13469, + "latitude": 43.219369, + "longitude": -75.299112, + "city": "Stittville", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13470, + "latitude": 43.190651, + "longitude": -74.650311, + "city": "Stratford", + "state": "NY", + "county": "Fulton" + }, + { + "zip_code": 13471, + "latitude": 43.228682, + "longitude": -75.591423, + "city": "Taberg", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13472, + "latitude": 43.460951, + "longitude": -74.957099, + "city": "Thendara", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13473, + "latitude": 43.818705, + "longitude": -75.480342, + "city": "Turin", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13475, + "latitude": 42.893454, + "longitude": -74.836685, + "city": "Van Hornesville", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13476, + "latitude": 43.092924, + "longitude": -75.50161, + "city": "Vernon", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13477, + "latitude": 43.141536, + "longitude": -75.530826, + "city": "Vernon Center", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13478, + "latitude": 43.146502, + "longitude": -75.586218, + "city": "Verona", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13479, + "latitude": 43.053769, + "longitude": -75.271559, + "city": "Washington Mills", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13480, + "latitude": 42.926167, + "longitude": -75.360922, + "city": "Waterville", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13482, + "latitude": 42.704333, + "longitude": -75.184913, + "city": "West Burlington", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13483, + "latitude": 43.403751, + "longitude": -75.825528, + "city": "Westdale", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13484, + "latitude": 42.854631, + "longitude": -75.660462, + "city": "West Eaton", + "state": "NY", + "county": "Madison" + }, + { + "zip_code": 13485, + "latitude": 42.747058, + "longitude": -75.160928, + "city": "West Edmeston", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13486, + "latitude": 43.339068, + "longitude": -75.341898, + "city": "Westernville", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13488, + "latitude": 42.680906, + "longitude": -74.76529, + "city": "Westford", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13489, + "latitude": 43.44448, + "longitude": -75.543231, + "city": "West Leyden", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13490, + "latitude": 43.124769, + "longitude": -75.432867, + "city": "Westmoreland", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13491, + "latitude": 42.909122, + "longitude": -75.12867, + "city": "West Winfield", + "state": "NY", + "county": "Herkimer" + }, + { + "zip_code": 13492, + "latitude": 43.197827, + "longitude": -75.287643, + "city": "Whitesboro", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13493, + "latitude": 43.427301, + "longitude": -75.880041, + "city": "Williamstown", + "state": "NY", + "county": "Oswego" + }, + { + "zip_code": 13494, + "latitude": 43.524904, + "longitude": -75.142771, + "city": "Woodgate", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13495, + "latitude": 43.102744, + "longitude": -75.321211, + "city": "Yorkville", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13501, + "latitude": 43.077369, + "longitude": -75.233208, + "city": "Utica", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13502, + "latitude": 43.150119, + "longitude": -75.192786, + "city": "Utica", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13503, + "latitude": 43.101869, + "longitude": -75.231158, + "city": "Utica", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13504, + "latitude": 43.136033, + "longitude": -75.432486, + "city": "Utica", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13505, + "latitude": 43.087169, + "longitude": -75.260259, + "city": "Utica", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13599, + "latitude": 43.239274, + "longitude": -75.47796, + "city": "Utica", + "state": "NY", + "county": "Oneida" + }, + { + "zip_code": 13601, + "latitude": 44.072542, + "longitude": -76.016589, + "city": "Watertown", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13602, + "latitude": 44.032457, + "longitude": -75.754468, + "city": "Fort Drum", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13603, + "latitude": 43.908739, + "longitude": -75.896719, + "city": "Watertown", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13605, + "latitude": 43.960222, + "longitude": -75.905634, + "city": "Adams", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13606, + "latitude": 43.831853, + "longitude": -76.007188, + "city": "Adams Center", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13607, + "latitude": 44.074604, + "longitude": -75.840719, + "city": "Alexandria Bay", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13608, + "latitude": 44.148052, + "longitude": -75.759103, + "city": "Antwerp", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13611, + "latitude": 43.778046, + "longitude": -76.125914, + "city": "Belleville", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13612, + "latitude": 43.98871, + "longitude": -75.766746, + "city": "Black River", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13613, + "latitude": 44.788969, + "longitude": -74.879786, + "city": "Brasher Falls", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13614, + "latitude": 44.538648, + "longitude": -75.68666, + "city": "Brier Hill", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13615, + "latitude": 44.057685, + "longitude": -76.019634, + "city": "Brownville", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13616, + "latitude": 43.951428, + "longitude": -75.860442, + "city": "Calcium", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13617, + "latitude": 44.574484, + "longitude": -75.059713, + "city": "Canton", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13618, + "latitude": 44.126469, + "longitude": -76.272585, + "city": "Cape Vincent", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13619, + "latitude": 44.068221, + "longitude": -75.920097, + "city": "Carthage", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13620, + "latitude": 43.818705, + "longitude": -75.480342, + "city": "Castorland", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13621, + "latitude": 44.845315, + "longitude": -75.047975, + "city": "Chase Mills", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13622, + "latitude": 44.091892, + "longitude": -76.108527, + "city": "Chaumont", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13623, + "latitude": 44.440171, + "longitude": -75.757938, + "city": "Chippewa Bay", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13624, + "latitude": 44.144238, + "longitude": -76.062002, + "city": "Clayton", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13625, + "latitude": 44.421607, + "longitude": -75.105077, + "city": "Colton", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13626, + "latitude": 43.892324, + "longitude": -75.703596, + "city": "Copenhagen", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13627, + "latitude": 43.818705, + "longitude": -75.480342, + "city": "Deer River", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13628, + "latitude": 43.885519, + "longitude": -75.798319, + "city": "Deferiet", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13630, + "latitude": 44.462555, + "longitude": -75.30067, + "city": "De Kalb Junction", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13631, + "latitude": 43.818705, + "longitude": -75.480342, + "city": "Denmark", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13632, + "latitude": 44.139501, + "longitude": -76.061552, + "city": "Depauville", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13633, + "latitude": 44.49891, + "longitude": -75.477156, + "city": "De Peyster", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13634, + "latitude": 44.014261, + "longitude": -76.08002, + "city": "Dexter", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13635, + "latitude": 44.523528, + "longitude": -75.160038, + "city": "Edwards", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13636, + "latitude": 43.75965, + "longitude": -76.152508, + "city": "Ellisburg", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13637, + "latitude": 44.0981, + "longitude": -75.817097, + "city": "Evans Mills", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13638, + "latitude": 44.01751, + "longitude": -75.755032, + "city": "Felts Mills", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13639, + "latitude": 44.23896, + "longitude": -75.122756, + "city": "Fine", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13640, + "latitude": 44.321282, + "longitude": -76.017151, + "city": "Wellesley Island", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13641, + "latitude": 44.207681, + "longitude": -75.914556, + "city": "Fishers Landing", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13642, + "latitude": 44.550897, + "longitude": -75.237516, + "city": "Gouverneur", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13643, + "latitude": 44.014698, + "longitude": -75.728357, + "city": "Great Bend", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13645, + "latitude": 44.533125, + "longitude": -75.192865, + "city": "Hailesboro", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13646, + "latitude": 44.468, + "longitude": -75.359907, + "city": "Hammond", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13647, + "latitude": 44.608735, + "longitude": -74.973218, + "city": "Hannawa Falls", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13648, + "latitude": 43.818705, + "longitude": -75.480342, + "city": "Harrisville", + "state": "NY", + "county": "Lewis" + }, + { + "zip_code": 13649, + "latitude": 44.921678, + "longitude": -74.706763, + "city": "Helena", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13650, + "latitude": 43.812653, + "longitude": -76.208109, + "city": "Henderson", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13651, + "latitude": 43.870842, + "longitude": -76.180886, + "city": "Henderson Harbor", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13652, + "latitude": 44.549025, + "longitude": -75.204351, + "city": "Hermon", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13654, + "latitude": 44.616648, + "longitude": -75.185085, + "city": "Heuvelton", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13655, + "latitude": 44.980232, + "longitude": -74.647334, + "city": "Hogansburg", + "state": "NY", + "county": "Franklin" + }, + { + "zip_code": 13656, + "latitude": 44.200392, + "longitude": -75.984109, + "city": "La Fargeville", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13657, + "latitude": 44.035703, + "longitude": -76.090424, + "city": "Limerick", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13658, + "latitude": 44.516168, + "longitude": -75.21642, + "city": "Lisbon", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13659, + "latitude": 43.75037, + "longitude": -75.899974, + "city": "Lorraine", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13660, + "latitude": 44.770682, + "longitude": -75.019312, + "city": "Madrid", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13661, + "latitude": 43.727352, + "longitude": -76.090851, + "city": "Mannsville", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13662, + "latitude": 44.57026, + "longitude": -75.152249, + "city": "Massena", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13664, + "latitude": 44.555889, + "longitude": -75.655877, + "city": "Morristown", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13665, + "latitude": 44.054012, + "longitude": -75.514487, + "city": "Natural Bridge", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13666, + "latitude": 44.533125, + "longitude": -75.192865, + "city": "Newton Falls", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13667, + "latitude": 44.855075, + "longitude": -74.942946, + "city": "Norfolk", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13668, + "latitude": 44.53517, + "longitude": -75.099289, + "city": "Norwood", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13669, + "latitude": 44.509143, + "longitude": -75.249795, + "city": "Ogdensburg", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13670, + "latitude": 44.216681, + "longitude": -75.084323, + "city": "Oswegatchie", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13671, + "latitude": 44.308475, + "longitude": -75.66879, + "city": "Oxbow", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13672, + "latitude": 44.544283, + "longitude": -74.780387, + "city": "Parishville", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13673, + "latitude": 44.116323, + "longitude": -75.719346, + "city": "Philadelphia", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13674, + "latitude": 43.73345, + "longitude": -76.054313, + "city": "Pierrepont Manor", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13675, + "latitude": 44.283403, + "longitude": -75.857026, + "city": "Plessis", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13676, + "latitude": 44.539717, + "longitude": -75.142415, + "city": "Potsdam", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13677, + "latitude": 44.673438, + "longitude": -75.082041, + "city": "Pyrites", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13678, + "latitude": 44.828685, + "longitude": -74.979811, + "city": "Raymondville", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13679, + "latitude": 44.327083, + "longitude": -75.80354, + "city": "Redwood", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13680, + "latitude": 44.452668, + "longitude": -75.342977, + "city": "Rensselaer Falls", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13681, + "latitude": 44.439964, + "longitude": -75.377707, + "city": "Richville", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13682, + "latitude": 43.856677, + "longitude": -75.907485, + "city": "Rodman", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13683, + "latitude": 44.533125, + "longitude": -75.192865, + "city": "Rooseveltown", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13684, + "latitude": 44.382351, + "longitude": -75.104276, + "city": "Russell", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13685, + "latitude": 43.872933, + "longitude": -76.092563, + "city": "Sackets Harbor", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13687, + "latitude": 44.64472, + "longitude": -74.879155, + "city": "South Colton", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13688, + "latitude": 43.951666, + "longitude": -75.767772, + "city": "South Rutland", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13690, + "latitude": 44.174001, + "longitude": -74.991929, + "city": "Star Lake", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13691, + "latitude": 44.220448, + "longitude": -75.767059, + "city": "Theresa", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13692, + "latitude": 44.289833, + "longitude": -76.02621, + "city": "Thousand Island Park", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13693, + "latitude": 44.029787, + "longitude": -76.222374, + "city": "Three Mile Bay", + "state": "NY", + "county": "Jefferson" + }, + { + "zip_code": 13694, + "latitude": 44.550617, + "longitude": -75.194099, + "city": "Waddington", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13695, + "latitude": 44.140791, + "longitude": -74.912493, + "city": "Wanakena", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13696, + "latitude": 44.69563, + "longitude": -74.89998, + "city": "West Stockholm", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13697, + "latitude": 44.642889, + "longitude": -74.840761, + "city": "Winthrop", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13699, + "latitude": 44.496564, + "longitude": -75.072951, + "city": "Potsdam", + "state": "NY", + "county": "Saint Lawrence" + }, + { + "zip_code": 13730, + "latitude": 42.255147, + "longitude": -75.533335, + "city": "Afton", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13731, + "latitude": 42.12923, + "longitude": -74.843187, + "city": "Andes", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13732, + "latitude": 42.049798, + "longitude": -76.181009, + "city": "Apalachin", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 13733, + "latitude": 42.295949, + "longitude": -75.507589, + "city": "Bainbridge", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13734, + "latitude": 42.12518, + "longitude": -76.405626, + "city": "Barton", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 13736, + "latitude": 42.294616, + "longitude": -76.198223, + "city": "Berkshire", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 13737, + "latitude": 42.080494, + "longitude": -76.097288, + "city": "Bible School Park", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13738, + "latitude": 42.567313, + "longitude": -76.123795, + "city": "Blodgett Mills", + "state": "NY", + "county": "Cortland" + }, + { + "zip_code": 13739, + "latitude": 42.340298, + "longitude": -74.874437, + "city": "Bloomville", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13740, + "latitude": 42.183045, + "longitude": -74.925617, + "city": "Bovina Center", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13743, + "latitude": 42.226448, + "longitude": -76.309863, + "city": "Candor", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 13744, + "latitude": 42.243783, + "longitude": -75.90689, + "city": "Castle Creek", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13745, + "latitude": 42.173775, + "longitude": -75.872839, + "city": "Chenango Bridge", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13746, + "latitude": 42.277777, + "longitude": -75.846246, + "city": "Chenango Forks", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13747, + "latitude": 42.505122, + "longitude": -74.982056, + "city": "Colliersville", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13748, + "latitude": 42.108659, + "longitude": -75.809834, + "city": "Conklin", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13749, + "latitude": 42.206745, + "longitude": -75.74488, + "city": "Corbettsville", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13750, + "latitude": 42.444889, + "longitude": -74.840217, + "city": "Davenport", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13751, + "latitude": 42.424859, + "longitude": -74.900195, + "city": "Davenport Center", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13752, + "latitude": 42.220641, + "longitude": -74.916308, + "city": "De Lancey", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13753, + "latitude": 42.293718, + "longitude": -74.920671, + "city": "Delhi", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13754, + "latitude": 42.097004, + "longitude": -75.713691, + "city": "Deposit", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13755, + "latitude": 42.035768, + "longitude": -74.900852, + "city": "Downsville", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13756, + "latitude": 42.003935, + "longitude": -75.122615, + "city": "East Branch", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13757, + "latitude": 42.350091, + "longitude": -74.977712, + "city": "East Meredith", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13758, + "latitude": 42.583518, + "longitude": -75.721931, + "city": "East Pharsalia", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13760, + "latitude": 42.150588, + "longitude": -76.055064, + "city": "Endicott", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13761, + "latitude": 42.206745, + "longitude": -75.74488, + "city": "Endicott", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13762, + "latitude": 42.206745, + "longitude": -75.74488, + "city": "Endwell", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13763, + "latitude": 42.206745, + "longitude": -75.74488, + "city": "Endicott", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13774, + "latitude": 42.183045, + "longitude": -74.925617, + "city": "Fishs Eddy", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13775, + "latitude": 42.32887, + "longitude": -75.136628, + "city": "Franklin", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13776, + "latitude": 42.458584, + "longitude": -75.311836, + "city": "Gilbertsville", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13777, + "latitude": 42.244157, + "longitude": -75.989275, + "city": "Glen Aubrey", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13778, + "latitude": 42.34013, + "longitude": -75.734191, + "city": "Greene", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13780, + "latitude": 42.365134, + "longitude": -75.611685, + "city": "Guilford", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13782, + "latitude": 42.192781, + "longitude": -75.012689, + "city": "Hamden", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13783, + "latitude": 42.115853, + "longitude": -75.028814, + "city": "Hancock", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13784, + "latitude": 42.431068, + "longitude": -76.159312, + "city": "Harford", + "state": "NY", + "county": "Cortland" + }, + { + "zip_code": 13786, + "latitude": 42.183045, + "longitude": -74.925617, + "city": "Harpersfield", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13787, + "latitude": 42.186306, + "longitude": -75.67618, + "city": "Harpursville", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13788, + "latitude": 42.380427, + "longitude": -74.711604, + "city": "Hobart", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13790, + "latitude": 42.159206, + "longitude": -75.930931, + "city": "Johnson City", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13794, + "latitude": 42.402816, + "longitude": -76.036582, + "city": "Killawog", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13795, + "latitude": 42.056172, + "longitude": -75.788126, + "city": "Kirkwood", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13796, + "latitude": 42.555454, + "longitude": -75.135511, + "city": "Laurens", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13797, + "latitude": 42.339355, + "longitude": -76.045026, + "city": "Lisle", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13801, + "latitude": 42.49712, + "longitude": -75.731309, + "city": "Mc Donough", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13802, + "latitude": 42.253754, + "longitude": -76.046399, + "city": "Maine", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13803, + "latitude": 42.497925, + "longitude": -76.047429, + "city": "Marathon", + "state": "NY", + "county": "Cortland" + }, + { + "zip_code": 13804, + "latitude": 42.183045, + "longitude": -74.925617, + "city": "Masonville", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13806, + "latitude": 42.183045, + "longitude": -74.925617, + "city": "Meridale", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13807, + "latitude": 42.601799, + "longitude": -74.975717, + "city": "Milford", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13808, + "latitude": 42.531661, + "longitude": -75.131023, + "city": "Morris", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13809, + "latitude": 42.400281, + "longitude": -75.451576, + "city": "Mount Upton", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13810, + "latitude": 42.610748, + "longitude": -75.102602, + "city": "Mount Vision", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13811, + "latitude": 42.170428, + "longitude": -76.213825, + "city": "Newark Valley", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 13812, + "latitude": 42.039954, + "longitude": -76.370793, + "city": "Nichols", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 13813, + "latitude": 42.147454, + "longitude": -75.55656, + "city": "Nineveh", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13814, + "latitude": 42.603574, + "longitude": -75.528221, + "city": "North Norwich", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13815, + "latitude": 42.536226, + "longitude": -75.601779, + "city": "Norwich", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13820, + "latitude": 42.461688, + "longitude": -75.096727, + "city": "Oneonta", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13825, + "latitude": 42.441165, + "longitude": -75.148268, + "city": "Otego", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13826, + "latitude": 42.112127, + "longitude": -75.639586, + "city": "Ouaquaga", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13827, + "latitude": 42.176816, + "longitude": -76.2568, + "city": "Owego", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 13830, + "latitude": 42.437881, + "longitude": -75.567327, + "city": "Oxford", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13832, + "latitude": 42.568979, + "longitude": -75.654133, + "city": "Plymouth", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13833, + "latitude": 42.195785, + "longitude": -75.759054, + "city": "Port Crane", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13834, + "latitude": 42.539439, + "longitude": -74.966985, + "city": "Portlandville", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13835, + "latitude": 42.371552, + "longitude": -76.197488, + "city": "Richford", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 13837, + "latitude": 42.183045, + "longitude": -74.925617, + "city": "Shinhopple", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13838, + "latitude": 42.308884, + "longitude": -75.391644, + "city": "Sidney", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13839, + "latitude": 42.217118, + "longitude": -75.232488, + "city": "Sidney Center", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13840, + "latitude": 42.039512, + "longitude": -76.400376, + "city": "Smithboro", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 13841, + "latitude": 42.461525, + "longitude": -75.632735, + "city": "Smithville Flats", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13842, + "latitude": 42.183045, + "longitude": -74.925617, + "city": "South Kortright", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13843, + "latitude": 42.542579, + "longitude": -75.412243, + "city": "South New Berlin", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13844, + "latitude": 42.624833, + "longitude": -75.652767, + "city": "South Plymouth", + "state": "NY", + "county": "Chenango" + }, + { + "zip_code": 13845, + "latitude": 42.065842, + "longitude": -76.381946, + "city": "Tioga Center", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 13846, + "latitude": 42.380509, + "longitude": -75.059702, + "city": "Treadwell", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13847, + "latitude": 42.183045, + "longitude": -74.925617, + "city": "Trout Creek", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13848, + "latitude": 42.214705, + "longitude": -75.727699, + "city": "Tunnel", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13849, + "latitude": 42.382962, + "longitude": -75.292321, + "city": "Unadilla", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13850, + "latitude": 42.055476, + "longitude": -76.027088, + "city": "Vestal", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13851, + "latitude": 42.206745, + "longitude": -75.74488, + "city": "Vestal", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13856, + "latitude": 42.250118, + "longitude": -75.125556, + "city": "Walton", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13859, + "latitude": 42.379383, + "longitude": -75.264556, + "city": "Wells Bridge", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13860, + "latitude": 42.183045, + "longitude": -74.925617, + "city": "West Davenport", + "state": "NY", + "county": "Delaware" + }, + { + "zip_code": 13861, + "latitude": 42.501093, + "longitude": -75.140874, + "city": "West Oneonta", + "state": "NY", + "county": "Otsego" + }, + { + "zip_code": 13862, + "latitude": 42.321825, + "longitude": -75.945183, + "city": "Whitney Point", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13863, + "latitude": 42.449946, + "longitude": -75.924813, + "city": "Willet", + "state": "NY", + "county": "Cortland" + }, + { + "zip_code": 13864, + "latitude": 42.186744, + "longitude": -76.348074, + "city": "Willseyville", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 13865, + "latitude": 42.069103, + "longitude": -75.644078, + "city": "Windsor", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13901, + "latitude": 42.165629, + "longitude": -75.890685, + "city": "Binghamton", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13902, + "latitude": 42.105375, + "longitude": -75.8876, + "city": "Binghamton", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13903, + "latitude": 42.083005, + "longitude": -75.923248, + "city": "Binghamton", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13904, + "latitude": 42.131088, + "longitude": -75.787801, + "city": "Binghamton", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 13905, + "latitude": 42.173709, + "longitude": -75.922159, + "city": "Binghamton", + "state": "NY", + "county": "Broome" + }, + { + "zip_code": 14001, + "latitude": 43.013808, + "longitude": -78.525296, + "city": "Akron", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14003, + "latitude": 42.998052, + "longitude": -78.184813, + "city": "Alabama", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14004, + "latitude": 42.872937, + "longitude": -78.528446, + "city": "Alden", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14005, + "latitude": 42.917622, + "longitude": -78.264873, + "city": "Alexander", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14006, + "latitude": 42.823386, + "longitude": -78.858355, + "city": "Angola", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14008, + "latitude": 43.291696, + "longitude": -78.626944, + "city": "Appleton", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14009, + "latitude": 42.597171, + "longitude": -78.37463, + "city": "Arcade", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14010, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Athol Springs", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14011, + "latitude": 42.699424, + "longitude": -78.287793, + "city": "Attica", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14012, + "latitude": 43.327031, + "longitude": -78.534963, + "city": "Barker", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14013, + "latitude": 43.077884, + "longitude": -78.394594, + "city": "Basom", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14020, + "latitude": 42.980544, + "longitude": -78.231764, + "city": "Batavia", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14021, + "latitude": 42.998052, + "longitude": -78.184813, + "city": "Batavia", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14024, + "latitude": 42.590046, + "longitude": -78.246616, + "city": "Bliss", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14025, + "latitude": 42.625391, + "longitude": -78.726767, + "city": "Boston", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14026, + "latitude": 42.941008, + "longitude": -78.688009, + "city": "Bowmansville", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14027, + "latitude": 42.57075, + "longitude": -79.030785, + "city": "Brant", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14028, + "latitude": 43.313814, + "longitude": -78.736907, + "city": "Burt", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14029, + "latitude": 42.474283, + "longitude": -78.247413, + "city": "Centerville", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14030, + "latitude": 42.560669, + "longitude": -78.522178, + "city": "Chaffee", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14031, + "latitude": 42.992968, + "longitude": -78.601269, + "city": "Clarence", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14032, + "latitude": 42.937314, + "longitude": -78.593381, + "city": "Clarence Center", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14033, + "latitude": 42.646441, + "longitude": -78.666272, + "city": "Colden", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14034, + "latitude": 42.668773, + "longitude": -78.816333, + "city": "Collins", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14035, + "latitude": 42.49064, + "longitude": -78.849861, + "city": "Collins Center", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14036, + "latitude": 42.978522, + "longitude": -78.372338, + "city": "Corfu", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14037, + "latitude": 42.807705, + "longitude": -78.446855, + "city": "Cowlesville", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14038, + "latitude": 42.947259, + "longitude": -78.474444, + "city": "Crittenden", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14039, + "latitude": 42.837456, + "longitude": -78.1719, + "city": "Dale", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14040, + "latitude": 42.895989, + "longitude": -78.385667, + "city": "Darien Center", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14041, + "latitude": 42.408583, + "longitude": -78.984391, + "city": "Dayton", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14042, + "latitude": 42.473934, + "longitude": -78.494065, + "city": "Delevan", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14043, + "latitude": 42.898958, + "longitude": -78.707872, + "city": "Depew", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14047, + "latitude": 42.683522, + "longitude": -78.995736, + "city": "Derby", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14048, + "latitude": 42.487716, + "longitude": -79.328287, + "city": "Dunkirk", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14051, + "latitude": 43.042907, + "longitude": -78.698796, + "city": "East Amherst", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14052, + "latitude": 42.768209, + "longitude": -78.577136, + "city": "East Aurora", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14054, + "latitude": 42.917037, + "longitude": -78.126525, + "city": "East Bethany", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14055, + "latitude": 42.559423, + "longitude": -78.621851, + "city": "East Concord", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14056, + "latitude": 42.991173, + "longitude": -78.312171, + "city": "East Pembroke", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14057, + "latitude": 42.641429, + "longitude": -78.875456, + "city": "Eden", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14058, + "latitude": 43.088434, + "longitude": -78.16261, + "city": "Elba", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14059, + "latitude": 42.828309, + "longitude": -78.628966, + "city": "Elma", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14060, + "latitude": 42.445698, + "longitude": -78.341227, + "city": "Farmersville Station", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14061, + "latitude": 42.594627, + "longitude": -79.08404, + "city": "Farnham", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14062, + "latitude": 42.441146, + "longitude": -79.172343, + "city": "Forestville", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14063, + "latitude": 42.412217, + "longitude": -79.319254, + "city": "Fredonia", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14065, + "latitude": 42.475344, + "longitude": -78.370334, + "city": "Freedom", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14066, + "latitude": 42.629014, + "longitude": -78.19448, + "city": "Gainesville", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14067, + "latitude": 43.208166, + "longitude": -78.56623, + "city": "Gasport", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14068, + "latitude": 43.026737, + "longitude": -78.762454, + "city": "Getzville", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14069, + "latitude": 42.610187, + "longitude": -78.639976, + "city": "Glenwood", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14070, + "latitude": 42.41994, + "longitude": -78.954628, + "city": "Gowanda", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14072, + "latitude": 43.015256, + "longitude": -78.958945, + "city": "Grand Island", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14075, + "latitude": 42.729083, + "longitude": -78.837596, + "city": "Hamburg", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14080, + "latitude": 42.640179, + "longitude": -78.543738, + "city": "Holland", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14081, + "latitude": 42.543516, + "longitude": -79.101301, + "city": "Irving", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14082, + "latitude": 42.65161, + "longitude": -78.387099, + "city": "Java Center", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14083, + "latitude": 42.675193, + "longitude": -78.436442, + "city": "Java Village", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14085, + "latitude": 42.716055, + "longitude": -78.929357, + "city": "Lake View", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14086, + "latitude": 42.907658, + "longitude": -78.632137, + "city": "Lancaster", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14091, + "latitude": 42.54386, + "longitude": -78.94475, + "city": "Lawtons", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14092, + "latitude": 43.170805, + "longitude": -78.989515, + "city": "Lewiston", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14094, + "latitude": 43.168463, + "longitude": -78.706886, + "city": "Lockport", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14095, + "latitude": 43.32684, + "longitude": -78.830681, + "city": "Lockport", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14098, + "latitude": 43.324031, + "longitude": -78.367151, + "city": "Lyndonville", + "state": "NY", + "county": "Orleans" + }, + { + "zip_code": 14101, + "latitude": 42.38917, + "longitude": -78.554217, + "city": "Machias", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14102, + "latitude": 42.851099, + "longitude": -78.547172, + "city": "Marilla", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14103, + "latitude": 43.239442, + "longitude": -78.359871, + "city": "Medina", + "state": "NY", + "county": "Orleans" + }, + { + "zip_code": 14105, + "latitude": 43.196947, + "longitude": -78.502849, + "city": "Middleport", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14107, + "latitude": 43.32684, + "longitude": -78.830681, + "city": "Model City", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14108, + "latitude": 43.271156, + "longitude": -78.724806, + "city": "Newfane", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14109, + "latitude": 43.32684, + "longitude": -78.830681, + "city": "Niagara University", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14110, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "North Boston", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14111, + "latitude": 42.583165, + "longitude": -78.91888, + "city": "North Collins", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14112, + "latitude": 42.691742, + "longitude": -78.992658, + "city": "North Evans", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14113, + "latitude": 42.656199, + "longitude": -78.340092, + "city": "North Java", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14120, + "latitude": 43.179206, + "longitude": -78.808908, + "city": "North Tonawanda", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14125, + "latitude": 43.087438, + "longitude": -78.269677, + "city": "Oakfield", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14126, + "latitude": 43.330443, + "longitude": -78.726661, + "city": "Olcott", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14127, + "latitude": 42.742541, + "longitude": -78.704437, + "city": "Orchard Park", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14129, + "latitude": 42.472671, + "longitude": -79.007621, + "city": "Perrysburg", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14130, + "latitude": 42.543108, + "longitude": -78.153849, + "city": "Pike", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14131, + "latitude": 43.233055, + "longitude": -78.906562, + "city": "Ransomville", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14132, + "latitude": 43.153105, + "longitude": -78.885611, + "city": "Sanborn", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14133, + "latitude": 42.489129, + "longitude": -78.366991, + "city": "Sandusky", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14134, + "latitude": 42.532281, + "longitude": -78.517233, + "city": "Sardinia", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14135, + "latitude": 42.488983, + "longitude": -79.238997, + "city": "Sheridan", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14136, + "latitude": 42.520038, + "longitude": -79.207843, + "city": "Silver Creek", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14138, + "latitude": 42.374077, + "longitude": -78.94643, + "city": "South Dayton", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14139, + "latitude": 42.716759, + "longitude": -78.543478, + "city": "South Wales", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14140, + "latitude": 42.807159, + "longitude": -78.667599, + "city": "Spring Brook", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14141, + "latitude": 42.538335, + "longitude": -78.685169, + "city": "Springville", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14143, + "latitude": 42.975195, + "longitude": -78.069868, + "city": "Stafford", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14144, + "latitude": 43.199494, + "longitude": -79.042477, + "city": "Stella Niagara", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14145, + "latitude": 42.733778, + "longitude": -78.423303, + "city": "Strykersville", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14150, + "latitude": 42.99704, + "longitude": -78.878659, + "city": "Tonawanda", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14151, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Tonawanda", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14166, + "latitude": 42.4511, + "longitude": -79.415421, + "city": "Van Buren Point", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14167, + "latitude": 42.738977, + "longitude": -78.312478, + "city": "Varysburg", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14168, + "latitude": 42.509271, + "longitude": -78.999471, + "city": "Versailles", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14169, + "latitude": 42.767333, + "longitude": -78.585646, + "city": "Wales Center", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14170, + "latitude": 42.702797, + "longitude": -78.670098, + "city": "West Falls", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14171, + "latitude": 42.406409, + "longitude": -78.639581, + "city": "West Valley", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14172, + "latitude": 43.272729, + "longitude": -78.83101, + "city": "Wilson", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14173, + "latitude": 42.524691, + "longitude": -78.475474, + "city": "Yorkshire", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14174, + "latitude": 43.244454, + "longitude": -78.988325, + "city": "Youngstown", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14201, + "latitude": 42.929303, + "longitude": -78.832706, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14202, + "latitude": 42.889662, + "longitude": -78.884157, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14203, + "latitude": 42.868057, + "longitude": -78.867906, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14204, + "latitude": 42.882957, + "longitude": -78.864898, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14205, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14206, + "latitude": 42.881012, + "longitude": -78.814555, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14207, + "latitude": 42.949557, + "longitude": -78.897009, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14208, + "latitude": 42.916107, + "longitude": -78.858157, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14209, + "latitude": 42.918107, + "longitude": -78.865857, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14210, + "latitude": 42.863608, + "longitude": -78.825755, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14211, + "latitude": 42.912257, + "longitude": -78.819005, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14212, + "latitude": 42.894558, + "longitude": -78.818805, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14213, + "latitude": 42.918057, + "longitude": -78.891108, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14214, + "latitude": 42.940107, + "longitude": -78.835256, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14215, + "latitude": 42.932957, + "longitude": -78.812252, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14216, + "latitude": 42.946407, + "longitude": -78.860407, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14217, + "latitude": 42.900044, + "longitude": -78.808205, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14218, + "latitude": 42.814558, + "longitude": -78.807754, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14219, + "latitude": 42.786308, + "longitude": -78.826444, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14220, + "latitude": 42.845908, + "longitude": -78.823005, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14221, + "latitude": 42.968507, + "longitude": -78.749153, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14222, + "latitude": 42.918207, + "longitude": -78.875007, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14223, + "latitude": 42.974607, + "longitude": -78.850507, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14224, + "latitude": 42.837128, + "longitude": -78.748352, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14225, + "latitude": 42.925458, + "longitude": -78.748145, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14226, + "latitude": 42.974389, + "longitude": -78.794905, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14227, + "latitude": 42.885308, + "longitude": -78.746202, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14228, + "latitude": 43.026016, + "longitude": -78.766073, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14231, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14233, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14240, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14241, + "latitude": 42.938258, + "longitude": -78.744053, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14260, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14261, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14263, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14264, + "latitude": 42.885568, + "longitude": -78.873479, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14265, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14267, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14269, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14270, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14272, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14273, + "latitude": 42.75495, + "longitude": -78.784908, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14276, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14280, + "latitude": 42.768413, + "longitude": -78.887094, + "city": "Buffalo", + "state": "NY", + "county": "Erie" + }, + { + "zip_code": 14301, + "latitude": 43.089805, + "longitude": -79.009414, + "city": "Niagara Falls", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14302, + "latitude": 43.32684, + "longitude": -78.830681, + "city": "Niagara Falls", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14303, + "latitude": 43.086455, + "longitude": -79.037965, + "city": "Niagara Falls", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14304, + "latitude": 43.100305, + "longitude": -78.952112, + "city": "Niagara Falls", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14305, + "latitude": 43.117255, + "longitude": -79.018415, + "city": "Niagara Falls", + "state": "NY", + "county": "Niagara" + }, + { + "zip_code": 14410, + "latitude": 43.195261, + "longitude": -77.855883, + "city": "Adams Basin", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14411, + "latitude": 43.235143, + "longitude": -78.194251, + "city": "Albion", + "state": "NY", + "county": "Orleans" + }, + { + "zip_code": 14413, + "latitude": 43.222735, + "longitude": -76.982149, + "city": "Alton", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14414, + "latitude": 42.895631, + "longitude": -77.735104, + "city": "Avon", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14415, + "latitude": 42.754115, + "longitude": -77.026379, + "city": "Bellona", + "state": "NY", + "county": "Yates" + }, + { + "zip_code": 14416, + "latitude": 43.073792, + "longitude": -78.019684, + "city": "Bergen", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14418, + "latitude": 42.622634, + "longitude": -77.227187, + "city": "Branchport", + "state": "NY", + "county": "Yates" + }, + { + "zip_code": 14420, + "latitude": 43.223303, + "longitude": -77.917335, + "city": "Brockport", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14422, + "latitude": 43.073142, + "longitude": -78.056938, + "city": "Byron", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14423, + "latitude": 42.935329, + "longitude": -77.838998, + "city": "Caledonia", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14424, + "latitude": 42.813576, + "longitude": -77.289687, + "city": "Canandaigua", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14425, + "latitude": 42.958041, + "longitude": -77.308256, + "city": "Farmington", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14427, + "latitude": 42.62674, + "longitude": -78.059147, + "city": "Castile", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14428, + "latitude": 43.074911, + "longitude": -77.835003, + "city": "Churchville", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14429, + "latitude": 43.381027, + "longitude": -78.231338, + "city": "Clarendon", + "state": "NY", + "county": "Orleans" + }, + { + "zip_code": 14430, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Clarkson", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14432, + "latitude": 42.962932, + "longitude": -77.150097, + "city": "Clifton Springs", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14433, + "latitude": 43.097869, + "longitude": -76.872736, + "city": "Clyde", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14435, + "latitude": 42.723231, + "longitude": -77.668291, + "city": "Conesus", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14437, + "latitude": 42.61837, + "longitude": -77.737515, + "city": "Dansville", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14441, + "latitude": 42.722446, + "longitude": -76.963823, + "city": "Dresden", + "state": "NY", + "county": "Yates" + }, + { + "zip_code": 14443, + "latitude": 42.900966, + "longitude": -77.42331, + "city": "East Bloomfield", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14445, + "latitude": 43.113563, + "longitude": -77.482538, + "city": "East Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14449, + "latitude": 43.235369, + "longitude": -77.137642, + "city": "East Williamson", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14450, + "latitude": 43.104287, + "longitude": -77.428964, + "city": "Fairport", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14452, + "latitude": 43.381027, + "longitude": -78.231338, + "city": "Fancher", + "state": "NY", + "county": "Orleans" + }, + { + "zip_code": 14453, + "latitude": 43.010908, + "longitude": -77.47054, + "city": "Fishers", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14454, + "latitude": 42.783801, + "longitude": -77.777872, + "city": "Geneseo", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14456, + "latitude": 42.857414, + "longitude": -77.034883, + "city": "Geneva", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14461, + "latitude": 42.808127, + "longitude": -77.287611, + "city": "Gorham", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14462, + "latitude": 42.694819, + "longitude": -77.754628, + "city": "Groveland", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14463, + "latitude": 42.796578, + "longitude": -77.063876, + "city": "Hall", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14464, + "latitude": 43.321659, + "longitude": -77.925097, + "city": "Hamlin", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14466, + "latitude": 42.78481, + "longitude": -77.618049, + "city": "Hemlock", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14467, + "latitude": 43.058863, + "longitude": -77.558902, + "city": "Henrietta", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14468, + "latitude": 43.28521, + "longitude": -77.832333, + "city": "Hilton", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14469, + "latitude": 42.869556, + "longitude": -77.465843, + "city": "Bloomfield", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14470, + "latitude": 43.21586, + "longitude": -78.073057, + "city": "Holley", + "state": "NY", + "county": "Orleans" + }, + { + "zip_code": 14471, + "latitude": 42.755573, + "longitude": -77.491905, + "city": "Honeoye", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14472, + "latitude": 42.982513, + "longitude": -77.606771, + "city": "Honeoye Falls", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14475, + "latitude": 42.935868, + "longitude": -77.498231, + "city": "Ionia", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14476, + "latitude": 43.324058, + "longitude": -78.049928, + "city": "Kendall", + "state": "NY", + "county": "Orleans" + }, + { + "zip_code": 14477, + "latitude": 43.330763, + "longitude": -78.123328, + "city": "Kent", + "state": "NY", + "county": "Orleans" + }, + { + "zip_code": 14478, + "latitude": 42.570794, + "longitude": -77.12259, + "city": "Keuka Park", + "state": "NY", + "county": "Yates" + }, + { + "zip_code": 14479, + "latitude": 43.241502, + "longitude": -78.318828, + "city": "Knowlesville", + "state": "NY", + "county": "Orleans" + }, + { + "zip_code": 14480, + "latitude": 42.837288, + "longitude": -77.703091, + "city": "Lakeville", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14481, + "latitude": 42.760644, + "longitude": -77.90355, + "city": "Leicester", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14482, + "latitude": 42.95619, + "longitude": -77.989988, + "city": "Le Roy", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14485, + "latitude": 42.889864, + "longitude": -77.608688, + "city": "Lima", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14486, + "latitude": 42.915297, + "longitude": -77.949818, + "city": "Linwood", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14487, + "latitude": 42.809457, + "longitude": -77.650938, + "city": "Livonia", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14488, + "latitude": 42.729839, + "longitude": -77.773919, + "city": "Livonia Center", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14489, + "latitude": 43.099263, + "longitude": -76.970937, + "city": "Lyons", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14502, + "latitude": 43.110807, + "longitude": -77.31345, + "city": "Macedon", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14504, + "latitude": 42.968903, + "longitude": -77.233194, + "city": "Manchester", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14505, + "latitude": 43.15594, + "longitude": -77.172684, + "city": "Marion", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14506, + "latitude": 43.001323, + "longitude": -77.504268, + "city": "Mendon", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14507, + "latitude": 42.686845, + "longitude": -77.262987, + "city": "Middlesex", + "state": "NY", + "county": "Yates" + }, + { + "zip_code": 14508, + "latitude": 43.381027, + "longitude": -78.231338, + "city": "Morton", + "state": "NY", + "county": "Orleans" + }, + { + "zip_code": 14510, + "latitude": 42.683466, + "longitude": -77.866402, + "city": "Mount Morris", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14511, + "latitude": 43.002612, + "longitude": -77.86458, + "city": "Mumford", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14512, + "latitude": 42.667802, + "longitude": -77.413496, + "city": "Naples", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14513, + "latitude": 43.087067, + "longitude": -77.097867, + "city": "Newark", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14514, + "latitude": 43.085778, + "longitude": -77.805628, + "city": "North Chili", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14515, + "latitude": 43.257819, + "longitude": -77.735079, + "city": "North Greece", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14516, + "latitude": 43.195842, + "longitude": -76.908805, + "city": "North Rose", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14517, + "latitude": 42.591883, + "longitude": -77.894474, + "city": "Nunda", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14518, + "latitude": 42.931873, + "longitude": -77.011839, + "city": "Oaks Corners", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14519, + "latitude": 43.221476, + "longitude": -77.308614, + "city": "Ontario", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14520, + "latitude": 43.348369, + "longitude": -77.045288, + "city": "Ontario Center", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14521, + "latitude": 42.689791, + "longitude": -76.794102, + "city": "Ovid", + "state": "NY", + "county": "Seneca" + }, + { + "zip_code": 14522, + "latitude": 43.081306, + "longitude": -77.218849, + "city": "Palmyra", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14525, + "latitude": 42.910203, + "longitude": -78.026899, + "city": "Pavilion", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14526, + "latitude": 43.145813, + "longitude": -77.454446, + "city": "Penfield", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14527, + "latitude": 42.637423, + "longitude": -77.069925, + "city": "Penn Yan", + "state": "NY", + "county": "Yates" + }, + { + "zip_code": 14529, + "latitude": 42.535363, + "longitude": -77.628857, + "city": "Perkinsville", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14530, + "latitude": 42.682391, + "longitude": -78.056235, + "city": "Perry", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14532, + "latitude": 42.963394, + "longitude": -77.043612, + "city": "Phelps", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14533, + "latitude": 42.843464, + "longitude": -77.896153, + "city": "Piffard", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14534, + "latitude": 43.060229, + "longitude": -77.520692, + "city": "Pittsford", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14536, + "latitude": 42.555988, + "longitude": -78.098906, + "city": "Portageville", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14537, + "latitude": 43.033002, + "longitude": -77.157465, + "city": "Port Gibson", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14538, + "latitude": 43.283582, + "longitude": -77.142027, + "city": "Pultneyville", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14539, + "latitude": 42.834327, + "longitude": -77.877876, + "city": "Retsof", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14541, + "latitude": 42.749713, + "longitude": -76.844921, + "city": "Romulus", + "state": "NY", + "county": "Seneca" + }, + { + "zip_code": 14542, + "latitude": 43.144795, + "longitude": -76.860779, + "city": "Rose", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14543, + "latitude": 42.996613, + "longitude": -77.666524, + "city": "Rush", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14544, + "latitude": 42.734157, + "longitude": -77.242693, + "city": "Rushville", + "state": "NY", + "county": "Yates" + }, + { + "zip_code": 14545, + "latitude": 42.652111, + "longitude": -77.710539, + "city": "Scottsburg", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14546, + "latitude": 43.04471, + "longitude": -77.772652, + "city": "Scottsville", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14547, + "latitude": 42.808127, + "longitude": -77.287611, + "city": "Seneca Castle", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14548, + "latitude": 42.978834, + "longitude": -77.252696, + "city": "Shortsville", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14549, + "latitude": 42.692874, + "longitude": -78.022364, + "city": "Silver Lake", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14550, + "latitude": 42.674209, + "longitude": -78.084485, + "city": "Silver Springs", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14551, + "latitude": 43.210384, + "longitude": -77.053517, + "city": "Sodus", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14555, + "latitude": 43.254644, + "longitude": -76.983518, + "city": "Sodus Point", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14556, + "latitude": 42.729839, + "longitude": -77.773919, + "city": "Sonyea", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14557, + "latitude": 43.041606, + "longitude": -78.057252, + "city": "South Byron", + "state": "NY", + "county": "Genesee" + }, + { + "zip_code": 14558, + "latitude": 42.855409, + "longitude": -77.687643, + "city": "South Lima", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14559, + "latitude": 43.185709, + "longitude": -77.830577, + "city": "Spencerport", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14560, + "latitude": 42.635525, + "longitude": -77.594478, + "city": "Springwater", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14561, + "latitude": 42.83336, + "longitude": -77.129398, + "city": "Stanley", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14563, + "latitude": 43.348369, + "longitude": -77.045288, + "city": "Union Hill", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14564, + "latitude": 42.973715, + "longitude": -77.426906, + "city": "Victor", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14568, + "latitude": 43.142795, + "longitude": -77.287414, + "city": "Walworth", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14569, + "latitude": 42.740223, + "longitude": -78.164804, + "city": "Warsaw", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14571, + "latitude": 43.328706, + "longitude": -78.238501, + "city": "Waterport", + "state": "NY", + "county": "Orleans" + }, + { + "zip_code": 14572, + "latitude": 42.516793, + "longitude": -77.564247, + "city": "Wayland", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14580, + "latitude": 43.21821, + "longitude": -77.454075, + "city": "Webster", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14585, + "latitude": 42.905459, + "longitude": -77.548423, + "city": "West Bloomfield", + "state": "NY", + "county": "Ontario" + }, + { + "zip_code": 14586, + "latitude": 43.041553, + "longitude": -77.683575, + "city": "West Henrietta", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14588, + "latitude": 42.683451, + "longitude": -76.872442, + "city": "Willard", + "state": "NY", + "county": "Seneca" + }, + { + "zip_code": 14589, + "latitude": 43.23941, + "longitude": -77.163811, + "city": "Williamson", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14590, + "latitude": 43.224693, + "longitude": -76.840547, + "city": "Wolcott", + "state": "NY", + "county": "Wayne" + }, + { + "zip_code": 14591, + "latitude": 42.818578, + "longitude": -78.102549, + "city": "Wyoming", + "state": "NY", + "county": "Wyoming" + }, + { + "zip_code": 14592, + "latitude": 42.875685, + "longitude": -77.883511, + "city": "York", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14601, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14602, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14603, + "latitude": 43.161613, + "longitude": -77.606774, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14604, + "latitude": 43.156612, + "longitude": -77.604023, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14605, + "latitude": 43.166313, + "longitude": -77.602973, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14606, + "latitude": 43.173612, + "longitude": -77.691577, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14607, + "latitude": 43.152013, + "longitude": -77.584888, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14608, + "latitude": 43.154611, + "longitude": -77.624001, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14609, + "latitude": 43.198197, + "longitude": -77.549971, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14610, + "latitude": 43.140163, + "longitude": -77.557871, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14611, + "latitude": 43.140163, + "longitude": -77.650275, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14612, + "latitude": 43.257111, + "longitude": -77.67824, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14613, + "latitude": 43.13378, + "longitude": -77.519325, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14614, + "latitude": 43.104463, + "longitude": -77.512569, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14615, + "latitude": 43.22252, + "longitude": -77.552021, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14616, + "latitude": 43.228955, + "longitude": -77.680927, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14617, + "latitude": 43.207062, + "longitude": -77.609425, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14618, + "latitude": 43.112163, + "longitude": -77.561771, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14619, + "latitude": 43.135688, + "longitude": -77.649126, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14620, + "latitude": 43.129862, + "longitude": -77.618523, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14621, + "latitude": 43.149013, + "longitude": -77.631124, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14622, + "latitude": 43.199613, + "longitude": -77.595823, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14623, + "latitude": 43.082184, + "longitude": -77.649074, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14624, + "latitude": 43.121612, + "longitude": -77.731127, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14625, + "latitude": 43.152213, + "longitude": -77.505705, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14626, + "latitude": 43.190312, + "longitude": -77.720018, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14627, + "latitude": 43.127513, + "longitude": -77.627674, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14638, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14639, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14642, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14643, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14644, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14645, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14646, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14647, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14649, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14650, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14651, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14652, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14653, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14660, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14664, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14673, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14683, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14692, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14694, + "latitude": 43.286024, + "longitude": -77.684264, + "city": "Rochester", + "state": "NY", + "county": "Monroe" + }, + { + "zip_code": 14701, + "latitude": 42.196125, + "longitude": -79.432256, + "city": "Jamestown", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14702, + "latitude": 42.081657, + "longitude": -79.294921, + "city": "Jamestown", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14703, + "latitude": 42.342529, + "longitude": -79.41091, + "city": "Jamestown", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14704, + "latitude": 42.342529, + "longitude": -79.41091, + "city": "Jamestown", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14706, + "latitude": 42.116168, + "longitude": -78.516218, + "city": "Allegany", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14707, + "latitude": 42.073739, + "longitude": -78.059374, + "city": "Allentown", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14708, + "latitude": 42.025431, + "longitude": -78.084837, + "city": "Alma", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14709, + "latitude": 42.217609, + "longitude": -78.090559, + "city": "Angelica", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14710, + "latitude": 42.084481, + "longitude": -79.391738, + "city": "Ashville", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14711, + "latitude": 42.320366, + "longitude": -78.12964, + "city": "Belfast", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14712, + "latitude": 42.164572, + "longitude": -79.445292, + "city": "Bemus Point", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14714, + "latitude": 42.290569, + "longitude": -78.237314, + "city": "Black Creek", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14715, + "latitude": 42.154417, + "longitude": -78.139391, + "city": "Bolivar", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14716, + "latitude": 42.316748, + "longitude": -79.432622, + "city": "Brocton", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14717, + "latitude": 42.257674, + "longitude": -78.174601, + "city": "Caneadea", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14718, + "latitude": 42.250021, + "longitude": -79.296028, + "city": "Cassadaga", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14719, + "latitude": 42.343336, + "longitude": -78.869752, + "city": "Cattaraugus", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14720, + "latitude": 42.105907, + "longitude": -79.27912, + "city": "Celoron", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14721, + "latitude": 42.013691, + "longitude": -78.264775, + "city": "Ceres", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14722, + "latitude": 42.187468, + "longitude": -79.450523, + "city": "Chautauqua", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14723, + "latitude": 42.308946, + "longitude": -79.387594, + "city": "Cherry Creek", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14724, + "latitude": 42.07268, + "longitude": -79.644932, + "city": "Clymer", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14726, + "latitude": 42.252473, + "longitude": -79.008294, + "city": "Conewango Valley", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14727, + "latitude": 42.245997, + "longitude": -78.209403, + "city": "Cuba", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14728, + "latitude": 42.2828, + "longitude": -79.366516, + "city": "Dewittville", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14729, + "latitude": 42.405354, + "longitude": -78.735158, + "city": "East Otto", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14730, + "latitude": 42.174736, + "longitude": -78.94734, + "city": "East Randolph", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14731, + "latitude": 42.297229, + "longitude": -78.649654, + "city": "Ellicottville", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14732, + "latitude": 42.229098, + "longitude": -79.11347, + "city": "Ellington", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14733, + "latitude": 42.126604, + "longitude": -79.182837, + "city": "Falconer", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14735, + "latitude": 42.45079, + "longitude": -78.104285, + "city": "Fillmore", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14736, + "latitude": 42.133206, + "longitude": -79.737701, + "city": "Findley Lake", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14737, + "latitude": 42.335753, + "longitude": -78.491244, + "city": "Franklinville", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14738, + "latitude": 42.053586, + "longitude": -79.118889, + "city": "Frewsburg", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14739, + "latitude": 42.187901, + "longitude": -78.157246, + "city": "Friendship", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14740, + "latitude": 42.21129, + "longitude": -79.170519, + "city": "Gerry", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14741, + "latitude": 42.21704, + "longitude": -78.584117, + "city": "Great Valley", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14742, + "latitude": 42.120512, + "longitude": -79.30958, + "city": "Greenhurst", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14743, + "latitude": 42.197916, + "longitude": -78.415859, + "city": "Hinsdale", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14744, + "latitude": 42.422827, + "longitude": -78.206289, + "city": "Houghton", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14745, + "latitude": 42.4777, + "longitude": -78.140343, + "city": "Hume", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14747, + "latitude": 42.152725, + "longitude": -79.111065, + "city": "Kennedy", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14748, + "latitude": 42.144977, + "longitude": -78.646626, + "city": "Kill Buck", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14750, + "latitude": 42.12481, + "longitude": -79.440009, + "city": "Lakewood", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14751, + "latitude": 42.298328, + "longitude": -79.006231, + "city": "Leon", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14752, + "latitude": 42.352416, + "longitude": -79.323502, + "city": "Lily Dale", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14753, + "latitude": 42.141266, + "longitude": -78.607674, + "city": "Limestone", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14754, + "latitude": 42.031872, + "longitude": -78.209708, + "city": "Little Genesee", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14755, + "latitude": 42.254567, + "longitude": -78.823628, + "city": "Little Valley", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14756, + "latitude": 42.19815, + "longitude": -79.417353, + "city": "Maple Springs", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14757, + "latitude": 42.23716, + "longitude": -79.370911, + "city": "Mayville", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14758, + "latitude": 42.342529, + "longitude": -79.41091, + "city": "Niobe", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14760, + "latitude": 42.082142, + "longitude": -78.425973, + "city": "Olean", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14766, + "latitude": 42.357543, + "longitude": -78.807283, + "city": "Otto", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14767, + "latitude": 42.191346, + "longitude": -79.505101, + "city": "Panama", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14769, + "latitude": 42.371561, + "longitude": -79.468963, + "city": "Portland", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14770, + "latitude": 42.092944, + "longitude": -78.342341, + "city": "Portville", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14772, + "latitude": 42.156841, + "longitude": -78.844412, + "city": "Randolph", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14774, + "latitude": 42.114385, + "longitude": -78.168055, + "city": "Richburg", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14775, + "latitude": 42.230461, + "longitude": -79.42678, + "city": "Ripley", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14777, + "latitude": 42.397363, + "longitude": -78.23233, + "city": "Rushford", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14778, + "latitude": 42.270112, + "longitude": -78.684684, + "city": "Saint Bonaventure", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14779, + "latitude": 42.180526, + "longitude": -78.615625, + "city": "Salamanca", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14781, + "latitude": 42.172076, + "longitude": -79.611348, + "city": "Sherman", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14782, + "latitude": 42.257762, + "longitude": -79.253829, + "city": "Sinclairville", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14783, + "latitude": 42.082001, + "longitude": -78.917738, + "city": "Steamburg", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14784, + "latitude": 42.31514, + "longitude": -79.38833, + "city": "Stockton", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14785, + "latitude": 42.155693, + "longitude": -79.412233, + "city": "Stow", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14786, + "latitude": 42.12267, + "longitude": -78.221332, + "city": "West Clarksville", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14787, + "latitude": 42.253734, + "longitude": -79.484286, + "city": "Westfield", + "state": "NY", + "county": "Chautauqua" + }, + { + "zip_code": 14788, + "latitude": 42.062125, + "longitude": -78.377974, + "city": "Westons Mills", + "state": "NY", + "county": "Cattaraugus" + }, + { + "zip_code": 14801, + "latitude": 42.206391, + "longitude": -77.306185, + "city": "Addison", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14802, + "latitude": 42.240535, + "longitude": -77.783192, + "city": "Alfred", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14803, + "latitude": 42.254097, + "longitude": -77.799317, + "city": "Alfred Station", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14804, + "latitude": 42.313285, + "longitude": -77.851286, + "city": "Almond", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14805, + "latitude": 42.375566, + "longitude": -76.732706, + "city": "Alpine", + "state": "NY", + "county": "Schuyler" + }, + { + "zip_code": 14806, + "latitude": 42.145794, + "longitude": -77.811901, + "city": "Andover", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14807, + "latitude": 42.465145, + "longitude": -77.57387, + "city": "Arkport", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14808, + "latitude": 42.562012, + "longitude": -77.468518, + "city": "Atlanta", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14809, + "latitude": 42.367861, + "longitude": -77.464128, + "city": "Avoca", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14810, + "latitude": 42.357464, + "longitude": -77.302789, + "city": "Bath", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14812, + "latitude": 42.322924, + "longitude": -76.977336, + "city": "Beaver Dams", + "state": "NY", + "county": "Schuyler" + }, + { + "zip_code": 14813, + "latitude": 42.242168, + "longitude": -77.963148, + "city": "Belmont", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14814, + "latitude": 42.156516, + "longitude": -76.93164, + "city": "Big Flats", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14815, + "latitude": 42.369808, + "longitude": -77.235796, + "city": "Bradford", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14816, + "latitude": 42.199631, + "longitude": -76.7312, + "city": "Breesport", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14817, + "latitude": 42.359694, + "longitude": -76.349154, + "city": "Brooktondale", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 14818, + "latitude": 42.464152, + "longitude": -76.798018, + "city": "Burdett", + "state": "NY", + "county": "Schuyler" + }, + { + "zip_code": 14819, + "latitude": 42.211491, + "longitude": -77.453509, + "city": "Cameron", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14820, + "latitude": 42.180046, + "longitude": -77.280502, + "city": "Cameron Mills", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14821, + "latitude": 42.262954, + "longitude": -77.215478, + "city": "Campbell", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14822, + "latitude": 42.422577, + "longitude": -77.835626, + "city": "Canaseraga", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14823, + "latitude": 42.348146, + "longitude": -77.42713, + "city": "Canisteo", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14824, + "latitude": 42.272948, + "longitude": -76.693628, + "city": "Cayuta", + "state": "NY", + "county": "Schuyler" + }, + { + "zip_code": 14825, + "latitude": 42.052426, + "longitude": -76.607029, + "city": "Chemung", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14826, + "latitude": 42.470356, + "longitude": -77.391286, + "city": "Cohocton", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14827, + "latitude": 42.178527, + "longitude": -77.141357, + "city": "Coopers Plains", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14830, + "latitude": 42.120541, + "longitude": -77.048462, + "city": "Corning", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14831, + "latitude": 42.145265, + "longitude": -77.56683, + "city": "Corning", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14836, + "latitude": 42.546164, + "longitude": -77.90021, + "city": "Dalton", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14837, + "latitude": 42.555387, + "longitude": -77.014409, + "city": "Dundee", + "state": "NY", + "county": "Yates" + }, + { + "zip_code": 14838, + "latitude": 42.181224, + "longitude": -76.671949, + "city": "Erin", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14839, + "latitude": 42.143242, + "longitude": -77.562991, + "city": "Greenwood", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14840, + "latitude": 42.322455, + "longitude": -77.198396, + "city": "Hammondsport", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14841, + "latitude": 42.492291, + "longitude": -76.824556, + "city": "Hector", + "state": "NY", + "county": "Schuyler" + }, + { + "zip_code": 14842, + "latitude": 42.577714, + "longitude": -76.96452, + "city": "Himrod", + "state": "NY", + "county": "Yates" + }, + { + "zip_code": 14843, + "latitude": 42.383978, + "longitude": -77.479051, + "city": "Hornell", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14844, + "latitude": 42.160717, + "longitude": -76.878456, + "city": "Horseheads", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14845, + "latitude": 42.21003, + "longitude": -76.836629, + "city": "Horseheads", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14846, + "latitude": 42.555834, + "longitude": -77.999451, + "city": "Hunt", + "state": "NY", + "county": "Livingston" + }, + { + "zip_code": 14847, + "latitude": 42.60844, + "longitude": -76.735556, + "city": "Interlaken", + "state": "NY", + "county": "Seneca" + }, + { + "zip_code": 14850, + "latitude": 42.402794, + "longitude": -76.483999, + "city": "Ithaca", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 14851, + "latitude": 42.460721, + "longitude": -76.505435, + "city": "Ithaca", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 14852, + "latitude": 42.445074, + "longitude": -76.467233, + "city": "Ithaca", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 14853, + "latitude": 42.447373, + "longitude": -76.483703, + "city": "Ithaca", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 14854, + "latitude": 42.50632, + "longitude": -76.608222, + "city": "Jacksonville", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 14855, + "latitude": 42.142197, + "longitude": -77.497908, + "city": "Jasper", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14856, + "latitude": 42.374218, + "longitude": -77.364812, + "city": "Kanona", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14857, + "latitude": 42.512632, + "longitude": -76.927019, + "city": "Lakemont", + "state": "NY", + "county": "Yates" + }, + { + "zip_code": 14858, + "latitude": 42.04507, + "longitude": -77.106679, + "city": "Lindley", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14859, + "latitude": 42.115457, + "longitude": -76.507823, + "city": "Lockwood", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 14860, + "latitude": 42.586029, + "longitude": -76.801671, + "city": "Lodi", + "state": "NY", + "county": "Seneca" + }, + { + "zip_code": 14861, + "latitude": 42.087671, + "longitude": -76.684615, + "city": "Lowman", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14863, + "latitude": 42.451569, + "longitude": -76.706717, + "city": "Mecklenburg", + "state": "NY", + "county": "Schuyler" + }, + { + "zip_code": 14864, + "latitude": 42.259644, + "longitude": -76.842298, + "city": "Millport", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14865, + "latitude": 42.358866, + "longitude": -76.841852, + "city": "Montour Falls", + "state": "NY", + "county": "Schuyler" + }, + { + "zip_code": 14867, + "latitude": 42.365688, + "longitude": -76.610212, + "city": "Newfield", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 14869, + "latitude": 42.377454, + "longitude": -76.77621, + "city": "Odessa", + "state": "NY", + "county": "Schuyler" + }, + { + "zip_code": 14870, + "latitude": 42.159759, + "longitude": -77.382462, + "city": "Painted Post", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14871, + "latitude": 42.047024, + "longitude": -76.882455, + "city": "Pine City", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14872, + "latitude": 42.240529, + "longitude": -76.875072, + "city": "Pine Valley", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14873, + "latitude": 42.38056, + "longitude": -77.354408, + "city": "Prattsburgh", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14874, + "latitude": 42.520261, + "longitude": -77.197141, + "city": "Pulteney", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14876, + "latitude": 42.429721, + "longitude": -76.925846, + "city": "Reading Center", + "state": "NY", + "county": "Schuyler" + }, + { + "zip_code": 14877, + "latitude": 42.071887, + "longitude": -77.677653, + "city": "Rexville", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14878, + "latitude": 42.48015, + "longitude": -76.946931, + "city": "Rock Stream", + "state": "NY", + "county": "Yates" + }, + { + "zip_code": 14879, + "latitude": 42.327262, + "longitude": -77.193204, + "city": "Savona", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14880, + "latitude": 42.16615, + "longitude": -77.965672, + "city": "Scio", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14881, + "latitude": 42.402463, + "longitude": -76.360782, + "city": "Slaterville Springs", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 14882, + "latitude": 42.573453, + "longitude": -76.552378, + "city": "Lansing", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 14883, + "latitude": 42.203102, + "longitude": -76.471165, + "city": "Spencer", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 14884, + "latitude": 42.455859, + "longitude": -77.889425, + "city": "Swain", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14885, + "latitude": 42.060366, + "longitude": -77.562142, + "city": "Troupsburg", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14886, + "latitude": 42.4803, + "longitude": -76.635158, + "city": "Trumansburg", + "state": "NY", + "county": "Tompkins" + }, + { + "zip_code": 14887, + "latitude": 42.399371, + "longitude": -77.026768, + "city": "Tyrone", + "state": "NY", + "county": "Schuyler" + }, + { + "zip_code": 14889, + "latitude": 42.210223, + "longitude": -76.585084, + "city": "Van Etten", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14891, + "latitude": 42.37285, + "longitude": -76.927135, + "city": "Watkins Glen", + "state": "NY", + "county": "Schuyler" + }, + { + "zip_code": 14892, + "latitude": 42.107825, + "longitude": -76.502218, + "city": "Waverly", + "state": "NY", + "county": "Tioga" + }, + { + "zip_code": 14893, + "latitude": 42.474143, + "longitude": -77.097713, + "city": "Wayne", + "state": "NY", + "county": "Schuyler" + }, + { + "zip_code": 14894, + "latitude": 42.027102, + "longitude": -76.764516, + "city": "Wellsburg", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14895, + "latitude": 42.230956, + "longitude": -77.917245, + "city": "Wellsville", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14897, + "latitude": 42.050965, + "longitude": -77.821349, + "city": "Whitesville", + "state": "NY", + "county": "Allegany" + }, + { + "zip_code": 14898, + "latitude": 42.069469, + "longitude": -77.438058, + "city": "Woodhull", + "state": "NY", + "county": "Steuben" + }, + { + "zip_code": 14901, + "latitude": 42.082585, + "longitude": -76.71857, + "city": "Elmira", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14902, + "latitude": 42.147285, + "longitude": -76.750888, + "city": "Elmira", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14903, + "latitude": 42.119824, + "longitude": -76.887659, + "city": "Elmira", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14904, + "latitude": 42.061824, + "longitude": -76.823678, + "city": "Elmira", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14905, + "latitude": 42.093574, + "longitude": -76.844329, + "city": "Elmira", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 14925, + "latitude": 42.147285, + "longitude": -76.750888, + "city": "Elmira", + "state": "NY", + "county": "Chemung" + }, + { + "zip_code": 15001, + "latitude": 40.675225, + "longitude": -80.304178, + "city": "Aliquippa", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15003, + "latitude": 40.600494, + "longitude": -80.210521, + "city": "Ambridge", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15004, + "latitude": 40.341349, + "longitude": -80.382247, + "city": "Atlasburg", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15005, + "latitude": 40.618418, + "longitude": -80.204103, + "city": "Baden", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15006, + "latitude": 40.493128, + "longitude": -79.903121, + "city": "Bairdford", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15007, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Bakerstown", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15009, + "latitude": 40.729053, + "longitude": -80.385191, + "city": "Beaver", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15010, + "latitude": 40.665672, + "longitude": -80.352049, + "city": "Beaver Falls", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15012, + "latitude": 40.070268, + "longitude": -79.603426, + "city": "Belle Vernon", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15014, + "latitude": 40.272101, + "longitude": -79.899562, + "city": "Brackenridge", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15015, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Bradfordwoods", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15017, + "latitude": 40.354589, + "longitude": -80.091342, + "city": "Bridgeville", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15018, + "latitude": 40.457657, + "longitude": -80.208374, + "city": "Buena Vista", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15019, + "latitude": 40.412663, + "longitude": -80.317007, + "city": "Bulger", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15020, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Bunola", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15021, + "latitude": 40.382141, + "longitude": -80.404366, + "city": "Burgettstown", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15022, + "latitude": 40.135834, + "longitude": -79.932907, + "city": "Charleroi", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15024, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Cheswick", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15025, + "latitude": 40.324279, + "longitude": -79.931735, + "city": "Clairton", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15026, + "latitude": 40.490003, + "longitude": -80.290333, + "city": "Clinton", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15027, + "latitude": 40.699515, + "longitude": -80.264683, + "city": "Conway", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15028, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Coulters", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15030, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Creighton", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15031, + "latitude": 40.354712, + "longitude": -80.166906, + "city": "Cuddy", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15032, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Curtisville", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15033, + "latitude": 40.179896, + "longitude": -79.868392, + "city": "Donora", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15034, + "latitude": 40.315793, + "longitude": -79.892171, + "city": "Dravosburg", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15035, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "East Mc Keesport", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15036, + "latitude": 40.214896, + "longitude": -80.179139, + "city": "Eldersville", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15037, + "latitude": 40.271965, + "longitude": -79.896642, + "city": "Elizabeth", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15038, + "latitude": 40.252086, + "longitude": -79.925235, + "city": "Elrama", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15042, + "latitude": 40.710283, + "longitude": -80.240559, + "city": "Freedom", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15043, + "latitude": 40.639461, + "longitude": -80.339953, + "city": "Georgetown", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15044, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Gibsonia", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15045, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Glassport", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15046, + "latitude": 40.468068, + "longitude": -80.123459, + "city": "Crescent", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15047, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Greenock", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15049, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Harwick", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15050, + "latitude": 40.554305, + "longitude": -80.428223, + "city": "Hookstown", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15051, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Indianola", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15052, + "latitude": 40.702397, + "longitude": -80.388271, + "city": "Industry", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15053, + "latitude": 40.380036, + "longitude": -80.360544, + "city": "Joffre", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15054, + "latitude": 40.362515, + "longitude": -80.408551, + "city": "Langeloth", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15055, + "latitude": 40.305838, + "longitude": -80.121904, + "city": "Lawrence", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15056, + "latitude": 40.375069, + "longitude": -80.015425, + "city": "Leetsdale", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15057, + "latitude": 40.359139, + "longitude": -80.267451, + "city": "Mc Donald", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15059, + "latitude": 40.740063, + "longitude": -80.397486, + "city": "Midland", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15060, + "latitude": 40.368121, + "longitude": -80.289382, + "city": "Midway", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15061, + "latitude": 40.656366, + "longitude": -80.327814, + "city": "Monaca", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15062, + "latitude": 40.361852, + "longitude": -79.75128, + "city": "Monessen", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15063, + "latitude": 40.260001, + "longitude": -80.124442, + "city": "Monongahela", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15064, + "latitude": 40.355865, + "longitude": -80.14155, + "city": "Morgan", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15065, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Natrona Heights", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15066, + "latitude": 40.712175, + "longitude": -80.321773, + "city": "New Brighton", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15067, + "latitude": 40.282786, + "longitude": -80.173907, + "city": "New Eagle", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15068, + "latitude": 40.478821, + "longitude": -79.581506, + "city": "New Kensington", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15069, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "New Kensington", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15071, + "latitude": 40.403348, + "longitude": -80.184169, + "city": "Oakdale", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15072, + "latitude": 40.139296, + "longitude": -79.856168, + "city": "Pricedale", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15074, + "latitude": 40.686473, + "longitude": -80.326538, + "city": "Rochester", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15075, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Rural Ridge", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15076, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Russellton", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15077, + "latitude": 40.602535, + "longitude": -80.386344, + "city": "Shippingport", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15078, + "latitude": 40.358435, + "longitude": -80.387917, + "city": "Slovan", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15081, + "latitude": 40.576267, + "longitude": -80.238332, + "city": "South Heights", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 15082, + "latitude": 40.386263, + "longitude": -80.208316, + "city": "Sturgeon", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15083, + "latitude": 40.22559, + "longitude": -79.751605, + "city": "Sutersville", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15084, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Tarentum", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15085, + "latitude": 40.382668, + "longitude": -79.594643, + "city": "Trafford", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15086, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Warrendale", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15087, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Webster", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15088, + "latitude": 40.271597, + "longitude": -79.89661, + "city": "West Elizabeth", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15089, + "latitude": 40.201808, + "longitude": -79.727237, + "city": "West Newton", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15090, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Wexford", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15091, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Wildwood", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15095, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Warrendale", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15096, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Warrendale", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15101, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Allison Park", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15102, + "latitude": 40.371471, + "longitude": -80.11595, + "city": "Bethel Park", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15104, + "latitude": 40.366287, + "longitude": -79.858359, + "city": "Braddock", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15106, + "latitude": 40.44908, + "longitude": -80.103165, + "city": "Carnegie", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15108, + "latitude": 40.469268, + "longitude": -80.140228, + "city": "Coraopolis", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15110, + "latitude": 40.372069, + "longitude": -79.85382, + "city": "Duquesne", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15112, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "East Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15116, + "latitude": 40.357719, + "longitude": -79.979974, + "city": "Glenshaw", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15120, + "latitude": 40.392619, + "longitude": -79.905171, + "city": "Homestead", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15122, + "latitude": 40.360575, + "longitude": -79.908621, + "city": "West Mifflin", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15123, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "West Mifflin", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15126, + "latitude": 40.452644, + "longitude": -80.128852, + "city": "Imperial", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15127, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Ingomar", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15129, + "latitude": 40.303119, + "longitude": -79.997567, + "city": "South Park", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15130, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Mc Keesport", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15131, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Mc Keesport", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15132, + "latitude": 40.407269, + "longitude": -80.048026, + "city": "Mc Keesport", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15133, + "latitude": 40.323419, + "longitude": -79.940172, + "city": "Mc Keesport", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15134, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Mc Keesport", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15135, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Mc Keesport", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15136, + "latitude": 40.467006, + "longitude": -80.103669, + "city": "Mc Kees Rocks", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15137, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "North Versailles", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15139, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Oakmont", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15140, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pitcairn", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15142, + "latitude": 40.402452, + "longitude": -80.166896, + "city": "Presto", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15143, + "latitude": 40.451367, + "longitude": -80.20828, + "city": "Sewickley", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15144, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Springdale", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15145, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Turtle Creek", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15146, + "latitude": 40.548117, + "longitude": -80.236882, + "city": "Monroeville", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15147, + "latitude": 40.351469, + "longitude": -80.011574, + "city": "Verona", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15148, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Wilmerding", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15189, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Sewickley", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15201, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15202, + "latitude": 40.328598, + "longitude": -79.949182, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15203, + "latitude": 40.425369, + "longitude": -79.979914, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15204, + "latitude": 40.455368, + "longitude": -80.064416, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15205, + "latitude": 40.432205, + "longitude": -80.102101, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15206, + "latitude": 40.416419, + "longitude": -80.075427, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15207, + "latitude": 40.356169, + "longitude": -79.982123, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15208, + "latitude": 40.519017, + "longitude": -80.16608, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15209, + "latitude": 40.392719, + "longitude": -80.042375, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15210, + "latitude": 40.419662, + "longitude": -80.027243, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15211, + "latitude": 40.429519, + "longitude": -80.014375, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15212, + "latitude": 40.428169, + "longitude": -80.074977, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15213, + "latitude": 40.423069, + "longitude": -79.980624, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15214, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15215, + "latitude": 40.377569, + "longitude": -79.994074, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15216, + "latitude": 40.400091, + "longitude": -80.046176, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15217, + "latitude": 40.385219, + "longitude": -80.054876, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15218, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15219, + "latitude": 40.375351, + "longitude": -80.017075, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15220, + "latitude": 40.418119, + "longitude": -80.052576, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15221, + "latitude": 40.414611, + "longitude": -80.043342, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15222, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15223, + "latitude": 40.457418, + "longitude": -80.044926, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15224, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15225, + "latitude": 40.505118, + "longitude": -80.115528, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15226, + "latitude": 40.40014, + "longitude": -80.016074, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15227, + "latitude": 40.380519, + "longitude": -79.966723, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15228, + "latitude": 40.369569, + "longitude": -80.043925, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15229, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15230, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15231, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15232, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15233, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15234, + "latitude": 40.368819, + "longitude": -80.022399, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15235, + "latitude": 40.398608, + "longitude": -80.000854, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15236, + "latitude": 40.33514, + "longitude": -79.983243, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15237, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15238, + "latitude": 40.380019, + "longitude": -80.006474, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15239, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15240, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15241, + "latitude": 40.332266, + "longitude": -80.081026, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15242, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15243, + "latitude": 40.384169, + "longitude": -80.072876, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15244, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15250, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15251, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15252, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15253, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15254, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15255, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15257, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15258, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15259, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15260, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15261, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15262, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15263, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15264, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15265, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15266, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15267, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15268, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15270, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15272, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15274, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15275, + "latitude": 40.44952, + "longitude": -80.179475, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15276, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15277, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15278, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15279, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15281, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15282, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15283, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15285, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15286, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15290, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15295, + "latitude": 40.434436, + "longitude": -80.024817, + "city": "Pittsburgh", + "state": "PA", + "county": "Allegheny" + }, + { + "zip_code": 15301, + "latitude": 40.135391, + "longitude": -80.146709, + "city": "Washington", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15310, + "latitude": 39.870635, + "longitude": -80.211335, + "city": "Aleppo", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15311, + "latitude": 40.049765, + "longitude": -80.168133, + "city": "Amity", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15312, + "latitude": 40.200737, + "longitude": -80.267148, + "city": "Avella", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15313, + "latitude": 40.065496, + "longitude": -80.022102, + "city": "Beallsville", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15314, + "latitude": 40.153459, + "longitude": -80.083967, + "city": "Bentleyville", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15315, + "latitude": 39.817048, + "longitude": -79.956728, + "city": "Bobtown", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15316, + "latitude": 39.870635, + "longitude": -80.211335, + "city": "Brave", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15317, + "latitude": 40.155704, + "longitude": -80.12842, + "city": "Canonsburg", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15320, + "latitude": 39.918913, + "longitude": -79.98532, + "city": "Carmichaels", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15321, + "latitude": 40.159268, + "longitude": -80.104193, + "city": "Cecil", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15322, + "latitude": 39.966702, + "longitude": -80.045233, + "city": "Clarksville", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15323, + "latitude": 40.11016, + "longitude": -80.251693, + "city": "Claysville", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15324, + "latitude": 40.050163, + "longitude": -79.98324, + "city": "Cokeburg", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15325, + "latitude": 39.95017, + "longitude": -79.967626, + "city": "Crucible", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15327, + "latitude": 39.764089, + "longitude": -79.937419, + "city": "Dilliner", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15329, + "latitude": 40.049949, + "longitude": -80.28121, + "city": "Prosperity", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15330, + "latitude": 40.17557, + "longitude": -80.099336, + "city": "Eighty Four", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15331, + "latitude": 40.106824, + "longitude": -80.021614, + "city": "Ellsworth", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15332, + "latitude": 40.19897, + "longitude": -80.059974, + "city": "Finleyville", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15333, + "latitude": 40.025105, + "longitude": -80.011741, + "city": "Fredericktown", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15334, + "latitude": 39.870635, + "longitude": -80.211335, + "city": "Garards Fort", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15336, + "latitude": 40.260141, + "longitude": -79.992678, + "city": "Gastonville", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15337, + "latitude": 39.937962, + "longitude": -80.001496, + "city": "Graysville", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15338, + "latitude": 39.820941, + "longitude": -79.974551, + "city": "Greensboro", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15339, + "latitude": 40.301838, + "longitude": -80.15431, + "city": "Hendersonville", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15340, + "latitude": 40.226863, + "longitude": -80.169026, + "city": "Hickory", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15341, + "latitude": 39.870635, + "longitude": -80.211335, + "city": "Holbrook", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15342, + "latitude": 40.133091, + "longitude": -80.133451, + "city": "Houston", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15344, + "latitude": 39.870635, + "longitude": -80.211335, + "city": "Jefferson", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15345, + "latitude": 40.028432, + "longitude": -80.104213, + "city": "Marianna", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15346, + "latitude": 39.934662, + "longitude": -80.070275, + "city": "Mather", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15347, + "latitude": 40.217358, + "longitude": -80.226885, + "city": "Meadow Lands", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15348, + "latitude": 39.987651, + "longitude": -80.003686, + "city": "Millsboro", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15349, + "latitude": 39.774031, + "longitude": -80.024576, + "city": "Mount Morris", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15350, + "latitude": 40.293731, + "longitude": -80.200484, + "city": "Muse", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15351, + "latitude": 39.877901, + "longitude": -79.925807, + "city": "Nemacolin", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15352, + "latitude": 39.870635, + "longitude": -80.211335, + "city": "New Freeport", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15353, + "latitude": 39.870635, + "longitude": -80.211335, + "city": "Nineveh", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15354, + "latitude": 39.870635, + "longitude": -80.211335, + "city": "Pine Bank", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15357, + "latitude": 39.95437, + "longitude": -79.990431, + "city": "Rices Landing", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15358, + "latitude": 40.056347, + "longitude": -79.992554, + "city": "Richeyville", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15359, + "latitude": 39.870635, + "longitude": -80.211335, + "city": "Rogersville", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15360, + "latitude": 40.092344, + "longitude": -80.099457, + "city": "Scenery Hill", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15361, + "latitude": 40.32819, + "longitude": -80.256291, + "city": "Southview", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15362, + "latitude": 39.744657, + "longitude": -80.214471, + "city": "Spraggs", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15363, + "latitude": 40.250454, + "longitude": -80.198354, + "city": "Strabane", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15364, + "latitude": 39.870635, + "longitude": -80.211335, + "city": "Sycamore", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15365, + "latitude": 40.16113, + "longitude": -80.378093, + "city": "Taylorstown", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15366, + "latitude": 40.110068, + "longitude": -80.031787, + "city": "Van Voorhis", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15367, + "latitude": 40.244339, + "longitude": -80.247797, + "city": "Venetia", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15368, + "latitude": 40.023775, + "longitude": -80.007731, + "city": "Vestaburg", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15370, + "latitude": 39.87477, + "longitude": -80.08057, + "city": "Waynesburg", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15376, + "latitude": 40.128081, + "longitude": -80.270231, + "city": "West Alexander", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15377, + "latitude": 40.024677, + "longitude": -80.429726, + "city": "West Finley", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15378, + "latitude": 40.277534, + "longitude": -80.27313, + "city": "Westland", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15379, + "latitude": 40.241731, + "longitude": -80.424154, + "city": "West Middletown", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15380, + "latitude": 39.909365, + "longitude": -80.43004, + "city": "Wind Ridge", + "state": "PA", + "county": "Greene" + }, + { + "zip_code": 15401, + "latitude": 39.944884, + "longitude": -79.770063, + "city": "Uniontown", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15410, + "latitude": 39.912105, + "longitude": -79.89636, + "city": "Adah", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15411, + "latitude": 39.752401, + "longitude": -79.330768, + "city": "Addison", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15412, + "latitude": 40.095888, + "longitude": -79.849887, + "city": "Allenport", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15413, + "latitude": 39.986828, + "longitude": -79.863732, + "city": "Allison", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15415, + "latitude": 39.980787, + "longitude": -79.850366, + "city": "Brier Hill", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15416, + "latitude": 39.932084, + "longitude": -79.65217, + "city": "Brownfield", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15417, + "latitude": 39.921613, + "longitude": -79.690472, + "city": "Brownsville", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15419, + "latitude": 40.068921, + "longitude": -79.873163, + "city": "California", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15420, + "latitude": 39.932084, + "longitude": -79.65217, + "city": "Cardale", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15421, + "latitude": 39.845088, + "longitude": -79.599126, + "city": "Chalk Hill", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15422, + "latitude": 39.992254, + "longitude": -79.817083, + "city": "Chestnut Ridge", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15423, + "latitude": 40.082192, + "longitude": -79.930266, + "city": "Coal Center", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15424, + "latitude": 39.824325, + "longitude": -79.306409, + "city": "Confluence", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15425, + "latitude": 40.00743, + "longitude": -79.700949, + "city": "Connellsville", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15427, + "latitude": 40.065064, + "longitude": -79.973302, + "city": "Daisytown", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15428, + "latitude": 39.983001, + "longitude": -79.725516, + "city": "Dawson", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15429, + "latitude": 40.008082, + "longitude": -79.939234, + "city": "Denbo", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15430, + "latitude": 40.041785, + "longitude": -79.659978, + "city": "Dickerson Run", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15431, + "latitude": 39.949088, + "longitude": -79.723151, + "city": "Dunbar", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15432, + "latitude": 40.099693, + "longitude": -79.85968, + "city": "Dunlevy", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15433, + "latitude": 39.973512, + "longitude": -79.704535, + "city": "East Millsboro", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15434, + "latitude": 40.080438, + "longitude": -79.875826, + "city": "Elco", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15435, + "latitude": 39.950123, + "longitude": -79.858471, + "city": "Fairbank", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15436, + "latitude": 39.954424, + "longitude": -79.808073, + "city": "Fairchance", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15437, + "latitude": 39.79741, + "longitude": -79.596769, + "city": "Farmington", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15438, + "latitude": 40.066729, + "longitude": -79.844514, + "city": "Fayette City", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15439, + "latitude": 39.771324, + "longitude": -79.635842, + "city": "Gans", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15440, + "latitude": 39.757751, + "longitude": -79.628365, + "city": "Gibbon Glade", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15442, + "latitude": 40.015516, + "longitude": -79.843978, + "city": "Grindstone", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15443, + "latitude": 39.926347, + "longitude": -79.901324, + "city": "Hibbs", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15444, + "latitude": 40.05656, + "longitude": -79.902101, + "city": "Hiller", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15445, + "latitude": 39.876835, + "longitude": -79.671812, + "city": "Hopwood", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15446, + "latitude": 40.037453, + "longitude": -79.377806, + "city": "Indian Head", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15447, + "latitude": 39.945987, + "longitude": -79.939317, + "city": "Isabella", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15448, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Jacobs Creek", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15449, + "latitude": 39.963622, + "longitude": -79.785349, + "city": "Keisterville", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15450, + "latitude": 39.998279, + "longitude": -79.975391, + "city": "La Belle", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15451, + "latitude": 39.742861, + "longitude": -79.854871, + "city": "Lake Lynn", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15454, + "latitude": 39.932084, + "longitude": -79.65217, + "city": "Leckrone", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15455, + "latitude": 39.998536, + "longitude": -79.643451, + "city": "Leisenring", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15456, + "latitude": 39.877276, + "longitude": -79.805549, + "city": "Lemont Furnace", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15458, + "latitude": 39.888242, + "longitude": -79.869352, + "city": "Mc Clellandtown", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15459, + "latitude": 39.822431, + "longitude": -79.529731, + "city": "Markleysburg", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15460, + "latitude": 39.932084, + "longitude": -79.65217, + "city": "Martin", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15461, + "latitude": 39.94577, + "longitude": -79.681838, + "city": "Masontown", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15462, + "latitude": 40.05974, + "longitude": -79.381435, + "city": "Melcroft", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15463, + "latitude": 39.882521, + "longitude": -79.833585, + "city": "Merrittstown", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15464, + "latitude": 39.933738, + "longitude": -79.432647, + "city": "Mill Run", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15465, + "latitude": 39.932084, + "longitude": -79.65217, + "city": "Mount Braddock", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15466, + "latitude": 40.075064, + "longitude": -79.894347, + "city": "Newell", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15467, + "latitude": 39.932084, + "longitude": -79.65217, + "city": "New Geneva", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15468, + "latitude": 39.941838, + "longitude": -79.841031, + "city": "New Salem", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15469, + "latitude": 40.00786, + "longitude": -79.438215, + "city": "Normalville", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15470, + "latitude": 39.850675, + "longitude": -79.523004, + "city": "Ohiopyle", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15472, + "latitude": 39.918319, + "longitude": -79.715837, + "city": "Oliver", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15473, + "latitude": 40.064564, + "longitude": -79.775594, + "city": "Perryopolis", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15474, + "latitude": 39.911834, + "longitude": -79.71174, + "city": "Point Marion", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15475, + "latitude": 39.984667, + "longitude": -79.881421, + "city": "Republic", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15476, + "latitude": 39.879384, + "longitude": -79.916806, + "city": "Ronco", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15477, + "latitude": 40.080713, + "longitude": -79.862734, + "city": "Roscoe", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15478, + "latitude": 39.92959, + "longitude": -79.698875, + "city": "Smithfield", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15479, + "latitude": 40.155299, + "longitude": -79.738092, + "city": "Smithton", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15480, + "latitude": 39.988339, + "longitude": -79.771265, + "city": "Smock", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15482, + "latitude": 40.065106, + "longitude": -79.769027, + "city": "Star Junction", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15483, + "latitude": 40.038498, + "longitude": -79.920937, + "city": "Stockdale", + "state": "PA", + "county": "Washington" + }, + { + "zip_code": 15484, + "latitude": 39.893625, + "longitude": -79.785642, + "city": "Uledi", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15485, + "latitude": 39.817346, + "longitude": -79.330642, + "city": "Ursina", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15486, + "latitude": 40.010683, + "longitude": -79.750787, + "city": "Vanderbilt", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15488, + "latitude": 39.976316, + "longitude": -79.768901, + "city": "Waltersburg", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15489, + "latitude": 39.956056, + "longitude": -79.700745, + "city": "West Leisenring", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15490, + "latitude": 40.075857, + "longitude": -79.452796, + "city": "White", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15492, + "latitude": 40.117828, + "longitude": -79.771797, + "city": "Wickhaven", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15501, + "latitude": 39.990045, + "longitude": -79.08745, + "city": "Somerset", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15502, + "latitude": 40.046023, + "longitude": -79.258458, + "city": "Hidden Valley", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15510, + "latitude": 39.963306, + "longitude": -79.04089, + "city": "Somerset", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15520, + "latitude": 40.113021, + "longitude": -79.070218, + "city": "Acosta", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15521, + "latitude": 40.198627, + "longitude": -78.622801, + "city": "Alum Bank", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 15522, + "latitude": 39.95464, + "longitude": -78.574759, + "city": "Bedford", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 15530, + "latitude": 39.942768, + "longitude": -78.981234, + "city": "Berlin", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15531, + "latitude": 40.006392, + "longitude": -78.989292, + "city": "Boswell", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15532, + "latitude": 39.767296, + "longitude": -79.062012, + "city": "Boynton", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15533, + "latitude": 39.98344, + "longitude": -78.251177, + "city": "Breezewood", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 15534, + "latitude": 39.864251, + "longitude": -78.674197, + "city": "Buffalo Mills", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 15535, + "latitude": 39.839294, + "longitude": -78.469881, + "city": "Clearville", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 15536, + "latitude": 39.943762, + "longitude": -78.122265, + "city": "Crystal Spring", + "state": "PA", + "county": "Fulton" + }, + { + "zip_code": 15537, + "latitude": 39.966962, + "longitude": -78.458753, + "city": "Everett", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 15538, + "latitude": 39.945164, + "longitude": -78.954581, + "city": "Fairhope", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15539, + "latitude": 40.130173, + "longitude": -78.591457, + "city": "Fishertown", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 15540, + "latitude": 39.796137, + "longitude": -79.247161, + "city": "Fort Hill", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15541, + "latitude": 40.085382, + "longitude": -78.963508, + "city": "Friedens", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15542, + "latitude": 39.8659, + "longitude": -79.074705, + "city": "Garrett", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15544, + "latitude": 40.137749, + "longitude": -79.092551, + "city": "Gray", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15545, + "latitude": 39.886506, + "longitude": -78.712775, + "city": "Hyndman", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 15546, + "latitude": 40.145938, + "longitude": -79.067583, + "city": "Jenners", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15547, + "latitude": 40.1595, + "longitude": -79.061629, + "city": "Jennerstown", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15548, + "latitude": 40.101106, + "longitude": -78.938653, + "city": "Kantner", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15549, + "latitude": 40.020764, + "longitude": -79.012306, + "city": "Listie", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15550, + "latitude": 39.902488, + "longitude": -78.658195, + "city": "Manns Choice", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 15551, + "latitude": 39.887287, + "longitude": -79.254694, + "city": "Markleton", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15552, + "latitude": 39.875014, + "longitude": -79.038599, + "city": "Meyersdale", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15553, + "latitude": 39.982795, + "longitude": -78.771929, + "city": "New Baltimore", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15554, + "latitude": 39.981413, + "longitude": -78.611595, + "city": "New Paris", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 15555, + "latitude": 40.091429, + "longitude": -79.087198, + "city": "Quecreek", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15557, + "latitude": 39.955145, + "longitude": -79.141476, + "city": "Rockwood", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15558, + "latitude": 39.941261, + "longitude": -79.083318, + "city": "Salisbury", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15559, + "latitude": 40.057047, + "longitude": -78.642513, + "city": "Schellsburg", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 15560, + "latitude": 40.017059, + "longitude": -78.907682, + "city": "Shanksville", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15561, + "latitude": 40.096406, + "longitude": -79.090158, + "city": "Sipesville", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15562, + "latitude": 39.74802, + "longitude": -79.123732, + "city": "Springs", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15563, + "latitude": 40.094802, + "longitude": -78.965817, + "city": "Stoystown", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15564, + "latitude": 39.729896, + "longitude": -78.844105, + "city": "Wellersburg", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15565, + "latitude": 40.003476, + "longitude": -79.037983, + "city": "West Salisbury", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15601, + "latitude": 40.347017, + "longitude": -79.500729, + "city": "Greensburg", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15605, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Greensburg", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15606, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Greensburg", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15610, + "latitude": 40.120149, + "longitude": -79.405069, + "city": "Acme", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15611, + "latitude": 40.303771, + "longitude": -79.653058, + "city": "Adamsburg", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15612, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Alverton", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15613, + "latitude": 40.436827, + "longitude": -79.617178, + "city": "Apollo", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15615, + "latitude": 40.360619, + "longitude": -79.743317, + "city": "Ardara", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15616, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Armbrust", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15617, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Arona", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15618, + "latitude": 40.497049, + "longitude": -79.489055, + "city": "Avonmore", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15619, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Bovard", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15620, + "latitude": 40.323845, + "longitude": -79.343421, + "city": "Bradenville", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15621, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Calumet", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15622, + "latitude": 40.190193, + "longitude": -79.30196, + "city": "Champion", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15623, + "latitude": 40.36921, + "longitude": -79.619012, + "city": "Claridge", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15624, + "latitude": 40.357753, + "longitude": -79.484028, + "city": "Crabtree", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15625, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Darragh", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15626, + "latitude": 40.36131, + "longitude": -79.571423, + "city": "Delmont", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15627, + "latitude": 40.350227, + "longitude": -79.402056, + "city": "Derry", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15628, + "latitude": 40.102807, + "longitude": -79.377008, + "city": "Donegal", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15629, + "latitude": 40.598047, + "longitude": -79.562383, + "city": "East Vandergrift", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15630, + "latitude": 40.847829, + "longitude": -79.451575, + "city": "Edmon", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 15631, + "latitude": 40.084517, + "longitude": -79.590529, + "city": "Everson", + "state": "PA", + "county": "Fayette" + }, + { + "zip_code": 15632, + "latitude": 40.429723, + "longitude": -79.634789, + "city": "Export", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15633, + "latitude": 40.357548, + "longitude": -79.522546, + "city": "Forbes Road", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15634, + "latitude": 40.308892, + "longitude": -79.66542, + "city": "Grapeville", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15635, + "latitude": 40.352037, + "longitude": -79.49789, + "city": "Hannastown", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15636, + "latitude": 40.36602, + "longitude": -79.656525, + "city": "Harrison City", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15637, + "latitude": 40.266168, + "longitude": -79.56779, + "city": "Herminie", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15638, + "latitude": 40.26106, + "longitude": -79.14313, + "city": "Hostetter", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15639, + "latitude": 40.328617, + "longitude": -79.624473, + "city": "Hunker", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15640, + "latitude": 40.225086, + "longitude": -79.732805, + "city": "Hutchinson", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15641, + "latitude": 40.628165, + "longitude": -79.595648, + "city": "Hyde Park", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15642, + "latitude": 40.36502, + "longitude": -79.58406, + "city": "Irwin", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15644, + "latitude": 40.374572, + "longitude": -79.407913, + "city": "Jeannette", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15646, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Jones Mills", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15647, + "latitude": 40.341519, + "longitude": -79.727216, + "city": "Larimer", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15650, + "latitude": 40.35577, + "longitude": -79.421969, + "city": "Latrobe", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15655, + "latitude": 40.231409, + "longitude": -79.171459, + "city": "Laughlintown", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15656, + "latitude": 40.63896, + "longitude": -79.610962, + "city": "Leechburg", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 15658, + "latitude": 40.271322, + "longitude": -79.251145, + "city": "Ligonier", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15660, + "latitude": 40.248798, + "longitude": -79.764638, + "city": "Lowber", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15661, + "latitude": 40.286515, + "longitude": -79.513433, + "city": "Loyalhanna", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15662, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Luxor", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15663, + "latitude": 40.24397, + "longitude": -79.676516, + "city": "Madison", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15664, + "latitude": 40.310772, + "longitude": -79.617187, + "city": "Mammoth", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15665, + "latitude": 40.292194, + "longitude": -79.664868, + "city": "Manor", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15666, + "latitude": 40.202211, + "longitude": -79.609982, + "city": "Mount Pleasant", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15668, + "latitude": 40.423293, + "longitude": -79.663288, + "city": "Murrysville", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15670, + "latitude": 40.396655, + "longitude": -79.444008, + "city": "New Alexandria", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15671, + "latitude": 40.349446, + "longitude": -79.322549, + "city": "New Derry", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15672, + "latitude": 40.24375, + "longitude": -79.658436, + "city": "New Stanton", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15673, + "latitude": 40.593035, + "longitude": -79.558098, + "city": "North Apollo", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 15674, + "latitude": 40.216006, + "longitude": -79.487239, + "city": "Norvelt", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15675, + "latitude": 40.314908, + "longitude": -79.681435, + "city": "Penn", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15676, + "latitude": 40.242429, + "longitude": -79.454212, + "city": "Pleasant Unity", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15677, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Rector", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15678, + "latitude": 40.282843, + "longitude": -79.723278, + "city": "Rillton", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15679, + "latitude": 40.226934, + "longitude": -79.673364, + "city": "Ruffs Dale", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15680, + "latitude": 40.518905, + "longitude": -79.495871, + "city": "Salina", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15681, + "latitude": 40.542875, + "longitude": -79.397809, + "city": "Saltsburg", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15682, + "latitude": 40.847829, + "longitude": -79.451575, + "city": "Schenley", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 15683, + "latitude": 40.35535, + "longitude": -79.520544, + "city": "Scottdale", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15684, + "latitude": 40.46037, + "longitude": -79.515628, + "city": "Slickville", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15685, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Southwest", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15686, + "latitude": 40.616816, + "longitude": -79.479833, + "city": "Spring Church", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 15687, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Stahlstown", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15688, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Tarrs", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15689, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "United", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15690, + "latitude": 40.400412, + "longitude": -79.546855, + "city": "Vandergrift", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15691, + "latitude": 40.294021, + "longitude": -79.686626, + "city": "Wendel", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15692, + "latitude": 40.329386, + "longitude": -79.680567, + "city": "Westmoreland City", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15693, + "latitude": 40.248274, + "longitude": -79.408579, + "city": "Whitney", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15695, + "latitude": 40.196199, + "longitude": -79.694244, + "city": "Wyano", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15696, + "latitude": 40.279337, + "longitude": -79.366066, + "city": "Youngstown", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15697, + "latitude": 40.240536, + "longitude": -79.505889, + "city": "Youngwood", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15698, + "latitude": 40.222685, + "longitude": -79.691067, + "city": "Yukon", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15701, + "latitude": 40.621272, + "longitude": -79.080422, + "city": "Indiana", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15705, + "latitude": 40.640031, + "longitude": -79.129445, + "city": "Indiana", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15710, + "latitude": 40.633313, + "longitude": -78.872314, + "city": "Alverda", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15711, + "latitude": 41.171119, + "longitude": -78.913113, + "city": "Anita", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15712, + "latitude": 40.781719, + "longitude": -78.853612, + "city": "Arcadia", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15713, + "latitude": 40.61927, + "longitude": -79.083982, + "city": "Aultman", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15714, + "latitude": 40.658721, + "longitude": -78.794582, + "city": "Northern Cambria", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15715, + "latitude": 40.970448, + "longitude": -78.875799, + "city": "Big Run", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15716, + "latitude": 40.483646, + "longitude": -79.206322, + "city": "Black Lick", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15717, + "latitude": 40.486445, + "longitude": -79.195766, + "city": "Blairsville", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15720, + "latitude": 40.529238, + "longitude": -79.0846, + "city": "Brush Valley", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15721, + "latitude": 41.054375, + "longitude": -78.41095, + "city": "Burnside", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 15722, + "latitude": 40.583025, + "longitude": -78.728455, + "city": "Carrolltown", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15723, + "latitude": 40.705639, + "longitude": -79.16151, + "city": "Chambersville", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15724, + "latitude": 40.724976, + "longitude": -78.860324, + "city": "Cherry Tree", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15725, + "latitude": 40.632813, + "longitude": -79.132551, + "city": "Clarksburg", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15727, + "latitude": 40.55027, + "longitude": -79.323745, + "city": "Clune", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15728, + "latitude": 40.748901, + "longitude": -78.997726, + "city": "Clymer", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15729, + "latitude": 40.706462, + "longitude": -78.924401, + "city": "Commodore", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15730, + "latitude": 40.967066, + "longitude": -78.925563, + "city": "Coolspring", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15731, + "latitude": 40.498602, + "longitude": -79.173892, + "city": "Coral", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15732, + "latitude": 40.661336, + "longitude": -79.217127, + "city": "Creekside", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15733, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "De Lancey", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15734, + "latitude": 40.718817, + "longitude": -78.979489, + "city": "Dixonville", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15736, + "latitude": 40.692153, + "longitude": -79.34218, + "city": "Elderton", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 15737, + "latitude": 40.607635, + "longitude": -78.752415, + "city": "Elmora", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15738, + "latitude": 40.693633, + "longitude": -78.775076, + "city": "Emeigh", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15739, + "latitude": 40.677971, + "longitude": -79.165708, + "city": "Ernest", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15740, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "Frostburg", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15741, + "latitude": 40.796017, + "longitude": -78.858614, + "city": "Gipsy", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15742, + "latitude": 40.804413, + "longitude": -78.889036, + "city": "Glen Campbell", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15744, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "Hamilton", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15745, + "latitude": 40.620736, + "longitude": -78.918561, + "city": "Heilwood", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15746, + "latitude": 40.767854, + "longitude": -78.877331, + "city": "Hillsdale", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15747, + "latitude": 40.701519, + "longitude": -79.182743, + "city": "Home", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15748, + "latitude": 40.627752, + "longitude": -79.089616, + "city": "Homer City", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15750, + "latitude": 40.482783, + "longitude": -79.185048, + "city": "Josephine", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15751, + "latitude": 40.640031, + "longitude": -79.129445, + "city": "Juneau", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15752, + "latitude": 40.5412, + "longitude": -79.282047, + "city": "Kent", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15753, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "La Jose", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 15754, + "latitude": 40.500198, + "longitude": -79.176571, + "city": "Lucernemines", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15756, + "latitude": 40.568381, + "longitude": -79.299931, + "city": "Mc Intyre", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15757, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Mahaffey", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 15758, + "latitude": 40.640031, + "longitude": -79.129445, + "city": "Marchand", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15759, + "latitude": 40.685945, + "longitude": -79.051607, + "city": "Marion Center", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15760, + "latitude": 40.652187, + "longitude": -78.80542, + "city": "Marsteller", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15761, + "latitude": 40.620066, + "longitude": -78.887009, + "city": "Mentcle", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15762, + "latitude": 40.600962, + "longitude": -78.82209, + "city": "Nicktown", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15763, + "latitude": 40.640031, + "longitude": -79.129445, + "city": "Northpoint", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15764, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "Oliveburg", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15765, + "latitude": 40.621281, + "longitude": -78.99431, + "city": "Penn Run", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15767, + "latitude": 40.944538, + "longitude": -78.979845, + "city": "Punxsutawney", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15770, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "Ringgold", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15771, + "latitude": 40.72193, + "longitude": -79.006162, + "city": "Rochester Mills", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15772, + "latitude": 40.869654, + "longitude": -78.900483, + "city": "Rossiter", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15773, + "latitude": 40.629818, + "longitude": -78.732947, + "city": "Saint Benedict", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15774, + "latitude": 40.847829, + "longitude": -79.451575, + "city": "Shelocta", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 15775, + "latitude": 40.63513, + "longitude": -78.769185, + "city": "Spangler", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15776, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "Sprankle Mills", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15777, + "latitude": 40.702673, + "longitude": -78.958847, + "city": "Starford", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15778, + "latitude": 40.967353, + "longitude": -79.199017, + "city": "Timblin", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15779, + "latitude": 40.360223, + "longitude": -79.439801, + "city": "Torrance", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15780, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "Valier", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15781, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "Walston", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15783, + "latitude": 40.583778, + "longitude": -79.342331, + "city": "West Lebanon", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15784, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "Worthville", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15801, + "latitude": 41.118045, + "longitude": -78.720302, + "city": "Du Bois", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 15821, + "latitude": 41.415878, + "longitude": -78.665057, + "city": "Benezett", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 15822, + "latitude": 41.415878, + "longitude": -78.665057, + "city": "Brandy Camp", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 15823, + "latitude": 41.253932, + "longitude": -78.699711, + "city": "Brockport", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 15824, + "latitude": 41.247202, + "longitude": -78.7989, + "city": "Brockway", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15825, + "latitude": 41.162735, + "longitude": -79.081609, + "city": "Brookville", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15827, + "latitude": 41.291008, + "longitude": -78.50435, + "city": "Byrnedale", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 15828, + "latitude": 41.475887, + "longitude": -79.239101, + "city": "Clarington", + "state": "PA", + "county": "Forest" + }, + { + "zip_code": 15829, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "Corsica", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15831, + "latitude": 41.304782, + "longitude": -78.621286, + "city": "Dagus Mines", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 15832, + "latitude": 41.417566, + "longitude": -78.204927, + "city": "Driftwood", + "state": "PA", + "county": "Cameron" + }, + { + "zip_code": 15834, + "latitude": 41.51031, + "longitude": -78.23157, + "city": "Emporium", + "state": "PA", + "county": "Cameron" + }, + { + "zip_code": 15840, + "latitude": 41.149752, + "longitude": -78.820695, + "city": "Falls Creek", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15841, + "latitude": 41.283709, + "longitude": -78.551668, + "city": "Force", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 15845, + "latitude": 41.504669, + "longitude": -78.687183, + "city": "Johnsonburg", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 15846, + "latitude": 41.336887, + "longitude": -78.605537, + "city": "Kersey", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 15847, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "Knox Dale", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15848, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Luthersburg", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 15849, + "latitude": 41.20156, + "longitude": -78.583502, + "city": "Penfield", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 15851, + "latitude": 41.095556, + "longitude": -78.886154, + "city": "Reynoldsville", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15853, + "latitude": 41.362112, + "longitude": -78.726238, + "city": "Ridgway", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 15856, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Rockton", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 15857, + "latitude": 41.452935, + "longitude": -78.529829, + "city": "Saint Marys", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 15860, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "Sigel", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15861, + "latitude": 41.417566, + "longitude": -78.204927, + "city": "Sinnamahoning", + "state": "PA", + "county": "Cameron" + }, + { + "zip_code": 15863, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "Stump Creek", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15864, + "latitude": 41.141079, + "longitude": -78.962877, + "city": "Summerville", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15865, + "latitude": 41.047897, + "longitude": -78.819682, + "city": "Sykesville", + "state": "PA", + "county": "Jefferson" + }, + { + "zip_code": 15866, + "latitude": 41.011686, + "longitude": -78.785731, + "city": "Troutville", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 15868, + "latitude": 41.279081, + "longitude": -78.527949, + "city": "Weedville", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 15870, + "latitude": 41.572956, + "longitude": -78.665262, + "city": "Wilcox", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 15901, + "latitude": 40.412707, + "longitude": -78.854245, + "city": "Johnstown", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15902, + "latitude": 40.417111, + "longitude": -78.80599, + "city": "Johnstown", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15904, + "latitude": 40.319279, + "longitude": -78.828084, + "city": "Johnstown", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15905, + "latitude": 40.314074, + "longitude": -78.870894, + "city": "Johnstown", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15906, + "latitude": 40.494132, + "longitude": -78.838673, + "city": "Johnstown", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15907, + "latitude": 40.325374, + "longitude": -78.915147, + "city": "Johnstown", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15909, + "latitude": 40.440314, + "longitude": -78.85591, + "city": "Johnstown", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15915, + "latitude": 40.484487, + "longitude": -78.702224, + "city": "Johnstown", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15920, + "latitude": 40.460262, + "longitude": -79.009721, + "city": "Armagh", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15921, + "latitude": 40.319561, + "longitude": -78.694043, + "city": "Beaverdale", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15922, + "latitude": 40.484487, + "longitude": -78.702224, + "city": "Belsano", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15923, + "latitude": 40.348279, + "longitude": -79.15321, + "city": "Bolivar", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15924, + "latitude": 40.11492, + "longitude": -78.7851, + "city": "Cairnbrook", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15925, + "latitude": 40.4128, + "longitude": -78.633698, + "city": "Cassandra", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15926, + "latitude": 40.074818, + "longitude": -78.83817, + "city": "Central City", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15927, + "latitude": 40.538311, + "longitude": -78.786549, + "city": "Colver", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15928, + "latitude": 40.23523, + "longitude": -78.919007, + "city": "Davidsville", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15929, + "latitude": 40.462521, + "longitude": -79.012834, + "city": "Dilltown", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15930, + "latitude": 40.293935, + "longitude": -78.719217, + "city": "Dunlo", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15931, + "latitude": 40.459581, + "longitude": -78.771875, + "city": "Ebensburg", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15934, + "latitude": 40.279925, + "longitude": -78.803247, + "city": "Elton", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15935, + "latitude": 40.20137, + "longitude": -78.958371, + "city": "Hollsopple", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15936, + "latitude": 40.155129, + "longitude": -78.916785, + "city": "Hooversville", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15937, + "latitude": 40.208435, + "longitude": -78.987265, + "city": "Jerome", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15938, + "latitude": 40.427588, + "longitude": -78.639257, + "city": "Lilly", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15940, + "latitude": 40.517191, + "longitude": -78.61487, + "city": "Loretto", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15942, + "latitude": 40.419784, + "longitude": -78.823794, + "city": "Mineral Point", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15943, + "latitude": 40.392443, + "longitude": -78.848566, + "city": "Nanty Glo", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15944, + "latitude": 40.326182, + "longitude": -79.101925, + "city": "New Florence", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15945, + "latitude": 40.356723, + "longitude": -78.873296, + "city": "Parkhill", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15946, + "latitude": 40.369239, + "longitude": -78.752509, + "city": "Portage", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15948, + "latitude": 40.464069, + "longitude": -78.685365, + "city": "Revloc", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15949, + "latitude": 40.403698, + "longitude": -79.12204, + "city": "Robinson", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15951, + "latitude": 40.338615, + "longitude": -78.776137, + "city": "Saint Michael", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15952, + "latitude": 40.298574, + "longitude": -78.781592, + "city": "Salix", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15953, + "latitude": 40.206435, + "longitude": -78.900533, + "city": "Seanor", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15954, + "latitude": 40.401071, + "longitude": -79.029098, + "city": "Seward", + "state": "PA", + "county": "Westmoreland" + }, + { + "zip_code": 15955, + "latitude": 40.334129, + "longitude": -78.715511, + "city": "Sidman", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15956, + "latitude": 40.41164, + "longitude": -78.778413, + "city": "South Fork", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15957, + "latitude": 40.572746, + "longitude": -78.900034, + "city": "Strongstown", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 15958, + "latitude": 40.39114, + "longitude": -78.735229, + "city": "Summerhill", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15959, + "latitude": 40.267975, + "longitude": -78.915567, + "city": "Tire Hill", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 15960, + "latitude": 40.49963, + "longitude": -78.861308, + "city": "Twin Rocks", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15961, + "latitude": 40.437721, + "longitude": -78.924998, + "city": "Vintondale", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15962, + "latitude": 40.380188, + "longitude": -78.719019, + "city": "Wilmore", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 15963, + "latitude": 40.180418, + "longitude": -78.829021, + "city": "Windber", + "state": "PA", + "county": "Somerset" + }, + { + "zip_code": 16001, + "latitude": 40.885861, + "longitude": -79.934048, + "city": "Butler", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16002, + "latitude": 40.8409, + "longitude": -79.859175, + "city": "Butler", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16003, + "latitude": 40.921145, + "longitude": -79.92758, + "city": "Butler", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16016, + "latitude": 40.921145, + "longitude": -79.92758, + "city": "Boyers", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16017, + "latitude": 40.921145, + "longitude": -79.92758, + "city": "Boyers", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16018, + "latitude": 40.921145, + "longitude": -79.92758, + "city": "Boyers", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16020, + "latitude": 41.106846, + "longitude": -79.900626, + "city": "Boyers", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16021, + "latitude": 40.921145, + "longitude": -79.92758, + "city": "Branchton", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16022, + "latitude": 41.055515, + "longitude": -79.731308, + "city": "Bruin", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16023, + "latitude": 40.792353, + "longitude": -79.760048, + "city": "Cabot", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16024, + "latitude": 40.921867, + "longitude": -79.994747, + "city": "Callery", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16025, + "latitude": 40.940484, + "longitude": -79.777107, + "city": "Chicora", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16027, + "latitude": 40.826436, + "longitude": -80.013785, + "city": "Connoquenessing", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16028, + "latitude": 40.98399, + "longitude": -79.615234, + "city": "East Brady", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16029, + "latitude": 40.780174, + "longitude": -79.780792, + "city": "East Butler", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16030, + "latitude": 41.136538, + "longitude": -79.802384, + "city": "Eau Claire", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16033, + "latitude": 40.904798, + "longitude": -79.936488, + "city": "Evans City", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16034, + "latitude": 40.864921, + "longitude": -79.735066, + "city": "Fenelton", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16035, + "latitude": 41.106756, + "longitude": -80.007017, + "city": "Forestville", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16036, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Foxburg", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16037, + "latitude": 40.8282, + "longitude": -80.09825, + "city": "Harmony", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16038, + "latitude": 40.935262, + "longitude": -80.00865, + "city": "Harrisville", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16039, + "latitude": 40.921145, + "longitude": -79.92758, + "city": "Herman", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16040, + "latitude": 41.091444, + "longitude": -79.835723, + "city": "Hilliards", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16041, + "latitude": 41.005368, + "longitude": -79.766612, + "city": "Karns City", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16045, + "latitude": 40.801238, + "longitude": -79.963774, + "city": "Lyndora", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16046, + "latitude": 40.866316, + "longitude": -79.936986, + "city": "Mars", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16048, + "latitude": 41.04719, + "longitude": -79.808899, + "city": "North Washington", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16049, + "latitude": 41.093079, + "longitude": -79.682532, + "city": "Parker", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16050, + "latitude": 41.041059, + "longitude": -79.762814, + "city": "Petrolia", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16051, + "latitude": 41.01782, + "longitude": -80.072356, + "city": "Portersville", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16052, + "latitude": 40.956173, + "longitude": -79.933127, + "city": "Prospect", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16053, + "latitude": 40.803054, + "longitude": -79.990821, + "city": "Renfrew", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16054, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Saint Petersburg", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16055, + "latitude": 40.720919, + "longitude": -79.76262, + "city": "Sarver", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16056, + "latitude": 40.861995, + "longitude": -79.864282, + "city": "Saxonburg", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16057, + "latitude": 41.052427, + "longitude": -80.043821, + "city": "Slippery Rock", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16058, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Turkey City", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16059, + "latitude": 40.710689, + "longitude": -79.937074, + "city": "Valencia", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16061, + "latitude": 41.021754, + "longitude": -79.884312, + "city": "West Sunbury", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16063, + "latitude": 40.7609, + "longitude": -80.10939, + "city": "Zelienople", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16066, + "latitude": 40.709713, + "longitude": -80.104597, + "city": "Cranberry Twp", + "state": "PA", + "county": "Butler" + }, + { + "zip_code": 16101, + "latitude": 40.964516, + "longitude": -80.300736, + "city": "New Castle", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16102, + "latitude": 40.9613, + "longitude": -80.408502, + "city": "New Castle", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16103, + "latitude": 40.989662, + "longitude": -80.308376, + "city": "New Castle", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16105, + "latitude": 41.024051, + "longitude": -80.345444, + "city": "New Castle", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16107, + "latitude": 40.989662, + "longitude": -80.308376, + "city": "New Castle", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16108, + "latitude": 40.989662, + "longitude": -80.308376, + "city": "New Castle", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16110, + "latitude": 41.629436, + "longitude": -80.214024, + "city": "Adamsville", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16111, + "latitude": 41.524812, + "longitude": -80.32056, + "city": "Atlantic", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16112, + "latitude": 40.95621, + "longitude": -80.486131, + "city": "Bessemer", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16113, + "latitude": 41.286567, + "longitude": -80.423727, + "city": "Clark", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16114, + "latitude": 41.405788, + "longitude": -80.184099, + "city": "Clarks Mills", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16115, + "latitude": 40.786244, + "longitude": -80.391487, + "city": "Darlington", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 16116, + "latitude": 41.031749, + "longitude": -80.457328, + "city": "Edinburg", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16117, + "latitude": 40.917478, + "longitude": -80.363481, + "city": "Ellwood City", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16120, + "latitude": 40.905222, + "longitude": -80.468225, + "city": "Enon Valley", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16121, + "latitude": 41.210606, + "longitude": -80.487821, + "city": "Farrell", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16123, + "latitude": 40.813208, + "longitude": -80.199126, + "city": "Fombell", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 16124, + "latitude": 41.334133, + "longitude": -80.262473, + "city": "Fredonia", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16125, + "latitude": 41.326606, + "longitude": -80.288302, + "city": "Greenville", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16127, + "latitude": 41.170823, + "longitude": -80.089581, + "city": "Grove City", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16130, + "latitude": 41.32821, + "longitude": -80.292168, + "city": "Hadley", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16131, + "latitude": 41.534292, + "longitude": -80.417374, + "city": "Hartstown", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16132, + "latitude": 41.011263, + "longitude": -80.497546, + "city": "Hillsville", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16133, + "latitude": 41.278208, + "longitude": -80.113231, + "city": "Jackson Center", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16134, + "latitude": 41.456649, + "longitude": -80.449185, + "city": "Jamestown", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16136, + "latitude": 40.834767, + "longitude": -80.328009, + "city": "Koppel", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 16137, + "latitude": 41.222885, + "longitude": -80.250704, + "city": "Mercer", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16140, + "latitude": 40.989662, + "longitude": -80.308376, + "city": "New Bedford", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16141, + "latitude": 40.833615, + "longitude": -80.384434, + "city": "New Galilee", + "state": "PA", + "county": "Beaver" + }, + { + "zip_code": 16142, + "latitude": 41.10446, + "longitude": -80.352749, + "city": "New Wilmington", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16143, + "latitude": 41.087533, + "longitude": -80.472593, + "city": "Pulaski", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16145, + "latitude": 41.380743, + "longitude": -80.21727, + "city": "Sandy Lake", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16146, + "latitude": 41.234505, + "longitude": -80.44793, + "city": "Sharon", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16148, + "latitude": 41.221984, + "longitude": -80.438887, + "city": "Hermitage", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16150, + "latitude": 41.283776, + "longitude": -80.400053, + "city": "Sharpsville", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16151, + "latitude": 41.44346, + "longitude": -80.205513, + "city": "Sheakleyville", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16153, + "latitude": 41.335562, + "longitude": -80.10361, + "city": "Stoneboro", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16154, + "latitude": 41.368354, + "longitude": -80.360703, + "city": "Transfer", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16155, + "latitude": 40.989662, + "longitude": -80.308376, + "city": "Villa Maria", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16156, + "latitude": 41.089458, + "longitude": -80.19346, + "city": "Volant", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16157, + "latitude": 40.893341, + "longitude": -80.33774, + "city": "Wampum", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16159, + "latitude": 41.238352, + "longitude": -80.300747, + "city": "West Middlesex", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16160, + "latitude": 40.930132, + "longitude": -80.361099, + "city": "West Pittsburg", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16161, + "latitude": 41.200256, + "longitude": -80.502702, + "city": "Wheatland", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16172, + "latitude": 41.119992, + "longitude": -80.333192, + "city": "New Wilmington", + "state": "PA", + "county": "Lawrence" + }, + { + "zip_code": 16201, + "latitude": 40.817197, + "longitude": -79.419457, + "city": "Kittanning", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16210, + "latitude": 40.855727, + "longitude": -79.545145, + "city": "Adrian", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16211, + "latitude": 40.640031, + "longitude": -79.129445, + "city": "Beyer", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 16212, + "latitude": 40.754086, + "longitude": -79.580912, + "city": "Cadogan", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16213, + "latitude": 41.123556, + "longitude": -79.568457, + "city": "Callensburg", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16214, + "latitude": 41.143274, + "longitude": -79.452051, + "city": "Clarion", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16215, + "latitude": 40.847829, + "longitude": -79.451575, + "city": "Kittanning", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16216, + "latitude": 40.847829, + "longitude": -79.451575, + "city": "Climax", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16217, + "latitude": 41.475887, + "longitude": -79.239101, + "city": "Cooksburg", + "state": "PA", + "county": "Forest" + }, + { + "zip_code": 16218, + "latitude": 40.847829, + "longitude": -79.451575, + "city": "Cowansville", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16220, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Crown", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16221, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Curllsville", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16222, + "latitude": 40.881227, + "longitude": -79.240054, + "city": "Dayton", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16223, + "latitude": 40.847829, + "longitude": -79.451575, + "city": "Distant", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16224, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Fairmount City", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16225, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Fisher", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16226, + "latitude": 40.79965, + "longitude": -79.420198, + "city": "Ford City", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16228, + "latitude": 40.756829, + "longitude": -79.522225, + "city": "Ford Cliff", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16229, + "latitude": 40.743732, + "longitude": -79.46114, + "city": "Freeport", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16230, + "latitude": 41.017753, + "longitude": -79.279932, + "city": "Hawthorn", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16232, + "latitude": 41.190299, + "longitude": -79.592521, + "city": "Knox", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16233, + "latitude": 41.388826, + "longitude": -79.273662, + "city": "Leeper", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16234, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Limestone", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16235, + "latitude": 41.300236, + "longitude": -79.35779, + "city": "Lucinda", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16236, + "latitude": 40.781788, + "longitude": -79.521842, + "city": "Mc Grann", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16238, + "latitude": 40.787688, + "longitude": -79.521034, + "city": "Manorville", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16239, + "latitude": 41.469973, + "longitude": -79.125004, + "city": "Marienville", + "state": "PA", + "county": "Forest" + }, + { + "zip_code": 16240, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Mayport", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16242, + "latitude": 41.12698, + "longitude": -79.40791, + "city": "New Bethlehem", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16244, + "latitude": 40.847829, + "longitude": -79.451575, + "city": "Nu Mine", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16245, + "latitude": 40.847829, + "longitude": -79.451575, + "city": "Oak Ridge", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16246, + "latitude": 40.640031, + "longitude": -79.129445, + "city": "Plumville", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 16248, + "latitude": 41.041098, + "longitude": -79.501668, + "city": "Rimersburg", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16249, + "latitude": 40.746619, + "longitude": -79.496645, + "city": "Rural Valley", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16250, + "latitude": 40.777387, + "longitude": -79.233585, + "city": "Sagamore", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16253, + "latitude": 40.847829, + "longitude": -79.451575, + "city": "Seminole", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16254, + "latitude": 41.263674, + "longitude": -79.434105, + "city": "Shippenville", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16255, + "latitude": 41.105702, + "longitude": -79.489973, + "city": "Sligo", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16256, + "latitude": 40.867654, + "longitude": -79.141344, + "city": "Smicksburg", + "state": "PA", + "county": "Indiana" + }, + { + "zip_code": 16257, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Snydersburg", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16258, + "latitude": 41.235244, + "longitude": -79.281881, + "city": "Strattanville", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16259, + "latitude": 40.915899, + "longitude": -79.461201, + "city": "Templeton", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16260, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Vowinckel", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16261, + "latitude": 40.847829, + "longitude": -79.451575, + "city": "Widnoon", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16262, + "latitude": 40.837764, + "longitude": -79.629766, + "city": "Worthington", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16263, + "latitude": 40.847829, + "longitude": -79.451575, + "city": "Yatesboro", + "state": "PA", + "county": "Armstrong" + }, + { + "zip_code": 16301, + "latitude": 41.330725, + "longitude": -79.775153, + "city": "Oil City", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16311, + "latitude": 41.456666, + "longitude": -80.043012, + "city": "Carlton", + "state": "PA", + "county": "Mercer" + }, + { + "zip_code": 16312, + "latitude": 41.935848, + "longitude": -79.309668, + "city": "Chandlers Valley", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16313, + "latitude": 41.798453, + "longitude": -79.193751, + "city": "Clarendon", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16314, + "latitude": 41.51838, + "longitude": -80.047368, + "city": "Cochranton", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16316, + "latitude": 41.616247, + "longitude": -80.306783, + "city": "Conneaut Lake", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16317, + "latitude": 41.496472, + "longitude": -79.887384, + "city": "Cooperstown", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16319, + "latitude": 41.398105, + "longitude": -79.738809, + "city": "Cranberry", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16321, + "latitude": 41.475887, + "longitude": -79.239101, + "city": "East Hickory", + "state": "PA", + "county": "Forest" + }, + { + "zip_code": 16322, + "latitude": 41.475887, + "longitude": -79.239101, + "city": "Endeavor", + "state": "PA", + "county": "Forest" + }, + { + "zip_code": 16323, + "latitude": 41.335291, + "longitude": -79.783172, + "city": "Franklin", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16326, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Fryburg", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16327, + "latitude": 41.666057, + "longitude": -80.065793, + "city": "Guys Mills", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16328, + "latitude": 41.666057, + "longitude": -80.065793, + "city": "Hydetown", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16329, + "latitude": 41.811682, + "longitude": -79.264322, + "city": "Irvine", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16331, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Kossuth", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16332, + "latitude": 41.355729, + "longitude": -79.381225, + "city": "Lickingville", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16333, + "latitude": 41.742791, + "longitude": -78.78726, + "city": "Ludlow", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16334, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Marble", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16335, + "latitude": 41.611599, + "longitude": -80.114891, + "city": "Meadville", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16340, + "latitude": 41.862381, + "longitude": -79.432589, + "city": "Pittsfield", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16341, + "latitude": 41.501311, + "longitude": -79.633336, + "city": "Pleasantville", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16342, + "latitude": 41.320273, + "longitude": -79.926847, + "city": "Polk", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16343, + "latitude": 41.411018, + "longitude": -79.749341, + "city": "Reno", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16344, + "latitude": 41.471714, + "longitude": -79.688057, + "city": "Rouseville", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16345, + "latitude": 41.926402, + "longitude": -79.090299, + "city": "Russell", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16346, + "latitude": 41.378581, + "longitude": -79.707212, + "city": "Seneca", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16347, + "latitude": 41.68338, + "longitude": -79.032776, + "city": "Sheffield", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16350, + "latitude": 41.890561, + "longitude": -79.227866, + "city": "Sugar Grove", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16351, + "latitude": 41.830662, + "longitude": -79.229452, + "city": "Tidioute", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16352, + "latitude": 41.743431, + "longitude": -79.052756, + "city": "Tiona", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16353, + "latitude": 41.500915, + "longitude": -79.407452, + "city": "Tionesta", + "state": "PA", + "county": "Forest" + }, + { + "zip_code": 16354, + "latitude": 41.661775, + "longitude": -79.720068, + "city": "Titusville", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16360, + "latitude": 41.689858, + "longitude": -79.900897, + "city": "Townville", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16361, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Tylersburg", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16362, + "latitude": 41.398105, + "longitude": -79.738809, + "city": "Utica", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16364, + "latitude": 41.398105, + "longitude": -79.738809, + "city": "Venus", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16365, + "latitude": 41.84356, + "longitude": -79.172619, + "city": "Warren", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16366, + "latitude": 41.811682, + "longitude": -79.264322, + "city": "Warren", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16367, + "latitude": 41.811682, + "longitude": -79.264322, + "city": "Warren", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16368, + "latitude": 41.811682, + "longitude": -79.264322, + "city": "Warren", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16369, + "latitude": 41.811682, + "longitude": -79.264322, + "city": "Warren", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16370, + "latitude": 41.475887, + "longitude": -79.239101, + "city": "West Hickory", + "state": "PA", + "county": "Forest" + }, + { + "zip_code": 16371, + "latitude": 41.823681, + "longitude": -79.201275, + "city": "Youngsville", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16372, + "latitude": 41.199287, + "longitude": -79.874548, + "city": "Clintonville", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16373, + "latitude": 41.273318, + "longitude": -79.812491, + "city": "Emlenton", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16374, + "latitude": 41.398105, + "longitude": -79.738809, + "city": "Kennerdell", + "state": "PA", + "county": "Venango" + }, + { + "zip_code": 16375, + "latitude": 41.202325, + "longitude": -79.453751, + "city": "Lamartine", + "state": "PA", + "county": "Clarion" + }, + { + "zip_code": 16388, + "latitude": 41.659552, + "longitude": -80.157553, + "city": "Meadville", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16401, + "latitude": 41.894652, + "longitude": -80.311081, + "city": "Albion", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16402, + "latitude": 41.969142, + "longitude": -79.477037, + "city": "Bear Lake", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16403, + "latitude": 41.803393, + "longitude": -80.059383, + "city": "Cambridge Springs", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16404, + "latitude": 41.666057, + "longitude": -80.065793, + "city": "Centerville", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16405, + "latitude": 41.943966, + "longitude": -79.568294, + "city": "Columbus", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16406, + "latitude": 41.757871, + "longitude": -80.370323, + "city": "Conneautville", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16407, + "latitude": 41.924886, + "longitude": -79.696549, + "city": "Corry", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16410, + "latitude": 41.921275, + "longitude": -80.302761, + "city": "Cranesville", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16411, + "latitude": 41.982574, + "longitude": -80.439619, + "city": "East Springfield", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16412, + "latitude": 41.90425, + "longitude": -80.157715, + "city": "Edinboro", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16413, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Elgin", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16415, + "latitude": 42.011544, + "longitude": -80.335032, + "city": "Fairview", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16416, + "latitude": 41.818831, + "longitude": -79.446306, + "city": "Garland", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16417, + "latitude": 41.950719, + "longitude": -80.295852, + "city": "Girard", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16420, + "latitude": 41.811682, + "longitude": -79.264322, + "city": "Grand Valley", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16421, + "latitude": 42.172938, + "longitude": -79.937675, + "city": "Harborcreek", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16422, + "latitude": 41.643145, + "longitude": -80.394299, + "city": "Harmonsburg", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16423, + "latitude": 42.015789, + "longitude": -80.346492, + "city": "Lake City", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16424, + "latitude": 41.624388, + "longitude": -80.452295, + "city": "Linesville", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16426, + "latitude": 41.985964, + "longitude": -80.132523, + "city": "Mc Kean", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16427, + "latitude": 41.87726, + "longitude": -79.969168, + "city": "Mill Village", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16428, + "latitude": 42.176845, + "longitude": -79.841991, + "city": "North East", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16430, + "latitude": 41.999881, + "longitude": -80.42585, + "city": "North Springfield", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16432, + "latitude": 41.666057, + "longitude": -80.065793, + "city": "Riceville", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16433, + "latitude": 41.752837, + "longitude": -80.207488, + "city": "Saegertown", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16434, + "latitude": 41.667286, + "longitude": -80.097316, + "city": "Spartansburg", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16435, + "latitude": 41.800421, + "longitude": -80.371429, + "city": "Springboro", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16436, + "latitude": 41.920018, + "longitude": -79.448206, + "city": "Spring Creek", + "state": "PA", + "county": "Warren" + }, + { + "zip_code": 16438, + "latitude": 41.941617, + "longitude": -79.845963, + "city": "Union City", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16440, + "latitude": 41.763965, + "longitude": -80.098233, + "city": "Venango", + "state": "PA", + "county": "Crawford" + }, + { + "zip_code": 16441, + "latitude": 41.970601, + "longitude": -79.997581, + "city": "Waterford", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16442, + "latitude": 42.030403, + "longitude": -79.828985, + "city": "Wattsburg", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16443, + "latitude": 41.935633, + "longitude": -80.471462, + "city": "West Springfield", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16444, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Edinboro", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16475, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Albion", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16501, + "latitude": 42.087337, + "longitude": -80.087341, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16502, + "latitude": 42.110357, + "longitude": -80.100931, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16503, + "latitude": 42.126757, + "longitude": -80.061029, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16504, + "latitude": 42.109556, + "longitude": -80.050278, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16505, + "latitude": 42.110857, + "longitude": -80.153383, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16506, + "latitude": 42.064456, + "longitude": -80.165682, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16507, + "latitude": 42.134257, + "longitude": -80.084042, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16508, + "latitude": 42.097156, + "longitude": -80.09283, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16509, + "latitude": 42.048568, + "longitude": -80.027928, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16510, + "latitude": 42.108655, + "longitude": -79.953504, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16511, + "latitude": 42.160153, + "longitude": -79.984376, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16512, + "latitude": 42.030201, + "longitude": -80.257855, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16514, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16515, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16522, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16530, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16531, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16532, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16533, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16534, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16538, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16541, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16544, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16546, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16550, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16553, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16554, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16558, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16563, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16565, + "latitude": 42.182748, + "longitude": -80.064915, + "city": "Erie", + "state": "PA", + "county": "Erie" + }, + { + "zip_code": 16601, + "latitude": 40.489433, + "longitude": -78.349874, + "city": "Altoona", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16602, + "latitude": 40.508219, + "longitude": -78.382635, + "city": "Altoona", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16603, + "latitude": 40.50177, + "longitude": -78.410035, + "city": "Altoona", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16611, + "latitude": 40.54851, + "longitude": -78.095064, + "city": "Alexandria", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16613, + "latitude": 40.554875, + "longitude": -78.544825, + "city": "Ashville", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16614, + "latitude": 40.262311, + "longitude": -78.421434, + "city": "Bakers Summit", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 16616, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Beccaria", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16617, + "latitude": 40.562667, + "longitude": -78.363835, + "city": "Bellwood", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16619, + "latitude": 40.684687, + "longitude": -78.413712, + "city": "Blandburg", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16620, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Brisbin", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16621, + "latitude": 40.1999, + "longitude": -78.140812, + "city": "Broad Top", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16622, + "latitude": 40.402523, + "longitude": -77.966977, + "city": "Calvin", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16623, + "latitude": 40.285076, + "longitude": -78.022032, + "city": "Cassville", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16624, + "latitude": 40.570219, + "longitude": -78.599119, + "city": "Chest Springs", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16625, + "latitude": 40.354932, + "longitude": -78.46266, + "city": "Claysburg", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16627, + "latitude": 40.749629, + "longitude": -78.536067, + "city": "Coalport", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16629, + "latitude": 40.521778, + "longitude": -78.526274, + "city": "Coupon", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16630, + "latitude": 40.470718, + "longitude": -78.58946, + "city": "Cresson", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16631, + "latitude": 40.493522, + "longitude": -78.368229, + "city": "Curryville", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16633, + "latitude": 40.160065, + "longitude": -78.234638, + "city": "Defiance", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 16634, + "latitude": 40.402523, + "longitude": -77.966977, + "city": "Dudley", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16635, + "latitude": 40.510278, + "longitude": -78.407982, + "city": "Duncansville", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16636, + "latitude": 40.60772, + "longitude": -78.526783, + "city": "Dysart", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16637, + "latitude": 40.349335, + "longitude": -78.442466, + "city": "East Freedom", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16638, + "latitude": 40.402523, + "longitude": -77.966977, + "city": "Entriken", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16639, + "latitude": 40.671195, + "longitude": -78.508823, + "city": "Fallentimber", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16640, + "latitude": 40.687598, + "longitude": -78.552346, + "city": "Flinton", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16641, + "latitude": 40.507567, + "longitude": -78.576208, + "city": "Gallitzin", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16644, + "latitude": 40.717845, + "longitude": -78.463679, + "city": "Glasgow", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16645, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Glen Hope", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16646, + "latitude": 40.680896, + "longitude": -78.599266, + "city": "Hastings", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16647, + "latitude": 40.402523, + "longitude": -77.966977, + "city": "Hesston", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16648, + "latitude": 40.432059, + "longitude": -78.364965, + "city": "Hollidaysburg", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16650, + "latitude": 40.108984, + "longitude": -78.279287, + "city": "Hopewell", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 16651, + "latitude": 40.78995, + "longitude": -78.377189, + "city": "Houtzdale", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16652, + "latitude": 40.515371, + "longitude": -77.975879, + "city": "Huntingdon", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16654, + "latitude": 40.402523, + "longitude": -77.966977, + "city": "Huntingdon", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16655, + "latitude": 40.250384, + "longitude": -78.537796, + "city": "Imler", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 16656, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Irvona", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16657, + "latitude": 40.385496, + "longitude": -78.172245, + "city": "James Creek", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16659, + "latitude": 40.170266, + "longitude": -78.385341, + "city": "Loysburg", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 16660, + "latitude": 40.402523, + "longitude": -77.966977, + "city": "Mc Connellstown", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16661, + "latitude": 40.830471, + "longitude": -78.435525, + "city": "Madera", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16662, + "latitude": 40.33984, + "longitude": -78.336709, + "city": "Martinsburg", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16663, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Morann", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16664, + "latitude": 40.193882, + "longitude": -78.426719, + "city": "New Enterprise", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 16665, + "latitude": 40.385507, + "longitude": -78.447236, + "city": "Newry", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16666, + "latitude": 40.822197, + "longitude": -78.455355, + "city": "Osceola Mills", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16667, + "latitude": 40.181801, + "longitude": -78.493371, + "city": "Osterburg", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 16668, + "latitude": 40.633518, + "longitude": -78.608257, + "city": "Patton", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16669, + "latitude": 40.583226, + "longitude": -78.073445, + "city": "Petersburg", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16670, + "latitude": 40.254864, + "longitude": -78.512462, + "city": "Queen", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 16671, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Ramey", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16672, + "latitude": 40.175325, + "longitude": -78.249266, + "city": "Riddlesburg", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 16673, + "latitude": 40.335467, + "longitude": -78.387541, + "city": "Roaring Spring", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16674, + "latitude": 40.186465, + "longitude": -78.116188, + "city": "Robertsdale", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16675, + "latitude": 40.671181, + "longitude": -78.675548, + "city": "Saint Boniface", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16677, + "latitude": 40.813628, + "longitude": -78.238986, + "city": "Sandy Ridge", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16678, + "latitude": 40.201876, + "longitude": -78.252528, + "city": "Saxton", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 16679, + "latitude": 40.169799, + "longitude": -78.212185, + "city": "Six Mile Run", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 16680, + "latitude": 40.760116, + "longitude": -78.450043, + "city": "Smithmill", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16681, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Smokerun", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16682, + "latitude": 40.271126, + "longitude": -78.45878, + "city": "Sproul", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16683, + "latitude": 40.402523, + "longitude": -77.966977, + "city": "Spruce Creek", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16684, + "latitude": 40.636691, + "longitude": -78.303614, + "city": "Tipton", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16685, + "latitude": 40.270965, + "longitude": -78.077244, + "city": "Todd", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16686, + "latitude": 40.522068, + "longitude": -78.340045, + "city": "Tyrone", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16689, + "latitude": 39.943762, + "longitude": -78.122265, + "city": "Waterfall", + "state": "PA", + "county": "Fulton" + }, + { + "zip_code": 16691, + "latitude": 39.943762, + "longitude": -78.122265, + "city": "Wells Tannery", + "state": "PA", + "county": "Fulton" + }, + { + "zip_code": 16692, + "latitude": 40.745169, + "longitude": -78.67683, + "city": "Westover", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16693, + "latitude": 40.402532, + "longitude": -78.255764, + "city": "Williamsburg", + "state": "PA", + "county": "Blair" + }, + { + "zip_code": 16694, + "latitude": 40.165987, + "longitude": -78.138144, + "city": "Wood", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 16695, + "latitude": 40.230406, + "longitude": -78.358877, + "city": "Woodbury", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 16698, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Houtzdale", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16699, + "latitude": 40.484487, + "longitude": -78.702224, + "city": "Cresson", + "state": "PA", + "county": "Cambria" + }, + { + "zip_code": 16701, + "latitude": 41.862341, + "longitude": -78.63731, + "city": "Bradford", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16720, + "latitude": 41.615099, + "longitude": -77.957975, + "city": "Austin", + "state": "PA", + "county": "Potter" + }, + { + "zip_code": 16724, + "latitude": 41.801078, + "longitude": -78.579739, + "city": "Crosby", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16725, + "latitude": 41.885487, + "longitude": -78.723198, + "city": "Custer City", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16726, + "latitude": 41.818645, + "longitude": -78.595669, + "city": "Cyclone", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16727, + "latitude": 41.982786, + "longitude": -78.546304, + "city": "Derrick City", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16728, + "latitude": 41.415878, + "longitude": -78.665057, + "city": "De Young", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 16729, + "latitude": 41.96089, + "longitude": -78.486099, + "city": "Duke Center", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16730, + "latitude": 41.801078, + "longitude": -78.579739, + "city": "East Smethport", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16731, + "latitude": 41.941328, + "longitude": -78.361927, + "city": "Eldred", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16732, + "latitude": 41.801078, + "longitude": -78.579739, + "city": "Gifford", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16733, + "latitude": 41.801078, + "longitude": -78.579739, + "city": "Hazel Hurst", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16734, + "latitude": 41.619213, + "longitude": -78.839413, + "city": "James City", + "state": "PA", + "county": "Elk" + }, + { + "zip_code": 16735, + "latitude": 41.795662, + "longitude": -78.631755, + "city": "Kane", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16738, + "latitude": 41.836866, + "longitude": -78.691582, + "city": "Lewis Run", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16740, + "latitude": 41.719284, + "longitude": -78.623042, + "city": "Mount Jewett", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16743, + "latitude": 41.881851, + "longitude": -78.457878, + "city": "Port Allegany", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16744, + "latitude": 41.87833, + "longitude": -78.557219, + "city": "Rew", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16745, + "latitude": 41.919565, + "longitude": -78.48561, + "city": "Rixford", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16746, + "latitude": 41.737627, + "longitude": -77.902366, + "city": "Roulette", + "state": "PA", + "county": "Potter" + }, + { + "zip_code": 16748, + "latitude": 41.963791, + "longitude": -78.188866, + "city": "Shinglehouse", + "state": "PA", + "county": "Potter" + }, + { + "zip_code": 16749, + "latitude": 41.798748, + "longitude": -78.539192, + "city": "Smethport", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16750, + "latitude": 41.801078, + "longitude": -78.579739, + "city": "Turtlepoint", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16751, + "latitude": 41.801078, + "longitude": -78.579739, + "city": "Westline", + "state": "PA", + "county": "Mckean" + }, + { + "zip_code": 16801, + "latitude": 40.881935, + "longitude": -77.867822, + "city": "State College", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16802, + "latitude": 40.799672, + "longitude": -77.862339, + "city": "University Park", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16803, + "latitude": 40.878721, + "longitude": -77.757999, + "city": "State College", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16804, + "latitude": 40.972229, + "longitude": -77.760172, + "city": "State College", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16805, + "latitude": 40.972229, + "longitude": -77.760172, + "city": "State College", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16820, + "latitude": 40.89869, + "longitude": -77.456184, + "city": "Aaronsburg", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16821, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Allport", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16822, + "latitude": 41.105476, + "longitude": -77.50553, + "city": "Beech Creek", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 16823, + "latitude": 40.897823, + "longitude": -77.773188, + "city": "Bellefonte", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16825, + "latitude": 40.990006, + "longitude": -78.360612, + "city": "Bigler", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16826, + "latitude": 40.972229, + "longitude": -77.760172, + "city": "Blanchard", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16827, + "latitude": 40.885162, + "longitude": -77.644896, + "city": "Boalsburg", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16828, + "latitude": 40.807973, + "longitude": -77.703942, + "city": "Centre Hall", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16829, + "latitude": 40.932545, + "longitude": -77.763472, + "city": "Clarence", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16830, + "latitude": 41.037563, + "longitude": -78.435492, + "city": "Clearfield", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16832, + "latitude": 40.838329, + "longitude": -77.450929, + "city": "Coburn", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16833, + "latitude": 40.949208, + "longitude": -78.582309, + "city": "Curwensville", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16834, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Drifting", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16835, + "latitude": 40.904645, + "longitude": -77.875191, + "city": "Fleming", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16836, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Frenchville", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16837, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Glen Richey", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16838, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Grampian", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16839, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Grassflat", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16840, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Hawk Run", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16841, + "latitude": 40.918199, + "longitude": -77.679655, + "city": "Howard", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16843, + "latitude": 41.003007, + "longitude": -78.464189, + "city": "Hyde", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16844, + "latitude": 40.901934, + "longitude": -77.750812, + "city": "Julian", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16845, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Karthaus", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16847, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Kylertown", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16848, + "latitude": 41.220635, + "longitude": -77.618532, + "city": "Lamar", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 16849, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Lanse", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16850, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Lecontes Mills", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16851, + "latitude": 40.808151, + "longitude": -77.812525, + "city": "Lemont", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16852, + "latitude": 40.972229, + "longitude": -77.760172, + "city": "Madisonburg", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16853, + "latitude": 40.95408, + "longitude": -77.781465, + "city": "Milesburg", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16854, + "latitude": 40.893455, + "longitude": -77.473298, + "city": "Millheim", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16855, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Mineral Springs", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16856, + "latitude": 40.929851, + "longitude": -77.638892, + "city": "Mingoville", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16858, + "latitude": 40.96891, + "longitude": -78.191551, + "city": "Morrisdale", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16859, + "latitude": 40.900499, + "longitude": -78.025894, + "city": "Moshannon", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16860, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Munson", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16861, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "New Millport", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16863, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Olanta", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16864, + "latitude": 40.972229, + "longitude": -77.760172, + "city": "Orviston", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16865, + "latitude": 40.868075, + "longitude": -77.957409, + "city": "Pennsylvania Furnace", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16866, + "latitude": 40.905166, + "longitude": -77.844216, + "city": "Philipsburg", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16868, + "latitude": 40.726405, + "longitude": -77.911776, + "city": "Pine Grove Mills", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16870, + "latitude": 40.913584, + "longitude": -77.829726, + "city": "Port Matilda", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16871, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Pottersdale", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16872, + "latitude": 40.939915, + "longitude": -77.448451, + "city": "Rebersburg", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16873, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Shawville", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16874, + "latitude": 40.992146, + "longitude": -78.027865, + "city": "Snow Shoe", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16875, + "latitude": 40.88368, + "longitude": -77.518716, + "city": "Spring Mills", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16876, + "latitude": 40.961582, + "longitude": -78.292599, + "city": "Wallaceton", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16877, + "latitude": 40.692101, + "longitude": -78.165044, + "city": "Warriors Mark", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 16878, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "West Decatur", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16879, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Winburne", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16881, + "latitude": 40.989115, + "longitude": -78.422403, + "city": "Woodland", + "state": "PA", + "county": "Clearfield" + }, + { + "zip_code": 16882, + "latitude": 40.897081, + "longitude": -77.402419, + "city": "Woodward", + "state": "PA", + "county": "Centre" + }, + { + "zip_code": 16901, + "latitude": 41.862339, + "longitude": -77.258974, + "city": "Wellsboro", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16910, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Alba", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 16911, + "latitude": 41.77197, + "longitude": -77.242228, + "city": "Arnot", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16912, + "latitude": 41.822885, + "longitude": -77.200274, + "city": "Blossburg", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16914, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Columbia Cross Roads", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 16915, + "latitude": 41.776165, + "longitude": -77.956692, + "city": "Coudersport", + "state": "PA", + "county": "Potter" + }, + { + "zip_code": 16917, + "latitude": 41.769456, + "longitude": -77.000451, + "city": "Covington", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16918, + "latitude": 41.77197, + "longitude": -77.242228, + "city": "Cowanesque", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16920, + "latitude": 41.979118, + "longitude": -77.370183, + "city": "Elkland", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16921, + "latitude": 41.77197, + "longitude": -77.242228, + "city": "Gaines", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16922, + "latitude": 41.733379, + "longitude": -77.644214, + "city": "Galeton", + "state": "PA", + "county": "Potter" + }, + { + "zip_code": 16923, + "latitude": 41.737627, + "longitude": -77.902366, + "city": "Genesee", + "state": "PA", + "county": "Potter" + }, + { + "zip_code": 16925, + "latitude": 41.938208, + "longitude": -76.800579, + "city": "Gillett", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 16926, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Granville Summit", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 16927, + "latitude": 41.737627, + "longitude": -77.902366, + "city": "Harrison Valley", + "state": "PA", + "county": "Potter" + }, + { + "zip_code": 16928, + "latitude": 41.93602, + "longitude": -77.445729, + "city": "Knoxville", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16929, + "latitude": 41.984078, + "longitude": -77.181189, + "city": "Lawrenceville", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16930, + "latitude": 41.77197, + "longitude": -77.242228, + "city": "Liberty", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16932, + "latitude": 41.790065, + "longitude": -77.035282, + "city": "Mainesburg", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16933, + "latitude": 41.793666, + "longitude": -77.072151, + "city": "Mansfield", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16935, + "latitude": 41.77197, + "longitude": -77.242228, + "city": "Middlebury Center", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16936, + "latitude": 41.90843, + "longitude": -77.011231, + "city": "Millerton", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16937, + "latitude": 41.737627, + "longitude": -77.902366, + "city": "Mills", + "state": "PA", + "county": "Potter" + }, + { + "zip_code": 16938, + "latitude": 41.77197, + "longitude": -77.242228, + "city": "Morris", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16939, + "latitude": 41.677542, + "longitude": -77.015194, + "city": "Morris Run", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16940, + "latitude": 41.977039, + "longitude": -77.24531, + "city": "Nelson", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16941, + "latitude": 41.737627, + "longitude": -77.902366, + "city": "Genesee", + "state": "PA", + "county": "Potter" + }, + { + "zip_code": 16942, + "latitude": 41.989264, + "longitude": -77.347725, + "city": "Osceola", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16943, + "latitude": 41.77197, + "longitude": -77.242228, + "city": "Sabinsville", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16945, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Sylvania", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 16946, + "latitude": 41.943444, + "longitude": -77.2292, + "city": "Tioga", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 16947, + "latitude": 41.788389, + "longitude": -76.837246, + "city": "Troy", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 16948, + "latitude": 41.843678, + "longitude": -77.75736, + "city": "Ulysses", + "state": "PA", + "county": "Potter" + }, + { + "zip_code": 16950, + "latitude": 41.919341, + "longitude": -77.523033, + "city": "Westfield", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 17001, + "latitude": 40.21604, + "longitude": -76.924996, + "city": "Camp Hill", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17002, + "latitude": 40.539667, + "longitude": -77.790168, + "city": "Allensville", + "state": "PA", + "county": "Mifflin" + }, + { + "zip_code": 17003, + "latitude": 40.352637, + "longitude": -76.435873, + "city": "Annville", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17004, + "latitude": 40.591417, + "longitude": -77.73103, + "city": "Belleville", + "state": "PA", + "county": "Mifflin" + }, + { + "zip_code": 17005, + "latitude": 40.600992, + "longitude": -76.811693, + "city": "Berrysburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17006, + "latitude": 40.29736, + "longitude": -77.56437, + "city": "Blain", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17007, + "latitude": 40.141205, + "longitude": -77.242351, + "city": "Boiling Springs", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17008, + "latitude": 40.167091, + "longitude": -76.978448, + "city": "Bowmansdale", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17009, + "latitude": 40.629711, + "longitude": -77.607196, + "city": "Burnham", + "state": "PA", + "county": "Mifflin" + }, + { + "zip_code": 17010, + "latitude": 40.27124, + "longitude": -76.582049, + "city": "Campbelltown", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17011, + "latitude": 40.251914, + "longitude": -77.079091, + "city": "Camp Hill", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17012, + "latitude": 40.136687, + "longitude": -77.242805, + "city": "Camp Hill", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17013, + "latitude": 40.168495, + "longitude": -77.228817, + "city": "Carlisle", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17014, + "latitude": 40.478716, + "longitude": -77.345514, + "city": "Cocolamus", + "state": "PA", + "county": "Juniata" + }, + { + "zip_code": 17016, + "latitude": 40.275536, + "longitude": -76.405309, + "city": "Cornwall", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17017, + "latitude": 40.894363, + "longitude": -76.596151, + "city": "Dalmatia", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17018, + "latitude": 40.361876, + "longitude": -76.895539, + "city": "Dauphin", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17019, + "latitude": 40.091217, + "longitude": -76.977835, + "city": "Dillsburg", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17020, + "latitude": 40.458261, + "longitude": -77.060745, + "city": "Duncannon", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17021, + "latitude": 40.478716, + "longitude": -77.345514, + "city": "East Waterford", + "state": "PA", + "county": "Juniata" + }, + { + "zip_code": 17022, + "latitude": 40.150963, + "longitude": -76.61028, + "city": "Elizabethtown", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17023, + "latitude": 40.584804, + "longitude": -76.767913, + "city": "Elizabethville", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17024, + "latitude": 40.442354, + "longitude": -77.27088, + "city": "Elliottsburg", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17025, + "latitude": 40.235675, + "longitude": -76.987249, + "city": "Enola", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17026, + "latitude": 40.456193, + "longitude": -76.434639, + "city": "Fredericksburg", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17027, + "latitude": 40.157981, + "longitude": -76.996398, + "city": "Grantham", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17028, + "latitude": 40.373438, + "longitude": -76.682667, + "city": "Grantville", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17029, + "latitude": 40.550937, + "longitude": -77.626095, + "city": "Granville", + "state": "PA", + "county": "Mifflin" + }, + { + "zip_code": 17030, + "latitude": 40.608245, + "longitude": -76.737545, + "city": "Gratz", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17031, + "latitude": 40.406766, + "longitude": -77.292578, + "city": "Green Park", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17032, + "latitude": 40.507107, + "longitude": -76.843844, + "city": "Halifax", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17033, + "latitude": 40.269748, + "longitude": -76.636357, + "city": "Hershey", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17034, + "latitude": 40.329577, + "longitude": -76.834076, + "city": "Highspire", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17035, + "latitude": 40.478716, + "longitude": -77.345514, + "city": "Honey Grove", + "state": "PA", + "county": "Juniata" + }, + { + "zip_code": 17036, + "latitude": 40.340043, + "longitude": -76.782764, + "city": "Hummelstown", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17037, + "latitude": 40.436276, + "longitude": -77.397013, + "city": "Ickesburg", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17038, + "latitude": 40.430902, + "longitude": -76.480732, + "city": "Jonestown", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17039, + "latitude": 40.300505, + "longitude": -76.258399, + "city": "Kleinfeltersville", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17040, + "latitude": 40.34253, + "longitude": -77.304476, + "city": "Landisburg", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17041, + "latitude": 40.223623, + "longitude": -76.538007, + "city": "Lawn", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17042, + "latitude": 40.331594, + "longitude": -76.397634, + "city": "Lebanon", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17043, + "latitude": 40.244339, + "longitude": -76.918796, + "city": "Lemoyne", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17044, + "latitude": 40.564909, + "longitude": -77.630152, + "city": "Lewistown", + "state": "PA", + "county": "Mifflin" + }, + { + "zip_code": 17045, + "latitude": 40.574445, + "longitude": -76.987538, + "city": "Liverpool", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17046, + "latitude": 40.381212, + "longitude": -76.436791, + "city": "Lebanon", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17047, + "latitude": 40.406766, + "longitude": -77.292578, + "city": "Loysville", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17048, + "latitude": 40.558844, + "longitude": -76.790132, + "city": "Lykens", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17049, + "latitude": 40.651725, + "longitude": -77.306056, + "city": "Mc Alisterville", + "state": "PA", + "county": "Juniata" + }, + { + "zip_code": 17050, + "latitude": "", + "longitude": "", + "city": "Mechanicsburg", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17051, + "latitude": 40.478095, + "longitude": -77.734919, + "city": "Mc Veytown", + "state": "PA", + "county": "Mifflin" + }, + { + "zip_code": 17052, + "latitude": 40.402523, + "longitude": -77.966977, + "city": "Mapleton Depot", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 17053, + "latitude": 40.325105, + "longitude": -77.025886, + "city": "Marysville", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17054, + "latitude": 40.495979, + "longitude": -77.723716, + "city": "Mattawana", + "state": "PA", + "county": "Mifflin" + }, + { + "zip_code": 17055, + "latitude": 40.180953, + "longitude": -77.177086, + "city": "Mechanicsburg", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17056, + "latitude": 40.478716, + "longitude": -77.345514, + "city": "Mexico", + "state": "PA", + "county": "Juniata" + }, + { + "zip_code": 17057, + "latitude": 40.191241, + "longitude": -76.720142, + "city": "Middletown", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17058, + "latitude": 40.555304, + "longitude": -77.400062, + "city": "Mifflin", + "state": "PA", + "county": "Juniata" + }, + { + "zip_code": 17059, + "latitude": 40.571404, + "longitude": -77.317266, + "city": "Mifflintown", + "state": "PA", + "county": "Juniata" + }, + { + "zip_code": 17060, + "latitude": 40.402523, + "longitude": -77.966977, + "city": "Mill Creek", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 17061, + "latitude": 40.571494, + "longitude": -76.840528, + "city": "Millersburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17062, + "latitude": 40.556195, + "longitude": -77.154223, + "city": "Millerstown", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17063, + "latitude": 40.740026, + "longitude": -77.493466, + "city": "Milroy", + "state": "PA", + "county": "Mifflin" + }, + { + "zip_code": 17064, + "latitude": 40.254642, + "longitude": -76.461544, + "city": "Mount Gretna", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17065, + "latitude": 40.202649, + "longitude": -77.08213, + "city": "Mount Holly Springs", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17066, + "latitude": 40.382302, + "longitude": -77.882222, + "city": "Mount Union", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 17067, + "latitude": 40.368282, + "longitude": -76.359975, + "city": "Myerstown", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17068, + "latitude": 40.405796, + "longitude": -77.134043, + "city": "New Bloomfield", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17069, + "latitude": 40.455272, + "longitude": -76.970942, + "city": "New Buffalo", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17070, + "latitude": 40.263875, + "longitude": -76.898096, + "city": "New Cumberland", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17071, + "latitude": 40.406766, + "longitude": -77.292578, + "city": "New Germantown", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17072, + "latitude": 40.230601, + "longitude": -77.079425, + "city": "New Kingstown", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17073, + "latitude": 40.314112, + "longitude": -76.26055, + "city": "Newmanstown", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17074, + "latitude": 40.506053, + "longitude": -77.129129, + "city": "Newport", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17075, + "latitude": 40.39313, + "longitude": -77.831635, + "city": "Newton Hamilton", + "state": "PA", + "county": "Mifflin" + }, + { + "zip_code": 17076, + "latitude": 40.478716, + "longitude": -77.345514, + "city": "Oakland Mills", + "state": "PA", + "county": "Juniata" + }, + { + "zip_code": 17077, + "latitude": 40.375404, + "longitude": -76.414757, + "city": "Ono", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17078, + "latitude": 40.317606, + "longitude": -76.416907, + "city": "Palmyra", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17080, + "latitude": 40.639199, + "longitude": -76.80292, + "city": "Pillow", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17081, + "latitude": 40.203019, + "longitude": -77.284761, + "city": "Plainfield", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17082, + "latitude": 40.549581, + "longitude": -77.395272, + "city": "Port Royal", + "state": "PA", + "county": "Juniata" + }, + { + "zip_code": 17083, + "latitude": 40.27639, + "longitude": -76.411239, + "city": "Quentin", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17084, + "latitude": 40.541706, + "longitude": -77.692538, + "city": "Reedsville", + "state": "PA", + "county": "Mifflin" + }, + { + "zip_code": 17085, + "latitude": 40.277076, + "longitude": -76.385727, + "city": "Rexmont", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17086, + "latitude": 40.478716, + "longitude": -77.345514, + "city": "Richfield", + "state": "PA", + "county": "Juniata" + }, + { + "zip_code": 17087, + "latitude": 40.362956, + "longitude": -76.271943, + "city": "Richland", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17088, + "latitude": 40.308696, + "longitude": -76.296308, + "city": "Schaefferstown", + "state": "PA", + "county": "Lebanon" + }, + { + "zip_code": 17089, + "latitude": 40.269738, + "longitude": -76.936046, + "city": "Camp Hill", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17090, + "latitude": 40.342999, + "longitude": -77.182569, + "city": "Shermans Dale", + "state": "PA", + "county": "Perry" + }, + { + "zip_code": 17091, + "latitude": 40.136687, + "longitude": -77.242805, + "city": "Camp Hill", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17093, + "latitude": 40.293538, + "longitude": -76.926346, + "city": "Summerdale", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17094, + "latitude": 40.565325, + "longitude": -77.235359, + "city": "Thompsontown", + "state": "PA", + "county": "Juniata" + }, + { + "zip_code": 17097, + "latitude": 40.573734, + "longitude": -76.65693, + "city": "Wiconisco", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17098, + "latitude": 40.588313, + "longitude": -76.695547, + "city": "Williamstown", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17099, + "latitude": 40.644505, + "longitude": -77.567708, + "city": "Yeagertown", + "state": "PA", + "county": "Mifflin" + }, + { + "zip_code": 17101, + "latitude": 40.264589, + "longitude": -76.869644, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17102, + "latitude": 40.272538, + "longitude": -76.890695, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17103, + "latitude": 40.272389, + "longitude": -76.860994, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17104, + "latitude": 40.253639, + "longitude": -76.857944, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17105, + "latitude": 40.278498, + "longitude": -76.875207, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17106, + "latitude": 40.292664, + "longitude": -76.850061, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17107, + "latitude": 40.297031, + "longitude": -76.876437, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17108, + "latitude": 40.308638, + "longitude": -76.801693, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17109, + "latitude": 40.290953, + "longitude": -76.820294, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17110, + "latitude": 40.302238, + "longitude": -76.866348, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17111, + "latitude": 40.272089, + "longitude": -76.801693, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17112, + "latitude": 40.344295, + "longitude": -76.790248, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17113, + "latitude": 40.23904, + "longitude": -76.841644, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17120, + "latitude": 40.265689, + "longitude": -76.882745, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17121, + "latitude": 40.294396, + "longitude": -76.893751, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17122, + "latitude": 40.249845, + "longitude": -76.871209, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17123, + "latitude": 40.267518, + "longitude": -76.883734, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17124, + "latitude": 40.26746, + "longitude": -76.885967, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17125, + "latitude": 40.266221, + "longitude": -76.882854, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17126, + "latitude": 40.26179, + "longitude": -76.880021, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17127, + "latitude": 40.261516, + "longitude": -76.880884, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17128, + "latitude": 40.389865, + "longitude": -76.782323, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17129, + "latitude": 40.261516, + "longitude": -76.880884, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17130, + "latitude": 40.270222, + "longitude": -76.882889, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17140, + "latitude": 40.30864, + "longitude": -76.846449, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17177, + "latitude": 40.298988, + "longitude": -76.847194, + "city": "Harrisburg", + "state": "PA", + "county": "Dauphin" + }, + { + "zip_code": 17201, + "latitude": 39.908055, + "longitude": -77.666445, + "city": "Chambersburg", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17210, + "latitude": 40.171667, + "longitude": -77.661354, + "city": "Amberson", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17211, + "latitude": 39.755155, + "longitude": -78.406388, + "city": "Artemas", + "state": "PA", + "county": "Bedford" + }, + { + "zip_code": 17212, + "latitude": 39.943762, + "longitude": -78.122265, + "city": "Big Cove Tannery", + "state": "PA", + "county": "Fulton" + }, + { + "zip_code": 17213, + "latitude": 40.17973, + "longitude": -77.865942, + "city": "Blairs Mills", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 17214, + "latitude": 39.739893, + "longitude": -77.470729, + "city": "Blue Ridge Summit", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17215, + "latitude": 39.943762, + "longitude": -78.122265, + "city": "Burnt Cabins", + "state": "PA", + "county": "Fulton" + }, + { + "zip_code": 17217, + "latitude": 40.225168, + "longitude": -77.725013, + "city": "Concord", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17219, + "latitude": 40.218448, + "longitude": -77.679713, + "city": "Doylesburg", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17220, + "latitude": 40.178081, + "longitude": -77.735336, + "city": "Dry Run", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17221, + "latitude": 40.073155, + "longitude": -77.832158, + "city": "Fannettsburg", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17222, + "latitude": 39.900035, + "longitude": -77.529619, + "city": "Fayetteville", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17223, + "latitude": 39.943762, + "longitude": -78.122265, + "city": "Fort Littleton", + "state": "PA", + "county": "Fulton" + }, + { + "zip_code": 17224, + "latitude": 40.002593, + "longitude": -77.809574, + "city": "Fort Loudon", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17225, + "latitude": 39.805922, + "longitude": -77.726127, + "city": "Greencastle", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17228, + "latitude": 39.943762, + "longitude": -78.122265, + "city": "Harrisonville", + "state": "PA", + "county": "Fulton" + }, + { + "zip_code": 17229, + "latitude": 39.943762, + "longitude": -78.122265, + "city": "Hustontown", + "state": "PA", + "county": "Fulton" + }, + { + "zip_code": 17231, + "latitude": 39.859432, + "longitude": -77.857889, + "city": "Lemasters", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17232, + "latitude": 40.105495, + "longitude": -77.640461, + "city": "Lurgan", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17233, + "latitude": 39.928812, + "longitude": -77.981379, + "city": "Mc Connellsburg", + "state": "PA", + "county": "Fulton" + }, + { + "zip_code": 17235, + "latitude": 39.858699, + "longitude": -77.69815, + "city": "Marion", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17236, + "latitude": 39.819034, + "longitude": -77.798952, + "city": "Mercersburg", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17237, + "latitude": 39.83593, + "longitude": -77.553776, + "city": "Mont Alto", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17238, + "latitude": 39.943762, + "longitude": -78.122265, + "city": "Needmore", + "state": "PA", + "county": "Fulton" + }, + { + "zip_code": 17239, + "latitude": 40.402523, + "longitude": -77.966977, + "city": "Neelyton", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 17240, + "latitude": 40.174798, + "longitude": -77.470285, + "city": "Newburg", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17241, + "latitude": 40.173093, + "longitude": -77.421905, + "city": "Newville", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17243, + "latitude": 40.225376, + "longitude": -77.887496, + "city": "Orbisonia", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 17244, + "latitude": 40.079556, + "longitude": -77.679344, + "city": "Orrstown", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17246, + "latitude": 40.049118, + "longitude": -77.671754, + "city": "Pleasant Hall", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17247, + "latitude": 39.799481, + "longitude": -77.581092, + "city": "Quincy", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17249, + "latitude": 40.402523, + "longitude": -77.966977, + "city": "Rockhill Furnace", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 17250, + "latitude": 39.736395, + "longitude": -77.52474, + "city": "Rouzerville", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17251, + "latitude": 40.112652, + "longitude": -77.670626, + "city": "Roxbury", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17252, + "latitude": 39.916149, + "longitude": -77.811826, + "city": "Saint Thomas", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17253, + "latitude": 40.402523, + "longitude": -77.966977, + "city": "Saltillo", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 17254, + "latitude": 39.96959, + "longitude": -77.584841, + "city": "Scotland", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17255, + "latitude": 40.133259, + "longitude": -77.87475, + "city": "Shade Gap", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 17256, + "latitude": 39.783391, + "longitude": -77.674851, + "city": "Shady Grove", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17257, + "latitude": 40.070789, + "longitude": -77.45983, + "city": "Shippensburg", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17260, + "latitude": 40.402523, + "longitude": -77.966977, + "city": "Shirleysburg", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 17261, + "latitude": 39.833095, + "longitude": -77.488633, + "city": "South Mountain", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17262, + "latitude": 40.173439, + "longitude": -77.709212, + "city": "Spring Run", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17263, + "latitude": 39.724825, + "longitude": -77.718629, + "city": "State Line", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17264, + "latitude": 40.222408, + "longitude": -77.941975, + "city": "Three Springs", + "state": "PA", + "county": "Huntingdon" + }, + { + "zip_code": 17265, + "latitude": 40.054782, + "longitude": -77.775921, + "city": "Upperstrasburg", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17266, + "latitude": 40.104094, + "longitude": -77.472794, + "city": "Walnut Bottom", + "state": "PA", + "county": "Cumberland" + }, + { + "zip_code": 17267, + "latitude": 39.943762, + "longitude": -78.122265, + "city": "Warfordsburg", + "state": "PA", + "county": "Fulton" + }, + { + "zip_code": 17268, + "latitude": 39.793552, + "longitude": -77.59228, + "city": "Waynesboro", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17270, + "latitude": 39.854018, + "longitude": -77.799733, + "city": "Williamson", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17271, + "latitude": 40.108243, + "longitude": -77.807221, + "city": "Willow Hill", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17272, + "latitude": 39.771372, + "longitude": -77.62702, + "city": "Zullinger", + "state": "PA", + "county": "Franklin" + }, + { + "zip_code": 17301, + "latitude": 39.896923, + "longitude": -76.994725, + "city": "Abbottstown", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17302, + "latitude": 39.821313, + "longitude": -76.405931, + "city": "Airville", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17303, + "latitude": 39.923644, + "longitude": -77.300085, + "city": "Arendtsville", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17304, + "latitude": 39.976602, + "longitude": -77.227126, + "city": "Aspers", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17306, + "latitude": 39.979154, + "longitude": -77.249592, + "city": "Bendersville", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17307, + "latitude": 39.933286, + "longitude": -77.287491, + "city": "Biglerville", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17309, + "latitude": 39.860758, + "longitude": -76.467305, + "city": "Brogue", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17310, + "latitude": 39.890605, + "longitude": -77.356642, + "city": "Cashtown", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17311, + "latitude": 39.871756, + "longitude": -76.759884, + "city": "Codorus", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17312, + "latitude": 39.946739, + "longitude": -76.506639, + "city": "Craley", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17313, + "latitude": 39.912423, + "longitude": -76.65353, + "city": "Dallastown", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17314, + "latitude": 39.792142, + "longitude": -76.54384, + "city": "Delta", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17315, + "latitude": 40.004544, + "longitude": -76.884956, + "city": "Dover", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17316, + "latitude": 39.876563, + "longitude": -77.027176, + "city": "East Berlin", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17317, + "latitude": 39.97014, + "longitude": -76.521686, + "city": "East Prospect", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17318, + "latitude": 40.021496, + "longitude": -76.726638, + "city": "Emigsville", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17319, + "latitude": 40.150726, + "longitude": -76.798353, + "city": "Etters", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17320, + "latitude": 39.780789, + "longitude": -77.361859, + "city": "Fairfield", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17321, + "latitude": 39.784476, + "longitude": -76.518286, + "city": "Fawn Grove", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17322, + "latitude": 39.844726, + "longitude": -76.576556, + "city": "Felton", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17323, + "latitude": 40.07501, + "longitude": -77.027926, + "city": "Franklintown", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17324, + "latitude": 40.017772, + "longitude": -77.193663, + "city": "Gardners", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17325, + "latitude": 39.840922, + "longitude": -77.226591, + "city": "Gettysburg", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17326, + "latitude": 39.8948, + "longitude": -77.213493, + "city": "Gettysburg", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17327, + "latitude": 39.892205, + "longitude": -76.750637, + "city": "Glen Rock", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17329, + "latitude": 39.766883, + "longitude": -76.877706, + "city": "Glenville", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17331, + "latitude": 39.935502, + "longitude": -76.672739, + "city": "Hanover", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17332, + "latitude": 39.775037, + "longitude": -76.735116, + "city": "Hanover", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17333, + "latitude": 39.972985, + "longitude": -76.687826, + "city": "Hanover", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17334, + "latitude": "", + "longitude": "", + "city": "Hanover", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17337, + "latitude": 40.015656, + "longitude": -77.200131, + "city": "Idaville", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17339, + "latitude": 39.995219, + "longitude": -76.889249, + "city": "Lewisberry", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17340, + "latitude": 39.829806, + "longitude": -77.095399, + "city": "Littlestown", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17342, + "latitude": 39.853644, + "longitude": -76.707997, + "city": "Loganville", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17343, + "latitude": 39.869229, + "longitude": -77.329248, + "city": "Mc Knightstown", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17344, + "latitude": 39.801004, + "longitude": -77.022875, + "city": "Mc Sherrystown", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17345, + "latitude": 39.95406, + "longitude": -76.835812, + "city": "Manchester", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17347, + "latitude": 39.942848, + "longitude": -76.552798, + "city": "Mount Wolf", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17349, + "latitude": 39.866988, + "longitude": -76.633324, + "city": "New Freedom", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17350, + "latitude": 39.881881, + "longitude": -77.077431, + "city": "New Oxford", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17352, + "latitude": 39.838639, + "longitude": -76.449874, + "city": "New Park", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17353, + "latitude": 39.882976, + "longitude": -77.393593, + "city": "Orrtanna", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17354, + "latitude": 39.82457, + "longitude": -76.89927, + "city": "Porters Sideling", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17355, + "latitude": 39.757328, + "longitude": -76.699442, + "city": "Railroad", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17356, + "latitude": 39.905747, + "longitude": -76.615805, + "city": "Red Lion", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17358, + "latitude": 39.972985, + "longitude": -76.687826, + "city": "Rossville", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17360, + "latitude": 39.823461, + "longitude": -76.700714, + "city": "Seven Valleys", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17361, + "latitude": 39.799799, + "longitude": -76.687931, + "city": "Shrewsbury", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17362, + "latitude": 39.944531, + "longitude": -76.775774, + "city": "Spring Grove", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17363, + "latitude": 39.809151, + "longitude": -76.606747, + "city": "Stewartstown", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17364, + "latitude": 39.933775, + "longitude": -76.905317, + "city": "Thomasville", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17365, + "latitude": 40.018835, + "longitude": -76.784811, + "city": "Wellsville", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17366, + "latitude": 40.006581, + "longitude": -76.613232, + "city": "Windsor", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17368, + "latitude": 39.994482, + "longitude": -76.677736, + "city": "Wrightsville", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17370, + "latitude": 40.067766, + "longitude": -76.720322, + "city": "York Haven", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17371, + "latitude": 39.900579, + "longitude": -76.789624, + "city": "York New Salem", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17372, + "latitude": 40.007937, + "longitude": -77.100231, + "city": "York Springs", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17375, + "latitude": 39.8948, + "longitude": -77.213493, + "city": "Peach Glen", + "state": "PA", + "county": "Adams" + }, + { + "zip_code": 17401, + "latitude": 39.962998, + "longitude": -76.727139, + "city": "York", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17402, + "latitude": 40.001615, + "longitude": -76.689918, + "city": "York", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17403, + "latitude": 39.93939, + "longitude": -76.666257, + "city": "York", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17404, + "latitude": 39.934957, + "longitude": -76.577982, + "city": "York", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17405, + "latitude": 40.008647, + "longitude": -76.597187, + "city": "York", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17406, + "latitude": 40.004593, + "longitude": -76.594727, + "city": "York", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17407, + "latitude": 39.897907, + "longitude": -76.662569, + "city": "York", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17415, + "latitude": 39.972985, + "longitude": -76.687826, + "city": "York", + "state": "PA", + "county": "York" + }, + { + "zip_code": 17501, + "latitude": 40.129894, + "longitude": -76.361053, + "city": "Akron", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17502, + "latitude": 40.088469, + "longitude": -76.462434, + "city": "Bainbridge", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17503, + "latitude": 40.0185, + "longitude": -76.297582, + "city": "Bart", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17504, + "latitude": 40.024047, + "longitude": -76.328081, + "city": "Bausman", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17505, + "latitude": 40.066647, + "longitude": -76.187926, + "city": "Bird In Hand", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17506, + "latitude": 40.117326, + "longitude": -76.052379, + "city": "Blue Ball", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17507, + "latitude": 40.196641, + "longitude": -76.016047, + "city": "Bowmansville", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17508, + "latitude": 40.125896, + "longitude": -76.213013, + "city": "Brownstown", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17509, + "latitude": 39.903954, + "longitude": -76.040115, + "city": "Christiana", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17512, + "latitude": 40.11675, + "longitude": -76.369028, + "city": "Columbia", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17516, + "latitude": 40.026391, + "longitude": -76.262044, + "city": "Conestoga", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17517, + "latitude": 40.188445, + "longitude": -76.337734, + "city": "Denver", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17518, + "latitude": 39.818309, + "longitude": -76.249931, + "city": "Drumore", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17519, + "latitude": 40.142759, + "longitude": -76.019741, + "city": "East Earl", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17520, + "latitude": 40.097468, + "longitude": -76.356832, + "city": "East Petersburg", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17521, + "latitude": 40.204393, + "longitude": -76.34643, + "city": "Elm", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17522, + "latitude": 40.169662, + "longitude": -76.356933, + "city": "Ephrata", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17527, + "latitude": 40.011961, + "longitude": -76.021595, + "city": "Gap", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17528, + "latitude": 40.043523, + "longitude": -76.238766, + "city": "Goodville", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17529, + "latitude": 40.043967, + "longitude": -76.108543, + "city": "Gordonville", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17532, + "latitude": 39.86632, + "longitude": -76.28062, + "city": "Holtwood", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17533, + "latitude": 40.233892, + "longitude": -76.260725, + "city": "Hopeland", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17534, + "latitude": 40.036659, + "longitude": -76.106902, + "city": "Intercourse", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17535, + "latitude": 40.005276, + "longitude": -76.042921, + "city": "Kinzers", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17536, + "latitude": 39.842724, + "longitude": -76.080469, + "city": "Kirkwood", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17537, + "latitude": 39.988548, + "longitude": -76.238729, + "city": "Lampeter", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17538, + "latitude": 40.112477, + "longitude": -76.36089, + "city": "Landisville", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17540, + "latitude": 40.100846, + "longitude": -76.191873, + "city": "Leola", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17543, + "latitude": 40.134761, + "longitude": -76.455212, + "city": "Lititz", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17545, + "latitude": 40.155927, + "longitude": -76.464018, + "city": "Manheim", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17547, + "latitude": 40.061596, + "longitude": -76.485935, + "city": "Marietta", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17549, + "latitude": 40.154498, + "longitude": -76.08756, + "city": "Martindale", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17550, + "latitude": 40.072108, + "longitude": -76.57779, + "city": "Maytown", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17551, + "latitude": 40.031882, + "longitude": -76.236823, + "city": "Millersville", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17552, + "latitude": 40.113745, + "longitude": -76.354, + "city": "Mount Joy", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17554, + "latitude": 40.038842, + "longitude": -76.425978, + "city": "Mountville", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17555, + "latitude": 40.120279, + "longitude": -75.961183, + "city": "Narvon", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17557, + "latitude": 40.14607, + "longitude": -76.073814, + "city": "New Holland", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17560, + "latitude": 39.912288, + "longitude": -76.237428, + "city": "New Providence", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17562, + "latitude": 39.898072, + "longitude": -76.091234, + "city": "Paradise", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17563, + "latitude": 39.844788, + "longitude": -76.155069, + "city": "Peach Bottom", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17564, + "latitude": 40.0185, + "longitude": -76.297582, + "city": "Penryn", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17565, + "latitude": 39.904409, + "longitude": -76.322481, + "city": "Pequea", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17566, + "latitude": 39.856368, + "longitude": -76.148506, + "city": "Quarryville", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17567, + "latitude": 40.209941, + "longitude": -76.116445, + "city": "Reamstown", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17568, + "latitude": 39.9469, + "longitude": -76.232229, + "city": "Refton", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17569, + "latitude": 40.152713, + "longitude": -76.091179, + "city": "Reinholds", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17570, + "latitude": 40.129645, + "longitude": -76.571739, + "city": "Rheems", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17572, + "latitude": 40.015026, + "longitude": -76.149994, + "city": "Ronks", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17573, + "latitude": 40.0185, + "longitude": -76.297582, + "city": "Ronks", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17575, + "latitude": 40.064746, + "longitude": -76.434285, + "city": "Silver Spring", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17576, + "latitude": 40.036398, + "longitude": -76.203069, + "city": "Smoketown", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17577, + "latitude": 40.0185, + "longitude": -76.297582, + "city": "Soudersburg", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17578, + "latitude": 40.168624, + "longitude": -76.330001, + "city": "Stevens", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17579, + "latitude": 40.082226, + "longitude": -76.113772, + "city": "Strasburg", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17580, + "latitude": 40.116846, + "longitude": -76.213075, + "city": "Talmage", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17581, + "latitude": 40.157576, + "longitude": -76.046317, + "city": "Terre Hill", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17582, + "latitude": 39.990664, + "longitude": -76.43485, + "city": "Washington Boro", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17583, + "latitude": 39.972349, + "longitude": -76.28733, + "city": "West Willow", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17584, + "latitude": 39.959349, + "longitude": -76.259779, + "city": "Willow Street", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17585, + "latitude": 40.048398, + "longitude": -76.211427, + "city": "Witmer", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17601, + "latitude": 40.076553, + "longitude": -76.31068, + "city": "Lancaster", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17602, + "latitude": 40.004048, + "longitude": -76.249829, + "city": "Lancaster", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17603, + "latitude": 40.009147, + "longitude": -76.367132, + "city": "Lancaster", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17604, + "latitude": 40.065096, + "longitude": -76.335631, + "city": "Lancaster", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17605, + "latitude": 40.0185, + "longitude": -76.297582, + "city": "Lancaster", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17606, + "latitude": 40.110201, + "longitude": -76.305378, + "city": "Lancaster", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17607, + "latitude": 40.0185, + "longitude": -76.297582, + "city": "Lancaster", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17608, + "latitude": 40.0185, + "longitude": -76.297582, + "city": "Lancaster", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17699, + "latitude": 40.0185, + "longitude": -76.297582, + "city": "Lancaster", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 17701, + "latitude": 41.266716, + "longitude": -76.958314, + "city": "Williamsport", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17702, + "latitude": 41.194306, + "longitude": -77.054665, + "city": "Williamsport", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17703, + "latitude": 41.33275, + "longitude": -77.023601, + "city": "Williamsport", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17705, + "latitude": 41.33275, + "longitude": -77.023601, + "city": "Williamsport", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17720, + "latitude": 41.186545, + "longitude": -77.218368, + "city": "Antes Fort", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17721, + "latitude": 41.186028, + "longitude": -77.316191, + "city": "Avis", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17722, + "latitude": 41.33275, + "longitude": -77.023601, + "city": "Bodines", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17723, + "latitude": 41.33275, + "longitude": -77.023601, + "city": "Jersey Shore", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17724, + "latitude": 41.639449, + "longitude": -76.84143, + "city": "Canton", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 17726, + "latitude": 41.122741, + "longitude": -77.431745, + "city": "Castanea", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17727, + "latitude": 41.33275, + "longitude": -77.023601, + "city": "Cedar Run", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17728, + "latitude": 41.255299, + "longitude": -76.948034, + "city": "Cogan Station", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17729, + "latitude": 41.737627, + "longitude": -77.902366, + "city": "Cross Fork", + "state": "PA", + "county": "Potter" + }, + { + "zip_code": 17730, + "latitude": 41.10891, + "longitude": -76.877491, + "city": "Dewart", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17731, + "latitude": 41.432901, + "longitude": -76.516887, + "city": "Eagles Mere", + "state": "PA", + "county": "Sullivan" + }, + { + "zip_code": 17735, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Grover", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 17737, + "latitude": 41.280128, + "longitude": -76.6753, + "city": "Hughesville", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17738, + "latitude": 41.220635, + "longitude": -77.618532, + "city": "Hyner", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17739, + "latitude": 41.33275, + "longitude": -77.023601, + "city": "Jersey Mills", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17740, + "latitude": 41.208518, + "longitude": -77.025687, + "city": "Jersey Shore", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17742, + "latitude": 41.229734, + "longitude": -76.594727, + "city": "Lairdsville", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17743, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Leroy", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 17744, + "latitude": 41.251994, + "longitude": -77.161674, + "city": "Linden", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17745, + "latitude": 41.229022, + "longitude": -77.641745, + "city": "Lock Haven", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17747, + "latitude": 41.018519, + "longitude": -77.341611, + "city": "Loganton", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17748, + "latitude": 41.135507, + "longitude": -77.369964, + "city": "Mc Elhattan", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17749, + "latitude": 41.071982, + "longitude": -76.818381, + "city": "Mc Ewensville", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17750, + "latitude": 41.032529, + "longitude": -77.495147, + "city": "Mackeyville", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17751, + "latitude": 41.071123, + "longitude": -77.476304, + "city": "Mill Hall", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17752, + "latitude": 41.214561, + "longitude": -76.856502, + "city": "Montgomery", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17754, + "latitude": 41.307308, + "longitude": -76.881055, + "city": "Montoursville", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17756, + "latitude": 41.244348, + "longitude": -76.74048, + "city": "Muncy", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17758, + "latitude": 41.432901, + "longitude": -76.516887, + "city": "Muncy Valley", + "state": "PA", + "county": "Sullivan" + }, + { + "zip_code": 17759, + "latitude": 41.218259, + "longitude": -77.12137, + "city": "Nisbet", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17760, + "latitude": 41.220635, + "longitude": -77.618532, + "city": "North Bend", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17762, + "latitude": 41.221474, + "longitude": -76.659535, + "city": "Picture Rocks", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17763, + "latitude": 41.498523, + "longitude": -76.946724, + "city": "Ralston", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17764, + "latitude": 41.306045, + "longitude": -77.571221, + "city": "Renovo", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17765, + "latitude": 41.77197, + "longitude": -77.242228, + "city": "Roaring Branch", + "state": "PA", + "county": "Tioga" + }, + { + "zip_code": 17767, + "latitude": 41.220635, + "longitude": -77.618532, + "city": "Salona", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17768, + "latitude": 41.432901, + "longitude": -76.516887, + "city": "Shunk", + "state": "PA", + "county": "Sullivan" + }, + { + "zip_code": 17769, + "latitude": 41.33275, + "longitude": -77.023601, + "city": "Slate Run", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17771, + "latitude": 41.438766, + "longitude": -77.06138, + "city": "Trout Run", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17772, + "latitude": 41.10285, + "longitude": -76.823084, + "city": "Turbotville", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17773, + "latitude": 41.220635, + "longitude": -77.618532, + "city": "Tylersville", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17774, + "latitude": 41.227207, + "longitude": -76.646221, + "city": "Unityville", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17776, + "latitude": 41.37857, + "longitude": -77.331293, + "city": "Waterville", + "state": "PA", + "county": "Lycoming" + }, + { + "zip_code": 17777, + "latitude": 41.097981, + "longitude": -76.850306, + "city": "Watsontown", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17778, + "latitude": 41.270789, + "longitude": -77.969664, + "city": "Westport", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17779, + "latitude": 41.187424, + "longitude": -77.372827, + "city": "Woolrich", + "state": "PA", + "county": "Clinton" + }, + { + "zip_code": 17801, + "latitude": 40.869766, + "longitude": -76.735577, + "city": "Sunbury", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17810, + "latitude": 40.978059, + "longitude": -77.08184, + "city": "Allenwood", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17812, + "latitude": 40.726469, + "longitude": -77.272828, + "city": "Beaver Springs", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17813, + "latitude": 40.754705, + "longitude": -77.169508, + "city": "Beavertown", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17814, + "latitude": 41.218998, + "longitude": -76.395426, + "city": "Benton", + "state": "PA", + "county": "Columbia" + }, + { + "zip_code": 17815, + "latitude": 41.005609, + "longitude": -76.430563, + "city": "Bloomsburg", + "state": "PA", + "county": "Columbia" + }, + { + "zip_code": 17820, + "latitude": 41.020674, + "longitude": -76.436239, + "city": "Catawissa", + "state": "PA", + "county": "Columbia" + }, + { + "zip_code": 17821, + "latitude": 40.991968, + "longitude": -76.647082, + "city": "Danville", + "state": "PA", + "county": "Montour" + }, + { + "zip_code": 17822, + "latitude": 40.967437, + "longitude": -76.604896, + "city": "Danville", + "state": "PA", + "county": "Montour" + }, + { + "zip_code": 17823, + "latitude": 40.889632, + "longitude": -76.664574, + "city": "Dornsife", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17824, + "latitude": 40.859435, + "longitude": -76.550811, + "city": "Elysburg", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17825, + "latitude": 40.889632, + "longitude": -76.664574, + "city": "Excelsior", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17827, + "latitude": 40.765049, + "longitude": -76.939544, + "city": "Freeburg", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17828, + "latitude": 40.889632, + "longitude": -76.664574, + "city": "Gowen City", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17829, + "latitude": 40.882861, + "longitude": -77.189174, + "city": "Hartleton", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17830, + "latitude": 40.889632, + "longitude": -76.664574, + "city": "Herndon", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17831, + "latitude": 40.834408, + "longitude": -76.835439, + "city": "Hummels Wharf", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17832, + "latitude": 40.805096, + "longitude": -76.464607, + "city": "Marion Heights", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17833, + "latitude": 40.762675, + "longitude": -77.07752, + "city": "Kreamer", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17834, + "latitude": 40.793938, + "longitude": -76.476946, + "city": "Kulpmont", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17835, + "latitude": 40.978059, + "longitude": -77.08184, + "city": "Laurelton", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17836, + "latitude": 40.889632, + "longitude": -76.664574, + "city": "Leck Kill", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17837, + "latitude": 40.969642, + "longitude": -76.948072, + "city": "Lewisburg", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17839, + "latitude": 41.020062, + "longitude": -76.438413, + "city": "Light Street", + "state": "PA", + "county": "Columbia" + }, + { + "zip_code": 17840, + "latitude": 40.772687, + "longitude": -76.438311, + "city": "Locust Gap", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17841, + "latitude": 40.766765, + "longitude": -77.150271, + "city": "Mc Clure", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17842, + "latitude": 40.779808, + "longitude": -77.117558, + "city": "Middleburg", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17843, + "latitude": 40.762675, + "longitude": -77.07752, + "city": "Beaver Springs", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17844, + "latitude": 40.947833, + "longitude": -77.011087, + "city": "Mifflinburg", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17845, + "latitude": 40.978059, + "longitude": -77.08184, + "city": "Millmont", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17846, + "latitude": 41.143816, + "longitude": -76.525177, + "city": "Millville", + "state": "PA", + "county": "Columbia" + }, + { + "zip_code": 17847, + "latitude": 40.993883, + "longitude": -76.847896, + "city": "Milton", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17850, + "latitude": 40.889632, + "longitude": -76.664574, + "city": "Montandon", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17851, + "latitude": 40.803636, + "longitude": -76.428612, + "city": "Mount Carmel", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17853, + "latitude": 40.723706, + "longitude": -77.013547, + "city": "Mount Pleasant Mills", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17855, + "latitude": 40.882689, + "longitude": -76.984667, + "city": "New Berlin", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17856, + "latitude": 41.048043, + "longitude": -76.903895, + "city": "New Columbia", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17857, + "latitude": 40.90805, + "longitude": -76.784197, + "city": "Northumberland", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17858, + "latitude": 41.042106, + "longitude": -76.424297, + "city": "Numidia", + "state": "PA", + "county": "Columbia" + }, + { + "zip_code": 17859, + "latitude": 41.061483, + "longitude": -76.418093, + "city": "Orangeville", + "state": "PA", + "county": "Columbia" + }, + { + "zip_code": 17860, + "latitude": 40.889632, + "longitude": -76.664574, + "city": "Paxinos", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17861, + "latitude": 40.762675, + "longitude": -77.07752, + "city": "Paxtonville", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17862, + "latitude": 40.857426, + "longitude": -77.064941, + "city": "Penns Creek", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17864, + "latitude": 40.695087, + "longitude": -76.903957, + "city": "Port Trevorton", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17865, + "latitude": 40.889632, + "longitude": -76.664574, + "city": "Potts Grove", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17866, + "latitude": 40.791688, + "longitude": -76.551871, + "city": "Coal Township", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17867, + "latitude": 40.889632, + "longitude": -76.664574, + "city": "Rebuck", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17868, + "latitude": 40.952908, + "longitude": -76.631118, + "city": "Riverside", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17870, + "latitude": 40.825914, + "longitude": -76.857577, + "city": "Selinsgrove", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17872, + "latitude": 40.791953, + "longitude": -76.601592, + "city": "Shamokin", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17876, + "latitude": 40.845896, + "longitude": -76.82241, + "city": "Shamokin Dam", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17877, + "latitude": 40.87897, + "longitude": -76.667267, + "city": "Snydertown", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17878, + "latitude": 41.120644, + "longitude": -76.412386, + "city": "Stillwater", + "state": "PA", + "county": "Columbia" + }, + { + "zip_code": 17880, + "latitude": 40.978059, + "longitude": -77.08184, + "city": "Swengel", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17881, + "latitude": 40.782155, + "longitude": -76.672737, + "city": "Trevorton", + "state": "PA", + "county": "Northumberland" + }, + { + "zip_code": 17882, + "latitude": 40.762675, + "longitude": -77.07752, + "city": "Troxelville", + "state": "PA", + "county": "Snyder" + }, + { + "zip_code": 17883, + "latitude": 40.978059, + "longitude": -77.08184, + "city": "Vicksburg", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17884, + "latitude": 41.027277, + "longitude": -76.653633, + "city": "Washingtonville", + "state": "PA", + "county": "Montour" + }, + { + "zip_code": 17885, + "latitude": 40.978059, + "longitude": -77.08184, + "city": "Weikert", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17886, + "latitude": 41.01789, + "longitude": -76.870841, + "city": "West Milton", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17887, + "latitude": 40.978059, + "longitude": -77.08184, + "city": "White Deer", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17888, + "latitude": 40.815401, + "longitude": -76.368632, + "city": "Wilburton", + "state": "PA", + "county": "Columbia" + }, + { + "zip_code": 17889, + "latitude": 40.905947, + "longitude": -76.859662, + "city": "Winfield", + "state": "PA", + "county": "Union" + }, + { + "zip_code": 17901, + "latitude": 40.708751, + "longitude": -76.282986, + "city": "Pottsville", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17920, + "latitude": 40.816696, + "longitude": -76.350279, + "city": "Aristes", + "state": "PA", + "county": "Columbia" + }, + { + "zip_code": 17921, + "latitude": 40.692886, + "longitude": -76.303085, + "city": "Ashland", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17922, + "latitude": 40.59782, + "longitude": -76.14932, + "city": "Auburn", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17923, + "latitude": 40.67602, + "longitude": -76.316013, + "city": "Branchdale", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17925, + "latitude": 40.750796, + "longitude": -76.062859, + "city": "Brockton", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17927, + "latitude": 40.804881, + "longitude": -76.341156, + "city": "Centralia", + "state": "PA", + "county": "Columbia" + }, + { + "zip_code": 17929, + "latitude": 40.675475, + "longitude": -76.165297, + "city": "Cressona", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17930, + "latitude": 40.711356, + "longitude": -76.139162, + "city": "Cumbola", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17931, + "latitude": 40.692869, + "longitude": -76.348699, + "city": "Frackville", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17932, + "latitude": 40.649109, + "longitude": -76.503339, + "city": "Frackville", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17933, + "latitude": 40.595462, + "longitude": -76.246441, + "city": "Friedensburg", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17934, + "latitude": 40.798623, + "longitude": -76.21553, + "city": "Gilberton", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17935, + "latitude": 40.795384, + "longitude": -76.270574, + "city": "Girardville", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17936, + "latitude": 40.748879, + "longitude": -76.335499, + "city": "Gordon", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17938, + "latitude": 40.688219, + "longitude": -76.539205, + "city": "Hegins", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17941, + "latitude": 40.687178, + "longitude": -76.578173, + "city": "Klingerstown", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17942, + "latitude": 40.722587, + "longitude": -76.229623, + "city": "Landingville", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17943, + "latitude": 40.761438, + "longitude": -76.387242, + "city": "Lavelle", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17944, + "latitude": 40.67578, + "longitude": -76.2819, + "city": "Llewellyn", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17945, + "latitude": 40.774531, + "longitude": -76.370427, + "city": "Locustdale", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17946, + "latitude": 40.808081, + "longitude": -76.240747, + "city": "Lost Creek", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17948, + "latitude": 40.733004, + "longitude": -76.306129, + "city": "Mahanoy City", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17949, + "latitude": 40.794007, + "longitude": -76.243323, + "city": "Mahanoy Plane", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17951, + "latitude": 40.682985, + "longitude": -76.238725, + "city": "Mar Lin", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17952, + "latitude": 40.747301, + "longitude": -76.062825, + "city": "Mary D", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17953, + "latitude": 40.733072, + "longitude": -76.085783, + "city": "Middleport", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17954, + "latitude": 40.711461, + "longitude": -76.199621, + "city": "Minersville", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17957, + "latitude": 40.592578, + "longitude": -76.516075, + "city": "Muir", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17959, + "latitude": 40.675413, + "longitude": -76.155786, + "city": "New Philadelphia", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17960, + "latitude": 40.703416, + "longitude": -75.959812, + "city": "New Ringgold", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17961, + "latitude": 40.618065, + "longitude": -76.206854, + "city": "Orwigsburg", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17963, + "latitude": 40.577029, + "longitude": -76.33716, + "city": "Pine Grove", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17964, + "latitude": 40.724376, + "longitude": -76.488833, + "city": "Pitman", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17965, + "latitude": 40.771333, + "longitude": -76.199259, + "city": "Port Carbon", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17966, + "latitude": 40.722587, + "longitude": -76.229623, + "city": "Ravine", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17967, + "latitude": 40.856227, + "longitude": -76.23464, + "city": "Ringtown", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17968, + "latitude": 40.636539, + "longitude": -76.591109, + "city": "Sacramento", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17970, + "latitude": 40.707055, + "longitude": -76.284374, + "city": "Saint Clair", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17972, + "latitude": 40.602048, + "longitude": -76.154856, + "city": "Schuylkill Haven", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17974, + "latitude": 40.690632, + "longitude": -76.227294, + "city": "Seltzer", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17976, + "latitude": 40.763239, + "longitude": -76.148397, + "city": "Shenandoah", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17978, + "latitude": 40.625754, + "longitude": -76.621769, + "city": "Spring Glen", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17979, + "latitude": 40.554516, + "longitude": -76.203767, + "city": "Summit Station", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17980, + "latitude": 40.590428, + "longitude": -76.53981, + "city": "Tower City", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17981, + "latitude": 40.694624, + "longitude": -76.306539, + "city": "Tremont", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17982, + "latitude": 40.781484, + "longitude": -76.013399, + "city": "Tuscarora", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17983, + "latitude": 40.645911, + "longitude": -76.532384, + "city": "Valley View", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 17985, + "latitude": 40.914137, + "longitude": -76.193099, + "city": "Zion Grove", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 18001, + "latitude": 40.693376, + "longitude": -75.471156, + "city": "Lehigh Valley", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18002, + "latitude": 40.665597, + "longitude": -75.426247, + "city": "Lehigh Valley", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18003, + "latitude": 40.693376, + "longitude": -75.471156, + "city": "Lehigh Valley", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18010, + "latitude": 40.693376, + "longitude": -75.471156, + "city": "Ackermanville", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18011, + "latitude": 40.514472, + "longitude": -75.602941, + "city": "Alburtis", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18012, + "latitude": 40.813281, + "longitude": -75.59202, + "city": "Aquashicola", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18013, + "latitude": 40.766465, + "longitude": -75.315246, + "city": "Bangor", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18014, + "latitude": 40.733142, + "longitude": -75.351785, + "city": "Bath", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18015, + "latitude": 40.58883, + "longitude": -75.351958, + "city": "Bethlehem", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18016, + "latitude": 40.693376, + "longitude": -75.471156, + "city": "Bethlehem", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18017, + "latitude": 40.662211, + "longitude": -75.39027, + "city": "Bethlehem", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18018, + "latitude": 40.625297, + "longitude": -75.379174, + "city": "Bethlehem", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18020, + "latitude": 40.669251, + "longitude": -75.334887, + "city": "Bethlehem", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18025, + "latitude": 40.693376, + "longitude": -75.471156, + "city": "Bethlehem", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18030, + "latitude": 40.801062, + "longitude": -75.661425, + "city": "Bowmanstown", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18031, + "latitude": 40.550733, + "longitude": -75.540673, + "city": "Breinigsville", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18032, + "latitude": 40.602633, + "longitude": -75.472276, + "city": "Catasauqua", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18034, + "latitude": 40.543998, + "longitude": -75.41242, + "city": "Center Valley", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18035, + "latitude": 40.750996, + "longitude": -75.53937, + "city": "Cherryville", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18036, + "latitude": 40.502424, + "longitude": -75.411145, + "city": "Coopersburg", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18037, + "latitude": 40.616645, + "longitude": -75.489587, + "city": "Coplay", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18038, + "latitude": 40.79071, + "longitude": -75.482967, + "city": "Danielsville", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18039, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Durham", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18040, + "latitude": 40.806206, + "longitude": -75.20887, + "city": "Easton", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18041, + "latitude": 40.382488, + "longitude": -75.51541, + "city": "East Greenville", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18042, + "latitude": 40.683198, + "longitude": -75.264861, + "city": "Easton", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18043, + "latitude": 40.792804, + "longitude": -75.137186, + "city": "Easton", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18044, + "latitude": 40.693376, + "longitude": -75.471156, + "city": "Easton", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18045, + "latitude": 40.695731, + "longitude": -75.286528, + "city": "Easton", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18046, + "latitude": 40.538843, + "longitude": -75.568502, + "city": "East Texas", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18049, + "latitude": 40.520705, + "longitude": -75.496131, + "city": "Emmaus", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18050, + "latitude": 40.693376, + "longitude": -75.471156, + "city": "Flicksville", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18051, + "latitude": 40.599843, + "longitude": -75.663187, + "city": "Fogelsville", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18052, + "latitude": 40.656746, + "longitude": -75.504128, + "city": "Whitehall", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18053, + "latitude": 40.718662, + "longitude": -75.700739, + "city": "Germansville", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18054, + "latitude": 40.289663, + "longitude": -75.450703, + "city": "Green Lane", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18055, + "latitude": 40.588799, + "longitude": -75.313756, + "city": "Hellertown", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18056, + "latitude": 40.454205, + "longitude": -75.581444, + "city": "Hereford", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 18058, + "latitude": 40.903599, + "longitude": -75.476885, + "city": "Kunkletown", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18059, + "latitude": 40.717684, + "longitude": -75.533488, + "city": "Laurys Station", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18060, + "latitude": 40.53484, + "longitude": -75.57864, + "city": "Limeport", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18062, + "latitude": 40.517851, + "longitude": -75.565028, + "city": "Macungie", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18063, + "latitude": 40.782456, + "longitude": -75.173494, + "city": "Martins Creek", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18064, + "latitude": 40.737648, + "longitude": -75.272892, + "city": "Nazareth", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18065, + "latitude": 40.696738, + "longitude": -75.611647, + "city": "Neffs", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18066, + "latitude": 40.652611, + "longitude": -75.759361, + "city": "New Tripoli", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18067, + "latitude": 40.724479, + "longitude": -75.365412, + "city": "Northampton", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18068, + "latitude": 40.693376, + "longitude": -75.471156, + "city": "Old Zionsville", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18069, + "latitude": 40.629605, + "longitude": -75.621885, + "city": "Orefield", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18070, + "latitude": 40.430181, + "longitude": -75.531182, + "city": "Palm", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18071, + "latitude": 40.855728, + "longitude": -75.58918, + "city": "Palmerton", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18072, + "latitude": 40.841099, + "longitude": -75.258376, + "city": "Pen Argyl", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18073, + "latitude": 40.374347, + "longitude": -75.482175, + "city": "Pennsburg", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18074, + "latitude": 40.320832, + "longitude": -75.500492, + "city": "Perkiomenville", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18076, + "latitude": 40.387419, + "longitude": -75.505547, + "city": "Red Hill", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18077, + "latitude": 40.567316, + "longitude": -75.236191, + "city": "Riegelsville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18078, + "latitude": 40.669675, + "longitude": -75.620901, + "city": "Schnecksville", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18079, + "latitude": 40.745524, + "longitude": -75.659209, + "city": "Slatedale", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18080, + "latitude": 40.734537, + "longitude": -75.618611, + "city": "Slatington", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18081, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Springtown", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18083, + "latitude": 40.772873, + "longitude": -75.363531, + "city": "Stockertown", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18084, + "latitude": 40.327782, + "longitude": -75.454043, + "city": "Sumneytown", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18085, + "latitude": 40.740625, + "longitude": -75.254854, + "city": "Tatamy", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18086, + "latitude": 40.736119, + "longitude": -75.54494, + "city": "Treichlers", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18087, + "latitude": 40.548196, + "longitude": -75.596131, + "city": "Trexlertown", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18088, + "latitude": 40.759591, + "longitude": -75.428538, + "city": "Walnutport", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18091, + "latitude": 40.801131, + "longitude": -75.310958, + "city": "Wind Gap", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18092, + "latitude": 40.467193, + "longitude": -75.512091, + "city": "Zionsville", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18098, + "latitude": 40.693376, + "longitude": -75.471156, + "city": "Emmaus", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18099, + "latitude": 40.693376, + "longitude": -75.471156, + "city": "Emmaus", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18101, + "latitude": 40.607497, + "longitude": -75.470026, + "city": "Allentown", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18102, + "latitude": 40.607006, + "longitude": -75.480877, + "city": "Allentown", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18103, + "latitude": 40.604372, + "longitude": -75.473127, + "city": "Allentown", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18104, + "latitude": 40.621048, + "longitude": -75.545306, + "city": "Allentown", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18105, + "latitude": 40.693376, + "longitude": -75.471156, + "city": "Allentown", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18106, + "latitude": 40.582381, + "longitude": -75.591132, + "city": "Allentown", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18109, + "latitude": 40.693376, + "longitude": -75.471156, + "city": "Allentown", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18175, + "latitude": 40.585561, + "longitude": -75.621058, + "city": "Allentown", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18195, + "latitude": 40.57983, + "longitude": -75.579884, + "city": "Allentown", + "state": "PA", + "county": "Lehigh" + }, + { + "zip_code": 18201, + "latitude": 40.964584, + "longitude": -76.008333, + "city": "Hazleton", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18202, + "latitude": "", + "longitude": "", + "city": "Hazleton", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18210, + "latitude": 41.012618, + "longitude": -75.560751, + "city": "Albrightsville", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18211, + "latitude": 40.744932, + "longitude": -75.83155, + "city": "Andreas", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 18212, + "latitude": 40.784095, + "longitude": -75.708281, + "city": "Ashfield", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18214, + "latitude": 40.80868, + "longitude": -76.036009, + "city": "Barnesville", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 18216, + "latitude": 40.932217, + "longitude": -75.919196, + "city": "Beaver Meadows", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18218, + "latitude": 40.858951, + "longitude": -76.013009, + "city": "Coaldale", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 18219, + "latitude": 40.990662, + "longitude": -76.056358, + "city": "Conyngham", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18220, + "latitude": 40.838915, + "longitude": -76.069416, + "city": "Delano", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 18221, + "latitude": 41.001634, + "longitude": -75.905693, + "city": "Drifton", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18222, + "latitude": 41.034017, + "longitude": -76.003059, + "city": "Drums", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18223, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Ebervale", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18224, + "latitude": 41.019593, + "longitude": -75.881697, + "city": "Freeland", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18225, + "latitude": 40.988813, + "longitude": -75.961651, + "city": "Harleigh", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18229, + "latitude": 40.896709, + "longitude": -75.759303, + "city": "Jim Thorpe", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18230, + "latitude": 40.934763, + "longitude": -75.73577, + "city": "Junedale", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18231, + "latitude": 40.900231, + "longitude": -76.005382, + "city": "Kelayres", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 18232, + "latitude": 40.872243, + "longitude": -75.915416, + "city": "Lansford", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18234, + "latitude": 40.992517, + "longitude": -75.962585, + "city": "Lattimer Mines", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18235, + "latitude": 40.886664, + "longitude": -75.736164, + "city": "Lehighton", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18237, + "latitude": 40.897645, + "longitude": -75.997791, + "city": "Mcadoo", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 18239, + "latitude": 40.996051, + "longitude": -75.981475, + "city": "Milnesville", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18240, + "latitude": 40.933194, + "longitude": -75.76383, + "city": "Nesquehoning", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18241, + "latitude": 40.922289, + "longitude": -76.14894, + "city": "Nuremberg", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 18242, + "latitude": 40.910952, + "longitude": -76.122324, + "city": "Oneida", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 18243, + "latitude": 41.001683, + "longitude": -75.966146, + "city": "Pardeesville", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18244, + "latitude": 40.824546, + "longitude": -75.665068, + "city": "Parryville", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18245, + "latitude": 40.722587, + "longitude": -76.229623, + "city": "Quakake", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 18246, + "latitude": 40.954011, + "longitude": -76.174707, + "city": "Rock Glen", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18247, + "latitude": 41.014808, + "longitude": -76.058391, + "city": "Saint Johns", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18248, + "latitude": 40.901977, + "longitude": -76.118764, + "city": "Sheppton", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 18249, + "latitude": 40.975202, + "longitude": -76.0845, + "city": "Sugarloaf", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18250, + "latitude": 40.90537, + "longitude": -75.74156, + "city": "Summit Hill", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18251, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Sybertsville", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18252, + "latitude": 40.79849, + "longitude": -75.937836, + "city": "Tamaqua", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 18254, + "latitude": 40.924803, + "longitude": -75.938611, + "city": "Tresckow", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18255, + "latitude": 40.911443, + "longitude": -75.779007, + "city": "Weatherly", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18256, + "latitude": 40.944777, + "longitude": -76.145197, + "city": "Weston", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18301, + "latitude": 41.089642, + "longitude": -75.199705, + "city": "East Stroudsburg", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18320, + "latitude": 41.071213, + "longitude": -75.236436, + "city": "Analomink", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18321, + "latitude": 41.079679, + "longitude": -75.319542, + "city": "Bartonsville", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18322, + "latitude": 41.054711, + "longitude": -75.331879, + "city": "Brodheadsville", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18323, + "latitude": 41.033755, + "longitude": -75.30798, + "city": "Buck Hill Falls", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18324, + "latitude": 41.185011, + "longitude": -74.97889, + "city": "Bushkill", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18325, + "latitude": 41.187023, + "longitude": -75.28593, + "city": "Canadensis", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18326, + "latitude": 41.152364, + "longitude": -75.276395, + "city": "Cresco", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18327, + "latitude": 40.988562, + "longitude": -75.151193, + "city": "Delaware Water Gap", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18328, + "latitude": 41.229482, + "longitude": -74.967407, + "city": "Dingmans Ferry", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18330, + "latitude": 41.033192, + "longitude": -75.449047, + "city": "Effort", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18331, + "latitude": 40.947398, + "longitude": -75.366015, + "city": "Gilbert", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18332, + "latitude": 41.025342, + "longitude": -75.323738, + "city": "Henryville", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18333, + "latitude": 40.95158, + "longitude": -75.501306, + "city": "Kresgeville", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18334, + "latitude": 41.057236, + "longitude": -75.465137, + "city": "Long Pond", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18335, + "latitude": 41.050764, + "longitude": -75.208269, + "city": "Marshalls Creek", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18336, + "latitude": 41.370358, + "longitude": -74.736057, + "city": "Matamoras", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18337, + "latitude": 41.320051, + "longitude": -74.880639, + "city": "Milford", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18340, + "latitude": 41.413707, + "longitude": -74.751138, + "city": "Millrift", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18341, + "latitude": 40.991053, + "longitude": -75.299256, + "city": "Minisink Hills", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18342, + "latitude": 41.145778, + "longitude": -75.294125, + "city": "Mountainhome", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18343, + "latitude": 40.898617, + "longitude": -75.104575, + "city": "Mount Bethel", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18344, + "latitude": 41.136268, + "longitude": -75.37092, + "city": "Mount Pocono", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18346, + "latitude": 41.094926, + "longitude": -75.298177, + "city": "Pocono Summit", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18347, + "latitude": 41.13856, + "longitude": -75.562988, + "city": "Pocono Lake", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18348, + "latitude": 41.033755, + "longitude": -75.30798, + "city": "Pocono Lake Preserve", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18349, + "latitude": 41.122633, + "longitude": -75.45882, + "city": "Pocono Manor", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18350, + "latitude": 41.083557, + "longitude": -75.515614, + "city": "Pocono Pines", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18351, + "latitude": 40.921386, + "longitude": -75.097007, + "city": "Portland", + "state": "PA", + "county": "Northampton" + }, + { + "zip_code": 18352, + "latitude": 40.986265, + "longitude": -75.348026, + "city": "Reeders", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18353, + "latitude": 41.011645, + "longitude": -75.254722, + "city": "Saylorsburg", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18354, + "latitude": 40.937939, + "longitude": -75.292615, + "city": "Sciota", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18355, + "latitude": 41.090045, + "longitude": -75.357801, + "city": "Scotrun", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18356, + "latitude": 41.031177, + "longitude": -75.097435, + "city": "Shawnee On Delaware", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18357, + "latitude": 41.233562, + "longitude": -75.238879, + "city": "Skytop", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18360, + "latitude": 41.041895, + "longitude": -75.368964, + "city": "Stroudsburg", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18370, + "latitude": 41.105903, + "longitude": -75.346913, + "city": "Swiftwater", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18371, + "latitude": 41.340936, + "longitude": -75.024055, + "city": "Tamiment", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18372, + "latitude": 41.095823, + "longitude": -75.323654, + "city": "Tannersville", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18373, + "latitude": 41.340936, + "longitude": -75.024055, + "city": "Unity House", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18401, + "latitude": 41.615989, + "longitude": -75.274708, + "city": "Aldenville", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18403, + "latitude": 41.487598, + "longitude": -75.533403, + "city": "Archbald", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18405, + "latitude": 41.582471, + "longitude": -75.130121, + "city": "Beach Lake", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18407, + "latitude": 41.583122, + "longitude": -75.505612, + "city": "Carbondale", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18410, + "latitude": 41.486527, + "longitude": -75.693335, + "city": "Chinchilla", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18411, + "latitude": 41.463694, + "longitude": -75.681992, + "city": "Clarks Summit", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18413, + "latitude": 41.654319, + "longitude": -75.614463, + "city": "Clifford", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18414, + "latitude": 41.539797, + "longitude": -75.719723, + "city": "Dalton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18415, + "latitude": 41.701677, + "longitude": -75.133727, + "city": "Damascus", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18416, + "latitude": 41.375602, + "longitude": -75.547966, + "city": "Elmhurst", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18417, + "latitude": 41.797309, + "longitude": -75.206086, + "city": "Equinunk", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18419, + "latitude": 41.562365, + "longitude": -75.782573, + "city": "Factoryville", + "state": "PA", + "county": "Wyoming" + }, + { + "zip_code": 18420, + "latitude": 41.401881, + "longitude": -75.637626, + "city": "Fleetville", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18421, + "latitude": 41.652272, + "longitude": -75.531325, + "city": "Forest City", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18424, + "latitude": 41.346095, + "longitude": -75.331956, + "city": "Gouldsboro", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18425, + "latitude": 41.41594, + "longitude": -75.022543, + "city": "Greeley", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18426, + "latitude": 41.320734, + "longitude": -75.199395, + "city": "Greentown", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18427, + "latitude": 41.422497, + "longitude": -75.335384, + "city": "Hamlin", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18428, + "latitude": 41.482733, + "longitude": -75.24019, + "city": "Hawley", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18430, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "Herrick Center", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18431, + "latitude": 41.564258, + "longitude": -75.265643, + "city": "Honesdale", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18433, + "latitude": 41.561174, + "longitude": -75.618764, + "city": "Jermyn", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18434, + "latitude": 41.504326, + "longitude": -75.572238, + "city": "Jessup", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18435, + "latitude": 41.475422, + "longitude": -75.009368, + "city": "Lackawaxen", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18436, + "latitude": 41.452686, + "longitude": -75.321884, + "city": "Lake Ariel", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18437, + "latitude": 41.617378, + "longitude": -75.282339, + "city": "Lake Como", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18438, + "latitude": 41.431256, + "longitude": -75.303874, + "city": "Lakeville", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18439, + "latitude": 41.828081, + "longitude": -75.396741, + "city": "Lakewood", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18440, + "latitude": 41.551585, + "longitude": -75.767583, + "city": "La Plume", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18441, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "Lenoxville", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18443, + "latitude": 41.667024, + "longitude": -75.118513, + "city": "Milanville", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18444, + "latitude": 41.321625, + "longitude": -75.538602, + "city": "Moscow", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18445, + "latitude": 41.356766, + "longitude": -75.381762, + "city": "Newfoundland", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18446, + "latitude": 41.627612, + "longitude": -75.786129, + "city": "Nicholson", + "state": "PA", + "county": "Wyoming" + }, + { + "zip_code": 18447, + "latitude": 41.494578, + "longitude": -75.653932, + "city": "Olyphant", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18448, + "latitude": 41.46488, + "longitude": -75.596231, + "city": "Olyphant", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18449, + "latitude": 41.615989, + "longitude": -75.274708, + "city": "Orson", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18451, + "latitude": 41.340936, + "longitude": -75.024055, + "city": "Paupack", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18452, + "latitude": 41.350663, + "longitude": -75.552502, + "city": "Peckville", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18453, + "latitude": 41.615989, + "longitude": -75.274708, + "city": "Pleasant Mount", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18454, + "latitude": 41.615989, + "longitude": -75.274708, + "city": "Poyntelle", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18455, + "latitude": 41.615989, + "longitude": -75.274708, + "city": "Preston Park", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18456, + "latitude": 41.615989, + "longitude": -75.274708, + "city": "Prompton", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18457, + "latitude": 41.340936, + "longitude": -75.024055, + "city": "Rowland", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18458, + "latitude": 41.414928, + "longitude": -74.934461, + "city": "Shohola", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18459, + "latitude": 41.615989, + "longitude": -75.274708, + "city": "South Canaan", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18460, + "latitude": 41.259242, + "longitude": -75.373122, + "city": "South Sterling", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18461, + "latitude": 41.615989, + "longitude": -75.274708, + "city": "Starlight", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18462, + "latitude": 41.89529, + "longitude": -75.42428, + "city": "Starrucca", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18463, + "latitude": 41.376953, + "longitude": -75.31601, + "city": "Sterling", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18464, + "latitude": 41.396988, + "longitude": -75.186881, + "city": "Tafton", + "state": "PA", + "county": "Pike" + }, + { + "zip_code": 18465, + "latitude": 41.84015, + "longitude": -75.531898, + "city": "Thompson", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18466, + "latitude": 41.17551, + "longitude": -75.461757, + "city": "Tobyhanna", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18469, + "latitude": 41.615989, + "longitude": -75.274708, + "city": "Tyler Hill", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18470, + "latitude": 41.698964, + "longitude": -75.529304, + "city": "Union Dale", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18471, + "latitude": 41.523812, + "longitude": -75.690608, + "city": "Waverly", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18472, + "latitude": 41.613395, + "longitude": -75.371218, + "city": "Waymart", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18473, + "latitude": 41.540648, + "longitude": -75.222927, + "city": "White Mills", + "state": "PA", + "county": "Wayne" + }, + { + "zip_code": 18501, + "latitude": 41.401881, + "longitude": -75.637626, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18502, + "latitude": 41.350303, + "longitude": -75.689965, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18503, + "latitude": 41.410079, + "longitude": -75.666784, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18504, + "latitude": 41.421572, + "longitude": -75.691955, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18505, + "latitude": 41.413137, + "longitude": -75.65194, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18507, + "latitude": 41.361332, + "longitude": -75.706584, + "city": "Moosic", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18508, + "latitude": 41.439979, + "longitude": -75.66843, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18509, + "latitude": 41.42908, + "longitude": -75.647633, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18510, + "latitude": 41.396665, + "longitude": -75.652869, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18512, + "latitude": 41.43503, + "longitude": -75.610332, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18514, + "latitude": 41.401881, + "longitude": -75.637626, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18515, + "latitude": 41.403529, + "longitude": -75.706485, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18517, + "latitude": 41.382529, + "longitude": -75.713185, + "city": "Taylor", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18518, + "latitude": 41.372779, + "longitude": -75.730836, + "city": "Old Forge", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18519, + "latitude": 41.463118, + "longitude": -75.629099, + "city": "Dickson City", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18522, + "latitude": 41.401881, + "longitude": -75.637626, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18540, + "latitude": 41.401881, + "longitude": -75.637626, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18577, + "latitude": 41.401881, + "longitude": -75.637626, + "city": "Scranton", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18601, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Beach Haven", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18602, + "latitude": 41.192177, + "longitude": -75.716073, + "city": "Bear Creek", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18603, + "latitude": 41.056142, + "longitude": -76.299844, + "city": "Berwick", + "state": "PA", + "county": "Columbia" + }, + { + "zip_code": 18610, + "latitude": 41.085529, + "longitude": -75.499384, + "city": "Blakeslee", + "state": "PA", + "county": "Monroe" + }, + { + "zip_code": 18611, + "latitude": 41.110259, + "longitude": -75.775517, + "city": "Cambra", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18612, + "latitude": 41.271121, + "longitude": -75.999621, + "city": "Dallas", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18614, + "latitude": 41.524261, + "longitude": -76.397554, + "city": "Dushore", + "state": "PA", + "county": "Sullivan" + }, + { + "zip_code": 18615, + "latitude": 41.447109, + "longitude": -75.855544, + "city": "Falls", + "state": "PA", + "county": "Wyoming" + }, + { + "zip_code": 18616, + "latitude": 41.432901, + "longitude": -76.516887, + "city": "Forksville", + "state": "PA", + "county": "Sullivan" + }, + { + "zip_code": 18617, + "latitude": 41.265528, + "longitude": -76.052153, + "city": "Glen Lyon", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18618, + "latitude": 41.37385, + "longitude": -75.969059, + "city": "Harveys Lake", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18619, + "latitude": 41.432901, + "longitude": -76.516887, + "city": "Hillsgrove", + "state": "PA", + "county": "Sullivan" + }, + { + "zip_code": 18621, + "latitude": 41.28317, + "longitude": -76.064414, + "city": "Hunlock Creek", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18622, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Huntington Mills", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18623, + "latitude": 41.632632, + "longitude": -76.154464, + "city": "Laceyville", + "state": "PA", + "county": "Wyoming" + }, + { + "zip_code": 18624, + "latitude": 41.048947, + "longitude": -75.60858, + "city": "Lake Harmony", + "state": "PA", + "county": "Carbon" + }, + { + "zip_code": 18625, + "latitude": 41.513852, + "longitude": -75.841598, + "city": "Lake Winola", + "state": "PA", + "county": "Wyoming" + }, + { + "zip_code": 18626, + "latitude": 41.432901, + "longitude": -76.516887, + "city": "Laporte", + "state": "PA", + "county": "Sullivan" + }, + { + "zip_code": 18627, + "latitude": 41.316584, + "longitude": -76.021037, + "city": "Lehman", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18628, + "latitude": 41.432901, + "longitude": -76.516887, + "city": "Lopez", + "state": "PA", + "county": "Sullivan" + }, + { + "zip_code": 18629, + "latitude": 41.27708, + "longitude": -75.960156, + "city": "Mehoopany", + "state": "PA", + "county": "Wyoming" + }, + { + "zip_code": 18630, + "latitude": 41.27708, + "longitude": -75.960156, + "city": "Meshoppen", + "state": "PA", + "county": "Wyoming" + }, + { + "zip_code": 18631, + "latitude": 40.98713, + "longitude": -76.287669, + "city": "Mifflinville", + "state": "PA", + "county": "Columbia" + }, + { + "zip_code": 18632, + "latitude": 41.432901, + "longitude": -76.516887, + "city": "Mildred", + "state": "PA", + "county": "Sullivan" + }, + { + "zip_code": 18634, + "latitude": 41.249808, + "longitude": -76.008195, + "city": "Nanticoke", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18635, + "latitude": 41.049051, + "longitude": -76.189182, + "city": "Nescopeck", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18636, + "latitude": 41.27708, + "longitude": -75.960156, + "city": "Noxen", + "state": "PA", + "county": "Wyoming" + }, + { + "zip_code": 18640, + "latitude": 41.298152, + "longitude": -75.85856, + "city": "Pittston", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18641, + "latitude": 41.238649, + "longitude": -75.868267, + "city": "Pittston", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18642, + "latitude": 41.217263, + "longitude": -75.938105, + "city": "Duryea", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18643, + "latitude": 41.262312, + "longitude": -75.816983, + "city": "Pittston", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18644, + "latitude": 41.337161, + "longitude": -75.912401, + "city": "Wyoming", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18651, + "latitude": 41.28871, + "longitude": -75.98764, + "city": "Plymouth", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18653, + "latitude": 41.394526, + "longitude": -75.824239, + "city": "Ransom", + "state": "PA", + "county": "Lackawanna" + }, + { + "zip_code": 18654, + "latitude": 41.350053, + "longitude": -76.03193, + "city": "Shawanese", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18655, + "latitude": 41.151321, + "longitude": -76.108103, + "city": "Shickshinny", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18656, + "latitude": 41.288634, + "longitude": -76.142277, + "city": "Sweet Valley", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18657, + "latitude": 41.566386, + "longitude": -75.975715, + "city": "Tunkhannock", + "state": "PA", + "county": "Wyoming" + }, + { + "zip_code": 18660, + "latitude": 41.142698, + "longitude": -76.039935, + "city": "Wapwallopen", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18661, + "latitude": 41.114503, + "longitude": -75.909158, + "city": "White Haven", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18690, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Dallas", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18701, + "latitude": 41.203631, + "longitude": -75.88434, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18702, + "latitude": 41.211028, + "longitude": -75.838169, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18703, + "latitude": 41.242081, + "longitude": -75.88569, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18704, + "latitude": 41.27843, + "longitude": -75.905842, + "city": "Kingston", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18705, + "latitude": 41.261699, + "longitude": -75.849123, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18706, + "latitude": 41.2313, + "longitude": -75.896241, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18707, + "latitude": 41.166401, + "longitude": -75.961432, + "city": "Mountain Top", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18708, + "latitude": 41.24083, + "longitude": -75.947216, + "city": "Shavertown", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18709, + "latitude": 41.28603, + "longitude": -75.89509, + "city": "Luzerne", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18710, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18711, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18761, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18762, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18763, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18764, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18765, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18766, + "latitude": 41.244781, + "longitude": -75.88959, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18767, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18768, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18769, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18773, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18774, + "latitude": 41.272248, + "longitude": -75.880146, + "city": "Wilkes Barre", + "state": "PA", + "county": "Luzerne" + }, + { + "zip_code": 18801, + "latitude": 41.84414, + "longitude": -75.831862, + "city": "Montrose", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18810, + "latitude": 41.861751, + "longitude": -76.488418, + "city": "Athens", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18812, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "Brackney", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18813, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "Brooklyn", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18814, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Burlington", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18815, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Camptown", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18816, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "Dimock", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18817, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "East Smithfield", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18818, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "Friendsville", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18820, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "Gibson", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18821, + "latitude": 41.973758, + "longitude": -75.744802, + "city": "Great Bend", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18822, + "latitude": 41.960544, + "longitude": -75.748053, + "city": "Hallstead", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18823, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "Harford", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18824, + "latitude": 41.702924, + "longitude": -75.767941, + "city": "Hop Bottom", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18825, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "Jackson", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18826, + "latitude": 41.766724, + "longitude": -75.732669, + "city": "Kingsley", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18827, + "latitude": 41.95752, + "longitude": -75.637286, + "city": "Lanesboro", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18828, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "Lawton", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18829, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Le Raysville", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18830, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "Little Meadows", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18831, + "latitude": 41.880928, + "longitude": -76.585448, + "city": "Milan", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18832, + "latitude": 41.713484, + "longitude": -76.487176, + "city": "Monroeton", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18833, + "latitude": 41.599586, + "longitude": -76.442518, + "city": "New Albany", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18834, + "latitude": 41.890486, + "longitude": -75.688114, + "city": "New Milford", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18837, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Rome", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18839, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "Rushville", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18840, + "latitude": 41.97819, + "longitude": -76.599403, + "city": "Sayre", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18842, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "South Gibson", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18843, + "latitude": 41.8237, + "longitude": -75.88314, + "city": "South Montrose", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18844, + "latitude": 41.820346, + "longitude": -75.80463, + "city": "Springville", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18845, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Stevensville", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18846, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Sugar Run", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18847, + "latitude": 41.957087, + "longitude": -75.664856, + "city": "Susquehanna", + "state": "PA", + "county": "Susquehanna" + }, + { + "zip_code": 18848, + "latitude": 41.773762, + "longitude": -76.389299, + "city": "Towanda", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18850, + "latitude": 41.813972, + "longitude": -76.549572, + "city": "Ulster", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18851, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Warren Center", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18853, + "latitude": 41.668617, + "longitude": -76.265169, + "city": "Wyalusing", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18854, + "latitude": 41.77197, + "longitude": -76.521266, + "city": "Wysox", + "state": "PA", + "county": "Bradford" + }, + { + "zip_code": 18901, + "latitude": 40.334863, + "longitude": -75.118737, + "city": "Doylestown", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18910, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Bedminster", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18911, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Blooming Glen", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18912, + "latitude": 40.309942, + "longitude": -75.074252, + "city": "Buckingham", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18913, + "latitude": 40.376499, + "longitude": -75.04129, + "city": "Carversville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18914, + "latitude": 40.288277, + "longitude": -75.201848, + "city": "Chalfont", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18915, + "latitude": 40.272756, + "longitude": -75.256285, + "city": "Colmar", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18916, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Danboro", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18917, + "latitude": 40.375008, + "longitude": -75.204464, + "city": "Dublin", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18918, + "latitude": 40.320036, + "longitude": -75.374155, + "city": "Earlington", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18920, + "latitude": 40.488543, + "longitude": -75.09576, + "city": "Erwinna", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18921, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Ferndale", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18922, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Forest Grove", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18923, + "latitude": 40.272313, + "longitude": -75.117414, + "city": "Fountainville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18924, + "latitude": 40.308116, + "longitude": -75.358575, + "city": "Franconia", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18925, + "latitude": 40.283176, + "longitude": -75.064112, + "city": "Furlong", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18926, + "latitude": 40.39473, + "longitude": -75.098468, + "city": "Gardenville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18927, + "latitude": 40.323533, + "longitude": -75.254829, + "city": "Hilltown", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18928, + "latitude": 40.335974, + "longitude": -75.04288, + "city": "Holicong", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18929, + "latitude": 40.254157, + "longitude": -75.08854, + "city": "Jamison", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18930, + "latitude": 40.54199, + "longitude": -75.207252, + "city": "Kintnersville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18931, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Lahaska", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18932, + "latitude": 40.299561, + "longitude": -75.254097, + "city": "Line Lexington", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18933, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Lumberville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18934, + "latitude": 40.349443, + "longitude": -75.067622, + "city": "Mechanicsville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18935, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Milford Square", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18936, + "latitude": 40.2375, + "longitude": -75.23656, + "city": "Montgomeryville", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18938, + "latitude": 40.357492, + "longitude": -74.998605, + "city": "New Hope", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18940, + "latitude": 40.263042, + "longitude": -74.955535, + "city": "Newtown", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18942, + "latitude": 40.463447, + "longitude": -75.167341, + "city": "Ottsville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18943, + "latitude": 40.268981, + "longitude": -75.009401, + "city": "Penns Park", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18944, + "latitude": 40.390196, + "longitude": -75.233253, + "city": "Perkasie", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18946, + "latitude": 40.271104, + "longitude": -75.062204, + "city": "Pineville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18947, + "latitude": 40.43014, + "longitude": -75.1172, + "city": "Pipersville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18949, + "latitude": 40.38805, + "longitude": -75.142522, + "city": "Plumsteadville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18950, + "latitude": 40.416516, + "longitude": -75.074832, + "city": "Point Pleasant", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18951, + "latitude": 40.452525, + "longitude": -75.221391, + "city": "Quakertown", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18953, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Revere", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18954, + "latitude": 40.224658, + "longitude": -75.001662, + "city": "Richboro", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18955, + "latitude": 40.47963, + "longitude": -75.314639, + "city": "Richlandtown", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18956, + "latitude": 40.262783, + "longitude": -75.01568, + "city": "Rushland", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18957, + "latitude": 40.302945, + "longitude": -75.448579, + "city": "Salford", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18958, + "latitude": 40.290357, + "longitude": -75.435539, + "city": "Salfordville", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18960, + "latitude": 40.360473, + "longitude": -75.317521, + "city": "Sellersville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18962, + "latitude": 40.344529, + "longitude": -75.268738, + "city": "Silverdale", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18963, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Solebury", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18964, + "latitude": 40.288379, + "longitude": -75.341026, + "city": "Souderton", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18966, + "latitude": 40.186758, + "longitude": -75.007099, + "city": "Southampton", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18968, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Spinnerstown", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18969, + "latitude": 40.325792, + "longitude": -75.380495, + "city": "Telford", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18970, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Trumbauersville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18971, + "latitude": 40.34698, + "longitude": -75.376985, + "city": "Tylersport", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18972, + "latitude": 40.529063, + "longitude": -75.124333, + "city": "Upper Black Eddy", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18974, + "latitude": 40.208476, + "longitude": -75.040613, + "city": "Warminster", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18976, + "latitude": 40.244807, + "longitude": -75.142587, + "city": "Warrington", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18977, + "latitude": 40.284947, + "longitude": -74.877828, + "city": "Washington Crossing", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18979, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "Woxall", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 18980, + "latitude": 40.274185, + "longitude": -75.020499, + "city": "Wycombe", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18981, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Zionhill", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 18991, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Warminster", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19001, + "latitude": 40.123805, + "longitude": -75.114767, + "city": "Abington", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19002, + "latitude": 40.180876, + "longitude": -75.215621, + "city": "Ambler", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19003, + "latitude": 39.998811, + "longitude": -75.30793, + "city": "Ardmore", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19004, + "latitude": 40.013811, + "longitude": -75.228224, + "city": "Bala Cynwyd", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19006, + "latitude": 40.1284, + "longitude": -75.060665, + "city": "Huntingdon Valley", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19007, + "latitude": 40.115859, + "longitude": -74.853608, + "city": "Bristol", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19008, + "latitude": 39.972965, + "longitude": -75.365635, + "city": "Broomall", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19009, + "latitude": 40.135012, + "longitude": -75.062292, + "city": "Bryn Athyn", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19010, + "latitude": 39.955561, + "longitude": -75.344833, + "city": "Bryn Mawr", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19012, + "latitude": 40.059161, + "longitude": -75.104468, + "city": "Cheltenham", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19013, + "latitude": 39.878817, + "longitude": -75.437102, + "city": "Chester", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19014, + "latitude": 39.866766, + "longitude": -75.398537, + "city": "Aston", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19015, + "latitude": 39.909511, + "longitude": -75.366785, + "city": "Brookhaven", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19016, + "latitude": 39.934047, + "longitude": -75.405987, + "city": "Chester", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19017, + "latitude": 39.883911, + "longitude": -75.466949, + "city": "Chester Heights", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19018, + "latitude": 39.921562, + "longitude": -75.29503, + "city": "Clifton Heights", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19019, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19020, + "latitude": 40.125609, + "longitude": -74.994262, + "city": "Bensalem", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19021, + "latitude": 40.090878, + "longitude": -74.887554, + "city": "Croydon", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19022, + "latitude": 39.898162, + "longitude": -75.319632, + "city": "Crum Lynne", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19023, + "latitude": 39.917562, + "longitude": -75.269628, + "city": "Darby", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19025, + "latitude": 40.162403, + "longitude": -75.409776, + "city": "Dresher", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19026, + "latitude": 39.937562, + "longitude": -75.307731, + "city": "Drexel Hill", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19027, + "latitude": 40.07501, + "longitude": -75.131518, + "city": "Elkins Park", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19028, + "latitude": 39.934047, + "longitude": -75.405987, + "city": "Edgemont", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19029, + "latitude": 39.867562, + "longitude": -75.28586, + "city": "Essington", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19030, + "latitude": 40.177087, + "longitude": -74.829107, + "city": "Fairless Hills", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19031, + "latitude": 40.106805, + "longitude": -75.215071, + "city": "Flourtown", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19032, + "latitude": 39.895162, + "longitude": -75.278829, + "city": "Folcroft", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19033, + "latitude": 39.890962, + "longitude": -75.327282, + "city": "Folsom", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19034, + "latitude": 40.130959, + "longitude": -75.207437, + "city": "Fort Washington", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19035, + "latitude": 40.04486, + "longitude": -75.280686, + "city": "Gladwyne", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19036, + "latitude": 39.902512, + "longitude": -75.29268, + "city": "Glenolden", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19037, + "latitude": 39.934047, + "longitude": -75.405987, + "city": "Glen Riddle Lima", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19038, + "latitude": 40.101109, + "longitude": -75.17802, + "city": "Glenside", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19039, + "latitude": 39.88211, + "longitude": -75.337234, + "city": "Gradyville", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19040, + "latitude": 40.182406, + "longitude": -75.106265, + "city": "Hatboro", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19041, + "latitude": 40.002911, + "longitude": -75.321632, + "city": "Haverford", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19043, + "latitude": 39.899562, + "longitude": -75.307731, + "city": "Holmes", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19044, + "latitude": 40.191808, + "longitude": -75.150577, + "city": "Horsham", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19046, + "latitude": 40.09796, + "longitude": -75.107767, + "city": "Jenkintown", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19047, + "latitude": 40.289021, + "longitude": -75.065486, + "city": "Langhorne", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19048, + "latitude": 40.173509, + "longitude": -74.92461, + "city": "Fort Washington", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19049, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Fort Washington", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19050, + "latitude": 39.914562, + "longitude": -75.29458, + "city": "Lansdowne", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19052, + "latitude": 39.894161, + "longitude": -75.445589, + "city": "Lenni", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19053, + "latitude": 40.15468, + "longitude": -74.990378, + "city": "Feasterville Trevose", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19054, + "latitude": 40.174246, + "longitude": -74.821857, + "city": "Levittown", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19055, + "latitude": 40.145759, + "longitude": -74.841107, + "city": "Levittown", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19056, + "latitude": 40.147709, + "longitude": -74.880059, + "city": "Levittown", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19057, + "latitude": 40.143309, + "longitude": -74.846373, + "city": "Levittown", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19058, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Levittown", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19059, + "latitude": 40.328645, + "longitude": -75.10278, + "city": "Levittown", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19061, + "latitude": 39.85091, + "longitude": -75.418228, + "city": "Marcus Hook", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19063, + "latitude": 39.918804, + "longitude": -75.399118, + "city": "Media", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19064, + "latitude": 39.931858, + "longitude": -75.341583, + "city": "Springfield", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19065, + "latitude": 39.921061, + "longitude": -75.386136, + "city": "Media", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19066, + "latitude": 40.003412, + "longitude": -75.249476, + "city": "Merion Station", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19067, + "latitude": 40.208408, + "longitude": -74.82914, + "city": "Morrisville", + "state": "PA", + "county": "Bucks" + }, + { + "zip_code": 19070, + "latitude": 39.907762, + "longitude": -75.325182, + "city": "Morton", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19072, + "latitude": 40.020911, + "longitude": -75.259975, + "city": "Narberth", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19073, + "latitude": 39.955409, + "longitude": -75.40172, + "city": "Newtown Square", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19074, + "latitude": 39.888412, + "longitude": -75.29818, + "city": "Norwood", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19075, + "latitude": 40.113809, + "longitude": -75.185219, + "city": "Oreland", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19076, + "latitude": 39.885984, + "longitude": -75.307231, + "city": "Prospect Park", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19078, + "latitude": 39.878212, + "longitude": -75.323082, + "city": "Ridley Park", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19079, + "latitude": 39.901112, + "longitude": -75.267628, + "city": "Sharon Hill", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19080, + "latitude": 40.043201, + "longitude": -75.357678, + "city": "Wayne", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19081, + "latitude": 39.897162, + "longitude": -75.344083, + "city": "Swarthmore", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19082, + "latitude": 39.951662, + "longitude": -75.285429, + "city": "Upper Darby", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19083, + "latitude": 39.974861, + "longitude": -75.312081, + "city": "Havertown", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19085, + "latitude": 40.027909, + "longitude": -75.369458, + "city": "Villanova", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19086, + "latitude": 39.896711, + "longitude": -75.370385, + "city": "Wallingford", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19087, + "latitude": 39.98596, + "longitude": -75.370934, + "city": "Wayne", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19088, + "latitude": 39.934047, + "longitude": -75.405987, + "city": "Wayne", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19089, + "latitude": 40.043399, + "longitude": -75.357308, + "city": "Wayne", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19090, + "latitude": 40.161856, + "longitude": -75.10897, + "city": "Willow Grove", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19091, + "latitude": 39.934047, + "longitude": -75.405987, + "city": "Media", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19092, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19093, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19094, + "latitude": 39.876862, + "longitude": -75.346083, + "city": "Woodlyn", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19095, + "latitude": 40.08561, + "longitude": -75.151569, + "city": "Wyncote", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19096, + "latitude": 40.051411, + "longitude": -75.164822, + "city": "Wynnewood", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19098, + "latitude": 39.895362, + "longitude": -75.310731, + "city": "Holmes", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19099, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19101, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19102, + "latitude": 39.952562, + "longitude": -75.166472, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19103, + "latitude": 40.003361, + "longitude": -75.186822, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19104, + "latitude": 39.960912, + "longitude": -75.19668, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19105, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19106, + "latitude": 39.950004, + "longitude": -75.150071, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19107, + "latitude": 39.962612, + "longitude": -75.162871, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19108, + "latitude": 39.959812, + "longitude": -75.161622, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19109, + "latitude": 39.949612, + "longitude": -75.163722, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19110, + "latitude": 39.950212, + "longitude": -75.163572, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19111, + "latitude": 40.06317, + "longitude": -75.081317, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19112, + "latitude": 39.892213, + "longitude": -75.179623, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19113, + "latitude": 39.869958, + "longitude": -75.277458, + "city": "Philadelphia", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19114, + "latitude": 40.019816, + "longitude": -75.065617, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19115, + "latitude": 40.07841, + "longitude": -75.045065, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19116, + "latitude": 40.104709, + "longitude": -75.006771, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19118, + "latitude": 40.07231, + "longitude": -75.203371, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19119, + "latitude": 40.068142, + "longitude": -75.123024, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19120, + "latitude": 40.031611, + "longitude": -75.119019, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19121, + "latitude": 39.983212, + "longitude": -75.174172, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19122, + "latitude": 39.977462, + "longitude": -75.141271, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19123, + "latitude": 39.98238, + "longitude": -75.115369, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19124, + "latitude": 40.021561, + "longitude": -75.093668, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19125, + "latitude": 39.977262, + "longitude": -75.13292, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19126, + "latitude": 40.061411, + "longitude": -75.131769, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19127, + "latitude": 40.024761, + "longitude": -75.222473, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19128, + "latitude": 40.049111, + "longitude": -75.178489, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19129, + "latitude": 40.022911, + "longitude": -75.167771, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19130, + "latitude": 40.001161, + "longitude": -75.169671, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19131, + "latitude": 39.996811, + "longitude": -75.207774, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19132, + "latitude": 40.040111, + "longitude": -75.117719, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19133, + "latitude": 39.992562, + "longitude": -75.13732, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19134, + "latitude": 39.994662, + "longitude": -75.107969, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19135, + "latitude": 40.017061, + "longitude": -75.098618, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19136, + "latitude": 40.044661, + "longitude": -75.020665, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19137, + "latitude": 39.986162, + "longitude": -75.150671, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19138, + "latitude": 40.056261, + "longitude": -75.16117, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19139, + "latitude": 39.996211, + "longitude": -75.117519, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19140, + "latitude": 40.014861, + "longitude": -75.128302, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19141, + "latitude": 40.009611, + "longitude": -75.15032, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19142, + "latitude": 39.963339, + "longitude": -75.161672, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19143, + "latitude": 39.957312, + "longitude": -75.187023, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19144, + "latitude": 40.033111, + "longitude": -75.179871, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19145, + "latitude": 39.917002, + "longitude": -75.1877, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19146, + "latitude": 39.945112, + "longitude": -75.175822, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19147, + "latitude": 39.936212, + "longitude": -75.155973, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19148, + "latitude": 39.950362, + "longitude": -75.155371, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19149, + "latitude": 40.024361, + "longitude": -75.081668, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19150, + "latitude": 40.07231, + "longitude": -75.17122, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19151, + "latitude": 39.986611, + "longitude": -75.213174, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19152, + "latitude": 40.014011, + "longitude": -75.086818, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19153, + "latitude": 39.899412, + "longitude": -75.226976, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19154, + "latitude": 40.084017, + "longitude": -75.018265, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19155, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19160, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19161, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19162, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19170, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19171, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19172, + "latitude": 39.947321, + "longitude": -75.150011, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19173, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19175, + "latitude": 39.990562, + "longitude": -75.12957, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19177, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19178, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19179, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19181, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19182, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19183, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19184, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19185, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19187, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19188, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19191, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19192, + "latitude": 39.951112, + "longitude": -75.167622, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19193, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19194, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19196, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19197, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19244, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19255, + "latitude": 40.001811, + "longitude": -75.11787, + "city": "Philadelphia", + "state": "PA", + "county": "Philadelphia" + }, + { + "zip_code": 19301, + "latitude": 40.040057, + "longitude": -75.488793, + "city": "Paoli", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19310, + "latitude": 39.941554, + "longitude": -75.957993, + "city": "Atglen", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19311, + "latitude": 39.866821, + "longitude": -75.839686, + "city": "Avondale", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19312, + "latitude": 40.030058, + "longitude": -75.45644, + "city": "Berwyn", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19316, + "latitude": 40.054976, + "longitude": -75.837767, + "city": "Brandamore", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19317, + "latitude": 39.865567, + "longitude": -75.557698, + "city": "Chadds Ford", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19318, + "latitude": 39.852406, + "longitude": -75.811789, + "city": "Chatham", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19319, + "latitude": 39.920918, + "longitude": -75.522168, + "city": "Cheyney", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19320, + "latitude": 39.968862, + "longitude": -75.829163, + "city": "Coatesville", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19330, + "latitude": 39.916517, + "longitude": -75.925805, + "city": "Cochranville", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19331, + "latitude": 39.882274, + "longitude": -75.516529, + "city": "Concordville", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19333, + "latitude": 40.042623, + "longitude": -75.42746, + "city": "Devon", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19335, + "latitude": 40.031265, + "longitude": -75.722614, + "city": "Downingtown", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19339, + "latitude": 39.934047, + "longitude": -75.405987, + "city": "Concordville", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19340, + "latitude": 39.934047, + "longitude": -75.405987, + "city": "Concordville", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19341, + "latitude": 40.049852, + "longitude": -75.637035, + "city": "Exton", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19342, + "latitude": 39.902633, + "longitude": -75.483224, + "city": "Glen Mills", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19343, + "latitude": 40.100892, + "longitude": -75.753071, + "city": "Glenmoore", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19344, + "latitude": 40.089561, + "longitude": -75.867533, + "city": "Honey Brook", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19345, + "latitude": 39.847803, + "longitude": -75.719347, + "city": "Immaculata", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19346, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Kelton", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19347, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Kemblesville", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19348, + "latitude": 39.867864, + "longitude": -75.716333, + "city": "Kennett Square", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19350, + "latitude": 39.771506, + "longitude": -75.799761, + "city": "Landenberg", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19351, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Lewisville", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19352, + "latitude": 39.778703, + "longitude": -75.88758, + "city": "Lincoln University", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19353, + "latitude": 40.013158, + "longitude": -75.499046, + "city": "Lionville", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19354, + "latitude": 40.058173, + "longitude": -75.743272, + "city": "Lyndell", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19355, + "latitude": 40.02951, + "longitude": -75.713599, + "city": "Malvern", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19357, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Mendenhall", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19358, + "latitude": 39.962081, + "longitude": -75.802502, + "city": "Modena", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19360, + "latitude": 39.726143, + "longitude": -75.7857, + "city": "New London", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19362, + "latitude": 39.757361, + "longitude": -76.037603, + "city": "Nottingham", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19363, + "latitude": 39.849721, + "longitude": -75.957276, + "city": "Oxford", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19365, + "latitude": 40.001064, + "longitude": -75.830891, + "city": "Parkesburg", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19366, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Pocopson", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19367, + "latitude": 39.970601, + "longitude": -75.895794, + "city": "Pomeroy", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19369, + "latitude": 39.990302, + "longitude": -75.893598, + "city": "Sadsburyville", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19370, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Steelville", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19371, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Suplee", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19372, + "latitude": 39.993929, + "longitude": -75.818572, + "city": "Thorndale", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19373, + "latitude": 39.905987, + "longitude": -75.535383, + "city": "Thornton", + "state": "PA", + "county": "Delaware" + }, + { + "zip_code": 19374, + "latitude": 39.872825, + "longitude": -75.848075, + "city": "Toughkenamon", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19375, + "latitude": 39.901177, + "longitude": -75.750203, + "city": "Unionville", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19376, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Wagontown", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19380, + "latitude": 39.980107, + "longitude": -75.610503, + "city": "West Chester", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19381, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "West Chester", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19382, + "latitude": 39.912284, + "longitude": -75.630235, + "city": "West Chester", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19383, + "latitude": 39.94545, + "longitude": -75.602401, + "city": "West Chester", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19390, + "latitude": 39.841367, + "longitude": -75.847944, + "city": "West Grove", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19395, + "latitude": 39.932821, + "longitude": -75.544822, + "city": "Westtown", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19397, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Southeastern", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19398, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Southeastern", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19399, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Southeastern", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19401, + "latitude": 40.149154, + "longitude": -75.356627, + "city": "Norristown", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19403, + "latitude": 40.124886, + "longitude": -75.357027, + "city": "Norristown", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19404, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "Norristown", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19405, + "latitude": 40.120931, + "longitude": -75.362127, + "city": "Bridgeport", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19406, + "latitude": 40.179242, + "longitude": -75.388022, + "city": "King Of Prussia", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19407, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "Audubon", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19408, + "latitude": 40.156555, + "longitude": -75.413127, + "city": "Eagleville", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19409, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "Fairview Village", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19415, + "latitude": "", + "longitude": "", + "city": "Eagleville", + "state": "PA", + "county": "" + }, + { + "zip_code": 19420, + "latitude": 40.152871, + "longitude": -75.456719, + "city": "Arcola", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19421, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Birchrunville", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19422, + "latitude": 40.15755, + "longitude": -75.279941, + "city": "Blue Bell", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19423, + "latitude": 40.21735, + "longitude": -75.364973, + "city": "Cedars", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19424, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "Blue Bell", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19425, + "latitude": 40.103858, + "longitude": -75.639994, + "city": "Chester Springs", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19426, + "latitude": 40.236083, + "longitude": -75.430272, + "city": "Collegeville", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19428, + "latitude": 40.082509, + "longitude": -75.304377, + "city": "Conshohocken", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19429, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "Conshohocken", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19430, + "latitude": 40.185071, + "longitude": -75.419966, + "city": "Creamery", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19432, + "latitude": 40.079629, + "longitude": -75.559975, + "city": "Devault", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19435, + "latitude": 40.312552, + "longitude": -75.55171, + "city": "Frederick", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19436, + "latitude": 40.200757, + "longitude": -75.250665, + "city": "Gwynedd", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19437, + "latitude": 40.181054, + "longitude": -75.257855, + "city": "Gwynedd Valley", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19438, + "latitude": 40.274188, + "longitude": -75.395188, + "city": "Harleysville", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19440, + "latitude": 40.28202, + "longitude": -75.358491, + "city": "Hatfield", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19441, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "Harleysville", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19442, + "latitude": 40.146549, + "longitude": -75.617739, + "city": "Kimberton", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19443, + "latitude": 40.241004, + "longitude": -75.34392, + "city": "Kulpsville", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19444, + "latitude": 40.08526, + "longitude": -75.257423, + "city": "Lafayette Hill", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19446, + "latitude": 40.224245, + "longitude": -75.29156, + "city": "Lansdale", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19450, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "Lederach", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19451, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "Mainland", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19452, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "Miquon", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19453, + "latitude": 40.151918, + "longitude": -75.504383, + "city": "Mont Clare", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19454, + "latitude": 40.220106, + "longitude": -75.237877, + "city": "North Wales", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19455, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "North Wales", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19456, + "latitude": 40.133355, + "longitude": -75.453631, + "city": "Oaks", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19457, + "latitude": 40.208976, + "longitude": -75.5984, + "city": "Parker Ford", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19460, + "latitude": 40.128175, + "longitude": -75.541769, + "city": "Phoenixville", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19462, + "latitude": 40.137759, + "longitude": -75.352751, + "city": "Plymouth Meeting", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19464, + "latitude": 40.263457, + "longitude": -75.617195, + "city": "Pottstown", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19465, + "latitude": 40.191907, + "longitude": -75.66531, + "city": "Pottstown", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19468, + "latitude": 40.20894, + "longitude": -75.490215, + "city": "Royersford", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19470, + "latitude": 40.186707, + "longitude": -75.728759, + "city": "Saint Peters", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19472, + "latitude": 40.344773, + "longitude": -75.577458, + "city": "Sassamansville", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19473, + "latitude": 40.224789, + "longitude": -75.478534, + "city": "Schwenksville", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19474, + "latitude": 40.225109, + "longitude": -75.403095, + "city": "Skippack", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19475, + "latitude": 40.146989, + "longitude": -75.605398, + "city": "Spring City", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19477, + "latitude": 40.185934, + "longitude": -75.232407, + "city": "Spring House", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19478, + "latitude": 40.275914, + "longitude": -75.461756, + "city": "Spring Mount", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19480, + "latitude": 40.098032, + "longitude": -75.688005, + "city": "Uwchland", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19481, + "latitude": 40.092269, + "longitude": -75.453735, + "city": "Valley Forge", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19482, + "latitude": 40.080323, + "longitude": -75.455408, + "city": "Valley Forge", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19483, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "Valley Forge", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19484, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "Valley Forge", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19485, + "latitude": 40.211896, + "longitude": -75.35586, + "city": "Valley Forge", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19486, + "latitude": 40.203291, + "longitude": -75.301918, + "city": "West Point", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19487, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "King Of Prussia", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19488, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Norristown", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19489, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Norristown", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19490, + "latitude": 40.192881, + "longitude": -75.357555, + "city": "Worcester", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19492, + "latitude": 40.290125, + "longitude": -75.502974, + "city": "Zieglerville", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19493, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Valley Forge", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19494, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Valley Forge", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19495, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Valley Forge", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19496, + "latitude": 39.983153, + "longitude": -75.748055, + "city": "Valley Forge", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19501, + "latitude": 40.242327, + "longitude": -76.057696, + "city": "Adamstown", + "state": "PA", + "county": "Lancaster" + }, + { + "zip_code": 19503, + "latitude": 40.447833, + "longitude": -75.708672, + "city": "Bally", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19504, + "latitude": 40.335395, + "longitude": -75.720131, + "city": "Barto", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19505, + "latitude": 40.458523, + "longitude": -75.741863, + "city": "Bechtelsville", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19506, + "latitude": 40.454997, + "longitude": -75.90646, + "city": "Bernville", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19507, + "latitude": 40.491214, + "longitude": -76.269231, + "city": "Bethel", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19508, + "latitude": 40.404848, + "longitude": -75.886642, + "city": "Birdsboro", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19510, + "latitude": 40.371492, + "longitude": -75.887797, + "city": "Blandon", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19511, + "latitude": 40.482102, + "longitude": -75.743476, + "city": "Bowers", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19512, + "latitude": 40.364068, + "longitude": -75.870971, + "city": "Boyertown", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19516, + "latitude": 40.485843, + "longitude": -76.005958, + "city": "Centerport", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19518, + "latitude": 40.365322, + "longitude": -75.848729, + "city": "Douglassville", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19519, + "latitude": 40.318986, + "longitude": -75.733368, + "city": "Earlville", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19520, + "latitude": 40.156293, + "longitude": -75.786492, + "city": "Elverson", + "state": "PA", + "county": "Chester" + }, + { + "zip_code": 19522, + "latitude": 40.326392, + "longitude": -75.808303, + "city": "Fleetwood", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19523, + "latitude": 40.189715, + "longitude": -75.888112, + "city": "Geigertown", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19525, + "latitude": 40.309952, + "longitude": -75.584885, + "city": "Gilbertsville", + "state": "PA", + "county": "Montgomery" + }, + { + "zip_code": 19526, + "latitude": 40.368035, + "longitude": -75.861788, + "city": "Hamburg", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19529, + "latitude": 40.627864, + "longitude": -75.883429, + "city": "Kempton", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19530, + "latitude": 40.473382, + "longitude": -75.775241, + "city": "Kutztown", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19533, + "latitude": 40.420446, + "longitude": -75.85715, + "city": "Leesport", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19534, + "latitude": 40.573618, + "longitude": -75.864968, + "city": "Lenhartsville", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19535, + "latitude": 40.335593, + "longitude": -75.801009, + "city": "Limekiln", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19536, + "latitude": 40.521756, + "longitude": -75.741859, + "city": "Lyon Station", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19538, + "latitude": 40.569818, + "longitude": -75.740942, + "city": "Maxatawny", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19539, + "latitude": 40.432311, + "longitude": -75.796571, + "city": "Mertztown", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19540, + "latitude": 40.321665, + "longitude": -75.804757, + "city": "Mohnton", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19541, + "latitude": 40.400685, + "longitude": -76.037566, + "city": "Mohrsville", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19542, + "latitude": 40.260992, + "longitude": -75.768437, + "city": "Monocacy Station", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19543, + "latitude": 40.367731, + "longitude": -75.89161, + "city": "Morgantown", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19544, + "latitude": 40.418662, + "longitude": -76.294364, + "city": "Mount Aetna", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19545, + "latitude": 40.33968, + "longitude": -75.63016, + "city": "New Berlinville", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19547, + "latitude": 40.343449, + "longitude": -75.897566, + "city": "Oley", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19548, + "latitude": 40.407173, + "longitude": -75.984901, + "city": "Pine Forge", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19549, + "latitude": 40.722587, + "longitude": -76.229623, + "city": "Port Clinton", + "state": "PA", + "county": "Schuylkill" + }, + { + "zip_code": 19550, + "latitude": 40.455305, + "longitude": -76.245345, + "city": "Rehrersburg", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19551, + "latitude": 40.326171, + "longitude": -75.88889, + "city": "Robesonia", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19554, + "latitude": 40.505184, + "longitude": -76.141334, + "city": "Shartlesville", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19555, + "latitude": 40.411279, + "longitude": -75.887016, + "city": "Shoemakersville", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19557, + "latitude": 40.613868, + "longitude": -75.814984, + "city": "Stony Run", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19559, + "latitude": 40.494368, + "longitude": -76.18646, + "city": "Strausstown", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19560, + "latitude": 40.395908, + "longitude": -75.889849, + "city": "Temple", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19562, + "latitude": 40.476019, + "longitude": -75.849294, + "city": "Topton", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19564, + "latitude": 40.526803, + "longitude": -75.869653, + "city": "Virginville", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19565, + "latitude": 40.337188, + "longitude": -75.951748, + "city": "Wernersville", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19567, + "latitude": 40.432759, + "longitude": -75.925707, + "city": "Womelsdorf", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19601, + "latitude": 40.357242, + "longitude": -75.940153, + "city": "Reading", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19602, + "latitude": 40.326546, + "longitude": -75.915919, + "city": "Reading", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19603, + "latitude": 40.388442, + "longitude": -75.963055, + "city": "Reading", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19604, + "latitude": 40.360942, + "longitude": -75.927852, + "city": "Reading", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19605, + "latitude": 40.404942, + "longitude": -75.941603, + "city": "Reading", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19606, + "latitude": 40.335119, + "longitude": -75.874976, + "city": "Reading", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19607, + "latitude": 40.299463, + "longitude": -75.987606, + "city": "Reading", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19608, + "latitude": 40.316342, + "longitude": -75.935521, + "city": "Reading", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19609, + "latitude": 40.327992, + "longitude": -75.990807, + "city": "Reading", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19610, + "latitude": 40.338017, + "longitude": -75.978006, + "city": "Reading", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19611, + "latitude": 40.303892, + "longitude": -75.938853, + "city": "Reading", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19612, + "latitude": 40.4389, + "longitude": -75.885303, + "city": "Reading", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19640, + "latitude": 40.407173, + "longitude": -75.984901, + "city": "Reading", + "state": "PA", + "county": "Berks" + }, + { + "zip_code": 19701, + "latitude": 39.594736, + "longitude": -75.693903, + "city": "Bear", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19702, + "latitude": 39.614737, + "longitude": -75.701277, + "city": "Newark", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19703, + "latitude": 39.80379, + "longitude": -75.45814, + "city": "Claymont", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19706, + "latitude": 39.594256, + "longitude": -75.608081, + "city": "Delaware City", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19707, + "latitude": 39.635202, + "longitude": -75.680897, + "city": "Hockessin", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19708, + "latitude": 39.577567, + "longitude": -75.690069, + "city": "Kirkwood", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19709, + "latitude": 39.485721, + "longitude": -75.677535, + "city": "Middletown", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19710, + "latitude": 39.757783, + "longitude": -75.639143, + "city": "Montchanin", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19711, + "latitude": 39.668282, + "longitude": -75.688489, + "city": "Newark", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19712, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Newark", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19713, + "latitude": 39.665662, + "longitude": -75.719349, + "city": "Newark", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19714, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Newark", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19715, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Newark", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19716, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Newark", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19717, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Newark", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19718, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Newark", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19720, + "latitude": 39.592895, + "longitude": -75.651466, + "city": "New Castle", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19721, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "New Castle", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19725, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Newark", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19726, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Newark", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19730, + "latitude": 39.51251, + "longitude": -75.627281, + "city": "Odessa", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19731, + "latitude": 39.512902, + "longitude": -75.58518, + "city": "Port Penn", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19732, + "latitude": 39.793864, + "longitude": -75.57375, + "city": "Rockland", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19733, + "latitude": 39.555459, + "longitude": -75.650462, + "city": "Saint Georges", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19734, + "latitude": 39.430666, + "longitude": -75.646408, + "city": "Townsend", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19735, + "latitude": 39.794396, + "longitude": -75.597598, + "city": "Winterthur", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19736, + "latitude": 39.797126, + "longitude": -75.660413, + "city": "Yorklyn", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19801, + "latitude": 39.727113, + "longitude": -75.547844, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19802, + "latitude": 39.71987, + "longitude": -75.593512, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19803, + "latitude": 39.79936, + "longitude": -75.531694, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19804, + "latitude": 39.759577, + "longitude": -75.617198, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19805, + "latitude": 39.743107, + "longitude": -75.593447, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19806, + "latitude": 39.758562, + "longitude": -75.568745, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19807, + "latitude": 39.794943, + "longitude": -75.616134, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19808, + "latitude": 39.735912, + "longitude": -75.664729, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19809, + "latitude": 39.764712, + "longitude": -75.506892, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19810, + "latitude": 39.763961, + "longitude": -75.527812, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19850, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19880, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19884, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19885, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19886, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19887, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19889, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19890, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19891, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19892, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19893, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19894, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19895, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19896, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19897, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19898, + "latitude": 39.564499, + "longitude": -75.597047, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19899, + "latitude": 39.734792, + "longitude": -75.624617, + "city": "Wilmington", + "state": "DE", + "county": "New Castle" + }, + { + "zip_code": 19901, + "latitude": 39.156376, + "longitude": -75.49549, + "city": "Dover", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19902, + "latitude": 39.10868, + "longitude": -75.448023, + "city": "Dover Afb", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19903, + "latitude": 39.10868, + "longitude": -75.448023, + "city": "Dover", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19904, + "latitude": 39.160542, + "longitude": -75.597381, + "city": "Dover", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19905, + "latitude": 39.10868, + "longitude": -75.448023, + "city": "Dover", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19906, + "latitude": "", + "longitude": "", + "city": "Dover", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19930, + "latitude": 38.555533, + "longitude": -75.186955, + "city": "Bethany Beach", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19931, + "latitude": 38.569091, + "longitude": -75.624087, + "city": "Bethel", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19933, + "latitude": 38.660295, + "longitude": -75.330023, + "city": "Bridgeville", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19934, + "latitude": 39.086921, + "longitude": -75.612286, + "city": "Camden Wyoming", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19936, + "latitude": 39.218448, + "longitude": -75.584848, + "city": "Cheswold", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19938, + "latitude": 39.246071, + "longitude": -75.688873, + "city": "Clayton", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19939, + "latitude": 38.621403, + "longitude": -75.181502, + "city": "Dagsboro", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19940, + "latitude": 38.631744, + "longitude": -75.324585, + "city": "Delmar", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19941, + "latitude": 38.652805, + "longitude": -75.275018, + "city": "Ellendale", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19943, + "latitude": 39.033438, + "longitude": -75.609891, + "city": "Felton", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19944, + "latitude": 38.486485, + "longitude": -75.058874, + "city": "Fenwick Island", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19945, + "latitude": 38.55144, + "longitude": -75.157634, + "city": "Frankford", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19946, + "latitude": 39.023141, + "longitude": -75.48191, + "city": "Frederica", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19947, + "latitude": 38.632891, + "longitude": -75.334263, + "city": "Georgetown", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19950, + "latitude": 38.82458, + "longitude": -75.588771, + "city": "Greenwood", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19951, + "latitude": 38.691547, + "longitude": -75.225025, + "city": "Harbeson", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19952, + "latitude": 38.912195, + "longitude": -75.611322, + "city": "Harrington", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19953, + "latitude": 39.16343, + "longitude": -75.679733, + "city": "Hartly", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19954, + "latitude": 38.894017, + "longitude": -75.520078, + "city": "Houston", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19955, + "latitude": 39.225604, + "longitude": -75.664153, + "city": "Kenton", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19956, + "latitude": 38.663322, + "longitude": -75.378729, + "city": "Laurel", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19958, + "latitude": 38.65536, + "longitude": -75.325612, + "city": "Lewes", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19960, + "latitude": 38.848792, + "longitude": -75.41087, + "city": "Lincoln", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19961, + "latitude": 39.166323, + "longitude": -75.448289, + "city": "Little Creek", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19962, + "latitude": 38.971647, + "longitude": -75.591714, + "city": "Magnolia", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19963, + "latitude": 38.72712, + "longitude": -75.322829, + "city": "Milford", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19964, + "latitude": 39.140254, + "longitude": -75.667898, + "city": "Marydel", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19966, + "latitude": 38.659458, + "longitude": -75.24641, + "city": "Millsboro", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19967, + "latitude": 38.700518, + "longitude": -75.242294, + "city": "Millville", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19968, + "latitude": 38.692714, + "longitude": -75.322223, + "city": "Milton", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19969, + "latitude": 38.725562, + "longitude": -75.353387, + "city": "Nassau", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19970, + "latitude": 38.621587, + "longitude": -75.104645, + "city": "Ocean View", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19971, + "latitude": 38.629763, + "longitude": -75.319975, + "city": "Rehoboth Beach", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19973, + "latitude": 38.659891, + "longitude": -75.380454, + "city": "Seaford", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19975, + "latitude": 38.550784, + "longitude": -75.330307, + "city": "Selbyville", + "state": "DE", + "county": "Sussex" + }, + { + "zip_code": 19977, + "latitude": 39.194026, + "longitude": -75.565131, + "city": "Smyrna", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19979, + "latitude": 38.971038, + "longitude": -75.577158, + "city": "Viola", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 19980, + "latitude": 39.07239, + "longitude": -75.571073, + "city": "Woodside", + "state": "DE", + "county": "Kent" + }, + { + "zip_code": 20001, + "latitude": 38.911936, + "longitude": -77.016719, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20002, + "latitude": 38.908218, + "longitude": -76.982147, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20003, + "latitude": 38.860315, + "longitude": -76.988897, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20004, + "latitude": 38.892247, + "longitude": -77.019477, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20005, + "latitude": 38.904011, + "longitude": -77.031695, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20006, + "latitude": 38.897131, + "longitude": -77.041248, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20007, + "latitude": 38.914561, + "longitude": -77.075649, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20008, + "latitude": 38.93521, + "longitude": -77.060399, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20009, + "latitude": 38.919261, + "longitude": -77.039798, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20010, + "latitude": 38.932711, + "longitude": -77.030248, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20011, + "latitude": 38.95261, + "longitude": -77.017898, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20012, + "latitude": 38.980231, + "longitude": -77.026298, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20013, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20015, + "latitude": 38.96926, + "longitude": -77.070949, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20016, + "latitude": 38.93826, + "longitude": -77.091149, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20017, + "latitude": 38.93846, + "longitude": -76.993068, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20018, + "latitude": 38.93056, + "longitude": -76.977953, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20019, + "latitude": 38.891561, + "longitude": -76.939396, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20020, + "latitude": 38.85761, + "longitude": -76.971547, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20024, + "latitude": 38.876494, + "longitude": -77.022948, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20026, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20029, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20030, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20032, + "latitude": 38.8368, + "longitude": -76.997697, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20033, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20035, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20036, + "latitude": 38.900659, + "longitude": -77.039914, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20037, + "latitude": 38.918903, + "longitude": -77.061781, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20038, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20039, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20040, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20041, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20042, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20043, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20044, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20045, + "latitude": 38.896599, + "longitude": -77.0319, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20046, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20047, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20049, + "latitude": 38.895911, + "longitude": -77.020998, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20050, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20051, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20052, + "latitude": 38.90014, + "longitude": -77.047899, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20053, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20055, + "latitude": 38.901633, + "longitude": -77.020959, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20056, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20057, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20058, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20059, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20060, + "latitude": 38.918011, + "longitude": -77.020398, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20061, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20062, + "latitude": 38.900009, + "longitude": -77.036948, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20063, + "latitude": 38.905317, + "longitude": -77.046645, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20064, + "latitude": 38.933161, + "longitude": -76.996348, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20065, + "latitude": 38.883412, + "longitude": -77.028198, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20066, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20067, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20068, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20069, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20070, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20071, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20073, + "latitude": 38.897011, + "longitude": -77.025098, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20074, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20075, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20076, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20077, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20078, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20080, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20081, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20082, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20088, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20090, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20091, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20097, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20098, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20099, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20101, + "latitude": 39.002125, + "longitude": -77.442066, + "city": "Dulles", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20102, + "latitude": 39.085309, + "longitude": -77.645224, + "city": "Dulles", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20103, + "latitude": 38.996242, + "longitude": -77.449952, + "city": "Dulles", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20104, + "latitude": 39.085309, + "longitude": -77.645224, + "city": "Dulles", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20105, + "latitude": 38.957718, + "longitude": -77.60375, + "city": "Aldie", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20106, + "latitude": 38.6842, + "longitude": -78.016813, + "city": "Amissville", + "state": "VA", + "county": "Rappahannock" + }, + { + "zip_code": 20107, + "latitude": 38.968321, + "longitude": -77.533263, + "city": "Arcola", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20108, + "latitude": 38.744685, + "longitude": -77.487162, + "city": "Manassas", + "state": "VA", + "county": "Manassas City" + }, + { + "zip_code": 20109, + "latitude": 38.763215, + "longitude": -77.493092, + "city": "Manassas", + "state": "VA", + "county": "Manassas City" + }, + { + "zip_code": 20110, + "latitude": 38.749207, + "longitude": -77.487762, + "city": "Manassas", + "state": "VA", + "county": "Manassas City" + }, + { + "zip_code": 20111, + "latitude": 38.770741, + "longitude": -77.449443, + "city": "Manassas", + "state": "VA", + "county": "Manassas Park City" + }, + { + "zip_code": 20112, + "latitude": 38.770864, + "longitude": -77.449443, + "city": "Manassas", + "state": "VA", + "county": "Manassas Park City" + }, + { + "zip_code": 20113, + "latitude": 38.770864, + "longitude": -77.449443, + "city": "Manassas", + "state": "VA", + "county": "Manassas Park City" + }, + { + "zip_code": 20115, + "latitude": 38.840456, + "longitude": -77.891136, + "city": "Marshall", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20116, + "latitude": 38.853723, + "longitude": -77.860127, + "city": "Marshall", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20117, + "latitude": 39.029599, + "longitude": -77.693844, + "city": "Middleburg", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20118, + "latitude": 39.007548, + "longitude": -77.765553, + "city": "Middleburg", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20119, + "latitude": 38.636964, + "longitude": -77.638287, + "city": "Catlett", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20120, + "latitude": 38.84479, + "longitude": -77.46701, + "city": "Centreville", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20121, + "latitude": 38.819513, + "longitude": -77.45576, + "city": "Centreville", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20122, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Centreville", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20124, + "latitude": 38.781809, + "longitude": -77.381808, + "city": "Clifton", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20128, + "latitude": 38.741639, + "longitude": -77.977432, + "city": "Orlean", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20129, + "latitude": 39.160291, + "longitude": -77.60967, + "city": "Paeonian Springs", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20130, + "latitude": 39.004843, + "longitude": -77.954597, + "city": "Paris", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20131, + "latitude": 39.057952, + "longitude": -77.743423, + "city": "Philomont", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20132, + "latitude": 39.143614, + "longitude": -77.734232, + "city": "Purcellville", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20134, + "latitude": 39.152187, + "longitude": -77.702576, + "city": "Purcellville", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20135, + "latitude": 39.082266, + "longitude": -77.846661, + "city": "Bluemont", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20136, + "latitude": 38.734255, + "longitude": -77.547383, + "city": "Bristow", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 20137, + "latitude": 38.819464, + "longitude": -77.736814, + "city": "Broad Run", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20138, + "latitude": 38.633774, + "longitude": -77.686868, + "city": "Calverton", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20139, + "latitude": 38.654282, + "longitude": -77.702542, + "city": "Casanova", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20140, + "latitude": 38.916291, + "longitude": -77.864841, + "city": "Rectortown", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20141, + "latitude": 39.116425, + "longitude": -77.780216, + "city": "Round Hill", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20142, + "latitude": 39.130665, + "longitude": -77.774665, + "city": "Round Hill", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20143, + "latitude": 38.845535, + "longitude": -77.566921, + "city": "Catharpin", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 20144, + "latitude": 38.911315, + "longitude": -77.967401, + "city": "Delaplane", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20146, + "latitude": 39.085309, + "longitude": -77.645224, + "city": "Ashburn", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20147, + "latitude": 39.037339, + "longitude": -77.480542, + "city": "Ashburn", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20148, + "latitude": 39.014196, + "longitude": -77.528452, + "city": "Ashburn", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20149, + "latitude": 39.085309, + "longitude": -77.645224, + "city": "Ashburn", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20151, + "latitude": 38.88668, + "longitude": -77.44566, + "city": "Chantilly", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20152, + "latitude": 38.897591, + "longitude": -77.509174, + "city": "Chantilly", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20153, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Chantilly", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20155, + "latitude": 38.815714, + "longitude": -77.621613, + "city": "Gainesville", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 20156, + "latitude": 38.721912, + "longitude": -77.466897, + "city": "Gainesville", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 20158, + "latitude": 39.138314, + "longitude": -77.657328, + "city": "Hamilton", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20159, + "latitude": 39.133855, + "longitude": -77.662072, + "city": "Hamilton", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20160, + "latitude": 39.098479, + "longitude": -77.688338, + "city": "Lincoln", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20163, + "latitude": 39.085309, + "longitude": -77.645224, + "city": "Sterling", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20164, + "latitude": 39.023047, + "longitude": -77.399367, + "city": "Sterling", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20165, + "latitude": 39.047157, + "longitude": -77.386647, + "city": "Sterling", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20166, + "latitude": 38.981387, + "longitude": -77.472333, + "city": "Sterling", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20167, + "latitude": 39.085309, + "longitude": -77.645224, + "city": "Sterling", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20168, + "latitude": 38.721912, + "longitude": -77.466897, + "city": "Haymarket", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 20169, + "latitude": 38.867441, + "longitude": -77.644539, + "city": "Haymarket", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 20170, + "latitude": 38.983887, + "longitude": -77.367457, + "city": "Herndon", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20171, + "latitude": 38.92518, + "longitude": -77.39284, + "city": "Herndon", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20172, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Herndon", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20175, + "latitude": 39.041987, + "longitude": -77.605404, + "city": "Leesburg", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20176, + "latitude": 39.119727, + "longitude": -77.603458, + "city": "Leesburg", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20177, + "latitude": 39.158095, + "longitude": -77.666863, + "city": "Leesburg", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20178, + "latitude": 39.072918, + "longitude": -77.608014, + "city": "Leesburg", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20180, + "latitude": 39.220432, + "longitude": -77.659636, + "city": "Lovettsville", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20181, + "latitude": 38.700017, + "longitude": -77.548271, + "city": "Nokesville", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 20182, + "latitude": 38.700866, + "longitude": -77.585708, + "city": "Nokesville", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 20184, + "latitude": 38.962661, + "longitude": -77.884726, + "city": "Upperville", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20185, + "latitude": 38.992978, + "longitude": -77.879855, + "city": "Upperville", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20186, + "latitude": 38.689832, + "longitude": -77.836115, + "city": "Warrenton", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20187, + "latitude": 38.715296, + "longitude": -77.741696, + "city": "Warrenton", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20188, + "latitude": 38.765619, + "longitude": -77.820293, + "city": "Warrenton", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20190, + "latitude": 38.96146, + "longitude": -77.3418, + "city": "Reston", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20191, + "latitude": 38.93181, + "longitude": -77.352718, + "city": "Reston", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20192, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Herndon", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20193, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Reston", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20194, + "latitude": 38.980742, + "longitude": -77.341878, + "city": "Reston", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20195, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Reston", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20196, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Reston", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 20197, + "latitude": 39.188205, + "longitude": -77.630013, + "city": "Waterford", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20198, + "latitude": 38.870681, + "longitude": -77.760779, + "city": "The Plains", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 20199, + "latitude": 39.085309, + "longitude": -77.645224, + "city": "Dulles", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 20201, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20202, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20203, + "latitude": 38.905317, + "longitude": -77.046645, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20204, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20206, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20207, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20208, + "latitude": 38.896611, + "longitude": -77.011748, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20210, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20211, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20212, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20213, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20214, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20215, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20216, + "latitude": 38.891911, + "longitude": -77.014098, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20217, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20218, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20219, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20220, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20221, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20222, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20223, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20224, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20226, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20227, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20228, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20229, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20230, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20231, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20232, + "latitude": 38.900561, + "longitude": -77.039099, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20233, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20235, + "latitude": 38.915361, + "longitude": -77.057199, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20237, + "latitude": "", + "longitude": "", + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20238, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20239, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20240, + "latitude": 38.897143, + "longitude": -77.040895, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20241, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20242, + "latitude": 38.867812, + "longitude": -77.028948, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20244, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20245, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20250, + "latitude": 38.887323, + "longitude": -77.03274, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20251, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20254, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20260, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20261, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20262, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20265, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20266, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20268, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20270, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20277, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20289, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20299, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20301, + "latitude": 38.889357, + "longitude": -77.031113, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20303, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20306, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20307, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20310, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20314, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20315, + "latitude": 38.928861, + "longitude": -77.017948, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20317, + "latitude": 38.931161, + "longitude": -77.010298, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20318, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20319, + "latitude": 38.866745, + "longitude": -77.016556, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20330, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20332, + "latitude": 38.834563, + "longitude": -77.015848, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20336, + "latitude": 38.860415, + "longitude": -77.022545, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20337, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20338, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20340, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20350, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20370, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20372, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20373, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Anacostia Annex", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20374, + "latitude": 38.855522, + "longitude": -77.002197, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20375, + "latitude": 38.826163, + "longitude": -77.017448, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20376, + "latitude": "", + "longitude": "", + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20380, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20388, + "latitude": 38.872553, + "longitude": -76.996605, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20389, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20390, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20391, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20392, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20393, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20394, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20395, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20398, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20401, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20402, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20403, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20404, + "latitude": 38.899161, + "longitude": -77.008948, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20405, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20406, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20407, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20408, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20409, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20410, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20411, + "latitude": 38.883962, + "longitude": -77.022098, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20412, + "latitude": 38.895261, + "longitude": -77.022098, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20413, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20414, + "latitude": 38.883962, + "longitude": -77.022098, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20415, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20416, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20418, + "latitude": 38.904253, + "longitude": -77.05723, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20419, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20420, + "latitude": 38.903461, + "longitude": -77.027648, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20421, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20422, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20423, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20424, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20425, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20426, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20427, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20428, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20429, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20431, + "latitude": 38.898618, + "longitude": -77.042753, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20433, + "latitude": 38.899996, + "longitude": -77.041976, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20434, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20435, + "latitude": 38.899399, + "longitude": -77.040319, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20436, + "latitude": 38.895927, + "longitude": -77.021068, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20437, + "latitude": 38.902761, + "longitude": -77.048499, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20439, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20440, + "latitude": 38.913911, + "longitude": -77.045349, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20441, + "latitude": 38.923861, + "longitude": -77.036349, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20442, + "latitude": 38.895977, + "longitude": -77.017668, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20444, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20447, + "latitude": 38.884712, + "longitude": -77.025198, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20451, + "latitude": 38.897711, + "longitude": -77.044449, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20453, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20456, + "latitude": 38.898111, + "longitude": -77.040149, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20460, + "latitude": 38.876362, + "longitude": -77.018798, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20463, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20468, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20469, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20470, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20472, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20500, + "latitude": "", + "longitude": "", + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20501, + "latitude": 38.89872, + "longitude": -77.036198, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20502, + "latitude": 38.89872, + "longitude": -77.036198, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20503, + "latitude": 38.900711, + "longitude": -77.043068, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20504, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20505, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20506, + "latitude": 38.899364, + "longitude": -77.037668, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20507, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20508, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20510, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20515, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20520, + "latitude": 38.893217, + "longitude": -77.048957, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20521, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20522, + "latitude": 38.893217, + "longitude": -77.048957, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20523, + "latitude": 38.89449, + "longitude": -77.047807, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20524, + "latitude": 38.902414, + "longitude": -77.032601, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20525, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20526, + "latitude": 38.902217, + "longitude": -77.043738, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20527, + "latitude": 38.902933, + "longitude": -77.036091, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20530, + "latitude": 38.897561, + "longitude": -77.026998, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20531, + "latitude": 38.893761, + "longitude": -77.021848, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20532, + "latitude": 38.904486, + "longitude": -77.017291, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20533, + "latitude": 38.901102, + "longitude": -77.032591, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20534, + "latitude": 38.894075, + "longitude": -77.01254, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20535, + "latitude": 38.894097, + "longitude": -77.025133, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20536, + "latitude": 38.901211, + "longitude": -77.016948, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20537, + "latitude": 38.894097, + "longitude": -77.025133, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20538, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20539, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20540, + "latitude": 38.887405, + "longitude": -77.004663, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20541, + "latitude": 38.887405, + "longitude": -77.004663, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20542, + "latitude": 38.940761, + "longitude": -77.028348, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20543, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20544, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20546, + "latitude": 38.890976, + "longitude": -77.021092, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20547, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20548, + "latitude": 38.898111, + "longitude": -77.017698, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20549, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20550, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20551, + "latitude": 38.891995, + "longitude": -77.045219, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20552, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20553, + "latitude": 38.887333, + "longitude": -77.023118, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20554, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20555, + "latitude": 38.900011, + "longitude": -77.040149, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20557, + "latitude": 38.887405, + "longitude": -77.004663, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20558, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20559, + "latitude": 38.887405, + "longitude": -77.004663, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20560, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20565, + "latitude": 38.891941, + "longitude": -77.018853, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20566, + "latitude": 38.897074, + "longitude": -77.05535, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20570, + "latitude": 38.899061, + "longitude": -77.040149, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20571, + "latitude": 38.900559, + "longitude": -77.034554, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20572, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20573, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20575, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20576, + "latitude": 38.893662, + "longitude": -77.023592, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20577, + "latitude": 38.900758, + "longitude": -77.034455, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20578, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20579, + "latitude": 38.904311, + "longitude": -77.044649, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20580, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20581, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20585, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20586, + "latitude": 38.902211, + "longitude": -77.047399, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20590, + "latitude": 38.883962, + "longitude": -77.022098, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20591, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20593, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20594, + "latitude": 38.88494, + "longitude": -77.018372, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20597, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20599, + "latitude": 38.893311, + "longitude": -77.014647, + "city": "Washington", + "state": "DC", + "county": "District Of Columbia" + }, + { + "zip_code": 20601, + "latitude": 38.603783, + "longitude": -76.867928, + "city": "Waldorf", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20602, + "latitude": 38.518559, + "longitude": -76.912165, + "city": "Waldorf", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20603, + "latitude": 38.52115, + "longitude": -77.062012, + "city": "Waldorf", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20604, + "latitude": 38.509548, + "longitude": -76.981651, + "city": "Waldorf", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20606, + "latitude": 38.247149, + "longitude": -76.748088, + "city": "Abell", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20607, + "latitude": 38.666071, + "longitude": -76.998396, + "city": "Accokeek", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20608, + "latitude": 38.588843, + "longitude": -76.712639, + "city": "Aquasco", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20609, + "latitude": 38.300217, + "longitude": -76.743445, + "city": "Avenue", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20610, + "latitude": 38.444727, + "longitude": -76.533026, + "city": "Barstow", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20611, + "latitude": 38.454919, + "longitude": -76.980364, + "city": "Bel Alton", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20612, + "latitude": 38.508689, + "longitude": -76.687344, + "city": "Benedict", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20613, + "latitude": 38.658807, + "longitude": -76.824293, + "city": "Brandywine", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20615, + "latitude": 38.493984, + "longitude": -76.567469, + "city": "Broomes Island", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20616, + "latitude": 38.636227, + "longitude": -77.084649, + "city": "Bryans Road", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20617, + "latitude": 38.536256, + "longitude": -76.853752, + "city": "Bryantown", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20618, + "latitude": 38.309507, + "longitude": -76.763069, + "city": "Bushwood", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20619, + "latitude": 38.324994, + "longitude": -76.637383, + "city": "California", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20620, + "latitude": 38.347927, + "longitude": -76.621613, + "city": "Callaway", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20621, + "latitude": 38.350987, + "longitude": -76.783288, + "city": "Chaptico", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20622, + "latitude": 38.484421, + "longitude": -76.754943, + "city": "Charlotte Hall", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20623, + "latitude": 38.745514, + "longitude": -76.840572, + "city": "Cheltenham", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20624, + "latitude": 38.329424, + "longitude": -76.730799, + "city": "Clements", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20625, + "latitude": 38.262037, + "longitude": -76.85019, + "city": "Cobb Island", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20626, + "latitude": 38.236645, + "longitude": -76.762227, + "city": "Coltons Point", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20627, + "latitude": 38.276828, + "longitude": -76.703971, + "city": "Compton", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20628, + "latitude": 38.148114, + "longitude": -76.359651, + "city": "Dameron", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20629, + "latitude": 38.376974, + "longitude": -76.434476, + "city": "Dowell", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20630, + "latitude": 38.178948, + "longitude": -76.47451, + "city": "Drayden", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20632, + "latitude": 38.421762, + "longitude": -76.948718, + "city": "Faulkner", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20634, + "latitude": 38.242387, + "longitude": -76.501513, + "city": "Great Mills", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20635, + "latitude": 38.312112, + "longitude": -76.607676, + "city": "Helen", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20636, + "latitude": 38.342437, + "longitude": -76.569163, + "city": "Hollywood", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20637, + "latitude": 38.520572, + "longitude": -76.781313, + "city": "Hughesville", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20639, + "latitude": 38.519368, + "longitude": -76.546326, + "city": "Huntingtown", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20640, + "latitude": 38.453999, + "longitude": -77.052819, + "city": "Indian Head", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20643, + "latitude": 38.503876, + "longitude": -77.148283, + "city": "Ironsides", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20645, + "latitude": 38.298477, + "longitude": -76.88491, + "city": "Issue", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20646, + "latitude": 38.513875, + "longitude": -77.01034, + "city": "La Plata", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20650, + "latitude": 38.278757, + "longitude": -76.655917, + "city": "Leonardtown", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20653, + "latitude": 38.232909, + "longitude": -76.430853, + "city": "Lexington Park", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20656, + "latitude": 38.359274, + "longitude": -76.683325, + "city": "Loveville", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20657, + "latitude": 38.49343, + "longitude": -76.459768, + "city": "Lusby", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20658, + "latitude": 38.563331, + "longitude": -77.159621, + "city": "Marbury", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20659, + "latitude": 38.279211, + "longitude": -76.608406, + "city": "Mechanicsville", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20660, + "latitude": 38.363994, + "longitude": -76.694102, + "city": "Morganza", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20661, + "latitude": 38.343591, + "longitude": -76.884559, + "city": "Mount Victoria", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20662, + "latitude": 38.430568, + "longitude": -77.192545, + "city": "Nanjemoy", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20664, + "latitude": 38.364718, + "longitude": -76.917398, + "city": "Newburg", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20667, + "latitude": 38.216529, + "longitude": -76.433445, + "city": "Park Hall", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20670, + "latitude": 38.281094, + "longitude": -76.420952, + "city": "Patuxent River", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20674, + "latitude": 38.16863, + "longitude": -76.498367, + "city": "Piney Point", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20675, + "latitude": 38.576096, + "longitude": -77.015916, + "city": "Pomfret", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20676, + "latitude": 38.560231, + "longitude": -76.531761, + "city": "Port Republic", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20677, + "latitude": 38.504699, + "longitude": -77.037862, + "city": "Port Tobacco", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20678, + "latitude": 38.511282, + "longitude": -76.528578, + "city": "Prince Frederick", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20680, + "latitude": 38.122181, + "longitude": -76.369412, + "city": "Ridge", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20682, + "latitude": 38.283551, + "longitude": -76.848093, + "city": "Rock Point", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20684, + "latitude": 38.141377, + "longitude": -76.38535, + "city": "Saint Inigoes", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20685, + "latitude": 38.440484, + "longitude": -76.51736, + "city": "Saint Leonard", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20686, + "latitude": 38.188796, + "longitude": -76.420738, + "city": "Saint Marys City", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20687, + "latitude": 38.078898, + "longitude": -76.351659, + "city": "Scotland", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20688, + "latitude": 38.37741, + "longitude": -76.440937, + "city": "Solomons", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20689, + "latitude": 38.556448, + "longitude": -76.541436, + "city": "Sunderland", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20690, + "latitude": 38.160744, + "longitude": -76.525504, + "city": "Tall Timbers", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20692, + "latitude": 38.192688, + "longitude": -76.501604, + "city": "Valley Lee", + "state": "MD", + "county": "Saint Marys" + }, + { + "zip_code": 20693, + "latitude": 38.476246, + "longitude": -77.084009, + "city": "Welcome", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20695, + "latitude": 38.59744, + "longitude": -76.990278, + "city": "White Plains", + "state": "MD", + "county": "Charles" + }, + { + "zip_code": 20697, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Southern Md Facility", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20701, + "latitude": 39.1332, + "longitude": -76.798843, + "city": "Annapolis Junction", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 20703, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Lanham", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20704, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Beltsville", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20705, + "latitude": 39.044858, + "longitude": -76.886795, + "city": "Beltsville", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20706, + "latitude": 38.96076, + "longitude": -76.856135, + "city": "Lanham", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20707, + "latitude": 39.093136, + "longitude": -76.881945, + "city": "Laurel", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20708, + "latitude": 39.049859, + "longitude": -76.834493, + "city": "Laurel", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20709, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Laurel", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20710, + "latitude": 38.901211, + "longitude": -76.925943, + "city": "Bladensburg", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20711, + "latitude": 38.802263, + "longitude": -76.645735, + "city": "Lothian", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 20712, + "latitude": 38.94266, + "longitude": -76.967057, + "city": "Mount Rainier", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20714, + "latitude": 38.610496, + "longitude": -76.595901, + "city": "North Beach", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20715, + "latitude": 38.982612, + "longitude": -76.74379, + "city": "Bowie", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20716, + "latitude": 38.926311, + "longitude": -76.709789, + "city": "Bowie", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20717, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Bowie", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20718, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Bowie", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20719, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Bowie", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20720, + "latitude": 38.98851, + "longitude": -76.79098, + "city": "Bowie", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20721, + "latitude": 38.919357, + "longitude": -76.787141, + "city": "Bowie", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20722, + "latitude": 38.886849, + "longitude": -76.865764, + "city": "Brentwood", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20723, + "latitude": 39.13652, + "longitude": -76.868729, + "city": "Laurel", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 20724, + "latitude": 39.098008, + "longitude": -76.804443, + "city": "Laurel", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 20725, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Laurel", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20726, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Laurel", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20731, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Capitol Heights", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20732, + "latitude": 38.565841, + "longitude": -76.526169, + "city": "Chesapeake Beach", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20733, + "latitude": 38.921313, + "longitude": -76.532569, + "city": "Churchton", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 20735, + "latitude": 38.739765, + "longitude": -76.912096, + "city": "Clinton", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20736, + "latitude": 38.548775, + "longitude": -76.562876, + "city": "Owings", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20737, + "latitude": 38.963206, + "longitude": -76.917795, + "city": "Riverdale", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20738, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Riverdale", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20740, + "latitude": 38.979495, + "longitude": -76.895852, + "city": "College Park", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20741, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "College Park", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20742, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "College Park", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20743, + "latitude": 38.889711, + "longitude": -76.892544, + "city": "Capitol Heights", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20744, + "latitude": 38.757114, + "longitude": -76.977596, + "city": "Fort Washington", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20745, + "latitude": 38.814362, + "longitude": -76.957746, + "city": "Oxon Hill", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20746, + "latitude": 38.834912, + "longitude": -76.912745, + "city": "Suitland", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20747, + "latitude": 38.851262, + "longitude": -76.885744, + "city": "District Heights", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20748, + "latitude": 38.817263, + "longitude": -76.935795, + "city": "Temple Hills", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20749, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Fort Washington", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20750, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Oxon Hill", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20751, + "latitude": 38.960712, + "longitude": -76.621708, + "city": "Deale", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 20752, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Suitland", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20753, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "District Heights", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20754, + "latitude": 38.604072, + "longitude": -76.604364, + "city": "Dunkirk", + "state": "MD", + "county": "Calvert" + }, + { + "zip_code": 20755, + "latitude": 39.154307, + "longitude": -76.69119, + "city": "Fort George G Meade", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 20757, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Temple Hills", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20758, + "latitude": 38.736079, + "longitude": -76.583547, + "city": "Friendship", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 20759, + "latitude": 39.160806, + "longitude": -76.927881, + "city": "Fulton", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 20762, + "latitude": 38.806207, + "longitude": -76.875551, + "city": "Andrews Air Force Base", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20763, + "latitude": 39.136189, + "longitude": -76.815044, + "city": "Savage", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 20764, + "latitude": 38.965727, + "longitude": -76.589086, + "city": "Shady Side", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 20765, + "latitude": 38.974512, + "longitude": -76.545083, + "city": "Galesville", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 20768, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Greenbelt", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20769, + "latitude": 38.98346, + "longitude": -76.811392, + "city": "Glenn Dale", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20770, + "latitude": 38.995909, + "longitude": -76.880966, + "city": "Greenbelt", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20771, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Greenbelt", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20772, + "latitude": 38.816171, + "longitude": -76.786093, + "city": "Upper Marlboro", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20773, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Upper Marlboro", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20774, + "latitude": 38.868212, + "longitude": -76.815591, + "city": "Upper Marlboro", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20775, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Upper Marlboro", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20776, + "latitude": 38.962992, + "longitude": -76.564785, + "city": "Harwood", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 20777, + "latitude": 39.173059, + "longitude": -76.966718, + "city": "Highland", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 20778, + "latitude": 39.002411, + "longitude": -76.563885, + "city": "West River", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 20779, + "latitude": 38.942878, + "longitude": -76.558783, + "city": "Tracys Landing", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 20781, + "latitude": 38.94161, + "longitude": -76.937446, + "city": "Hyattsville", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20782, + "latitude": 38.912211, + "longitude": -76.967247, + "city": "Hyattsville", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20783, + "latitude": 39.000509, + "longitude": -76.972297, + "city": "Hyattsville", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20784, + "latitude": 38.95131, + "longitude": -76.895795, + "city": "Hyattsville", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20785, + "latitude": 38.922261, + "longitude": -76.875494, + "city": "Hyattsville", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20787, + "latitude": 38.98707, + "longitude": -76.982405, + "city": "Hyattsville", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20788, + "latitude": 38.969434, + "longitude": -76.950913, + "city": "Hyattsville", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20790, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Capitol Heights", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20791, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Capitol Heights", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20792, + "latitude": "", + "longitude": "", + "city": "Upper Marlboro", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20794, + "latitude": 39.155266, + "longitude": -76.813394, + "city": "Jessup", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 20797, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Southern Md Facility", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20799, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Capitol Heights", + "state": "MD", + "county": "Prince Georges" + }, + { + "zip_code": 20812, + "latitude": 38.96851, + "longitude": -77.140801, + "city": "Glen Echo", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20813, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Bethesda", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20814, + "latitude": 39.00452, + "longitude": -77.1046, + "city": "Bethesda", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20815, + "latitude": 38.983759, + "longitude": -77.079449, + "city": "Chevy Chase", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20816, + "latitude": 38.955907, + "longitude": -77.1165, + "city": "Bethesda", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20817, + "latitude": 38.989586, + "longitude": -77.153801, + "city": "Bethesda", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20818, + "latitude": 39.128407, + "longitude": -77.180053, + "city": "Cabin John", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20824, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Bethesda", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20825, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Chevy Chase", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20827, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Bethesda", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20830, + "latitude": 39.15522, + "longitude": -77.066745, + "city": "Olney", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20832, + "latitude": 39.150364, + "longitude": -77.077651, + "city": "Olney", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20833, + "latitude": 39.204341, + "longitude": -77.05055, + "city": "Brookeville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20837, + "latitude": 39.123705, + "longitude": -77.403211, + "city": "Poolesville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20838, + "latitude": 39.228424, + "longitude": -77.37097, + "city": "Barnesville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20839, + "latitude": 39.17877, + "longitude": -77.419605, + "city": "Beallsville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20841, + "latitude": 39.184675, + "longitude": -77.328764, + "city": "Boyds", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20842, + "latitude": 39.191093, + "longitude": -77.421929, + "city": "Dickerson", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20847, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Rockville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20848, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Rockville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20849, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Rockville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20850, + "latitude": 39.089557, + "longitude": -77.184127, + "city": "Rockville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20851, + "latitude": 39.077858, + "longitude": -77.125751, + "city": "Rockville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20852, + "latitude": 39.052158, + "longitude": -77.121096, + "city": "Rockville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20853, + "latitude": 39.107357, + "longitude": -77.0996, + "city": "Rockville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20854, + "latitude": 39.029839, + "longitude": -77.234792, + "city": "Potomac", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20855, + "latitude": 39.142857, + "longitude": -77.138145, + "city": "Derwood", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20857, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Rockville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20859, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Potomac", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20860, + "latitude": 39.142424, + "longitude": -77.044614, + "city": "Sandy Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20861, + "latitude": 39.151468, + "longitude": -76.994498, + "city": "Ashton", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20862, + "latitude": 39.175506, + "longitude": -77.020626, + "city": "Brinklow", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20866, + "latitude": 39.105644, + "longitude": -76.935861, + "city": "Burtonsville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20868, + "latitude": 39.122262, + "longitude": -76.972157, + "city": "Spencerville", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20871, + "latitude": 39.207775, + "longitude": -77.259816, + "city": "Clarksburg", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20872, + "latitude": 39.285477, + "longitude": -77.215203, + "city": "Damascus", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20874, + "latitude": 39.135512, + "longitude": -77.282223, + "city": "Germantown", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20875, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Germantown", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20876, + "latitude": 39.210218, + "longitude": -77.239729, + "city": "Germantown", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20877, + "latitude": 39.139336, + "longitude": -77.182953, + "city": "Gaithersburg", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20878, + "latitude": 39.091857, + "longitude": -77.198452, + "city": "Gaithersburg", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20879, + "latitude": 39.173, + "longitude": -77.185542, + "city": "Gaithersburg", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20880, + "latitude": 39.138815, + "longitude": -77.172591, + "city": "Washington Grove", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20882, + "latitude": 39.233512, + "longitude": -77.145781, + "city": "Gaithersburg", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20883, + "latitude": "", + "longitude": "", + "city": "Gaithersburg", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20884, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Gaithersburg", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20885, + "latitude": 39.187421, + "longitude": -77.202798, + "city": "Gaithersburg", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20886, + "latitude": 39.175703, + "longitude": -77.18725, + "city": "Montgomery Village", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20889, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Bethesda", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20891, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Kensington", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20892, + "latitude": 39.002375, + "longitude": -77.10341, + "city": "Bethesda", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20894, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Bethesda", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20895, + "latitude": 39.09538, + "longitude": -77.111555, + "city": "Kensington", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20896, + "latitude": 39.036496, + "longitude": -77.0931, + "city": "Garrett Park", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20897, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Suburb Maryland Fac", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20898, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Gaithersburg", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20899, + "latitude": 39.140324, + "longitude": -77.221984, + "city": "Gaithersburg", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20901, + "latitude": 39.036289, + "longitude": -77.010948, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20902, + "latitude": 39.039974, + "longitude": -77.044449, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20903, + "latitude": 39.015209, + "longitude": -76.980597, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20904, + "latitude": 39.066844, + "longitude": -76.996866, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20905, + "latitude": 39.114753, + "longitude": -77.00587, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20906, + "latitude": 39.083978, + "longitude": -77.061278, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20907, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20908, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20910, + "latitude": 39.003109, + "longitude": -77.029648, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20911, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20912, + "latitude": 38.98236, + "longitude": -77.005798, + "city": "Takoma Park", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20913, + "latitude": 38.833563, + "longitude": -76.877743, + "city": "Takoma Park", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20914, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20915, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20916, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20918, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 20997, + "latitude": 39.143979, + "longitude": -77.207617, + "city": "Silver Spring", + "state": "MD", + "county": "Montgomery" + }, + { + "zip_code": 21001, + "latitude": 39.499909, + "longitude": -76.231177, + "city": "Aberdeen", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21005, + "latitude": 39.477062, + "longitude": -76.120824, + "city": "Aberdeen Proving Ground", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21009, + "latitude": 39.472579, + "longitude": -76.277279, + "city": "Abingdon", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21010, + "latitude": 39.380158, + "longitude": -76.295468, + "city": "Gunpowder", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21012, + "latitude": 39.031461, + "longitude": -76.623203, + "city": "Arnold", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21013, + "latitude": 39.496406, + "longitude": -76.486624, + "city": "Baldwin", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21014, + "latitude": 39.547557, + "longitude": -76.321984, + "city": "Bel Air", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21015, + "latitude": 39.551757, + "longitude": -76.298713, + "city": "Bel Air", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21017, + "latitude": 39.47366, + "longitude": -76.238835, + "city": "Belcamp", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21018, + "latitude": 39.509276, + "longitude": -76.385083, + "city": "Benson", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21020, + "latitude": 39.521276, + "longitude": -76.804699, + "city": "Boring", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21022, + "latitude": 39.397861, + "longitude": -76.671742, + "city": "Brooklandville", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21023, + "latitude": 39.532955, + "longitude": -76.743196, + "city": "Butler", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21027, + "latitude": 39.438964, + "longitude": -76.592139, + "city": "Chase", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21028, + "latitude": 39.563172, + "longitude": -76.236427, + "city": "Churchville", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21029, + "latitude": 39.212456, + "longitude": -76.951498, + "city": "Clarksville", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21030, + "latitude": 39.491227, + "longitude": -76.664077, + "city": "Cockeysville", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21031, + "latitude": 39.480493, + "longitude": -76.655257, + "city": "Hunt Valley", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21032, + "latitude": 39.01811, + "longitude": -76.588272, + "city": "Crownsville", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21034, + "latitude": 39.646205, + "longitude": -76.226377, + "city": "Darlington", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21035, + "latitude": 39.04296, + "longitude": -76.62863, + "city": "Davidsonville", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21036, + "latitude": 39.240155, + "longitude": -77.00375, + "city": "Dayton", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21037, + "latitude": 38.975128, + "longitude": -76.623684, + "city": "Edgewater", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21040, + "latitude": 39.434799, + "longitude": -76.293579, + "city": "Edgewood", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21041, + "latitude": 39.236405, + "longitude": -76.941902, + "city": "Ellicott City", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21042, + "latitude": 39.261897, + "longitude": -76.897247, + "city": "Ellicott City", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21043, + "latitude": 39.254833, + "longitude": -76.800124, + "city": "Ellicott City", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21044, + "latitude": 39.206132, + "longitude": -76.887905, + "city": "Columbia", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21045, + "latitude": 39.207806, + "longitude": -76.825475, + "city": "Columbia", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21046, + "latitude": 39.175406, + "longitude": -76.834945, + "city": "Columbia", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21047, + "latitude": 39.531206, + "longitude": -76.439035, + "city": "Fallston", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21048, + "latitude": 39.499102, + "longitude": -76.910108, + "city": "Finksburg", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21050, + "latitude": 39.587155, + "longitude": -76.392733, + "city": "Forest Hill", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21051, + "latitude": 39.47314, + "longitude": -76.448385, + "city": "Fork", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21052, + "latitude": 39.206998, + "longitude": -76.445599, + "city": "Fort Howard", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21053, + "latitude": 39.687103, + "longitude": -76.717644, + "city": "Freeland", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21054, + "latitude": 39.048359, + "longitude": -76.631238, + "city": "Gambrills", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21055, + "latitude": 39.438964, + "longitude": -76.592139, + "city": "Garrison", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21056, + "latitude": 39.086064, + "longitude": -76.545474, + "city": "Gibson Island", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21057, + "latitude": 39.451006, + "longitude": -76.501186, + "city": "Glen Arm", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21060, + "latitude": 39.170158, + "longitude": -76.579836, + "city": "Glen Burnie", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21061, + "latitude": 38.967943, + "longitude": -76.615637, + "city": "Glen Burnie", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21062, + "latitude": 38.974203, + "longitude": -76.594942, + "city": "Glen Burnie", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21071, + "latitude": 39.515748, + "longitude": -76.766097, + "city": "Glyndon", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21074, + "latitude": 39.614552, + "longitude": -76.864427, + "city": "Hampstead", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21075, + "latitude": 39.205756, + "longitude": -76.753093, + "city": "Elkridge", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21076, + "latitude": 39.057694, + "longitude": -76.615557, + "city": "Hanover", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21077, + "latitude": 38.947102, + "longitude": -76.629277, + "city": "Harmans", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21078, + "latitude": 39.560095, + "longitude": -76.15517, + "city": "Havre De Grace", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21080, + "latitude": 39.534703, + "longitude": -77.049302, + "city": "Henryton", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21082, + "latitude": 39.481685, + "longitude": -76.471736, + "city": "Hydes", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21084, + "latitude": 39.552706, + "longitude": -76.419734, + "city": "Jarrettsville", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21085, + "latitude": 39.449157, + "longitude": -76.351881, + "city": "Joppa", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21087, + "latitude": 39.445257, + "longitude": -76.421783, + "city": "Kingsville", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21088, + "latitude": 39.534703, + "longitude": -77.049302, + "city": "Lineboro", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21090, + "latitude": 39.068309, + "longitude": -76.631743, + "city": "Linthicum Heights", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21092, + "latitude": 39.438964, + "longitude": -76.592139, + "city": "Long Green", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21093, + "latitude": 39.433206, + "longitude": -76.654593, + "city": "Lutherville Timonium", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21094, + "latitude": 39.438964, + "longitude": -76.592139, + "city": "Lutherville Timonium", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21098, + "latitude": 38.974203, + "longitude": -76.594942, + "city": "Hanover", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21102, + "latitude": 39.556164, + "longitude": -76.870849, + "city": "Manchester", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21104, + "latitude": 39.378104, + "longitude": -76.916267, + "city": "Marriottsville", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21105, + "latitude": 39.711379, + "longitude": -76.659492, + "city": "Maryland Line", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21106, + "latitude": 38.971475, + "longitude": -76.580934, + "city": "Mayo", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21108, + "latitude": 38.986961, + "longitude": -76.582479, + "city": "Millersville", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21111, + "latitude": 39.566189, + "longitude": -76.597891, + "city": "Monkton", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21113, + "latitude": 38.975412, + "longitude": -76.586886, + "city": "Odenton", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21114, + "latitude": 39.06436, + "longitude": -76.622577, + "city": "Crofton", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21117, + "latitude": 39.429055, + "longitude": -76.787696, + "city": "Owings Mills", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21120, + "latitude": 39.642203, + "longitude": -76.673693, + "city": "Parkton", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21122, + "latitude": 38.976813, + "longitude": -76.616185, + "city": "Pasadena", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21123, + "latitude": 38.974203, + "longitude": -76.594942, + "city": "Pasadena", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21128, + "latitude": 39.404757, + "longitude": -76.450084, + "city": "Perry Hall", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21130, + "latitude": 39.471559, + "longitude": -76.211676, + "city": "Perryman", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21131, + "latitude": 39.483255, + "longitude": -76.577619, + "city": "Phoenix", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21132, + "latitude": 39.692854, + "longitude": -76.421834, + "city": "Pylesville", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21133, + "latitude": 39.377872, + "longitude": -76.816675, + "city": "Randallstown", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21136, + "latitude": 39.487615, + "longitude": -76.796347, + "city": "Reisterstown", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21139, + "latitude": 39.438964, + "longitude": -76.592139, + "city": "Riderwood", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21140, + "latitude": 39.031943, + "longitude": -76.625199, + "city": "Riva", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21144, + "latitude": 38.983971, + "longitude": -76.623121, + "city": "Severn", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21146, + "latitude": 38.951199, + "longitude": -76.603722, + "city": "Severna Park", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21150, + "latitude": 39.236405, + "longitude": -76.941902, + "city": "Simpsonville", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21152, + "latitude": 39.526441, + "longitude": -76.715587, + "city": "Sparks Glencoe", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21153, + "latitude": 39.412905, + "longitude": -76.730345, + "city": "Stevenson", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21154, + "latitude": 39.657355, + "longitude": -76.371332, + "city": "Street", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21155, + "latitude": 39.567574, + "longitude": -76.797213, + "city": "Upperco", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21156, + "latitude": 39.461038, + "longitude": -76.583163, + "city": "Upper Falls", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21157, + "latitude": 39.564201, + "longitude": -76.980701, + "city": "Westminster", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21158, + "latitude": 39.606981, + "longitude": -77.029403, + "city": "Westminster", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21160, + "latitude": 39.703155, + "longitude": -76.330641, + "city": "Whiteford", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21161, + "latitude": 39.658104, + "longitude": -76.527937, + "city": "White Hall", + "state": "MD", + "county": "Harford" + }, + { + "zip_code": 21162, + "latitude": 39.389457, + "longitude": -76.411976, + "city": "White Marsh", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21163, + "latitude": 39.349834, + "longitude": -76.845587, + "city": "Woodstock", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21201, + "latitude": 39.296536, + "longitude": -76.623489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21202, + "latitude": 39.295907, + "longitude": -76.608438, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21203, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21204, + "latitude": 39.407156, + "longitude": -76.60379, + "city": "Towson", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21205, + "latitude": 39.302757, + "longitude": -76.567987, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21206, + "latitude": 39.336857, + "longitude": -76.553237, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21207, + "latitude": 39.325605, + "longitude": -76.736594, + "city": "Gwynn Oak", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21208, + "latitude": 39.385156, + "longitude": -76.727036, + "city": "Pikesville", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21209, + "latitude": 39.354256, + "longitude": -76.667892, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21210, + "latitude": 39.352356, + "longitude": -76.63329, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21211, + "latitude": 39.327889, + "longitude": -76.63899, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21212, + "latitude": 39.356206, + "longitude": -76.610989, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21213, + "latitude": 39.306606, + "longitude": -76.603338, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21214, + "latitude": 39.350006, + "longitude": -76.562187, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21215, + "latitude": 39.343306, + "longitude": -76.681192, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21216, + "latitude": 39.310756, + "longitude": -76.674792, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21217, + "latitude": 39.308606, + "longitude": -76.63749, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21218, + "latitude": 39.328456, + "longitude": -76.599139, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21219, + "latitude": 39.229611, + "longitude": -76.445532, + "city": "Sparrows Point", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21220, + "latitude": 39.344057, + "longitude": -76.505086, + "city": "Middle River", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21221, + "latitude": 39.296007, + "longitude": -76.559787, + "city": "Essex", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21222, + "latitude": 39.325991, + "longitude": -76.451733, + "city": "Dundalk", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21223, + "latitude": 39.279506, + "longitude": -76.65014, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21224, + "latitude": 39.279207, + "longitude": -76.557237, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21225, + "latitude": 39.018973, + "longitude": -76.616437, + "city": "Brooklyn", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21226, + "latitude": 39.06871, + "longitude": -76.584137, + "city": "Curtis Bay", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21227, + "latitude": 39.241606, + "longitude": -76.677291, + "city": "Halethorpe", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21228, + "latitude": 39.274156, + "longitude": -76.631074, + "city": "Catonsville", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21229, + "latitude": 39.286613, + "longitude": -76.65284, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21230, + "latitude": 39.264548, + "longitude": -76.622439, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21231, + "latitude": 39.288757, + "longitude": -76.592238, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21233, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21234, + "latitude": 39.413106, + "longitude": -76.530044, + "city": "Parkville", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21235, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21236, + "latitude": 39.392107, + "longitude": -76.489277, + "city": "Nottingham", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21237, + "latitude": 39.339957, + "longitude": -76.488035, + "city": "Rosedale", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21239, + "latitude": 39.356356, + "longitude": -76.587588, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21240, + "latitude": 39.142793, + "longitude": -76.651589, + "city": "Baltimore", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21241, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21244, + "latitude": 39.333105, + "longitude": -76.784896, + "city": "Windsor Mill", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21250, + "latitude": 39.258226, + "longitude": -76.713149, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21251, + "latitude": 39.438964, + "longitude": -76.592139, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21252, + "latitude": 39.388799, + "longitude": -76.613325, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21263, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21264, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21265, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21268, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21270, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21273, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21274, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21275, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21278, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21279, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21280, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21281, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21282, + "latitude": 39.438964, + "longitude": -76.592139, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21283, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21284, + "latitude": 39.438964, + "longitude": -76.592139, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21285, + "latitude": 39.438964, + "longitude": -76.592139, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21286, + "latitude": 39.414306, + "longitude": -76.576089, + "city": "Towson", + "state": "MD", + "county": "Baltimore" + }, + { + "zip_code": 21287, + "latitude": 39.297457, + "longitude": -76.592738, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21288, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21289, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21290, + "latitude": 39.293256, + "longitude": -76.623839, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21297, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21298, + "latitude": 39.284707, + "longitude": -76.620489, + "city": "Baltimore", + "state": "MD", + "county": "Baltimore City" + }, + { + "zip_code": 21401, + "latitude": 38.967311, + "longitude": -76.610143, + "city": "Annapolis", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21402, + "latitude": 39.04811, + "longitude": -76.452032, + "city": "Annapolis", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21403, + "latitude": 39.007361, + "longitude": -76.584637, + "city": "Annapolis", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21404, + "latitude": 38.974203, + "longitude": -76.594942, + "city": "Annapolis", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21405, + "latitude": 38.992124, + "longitude": -76.506883, + "city": "Annapolis", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21411, + "latitude": 38.974203, + "longitude": -76.594942, + "city": "Annapolis", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21412, + "latitude": 38.974203, + "longitude": -76.594942, + "city": "Annapolis", + "state": "MD", + "county": "Anne Arundel" + }, + { + "zip_code": 21501, + "latitude": 39.580691, + "longitude": -78.690593, + "city": "Cumberland", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21502, + "latitude": 39.59915, + "longitude": -78.844425, + "city": "Cumberland", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21503, + "latitude": 39.580691, + "longitude": -78.690593, + "city": "Cumberland", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21504, + "latitude": 39.580691, + "longitude": -78.690593, + "city": "Cumberland", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21505, + "latitude": 39.594043, + "longitude": -78.843432, + "city": "Cumberland", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21520, + "latitude": 39.58935, + "longitude": -79.230969, + "city": "Accident", + "state": "MD", + "county": "Garrett" + }, + { + "zip_code": 21521, + "latitude": 39.536798, + "longitude": -79.009008, + "city": "Barton", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21522, + "latitude": 39.601664, + "longitude": -79.233691, + "city": "Bittinger", + "state": "MD", + "county": "Garrett" + }, + { + "zip_code": 21523, + "latitude": 39.486109, + "longitude": -79.08297, + "city": "Bloomington", + "state": "MD", + "county": "Garrett" + }, + { + "zip_code": 21524, + "latitude": 39.69668, + "longitude": -78.803067, + "city": "Corriganville", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21528, + "latitude": 39.652837, + "longitude": -78.901395, + "city": "Eckhart Mines", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21529, + "latitude": 39.708261, + "longitude": -78.777446, + "city": "Ellerslie", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21530, + "latitude": 39.679418, + "longitude": -78.524164, + "city": "Flintstone", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21531, + "latitude": 39.637098, + "longitude": -79.257117, + "city": "Friendsville", + "state": "MD", + "county": "Garrett" + }, + { + "zip_code": 21532, + "latitude": 39.64206, + "longitude": -78.912502, + "city": "Frostburg", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21536, + "latitude": 39.655141, + "longitude": -79.124143, + "city": "Grantsville", + "state": "MD", + "county": "Garrett" + }, + { + "zip_code": 21538, + "latitude": 39.416917, + "longitude": -79.222202, + "city": "Kitzmiller", + "state": "MD", + "county": "Garrett" + }, + { + "zip_code": 21539, + "latitude": 39.571706, + "longitude": -78.934521, + "city": "Lonaconing", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21540, + "latitude": 39.475381, + "longitude": -79.058451, + "city": "Luke", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21541, + "latitude": 39.565589, + "longitude": -79.382332, + "city": "Mc Henry", + "state": "MD", + "county": "Garrett" + }, + { + "zip_code": 21542, + "latitude": 39.595113, + "longitude": -78.943082, + "city": "Midland", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21543, + "latitude": 39.633866, + "longitude": -78.960403, + "city": "Midlothian", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21545, + "latitude": 39.695649, + "longitude": -78.872465, + "city": "Mount Savage", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21550, + "latitude": 39.43392, + "longitude": -79.316683, + "city": "Oakland", + "state": "MD", + "county": "Garrett" + }, + { + "zip_code": 21555, + "latitude": 39.596645, + "longitude": -78.572564, + "city": "Oldtown", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21556, + "latitude": 39.572452, + "longitude": -78.843962, + "city": "Pinto", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21557, + "latitude": 39.50582, + "longitude": -78.921162, + "city": "Rawlings", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21560, + "latitude": 39.601008, + "longitude": -78.687137, + "city": "Spring Gap", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21561, + "latitude": 39.538568, + "longitude": -79.190791, + "city": "Swanton", + "state": "MD", + "county": "Garrett" + }, + { + "zip_code": 21562, + "latitude": 39.490547, + "longitude": -79.013989, + "city": "Westernport", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21601, + "latitude": 38.800714, + "longitude": -76.051486, + "city": "Easton", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21606, + "latitude": 38.758525, + "longitude": -76.180166, + "city": "Easton", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21607, + "latitude": 39.073391, + "longitude": -76.060665, + "city": "Barclay", + "state": "MD", + "county": "Queen Annes" + }, + { + "zip_code": 21609, + "latitude": 38.740562, + "longitude": -75.958683, + "city": "Bethlehem", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21610, + "latitude": 39.366812, + "longitude": -76.067079, + "city": "Betterton", + "state": "MD", + "county": "Kent" + }, + { + "zip_code": 21612, + "latitude": 38.74955, + "longitude": -76.273704, + "city": "Bozman", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21613, + "latitude": 38.479813, + "longitude": -76.079864, + "city": "Cambridge", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21617, + "latitude": 39.084003, + "longitude": -76.091375, + "city": "Centreville", + "state": "MD", + "county": "Queen Annes" + }, + { + "zip_code": 21619, + "latitude": 38.946034, + "longitude": -76.279172, + "city": "Chester", + "state": "MD", + "county": "Queen Annes" + }, + { + "zip_code": 21620, + "latitude": 39.235988, + "longitude": -76.059316, + "city": "Chestertown", + "state": "MD", + "county": "Kent" + }, + { + "zip_code": 21622, + "latitude": 38.415211, + "longitude": -76.191021, + "city": "Church Creek", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21623, + "latitude": 39.1305, + "longitude": -75.961404, + "city": "Church Hill", + "state": "MD", + "county": "Queen Annes" + }, + { + "zip_code": 21624, + "latitude": 38.836766, + "longitude": -76.27137, + "city": "Claiborne", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21625, + "latitude": 38.869275, + "longitude": -76.000119, + "city": "Cordova", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21626, + "latitude": 38.323604, + "longitude": -76.097337, + "city": "Crapo", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21627, + "latitude": 38.242608, + "longitude": -76.053064, + "city": "Crocheron", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21628, + "latitude": 39.231771, + "longitude": -75.929797, + "city": "Crumpton", + "state": "MD", + "county": "Queen Annes" + }, + { + "zip_code": 21629, + "latitude": 38.859523, + "longitude": -75.835702, + "city": "Denton", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21631, + "latitude": 38.579447, + "longitude": -75.939691, + "city": "East New Market", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21632, + "latitude": 38.823318, + "longitude": -75.825197, + "city": "Federalsburg", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21634, + "latitude": 38.29868, + "longitude": -76.203532, + "city": "Fishing Creek", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21635, + "latitude": 39.320381, + "longitude": -75.836031, + "city": "Galena", + "state": "MD", + "county": "Kent" + }, + { + "zip_code": 21636, + "latitude": 39.022245, + "longitude": -75.809462, + "city": "Goldsboro", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21638, + "latitude": 39.019049, + "longitude": -76.115897, + "city": "Grasonville", + "state": "MD", + "county": "Queen Annes" + }, + { + "zip_code": 21639, + "latitude": 38.968592, + "longitude": -75.790732, + "city": "Greensboro", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21640, + "latitude": 39.081351, + "longitude": -75.811781, + "city": "Henderson", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21641, + "latitude": 38.920588, + "longitude": -75.93877, + "city": "Hillsboro", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21643, + "latitude": 38.643824, + "longitude": -75.863003, + "city": "Hurlock", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21644, + "latitude": 39.118226, + "longitude": -75.876881, + "city": "Ingleside", + "state": "MD", + "county": "Queen Annes" + }, + { + "zip_code": 21645, + "latitude": 39.313679, + "longitude": -75.96152, + "city": "Kennedyville", + "state": "MD", + "county": "Kent" + }, + { + "zip_code": 21647, + "latitude": 38.808497, + "longitude": -76.287709, + "city": "Mcdaniel", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21648, + "latitude": 38.478205, + "longitude": -76.241202, + "city": "Madison", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21649, + "latitude": 39.106088, + "longitude": -75.79087, + "city": "Marydel", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21650, + "latitude": 39.308228, + "longitude": -75.812769, + "city": "Massey", + "state": "MD", + "county": "Kent" + }, + { + "zip_code": 21651, + "latitude": 39.274314, + "longitude": -75.895115, + "city": "Millington", + "state": "MD", + "county": "Kent" + }, + { + "zip_code": 21652, + "latitude": 38.795102, + "longitude": -76.152762, + "city": "Neavitt", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21653, + "latitude": 38.751834, + "longitude": -76.178041, + "city": "Newcomb", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21654, + "latitude": 38.710783, + "longitude": -76.125184, + "city": "Oxford", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21655, + "latitude": 38.752146, + "longitude": -75.90765, + "city": "Preston", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21656, + "latitude": 39.034637, + "longitude": -76.092127, + "city": "Price", + "state": "MD", + "county": "Queen Annes" + }, + { + "zip_code": 21657, + "latitude": 38.975882, + "longitude": -75.975322, + "city": "Queen Anne", + "state": "MD", + "county": "Queen Annes" + }, + { + "zip_code": 21658, + "latitude": 39.00255, + "longitude": -76.142374, + "city": "Queenstown", + "state": "MD", + "county": "Queen Annes" + }, + { + "zip_code": 21659, + "latitude": 38.561727, + "longitude": -75.80465, + "city": "Rhodesdale", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21660, + "latitude": 38.874255, + "longitude": -75.866707, + "city": "Ridgely", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21661, + "latitude": 39.117823, + "longitude": -76.223193, + "city": "Rock Hall", + "state": "MD", + "county": "Kent" + }, + { + "zip_code": 21662, + "latitude": 38.713532, + "longitude": -76.196838, + "city": "Royal Oak", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21663, + "latitude": 38.748765, + "longitude": -76.167765, + "city": "Saint Michaels", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21664, + "latitude": 38.600971, + "longitude": -75.947375, + "city": "Secretary", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21665, + "latitude": 38.745387, + "longitude": -76.326606, + "city": "Sherwood", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21666, + "latitude": 39.012075, + "longitude": -76.11568, + "city": "Stevensville", + "state": "MD", + "county": "Queen Annes" + }, + { + "zip_code": 21667, + "latitude": 39.339906, + "longitude": -76.047396, + "city": "Still Pond", + "state": "MD", + "county": "Kent" + }, + { + "zip_code": 21668, + "latitude": 39.119123, + "longitude": -76.031257, + "city": "Sudlersville", + "state": "MD", + "county": "Queen Annes" + }, + { + "zip_code": 21669, + "latitude": 38.453204, + "longitude": -76.2641, + "city": "Taylors Island", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21670, + "latitude": 38.88927, + "longitude": -75.861191, + "city": "Templeville", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21671, + "latitude": 38.704729, + "longitude": -76.332647, + "city": "Tilghman", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21672, + "latitude": 38.274149, + "longitude": -76.072171, + "city": "Toddville", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21673, + "latitude": 38.664452, + "longitude": -76.058006, + "city": "Trappe", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21675, + "latitude": 38.307394, + "longitude": -76.106344, + "city": "Wingate", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21676, + "latitude": 38.784568, + "longitude": -76.300134, + "city": "Wittman", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21677, + "latitude": 38.49965, + "longitude": -76.202456, + "city": "Woolford", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21678, + "latitude": 39.308842, + "longitude": -76.08165, + "city": "Worton", + "state": "MD", + "county": "Kent" + }, + { + "zip_code": 21679, + "latitude": 38.91506, + "longitude": -76.073905, + "city": "Wye Mills", + "state": "MD", + "county": "Talbot" + }, + { + "zip_code": 21681, + "latitude": 38.88927, + "longitude": -75.861191, + "city": "Ridgely", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21682, + "latitude": 38.88927, + "longitude": -75.861191, + "city": "Ridgely", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21683, + "latitude": 38.88927, + "longitude": -75.861191, + "city": "Ridgely", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21684, + "latitude": 38.88927, + "longitude": -75.861191, + "city": "Ridgely", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21685, + "latitude": 38.88927, + "longitude": -75.861191, + "city": "Ridgely", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21686, + "latitude": 38.88927, + "longitude": -75.861191, + "city": "Ridgely", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21687, + "latitude": 38.88927, + "longitude": -75.861191, + "city": "Ridgely", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21688, + "latitude": 38.88927, + "longitude": -75.861191, + "city": "Ridgely", + "state": "MD", + "county": "Caroline" + }, + { + "zip_code": 21690, + "latitude": 39.034637, + "longitude": -76.092127, + "city": "Chestertown", + "state": "MD", + "county": "Queen Annes" + }, + { + "zip_code": 21701, + "latitude": 39.512748, + "longitude": -77.369299, + "city": "Frederick", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21702, + "latitude": 39.492596, + "longitude": -77.461211, + "city": "Frederick", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21703, + "latitude": 39.364713, + "longitude": -77.463561, + "city": "Frederick", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21704, + "latitude": 39.345477, + "longitude": -77.383229, + "city": "Frederick", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21705, + "latitude": 39.469961, + "longitude": -77.392139, + "city": "Frederick", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21709, + "latitude": 39.469961, + "longitude": -77.392139, + "city": "Frederick", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21710, + "latitude": 39.291049, + "longitude": -77.455243, + "city": "Adamstown", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21711, + "latitude": 39.666266, + "longitude": -77.954912, + "city": "Big Pool", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21713, + "latitude": 39.551986, + "longitude": -77.695721, + "city": "Boonsboro", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21714, + "latitude": 39.4203, + "longitude": -77.505098, + "city": "Braddock Heights", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21715, + "latitude": 39.386893, + "longitude": -77.658015, + "city": "Brownsville", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21716, + "latitude": 39.317945, + "longitude": -77.624701, + "city": "Brunswick", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21717, + "latitude": 39.330887, + "longitude": -77.427405, + "city": "Buckeystown", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21718, + "latitude": 39.400868, + "longitude": -77.627954, + "city": "Burkittsville", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21719, + "latitude": 39.695751, + "longitude": -77.495542, + "city": "Cascade", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21720, + "latitude": 39.647296, + "longitude": -77.584162, + "city": "Cavetown", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21721, + "latitude": 39.642537, + "longitude": -77.637152, + "city": "Chewsville", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21722, + "latitude": 39.665751, + "longitude": -77.906389, + "city": "Clear Spring", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21723, + "latitude": 39.328104, + "longitude": -77.0142, + "city": "Cooksville", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21727, + "latitude": 39.675397, + "longitude": -77.336732, + "city": "Emmitsburg", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21733, + "latitude": 39.559419, + "longitude": -77.76039, + "city": "Fairplay", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21734, + "latitude": 39.60596, + "longitude": -77.707207, + "city": "Funkstown", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21736, + "latitude": 39.520696, + "longitude": -77.916196, + "city": "Gapland", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21737, + "latitude": 39.259656, + "longitude": -77.012699, + "city": "Glenelg", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21738, + "latitude": 39.281504, + "longitude": -77.025362, + "city": "Glenwood", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21740, + "latitude": 39.58887, + "longitude": -77.700213, + "city": "Hagerstown", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21741, + "latitude": 39.693944, + "longitude": -77.742116, + "city": "Hagerstown", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21742, + "latitude": 39.642995, + "longitude": -77.652779, + "city": "Hagerstown", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21746, + "latitude": 39.563787, + "longitude": -77.720642, + "city": "Hagerstown", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21747, + "latitude": 39.520696, + "longitude": -77.916196, + "city": "Hagerstown", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21748, + "latitude": 39.520696, + "longitude": -77.916196, + "city": "Hagerstown", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21749, + "latitude": 39.520696, + "longitude": -77.916196, + "city": "Hagerstown", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21750, + "latitude": 39.58895, + "longitude": -78.050204, + "city": "Hancock", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21754, + "latitude": 39.339477, + "longitude": -77.310622, + "city": "Ijamsville", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21755, + "latitude": 39.353688, + "longitude": -77.567142, + "city": "Jefferson", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21756, + "latitude": 39.458488, + "longitude": -77.693341, + "city": "Keedysville", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21757, + "latitude": 39.619399, + "longitude": -77.252657, + "city": "Keymar", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21758, + "latitude": 39.34924, + "longitude": -77.620514, + "city": "Knoxville", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21759, + "latitude": 39.569426, + "longitude": -77.290519, + "city": "Ladiesburg", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21762, + "latitude": 39.482208, + "longitude": -77.246761, + "city": "Libertytown", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21764, + "latitude": 39.534703, + "longitude": -77.049302, + "city": "Linwood", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21765, + "latitude": 39.337804, + "longitude": -77.071952, + "city": "Lisbon", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21766, + "latitude": 39.641946, + "longitude": -78.408891, + "city": "Little Orleans", + "state": "MD", + "county": "Allegany" + }, + { + "zip_code": 21767, + "latitude": 39.696761, + "longitude": -77.746766, + "city": "Maugansville", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21769, + "latitude": 39.53503, + "longitude": -77.485034, + "city": "Middletown", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21770, + "latitude": 39.351552, + "longitude": -77.265818, + "city": "Monrovia", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21771, + "latitude": 39.407252, + "longitude": -77.214087, + "city": "Mount Airy", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21773, + "latitude": 39.550036, + "longitude": -77.556275, + "city": "Myersville", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21774, + "latitude": 39.432571, + "longitude": -77.220932, + "city": "New Market", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21775, + "latitude": 39.564472, + "longitude": -77.29468, + "city": "New Midway", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21776, + "latitude": 39.521886, + "longitude": -77.093303, + "city": "New Windsor", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21777, + "latitude": 39.27777, + "longitude": -77.532068, + "city": "Point Of Rocks", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21778, + "latitude": 39.618999, + "longitude": -77.335442, + "city": "Rocky Ridge", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21779, + "latitude": 39.430227, + "longitude": -77.66013, + "city": "Rohrersville", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21780, + "latitude": 39.667035, + "longitude": -77.481888, + "city": "Sabillasville", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21781, + "latitude": 39.56991, + "longitude": -77.760697, + "city": "Saint James", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21782, + "latitude": 39.438718, + "longitude": -77.771667, + "city": "Sharpsburg", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21783, + "latitude": 39.591355, + "longitude": -77.614762, + "city": "Smithsburg", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21784, + "latitude": 39.45672, + "longitude": -76.969601, + "city": "Sykesville", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21787, + "latitude": 39.657449, + "longitude": -77.169055, + "city": "Taneytown", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21788, + "latitude": 39.610876, + "longitude": -77.398931, + "city": "Thurmont", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21790, + "latitude": 39.265086, + "longitude": -77.496646, + "city": "Tuscarora", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21791, + "latitude": 39.57985, + "longitude": -77.131896, + "city": "Union Bridge", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21792, + "latitude": 39.469961, + "longitude": -77.392139, + "city": "Unionville", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21793, + "latitude": 39.491247, + "longitude": -77.343542, + "city": "Walkersville", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21794, + "latitude": 39.296204, + "longitude": -76.98115, + "city": "West Friendship", + "state": "MD", + "county": "Howard" + }, + { + "zip_code": 21795, + "latitude": 39.589123, + "longitude": -77.826258, + "city": "Williamsport", + "state": "MD", + "county": "Washington" + }, + { + "zip_code": 21797, + "latitude": 39.402352, + "longitude": -77.081821, + "city": "Woodbine", + "state": "MD", + "county": "Carroll" + }, + { + "zip_code": 21798, + "latitude": 39.542724, + "longitude": -77.292314, + "city": "Woodsboro", + "state": "MD", + "county": "Frederick" + }, + { + "zip_code": 21801, + "latitude": 38.382445, + "longitude": -75.633621, + "city": "Salisbury", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21802, + "latitude": 38.388434, + "longitude": -75.6276, + "city": "Salisbury", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21803, + "latitude": 38.388434, + "longitude": -75.6276, + "city": "Salisbury", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21804, + "latitude": 38.350793, + "longitude": -75.533782, + "city": "Salisbury", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21810, + "latitude": 38.388434, + "longitude": -75.6276, + "city": "Allen", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21811, + "latitude": 38.310447, + "longitude": -75.320901, + "city": "Berlin", + "state": "MD", + "county": "Worcester" + }, + { + "zip_code": 21813, + "latitude": 38.421121, + "longitude": -75.19596, + "city": "Bishopville", + "state": "MD", + "county": "Worcester" + }, + { + "zip_code": 21814, + "latitude": 38.388434, + "longitude": -75.6276, + "city": "Bivalve", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21817, + "latitude": 37.998308, + "longitude": -75.818797, + "city": "Crisfield", + "state": "MD", + "county": "Somerset" + }, + { + "zip_code": 21821, + "latitude": 38.166101, + "longitude": -75.92329, + "city": "Deal Island", + "state": "MD", + "county": "Somerset" + }, + { + "zip_code": 21822, + "latitude": 38.216972, + "longitude": -75.55053, + "city": "Eden", + "state": "MD", + "county": "Worcester" + }, + { + "zip_code": 21824, + "latitude": 37.983912, + "longitude": -76.035623, + "city": "Ewell", + "state": "MD", + "county": "Somerset" + }, + { + "zip_code": 21826, + "latitude": 38.320318, + "longitude": -75.620806, + "city": "Fruitland", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21829, + "latitude": 38.102963, + "longitude": -75.381853, + "city": "Girdletree", + "state": "MD", + "county": "Worcester" + }, + { + "zip_code": 21830, + "latitude": 38.409235, + "longitude": -75.724848, + "city": "Hebron", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21835, + "latitude": 38.532301, + "longitude": -75.949958, + "city": "Linkwood", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21836, + "latitude": 38.073294, + "longitude": -75.734412, + "city": "Manokin", + "state": "MD", + "county": "Somerset" + }, + { + "zip_code": 21837, + "latitude": 38.458249, + "longitude": -75.754804, + "city": "Mardela Springs", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21838, + "latitude": 38.018983, + "longitude": -75.728768, + "city": "Marion Station", + "state": "MD", + "county": "Somerset" + }, + { + "zip_code": 21840, + "latitude": 38.388434, + "longitude": -75.6276, + "city": "Nanticoke", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21841, + "latitude": 38.246348, + "longitude": -75.301838, + "city": "Newark", + "state": "MD", + "county": "Worcester" + }, + { + "zip_code": 21842, + "latitude": 38.381107, + "longitude": -75.113816, + "city": "Ocean City", + "state": "MD", + "county": "Worcester" + }, + { + "zip_code": 21843, + "latitude": 38.22309, + "longitude": -75.324057, + "city": "Ocean City", + "state": "MD", + "county": "Worcester" + }, + { + "zip_code": 21849, + "latitude": 38.376894, + "longitude": -75.462009, + "city": "Parsonsburg", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21850, + "latitude": 38.394572, + "longitude": -75.410499, + "city": "Pittsville", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21851, + "latitude": 38.089201, + "longitude": -75.537185, + "city": "Pocomoke City", + "state": "MD", + "county": "Worcester" + }, + { + "zip_code": 21852, + "latitude": 38.388434, + "longitude": -75.6276, + "city": "Powellville", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21853, + "latitude": 38.200553, + "longitude": -75.75292, + "city": "Princess Anne", + "state": "MD", + "county": "Somerset" + }, + { + "zip_code": 21856, + "latitude": 38.305282, + "longitude": -75.763118, + "city": "Quantico", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21857, + "latitude": 38.092718, + "longitude": -75.888207, + "city": "Rehobeth", + "state": "MD", + "county": "Somerset" + }, + { + "zip_code": 21861, + "latitude": 38.538904, + "longitude": -75.719182, + "city": "Sharptown", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21862, + "latitude": 38.400306, + "longitude": -75.216551, + "city": "Showell", + "state": "MD", + "county": "Worcester" + }, + { + "zip_code": 21863, + "latitude": 38.217824, + "longitude": -75.326618, + "city": "Snow Hill", + "state": "MD", + "county": "Worcester" + }, + { + "zip_code": 21864, + "latitude": 38.042932, + "longitude": -75.411789, + "city": "Stockton", + "state": "MD", + "county": "Worcester" + }, + { + "zip_code": 21865, + "latitude": 38.268914, + "longitude": -75.790882, + "city": "Tyaskin", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21866, + "latitude": 37.966573, + "longitude": -76.023482, + "city": "Tylerton", + "state": "MD", + "county": "Somerset" + }, + { + "zip_code": 21867, + "latitude": 38.10049, + "longitude": -75.822318, + "city": "Upper Fairmount", + "state": "MD", + "county": "Somerset" + }, + { + "zip_code": 21869, + "latitude": 38.430928, + "longitude": -75.897058, + "city": "Vienna", + "state": "MD", + "county": "Dorchester" + }, + { + "zip_code": 21870, + "latitude": 38.092718, + "longitude": -75.888207, + "city": "Wenona", + "state": "MD", + "county": "Somerset" + }, + { + "zip_code": 21871, + "latitude": 38.094181, + "longitude": -75.717406, + "city": "Westover", + "state": "MD", + "county": "Somerset" + }, + { + "zip_code": 21872, + "latitude": 38.412085, + "longitude": -75.281074, + "city": "Whaleyville", + "state": "MD", + "county": "Worcester" + }, + { + "zip_code": 21874, + "latitude": 38.40406, + "longitude": -75.351349, + "city": "Willards", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21875, + "latitude": 38.452527, + "longitude": -75.574165, + "city": "Delmar", + "state": "MD", + "county": "Wicomico" + }, + { + "zip_code": 21890, + "latitude": 38.092718, + "longitude": -75.888207, + "city": "Westover", + "state": "MD", + "county": "Somerset" + }, + { + "zip_code": 21901, + "latitude": 39.535078, + "longitude": -75.894051, + "city": "North East", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21902, + "latitude": 39.552962, + "longitude": -76.072471, + "city": "Perry Point", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21903, + "latitude": 39.571449, + "longitude": -76.033281, + "city": "Perryville", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21904, + "latitude": 39.615086, + "longitude": -76.063342, + "city": "Port Deposit", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21911, + "latitude": 39.671572, + "longitude": -76.056651, + "city": "Rising Sun", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21912, + "latitude": 39.533058, + "longitude": -75.915203, + "city": "Warwick", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21913, + "latitude": 39.410355, + "longitude": -75.863287, + "city": "Cecilton", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21914, + "latitude": 39.574387, + "longitude": -75.978564, + "city": "Charlestown", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21915, + "latitude": 39.469098, + "longitude": -75.849327, + "city": "Chesapeake City", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21916, + "latitude": 39.541512, + "longitude": -75.999972, + "city": "Childs", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21917, + "latitude": 39.537261, + "longitude": -76.003452, + "city": "Colora", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21918, + "latitude": 39.543894, + "longitude": -76.049157, + "city": "Conowingo", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21919, + "latitude": 39.470309, + "longitude": -75.927952, + "city": "Earleville", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21920, + "latitude": 39.658031, + "longitude": -75.828196, + "city": "Elk Mills", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21921, + "latitude": 39.56186, + "longitude": -75.87574, + "city": "Elkton", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21922, + "latitude": 39.593612, + "longitude": -75.947332, + "city": "Elkton", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 21930, + "latitude": 39.366183, + "longitude": -75.884544, + "city": "Georgetown", + "state": "MD", + "county": "Cecil" + }, + { + "zip_code": 22002, + "latitude": 38.691448, + "longitude": -78.137019, + "city": "Amissville", + "state": "VA", + "county": "Rappahannock" + }, + { + "zip_code": 22003, + "latitude": 38.835762, + "longitude": -77.212794, + "city": "Annandale", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22009, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Burke", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22015, + "latitude": 38.785864, + "longitude": -77.286156, + "city": "Burke", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22026, + "latitude": 38.584734, + "longitude": -77.349935, + "city": "Dumfries", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 22027, + "latitude": 38.895078, + "longitude": -77.221453, + "city": "Dunn Loring", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22030, + "latitude": 38.853231, + "longitude": -77.305097, + "city": "Fairfax", + "state": "VA", + "county": "Fairfax City" + }, + { + "zip_code": 22031, + "latitude": 38.853962, + "longitude": -77.284195, + "city": "Fairfax", + "state": "VA", + "county": "Fairfax City" + }, + { + "zip_code": 22032, + "latitude": 38.819712, + "longitude": -77.287105, + "city": "Fairfax", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22033, + "latitude": 38.879466, + "longitude": -77.378858, + "city": "Fairfax", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22034, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Fairfax", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22035, + "latitude": 38.855715, + "longitude": -77.361633, + "city": "Fairfax", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22036, + "latitude": 38.735114, + "longitude": -77.07965, + "city": "Fairfax", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22037, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Fairfax", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22038, + "latitude": 38.852849, + "longitude": -77.30199, + "city": "Fairfax", + "state": "VA", + "county": "Fairfax City" + }, + { + "zip_code": 22039, + "latitude": 38.759329, + "longitude": -77.311588, + "city": "Fairfax Station", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22040, + "latitude": 38.884177, + "longitude": -77.171752, + "city": "Falls Church", + "state": "VA", + "county": "Falls Church City" + }, + { + "zip_code": 22041, + "latitude": 38.850212, + "longitude": -77.144801, + "city": "Falls Church", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22042, + "latitude": 38.863452, + "longitude": -77.193915, + "city": "Falls Church", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22043, + "latitude": 38.899361, + "longitude": -77.189502, + "city": "Falls Church", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22044, + "latitude": 38.858853, + "longitude": -77.154761, + "city": "Falls Church", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22046, + "latitude": 38.884936, + "longitude": -77.174052, + "city": "Falls Church", + "state": "VA", + "county": "Falls Church City" + }, + { + "zip_code": 22047, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Falls Church", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22060, + "latitude": 38.714562, + "longitude": -77.167886, + "city": "Fort Belvoir", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22066, + "latitude": 39.001609, + "longitude": -77.306416, + "city": "Great Falls", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22067, + "latitude": 38.96451, + "longitude": -77.233103, + "city": "Greenway", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22079, + "latitude": 38.692865, + "longitude": -77.204031, + "city": "Lorton", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22081, + "latitude": 38.873861, + "longitude": -77.234454, + "city": "Merrifield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22082, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Merrifield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22092, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Herndon", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22093, + "latitude": 39.085309, + "longitude": -77.645224, + "city": "Ashburn", + "state": "VA", + "county": "Loudoun" + }, + { + "zip_code": 22095, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Herndon", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22096, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Reston", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22101, + "latitude": 38.935202, + "longitude": -77.18672, + "city": "Mc Lean", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22102, + "latitude": 38.953033, + "longitude": -77.229496, + "city": "Mc Lean", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22103, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "West Mclean", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22106, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Mc Lean", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22107, + "latitude": "", + "longitude": "", + "city": "Mc Lean", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22108, + "latitude": "", + "longitude": "", + "city": "Mc Lean", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22109, + "latitude": 38.920165, + "longitude": -77.229043, + "city": "Mc Lean", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22116, + "latitude": 38.871469, + "longitude": -77.234428, + "city": "Merrifield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22118, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Merrifield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22119, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Merrifield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22120, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Merrifield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22121, + "latitude": 38.830912, + "longitude": -77.432252, + "city": "Mount Vernon", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22122, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Newington", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22124, + "latitude": 38.892796, + "longitude": -77.329906, + "city": "Oakton", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22125, + "latitude": 38.681615, + "longitude": -77.26052, + "city": "Occoquan", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 22134, + "latitude": 38.52602, + "longitude": -77.322803, + "city": "Quantico", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 22135, + "latitude": 38.721912, + "longitude": -77.466897, + "city": "Quantico", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 22150, + "latitude": 38.763463, + "longitude": -77.186063, + "city": "Springfield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22151, + "latitude": 38.802858, + "longitude": -77.211556, + "city": "Springfield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22152, + "latitude": 38.775687, + "longitude": -77.233746, + "city": "Springfield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22153, + "latitude": 38.757015, + "longitude": -77.181612, + "city": "Springfield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22156, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Springfield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22158, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Springfield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22159, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Springfield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22160, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Springfield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22161, + "latitude": 38.807462, + "longitude": -77.219354, + "city": "Springfield", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22172, + "latitude": 38.581369, + "longitude": -77.367205, + "city": "Triangle", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 22180, + "latitude": 38.897361, + "longitude": -77.253749, + "city": "Vienna", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22181, + "latitude": 38.90521, + "longitude": -77.295256, + "city": "Vienna", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22182, + "latitude": 38.935292, + "longitude": -77.268022, + "city": "Vienna", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22183, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Vienna", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22184, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Vienna", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22185, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Vienna", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22191, + "latitude": 38.625541, + "longitude": -77.271644, + "city": "Woodbridge", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 22192, + "latitude": 38.675952, + "longitude": -77.316344, + "city": "Woodbridge", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 22193, + "latitude": 38.643765, + "longitude": -77.345106, + "city": "Woodbridge", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 22194, + "latitude": 38.721912, + "longitude": -77.466897, + "city": "Woodbridge", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 22195, + "latitude": 38.721912, + "longitude": -77.466897, + "city": "Woodbridge", + "state": "VA", + "county": "Prince William" + }, + { + "zip_code": 22199, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Lorton", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22201, + "latitude": 38.885484, + "longitude": -77.099113, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22202, + "latitude": 38.854462, + "longitude": -77.059721, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22203, + "latitude": 38.874775, + "longitude": -77.119515, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22204, + "latitude": 38.860335, + "longitude": -77.100868, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22205, + "latitude": 38.875811, + "longitude": -77.140021, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22206, + "latitude": 38.840403, + "longitude": -77.0888, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22207, + "latitude": 38.907416, + "longitude": -77.122344, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22209, + "latitude": 38.893596, + "longitude": -77.110376, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22210, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22211, + "latitude": 38.878674, + "longitude": -77.077426, + "city": "Ft Myer", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22212, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22213, + "latitude": 38.894898, + "longitude": -77.162829, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22214, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22215, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22216, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22217, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22218, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22219, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22222, + "latitude": 38.861462, + "longitude": -77.053599, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22223, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22225, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22226, + "latitude": 38.883358, + "longitude": -77.10281, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22227, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22229, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22230, + "latitude": 38.87972, + "longitude": -77.110817, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22234, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22240, + "latitude": 38.856623, + "longitude": -77.051788, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22241, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22242, + "latitude": 38.850879, + "longitude": -77.052336, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22243, + "latitude": 38.86045, + "longitude": -77.051569, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22244, + "latitude": 38.854522, + "longitude": -77.052035, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22245, + "latitude": 38.851773, + "longitude": -77.052296, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22246, + "latitude": 38.880811, + "longitude": -77.11295, + "city": "Arlington", + "state": "VA", + "county": "Arlington" + }, + { + "zip_code": 22301, + "latitude": 38.823062, + "longitude": -77.079622, + "city": "Alexandria", + "state": "VA", + "county": "Alexandria City" + }, + { + "zip_code": 22302, + "latitude": 38.827627, + "longitude": -77.089566, + "city": "Alexandria", + "state": "VA", + "county": "Alexandria City" + }, + { + "zip_code": 22303, + "latitude": 38.791231, + "longitude": -77.08135, + "city": "Alexandria", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22304, + "latitude": 38.81522, + "longitude": -77.10993, + "city": "Alexandria", + "state": "VA", + "county": "Alexandria City" + }, + { + "zip_code": 22305, + "latitude": 38.835412, + "longitude": -77.063959, + "city": "Alexandria", + "state": "VA", + "county": "Alexandria City" + }, + { + "zip_code": 22306, + "latitude": 38.758914, + "longitude": -77.087344, + "city": "Alexandria", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22307, + "latitude": 38.771363, + "longitude": -77.065699, + "city": "Alexandria", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22308, + "latitude": 38.731564, + "longitude": -77.060399, + "city": "Alexandria", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22309, + "latitude": 38.722264, + "longitude": -77.171945, + "city": "Alexandria", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22310, + "latitude": 38.779391, + "longitude": -77.119401, + "city": "Alexandria", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22311, + "latitude": 38.832762, + "longitude": -77.119627, + "city": "Alexandria", + "state": "VA", + "county": "Alexandria City" + }, + { + "zip_code": 22312, + "latitude": 38.799956, + "longitude": -77.150177, + "city": "Alexandria", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22313, + "latitude": 38.815762, + "longitude": -77.09005, + "city": "Alexandria", + "state": "VA", + "county": "Alexandria City" + }, + { + "zip_code": 22314, + "latitude": 38.811436, + "longitude": -77.063587, + "city": "Alexandria", + "state": "VA", + "county": "Alexandria City" + }, + { + "zip_code": 22315, + "latitude": 38.759553, + "longitude": -77.148518, + "city": "Alexandria", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22320, + "latitude": 38.804413, + "longitude": -77.046699, + "city": "Alexandria", + "state": "VA", + "county": "Alexandria City" + }, + { + "zip_code": 22321, + "latitude": 38.831813, + "longitude": -77.288755, + "city": "Alexandria", + "state": "VA", + "county": "Fairfax" + }, + { + "zip_code": 22331, + "latitude": 38.801342, + "longitude": -77.070733, + "city": "Alexandria", + "state": "VA", + "county": "Alexandria City" + }, + { + "zip_code": 22332, + "latitude": 38.803142, + "longitude": -77.072679, + "city": "Alexandria", + "state": "VA", + "county": "Alexandria City" + }, + { + "zip_code": 22333, + "latitude": 38.815762, + "longitude": -77.09005, + "city": "Alexandria", + "state": "VA", + "county": "Alexandria City" + }, + { + "zip_code": 22334, + "latitude": 38.815762, + "longitude": -77.09005, + "city": "Alexandria", + "state": "VA", + "county": "Alexandria City" + }, + { + "zip_code": 22336, + "latitude": 38.815762, + "longitude": -77.09005, + "city": "Alexandria", + "state": "VA", + "county": "Alexandria City" + }, + { + "zip_code": 22401, + "latitude": 38.295135, + "longitude": -77.483689, + "city": "Fredericksburg", + "state": "VA", + "county": "Fredericksburg City" + }, + { + "zip_code": 22402, + "latitude": 38.299613, + "longitude": -77.489666, + "city": "Fredericksburg", + "state": "VA", + "county": "Fredericksburg City" + }, + { + "zip_code": 22403, + "latitude": 38.417273, + "longitude": -77.460814, + "city": "Fredericksburg", + "state": "VA", + "county": "Stafford" + }, + { + "zip_code": 22404, + "latitude": 38.298305, + "longitude": -77.489913, + "city": "Fredericksburg", + "state": "VA", + "county": "Fredericksburg City" + }, + { + "zip_code": 22405, + "latitude": 38.336458, + "longitude": -77.436618, + "city": "Fredericksburg", + "state": "VA", + "county": "Stafford" + }, + { + "zip_code": 22406, + "latitude": 38.414357, + "longitude": -77.534708, + "city": "Fredericksburg", + "state": "VA", + "county": "Stafford" + }, + { + "zip_code": 22407, + "latitude": 38.271969, + "longitude": -77.606772, + "city": "Fredericksburg", + "state": "VA", + "county": "Spotsylvania" + }, + { + "zip_code": 22408, + "latitude": 38.233933, + "longitude": -77.562773, + "city": "Fredericksburg", + "state": "VA", + "county": "Spotsylvania" + }, + { + "zip_code": 22412, + "latitude": 38.184716, + "longitude": -77.662559, + "city": "Fredericksburg", + "state": "VA", + "county": "Spotsylvania" + }, + { + "zip_code": 22427, + "latitude": 38.008401, + "longitude": -77.260353, + "city": "Bowling Green", + "state": "VA", + "county": "Caroline" + }, + { + "zip_code": 22428, + "latitude": 38.014536, + "longitude": -77.355902, + "city": "Bowling Green", + "state": "VA", + "county": "Caroline" + }, + { + "zip_code": 22430, + "latitude": 38.385704, + "longitude": -77.374292, + "city": "Brooke", + "state": "VA", + "county": "Stafford" + }, + { + "zip_code": 22432, + "latitude": 37.837435, + "longitude": -76.345493, + "city": "Burgess", + "state": "VA", + "county": "Northumberland" + }, + { + "zip_code": 22433, + "latitude": 38.344608, + "longitude": -77.871855, + "city": "Burr Hill", + "state": "VA", + "county": "Orange" + }, + { + "zip_code": 22435, + "latitude": 37.961716, + "longitude": -76.577422, + "city": "Callao", + "state": "VA", + "county": "Northumberland" + }, + { + "zip_code": 22436, + "latitude": 38.024704, + "longitude": -77.037147, + "city": "Caret", + "state": "VA", + "county": "Essex" + }, + { + "zip_code": 22437, + "latitude": 37.818619, + "longitude": -76.786335, + "city": "Center Cross", + "state": "VA", + "county": "Essex" + }, + { + "zip_code": 22438, + "latitude": 38.056246, + "longitude": -77.018147, + "city": "Champlain", + "state": "VA", + "county": "Essex" + }, + { + "zip_code": 22442, + "latitude": 38.121793, + "longitude": -76.79025, + "city": "Coles Point", + "state": "VA", + "county": "Westmoreland" + }, + { + "zip_code": 22443, + "latitude": 38.184926, + "longitude": -76.823742, + "city": "Colonial Beach", + "state": "VA", + "county": "Westmoreland" + }, + { + "zip_code": 22446, + "latitude": 38.171755, + "longitude": -77.408163, + "city": "Corbin", + "state": "VA", + "county": "Caroline" + }, + { + "zip_code": 22448, + "latitude": 38.326218, + "longitude": -77.039825, + "city": "Dahlgren", + "state": "VA", + "county": "King George" + }, + { + "zip_code": 22451, + "latitude": 38.271077, + "longitude": -77.17261, + "city": "Dogue", + "state": "VA", + "county": "King George" + }, + { + "zip_code": 22454, + "latitude": 37.852669, + "longitude": -76.847543, + "city": "Dunnsville", + "state": "VA", + "county": "Essex" + }, + { + "zip_code": 22456, + "latitude": 37.852316, + "longitude": -76.40511, + "city": "Edwardsville", + "state": "VA", + "county": "Northumberland" + }, + { + "zip_code": 22460, + "latitude": 37.879797, + "longitude": -76.598782, + "city": "Farnham", + "state": "VA", + "county": "Richmond" + }, + { + "zip_code": 22463, + "latitude": 38.468432, + "longitude": -77.461213, + "city": "Garrisonville", + "state": "VA", + "county": "Stafford" + }, + { + "zip_code": 22469, + "latitude": 38.059488, + "longitude": -76.676452, + "city": "Hague", + "state": "VA", + "county": "Westmoreland" + }, + { + "zip_code": 22471, + "latitude": 38.39933, + "longitude": -77.581351, + "city": "Hartwood", + "state": "VA", + "county": "Stafford" + }, + { + "zip_code": 22472, + "latitude": 37.950511, + "longitude": -76.636722, + "city": "Haynesville", + "state": "VA", + "county": "Richmond" + }, + { + "zip_code": 22473, + "latitude": 37.876733, + "longitude": -76.427334, + "city": "Heathsville", + "state": "VA", + "county": "Northumberland" + }, + { + "zip_code": 22476, + "latitude": 38.032905, + "longitude": -77.06328, + "city": "Hustle", + "state": "VA", + "county": "Essex" + }, + { + "zip_code": 22480, + "latitude": 37.667319, + "longitude": -76.404996, + "city": "Irvington", + "state": "VA", + "county": "Lancaster" + }, + { + "zip_code": 22481, + "latitude": 38.271077, + "longitude": -77.17261, + "city": "Jersey", + "state": "VA", + "county": "King George" + }, + { + "zip_code": 22482, + "latitude": 37.715738, + "longitude": -76.450212, + "city": "Kilmarnock", + "state": "VA", + "county": "Lancaster" + }, + { + "zip_code": 22485, + "latitude": 38.277209, + "longitude": -77.17225, + "city": "King George", + "state": "VA", + "county": "King George" + }, + { + "zip_code": 22488, + "latitude": 38.102075, + "longitude": -76.743458, + "city": "Kinsale", + "state": "VA", + "county": "Westmoreland" + }, + { + "zip_code": 22501, + "latitude": 38.015899, + "longitude": -77.559298, + "city": "Ladysmith", + "state": "VA", + "county": "Caroline" + }, + { + "zip_code": 22503, + "latitude": 37.739451, + "longitude": -76.50021, + "city": "Lancaster", + "state": "VA", + "county": "Lancaster" + }, + { + "zip_code": 22504, + "latitude": 37.76914, + "longitude": -76.712135, + "city": "Laneview", + "state": "VA", + "county": "Essex" + }, + { + "zip_code": 22507, + "latitude": 37.757226, + "longitude": -76.511804, + "city": "Lively", + "state": "VA", + "county": "Lancaster" + }, + { + "zip_code": 22508, + "latitude": 38.308398, + "longitude": -77.796156, + "city": "Locust Grove", + "state": "VA", + "county": "Orange" + }, + { + "zip_code": 22509, + "latitude": 38.078932, + "longitude": -77.04851, + "city": "Loretto", + "state": "VA", + "county": "Essex" + }, + { + "zip_code": 22511, + "latitude": 37.985615, + "longitude": -76.499878, + "city": "Lottsburg", + "state": "VA", + "county": "Northumberland" + }, + { + "zip_code": 22513, + "latitude": 37.750261, + "longitude": -76.509615, + "city": "Merry Point", + "state": "VA", + "county": "Lancaster" + }, + { + "zip_code": 22514, + "latitude": 37.980787, + "longitude": -77.242558, + "city": "Milford", + "state": "VA", + "county": "Caroline" + }, + { + "zip_code": 22517, + "latitude": 37.75028, + "longitude": -76.578109, + "city": "Mollusk", + "state": "VA", + "county": "Lancaster" + }, + { + "zip_code": 22520, + "latitude": 38.111955, + "longitude": -76.82434, + "city": "Montross", + "state": "VA", + "county": "Westmoreland" + }, + { + "zip_code": 22523, + "latitude": 37.792761, + "longitude": -76.60933, + "city": "Morattico", + "state": "VA", + "county": "Lancaster" + }, + { + "zip_code": 22524, + "latitude": 38.118186, + "longitude": -76.680504, + "city": "Mount Holly", + "state": "VA", + "county": "Westmoreland" + }, + { + "zip_code": 22526, + "latitude": 38.271077, + "longitude": -77.17261, + "city": "Ninde", + "state": "VA", + "county": "King George" + }, + { + "zip_code": 22528, + "latitude": 37.713175, + "longitude": -76.409946, + "city": "Nuttsville", + "state": "VA", + "county": "Lancaster" + }, + { + "zip_code": 22529, + "latitude": 38.018054, + "longitude": -76.68611, + "city": "Oldhams", + "state": "VA", + "county": "Westmoreland" + }, + { + "zip_code": 22530, + "latitude": 37.90938, + "longitude": -76.293436, + "city": "Ophelia", + "state": "VA", + "county": "Northumberland" + }, + { + "zip_code": 22534, + "latitude": 38.08462, + "longitude": -77.666948, + "city": "Partlow", + "state": "VA", + "county": "Spotsylvania" + }, + { + "zip_code": 22535, + "latitude": 38.157349, + "longitude": -77.180478, + "city": "Port Royal", + "state": "VA", + "county": "Caroline" + }, + { + "zip_code": 22538, + "latitude": 38.207873, + "longitude": -77.2502, + "city": "Rappahannock Academy", + "state": "VA", + "county": "Caroline" + }, + { + "zip_code": 22539, + "latitude": 37.855567, + "longitude": -76.312376, + "city": "Reedville", + "state": "VA", + "county": "Northumberland" + }, + { + "zip_code": 22542, + "latitude": 38.292189, + "longitude": -77.897386, + "city": "Rhoadesville", + "state": "VA", + "county": "Orange" + }, + { + "zip_code": 22544, + "latitude": 38.271077, + "longitude": -77.17261, + "city": "Rollins Fork", + "state": "VA", + "county": "King George" + }, + { + "zip_code": 22545, + "latitude": 38.508611, + "longitude": -77.542957, + "city": "Ruby", + "state": "VA", + "county": "Stafford" + }, + { + "zip_code": 22546, + "latitude": 37.948572, + "longitude": -77.437767, + "city": "Ruther Glen", + "state": "VA", + "county": "Caroline" + }, + { + "zip_code": 22547, + "latitude": 38.271077, + "longitude": -77.17261, + "city": "Sealston", + "state": "VA", + "county": "King George" + }, + { + "zip_code": 22548, + "latitude": 37.837583, + "longitude": -76.694775, + "city": "Sharps", + "state": "VA", + "county": "Richmond" + }, + { + "zip_code": 22552, + "latitude": 38.009438, + "longitude": -77.225139, + "city": "Sparta", + "state": "VA", + "county": "Caroline" + }, + { + "zip_code": 22553, + "latitude": 38.182869, + "longitude": -77.69932, + "city": "Spotsylvania", + "state": "VA", + "county": "Spotsylvania" + }, + { + "zip_code": 22554, + "latitude": 38.438958, + "longitude": -77.4354, + "city": "Stafford", + "state": "VA", + "county": "Stafford" + }, + { + "zip_code": 22555, + "latitude": 38.417273, + "longitude": -77.460814, + "city": "Stafford", + "state": "VA", + "county": "Stafford" + }, + { + "zip_code": 22558, + "latitude": 38.121793, + "longitude": -76.79025, + "city": "Stratford", + "state": "VA", + "county": "Westmoreland" + }, + { + "zip_code": 22560, + "latitude": 37.916613, + "longitude": -76.947547, + "city": "Tappahannock", + "state": "VA", + "county": "Essex" + }, + { + "zip_code": 22565, + "latitude": 38.137216, + "longitude": -77.518865, + "city": "Thornburg", + "state": "VA", + "county": "Spotsylvania" + }, + { + "zip_code": 22567, + "latitude": 38.242901, + "longitude": -77.917753, + "city": "Unionville", + "state": "VA", + "county": "Orange" + }, + { + "zip_code": 22570, + "latitude": 37.947224, + "longitude": -76.615358, + "city": "Village", + "state": "VA", + "county": "Richmond" + }, + { + "zip_code": 22572, + "latitude": 37.96954, + "longitude": -76.766517, + "city": "Warsaw", + "state": "VA", + "county": "Richmond" + }, + { + "zip_code": 22576, + "latitude": 37.688877, + "longitude": -76.431553, + "city": "Weems", + "state": "VA", + "county": "Lancaster" + }, + { + "zip_code": 22577, + "latitude": 38.067325, + "longitude": -76.550274, + "city": "Sandy Point", + "state": "VA", + "county": "Westmoreland" + }, + { + "zip_code": 22578, + "latitude": 37.688601, + "longitude": -76.361585, + "city": "White Stone", + "state": "VA", + "county": "Lancaster" + }, + { + "zip_code": 22579, + "latitude": 37.802527, + "longitude": -76.363603, + "city": "Wicomico Church", + "state": "VA", + "county": "Northumberland" + }, + { + "zip_code": 22580, + "latitude": 38.130103, + "longitude": -77.417234, + "city": "Woodford", + "state": "VA", + "county": "Caroline" + }, + { + "zip_code": 22581, + "latitude": 38.121793, + "longitude": -76.79025, + "city": "Zacata", + "state": "VA", + "county": "Westmoreland" + }, + { + "zip_code": 22601, + "latitude": 39.169668, + "longitude": -78.16856, + "city": "Winchester", + "state": "VA", + "county": "Winchester City" + }, + { + "zip_code": 22602, + "latitude": 39.150074, + "longitude": -78.268988, + "city": "Winchester", + "state": "VA", + "county": "Frederick" + }, + { + "zip_code": 22603, + "latitude": 39.263975, + "longitude": -78.198932, + "city": "Winchester", + "state": "VA", + "county": "Frederick" + }, + { + "zip_code": 22604, + "latitude": 39.167603, + "longitude": -78.168643, + "city": "Winchester", + "state": "VA", + "county": "Winchester City" + }, + { + "zip_code": 22610, + "latitude": 38.818692, + "longitude": -78.275719, + "city": "Bentonville", + "state": "VA", + "county": "Warren" + }, + { + "zip_code": 22611, + "latitude": 39.135711, + "longitude": -77.991926, + "city": "Berryville", + "state": "VA", + "county": "Clarke" + }, + { + "zip_code": 22620, + "latitude": 39.048614, + "longitude": -78.060132, + "city": "Boyce", + "state": "VA", + "county": "Clarke" + }, + { + "zip_code": 22622, + "latitude": 39.2543, + "longitude": -78.066373, + "city": "Brucetown", + "state": "VA", + "county": "Frederick" + }, + { + "zip_code": 22623, + "latitude": 38.853733, + "longitude": -78.141239, + "city": "Chester Gap", + "state": "VA", + "county": "Rappahannock" + }, + { + "zip_code": 22624, + "latitude": 39.271865, + "longitude": -78.099763, + "city": "Clear Brook", + "state": "VA", + "county": "Frederick" + }, + { + "zip_code": 22625, + "latitude": 39.296066, + "longitude": -78.310539, + "city": "Cross Junction", + "state": "VA", + "county": "Frederick" + }, + { + "zip_code": 22626, + "latitude": 38.983383, + "longitude": -78.403766, + "city": "Fishers Hill", + "state": "VA", + "county": "Shenandoah" + }, + { + "zip_code": 22627, + "latitude": 38.787434, + "longitude": -78.083739, + "city": "Flint Hill", + "state": "VA", + "county": "Rappahannock" + }, + { + "zip_code": 22630, + "latitude": 38.928308, + "longitude": -78.174537, + "city": "Front Royal", + "state": "VA", + "county": "Warren" + }, + { + "zip_code": 22637, + "latitude": 39.253982, + "longitude": -78.352754, + "city": "Gore", + "state": "VA", + "county": "Frederick" + }, + { + "zip_code": 22638, + "latitude": 39.236944, + "longitude": -78.288465, + "city": "Winchester", + "state": "VA", + "county": "Frederick" + }, + { + "zip_code": 22639, + "latitude": 38.830067, + "longitude": -78.022322, + "city": "Hume", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 22640, + "latitude": 38.812892, + "longitude": -78.116528, + "city": "Huntly", + "state": "VA", + "county": "Rappahannock" + }, + { + "zip_code": 22641, + "latitude": 39.056218, + "longitude": -78.37477, + "city": "Strasburg", + "state": "VA", + "county": "Shenandoah" + }, + { + "zip_code": 22642, + "latitude": 38.932418, + "longitude": -78.065023, + "city": "Linden", + "state": "VA", + "county": "Warren" + }, + { + "zip_code": 22643, + "latitude": 38.895454, + "longitude": -78.004435, + "city": "Markham", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 22644, + "latitude": 38.963523, + "longitude": -78.548229, + "city": "Maurertown", + "state": "VA", + "county": "Shenandoah" + }, + { + "zip_code": 22645, + "latitude": 39.048863, + "longitude": -78.285171, + "city": "Middletown", + "state": "VA", + "county": "Frederick" + }, + { + "zip_code": 22646, + "latitude": 39.121941, + "longitude": -77.990069, + "city": "Millwood", + "state": "VA", + "county": "Clarke" + }, + { + "zip_code": 22649, + "latitude": 39.004774, + "longitude": -78.247806, + "city": "Middletown", + "state": "VA", + "county": "Warren" + }, + { + "zip_code": 22650, + "latitude": 38.763022, + "longitude": -78.387191, + "city": "Rileyville", + "state": "VA", + "county": "Page" + }, + { + "zip_code": 22652, + "latitude": 38.840715, + "longitude": -78.427584, + "city": "Fort Valley", + "state": "VA", + "county": "Shenandoah" + }, + { + "zip_code": 22654, + "latitude": 39.078491, + "longitude": -78.443076, + "city": "Star Tannery", + "state": "VA", + "county": "Frederick" + }, + { + "zip_code": 22655, + "latitude": 39.163418, + "longitude": -78.246159, + "city": "Stephens City", + "state": "VA", + "county": "Frederick" + }, + { + "zip_code": 22656, + "latitude": 39.213701, + "longitude": -78.090144, + "city": "Stephenson", + "state": "VA", + "county": "Frederick" + }, + { + "zip_code": 22657, + "latitude": 39.020716, + "longitude": -78.41733, + "city": "Strasburg", + "state": "VA", + "county": "Shenandoah" + }, + { + "zip_code": 22660, + "latitude": 38.94761, + "longitude": -78.433111, + "city": "Toms Brook", + "state": "VA", + "county": "Shenandoah" + }, + { + "zip_code": 22663, + "latitude": 39.121941, + "longitude": -77.990069, + "city": "White Post", + "state": "VA", + "county": "Clarke" + }, + { + "zip_code": 22664, + "latitude": 38.918791, + "longitude": -78.512429, + "city": "Woodstock", + "state": "VA", + "county": "Shenandoah" + }, + { + "zip_code": 22701, + "latitude": 38.511694, + "longitude": -77.9928, + "city": "Culpeper", + "state": "VA", + "county": "Culpeper" + }, + { + "zip_code": 22709, + "latitude": 38.428509, + "longitude": -78.267848, + "city": "Aroda", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22711, + "latitude": 38.428509, + "longitude": -78.267848, + "city": "Banco", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22712, + "latitude": 38.545289, + "longitude": -77.756064, + "city": "Bealeton", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 22713, + "latitude": 38.537138, + "longitude": -78.132778, + "city": "Boston", + "state": "VA", + "county": "Culpeper" + }, + { + "zip_code": 22714, + "latitude": 38.511323, + "longitude": -77.901265, + "city": "Brandy Station", + "state": "VA", + "county": "Culpeper" + }, + { + "zip_code": 22715, + "latitude": 38.418207, + "longitude": -78.189878, + "city": "Brightwood", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22716, + "latitude": 38.624123, + "longitude": -78.102389, + "city": "Castleton", + "state": "VA", + "county": "Rappahannock" + }, + { + "zip_code": 22718, + "latitude": 38.457473, + "longitude": -77.804343, + "city": "Elkwood", + "state": "VA", + "county": "Culpeper" + }, + { + "zip_code": 22719, + "latitude": 38.428509, + "longitude": -78.267848, + "city": "Etlan", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22720, + "latitude": 38.472457, + "longitude": -77.642308, + "city": "Goldvein", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 22721, + "latitude": 38.428509, + "longitude": -78.267848, + "city": "Graves Mill", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22722, + "latitude": 38.428509, + "longitude": -78.267848, + "city": "Haywood", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22723, + "latitude": 38.396709, + "longitude": -78.432237, + "city": "Hood", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22724, + "latitude": 38.622436, + "longitude": -77.907403, + "city": "Jeffersonton", + "state": "VA", + "county": "Culpeper" + }, + { + "zip_code": 22725, + "latitude": 38.428509, + "longitude": -78.267848, + "city": "Leon", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22726, + "latitude": 38.404605, + "longitude": -77.770885, + "city": "Lignum", + "state": "VA", + "county": "Culpeper" + }, + { + "zip_code": 22727, + "latitude": 38.369952, + "longitude": -78.297605, + "city": "Madison", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22728, + "latitude": 38.602592, + "longitude": -77.681065, + "city": "Midland", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 22729, + "latitude": 38.368552, + "longitude": -78.011837, + "city": "Mitchells", + "state": "VA", + "county": "Culpeper" + }, + { + "zip_code": 22730, + "latitude": 38.428509, + "longitude": -78.267848, + "city": "Oakpark", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22731, + "latitude": 38.428509, + "longitude": -78.267848, + "city": "Pratts", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22732, + "latitude": 38.428509, + "longitude": -78.267848, + "city": "Radiant", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22733, + "latitude": 38.359195, + "longitude": -78.060292, + "city": "Rapidan", + "state": "VA", + "county": "Culpeper" + }, + { + "zip_code": 22734, + "latitude": 38.530877, + "longitude": -77.803719, + "city": "Remington", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 22735, + "latitude": 38.486703, + "longitude": -78.150059, + "city": "Reva", + "state": "VA", + "county": "Culpeper" + }, + { + "zip_code": 22736, + "latitude": 38.389874, + "longitude": -77.711884, + "city": "Richardsville", + "state": "VA", + "county": "Culpeper" + }, + { + "zip_code": 22737, + "latitude": 38.588388, + "longitude": -78.002489, + "city": "Rixeyville", + "state": "VA", + "county": "Culpeper" + }, + { + "zip_code": 22738, + "latitude": 38.3215, + "longitude": -78.304169, + "city": "Rochelle", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22739, + "latitude": 38.505945, + "longitude": -77.59557, + "city": "Somerville", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 22740, + "latitude": 38.612785, + "longitude": -78.227578, + "city": "Sperryville", + "state": "VA", + "county": "Rappahannock" + }, + { + "zip_code": 22741, + "latitude": 38.434991, + "longitude": -77.860642, + "city": "Stevensburg", + "state": "VA", + "county": "Culpeper" + }, + { + "zip_code": 22742, + "latitude": 38.462651, + "longitude": -77.706223, + "city": "Sumerduck", + "state": "VA", + "county": "Fauquier" + }, + { + "zip_code": 22743, + "latitude": 38.495692, + "longitude": -78.331826, + "city": "Syria", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22746, + "latitude": 38.647841, + "longitude": -78.029974, + "city": "Viewtown", + "state": "VA", + "county": "Rappahannock" + }, + { + "zip_code": 22747, + "latitude": 38.705616, + "longitude": -78.174894, + "city": "Washington", + "state": "VA", + "county": "Rappahannock" + }, + { + "zip_code": 22748, + "latitude": 38.372652, + "longitude": -78.380509, + "city": "Wolftown", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22749, + "latitude": 38.620549, + "longitude": -78.191528, + "city": "Woodville", + "state": "VA", + "county": "Rappahannock" + }, + { + "zip_code": 22801, + "latitude": 38.422777, + "longitude": -78.877137, + "city": "Harrisonburg", + "state": "VA", + "county": "Harrisonburg City" + }, + { + "zip_code": 22802, + "latitude": 38.490526, + "longitude": -78.817876, + "city": "Harrisonburg", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22803, + "latitude": "", + "longitude": "", + "city": "Harrisonburg", + "state": "VA", + "county": "Harrisonburg City" + }, + { + "zip_code": 22807, + "latitude": 38.440898, + "longitude": -78.874173, + "city": "Harrisonburg", + "state": "VA", + "county": "Harrisonburg City" + }, + { + "zip_code": 22810, + "latitude": 38.808869, + "longitude": -78.777598, + "city": "Basye", + "state": "VA", + "county": "Shenandoah" + }, + { + "zip_code": 22811, + "latitude": 38.781688, + "longitude": -78.948643, + "city": "Bergton", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22812, + "latitude": 38.345632, + "longitude": -78.854597, + "city": "Bridgewater", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22815, + "latitude": 38.619698, + "longitude": -78.815219, + "city": "Broadway", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22820, + "latitude": 38.749089, + "longitude": -79.000426, + "city": "Criders", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22821, + "latitude": 38.417919, + "longitude": -79.044186, + "city": "Dayton", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22824, + "latitude": 38.818191, + "longitude": -78.637768, + "city": "Edinburg", + "state": "VA", + "county": "Shenandoah" + }, + { + "zip_code": 22827, + "latitude": 38.4009, + "longitude": -78.729679, + "city": "Elkton", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22830, + "latitude": 38.640083, + "longitude": -78.940553, + "city": "Fulks Run", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22831, + "latitude": 38.534126, + "longitude": -78.999618, + "city": "Hinton", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22832, + "latitude": 38.465855, + "longitude": -78.749875, + "city": "Keezletown", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22833, + "latitude": 38.528361, + "longitude": -78.855172, + "city": "Lacey Spring", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22834, + "latitude": 38.550848, + "longitude": -78.876177, + "city": "Linville", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22835, + "latitude": 38.645981, + "longitude": -78.481288, + "city": "Luray", + "state": "VA", + "county": "Page" + }, + { + "zip_code": 22840, + "latitude": 38.400968, + "longitude": -78.734456, + "city": "Mc Gaheysville", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22841, + "latitude": 38.347167, + "longitude": -78.838654, + "city": "Mount Crawford", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22842, + "latitude": 38.785693, + "longitude": -78.680304, + "city": "Mount Jackson", + "state": "VA", + "county": "Shenandoah" + }, + { + "zip_code": 22843, + "latitude": 38.325455, + "longitude": -79.094228, + "city": "Mount Solon", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 22844, + "latitude": 38.673777, + "longitude": -78.677685, + "city": "New Market", + "state": "VA", + "county": "Shenandoah" + }, + { + "zip_code": 22845, + "latitude": 38.799978, + "longitude": -78.81029, + "city": "Orkney Springs", + "state": "VA", + "county": "Shenandoah" + }, + { + "zip_code": 22846, + "latitude": 38.375012, + "longitude": -78.77954, + "city": "Penn Laird", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22847, + "latitude": 38.761208, + "longitude": -78.712058, + "city": "Quicksburg", + "state": "VA", + "county": "Shenandoah" + }, + { + "zip_code": 22848, + "latitude": 38.384681, + "longitude": -78.891422, + "city": "Pleasant Valley", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22849, + "latitude": 38.525239, + "longitude": -78.607184, + "city": "Shenandoah", + "state": "VA", + "county": "Page" + }, + { + "zip_code": 22850, + "latitude": 38.55743, + "longitude": -78.922657, + "city": "Singers Glen", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22851, + "latitude": 38.559864, + "longitude": -78.512018, + "city": "Stanley", + "state": "VA", + "county": "Page" + }, + { + "zip_code": 22853, + "latitude": 38.63976, + "longitude": -78.781566, + "city": "Timberville", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 22901, + "latitude": 38.093604, + "longitude": -78.561139, + "city": "Charlottesville", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22902, + "latitude": 38.026588, + "longitude": -78.48045, + "city": "Charlottesville", + "state": "VA", + "county": "Charlottesville City" + }, + { + "zip_code": 22903, + "latitude": 38.033938, + "longitude": -78.492384, + "city": "Charlottesville", + "state": "VA", + "county": "Charlottesville City" + }, + { + "zip_code": 22904, + "latitude": 38.040101, + "longitude": -78.485066, + "city": "Charlottesville", + "state": "VA", + "county": "Charlottesville City" + }, + { + "zip_code": 22905, + "latitude": 38.040101, + "longitude": -78.485066, + "city": "Charlottesville", + "state": "VA", + "county": "Charlottesville City" + }, + { + "zip_code": 22906, + "latitude": 38.040101, + "longitude": -78.485066, + "city": "Charlottesville", + "state": "VA", + "county": "Charlottesville City" + }, + { + "zip_code": 22907, + "latitude": 38.040101, + "longitude": -78.485066, + "city": "Charlottesville", + "state": "VA", + "county": "Charlottesville City" + }, + { + "zip_code": 22908, + "latitude": 38.040101, + "longitude": -78.485066, + "city": "Charlottesville", + "state": "VA", + "county": "Charlottesville City" + }, + { + "zip_code": 22909, + "latitude": 38.024474, + "longitude": -78.448214, + "city": "Charlottesville", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22910, + "latitude": 38.040101, + "longitude": -78.485066, + "city": "Charlottesville", + "state": "VA", + "county": "Charlottesville City" + }, + { + "zip_code": 22911, + "latitude": 38.099507, + "longitude": -78.408498, + "city": "Charlottesville", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22920, + "latitude": 37.972758, + "longitude": -78.82231, + "city": "Afton", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 22922, + "latitude": 37.690183, + "longitude": -78.947944, + "city": "Arrington", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 22923, + "latitude": 38.209534, + "longitude": -78.309759, + "city": "Barboursville", + "state": "VA", + "county": "Orange" + }, + { + "zip_code": 22924, + "latitude": 38.001317, + "longitude": -78.727146, + "city": "Batesville", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22931, + "latitude": 37.893092, + "longitude": -78.709897, + "city": "Covesville", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22932, + "latitude": 38.129592, + "longitude": -78.710635, + "city": "Crozet", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22935, + "latitude": 38.270529, + "longitude": -78.557765, + "city": "Dyke", + "state": "VA", + "county": "Greene" + }, + { + "zip_code": 22936, + "latitude": 38.166565, + "longitude": -78.506832, + "city": "Earlysville", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22937, + "latitude": 37.82019, + "longitude": -78.609661, + "city": "Esmont", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22938, + "latitude": 37.859373, + "longitude": -78.816071, + "city": "Faber", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 22939, + "latitude": 38.096364, + "longitude": -78.99295, + "city": "Fishersville", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 22940, + "latitude": 38.194421, + "longitude": -78.584936, + "city": "Free Union", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22942, + "latitude": 38.175906, + "longitude": -78.181467, + "city": "Gordonsville", + "state": "VA", + "county": "Orange" + }, + { + "zip_code": 22943, + "latitude": 38.078772, + "longitude": -78.521957, + "city": "Greenwood", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22945, + "latitude": 38.065383, + "longitude": -78.595831, + "city": "Ivy", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22946, + "latitude": 37.850141, + "longitude": -78.541911, + "city": "Keene", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22947, + "latitude": 38.053137, + "longitude": -78.339571, + "city": "Keswick", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22948, + "latitude": 38.428509, + "longitude": -78.267848, + "city": "Locust Dale", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22949, + "latitude": 37.753, + "longitude": -78.859153, + "city": "Lovingston", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 22952, + "latitude": 37.974432, + "longitude": -78.936098, + "city": "Lyndhurst", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 22953, + "latitude": 38.428509, + "longitude": -78.267848, + "city": "Madison Mills", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 22954, + "latitude": 37.78907, + "longitude": -79.012459, + "city": "Massies Mill", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 22957, + "latitude": 38.22702, + "longitude": -78.176806, + "city": "Montpelier Station", + "state": "VA", + "county": "Orange" + }, + { + "zip_code": 22958, + "latitude": 37.818439, + "longitude": -78.893139, + "city": "Nellysford", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 22959, + "latitude": 37.933631, + "longitude": -78.63511, + "city": "North Garden", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22960, + "latitude": 38.219183, + "longitude": -78.046093, + "city": "Orange", + "state": "VA", + "county": "Orange" + }, + { + "zip_code": 22963, + "latitude": 37.893119, + "longitude": -78.338579, + "city": "Palmyra", + "state": "VA", + "county": "Fluvanna" + }, + { + "zip_code": 22964, + "latitude": 37.803604, + "longitude": -78.959134, + "city": "Piney River", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 22965, + "latitude": 38.330132, + "longitude": -78.475018, + "city": "Quinque", + "state": "VA", + "county": "Greene" + }, + { + "zip_code": 22967, + "latitude": 37.824173, + "longitude": -78.962522, + "city": "Roseland", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 22968, + "latitude": 38.258615, + "longitude": -78.407377, + "city": "Ruckersville", + "state": "VA", + "county": "Greene" + }, + { + "zip_code": 22969, + "latitude": 37.818031, + "longitude": -78.819906, + "city": "Schuyler", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 22971, + "latitude": 37.759956, + "longitude": -78.810459, + "city": "Shipman", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 22972, + "latitude": 38.199692, + "longitude": -78.239378, + "city": "Somerset", + "state": "VA", + "county": "Orange" + }, + { + "zip_code": 22973, + "latitude": 38.312057, + "longitude": -78.482014, + "city": "Stanardsville", + "state": "VA", + "county": "Greene" + }, + { + "zip_code": 22974, + "latitude": 37.95591, + "longitude": -78.276599, + "city": "Troy", + "state": "VA", + "county": "Fluvanna" + }, + { + "zip_code": 22976, + "latitude": 37.839132, + "longitude": -79.069321, + "city": "Tyro", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 22980, + "latitude": 38.065794, + "longitude": -78.903445, + "city": "Waynesboro", + "state": "VA", + "county": "Waynesboro City" + }, + { + "zip_code": 22987, + "latitude": 38.179859, + "longitude": -78.618912, + "city": "White Hall", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 22989, + "latitude": 38.428509, + "longitude": -78.267848, + "city": "Woodberry Forest", + "state": "VA", + "county": "Madison" + }, + { + "zip_code": 23001, + "latitude": 37.28822, + "longitude": -76.426013, + "city": "Achilles", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23002, + "latitude": 37.342768, + "longitude": -77.984092, + "city": "Amelia Court House", + "state": "VA", + "county": "Amelia" + }, + { + "zip_code": 23003, + "latitude": 37.432335, + "longitude": -76.601616, + "city": "Ark", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23004, + "latitude": 37.563225, + "longitude": -78.53643, + "city": "Arvonia", + "state": "VA", + "county": "Buckingham" + }, + { + "zip_code": 23005, + "latitude": 37.754912, + "longitude": -77.480128, + "city": "Ashland", + "state": "VA", + "county": "Hanover" + }, + { + "zip_code": 23009, + "latitude": 37.798833, + "longitude": -77.180912, + "city": "Aylett", + "state": "VA", + "county": "King William" + }, + { + "zip_code": 23011, + "latitude": 37.479524, + "longitude": -76.949981, + "city": "Barhamsville", + "state": "VA", + "county": "New Kent" + }, + { + "zip_code": 23014, + "latitude": 37.733844, + "longitude": -77.888082, + "city": "Beaumont", + "state": "VA", + "county": "Goochland" + }, + { + "zip_code": 23015, + "latitude": 37.914736, + "longitude": -77.62341, + "city": "Beaverdam", + "state": "VA", + "county": "Hanover" + }, + { + "zip_code": 23017, + "latitude": 37.418242, + "longitude": -76.508402, + "city": "Bellamy", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23018, + "latitude": 37.418242, + "longitude": -76.508402, + "city": "Bena", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23021, + "latitude": 37.410286, + "longitude": -76.294103, + "city": "Bohannon", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23022, + "latitude": 37.848408, + "longitude": -78.277393, + "city": "Bremo Bluff", + "state": "VA", + "county": "Fluvanna" + }, + { + "zip_code": 23023, + "latitude": 37.701823, + "longitude": -76.916248, + "city": "Bruington", + "state": "VA", + "county": "King And Queen" + }, + { + "zip_code": 23024, + "latitude": 37.90754, + "longitude": -77.798047, + "city": "Bumpass", + "state": "VA", + "county": "Louisa" + }, + { + "zip_code": 23025, + "latitude": 37.410286, + "longitude": -76.294103, + "city": "Cardinal", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23027, + "latitude": 37.64794, + "longitude": -78.138859, + "city": "Cartersville", + "state": "VA", + "county": "Cumberland" + }, + { + "zip_code": 23030, + "latitude": 37.354115, + "longitude": -77.073103, + "city": "Charles City", + "state": "VA", + "county": "Charles City" + }, + { + "zip_code": 23031, + "latitude": 37.598391, + "longitude": -76.447551, + "city": "Christchurch", + "state": "VA", + "county": "Middlesex" + }, + { + "zip_code": 23032, + "latitude": 37.644319, + "longitude": -76.446001, + "city": "Church View", + "state": "VA", + "county": "Middlesex" + }, + { + "zip_code": 23035, + "latitude": 37.410286, + "longitude": -76.294103, + "city": "Cobbs Creek", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23038, + "latitude": 37.807863, + "longitude": -78.093506, + "city": "Columbia", + "state": "VA", + "county": "Goochland" + }, + { + "zip_code": 23039, + "latitude": 37.657031, + "longitude": -77.794731, + "city": "Crozier", + "state": "VA", + "county": "Goochland" + }, + { + "zip_code": 23040, + "latitude": 37.518167, + "longitude": -78.214232, + "city": "Cumberland", + "state": "VA", + "county": "Cumberland" + }, + { + "zip_code": 23043, + "latitude": 37.551856, + "longitude": -76.366544, + "city": "Deltaville", + "state": "VA", + "county": "Middlesex" + }, + { + "zip_code": 23045, + "latitude": 37.410286, + "longitude": -76.294103, + "city": "Diggs", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23047, + "latitude": 37.846874, + "longitude": -77.513156, + "city": "Doswell", + "state": "VA", + "county": "Hanover" + }, + { + "zip_code": 23050, + "latitude": 37.500094, + "longitude": -76.454046, + "city": "Dutton", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23054, + "latitude": 37.733844, + "longitude": -77.888082, + "city": "Fife", + "state": "VA", + "county": "Goochland" + }, + { + "zip_code": 23055, + "latitude": 37.848408, + "longitude": -78.277393, + "city": "Fork Union", + "state": "VA", + "county": "Fluvanna" + }, + { + "zip_code": 23056, + "latitude": 37.410286, + "longitude": -76.294103, + "city": "Foster", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23058, + "latitude": 37.531296, + "longitude": -77.416103, + "city": "Glen Allen", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23059, + "latitude": 37.728404, + "longitude": -77.554393, + "city": "Glen Allen", + "state": "VA", + "county": "Hanover" + }, + { + "zip_code": 23060, + "latitude": 37.595064, + "longitude": -77.508719, + "city": "Glen Allen", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23061, + "latitude": 37.41259, + "longitude": -76.546416, + "city": "Gloucester", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23062, + "latitude": 37.277726, + "longitude": -76.49988, + "city": "Gloucester Point", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23063, + "latitude": 37.725416, + "longitude": -77.995, + "city": "Goochland", + "state": "VA", + "county": "Goochland" + }, + { + "zip_code": 23064, + "latitude": 37.410286, + "longitude": -76.294103, + "city": "Grimstead", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23065, + "latitude": 37.798243, + "longitude": -77.937457, + "city": "Gum Spring", + "state": "VA", + "county": "Goochland" + }, + { + "zip_code": 23066, + "latitude": 37.410286, + "longitude": -76.294103, + "city": "Gwynn", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23067, + "latitude": 37.825208, + "longitude": -77.989878, + "city": "Hadensville", + "state": "VA", + "county": "Goochland" + }, + { + "zip_code": 23068, + "latitude": 37.410286, + "longitude": -76.294103, + "city": "Hallieford", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23069, + "latitude": 37.735448, + "longitude": -77.337944, + "city": "Hanover", + "state": "VA", + "county": "Hanover" + }, + { + "zip_code": 23070, + "latitude": 37.55118, + "longitude": -76.384428, + "city": "Hardyville", + "state": "VA", + "county": "Middlesex" + }, + { + "zip_code": 23071, + "latitude": 37.541289, + "longitude": -76.4152, + "city": "Hartfield", + "state": "VA", + "county": "Middlesex" + }, + { + "zip_code": 23072, + "latitude": 37.391501, + "longitude": -76.514807, + "city": "Hayes", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23075, + "latitude": 37.545511, + "longitude": -77.317838, + "city": "Highland Springs", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23076, + "latitude": 37.410286, + "longitude": -76.294103, + "city": "Hudgins", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23079, + "latitude": 37.644319, + "longitude": -76.446001, + "city": "Jamaica", + "state": "VA", + "county": "Middlesex" + }, + { + "zip_code": 23081, + "latitude": 37.223482, + "longitude": -76.783317, + "city": "Jamestown", + "state": "VA", + "county": "James City" + }, + { + "zip_code": 23083, + "latitude": 37.322156, + "longitude": -78.121631, + "city": "Jetersville", + "state": "VA", + "county": "Amelia" + }, + { + "zip_code": 23084, + "latitude": 37.848408, + "longitude": -78.277393, + "city": "Kents Store", + "state": "VA", + "county": "Fluvanna" + }, + { + "zip_code": 23085, + "latitude": 37.701823, + "longitude": -76.916248, + "city": "King And Queen Court Hous", + "state": "VA", + "county": "King And Queen" + }, + { + "zip_code": 23086, + "latitude": 37.677991, + "longitude": -77.028495, + "city": "King William", + "state": "VA", + "county": "King William" + }, + { + "zip_code": 23089, + "latitude": 37.465312, + "longitude": -76.909711, + "city": "Lanexa", + "state": "VA", + "county": "New Kent" + }, + { + "zip_code": 23090, + "latitude": 37.235892, + "longitude": -76.445567, + "city": "Lightfoot", + "state": "VA", + "county": "York" + }, + { + "zip_code": 23091, + "latitude": 37.617747, + "longitude": -76.771273, + "city": "Little Plymouth", + "state": "VA", + "county": "King And Queen" + }, + { + "zip_code": 23092, + "latitude": 37.582554, + "longitude": -76.498426, + "city": "Locust Hill", + "state": "VA", + "county": "Middlesex" + }, + { + "zip_code": 23093, + "latitude": 37.998422, + "longitude": -77.967416, + "city": "Louisa", + "state": "VA", + "county": "Louisa" + }, + { + "zip_code": 23101, + "latitude": 37.553314, + "longitude": -77.892964, + "city": "Macon", + "state": "VA", + "county": "Powhatan" + }, + { + "zip_code": 23102, + "latitude": 37.694226, + "longitude": -77.796603, + "city": "Maidens", + "state": "VA", + "county": "Goochland" + }, + { + "zip_code": 23103, + "latitude": 37.663224, + "longitude": -77.791971, + "city": "Manakin Sabot", + "state": "VA", + "county": "Goochland" + }, + { + "zip_code": 23105, + "latitude": 37.345032, + "longitude": -77.944868, + "city": "Mannboro", + "state": "VA", + "county": "Amelia" + }, + { + "zip_code": 23106, + "latitude": 37.733093, + "longitude": -77.206868, + "city": "Manquin", + "state": "VA", + "county": "King William" + }, + { + "zip_code": 23107, + "latitude": 37.28641, + "longitude": -76.404783, + "city": "Maryus", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23108, + "latitude": 37.701823, + "longitude": -76.916248, + "city": "Mascot", + "state": "VA", + "county": "King And Queen" + }, + { + "zip_code": 23109, + "latitude": 37.410286, + "longitude": -76.294103, + "city": "Mathews", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23110, + "latitude": 37.613475, + "longitude": -76.810087, + "city": "Mattaponi", + "state": "VA", + "county": "King And Queen" + }, + { + "zip_code": 23111, + "latitude": 37.628179, + "longitude": -77.281955, + "city": "Mechanicsville", + "state": "VA", + "county": "Hanover" + }, + { + "zip_code": 23112, + "latitude": 37.454138, + "longitude": -77.66258, + "city": "Midlothian", + "state": "VA", + "county": "Chesterfield" + }, + { + "zip_code": 23113, + "latitude": 37.494897, + "longitude": -77.663061, + "city": "Midlothian", + "state": "VA", + "county": "Chesterfield" + }, + { + "zip_code": 23114, + "latitude": "", + "longitude": "", + "city": "Midlothian", + "state": "VA", + "county": "Chesterfield" + }, + { + "zip_code": 23115, + "latitude": 37.836374, + "longitude": -76.913844, + "city": "Millers Tavern", + "state": "VA", + "county": "Essex" + }, + { + "zip_code": 23116, + "latitude": 37.669086, + "longitude": -77.329421, + "city": "Mechanicsville", + "state": "VA", + "county": "Hanover" + }, + { + "zip_code": 23117, + "latitude": 37.937619, + "longitude": -77.868959, + "city": "Mineral", + "state": "VA", + "county": "Louisa" + }, + { + "zip_code": 23119, + "latitude": 37.410286, + "longitude": -76.294103, + "city": "Moon", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23120, + "latitude": 37.416066, + "longitude": -77.779015, + "city": "Moseley", + "state": "VA", + "county": "Chesterfield" + }, + { + "zip_code": 23123, + "latitude": 37.563225, + "longitude": -78.53643, + "city": "New Canton", + "state": "VA", + "county": "Buckingham" + }, + { + "zip_code": 23124, + "latitude": 37.535579, + "longitude": -77.005863, + "city": "New Kent", + "state": "VA", + "county": "New Kent" + }, + { + "zip_code": 23125, + "latitude": 37.343785, + "longitude": -76.287792, + "city": "New Point", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23126, + "latitude": 37.701823, + "longitude": -76.916248, + "city": "Newtown", + "state": "VA", + "county": "King And Queen" + }, + { + "zip_code": 23127, + "latitude": 37.310451, + "longitude": -76.746769, + "city": "Norge", + "state": "VA", + "county": "James City" + }, + { + "zip_code": 23128, + "latitude": 37.410286, + "longitude": -76.294103, + "city": "North", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23129, + "latitude": 37.701136, + "longitude": -77.790584, + "city": "Oilville", + "state": "VA", + "county": "Goochland" + }, + { + "zip_code": 23130, + "latitude": 37.410286, + "longitude": -76.294103, + "city": "Onemo", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23131, + "latitude": 37.312159, + "longitude": -76.518831, + "city": "Ordinary", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23138, + "latitude": 37.355641, + "longitude": -76.292253, + "city": "Port Haywood", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23139, + "latitude": 37.541609, + "longitude": -77.928759, + "city": "Powhatan", + "state": "VA", + "county": "Powhatan" + }, + { + "zip_code": 23140, + "latitude": 37.453467, + "longitude": -77.033714, + "city": "Providence Forge", + "state": "VA", + "county": "New Kent" + }, + { + "zip_code": 23141, + "latitude": 37.518432, + "longitude": -77.134289, + "city": "Quinton", + "state": "VA", + "county": "New Kent" + }, + { + "zip_code": 23146, + "latitude": 37.739029, + "longitude": -77.708072, + "city": "Rockville", + "state": "VA", + "county": "Hanover" + }, + { + "zip_code": 23147, + "latitude": 37.37956, + "longitude": -77.034752, + "city": "Ruthville", + "state": "VA", + "county": "Charles City" + }, + { + "zip_code": 23148, + "latitude": 37.753427, + "longitude": -77.047727, + "city": "Saint Stephens Church", + "state": "VA", + "county": "King And Queen" + }, + { + "zip_code": 23149, + "latitude": 37.644319, + "longitude": -76.446001, + "city": "Saluda", + "state": "VA", + "county": "Middlesex" + }, + { + "zip_code": 23150, + "latitude": 37.501495, + "longitude": -77.271789, + "city": "Sandston", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23153, + "latitude": 37.779913, + "longitude": -77.940549, + "city": "Sandy Hook", + "state": "VA", + "county": "Goochland" + }, + { + "zip_code": 23154, + "latitude": 37.418242, + "longitude": -76.508402, + "city": "Schley", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23155, + "latitude": 37.418242, + "longitude": -76.508402, + "city": "Severn", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23156, + "latitude": 37.544151, + "longitude": -76.684306, + "city": "Shacklefords", + "state": "VA", + "county": "King And Queen" + }, + { + "zip_code": 23160, + "latitude": 37.733844, + "longitude": -77.888082, + "city": "State Farm", + "state": "VA", + "county": "Goochland" + }, + { + "zip_code": 23161, + "latitude": 37.701823, + "longitude": -76.916248, + "city": "Stevensville", + "state": "VA", + "county": "King And Queen" + }, + { + "zip_code": 23162, + "latitude": 37.772187, + "longitude": -77.45264, + "city": "Studley", + "state": "VA", + "county": "Hanover" + }, + { + "zip_code": 23163, + "latitude": 37.350792, + "longitude": -76.316136, + "city": "Susan", + "state": "VA", + "county": "Mathews" + }, + { + "zip_code": 23168, + "latitude": 37.394138, + "longitude": -76.835415, + "city": "Toano", + "state": "VA", + "county": "James City" + }, + { + "zip_code": 23169, + "latitude": 37.644319, + "longitude": -76.446001, + "city": "Topping", + "state": "VA", + "county": "Middlesex" + }, + { + "zip_code": 23170, + "latitude": 37.940788, + "longitude": -77.996956, + "city": "Trevilians", + "state": "VA", + "county": "Louisa" + }, + { + "zip_code": 23173, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "University Of Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23175, + "latitude": 37.635564, + "longitude": -76.591805, + "city": "Urbanna", + "state": "VA", + "county": "Middlesex" + }, + { + "zip_code": 23176, + "latitude": 37.644319, + "longitude": -76.446001, + "city": "Wake", + "state": "VA", + "county": "Middlesex" + }, + { + "zip_code": 23177, + "latitude": 37.701823, + "longitude": -76.916248, + "city": "Walkerton", + "state": "VA", + "county": "King And Queen" + }, + { + "zip_code": 23178, + "latitude": 37.400387, + "longitude": -76.452896, + "city": "Ware Neck", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23180, + "latitude": 37.725161, + "longitude": -76.613446, + "city": "Water View", + "state": "VA", + "county": "Middlesex" + }, + { + "zip_code": 23181, + "latitude": 37.607215, + "longitude": -76.891642, + "city": "West Point", + "state": "VA", + "county": "King William" + }, + { + "zip_code": 23183, + "latitude": 37.363201, + "longitude": -76.532492, + "city": "White Marsh", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23184, + "latitude": 37.322121, + "longitude": -76.53185, + "city": "Wicomico", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23185, + "latitude": 37.273209, + "longitude": -76.732423, + "city": "Williamsburg", + "state": "VA", + "county": "James City" + }, + { + "zip_code": 23186, + "latitude": 37.310451, + "longitude": -76.746769, + "city": "Williamsburg", + "state": "VA", + "county": "Williamsburg City" + }, + { + "zip_code": 23187, + "latitude": 37.310451, + "longitude": -76.746769, + "city": "Williamsburg", + "state": "VA", + "county": "Williamsburg City" + }, + { + "zip_code": 23188, + "latitude": 37.34822, + "longitude": -76.773832, + "city": "Williamsburg", + "state": "VA", + "county": "James City" + }, + { + "zip_code": 23190, + "latitude": 37.482039, + "longitude": -76.636154, + "city": "Woods Cross Roads", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23191, + "latitude": 37.418242, + "longitude": -76.508402, + "city": "Zanoni", + "state": "VA", + "county": "Gloucester" + }, + { + "zip_code": 23192, + "latitude": 37.820707, + "longitude": -77.651831, + "city": "Montpelier", + "state": "VA", + "county": "Hanover" + }, + { + "zip_code": 23218, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23219, + "latitude": 37.541696, + "longitude": -77.439204, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23220, + "latitude": 37.552746, + "longitude": -77.456602, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23221, + "latitude": 37.553196, + "longitude": -77.489706, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23222, + "latitude": 37.568861, + "longitude": -77.428004, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23223, + "latitude": 37.533246, + "longitude": -77.431054, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23224, + "latitude": 37.497796, + "longitude": -77.46726, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23225, + "latitude": 37.519396, + "longitude": -77.500757, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23226, + "latitude": 37.587223, + "longitude": -77.518407, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23227, + "latitude": 37.6247, + "longitude": -77.435149, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23228, + "latitude": 37.624988, + "longitude": -77.49592, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23229, + "latitude": 37.595695, + "longitude": -77.570359, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23230, + "latitude": 37.592095, + "longitude": -77.495206, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23231, + "latitude": 37.457072, + "longitude": -77.307326, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23232, + "latitude": 37.520187, + "longitude": -77.408359, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23233, + "latitude": 37.615276, + "longitude": -77.576641, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23234, + "latitude": 37.43732, + "longitude": -77.478825, + "city": "Richmond", + "state": "VA", + "county": "Chesterfield" + }, + { + "zip_code": 23235, + "latitude": 37.494147, + "longitude": -77.556501, + "city": "Richmond", + "state": "VA", + "county": "Chesterfield" + }, + { + "zip_code": 23236, + "latitude": 37.466359, + "longitude": -77.590818, + "city": "Richmond", + "state": "VA", + "county": "Chesterfield" + }, + { + "zip_code": 23237, + "latitude": 37.400822, + "longitude": -77.471206, + "city": "Richmond", + "state": "VA", + "county": "Chesterfield" + }, + { + "zip_code": 23238, + "latitude": 37.733844, + "longitude": -77.888082, + "city": "Richmond", + "state": "VA", + "county": "Goochland" + }, + { + "zip_code": 23240, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23241, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23242, + "latitude": 37.531296, + "longitude": -77.416103, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23249, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23250, + "latitude": 37.507498, + "longitude": -77.332916, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23255, + "latitude": 37.531296, + "longitude": -77.416103, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23260, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23261, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23266, + "latitude": 37.567896, + "longitude": -77.528308, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23269, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23270, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23272, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23273, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23274, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23275, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23276, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23278, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23279, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23280, + "latitude": 37.637622, + "longitude": -77.46836, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23282, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23284, + "latitude": 37.549446, + "longitude": -77.451155, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23285, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23286, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23288, + "latitude": 37.531296, + "longitude": -77.416103, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23289, + "latitude": 37.531296, + "longitude": -77.416103, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23290, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23291, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23292, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23293, + "latitude": 37.524246, + "longitude": -77.493157, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23294, + "latitude": 37.628657, + "longitude": -77.542871, + "city": "Richmond", + "state": "VA", + "county": "Henrico" + }, + { + "zip_code": 23295, + "latitude": "", + "longitude": "", + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23297, + "latitude": 37.389721, + "longitude": -77.561266, + "city": "Richmond", + "state": "VA", + "county": "Chesterfield" + }, + { + "zip_code": 23298, + "latitude": 37.540646, + "longitude": -77.431555, + "city": "Richmond", + "state": "VA", + "county": "Richmond City" + }, + { + "zip_code": 23301, + "latitude": 37.712919, + "longitude": -75.661132, + "city": "Accomac", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23302, + "latitude": 37.865814, + "longitude": -75.527697, + "city": "Assawoman", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23303, + "latitude": 37.896797, + "longitude": -75.520581, + "city": "Atlantic", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23304, + "latitude": 36.989766, + "longitude": -76.572291, + "city": "Battery Park", + "state": "VA", + "county": "Isle Of Wight" + }, + { + "zip_code": 23306, + "latitude": 37.567852, + "longitude": -75.858617, + "city": "Belle Haven", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23307, + "latitude": 37.432247, + "longitude": -75.880425, + "city": "Birdsnest", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23308, + "latitude": 37.823569, + "longitude": -75.615138, + "city": "Bloxom", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23310, + "latitude": 37.259125, + "longitude": -75.961975, + "city": "Cape Charles", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23313, + "latitude": 37.201937, + "longitude": -75.952409, + "city": "Capeville", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23314, + "latitude": 36.956505, + "longitude": -76.542783, + "city": "Carrollton", + "state": "VA", + "county": "Isle Of Wight" + }, + { + "zip_code": 23315, + "latitude": 36.73282, + "longitude": -76.830545, + "city": "Carrsville", + "state": "VA", + "county": "Isle Of Wight" + }, + { + "zip_code": 23316, + "latitude": 37.294283, + "longitude": -75.961858, + "city": "Cheriton", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23320, + "latitude": 36.749991, + "longitude": -76.218759, + "city": "Chesapeake", + "state": "VA", + "county": "Chesapeake City" + }, + { + "zip_code": 23321, + "latitude": 36.781942, + "longitude": -76.325762, + "city": "Chesapeake", + "state": "VA", + "county": "Chesapeake City" + }, + { + "zip_code": 23322, + "latitude": 36.6434, + "longitude": -76.24201, + "city": "Chesapeake", + "state": "VA", + "county": "Chesapeake City" + }, + { + "zip_code": 23323, + "latitude": 36.710949, + "longitude": -76.339913, + "city": "Chesapeake", + "state": "VA", + "county": "Chesapeake City" + }, + { + "zip_code": 23324, + "latitude": 36.802097, + "longitude": -76.273934, + "city": "Chesapeake", + "state": "VA", + "county": "Chesapeake City" + }, + { + "zip_code": 23325, + "latitude": 36.79202, + "longitude": -76.23856, + "city": "Chesapeake", + "state": "VA", + "county": "Chesapeake City" + }, + { + "zip_code": 23326, + "latitude": 36.777015, + "longitude": -76.239417, + "city": "Chesapeake", + "state": "VA", + "county": "Chesapeake City" + }, + { + "zip_code": 23327, + "latitude": 36.7085, + "longitude": -76.278531, + "city": "Chesapeake", + "state": "VA", + "county": "Chesapeake City" + }, + { + "zip_code": 23328, + "latitude": 36.7085, + "longitude": -76.278531, + "city": "Chesapeake", + "state": "VA", + "county": "Chesapeake City" + }, + { + "zip_code": 23336, + "latitude": 37.948723, + "longitude": -75.436285, + "city": "Chincoteague Island", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23337, + "latitude": 37.918556, + "longitude": -75.490518, + "city": "Wallops Island", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23341, + "latitude": 37.577292, + "longitude": -75.864607, + "city": "Craddockville", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23345, + "latitude": 37.738248, + "longitude": -75.701449, + "city": "Davis Wharf", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23347, + "latitude": 37.356057, + "longitude": -75.964939, + "city": "Eastville", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23350, + "latitude": 37.376126, + "longitude": -75.882344, + "city": "Exmore", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23354, + "latitude": 37.458837, + "longitude": -75.900724, + "city": "Franktown", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23356, + "latitude": 37.999789, + "longitude": -75.413184, + "city": "Greenbackville", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23357, + "latitude": 37.750487, + "longitude": -75.66704, + "city": "Greenbush", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23358, + "latitude": 37.639252, + "longitude": -75.865009, + "city": "Hacksneck", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23359, + "latitude": 37.883709, + "longitude": -75.604063, + "city": "Hallwood", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23389, + "latitude": 37.656158, + "longitude": -75.848807, + "city": "Harborton", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23395, + "latitude": 37.975567, + "longitude": -75.479748, + "city": "Horntown", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23396, + "latitude": 37.923682, + "longitude": -75.555142, + "city": "Oak Hall", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23397, + "latitude": 36.898915, + "longitude": -76.687745, + "city": "Isle Of Wight", + "state": "VA", + "county": "Isle Of Wight" + }, + { + "zip_code": 23398, + "latitude": 37.534336, + "longitude": -75.877052, + "city": "Jamesville", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23399, + "latitude": 37.916218, + "longitude": -75.616754, + "city": "Jenkins Bridge", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23401, + "latitude": 37.596576, + "longitude": -75.789256, + "city": "Keller", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23404, + "latitude": 37.677193, + "longitude": -75.672604, + "city": "Locustville", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23405, + "latitude": 37.413281, + "longitude": -75.92133, + "city": "Machipongo", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23407, + "latitude": 37.838898, + "longitude": -75.563439, + "city": "Mappsville", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23408, + "latitude": 37.424497, + "longitude": -75.877143, + "city": "Marionville", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23409, + "latitude": 37.844421, + "longitude": -75.611577, + "city": "Mears", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23410, + "latitude": 37.603823, + "longitude": -75.75782, + "city": "Melfa", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23412, + "latitude": 37.790415, + "longitude": -75.60347, + "city": "Modest Town", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23413, + "latitude": 37.469454, + "longitude": -75.879019, + "city": "Nassawadox", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23414, + "latitude": 37.816896, + "longitude": -75.583227, + "city": "Nelsonia", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23415, + "latitude": 37.92807, + "longitude": -75.526526, + "city": "New Church", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23416, + "latitude": 37.922866, + "longitude": -75.538591, + "city": "Oak Hall", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23417, + "latitude": 37.693197, + "longitude": -75.746, + "city": "Onancock", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23418, + "latitude": 37.796421, + "longitude": -75.650275, + "city": "Onley", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23419, + "latitude": 37.307411, + "longitude": -75.926877, + "city": "Oyster", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23420, + "latitude": 37.59081, + "longitude": -75.832274, + "city": "Painter", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23421, + "latitude": 37.840771, + "longitude": -75.633717, + "city": "Parksley", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23422, + "latitude": 37.616183, + "longitude": -75.791519, + "city": "Pungoteague", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23423, + "latitude": 37.542324, + "longitude": -75.74122, + "city": "Quinby", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23424, + "latitude": 36.996881, + "longitude": -76.564516, + "city": "Rescue", + "state": "VA", + "county": "Isle Of Wight" + }, + { + "zip_code": 23426, + "latitude": 37.922894, + "longitude": -75.678111, + "city": "Sanford", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23427, + "latitude": 37.926441, + "longitude": -75.721978, + "city": "Saxis", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23429, + "latitude": 37.271104, + "longitude": -75.953608, + "city": "Seaview", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23430, + "latitude": 36.990826, + "longitude": -76.661123, + "city": "Smithfield", + "state": "VA", + "county": "Isle Of Wight" + }, + { + "zip_code": 23431, + "latitude": 36.898915, + "longitude": -76.687745, + "city": "Smithfield", + "state": "VA", + "county": "Isle Of Wight" + }, + { + "zip_code": 23432, + "latitude": 36.874916, + "longitude": -76.553061, + "city": "Suffolk", + "state": "VA", + "county": "Suffolk City" + }, + { + "zip_code": 23433, + "latitude": 36.9061, + "longitude": -76.493175, + "city": "Suffolk", + "state": "VA", + "county": "Suffolk City" + }, + { + "zip_code": 23434, + "latitude": 36.704592, + "longitude": -76.636158, + "city": "Suffolk", + "state": "VA", + "county": "Suffolk City" + }, + { + "zip_code": 23435, + "latitude": 36.837412, + "longitude": -76.477756, + "city": "Suffolk", + "state": "VA", + "county": "Suffolk City" + }, + { + "zip_code": 23436, + "latitude": 36.886856, + "longitude": -76.523388, + "city": "Suffolk", + "state": "VA", + "county": "Suffolk City" + }, + { + "zip_code": 23437, + "latitude": 36.646717, + "longitude": -76.796225, + "city": "Suffolk", + "state": "VA", + "county": "Suffolk City" + }, + { + "zip_code": 23438, + "latitude": 36.598524, + "longitude": -76.710143, + "city": "Suffolk", + "state": "VA", + "county": "Suffolk City" + }, + { + "zip_code": 23439, + "latitude": 36.746101, + "longitude": -76.665251, + "city": "Suffolk", + "state": "VA", + "county": "Suffolk City" + }, + { + "zip_code": 23440, + "latitude": 37.823118, + "longitude": -75.994287, + "city": "Tangier", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23441, + "latitude": 37.732288, + "longitude": -75.677292, + "city": "Tasley", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23442, + "latitude": 37.899545, + "longitude": -75.580102, + "city": "Temperanceville", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23443, + "latitude": 37.188217, + "longitude": -75.969003, + "city": "Townsend", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23450, + "latitude": 36.844004, + "longitude": -76.12036, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23451, + "latitude": 36.856348, + "longitude": -76.053568, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23452, + "latitude": 36.846147, + "longitude": -76.097355, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23454, + "latitude": 36.828586, + "longitude": -76.070772, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23455, + "latitude": 36.888865, + "longitude": -76.146757, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23456, + "latitude": 36.746599, + "longitude": -76.039092, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23457, + "latitude": 36.622351, + "longitude": -76.02485, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23458, + "latitude": 36.847388, + "longitude": -76.15581, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23459, + "latitude": 36.924496, + "longitude": -76.018703, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23460, + "latitude": 36.837598, + "longitude": -76.026053, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23461, + "latitude": 36.790249, + "longitude": -76.002552, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23462, + "latitude": 36.837052, + "longitude": -76.146692, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23463, + "latitude": 36.795669, + "longitude": -76.012628, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23464, + "latitude": 36.799473, + "longitude": -76.178375, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23465, + "latitude": 36.851243, + "longitude": -76.169215, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23466, + "latitude": 36.795669, + "longitude": -76.012628, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23467, + "latitude": 36.795669, + "longitude": -76.012628, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23468, + "latitude": 36.843948, + "longitude": -76.142407, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23471, + "latitude": 36.795669, + "longitude": -76.012628, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23479, + "latitude": 36.795669, + "longitude": -76.012628, + "city": "Virginia Beach", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23480, + "latitude": 37.604378, + "longitude": -75.692465, + "city": "Wachapreague", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23482, + "latitude": 37.273986, + "longitude": -75.86913, + "city": "Wardtown", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23483, + "latitude": 37.943726, + "longitude": -75.502306, + "city": "Wattsville", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23486, + "latitude": 37.518917, + "longitude": -75.810482, + "city": "Willis Wharf", + "state": "VA", + "county": "Northampton" + }, + { + "zip_code": 23487, + "latitude": 36.845054, + "longitude": -76.713731, + "city": "Windsor", + "state": "VA", + "county": "Isle Of Wight" + }, + { + "zip_code": 23488, + "latitude": 37.948229, + "longitude": -75.601856, + "city": "Withams", + "state": "VA", + "county": "Accomack" + }, + { + "zip_code": 23501, + "latitude": 36.895911, + "longitude": -76.208521, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23502, + "latitude": 36.887433, + "longitude": -76.212909, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23503, + "latitude": 36.948097, + "longitude": -76.256311, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23504, + "latitude": 36.877847, + "longitude": -76.265762, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23505, + "latitude": 36.902947, + "longitude": -76.278813, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23506, + "latitude": 36.931166, + "longitude": -76.23972, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23507, + "latitude": 36.865697, + "longitude": -76.299862, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23508, + "latitude": 36.884447, + "longitude": -76.299963, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23509, + "latitude": 36.881197, + "longitude": -76.261511, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23510, + "latitude": 36.881047, + "longitude": -76.292412, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23511, + "latitude": 36.935579, + "longitude": -76.303417, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23512, + "latitude": 36.931166, + "longitude": -76.23972, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23513, + "latitude": 36.890747, + "longitude": -76.23516, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23514, + "latitude": 36.931166, + "longitude": -76.23972, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23515, + "latitude": 36.931166, + "longitude": -76.23972, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23517, + "latitude": 36.869597, + "longitude": -76.292611, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23518, + "latitude": 36.907997, + "longitude": -76.216448, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23519, + "latitude": 36.931166, + "longitude": -76.23972, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23520, + "latitude": 36.931166, + "longitude": -76.23972, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23521, + "latitude": 36.913144, + "longitude": -76.147157, + "city": "Norfolk", + "state": "VA", + "county": "Virginia Beach City" + }, + { + "zip_code": 23523, + "latitude": 36.831647, + "longitude": -76.270561, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23529, + "latitude": 36.931166, + "longitude": -76.23972, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23530, + "latitude": 36.931166, + "longitude": -76.23972, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23541, + "latitude": 36.931166, + "longitude": -76.23972, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23551, + "latitude": 36.931166, + "longitude": -76.23972, + "city": "Norfolk", + "state": "VA", + "county": "Norfolk City" + }, + { + "zip_code": 23601, + "latitude": 37.058296, + "longitude": -76.463471, + "city": "Newport News", + "state": "VA", + "county": "Newport News City" + }, + { + "zip_code": 23602, + "latitude": 37.125384, + "longitude": -76.510952, + "city": "Newport News", + "state": "VA", + "county": "Newport News City" + }, + { + "zip_code": 23603, + "latitude": 37.168276, + "longitude": -76.541367, + "city": "Newport News", + "state": "VA", + "county": "Newport News City" + }, + { + "zip_code": 23604, + "latitude": 37.157438, + "longitude": -76.584469, + "city": "Fort Eustis", + "state": "VA", + "county": "Newport News City" + }, + { + "zip_code": 23605, + "latitude": 37.021946, + "longitude": -76.436637, + "city": "Newport News", + "state": "VA", + "county": "Newport News City" + }, + { + "zip_code": 23606, + "latitude": 37.073526, + "longitude": -76.493022, + "city": "Newport News", + "state": "VA", + "county": "Newport News City" + }, + { + "zip_code": 23607, + "latitude": 36.991097, + "longitude": -76.420763, + "city": "Newport News", + "state": "VA", + "county": "Newport News City" + }, + { + "zip_code": 23608, + "latitude": 37.152619, + "longitude": -76.542039, + "city": "Newport News", + "state": "VA", + "county": "Newport News City" + }, + { + "zip_code": 23609, + "latitude": 37.195924, + "longitude": -76.524805, + "city": "Newport News", + "state": "VA", + "county": "Newport News City" + }, + { + "zip_code": 23612, + "latitude": 37.195924, + "longitude": -76.524805, + "city": "Newport News", + "state": "VA", + "county": "Newport News City" + }, + { + "zip_code": 23628, + "latitude": 37.195924, + "longitude": -76.524805, + "city": "Newport News", + "state": "VA", + "county": "Newport News City" + }, + { + "zip_code": 23630, + "latitude": 37.072658, + "longitude": -76.38992, + "city": "Hampton", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23631, + "latitude": 37.072658, + "longitude": -76.38992, + "city": "Hampton", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23651, + "latitude": 37.018012, + "longitude": -76.304391, + "city": "Fort Monroe", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23653, + "latitude": 37.072658, + "longitude": -76.38992, + "city": "Hampton", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23661, + "latitude": 37.034746, + "longitude": -76.385817, + "city": "Hampton", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23662, + "latitude": 37.132326, + "longitude": -76.365419, + "city": "Poquoson", + "state": "VA", + "county": "Poquoson City" + }, + { + "zip_code": 23663, + "latitude": 37.034207, + "longitude": -76.319364, + "city": "Hampton", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23664, + "latitude": 37.05165, + "longitude": -76.334465, + "city": "Hampton", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23665, + "latitude": 37.083118, + "longitude": -76.360036, + "city": "Hampton", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23666, + "latitude": 37.060646, + "longitude": -76.371616, + "city": "Hampton", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23667, + "latitude": 37.019346, + "longitude": -76.331815, + "city": "Hampton", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23668, + "latitude": 37.020596, + "longitude": -76.337715, + "city": "Hampton", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23669, + "latitude": 37.045715, + "longitude": -76.353866, + "city": "Hampton", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23670, + "latitude": 37.072658, + "longitude": -76.38992, + "city": "Hampton", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23681, + "latitude": 37.072658, + "longitude": -76.38992, + "city": "Hampton", + "state": "VA", + "county": "Hampton City" + }, + { + "zip_code": 23690, + "latitude": 37.230251, + "longitude": -76.524359, + "city": "Yorktown", + "state": "VA", + "county": "York" + }, + { + "zip_code": 23691, + "latitude": 37.203185, + "longitude": -76.494054, + "city": "Yorktown", + "state": "VA", + "county": "York" + }, + { + "zip_code": 23692, + "latitude": 37.168632, + "longitude": -76.458126, + "city": "Yorktown", + "state": "VA", + "county": "York" + }, + { + "zip_code": 23693, + "latitude": 37.152812, + "longitude": -76.44791, + "city": "Yorktown", + "state": "VA", + "county": "York" + }, + { + "zip_code": 23694, + "latitude": 37.223152, + "longitude": -76.55901, + "city": "Lackey", + "state": "VA", + "county": "York" + }, + { + "zip_code": 23696, + "latitude": 37.189902, + "longitude": -76.426469, + "city": "Seaford", + "state": "VA", + "county": "York" + }, + { + "zip_code": 23701, + "latitude": 36.811498, + "longitude": -76.367715, + "city": "Portsmouth", + "state": "VA", + "county": "Portsmouth City" + }, + { + "zip_code": 23702, + "latitude": 36.804098, + "longitude": -76.329263, + "city": "Portsmouth", + "state": "VA", + "county": "Portsmouth City" + }, + { + "zip_code": 23703, + "latitude": 36.867948, + "longitude": -76.380766, + "city": "Portsmouth", + "state": "VA", + "county": "Portsmouth City" + }, + { + "zip_code": 23704, + "latitude": 36.824298, + "longitude": -76.315663, + "city": "Portsmouth", + "state": "VA", + "county": "Portsmouth City" + }, + { + "zip_code": 23705, + "latitude": 36.868553, + "longitude": -76.355165, + "city": "Portsmouth", + "state": "VA", + "county": "Portsmouth City" + }, + { + "zip_code": 23707, + "latitude": 36.837153, + "longitude": -76.347314, + "city": "Portsmouth", + "state": "VA", + "county": "Portsmouth City" + }, + { + "zip_code": 23708, + "latitude": 36.868553, + "longitude": -76.355165, + "city": "Portsmouth", + "state": "VA", + "county": "Portsmouth City" + }, + { + "zip_code": 23709, + "latitude": 36.868553, + "longitude": -76.355165, + "city": "Portsmouth", + "state": "VA", + "county": "Portsmouth City" + }, + { + "zip_code": 23801, + "latitude": 37.233941, + "longitude": -77.334831, + "city": "Fort Lee", + "state": "VA", + "county": "Prince George" + }, + { + "zip_code": 23803, + "latitude": 37.21713, + "longitude": -77.389253, + "city": "Petersburg", + "state": "VA", + "county": "Petersburg City" + }, + { + "zip_code": 23804, + "latitude": 37.204765, + "longitude": -77.392784, + "city": "Petersburg", + "state": "VA", + "county": "Petersburg City" + }, + { + "zip_code": 23805, + "latitude": 37.1922, + "longitude": -77.389641, + "city": "Petersburg", + "state": "VA", + "county": "Petersburg City" + }, + { + "zip_code": 23806, + "latitude": 37.204765, + "longitude": -77.392784, + "city": "Petersburg", + "state": "VA", + "county": "Petersburg City" + }, + { + "zip_code": 23821, + "latitude": 36.858078, + "longitude": -77.894632, + "city": "Alberta", + "state": "VA", + "county": "Brunswick" + }, + { + "zip_code": 23822, + "latitude": 37.072361, + "longitude": -77.647495, + "city": "Ammon", + "state": "VA", + "county": "Dinwiddie" + }, + { + "zip_code": 23824, + "latitude": 37.12237, + "longitude": -77.978923, + "city": "Blackstone", + "state": "VA", + "county": "Nottoway" + }, + { + "zip_code": 23827, + "latitude": 36.611614, + "longitude": -77.207263, + "city": "Boykins", + "state": "VA", + "county": "Southampton" + }, + { + "zip_code": 23828, + "latitude": 36.597427, + "longitude": -77.293341, + "city": "Branchville", + "state": "VA", + "county": "Southampton" + }, + { + "zip_code": 23829, + "latitude": 36.720629, + "longitude": -77.236519, + "city": "Capron", + "state": "VA", + "county": "Southampton" + }, + { + "zip_code": 23830, + "latitude": 37.021522, + "longitude": -77.453348, + "city": "Carson", + "state": "VA", + "county": "Dinwiddie" + }, + { + "zip_code": 23831, + "latitude": 37.320744, + "longitude": -77.454311, + "city": "Chester", + "state": "VA", + "county": "Chesterfield" + }, + { + "zip_code": 23832, + "latitude": 37.392683, + "longitude": -77.605362, + "city": "Chesterfield", + "state": "VA", + "county": "Chesterfield" + }, + { + "zip_code": 23833, + "latitude": 37.168045, + "longitude": -77.674226, + "city": "Church Road", + "state": "VA", + "county": "Dinwiddie" + }, + { + "zip_code": 23834, + "latitude": 37.26219, + "longitude": -77.396989, + "city": "Colonial Heights", + "state": "VA", + "county": "Colonial Heights City" + }, + { + "zip_code": 23836, + "latitude": 37.347458, + "longitude": -77.338551, + "city": "Chester", + "state": "VA", + "county": "Chesterfield" + }, + { + "zip_code": 23837, + "latitude": 36.70656, + "longitude": -77.215522, + "city": "Courtland", + "state": "VA", + "county": "Southampton" + }, + { + "zip_code": 23838, + "latitude": 37.333271, + "longitude": -77.634265, + "city": "Chesterfield", + "state": "VA", + "county": "Chesterfield" + }, + { + "zip_code": 23839, + "latitude": 37.065785, + "longitude": -76.915537, + "city": "Dendron", + "state": "VA", + "county": "Surry" + }, + { + "zip_code": 23840, + "latitude": 37.069327, + "longitude": -77.677945, + "city": "Dewitt", + "state": "VA", + "county": "Dinwiddie" + }, + { + "zip_code": 23841, + "latitude": 37.079304, + "longitude": -77.601563, + "city": "Dinwiddie", + "state": "VA", + "county": "Dinwiddie" + }, + { + "zip_code": 23842, + "latitude": 37.150869, + "longitude": -77.213961, + "city": "Disputanta", + "state": "VA", + "county": "Prince George" + }, + { + "zip_code": 23843, + "latitude": 36.849008, + "longitude": -77.807345, + "city": "Dolphin", + "state": "VA", + "county": "Brunswick" + }, + { + "zip_code": 23844, + "latitude": 36.662286, + "longitude": -77.335713, + "city": "Drewryville", + "state": "VA", + "county": "Southampton" + }, + { + "zip_code": 23845, + "latitude": 36.598591, + "longitude": -78.001206, + "city": "Ebony", + "state": "VA", + "county": "Brunswick" + }, + { + "zip_code": 23846, + "latitude": 37.07295, + "longitude": -76.856852, + "city": "Elberon", + "state": "VA", + "county": "Surry" + }, + { + "zip_code": 23847, + "latitude": 36.694745, + "longitude": -77.535517, + "city": "Emporia", + "state": "VA", + "county": "Emporia City" + }, + { + "zip_code": 23850, + "latitude": 37.134946, + "longitude": -77.736402, + "city": "Ford", + "state": "VA", + "county": "Dinwiddie" + }, + { + "zip_code": 23851, + "latitude": 36.682635, + "longitude": -76.942233, + "city": "Franklin", + "state": "VA", + "county": "Franklin City" + }, + { + "zip_code": 23856, + "latitude": 36.808949, + "longitude": -77.720027, + "city": "Freeman", + "state": "VA", + "county": "Brunswick" + }, + { + "zip_code": 23857, + "latitude": 36.596172, + "longitude": -77.890727, + "city": "Gasburg", + "state": "VA", + "county": "Brunswick" + }, + { + "zip_code": 23860, + "latitude": 37.286676, + "longitude": -77.296596, + "city": "Hopewell", + "state": "VA", + "county": "Hopewell City" + }, + { + "zip_code": 23866, + "latitude": 36.887634, + "longitude": -76.900225, + "city": "Ivor", + "state": "VA", + "county": "Southampton" + }, + { + "zip_code": 23867, + "latitude": 36.864325, + "longitude": -77.282567, + "city": "Jarratt", + "state": "VA", + "county": "Sussex" + }, + { + "zip_code": 23868, + "latitude": 36.734246, + "longitude": -77.813561, + "city": "Lawrenceville", + "state": "VA", + "county": "Brunswick" + }, + { + "zip_code": 23870, + "latitude": 36.721471, + "longitude": -77.531996, + "city": "Jarratt", + "state": "VA", + "county": "Greensville" + }, + { + "zip_code": 23872, + "latitude": 37.010322, + "longitude": -77.736044, + "city": "Mc Kenney", + "state": "VA", + "county": "Dinwiddie" + }, + { + "zip_code": 23873, + "latitude": 36.80878, + "longitude": -77.954397, + "city": "Meredithville", + "state": "VA", + "county": "Brunswick" + }, + { + "zip_code": 23874, + "latitude": 36.607792, + "longitude": -77.092706, + "city": "Newsoms", + "state": "VA", + "county": "Southampton" + }, + { + "zip_code": 23875, + "latitude": 37.234733, + "longitude": -77.263465, + "city": "Prince George", + "state": "VA", + "county": "Prince George" + }, + { + "zip_code": 23876, + "latitude": 36.948942, + "longitude": -77.841001, + "city": "Rawlings", + "state": "VA", + "county": "Brunswick" + }, + { + "zip_code": 23878, + "latitude": 36.820784, + "longitude": -77.026194, + "city": "Sedley", + "state": "VA", + "county": "Southampton" + }, + { + "zip_code": 23879, + "latitude": 36.595815, + "longitude": -77.59207, + "city": "Skippers", + "state": "VA", + "county": "Greensville" + }, + { + "zip_code": 23881, + "latitude": 37.169453, + "longitude": -76.967517, + "city": "Spring Grove", + "state": "VA", + "county": "Surry" + }, + { + "zip_code": 23882, + "latitude": 36.878331, + "longitude": -77.392824, + "city": "Stony Creek", + "state": "VA", + "county": "Sussex" + }, + { + "zip_code": 23883, + "latitude": 37.095554, + "longitude": -76.821125, + "city": "Surry", + "state": "VA", + "county": "Surry" + }, + { + "zip_code": 23884, + "latitude": 36.945667, + "longitude": -77.253913, + "city": "Sussex", + "state": "VA", + "county": "Sussex" + }, + { + "zip_code": 23885, + "latitude": 37.180418, + "longitude": -77.575347, + "city": "Sutherland", + "state": "VA", + "county": "Dinwiddie" + }, + { + "zip_code": 23887, + "latitude": 36.6608, + "longitude": -77.820567, + "city": "Valentines", + "state": "VA", + "county": "Brunswick" + }, + { + "zip_code": 23888, + "latitude": 36.958091, + "longitude": -77.040206, + "city": "Wakefield", + "state": "VA", + "county": "Sussex" + }, + { + "zip_code": 23889, + "latitude": 36.885672, + "longitude": -77.764753, + "city": "Warfield", + "state": "VA", + "county": "Brunswick" + }, + { + "zip_code": 23890, + "latitude": 36.973687, + "longitude": -77.12993, + "city": "Waverly", + "state": "VA", + "county": "Sussex" + }, + { + "zip_code": 23891, + "latitude": 36.909845, + "longitude": -77.286287, + "city": "Waverly", + "state": "VA", + "county": "Sussex" + }, + { + "zip_code": 23893, + "latitude": 36.61509, + "longitude": -77.927891, + "city": "White Plains", + "state": "VA", + "county": "Brunswick" + }, + { + "zip_code": 23894, + "latitude": 37.125964, + "longitude": -77.703648, + "city": "Wilsons", + "state": "VA", + "county": "Dinwiddie" + }, + { + "zip_code": 23897, + "latitude": 36.838572, + "longitude": -77.27587, + "city": "Yale", + "state": "VA", + "county": "Sussex" + }, + { + "zip_code": 23898, + "latitude": 36.833708, + "longitude": -76.817727, + "city": "Zuni", + "state": "VA", + "county": "Isle Of Wight" + }, + { + "zip_code": 23899, + "latitude": 37.199009, + "longitude": -76.984159, + "city": "Claremont", + "state": "VA", + "county": "Surry" + }, + { + "zip_code": 23901, + "latitude": 37.280694, + "longitude": -78.421284, + "city": "Farmville", + "state": "VA", + "county": "Prince Edward" + }, + { + "zip_code": 23909, + "latitude": 37.301574, + "longitude": -78.394944, + "city": "Farmville", + "state": "VA", + "county": "Prince Edward" + }, + { + "zip_code": 23915, + "latitude": 36.70774, + "longitude": -78.281204, + "city": "Baskerville", + "state": "VA", + "county": "Mecklenburg" + }, + { + "zip_code": 23917, + "latitude": 36.655033, + "longitude": -78.350388, + "city": "Boydton", + "state": "VA", + "county": "Mecklenburg" + }, + { + "zip_code": 23919, + "latitude": 36.612381, + "longitude": -78.288907, + "city": "Bracey", + "state": "VA", + "county": "Mecklenburg" + }, + { + "zip_code": 23920, + "latitude": 36.697808, + "longitude": -77.935481, + "city": "Brodnax", + "state": "VA", + "county": "Brunswick" + }, + { + "zip_code": 23921, + "latitude": 37.563225, + "longitude": -78.53643, + "city": "Buckingham", + "state": "VA", + "county": "Buckingham" + }, + { + "zip_code": 23922, + "latitude": 37.190922, + "longitude": -78.182733, + "city": "Burkeville", + "state": "VA", + "county": "Nottoway" + }, + { + "zip_code": 23923, + "latitude": 37.087895, + "longitude": -78.637846, + "city": "Charlotte Court House", + "state": "VA", + "county": "Charlotte" + }, + { + "zip_code": 23924, + "latitude": 36.771496, + "longitude": -78.425379, + "city": "Chase City", + "state": "VA", + "county": "Mecklenburg" + }, + { + "zip_code": 23927, + "latitude": 36.65565, + "longitude": -78.458282, + "city": "Clarksville", + "state": "VA", + "county": "Mecklenburg" + }, + { + "zip_code": 23930, + "latitude": 37.150355, + "longitude": -78.095474, + "city": "Crewe", + "state": "VA", + "county": "Nottoway" + }, + { + "zip_code": 23934, + "latitude": 37.153846, + "longitude": -78.661108, + "city": "Cullen", + "state": "VA", + "county": "Charlotte" + }, + { + "zip_code": 23936, + "latitude": 37.412369, + "longitude": -78.434926, + "city": "Dillwyn", + "state": "VA", + "county": "Buckingham" + }, + { + "zip_code": 23937, + "latitude": 36.961434, + "longitude": -78.556872, + "city": "Drakes Branch", + "state": "VA", + "county": "Charlotte" + }, + { + "zip_code": 23938, + "latitude": 36.918641, + "longitude": -78.052391, + "city": "Dundas", + "state": "VA", + "county": "Lunenburg" + }, + { + "zip_code": 23939, + "latitude": 37.377196, + "longitude": -78.80648, + "city": "Evergreen", + "state": "VA", + "county": "Appomattox" + }, + { + "zip_code": 23941, + "latitude": 36.948129, + "longitude": -78.248333, + "city": "Fort Mitchell", + "state": "VA", + "county": "Lunenburg" + }, + { + "zip_code": 23942, + "latitude": 37.238139, + "longitude": -78.461789, + "city": "Green Bay", + "state": "VA", + "county": "Prince Edward" + }, + { + "zip_code": 23943, + "latitude": 37.238139, + "longitude": -78.461789, + "city": "Hampden Sydney", + "state": "VA", + "county": "Prince Edward" + }, + { + "zip_code": 23944, + "latitude": 36.909212, + "longitude": -78.142642, + "city": "Kenbridge", + "state": "VA", + "county": "Lunenburg" + }, + { + "zip_code": 23947, + "latitude": 37.013846, + "longitude": -78.567247, + "city": "Keysville", + "state": "VA", + "county": "Charlotte" + }, + { + "zip_code": 23950, + "latitude": 36.690021, + "longitude": -78.232633, + "city": "La Crosse", + "state": "VA", + "county": "Mecklenburg" + }, + { + "zip_code": 23952, + "latitude": 36.979498, + "longitude": -78.285967, + "city": "Lunenburg", + "state": "VA", + "county": "Lunenburg" + }, + { + "zip_code": 23954, + "latitude": 37.238139, + "longitude": -78.461789, + "city": "Meherrin", + "state": "VA", + "county": "Prince Edward" + }, + { + "zip_code": 23955, + "latitude": 37.116094, + "longitude": -78.057832, + "city": "Nottoway", + "state": "VA", + "county": "Nottoway" + }, + { + "zip_code": 23958, + "latitude": 37.377196, + "longitude": -78.80648, + "city": "Pamplin", + "state": "VA", + "county": "Appomattox" + }, + { + "zip_code": 23959, + "latitude": 37.108477, + "longitude": -78.739921, + "city": "Phenix", + "state": "VA", + "county": "Charlotte" + }, + { + "zip_code": 23960, + "latitude": 37.238139, + "longitude": -78.461789, + "city": "Prospect", + "state": "VA", + "county": "Prince Edward" + }, + { + "zip_code": 23962, + "latitude": 36.951533, + "longitude": -78.705413, + "city": "Randolph", + "state": "VA", + "county": "Charlotte" + }, + { + "zip_code": 23963, + "latitude": 37.181814, + "longitude": -78.77379, + "city": "Red House", + "state": "VA", + "county": "Charlotte" + }, + { + "zip_code": 23964, + "latitude": 36.783999, + "longitude": -78.618595, + "city": "Red Oak", + "state": "VA", + "county": "Charlotte" + }, + { + "zip_code": 23966, + "latitude": 37.280047, + "longitude": -78.346836, + "city": "Rice", + "state": "VA", + "county": "Prince Edward" + }, + { + "zip_code": 23967, + "latitude": 36.905289, + "longitude": -78.632086, + "city": "Saxe", + "state": "VA", + "county": "Charlotte" + }, + { + "zip_code": 23968, + "latitude": 36.723976, + "longitude": -78.530076, + "city": "Skipwith", + "state": "VA", + "county": "Mecklenburg" + }, + { + "zip_code": 23970, + "latitude": 36.717223, + "longitude": -78.168729, + "city": "South Hill", + "state": "VA", + "county": "Mecklenburg" + }, + { + "zip_code": 23974, + "latitude": 36.961136, + "longitude": -78.258493, + "city": "Victoria", + "state": "VA", + "county": "Lunenburg" + }, + { + "zip_code": 23976, + "latitude": 36.839122, + "longitude": -78.598225, + "city": "Wylliesburg", + "state": "VA", + "county": "Charlotte" + }, + { + "zip_code": 24001, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24002, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24003, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24004, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24005, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24006, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24007, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24008, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24009, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24010, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24011, + "latitude": 37.270237, + "longitude": -79.941586, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24012, + "latitude": 37.30529, + "longitude": -79.92711, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24013, + "latitude": 37.265687, + "longitude": -79.923698, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24014, + "latitude": 37.238643, + "longitude": -79.940559, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24015, + "latitude": 37.253866, + "longitude": -79.974559, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24016, + "latitude": 37.272486, + "longitude": -79.952709, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24017, + "latitude": 37.297919, + "longitude": -79.98776, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24018, + "latitude": 37.250349, + "longitude": -80.05251, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke" + }, + { + "zip_code": 24019, + "latitude": 37.351517, + "longitude": -79.905211, + "city": "Roanoke", + "state": "VA", + "county": "Botetourt" + }, + { + "zip_code": 24020, + "latitude": 37.358887, + "longitude": -79.944789, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke" + }, + { + "zip_code": 24022, + "latitude": 37.278439, + "longitude": -79.933206, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24023, + "latitude": 37.210663, + "longitude": -80.406172, + "city": "Roanoke", + "state": "VA", + "county": "Montgomery" + }, + { + "zip_code": 24024, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24025, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24026, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24027, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24028, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24029, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24030, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24031, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24032, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24033, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24034, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24035, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24036, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24037, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24038, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24040, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24042, + "latitude": 37.271687, + "longitude": -79.939228, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24043, + "latitude": 37.269168, + "longitude": -79.939905, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24044, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24045, + "latitude": 37.268618, + "longitude": -79.940655, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24048, + "latitude": 37.274175, + "longitude": -79.95786, + "city": "Roanoke", + "state": "VA", + "county": "Roanoke City" + }, + { + "zip_code": 24050, + "latitude": 37.555083, + "longitude": -79.786151, + "city": "Roanoke", + "state": "VA", + "county": "Botetourt" + }, + { + "zip_code": 24053, + "latitude": 36.612434, + "longitude": -80.504446, + "city": "Ararat", + "state": "VA", + "county": "Patrick" + }, + { + "zip_code": 24054, + "latitude": 36.670446, + "longitude": -79.742557, + "city": "Axton", + "state": "VA", + "county": "Henry" + }, + { + "zip_code": 24055, + "latitude": 36.735045, + "longitude": -79.975528, + "city": "Bassett", + "state": "VA", + "county": "Henry" + }, + { + "zip_code": 24058, + "latitude": 37.198248, + "longitude": -80.615065, + "city": "Belspring", + "state": "VA", + "county": "Pulaski" + }, + { + "zip_code": 24059, + "latitude": 37.154932, + "longitude": -80.121522, + "city": "Bent Mountain", + "state": "VA", + "county": "Roanoke" + }, + { + "zip_code": 24060, + "latitude": 37.256283, + "longitude": -80.43473, + "city": "Blacksburg", + "state": "VA", + "county": "Montgomery" + }, + { + "zip_code": 24061, + "latitude": 37.179115, + "longitude": -80.351482, + "city": "Blacksburg", + "state": "VA", + "county": "Montgomery" + }, + { + "zip_code": 24062, + "latitude": 37.174227, + "longitude": -80.395698, + "city": "Blacksburg", + "state": "VA", + "county": "Montgomery" + }, + { + "zip_code": 24063, + "latitude": 37.174227, + "longitude": -80.395698, + "city": "Blacksburg", + "state": "VA", + "county": "Montgomery" + }, + { + "zip_code": 24064, + "latitude": 37.369287, + "longitude": -79.819537, + "city": "Blue Ridge", + "state": "VA", + "county": "Botetourt" + }, + { + "zip_code": 24065, + "latitude": 37.098391, + "longitude": -79.95233, + "city": "Boones Mill", + "state": "VA", + "county": "Franklin" + }, + { + "zip_code": 24066, + "latitude": 37.547903, + "longitude": -79.712321, + "city": "Buchanan", + "state": "VA", + "county": "Botetourt" + }, + { + "zip_code": 24067, + "latitude": 37.024849, + "longitude": -80.056685, + "city": "Callaway", + "state": "VA", + "county": "Franklin" + }, + { + "zip_code": 24068, + "latitude": 37.154804, + "longitude": -80.418396, + "city": "Christiansburg", + "state": "VA", + "county": "Montgomery" + }, + { + "zip_code": 24069, + "latitude": 36.594226, + "longitude": -79.616614, + "city": "Cascade", + "state": "VA", + "county": "Pittsylvania" + }, + { + "zip_code": 24070, + "latitude": 37.355418, + "longitude": -80.158462, + "city": "Catawba", + "state": "VA", + "county": "Roanoke" + }, + { + "zip_code": 24072, + "latitude": 37.044622, + "longitude": -80.227981, + "city": "Check", + "state": "VA", + "county": "Floyd" + }, + { + "zip_code": 24073, + "latitude": 37.118759, + "longitude": -80.41787, + "city": "Christiansburg", + "state": "VA", + "county": "Montgomery" + }, + { + "zip_code": 24076, + "latitude": 36.597733, + "longitude": -80.36824, + "city": "Claudville", + "state": "VA", + "county": "Patrick" + }, + { + "zip_code": 24077, + "latitude": 37.372608, + "longitude": -79.901331, + "city": "Cloverdale", + "state": "VA", + "county": "Botetourt" + }, + { + "zip_code": 24078, + "latitude": 36.724691, + "longitude": -79.914912, + "city": "Collinsville", + "state": "VA", + "county": "Henry" + }, + { + "zip_code": 24079, + "latitude": 37.048796, + "longitude": -80.153614, + "city": "Copper Hill", + "state": "VA", + "county": "Floyd" + }, + { + "zip_code": 24082, + "latitude": 36.627165, + "longitude": -80.11928, + "city": "Critz", + "state": "VA", + "county": "Patrick" + }, + { + "zip_code": 24083, + "latitude": 37.44197, + "longitude": -79.914156, + "city": "Daleville", + "state": "VA", + "county": "Botetourt" + }, + { + "zip_code": 24084, + "latitude": 37.122327, + "longitude": -80.752614, + "city": "Dublin", + "state": "VA", + "county": "Pulaski" + }, + { + "zip_code": 24085, + "latitude": 37.645695, + "longitude": -79.864047, + "city": "Eagle Rock", + "state": "VA", + "county": "Botetourt" + }, + { + "zip_code": 24086, + "latitude": 37.277231, + "longitude": -80.670159, + "city": "Eggleston", + "state": "VA", + "county": "Giles" + }, + { + "zip_code": 24087, + "latitude": 37.225683, + "longitude": -80.184842, + "city": "Elliston", + "state": "VA", + "county": "Roanoke" + }, + { + "zip_code": 24088, + "latitude": 36.889337, + "longitude": -80.025866, + "city": "Ferrum", + "state": "VA", + "county": "Franklin" + }, + { + "zip_code": 24089, + "latitude": 36.708873, + "longitude": -79.970745, + "city": "Fieldale", + "state": "VA", + "county": "Henry" + }, + { + "zip_code": 24090, + "latitude": 37.527349, + "longitude": -79.834474, + "city": "Fincastle", + "state": "VA", + "county": "Botetourt" + }, + { + "zip_code": 24091, + "latitude": 36.895714, + "longitude": -80.327524, + "city": "Floyd", + "state": "VA", + "county": "Floyd" + }, + { + "zip_code": 24092, + "latitude": 36.985894, + "longitude": -79.772986, + "city": "Glade Hill", + "state": "VA", + "county": "Franklin" + }, + { + "zip_code": 24093, + "latitude": 37.384006, + "longitude": -80.853048, + "city": "Glen Lyn", + "state": "VA", + "county": "Giles" + }, + { + "zip_code": 24094, + "latitude": 37.385257, + "longitude": -80.590627, + "city": "Goldbond", + "state": "VA", + "county": "Giles" + }, + { + "zip_code": 24095, + "latitude": 37.21229, + "longitude": -79.742886, + "city": "Goodview", + "state": "VA", + "county": "Bedford" + }, + { + "zip_code": 24101, + "latitude": 37.177891, + "longitude": -79.667368, + "city": "Hardy", + "state": "VA", + "county": "Bedford" + }, + { + "zip_code": 24102, + "latitude": 36.840862, + "longitude": -79.986739, + "city": "Henry", + "state": "VA", + "county": "Franklin" + }, + { + "zip_code": 24104, + "latitude": 37.154717, + "longitude": -79.494856, + "city": "Huddleston", + "state": "VA", + "county": "Bedford" + }, + { + "zip_code": 24105, + "latitude": 36.90035, + "longitude": -80.585888, + "city": "Indian Valley", + "state": "VA", + "county": "Floyd" + }, + { + "zip_code": 24111, + "latitude": 37.174227, + "longitude": -80.395698, + "city": "Mc Coy", + "state": "VA", + "county": "Montgomery" + }, + { + "zip_code": 24112, + "latitude": 36.681298, + "longitude": -79.86626, + "city": "Martinsville", + "state": "VA", + "county": "Martinsville City" + }, + { + "zip_code": 24113, + "latitude": 36.679571, + "longitude": -79.865168, + "city": "Martinsville", + "state": "VA", + "county": "Martinsville City" + }, + { + "zip_code": 24114, + "latitude": 36.679571, + "longitude": -79.865168, + "city": "Martinsville", + "state": "VA", + "county": "Martinsville City" + }, + { + "zip_code": 24115, + "latitude": 36.679571, + "longitude": -79.865168, + "city": "Martinsville", + "state": "VA", + "county": "Martinsville City" + }, + { + "zip_code": 24120, + "latitude": 36.700218, + "longitude": -80.353031, + "city": "Meadows Of Dan", + "state": "VA", + "county": "Patrick" + }, + { + "zip_code": 24121, + "latitude": 37.185024, + "longitude": -79.563579, + "city": "Moneta", + "state": "VA", + "county": "Bedford" + }, + { + "zip_code": 24122, + "latitude": 37.419582, + "longitude": -79.710746, + "city": "Montvale", + "state": "VA", + "county": "Bedford" + }, + { + "zip_code": 24124, + "latitude": 37.342026, + "longitude": -80.762866, + "city": "Narrows", + "state": "VA", + "county": "Giles" + }, + { + "zip_code": 24126, + "latitude": 37.069206, + "longitude": -80.689067, + "city": "Newbern", + "state": "VA", + "county": "Pulaski" + }, + { + "zip_code": 24127, + "latitude": 37.498957, + "longitude": -80.138591, + "city": "New Castle", + "state": "VA", + "county": "Craig" + }, + { + "zip_code": 24128, + "latitude": 37.331516, + "longitude": -80.523039, + "city": "Newport", + "state": "VA", + "county": "Giles" + }, + { + "zip_code": 24129, + "latitude": 37.096403, + "longitude": -80.608056, + "city": "New River", + "state": "VA", + "county": "Pulaski" + }, + { + "zip_code": 24130, + "latitude": 37.555083, + "longitude": -79.786151, + "city": "Oriskany", + "state": "VA", + "county": "Botetourt" + }, + { + "zip_code": 24131, + "latitude": 37.488235, + "longitude": -80.222319, + "city": "Paint Bank", + "state": "VA", + "county": "Craig" + }, + { + "zip_code": 24132, + "latitude": 37.204788, + "longitude": -80.620517, + "city": "Parrott", + "state": "VA", + "county": "Pulaski" + }, + { + "zip_code": 24133, + "latitude": 36.682193, + "longitude": -80.136393, + "city": "Patrick Springs", + "state": "VA", + "county": "Patrick" + }, + { + "zip_code": 24134, + "latitude": 37.261147, + "longitude": -80.74373, + "city": "Pearisburg", + "state": "VA", + "county": "Giles" + }, + { + "zip_code": 24136, + "latitude": 37.35623, + "longitude": -80.690234, + "city": "Pembroke", + "state": "VA", + "county": "Giles" + }, + { + "zip_code": 24137, + "latitude": 36.934169, + "longitude": -79.682503, + "city": "Penhook", + "state": "VA", + "county": "Franklin" + }, + { + "zip_code": 24138, + "latitude": 37.06488, + "longitude": -80.32637, + "city": "Pilot", + "state": "VA", + "county": "Montgomery" + }, + { + "zip_code": 24139, + "latitude": 36.995808, + "longitude": -79.470112, + "city": "Pittsville", + "state": "VA", + "county": "Pittsylvania" + }, + { + "zip_code": 24141, + "latitude": 37.119732, + "longitude": -80.556541, + "city": "Radford", + "state": "VA", + "county": "Radford" + }, + { + "zip_code": 24142, + "latitude": 37.138733, + "longitude": -80.54802, + "city": "Radford", + "state": "VA", + "county": "Radford" + }, + { + "zip_code": 24143, + "latitude": 37.122583, + "longitude": -80.562913, + "city": "Radford", + "state": "VA", + "county": "Radford" + }, + { + "zip_code": 24146, + "latitude": 37.006912, + "longitude": -79.913875, + "city": "Redwood", + "state": "VA", + "county": "Franklin" + }, + { + "zip_code": 24147, + "latitude": 37.363616, + "longitude": -80.749864, + "city": "Rich Creek", + "state": "VA", + "county": "Giles" + }, + { + "zip_code": 24148, + "latitude": 36.650725, + "longitude": -79.854972, + "city": "Ridgeway", + "state": "VA", + "county": "Henry" + }, + { + "zip_code": 24149, + "latitude": 37.057894, + "longitude": -80.436385, + "city": "Riner", + "state": "VA", + "county": "Montgomery" + }, + { + "zip_code": 24150, + "latitude": 37.37067, + "longitude": -80.662674, + "city": "Ripplemead", + "state": "VA", + "county": "Giles" + }, + { + "zip_code": 24151, + "latitude": 36.995127, + "longitude": -79.852489, + "city": "Rocky Mount", + "state": "VA", + "county": "Franklin" + }, + { + "zip_code": 24153, + "latitude": 37.28814, + "longitude": -80.067762, + "city": "Salem", + "state": "VA", + "county": "Salem" + }, + { + "zip_code": 24155, + "latitude": 37.288384, + "longitude": -80.067062, + "city": "Salem", + "state": "VA", + "county": "Salem" + }, + { + "zip_code": 24156, + "latitude": 37.288384, + "longitude": -80.067062, + "city": "Salem", + "state": "VA", + "county": "Salem" + }, + { + "zip_code": 24157, + "latitude": 37.288384, + "longitude": -80.067062, + "city": "Salem", + "state": "VA", + "county": "Salem" + }, + { + "zip_code": 24161, + "latitude": 36.982776, + "longitude": -79.548523, + "city": "Sandy Level", + "state": "VA", + "county": "Pittsylvania" + }, + { + "zip_code": 24162, + "latitude": 37.152878, + "longitude": -80.263621, + "city": "Shawsville", + "state": "VA", + "county": "Montgomery" + }, + { + "zip_code": 24165, + "latitude": 36.593912, + "longitude": -80.005233, + "city": "Spencer", + "state": "VA", + "county": "Henry" + }, + { + "zip_code": 24167, + "latitude": 37.314577, + "longitude": -80.722619, + "city": "Staffordsville", + "state": "VA", + "county": "Giles" + }, + { + "zip_code": 24168, + "latitude": 36.688926, + "longitude": -79.944745, + "city": "Stanleytown", + "state": "VA", + "county": "Henry" + }, + { + "zip_code": 24171, + "latitude": 36.689183, + "longitude": -80.251601, + "city": "Stuart", + "state": "VA", + "county": "Patrick" + }, + { + "zip_code": 24174, + "latitude": 37.350092, + "longitude": -79.69189, + "city": "Thaxton", + "state": "VA", + "county": "Bedford" + }, + { + "zip_code": 24175, + "latitude": 37.416128, + "longitude": -79.924765, + "city": "Troutville", + "state": "VA", + "county": "Botetourt" + }, + { + "zip_code": 24176, + "latitude": 37.014893, + "longitude": -79.757636, + "city": "Union Hall", + "state": "VA", + "county": "Franklin" + }, + { + "zip_code": 24177, + "latitude": 36.724064, + "longitude": -80.35806, + "city": "Vesta", + "state": "VA", + "county": "Patrick" + }, + { + "zip_code": 24178, + "latitude": 37.310494, + "longitude": -79.789799, + "city": "Villamont", + "state": "VA", + "county": "Bedford" + }, + { + "zip_code": 24179, + "latitude": 37.275674, + "longitude": -79.877505, + "city": "Vinton", + "state": "VA", + "county": "Roanoke" + }, + { + "zip_code": 24184, + "latitude": 37.104127, + "longitude": -79.799315, + "city": "Wirtz", + "state": "VA", + "county": "Franklin" + }, + { + "zip_code": 24185, + "latitude": 36.741838, + "longitude": -80.267112, + "city": "Woolwine", + "state": "VA", + "county": "Patrick" + }, + { + "zip_code": 24201, + "latitude": 36.613815, + "longitude": -82.176238, + "city": "Bristol", + "state": "VA", + "county": "Bristol" + }, + { + "zip_code": 24202, + "latitude": 36.621571, + "longitude": -82.167633, + "city": "Bristol", + "state": "VA", + "county": "Bristol" + }, + { + "zip_code": 24203, + "latitude": 36.761613, + "longitude": -81.968712, + "city": "Bristol", + "state": "VA", + "county": "Bristol" + }, + { + "zip_code": 24209, + "latitude": 36.761613, + "longitude": -81.968712, + "city": "Bristol", + "state": "VA", + "county": "Bristol" + }, + { + "zip_code": 24210, + "latitude": 36.740217, + "longitude": -82.026738, + "city": "Abingdon", + "state": "VA", + "county": "Washington" + }, + { + "zip_code": 24211, + "latitude": 36.66726, + "longitude": -81.964801, + "city": "Abingdon", + "state": "VA", + "county": "Washington" + }, + { + "zip_code": 24212, + "latitude": 36.690942, + "longitude": -81.970764, + "city": "Abingdon", + "state": "VA", + "county": "Washington" + }, + { + "zip_code": 24215, + "latitude": 36.923445, + "longitude": -82.796445, + "city": "Andover", + "state": "VA", + "county": "Wise" + }, + { + "zip_code": 24216, + "latitude": 36.940452, + "longitude": -82.665879, + "city": "Appalachia", + "state": "VA", + "county": "Wise" + }, + { + "zip_code": 24217, + "latitude": 37.130943, + "longitude": -82.344881, + "city": "Bee", + "state": "VA", + "county": "Dickenson" + }, + { + "zip_code": 24218, + "latitude": 36.743491, + "longitude": -83.22336, + "city": "Ben Hur", + "state": "VA", + "county": "Lee" + }, + { + "zip_code": 24219, + "latitude": 36.894806, + "longitude": -82.654215, + "city": "Big Stone Gap", + "state": "VA", + "county": "Wise" + }, + { + "zip_code": 24220, + "latitude": 37.130943, + "longitude": -82.344881, + "city": "Birchleaf", + "state": "VA", + "county": "Dickenson" + }, + { + "zip_code": 24221, + "latitude": 36.743491, + "longitude": -83.22336, + "city": "Blackwater", + "state": "VA", + "county": "Lee" + }, + { + "zip_code": 24224, + "latitude": 37.043978, + "longitude": -81.855318, + "city": "Castlewood", + "state": "VA", + "county": "Russell" + }, + { + "zip_code": 24225, + "latitude": 36.925928, + "longitude": -82.093586, + "city": "Cleveland", + "state": "VA", + "county": "Russell" + }, + { + "zip_code": 24226, + "latitude": 37.159677, + "longitude": -82.358274, + "city": "Clinchco", + "state": "VA", + "county": "Dickenson" + }, + { + "zip_code": 24228, + "latitude": 37.149797, + "longitude": -82.463069, + "city": "Clintwood", + "state": "VA", + "county": "Dickenson" + }, + { + "zip_code": 24230, + "latitude": 36.971586, + "longitude": -82.475496, + "city": "Coeburn", + "state": "VA", + "county": "Wise" + }, + { + "zip_code": 24236, + "latitude": 36.645463, + "longitude": -81.742678, + "city": "Damascus", + "state": "VA", + "county": "Washington" + }, + { + "zip_code": 24237, + "latitude": 36.925928, + "longitude": -82.093586, + "city": "Dante", + "state": "VA", + "county": "Russell" + }, + { + "zip_code": 24239, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Davenport", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24243, + "latitude": 36.771579, + "longitude": -82.927728, + "city": "Dryden", + "state": "VA", + "county": "Lee" + }, + { + "zip_code": 24244, + "latitude": 36.711382, + "longitude": -82.833676, + "city": "Duffield", + "state": "VA", + "county": "Scott" + }, + { + "zip_code": 24245, + "latitude": 36.828738, + "longitude": -82.471457, + "city": "Dungannon", + "state": "VA", + "county": "Scott" + }, + { + "zip_code": 24246, + "latitude": 36.864429, + "longitude": -82.737469, + "city": "East Stone Gap", + "state": "VA", + "county": "Wise" + }, + { + "zip_code": 24248, + "latitude": 36.743491, + "longitude": -83.22336, + "city": "Ewing", + "state": "VA", + "county": "Lee" + }, + { + "zip_code": 24250, + "latitude": 36.739474, + "longitude": -82.639637, + "city": "Fort Blackmore", + "state": "VA", + "county": "Scott" + }, + { + "zip_code": 24251, + "latitude": 36.621664, + "longitude": -82.542414, + "city": "Gate City", + "state": "VA", + "county": "Scott" + }, + { + "zip_code": 24256, + "latitude": 37.18399, + "longitude": -82.323976, + "city": "Haysi", + "state": "VA", + "county": "Dickenson" + }, + { + "zip_code": 24258, + "latitude": 36.739474, + "longitude": -82.639637, + "city": "Hiltons", + "state": "VA", + "county": "Scott" + }, + { + "zip_code": 24260, + "latitude": 36.963056, + "longitude": -82.01331, + "city": "Honaker", + "state": "VA", + "county": "Russell" + }, + { + "zip_code": 24263, + "latitude": 36.6885, + "longitude": -83.114212, + "city": "Jonesville", + "state": "VA", + "county": "Lee" + }, + { + "zip_code": 24265, + "latitude": 36.743491, + "longitude": -83.22336, + "city": "Keokee", + "state": "VA", + "county": "Lee" + }, + { + "zip_code": 24266, + "latitude": 36.908553, + "longitude": -82.053655, + "city": "Lebanon", + "state": "VA", + "county": "Russell" + }, + { + "zip_code": 24269, + "latitude": 37.130943, + "longitude": -82.344881, + "city": "Mc Clure", + "state": "VA", + "county": "Dickenson" + }, + { + "zip_code": 24270, + "latitude": 36.721945, + "longitude": -82.256139, + "city": "Mendota", + "state": "VA", + "county": "Washington" + }, + { + "zip_code": 24271, + "latitude": 36.762954, + "longitude": -82.399015, + "city": "Nickelsville", + "state": "VA", + "county": "Scott" + }, + { + "zip_code": 24272, + "latitude": 37.130943, + "longitude": -82.344881, + "city": "Nora", + "state": "VA", + "county": "Dickenson" + }, + { + "zip_code": 24273, + "latitude": 36.93767, + "longitude": -82.622624, + "city": "Norton", + "state": "VA", + "county": "Norton City" + }, + { + "zip_code": 24277, + "latitude": 36.75823, + "longitude": -83.032536, + "city": "Pennington Gap", + "state": "VA", + "county": "Lee" + }, + { + "zip_code": 24279, + "latitude": 37.088727, + "longitude": -82.623231, + "city": "Pound", + "state": "VA", + "county": "Wise" + }, + { + "zip_code": 24280, + "latitude": 36.95095, + "longitude": -81.964938, + "city": "Rosedale", + "state": "VA", + "county": "Russell" + }, + { + "zip_code": 24281, + "latitude": 36.743491, + "longitude": -83.22336, + "city": "Rose Hill", + "state": "VA", + "county": "Lee" + }, + { + "zip_code": 24282, + "latitude": 36.743491, + "longitude": -83.22336, + "city": "Saint Charles", + "state": "VA", + "county": "Lee" + }, + { + "zip_code": 24283, + "latitude": 36.936767, + "longitude": -82.364288, + "city": "Saint Paul", + "state": "VA", + "county": "Wise" + }, + { + "zip_code": 24285, + "latitude": 36.950943, + "longitude": -82.786715, + "city": "Stonega", + "state": "VA", + "county": "Wise" + }, + { + "zip_code": 24289, + "latitude": 37.130943, + "longitude": -82.344881, + "city": "Trammel", + "state": "VA", + "county": "Dickenson" + }, + { + "zip_code": 24290, + "latitude": 36.613714, + "longitude": -82.561825, + "city": "Weber City", + "state": "VA", + "county": "Scott" + }, + { + "zip_code": 24292, + "latitude": 36.608229, + "longitude": -81.584934, + "city": "Whitetop", + "state": "VA", + "county": "Grayson" + }, + { + "zip_code": 24293, + "latitude": 37.002843, + "longitude": -82.570697, + "city": "Wise", + "state": "VA", + "county": "Wise" + }, + { + "zip_code": 24301, + "latitude": 37.064714, + "longitude": -80.771241, + "city": "Pulaski", + "state": "VA", + "county": "Pulaski" + }, + { + "zip_code": 24311, + "latitude": 36.869374, + "longitude": -81.399235, + "city": "Atkins", + "state": "VA", + "county": "Smyth" + }, + { + "zip_code": 24312, + "latitude": 36.854655, + "longitude": -80.922512, + "city": "Austinville", + "state": "VA", + "county": "Wythe" + }, + { + "zip_code": 24313, + "latitude": 36.897395, + "longitude": -80.789443, + "city": "Barren Springs", + "state": "VA", + "county": "Wythe" + }, + { + "zip_code": 24314, + "latitude": 37.127348, + "longitude": -81.15842, + "city": "Bastian", + "state": "VA", + "county": "Bland" + }, + { + "zip_code": 24315, + "latitude": 37.127348, + "longitude": -81.15842, + "city": "Bland", + "state": "VA", + "county": "Bland" + }, + { + "zip_code": 24316, + "latitude": 36.941611, + "longitude": -81.620331, + "city": "Broadford", + "state": "VA", + "county": "Smyth" + }, + { + "zip_code": 24317, + "latitude": 36.664788, + "longitude": -80.729669, + "city": "Cana", + "state": "VA", + "county": "Carroll" + }, + { + "zip_code": 24318, + "latitude": 37.127348, + "longitude": -81.15842, + "city": "Ceres", + "state": "VA", + "county": "Bland" + }, + { + "zip_code": 24319, + "latitude": 36.798213, + "longitude": -81.617482, + "city": "Chilhowie", + "state": "VA", + "county": "Smyth" + }, + { + "zip_code": 24322, + "latitude": 36.81781, + "longitude": -81.111146, + "city": "Cripple Creek", + "state": "VA", + "county": "Wythe" + }, + { + "zip_code": 24323, + "latitude": 36.871709, + "longitude": -81.198867, + "city": "Crockett", + "state": "VA", + "county": "Wythe" + }, + { + "zip_code": 24324, + "latitude": 36.981684, + "longitude": -80.774844, + "city": "Draper", + "state": "VA", + "county": "Pulaski" + }, + { + "zip_code": 24325, + "latitude": 36.812134, + "longitude": -80.58895, + "city": "Dugspur", + "state": "VA", + "county": "Carroll" + }, + { + "zip_code": 24326, + "latitude": 36.718676, + "longitude": -81.187968, + "city": "Elk Creek", + "state": "VA", + "county": "Grayson" + }, + { + "zip_code": 24327, + "latitude": 36.779961, + "longitude": -81.817064, + "city": "Emory", + "state": "VA", + "county": "Washington" + }, + { + "zip_code": 24328, + "latitude": 36.667972, + "longitude": -80.675229, + "city": "Fancy Gap", + "state": "VA", + "county": "Carroll" + }, + { + "zip_code": 24330, + "latitude": 36.712696, + "longitude": -81.042703, + "city": "Fries", + "state": "VA", + "county": "Grayson" + }, + { + "zip_code": 24333, + "latitude": 36.660281, + "longitude": -80.913605, + "city": "Galax", + "state": "VA", + "county": "Galax City" + }, + { + "zip_code": 24340, + "latitude": 36.74578, + "longitude": -81.773242, + "city": "Glade Spring", + "state": "VA", + "county": "Washington" + }, + { + "zip_code": 24343, + "latitude": 36.730347, + "longitude": -80.67507, + "city": "Hillsville", + "state": "VA", + "county": "Carroll" + }, + { + "zip_code": 24347, + "latitude": 36.975578, + "longitude": -80.669513, + "city": "Hiwassee", + "state": "VA", + "county": "Pulaski" + }, + { + "zip_code": 24348, + "latitude": 36.638835, + "longitude": -81.194296, + "city": "Independence", + "state": "VA", + "county": "Grayson" + }, + { + "zip_code": 24350, + "latitude": 36.915513, + "longitude": -81.059955, + "city": "Ivanhoe", + "state": "VA", + "county": "Wythe" + }, + { + "zip_code": 24351, + "latitude": 36.58637, + "longitude": -80.759966, + "city": "Lambsburg", + "state": "VA", + "county": "Carroll" + }, + { + "zip_code": 24352, + "latitude": 36.711129, + "longitude": -80.535146, + "city": "Laurel Fork", + "state": "VA", + "county": "Carroll" + }, + { + "zip_code": 24354, + "latitude": 36.832324, + "longitude": -81.597841, + "city": "Marion", + "state": "VA", + "county": "Smyth" + }, + { + "zip_code": 24360, + "latitude": 36.905629, + "longitude": -80.924423, + "city": "Max Meadows", + "state": "VA", + "county": "Wythe" + }, + { + "zip_code": 24361, + "latitude": 36.752637, + "longitude": -81.848288, + "city": "Meadowview", + "state": "VA", + "county": "Washington" + }, + { + "zip_code": 24363, + "latitude": 36.657529, + "longitude": -81.367509, + "city": "Mouth Of Wilson", + "state": "VA", + "county": "Grayson" + }, + { + "zip_code": 24366, + "latitude": 37.127348, + "longitude": -81.15842, + "city": "Rocky Gap", + "state": "VA", + "county": "Bland" + }, + { + "zip_code": 24368, + "latitude": 36.880988, + "longitude": -81.25526, + "city": "Rural Retreat", + "state": "VA", + "county": "Wythe" + }, + { + "zip_code": 24370, + "latitude": 36.906696, + "longitude": -81.645388, + "city": "Saltville", + "state": "VA", + "county": "Smyth" + }, + { + "zip_code": 24373, + "latitude": 36.826371, + "longitude": -81.549231, + "city": "Seven Mile Ford", + "state": "VA", + "county": "Smyth" + }, + { + "zip_code": 24374, + "latitude": 36.802255, + "longitude": -81.206262, + "city": "Speedwell", + "state": "VA", + "county": "Wythe" + }, + { + "zip_code": 24375, + "latitude": 36.787066, + "longitude": -81.388192, + "city": "Sugar Grove", + "state": "VA", + "county": "Smyth" + }, + { + "zip_code": 24377, + "latitude": 37.006018, + "longitude": -81.570038, + "city": "Tannersville", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24378, + "latitude": 36.688587, + "longitude": -81.361748, + "city": "Trout Dale", + "state": "VA", + "county": "Grayson" + }, + { + "zip_code": 24379, + "latitude": 36.682782, + "longitude": -81.257795, + "city": "Volney", + "state": "VA", + "county": "Grayson" + }, + { + "zip_code": 24380, + "latitude": 36.881393, + "longitude": -80.504784, + "city": "Willis", + "state": "VA", + "county": "Floyd" + }, + { + "zip_code": 24381, + "latitude": 36.694308, + "longitude": -80.776569, + "city": "Woodlawn", + "state": "VA", + "county": "Carroll" + }, + { + "zip_code": 24382, + "latitude": 36.92855, + "longitude": -81.146559, + "city": "Wytheville", + "state": "VA", + "county": "Wythe" + }, + { + "zip_code": 24401, + "latitude": 38.157368, + "longitude": -79.065116, + "city": "Staunton", + "state": "VA", + "county": "Staunton City" + }, + { + "zip_code": 24402, + "latitude": 38.159275, + "longitude": -79.062858, + "city": "Staunton", + "state": "VA", + "county": "Staunton City" + }, + { + "zip_code": 24407, + "latitude": 38.179715, + "longitude": -79.141332, + "city": "Staunton", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24411, + "latitude": 38.091705, + "longitude": -79.322363, + "city": "Augusta Springs", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24412, + "latitude": 38.055311, + "longitude": -79.746367, + "city": "Bacova", + "state": "VA", + "county": "Bath" + }, + { + "zip_code": 24413, + "latitude": 38.385967, + "longitude": -79.559157, + "city": "Blue Grass", + "state": "VA", + "county": "Highland" + }, + { + "zip_code": 24415, + "latitude": 37.926477, + "longitude": -79.329162, + "city": "Brownsburg", + "state": "VA", + "county": "Rockbridge" + }, + { + "zip_code": 24416, + "latitude": 37.730001, + "longitude": -79.355121, + "city": "Buena Vista", + "state": "VA", + "county": "Buena Vista City" + }, + { + "zip_code": 24421, + "latitude": 38.243395, + "longitude": -79.173229, + "city": "Churchville", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24422, + "latitude": 37.824232, + "longitude": -79.823119, + "city": "Clifton Forge", + "state": "VA", + "county": "Clifton Forge City" + }, + { + "zip_code": 24426, + "latitude": 37.780216, + "longitude": -79.986963, + "city": "Covington", + "state": "VA", + "county": "Covington City" + }, + { + "zip_code": 24430, + "latitude": 38.073868, + "longitude": -79.359123, + "city": "Craigsville", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24431, + "latitude": 38.153856, + "longitude": -78.860085, + "city": "Crimora", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24432, + "latitude": 38.139476, + "longitude": -79.373366, + "city": "Deerfield", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24433, + "latitude": 38.385967, + "longitude": -79.559157, + "city": "Doe Hill", + "state": "VA", + "county": "Highland" + }, + { + "zip_code": 24435, + "latitude": 37.875396, + "longitude": -79.298708, + "city": "Fairfield", + "state": "VA", + "county": "Rockbridge" + }, + { + "zip_code": 24437, + "latitude": 38.2064, + "longitude": -78.941138, + "city": "Fort Defiance", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24438, + "latitude": 37.555083, + "longitude": -79.786151, + "city": "Glen Wilton", + "state": "VA", + "county": "Botetourt" + }, + { + "zip_code": 24439, + "latitude": 37.978313, + "longitude": -79.503429, + "city": "Goshen", + "state": "VA", + "county": "Rockbridge" + }, + { + "zip_code": 24440, + "latitude": 37.983435, + "longitude": -79.175646, + "city": "Greenville", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24441, + "latitude": 38.272465, + "longitude": -78.805841, + "city": "Grottoes", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 24442, + "latitude": 38.385967, + "longitude": -79.559157, + "city": "Head Waters", + "state": "VA", + "county": "Highland" + }, + { + "zip_code": 24445, + "latitude": 37.994443, + "longitude": -79.831593, + "city": "Hot Springs", + "state": "VA", + "county": "Bath" + }, + { + "zip_code": 24448, + "latitude": 37.796454, + "longitude": -79.785987, + "city": "Iron Gate", + "state": "VA", + "county": "Alleghany" + }, + { + "zip_code": 24450, + "latitude": 37.779976, + "longitude": -79.443495, + "city": "Lexington", + "state": "VA", + "county": "Lexington City" + }, + { + "zip_code": 24457, + "latitude": 37.780396, + "longitude": -79.88283, + "city": "Low Moor", + "state": "VA", + "county": "Alleghany" + }, + { + "zip_code": 24458, + "latitude": 38.385967, + "longitude": -79.559157, + "city": "Mc Dowell", + "state": "VA", + "county": "Highland" + }, + { + "zip_code": 24459, + "latitude": 38.042838, + "longitude": -79.242427, + "city": "Middlebrook", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24460, + "latitude": 38.055311, + "longitude": -79.746367, + "city": "Millboro", + "state": "VA", + "county": "Bath" + }, + { + "zip_code": 24463, + "latitude": 38.179715, + "longitude": -79.141332, + "city": "Mint Spring", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24464, + "latitude": 37.865358, + "longitude": -79.0804, + "city": "Montebello", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 24465, + "latitude": 38.385967, + "longitude": -79.559157, + "city": "Monterey", + "state": "VA", + "county": "Highland" + }, + { + "zip_code": 24467, + "latitude": 38.242038, + "longitude": -78.96826, + "city": "Mount Sidney", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24468, + "latitude": 38.385967, + "longitude": -79.559157, + "city": "Mustoe", + "state": "VA", + "county": "Highland" + }, + { + "zip_code": 24469, + "latitude": 38.179715, + "longitude": -79.141332, + "city": "New Hope", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24471, + "latitude": 38.322592, + "longitude": -78.788649, + "city": "Port Republic", + "state": "VA", + "county": "Rockingham" + }, + { + "zip_code": 24472, + "latitude": 37.941296, + "longitude": -79.276332, + "city": "Raphine", + "state": "VA", + "county": "Rockbridge" + }, + { + "zip_code": 24473, + "latitude": 37.883036, + "longitude": -79.448586, + "city": "Rockbridge Baths", + "state": "VA", + "county": "Rockbridge" + }, + { + "zip_code": 24474, + "latitude": 37.806241, + "longitude": -79.840421, + "city": "Selma", + "state": "VA", + "county": "Alleghany" + }, + { + "zip_code": 24476, + "latitude": 38.179715, + "longitude": -79.141332, + "city": "Steeles Tavern", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24477, + "latitude": 37.973609, + "longitude": -79.065951, + "city": "Stuarts Draft", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24479, + "latitude": 38.188328, + "longitude": -79.211901, + "city": "Swoope", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24482, + "latitude": 38.210585, + "longitude": -78.989369, + "city": "Verona", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24483, + "latitude": 37.859217, + "longitude": -79.230686, + "city": "Vesuvius", + "state": "VA", + "county": "Rockbridge" + }, + { + "zip_code": 24484, + "latitude": 38.055311, + "longitude": -79.746367, + "city": "Warm Springs", + "state": "VA", + "county": "Bath" + }, + { + "zip_code": 24485, + "latitude": 38.174227, + "longitude": -79.209622, + "city": "West Augusta", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24486, + "latitude": 38.282326, + "longitude": -78.946136, + "city": "Weyers Cave", + "state": "VA", + "county": "Augusta" + }, + { + "zip_code": 24487, + "latitude": 38.055311, + "longitude": -79.746367, + "city": "Williamsville", + "state": "VA", + "county": "Bath" + }, + { + "zip_code": 24501, + "latitude": 37.383112, + "longitude": -79.178326, + "city": "Lynchburg", + "state": "VA", + "county": "Lynchburg City" + }, + { + "zip_code": 24502, + "latitude": 37.382542, + "longitude": -79.218121, + "city": "Lynchburg", + "state": "VA", + "county": "Lynchburg City" + }, + { + "zip_code": 24503, + "latitude": 37.408091, + "longitude": -79.209247, + "city": "Lynchburg", + "state": "VA", + "county": "Lynchburg City" + }, + { + "zip_code": 24504, + "latitude": 37.405242, + "longitude": -79.125261, + "city": "Lynchburg", + "state": "VA", + "county": "Lynchburg City" + }, + { + "zip_code": 24505, + "latitude": 37.400944, + "longitude": -79.178506, + "city": "Lynchburg", + "state": "VA", + "county": "Lynchburg City" + }, + { + "zip_code": 24506, + "latitude": 37.381692, + "longitude": -79.161046, + "city": "Lynchburg", + "state": "VA", + "county": "Lynchburg City" + }, + { + "zip_code": 24512, + "latitude": 37.242503, + "longitude": -79.109789, + "city": "Lynchburg", + "state": "VA", + "county": "Campbell" + }, + { + "zip_code": 24513, + "latitude": 37.245798, + "longitude": -79.133546, + "city": "Lynchburg", + "state": "VA", + "county": "Campbell" + }, + { + "zip_code": 24514, + "latitude": 37.400944, + "longitude": -79.178506, + "city": "Lynchburg", + "state": "VA", + "county": "Lynchburg City" + }, + { + "zip_code": 24515, + "latitude": 37.400944, + "longitude": -79.178506, + "city": "Lynchburg", + "state": "VA", + "county": "Lynchburg City" + }, + { + "zip_code": 24517, + "latitude": 37.225543, + "longitude": -79.24118, + "city": "Altavista", + "state": "VA", + "county": "Campbell" + }, + { + "zip_code": 24520, + "latitude": 36.596827, + "longitude": -79.043054, + "city": "Alton", + "state": "VA", + "county": "Halifax" + }, + { + "zip_code": 24521, + "latitude": 37.59162, + "longitude": -79.108441, + "city": "Amherst", + "state": "VA", + "county": "Amherst" + }, + { + "zip_code": 24522, + "latitude": 37.356134, + "longitude": -78.848202, + "city": "Appomattox", + "state": "VA", + "county": "Appomattox" + }, + { + "zip_code": 24523, + "latitude": 37.336027, + "longitude": -79.522585, + "city": "Bedford", + "state": "VA", + "county": "Bedford City" + }, + { + "zip_code": 24526, + "latitude": 37.516659, + "longitude": -79.38752, + "city": "Big Island", + "state": "VA", + "county": "Bedford" + }, + { + "zip_code": 24527, + "latitude": 36.710176, + "longitude": -79.3381, + "city": "Blairs", + "state": "VA", + "county": "Pittsylvania" + }, + { + "zip_code": 24528, + "latitude": 37.117502, + "longitude": -79.074279, + "city": "Brookneal", + "state": "VA", + "county": "Campbell" + }, + { + "zip_code": 24529, + "latitude": 36.61405, + "longitude": -78.641645, + "city": "Buffalo Junction", + "state": "VA", + "county": "Mecklenburg" + }, + { + "zip_code": 24530, + "latitude": 36.785155, + "longitude": -79.60708, + "city": "Callands", + "state": "VA", + "county": "Pittsylvania" + }, + { + "zip_code": 24531, + "latitude": 36.830785, + "longitude": -79.412735, + "city": "Chatham", + "state": "VA", + "county": "Pittsylvania" + }, + { + "zip_code": 24533, + "latitude": 37.537969, + "longitude": -78.946324, + "city": "Clifford", + "state": "VA", + "county": "Amherst" + }, + { + "zip_code": 24534, + "latitude": 36.875823, + "longitude": -78.748218, + "city": "Clover", + "state": "VA", + "county": "Halifax" + }, + { + "zip_code": 24535, + "latitude": 36.611317, + "longitude": -78.945519, + "city": "Cluster Springs", + "state": "VA", + "county": "Halifax" + }, + { + "zip_code": 24536, + "latitude": 37.496433, + "longitude": -79.305838, + "city": "Coleman Falls", + "state": "VA", + "county": "Bedford" + }, + { + "zip_code": 24538, + "latitude": 37.296071, + "longitude": -78.949355, + "city": "Concord", + "state": "VA", + "county": "Campbell" + }, + { + "zip_code": 24539, + "latitude": 36.866093, + "longitude": -78.831701, + "city": "Crystal Hill", + "state": "VA", + "county": "Halifax" + }, + { + "zip_code": 24540, + "latitude": 36.603501, + "longitude": -79.376228, + "city": "Danville", + "state": "VA", + "county": "Danville City" + }, + { + "zip_code": 24541, + "latitude": 36.577505, + "longitude": -79.441637, + "city": "Danville", + "state": "VA", + "county": "Danville City" + }, + { + "zip_code": 24543, + "latitude": 36.592679, + "longitude": -79.410983, + "city": "Danville", + "state": "VA", + "county": "Danville City" + }, + { + "zip_code": 24544, + "latitude": 36.592679, + "longitude": -79.410983, + "city": "Danville", + "state": "VA", + "county": "Danville City" + }, + { + "zip_code": 24549, + "latitude": 36.704919, + "longitude": -79.502331, + "city": "Dry Fork", + "state": "VA", + "county": "Pittsylvania" + }, + { + "zip_code": 24550, + "latitude": 37.243659, + "longitude": -79.270958, + "city": "Evington", + "state": "VA", + "county": "Campbell" + }, + { + "zip_code": 24551, + "latitude": 37.372437, + "longitude": -79.318718, + "city": "Forest", + "state": "VA", + "county": "Bedford" + }, + { + "zip_code": 24553, + "latitude": 37.58939, + "longitude": -78.860834, + "city": "Gladstone", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 24554, + "latitude": 37.148585, + "longitude": -79.111743, + "city": "Gladys", + "state": "VA", + "county": "Campbell" + }, + { + "zip_code": 24555, + "latitude": 37.732638, + "longitude": -79.525212, + "city": "Glasgow", + "state": "VA", + "county": "Rockbridge" + }, + { + "zip_code": 24556, + "latitude": 37.375464, + "longitude": -79.403888, + "city": "Goode", + "state": "VA", + "county": "Bedford" + }, + { + "zip_code": 24557, + "latitude": 36.983015, + "longitude": -79.321101, + "city": "Gretna", + "state": "VA", + "county": "Pittsylvania" + }, + { + "zip_code": 24558, + "latitude": 36.783814, + "longitude": -78.964257, + "city": "Halifax", + "state": "VA", + "county": "Halifax" + }, + { + "zip_code": 24562, + "latitude": 37.751112, + "longitude": -78.631326, + "city": "Howardsville", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 24563, + "latitude": 37.038301, + "longitude": -79.36393, + "city": "Hurt", + "state": "VA", + "county": "Pittsylvania" + }, + { + "zip_code": 24565, + "latitude": 36.846278, + "longitude": -79.207927, + "city": "Java", + "state": "VA", + "county": "Pittsylvania" + }, + { + "zip_code": 24566, + "latitude": 36.721431, + "longitude": -79.255522, + "city": "Keeling", + "state": "VA", + "county": "Pittsylvania" + }, + { + "zip_code": 24569, + "latitude": 37.093523, + "longitude": -79.081614, + "city": "Long Island", + "state": "VA", + "county": "Campbell" + }, + { + "zip_code": 24570, + "latitude": 37.333936, + "longitude": -79.406303, + "city": "Lowry", + "state": "VA", + "county": "Bedford" + }, + { + "zip_code": 24571, + "latitude": 37.141308, + "longitude": -79.359182, + "city": "Lynch Station", + "state": "VA", + "county": "Campbell" + }, + { + "zip_code": 24572, + "latitude": 37.475715, + "longitude": -79.140618, + "city": "Madison Heights", + "state": "VA", + "county": "Amherst" + }, + { + "zip_code": 24574, + "latitude": 37.544326, + "longitude": -79.244826, + "city": "Monroe", + "state": "VA", + "county": "Amherst" + }, + { + "zip_code": 24576, + "latitude": 37.245798, + "longitude": -79.133546, + "city": "Naruna", + "state": "VA", + "county": "Campbell" + }, + { + "zip_code": 24577, + "latitude": 36.811672, + "longitude": -78.962546, + "city": "Nathalie", + "state": "VA", + "county": "Halifax" + }, + { + "zip_code": 24578, + "latitude": 37.677211, + "longitude": -79.550792, + "city": "Natural Bridge", + "state": "VA", + "county": "Rockbridge" + }, + { + "zip_code": 24579, + "latitude": 37.59797, + "longitude": -79.525047, + "city": "Natural Bridge Station", + "state": "VA", + "county": "Rockbridge" + }, + { + "zip_code": 24580, + "latitude": 36.589478, + "longitude": -78.67745, + "city": "Nelson", + "state": "VA", + "county": "Mecklenburg" + }, + { + "zip_code": 24581, + "latitude": 37.640813, + "longitude": -78.803767, + "city": "Norwood", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 24585, + "latitude": 36.801515, + "longitude": -78.883933, + "city": "Republican Grove", + "state": "VA", + "county": "Halifax" + }, + { + "zip_code": 24586, + "latitude": 36.6136, + "longitude": -79.276568, + "city": "Ringgold", + "state": "VA", + "county": "Pittsylvania" + }, + { + "zip_code": 24588, + "latitude": 37.283924, + "longitude": -79.090832, + "city": "Rustburg", + "state": "VA", + "county": "Campbell" + }, + { + "zip_code": 24589, + "latitude": 36.777629, + "longitude": -78.778726, + "city": "Scottsburg", + "state": "VA", + "county": "Halifax" + }, + { + "zip_code": 24590, + "latitude": 37.846277, + "longitude": -78.529827, + "city": "Scottsville", + "state": "VA", + "county": "Albemarle" + }, + { + "zip_code": 24592, + "latitude": 36.679767, + "longitude": -78.952947, + "city": "South Boston", + "state": "VA", + "county": "Halifax" + }, + { + "zip_code": 24593, + "latitude": 37.344169, + "longitude": -78.918241, + "city": "Spout Spring", + "state": "VA", + "county": "Appomattox" + }, + { + "zip_code": 24594, + "latitude": 36.668449, + "longitude": -79.355493, + "city": "Sutherlin", + "state": "VA", + "county": "Pittsylvania" + }, + { + "zip_code": 24595, + "latitude": 37.567427, + "longitude": -79.075617, + "city": "Sweet Briar", + "state": "VA", + "county": "Amherst" + }, + { + "zip_code": 24597, + "latitude": 36.838178, + "longitude": -79.067906, + "city": "Vernon Hill", + "state": "VA", + "county": "Halifax" + }, + { + "zip_code": 24598, + "latitude": 36.616452, + "longitude": -78.798686, + "city": "Virgilina", + "state": "VA", + "county": "Halifax" + }, + { + "zip_code": 24599, + "latitude": 37.682224, + "longitude": -78.731156, + "city": "Wingina", + "state": "VA", + "county": "Nelson" + }, + { + "zip_code": 24601, + "latitude": 37.13549, + "longitude": -81.563406, + "city": "Amonate", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24602, + "latitude": 36.999484, + "longitude": -81.79514, + "city": "Bandy", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24603, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Big Rock", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24604, + "latitude": 37.203317, + "longitude": -81.557499, + "city": "Bishop", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24605, + "latitude": 37.172408, + "longitude": -81.507054, + "city": "Bluefield", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24606, + "latitude": 37.13549, + "longitude": -81.563406, + "city": "Boissevain", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24607, + "latitude": 37.130943, + "longitude": -82.344881, + "city": "Breaks", + "state": "VA", + "county": "Dickenson" + }, + { + "zip_code": 24608, + "latitude": 37.13549, + "longitude": -81.563406, + "city": "Burkes Garden", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24609, + "latitude": 37.123379, + "longitude": -81.54705, + "city": "Cedar Bluff", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24612, + "latitude": 37.094523, + "longitude": -81.818037, + "city": "Doran", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24613, + "latitude": 37.13549, + "longitude": -81.563406, + "city": "Falls Mills", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24614, + "latitude": 37.257171, + "longitude": -82.100073, + "city": "Grundy", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24618, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Harman", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24619, + "latitude": 37.13549, + "longitude": -81.563406, + "city": "Horsepen", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24620, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Hurley", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24622, + "latitude": 37.13549, + "longitude": -81.563406, + "city": "Jewell Ridge", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24624, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Keen Mountain", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24627, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Mavisdale", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24628, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Maxie", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24630, + "latitude": 37.175577, + "longitude": -81.539856, + "city": "North Tazewell", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24631, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Oakwood", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24634, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Pilgrims Knob", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24635, + "latitude": 37.305417, + "longitude": -81.34246, + "city": "Pocahontas", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24637, + "latitude": 37.13549, + "longitude": -81.563406, + "city": "Pounding Mill", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24639, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Raven", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24640, + "latitude": 37.13549, + "longitude": -81.563406, + "city": "Red Ash", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24641, + "latitude": 37.186196, + "longitude": -81.554668, + "city": "Richlands", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24646, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Rowe", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24647, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Shortt Gap", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24649, + "latitude": 37.045445, + "longitude": -81.9271, + "city": "Swords Creek", + "state": "VA", + "county": "Russell" + }, + { + "zip_code": 24651, + "latitude": 37.174459, + "longitude": -81.416087, + "city": "Tazewell", + "state": "VA", + "county": "Tazewell" + }, + { + "zip_code": 24656, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Vansant", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24657, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Whitewood", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24658, + "latitude": 37.287992, + "longitude": -82.027408, + "city": "Wolford", + "state": "VA", + "county": "Buchanan" + }, + { + "zip_code": 24701, + "latitude": 37.332725, + "longitude": -81.160066, + "city": "Bluefield", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24712, + "latitude": 37.452346, + "longitude": -81.00916, + "city": "Athens", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24714, + "latitude": 37.460069, + "longitude": -81.160053, + "city": "Beeson", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24715, + "latitude": 37.343532, + "longitude": -81.325281, + "city": "Bramwell", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24716, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Bud", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24719, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Covel", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24724, + "latitude": 37.333273, + "longitude": -81.311849, + "city": "Freeman", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24726, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Herndon", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24729, + "latitude": 37.416395, + "longitude": -81.105803, + "city": "Hiawatha", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24731, + "latitude": 37.416395, + "longitude": -81.105803, + "city": "Kegley", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24732, + "latitude": 37.416395, + "longitude": -81.105803, + "city": "Kellysville", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24733, + "latitude": 37.440745, + "longitude": -81.190841, + "city": "Lashmeet", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24736, + "latitude": 37.416393, + "longitude": -81.202217, + "city": "Matoaka", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24737, + "latitude": 37.35391, + "longitude": -81.251807, + "city": "Montcalm", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24738, + "latitude": 37.416395, + "longitude": -81.105803, + "city": "Nemours", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24739, + "latitude": 37.416395, + "longitude": -81.105803, + "city": "Oakvale", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24740, + "latitude": 37.379876, + "longitude": -81.117475, + "city": "Princeton", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24747, + "latitude": 37.414224, + "longitude": -81.178417, + "city": "Rock", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24751, + "latitude": 37.416395, + "longitude": -81.105803, + "city": "Wolfe", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 24801, + "latitude": 37.411086, + "longitude": -81.539352, + "city": "Welch", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24808, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Anawalt", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24811, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Avondale", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24813, + "latitude": 37.343847, + "longitude": -81.683131, + "city": "Bartley", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24815, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Berwind", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24816, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Big Sandy", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24817, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Bradshaw", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24818, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Brenton", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24820, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Capels", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24821, + "latitude": 37.38297, + "longitude": -81.634292, + "city": "Caretta", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24822, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Clear Fork", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24823, + "latitude": 37.626772, + "longitude": -81.702061, + "city": "Coal Mountain", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24824, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Coalwood", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24825, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Crumpler", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24826, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Cucumber", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24827, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Cyclone", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24828, + "latitude": 37.467849, + "longitude": -81.681104, + "city": "Davy", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24829, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Eckman", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24830, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Elbert", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24831, + "latitude": 37.432867, + "longitude": -81.570983, + "city": "Elkhorn", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24832, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "English", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24834, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Fanrock", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24836, + "latitude": 37.36584, + "longitude": -81.554444, + "city": "Gary", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24839, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Hanover", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24841, + "latitude": 37.405828, + "longitude": -81.576548, + "city": "Havaco", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24842, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Hemphill", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24843, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Hensley", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24844, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Iaeger", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24845, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Ikes Fork", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24846, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Isaban", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24847, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Itmann", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24848, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Jenkinjones", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24849, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Jesse", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24850, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Jolo", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24851, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Justice", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 24852, + "latitude": 37.414357, + "longitude": -81.431783, + "city": "Keystone", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24853, + "latitude": 37.442086, + "longitude": -81.511965, + "city": "Kimball", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24854, + "latitude": 37.743967, + "longitude": -81.574986, + "city": "Kopperston", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24855, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Kyle", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24856, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Leckie", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24857, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Lynco", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24859, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Marianna", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24860, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Matheny", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24861, + "latitude": 37.417549, + "longitude": -81.423979, + "city": "Maybeury", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24862, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Mohawk", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24866, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Newhall", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24867, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "New Richmond", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24868, + "latitude": 37.389939, + "longitude": -81.419578, + "city": "Northfork", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24869, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "North Spring", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24870, + "latitude": 37.74071, + "longitude": -81.583069, + "city": "Oceana", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24871, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Pageton", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24872, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Panther", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24873, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Paynesville", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24874, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Pineville", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24877, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Powhatan", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24878, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Premier", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24879, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Raysal", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24880, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Rock View", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24881, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Roderfield", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24882, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Simon", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24883, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Skygusty", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24884, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Squire", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24887, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Switchback", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24888, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Thorpe", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24889, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Twin Branch", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24892, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "War", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24894, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Warriormine", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24895, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Wilcoe", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24896, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Wolf Pen", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24897, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Worth", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24898, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Wyoming", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 24899, + "latitude": 37.375246, + "longitude": -81.653889, + "city": "Yukon", + "state": "WV", + "county": "Mcdowell" + }, + { + "zip_code": 24901, + "latitude": 37.844155, + "longitude": -80.538781, + "city": "Lewisburg", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24902, + "latitude": 37.774666, + "longitude": -80.461492, + "city": "Fairlea", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24910, + "latitude": 37.84394, + "longitude": -80.572401, + "city": "Alderson", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24915, + "latitude": 38.387966, + "longitude": -79.990585, + "city": "Arbovale", + "state": "WV", + "county": "Pocahontas" + }, + { + "zip_code": 24916, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Asbury", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24917, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Auto", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24918, + "latitude": 37.552029, + "longitude": -80.539672, + "city": "Ballard", + "state": "WV", + "county": "Monroe" + }, + { + "zip_code": 24919, + "latitude": 37.674782, + "longitude": -80.890043, + "city": "Ballengee", + "state": "WV", + "county": "Summers" + }, + { + "zip_code": 24920, + "latitude": 38.387966, + "longitude": -79.990585, + "city": "Bartow", + "state": "WV", + "county": "Pocahontas" + }, + { + "zip_code": 24924, + "latitude": 38.387966, + "longitude": -79.990585, + "city": "Buckeye", + "state": "WV", + "county": "Pocahontas" + }, + { + "zip_code": 24925, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Caldwell", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24927, + "latitude": 38.387966, + "longitude": -79.990585, + "city": "Cass", + "state": "WV", + "county": "Pocahontas" + }, + { + "zip_code": 24931, + "latitude": 37.918876, + "longitude": -80.611705, + "city": "Crawley", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24934, + "latitude": 38.326214, + "longitude": -79.898674, + "city": "Dunmore", + "state": "WV", + "county": "Pocahontas" + }, + { + "zip_code": 24935, + "latitude": 37.648541, + "longitude": -80.877395, + "city": "Forest Hill", + "state": "WV", + "county": "Summers" + }, + { + "zip_code": 24936, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Fort Spring", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24938, + "latitude": 37.915363, + "longitude": -80.335257, + "city": "Frankford", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24941, + "latitude": 37.58902, + "longitude": -80.340084, + "city": "Gap Mills", + "state": "WV", + "county": "Monroe" + }, + { + "zip_code": 24942, + "latitude": 37.552029, + "longitude": -80.539672, + "city": "Glace", + "state": "WV", + "county": "Monroe" + }, + { + "zip_code": 24943, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Grassy Meadows", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24944, + "latitude": 38.387966, + "longitude": -79.990585, + "city": "Green Bank", + "state": "WV", + "county": "Pocahontas" + }, + { + "zip_code": 24945, + "latitude": 37.552029, + "longitude": -80.539672, + "city": "Greenville", + "state": "WV", + "county": "Monroe" + }, + { + "zip_code": 24946, + "latitude": 38.110904, + "longitude": -80.264059, + "city": "Hillsboro", + "state": "WV", + "county": "Pocahontas" + }, + { + "zip_code": 24950, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Kieffer", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24951, + "latitude": 37.552029, + "longitude": -80.539672, + "city": "Lindside", + "state": "WV", + "county": "Monroe" + }, + { + "zip_code": 24954, + "latitude": 38.258638, + "longitude": -80.104625, + "city": "Marlinton", + "state": "WV", + "county": "Pocahontas" + }, + { + "zip_code": 24957, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Maxwelton", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24958, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Meadow Bluff", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24961, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Neola", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24962, + "latitude": 37.648541, + "longitude": -80.877395, + "city": "Pence Springs", + "state": "WV", + "county": "Summers" + }, + { + "zip_code": 24963, + "latitude": 37.399956, + "longitude": -80.797806, + "city": "Peterstown", + "state": "WV", + "county": "Monroe" + }, + { + "zip_code": 24966, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Renick", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24970, + "latitude": 37.744709, + "longitude": -80.454189, + "city": "Ronceverte", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24974, + "latitude": 37.552029, + "longitude": -80.539672, + "city": "Secondcreek", + "state": "WV", + "county": "Monroe" + }, + { + "zip_code": 24976, + "latitude": 37.552029, + "longitude": -80.539672, + "city": "Sinks Grove", + "state": "WV", + "county": "Monroe" + }, + { + "zip_code": 24977, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Smoot", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24981, + "latitude": 37.648541, + "longitude": -80.877395, + "city": "Talcott", + "state": "WV", + "county": "Summers" + }, + { + "zip_code": 24983, + "latitude": 37.552029, + "longitude": -80.539672, + "city": "Union", + "state": "WV", + "county": "Monroe" + }, + { + "zip_code": 24984, + "latitude": 37.489872, + "longitude": -80.420487, + "city": "Waiteville", + "state": "WV", + "county": "Monroe" + }, + { + "zip_code": 24985, + "latitude": 37.552029, + "longitude": -80.539672, + "city": "Wayside", + "state": "WV", + "county": "Monroe" + }, + { + "zip_code": 24986, + "latitude": 37.782726, + "longitude": -80.312877, + "city": "White Sulphur Springs", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24991, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Williamsburg", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 24993, + "latitude": 37.552029, + "longitude": -80.539672, + "city": "Wolfcreek", + "state": "WV", + "county": "Monroe" + }, + { + "zip_code": 25002, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Alloy", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25003, + "latitude": 38.243675, + "longitude": -81.771226, + "city": "Alum Creek", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25004, + "latitude": 37.784459, + "longitude": -81.118491, + "city": "Ameagle", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25005, + "latitude": 38.591037, + "longitude": -81.273681, + "city": "Amma", + "state": "WV", + "county": "Roane" + }, + { + "zip_code": 25007, + "latitude": 37.82156, + "longitude": -81.409586, + "city": "Arnett", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25008, + "latitude": 37.940013, + "longitude": -81.354496, + "city": "Artie", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25009, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Ashford", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25010, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Bald Knob", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25011, + "latitude": 38.508559, + "longitude": -81.841002, + "city": "Bancroft", + "state": "WV", + "county": "Putnam" + }, + { + "zip_code": 25015, + "latitude": 38.232406, + "longitude": -81.502399, + "city": "Belle", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25018, + "latitude": 38.465777, + "longitude": -81.050662, + "city": "Bentree", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25019, + "latitude": 38.465777, + "longitude": -81.050662, + "city": "Bickmore", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25021, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Bim", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25022, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Blair", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25024, + "latitude": 38.154021, + "longitude": -81.630599, + "city": "Bloomingrose", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25025, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Blount", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25026, + "latitude": 38.490789, + "longitude": -81.392845, + "city": "Blue Creek", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25028, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Bob White", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25030, + "latitude": 38.387998, + "longitude": -81.254838, + "city": "Bomont", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25031, + "latitude": 38.163248, + "longitude": -81.307528, + "city": "Boomer", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25033, + "latitude": 38.610603, + "longitude": -81.924758, + "city": "Buffalo", + "state": "WV", + "county": "Putnam" + }, + { + "zip_code": 25035, + "latitude": 38.193014, + "longitude": -81.498415, + "city": "Cabin Creek", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25036, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Cannelton", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25039, + "latitude": 38.279199, + "longitude": -81.59823, + "city": "Cedar Grove", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25040, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Charlton Heights", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25043, + "latitude": 38.467298, + "longitude": -81.080031, + "city": "Clay", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25044, + "latitude": 37.880406, + "longitude": -81.408766, + "city": "Clear Creek", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25045, + "latitude": 38.453862, + "longitude": -81.357213, + "city": "Clendenin", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25046, + "latitude": 38.731737, + "longitude": -81.314633, + "city": "Clio", + "state": "WV", + "county": "Roane" + }, + { + "zip_code": 25047, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Clothier", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25048, + "latitude": 37.942986, + "longitude": -81.402075, + "city": "Colcord", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25049, + "latitude": 38.126494, + "longitude": -81.607191, + "city": "Comfort", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25051, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Costa", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25053, + "latitude": 38.01946, + "longitude": -81.885268, + "city": "Danville", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25054, + "latitude": 38.073666, + "longitude": -81.451066, + "city": "Dawes", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25057, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Deep Water", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25059, + "latitude": 38.254945, + "longitude": -81.217588, + "city": "Dixie", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 25060, + "latitude": 37.949132, + "longitude": -81.444561, + "city": "Dorothy", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25061, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Drybranch", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25062, + "latitude": 37.854572, + "longitude": -81.453786, + "city": "Dry Creek", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25063, + "latitude": 38.582138, + "longitude": -80.936783, + "city": "Duck", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25064, + "latitude": 38.348822, + "longitude": -81.570048, + "city": "Dunbar", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25067, + "latitude": 38.209887, + "longitude": -81.438053, + "city": "East Bank", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25070, + "latitude": 38.543573, + "longitude": -81.941425, + "city": "Eleanor", + "state": "WV", + "county": "Putnam" + }, + { + "zip_code": 25071, + "latitude": 38.386942, + "longitude": -81.450424, + "city": "Elkview", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25075, + "latitude": 38.178047, + "longitude": -81.615909, + "city": "Eskdale", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25076, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Ethel", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25079, + "latitude": 38.495072, + "longitude": -81.398422, + "city": "Falling Rock", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25081, + "latitude": 38.072562, + "longitude": -81.825259, + "city": "Foster", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25082, + "latitude": 38.560972, + "longitude": -82.022361, + "city": "Fraziers Bottom", + "state": "WV", + "county": "Putnam" + }, + { + "zip_code": 25083, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Gallagher", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25085, + "latitude": 38.156166, + "longitude": -81.174906, + "city": "Gauley Bridge", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25086, + "latitude": 38.215547, + "longitude": -81.406705, + "city": "Glasgow", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25088, + "latitude": 38.465777, + "longitude": -81.050662, + "city": "Glen", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25090, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Glen Ferris", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25093, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Gordon", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25095, + "latitude": 38.752312, + "longitude": -81.997278, + "city": "Grimms Landing", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25102, + "latitude": 38.187888, + "longitude": -81.3657, + "city": "Handley", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25103, + "latitude": 38.207048, + "longitude": -81.39286, + "city": "Hansford", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25106, + "latitude": 38.833117, + "longitude": -82.138543, + "city": "Henderson", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25107, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Hernshaw", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25108, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Hewett", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25109, + "latitude": 38.475369, + "longitude": -81.880455, + "city": "Hometown", + "state": "WV", + "county": "Putnam" + }, + { + "zip_code": 25110, + "latitude": 38.21097, + "longitude": -81.388446, + "city": "Hugheston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25111, + "latitude": 38.465777, + "longitude": -81.050662, + "city": "Indore", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25112, + "latitude": 38.282497, + "longitude": -81.56514, + "city": "Institute", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25113, + "latitude": 38.465777, + "longitude": -81.050662, + "city": "Ivydale", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25114, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Jeffrey", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25115, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Kanawha Falls", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25118, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Kimberly", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25119, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Kincaid", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25121, + "latitude": 37.920381, + "longitude": -81.903389, + "city": "Lake", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25122, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Leewood", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25123, + "latitude": 38.704805, + "longitude": -81.914474, + "city": "Leon", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25124, + "latitude": 38.475369, + "longitude": -81.880455, + "city": "Liberty", + "state": "WV", + "county": "Putnam" + }, + { + "zip_code": 25125, + "latitude": 38.334726, + "longitude": -81.198102, + "city": "Lizemores", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25126, + "latitude": 38.195983, + "longitude": -81.371367, + "city": "London", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25130, + "latitude": 38.063165, + "longitude": -81.818718, + "city": "Madison", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25132, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Mammoth", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25133, + "latitude": 38.465777, + "longitude": -81.050662, + "city": "Maysel", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25134, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Miami", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25136, + "latitude": 38.172523, + "longitude": -81.322175, + "city": "Montgomery", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25139, + "latitude": 38.139916, + "longitude": -81.29309, + "city": "Mount Carbon", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25140, + "latitude": 37.877222, + "longitude": -81.481192, + "city": "Naoma", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25141, + "latitude": 38.465777, + "longitude": -81.050662, + "city": "Nebo", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25142, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Nellis", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25143, + "latitude": 38.323042, + "longitude": -81.616124, + "city": "Nitro", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25147, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Ohley", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25148, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Orgas", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25149, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Ottawa", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25150, + "latitude": 38.465777, + "longitude": -81.050662, + "city": "Ovapa", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25152, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Page", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25154, + "latitude": 38.136924, + "longitude": -81.679052, + "city": "Peytona", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25156, + "latitude": 38.401962, + "longitude": -81.461063, + "city": "Pinch", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25159, + "latitude": 38.479147, + "longitude": -81.783795, + "city": "Poca", + "state": "WV", + "county": "Putnam" + }, + { + "zip_code": 25160, + "latitude": 38.290746, + "longitude": -81.277293, + "city": "Pond Gap", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25161, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Powellton", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25162, + "latitude": 38.210104, + "longitude": -81.385107, + "city": "Pratt", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25164, + "latitude": 38.491236, + "longitude": -81.198904, + "city": "Procious", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25165, + "latitude": 38.140996, + "longitude": -81.658829, + "city": "Racine", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25168, + "latitude": 38.555097, + "longitude": -81.901394, + "city": "Red House", + "state": "WV", + "county": "Putnam" + }, + { + "zip_code": 25169, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Ridgeview", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25173, + "latitude": 38.076677, + "longitude": -81.237015, + "city": "Robson", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25174, + "latitude": 37.854721, + "longitude": -81.418351, + "city": "Rock Creek", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25177, + "latitude": 38.31461, + "longitude": -81.636926, + "city": "Saint Albans", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25180, + "latitude": 37.793057, + "longitude": -81.384755, + "city": "Saxon", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25181, + "latitude": 38.085024, + "longitude": -81.622894, + "city": "Seth", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25182, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Sharon", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25183, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Sharples", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25185, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Mount Olive", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25186, + "latitude": 38.154338, + "longitude": -81.278012, + "city": "Smithers", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25187, + "latitude": 38.725035, + "longitude": -82.027474, + "city": "Southside", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25193, + "latitude": 38.010386, + "longitude": -81.558467, + "city": "Sylvester", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25201, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Tad", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25202, + "latitude": 38.332069, + "longitude": -81.8563, + "city": "Tornado", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25203, + "latitude": 37.986266, + "longitude": -81.942704, + "city": "Turtle Creek", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25204, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Twilight", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25205, + "latitude": 38.042839, + "longitude": -81.805265, + "city": "Uneeda", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25206, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Van", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25208, + "latitude": 37.997105, + "longitude": -81.71704, + "city": "Wharton", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25209, + "latitude": 37.991591, + "longitude": -81.542234, + "city": "Whitesville", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25211, + "latitude": 38.465777, + "longitude": -81.050662, + "city": "Widen", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25213, + "latitude": 38.50099, + "longitude": -81.914048, + "city": "Winfield", + "state": "WV", + "county": "Putnam" + }, + { + "zip_code": 25214, + "latitude": 38.18983, + "longitude": -81.565648, + "city": "Winifrede", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25231, + "latitude": 38.824924, + "longitude": -81.70665, + "city": "Advent", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 25234, + "latitude": 38.828582, + "longitude": -81.132151, + "city": "Arnoldsburg", + "state": "WV", + "county": "Calhoun" + }, + { + "zip_code": 25235, + "latitude": 38.828582, + "longitude": -81.132151, + "city": "Chloe", + "state": "WV", + "county": "Calhoun" + }, + { + "zip_code": 25239, + "latitude": 38.848369, + "longitude": -81.847298, + "city": "Cottageville", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 25241, + "latitude": 38.796245, + "longitude": -81.807118, + "city": "Evans", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 25243, + "latitude": 38.683119, + "longitude": -81.453016, + "city": "Gandeeville", + "state": "WV", + "county": "Roane" + }, + { + "zip_code": 25244, + "latitude": 38.824924, + "longitude": -81.70665, + "city": "Gay", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 25245, + "latitude": 38.70697, + "longitude": -81.722296, + "city": "Given", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 25247, + "latitude": 38.752312, + "longitude": -81.997278, + "city": "Hartford", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25248, + "latitude": 38.623155, + "longitude": -81.621667, + "city": "Kenna", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 25250, + "latitude": 38.752312, + "longitude": -81.997278, + "city": "Lakin", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25251, + "latitude": 38.731737, + "longitude": -81.314633, + "city": "Left Hand", + "state": "WV", + "county": "Roane" + }, + { + "zip_code": 25252, + "latitude": 38.824924, + "longitude": -81.70665, + "city": "Le Roy", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 25253, + "latitude": 38.989085, + "longitude": -81.951871, + "city": "Letart", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25256, + "latitude": 38.731737, + "longitude": -81.314633, + "city": "Linden", + "state": "WV", + "county": "Roane" + }, + { + "zip_code": 25258, + "latitude": 38.913649, + "longitude": -80.831256, + "city": "Lockney", + "state": "WV", + "county": "Gilmer" + }, + { + "zip_code": 25259, + "latitude": 38.696744, + "longitude": -81.233061, + "city": "Looneyville", + "state": "WV", + "county": "Roane" + }, + { + "zip_code": 25260, + "latitude": 39.011467, + "longitude": -82.016935, + "city": "Mason", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25261, + "latitude": 38.828582, + "longitude": -81.132151, + "city": "Millstone", + "state": "WV", + "county": "Calhoun" + }, + { + "zip_code": 25262, + "latitude": 38.905595, + "longitude": -81.835048, + "city": "Millwood", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 25264, + "latitude": 38.824924, + "longitude": -81.70665, + "city": "Mount Alto", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 25265, + "latitude": 38.986319, + "longitude": -81.965175, + "city": "New Haven", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25266, + "latitude": 38.731737, + "longitude": -81.314633, + "city": "Newton", + "state": "WV", + "county": "Roane" + }, + { + "zip_code": 25267, + "latitude": 38.913649, + "longitude": -80.831256, + "city": "Normantown", + "state": "WV", + "county": "Gilmer" + }, + { + "zip_code": 25268, + "latitude": 38.828582, + "longitude": -81.132151, + "city": "Orma", + "state": "WV", + "county": "Calhoun" + }, + { + "zip_code": 25270, + "latitude": 38.888886, + "longitude": -81.439879, + "city": "Reedy", + "state": "WV", + "county": "Roane" + }, + { + "zip_code": 25271, + "latitude": 38.791845, + "longitude": -81.728065, + "city": "Ripley", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 25275, + "latitude": 38.889106, + "longitude": -81.682596, + "city": "Sandyville", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 25276, + "latitude": 38.777675, + "longitude": -81.364262, + "city": "Spencer", + "state": "WV", + "county": "Roane" + }, + { + "zip_code": 25279, + "latitude": 38.824924, + "longitude": -81.70665, + "city": "Statts Mills", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 25281, + "latitude": 38.731737, + "longitude": -81.314633, + "city": "Tariff", + "state": "WV", + "county": "Roane" + }, + { + "zip_code": 25283, + "latitude": 38.465777, + "longitude": -81.050662, + "city": "Valley Fork", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25285, + "latitude": 38.465777, + "longitude": -81.050662, + "city": "Wallback", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 25286, + "latitude": 38.608737, + "longitude": -81.419262, + "city": "Walton", + "state": "WV", + "county": "Roane" + }, + { + "zip_code": 25287, + "latitude": 38.752312, + "longitude": -81.997278, + "city": "West Columbia", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25301, + "latitude": 38.328948, + "longitude": -81.605094, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25302, + "latitude": 38.401498, + "longitude": -81.584087, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25303, + "latitude": 38.352946, + "longitude": -81.658246, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25304, + "latitude": 38.305728, + "longitude": -81.595903, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25305, + "latitude": 38.335798, + "longitude": -81.612344, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25306, + "latitude": 38.317499, + "longitude": -81.527433, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25309, + "latitude": 38.310767, + "longitude": -81.756808, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25311, + "latitude": 38.371957, + "longitude": -81.632845, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25312, + "latitude": 38.455865, + "longitude": -81.637823, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25313, + "latitude": 38.414156, + "longitude": -81.758172, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25314, + "latitude": 38.32925, + "longitude": -81.665927, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25315, + "latitude": 38.235149, + "longitude": -81.553608, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25317, + "latitude": 38.335647, + "longitude": -81.613794, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25320, + "latitude": 38.542798, + "longitude": -81.633378, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25321, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25322, + "latitude": 38.534661, + "longitude": -81.56035, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25323, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25324, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25325, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25326, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25327, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25328, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25329, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25330, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25331, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25332, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25333, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25334, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25335, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25336, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25337, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25338, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25339, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25350, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25356, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25357, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25358, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25360, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25361, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25362, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25364, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25365, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25375, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25387, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25389, + "latitude": 38.354041, + "longitude": -81.639389, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25392, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25396, + "latitude": 38.296818, + "longitude": -81.554655, + "city": "Charleston", + "state": "WV", + "county": "Kanawha" + }, + { + "zip_code": 25401, + "latitude": 39.444061, + "longitude": -77.951924, + "city": "Martinsburg", + "state": "WV", + "county": "Berkeley" + }, + { + "zip_code": 25402, + "latitude": 39.461663, + "longitude": -78.011472, + "city": "Martinsburg", + "state": "WV", + "county": "Berkeley" + }, + { + "zip_code": 25410, + "latitude": 39.315914, + "longitude": -77.877223, + "city": "Bakerton", + "state": "WV", + "county": "Jefferson" + }, + { + "zip_code": 25411, + "latitude": 39.552557, + "longitude": -78.18773, + "city": "Berkeley Springs", + "state": "WV", + "county": "Morgan" + }, + { + "zip_code": 25413, + "latitude": 39.377876, + "longitude": -78.064925, + "city": "Bunker Hill", + "state": "WV", + "county": "Berkeley" + }, + { + "zip_code": 25414, + "latitude": 39.313538, + "longitude": -77.860278, + "city": "Charles Town", + "state": "WV", + "county": "Jefferson" + }, + { + "zip_code": 25419, + "latitude": 39.572966, + "longitude": -77.882155, + "city": "Falling Waters", + "state": "WV", + "county": "Berkeley" + }, + { + "zip_code": 25420, + "latitude": 39.384529, + "longitude": -78.102777, + "city": "Gerrardstown", + "state": "WV", + "county": "Berkeley" + }, + { + "zip_code": 25421, + "latitude": 39.381345, + "longitude": -78.143466, + "city": "Glengary", + "state": "WV", + "county": "Berkeley" + }, + { + "zip_code": 25422, + "latitude": 39.612559, + "longitude": -78.391552, + "city": "Great Cacapon", + "state": "WV", + "county": "Morgan" + }, + { + "zip_code": 25423, + "latitude": 39.315914, + "longitude": -77.877223, + "city": "Halltown", + "state": "WV", + "county": "Jefferson" + }, + { + "zip_code": 25425, + "latitude": 39.314617, + "longitude": -77.789387, + "city": "Harpers Ferry", + "state": "WV", + "county": "Jefferson" + }, + { + "zip_code": 25427, + "latitude": 39.485043, + "longitude": -78.034659, + "city": "Hedgesville", + "state": "WV", + "county": "Berkeley" + }, + { + "zip_code": 25428, + "latitude": 39.362373, + "longitude": -78.033065, + "city": "Inwood", + "state": "WV", + "county": "Berkeley" + }, + { + "zip_code": 25429, + "latitude": 39.349586, + "longitude": -77.878957, + "city": "Kearneysville", + "state": "WV", + "county": "Jefferson" + }, + { + "zip_code": 25430, + "latitude": 39.344424, + "longitude": -77.941833, + "city": "Kearneysville", + "state": "WV", + "county": "Jefferson" + }, + { + "zip_code": 25431, + "latitude": 39.314071, + "longitude": -78.659428, + "city": "Levels", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 25432, + "latitude": 39.315914, + "longitude": -77.877223, + "city": "Millville", + "state": "WV", + "county": "Jefferson" + }, + { + "zip_code": 25434, + "latitude": 39.530566, + "longitude": -78.45729, + "city": "Paw Paw", + "state": "WV", + "county": "Morgan" + }, + { + "zip_code": 25437, + "latitude": 39.314071, + "longitude": -78.659428, + "city": "Points", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 25438, + "latitude": 39.26006, + "longitude": -77.831031, + "city": "Ranson", + "state": "WV", + "county": "Jefferson" + }, + { + "zip_code": 25440, + "latitude": 39.442661, + "longitude": -78.02628, + "city": "Ridgeway", + "state": "WV", + "county": "Berkeley" + }, + { + "zip_code": 25441, + "latitude": 39.315914, + "longitude": -77.877223, + "city": "Rippon", + "state": "WV", + "county": "Jefferson" + }, + { + "zip_code": 25442, + "latitude": 39.371605, + "longitude": -77.822878, + "city": "Shenandoah Junction", + "state": "WV", + "county": "Jefferson" + }, + { + "zip_code": 25443, + "latitude": 39.389587, + "longitude": -77.838337, + "city": "Shepherdstown", + "state": "WV", + "county": "Jefferson" + }, + { + "zip_code": 25444, + "latitude": 39.34125, + "longitude": -78.754473, + "city": "Slanesville", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 25446, + "latitude": 39.224095, + "longitude": -77.878788, + "city": "Summit Point", + "state": "WV", + "county": "Jefferson" + }, + { + "zip_code": 25501, + "latitude": 38.167112, + "longitude": -81.968862, + "city": "Alkol", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25502, + "latitude": 38.657528, + "longitude": -82.10679, + "city": "Apple Grove", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25503, + "latitude": 38.60323, + "longitude": -82.112281, + "city": "Ashton", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25504, + "latitude": 38.379347, + "longitude": -82.264954, + "city": "Barboursville", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25505, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Big Creek", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25506, + "latitude": 38.219908, + "longitude": -82.145897, + "city": "Branchland", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25507, + "latitude": 38.384557, + "longitude": -82.557785, + "city": "Ceredo", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25508, + "latitude": 37.96087, + "longitude": -82.01076, + "city": "Chapmanville", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25510, + "latitude": 38.426471, + "longitude": -82.110405, + "city": "Culloden", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25511, + "latitude": 38.132114, + "longitude": -82.418277, + "city": "Dunlow", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25512, + "latitude": 38.271293, + "longitude": -82.376703, + "city": "East Lynn", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25514, + "latitude": 38.072978, + "longitude": -82.539781, + "city": "Fort Gay", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25515, + "latitude": 38.738211, + "longitude": -82.155965, + "city": "Gallipolis Ferry", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25517, + "latitude": 38.132114, + "longitude": -82.418277, + "city": "Genoa", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25519, + "latitude": 38.132114, + "longitude": -82.418277, + "city": "Glenhayes", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25520, + "latitude": 38.590868, + "longitude": -82.177263, + "city": "Glenwood", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25521, + "latitude": 38.246211, + "longitude": -81.960658, + "city": "Griffithsville", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25523, + "latitude": 38.280522, + "longitude": -82.083145, + "city": "Hamlin", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25524, + "latitude": 38.034057, + "longitude": -82.100836, + "city": "Harts", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25526, + "latitude": 38.397097, + "longitude": -81.961657, + "city": "Hurricane", + "state": "WV", + "county": "Putnam" + }, + { + "zip_code": 25529, + "latitude": 38.146531, + "longitude": -81.86073, + "city": "Julian", + "state": "WV", + "county": "Boone" + }, + { + "zip_code": 25530, + "latitude": 38.356931, + "longitude": -82.525529, + "city": "Kenova", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25534, + "latitude": 38.132114, + "longitude": -82.418277, + "city": "Kiahsville", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25535, + "latitude": 38.299465, + "longitude": -82.457353, + "city": "Lavalette", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25537, + "latitude": 38.523488, + "longitude": -82.255114, + "city": "Lesage", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25540, + "latitude": 38.16021, + "longitude": -82.054088, + "city": "Midkiff", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25541, + "latitude": 38.434487, + "longitude": -82.134925, + "city": "Milton", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25544, + "latitude": 38.222163, + "longitude": -82.113554, + "city": "Myra", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25545, + "latitude": 38.456541, + "longitude": -82.234177, + "city": "Ona", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25547, + "latitude": 37.955852, + "longitude": -82.005372, + "city": "Pecks Mill", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25550, + "latitude": 38.871527, + "longitude": -82.098592, + "city": "Point Pleasant", + "state": "WV", + "county": "Mason" + }, + { + "zip_code": 25555, + "latitude": 38.240005, + "longitude": -82.565378, + "city": "Prichard", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25557, + "latitude": 38.082564, + "longitude": -82.072502, + "city": "Ranger", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25559, + "latitude": 38.317827, + "longitude": -82.22918, + "city": "Salt Rock", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25560, + "latitude": 38.450355, + "longitude": -81.896554, + "city": "Scott Depot", + "state": "WV", + "county": "Putnam" + }, + { + "zip_code": 25562, + "latitude": 38.343176, + "longitude": -82.490494, + "city": "Shoals", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25564, + "latitude": 38.255874, + "longitude": -81.890954, + "city": "Sod", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25565, + "latitude": 38.105713, + "longitude": -82.027154, + "city": "Spurlockville", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25567, + "latitude": 38.228049, + "longitude": -81.870544, + "city": "Sumerco", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25569, + "latitude": 38.475369, + "longitude": -81.880455, + "city": "Teays", + "state": "WV", + "county": "Putnam" + }, + { + "zip_code": 25570, + "latitude": 38.222206, + "longitude": -82.418862, + "city": "Wayne", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25571, + "latitude": 38.299231, + "longitude": -82.153237, + "city": "West Hamlin", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25572, + "latitude": 38.187456, + "longitude": -81.901236, + "city": "Woodville", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25573, + "latitude": 38.231798, + "longitude": -81.942329, + "city": "Yawkey", + "state": "WV", + "county": "Lincoln" + }, + { + "zip_code": 25601, + "latitude": 37.865036, + "longitude": -82.025158, + "city": "Logan", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25606, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Accoville", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25607, + "latitude": 37.795916, + "longitude": -81.783341, + "city": "Amherstdale", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25608, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Baisden", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25611, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Bruno", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25612, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Chauncey", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25614, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Cora", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25617, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Davin", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25621, + "latitude": 37.636568, + "longitude": -81.950082, + "city": "Gilbert", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25623, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Hampden", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25624, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Henlawson", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25625, + "latitude": 37.829956, + "longitude": -82.058464, + "city": "Holden", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25628, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Kistler", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25630, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Lorado", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25632, + "latitude": 37.765557, + "longitude": -81.921698, + "city": "Lyburn", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25634, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Mallory", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25635, + "latitude": 37.735653, + "longitude": -81.875358, + "city": "Man", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25636, + "latitude": 37.821927, + "longitude": -82.006203, + "city": "Monaville", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25637, + "latitude": 37.84639, + "longitude": -82.048494, + "city": "Mount Gay", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25638, + "latitude": 37.741593, + "longitude": -82.003139, + "city": "Omar", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25639, + "latitude": 37.875177, + "longitude": -81.982637, + "city": "Peach Creek", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25644, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Sarah Ann", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25645, + "latitude": 37.833204, + "longitude": -81.902401, + "city": "Stirrat", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25646, + "latitude": 37.830256, + "longitude": -81.963853, + "city": "Stollings", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25647, + "latitude": 37.784635, + "longitude": -81.990849, + "city": "Switzer", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25649, + "latitude": 37.88911, + "longitude": -82.048823, + "city": "Verdunville", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25650, + "latitude": 37.637348, + "longitude": -81.875714, + "city": "Verner", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25651, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Wharncliffe", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25652, + "latitude": 37.803545, + "longitude": -82.046594, + "city": "Whitman", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25653, + "latitude": 37.808204, + "longitude": -82.053011, + "city": "Wilkinson", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25654, + "latitude": 37.781792, + "longitude": -81.891965, + "city": "Yolyn", + "state": "WV", + "county": "Logan" + }, + { + "zip_code": 25661, + "latitude": 37.702526, + "longitude": -82.26002, + "city": "Williamson", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25665, + "latitude": 37.721351, + "longitude": -82.30835, + "city": "Borderland", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25666, + "latitude": 37.926178, + "longitude": -82.270292, + "city": "Breeden", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25667, + "latitude": 37.704739, + "longitude": -82.273892, + "city": "Chattaroy", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25669, + "latitude": 38.132114, + "longitude": -82.418277, + "city": "Crum", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25670, + "latitude": 37.718871, + "longitude": -82.193059, + "city": "Delbarton", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25671, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Dingess", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25672, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Edgarton", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25674, + "latitude": 37.827155, + "longitude": -82.404906, + "city": "Kermit", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25676, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Lenore", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25678, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Matewan", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25682, + "latitude": 37.6224, + "longitude": -82.008561, + "city": "Meador", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25685, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Naugatuck", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25686, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Newtown", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25687, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Nolan", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25688, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "North Matewan", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25690, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Ragland", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25691, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Rawl", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25692, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Red Jacket", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25694, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Thacker", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25696, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Varney", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25697, + "latitude": 37.743063, + "longitude": -82.10801, + "city": "Vulcan", + "state": "WV", + "county": "Mingo" + }, + { + "zip_code": 25699, + "latitude": 38.132114, + "longitude": -82.418277, + "city": "Wilsondale", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25701, + "latitude": 38.371727, + "longitude": -82.412866, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25702, + "latitude": 38.444067, + "longitude": -82.34872, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25703, + "latitude": 38.422801, + "longitude": -82.413818, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25704, + "latitude": 38.397571, + "longitude": -82.477733, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25705, + "latitude": 38.406124, + "longitude": -82.359088, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25706, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25707, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25708, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25709, + "latitude": 38.132114, + "longitude": -82.418277, + "city": "Huntington", + "state": "WV", + "county": "Wayne" + }, + { + "zip_code": 25710, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25711, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25712, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25713, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25714, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25715, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25716, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25717, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25718, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25719, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25720, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25721, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25722, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25723, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25724, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25725, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25726, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25727, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25728, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25729, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25755, + "latitude": 38.422115, + "longitude": -82.431667, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25770, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25771, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25772, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25773, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25774, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25775, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25776, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25777, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25778, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25779, + "latitude": 38.413384, + "longitude": -82.277401, + "city": "Huntington", + "state": "WV", + "county": "Cabell" + }, + { + "zip_code": 25801, + "latitude": 37.767248, + "longitude": -81.216446, + "city": "Beckley", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25802, + "latitude": 37.748935, + "longitude": -81.224458, + "city": "Beckley", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25810, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Allen Junction", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 25811, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Amigo", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 25812, + "latitude": 38.135025, + "longitude": -81.087871, + "city": "Ansted", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25813, + "latitude": 37.753437, + "longitude": -81.1973, + "city": "Beaver", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25816, + "latitude": 37.735161, + "longitude": -81.136328, + "city": "Blue Jay", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25817, + "latitude": 37.774581, + "longitude": -81.388107, + "city": "Bolt", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25818, + "latitude": 37.862613, + "longitude": -81.200997, + "city": "Bradley", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25820, + "latitude": 37.509522, + "longitude": -81.099605, + "city": "Camp Creek", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 25823, + "latitude": 37.670797, + "longitude": -81.174872, + "city": "Coal City", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25825, + "latitude": 37.665456, + "longitude": -81.093339, + "city": "Cool Ridge", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25826, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Corinne", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 25827, + "latitude": 37.700567, + "longitude": -81.201446, + "city": "Crab Orchard", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25831, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Danese", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25832, + "latitude": 37.693341, + "longitude": -81.216077, + "city": "Daniels", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25833, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Dothan", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25836, + "latitude": 37.779232, + "longitude": -81.263538, + "city": "Eccles", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25837, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Edmond", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25839, + "latitude": 37.768902, + "longitude": -81.371602, + "city": "Fairdale", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25840, + "latitude": 38.063982, + "longitude": -81.094259, + "city": "Fayetteville", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25841, + "latitude": 37.554091, + "longitude": -81.100627, + "city": "Flat Top", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 25843, + "latitude": 37.679167, + "longitude": -81.151526, + "city": "Ghent", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25844, + "latitude": 37.825085, + "longitude": -81.38583, + "city": "Glen Daniel", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25845, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Glen Fork", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 25846, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Glen Jean", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25847, + "latitude": 37.713406, + "longitude": -81.178779, + "city": "Glen Morgan", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25848, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Glen Rogers", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 25849, + "latitude": 37.730624, + "longitude": -81.279864, + "city": "Glen White", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25851, + "latitude": 37.802469, + "longitude": -81.282759, + "city": "Harper", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25853, + "latitude": 37.748935, + "longitude": -81.224458, + "city": "Helen", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25854, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Hico", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25855, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Hilltop", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25856, + "latitude": 37.647885, + "longitude": -81.190628, + "city": "Jonben", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25857, + "latitude": 37.631543, + "longitude": -81.227631, + "city": "Josephine", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25859, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Kilsyth", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25860, + "latitude": 37.748935, + "longitude": -81.224458, + "city": "Lanark", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25862, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Lansing", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25864, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Layland", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25865, + "latitude": 37.73121, + "longitude": -81.317326, + "city": "Lester", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25866, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Lochgelly", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25868, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Lookout", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25870, + "latitude": 37.610803, + "longitude": -81.505936, + "city": "Maben", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 25871, + "latitude": 37.770012, + "longitude": -81.210253, + "city": "Mabscott", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25873, + "latitude": 37.7517, + "longitude": -81.214825, + "city": "Mac Arthur", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25875, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Mc Graws", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 25876, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Saulsville", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 25878, + "latitude": 37.717052, + "longitude": -81.240023, + "city": "Midway", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25879, + "latitude": 37.975773, + "longitude": -81.114993, + "city": "Minden", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25880, + "latitude": 38.00309, + "longitude": -81.19331, + "city": "Mount Hope", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25882, + "latitude": 37.582143, + "longitude": -81.413815, + "city": "Mullens", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 25901, + "latitude": 37.959435, + "longitude": -81.15848, + "city": "Oak Hill", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25902, + "latitude": 37.596319, + "longitude": -81.190678, + "city": "Odd", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25904, + "latitude": 37.91101, + "longitude": -81.264824, + "city": "Pax", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25906, + "latitude": 37.837573, + "longitude": -81.128631, + "city": "Piney View", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25907, + "latitude": 37.853198, + "longitude": -81.081717, + "city": "Prince", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25908, + "latitude": 37.715831, + "longitude": -81.246754, + "city": "Princewick", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25909, + "latitude": 37.838147, + "longitude": -81.200383, + "city": "Prosperity", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25911, + "latitude": 37.758469, + "longitude": -81.167549, + "city": "Raleigh", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25912, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Ramsey", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25913, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Ravencliff", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 25914, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Redstar", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25915, + "latitude": 37.625414, + "longitude": -81.27493, + "city": "Rhodell", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25916, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Sabine", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 25917, + "latitude": 37.948765, + "longitude": -81.15307, + "city": "Scarbro", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25918, + "latitude": 37.741625, + "longitude": -81.014915, + "city": "Shady Spring", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25919, + "latitude": 37.800481, + "longitude": -81.180561, + "city": "Skelton", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25920, + "latitude": 37.717933, + "longitude": -81.37157, + "city": "Slab Fork", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25921, + "latitude": 37.777244, + "longitude": -81.345004, + "city": "Sophia", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25922, + "latitude": 37.460452, + "longitude": -81.112799, + "city": "Spanishburg", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 25926, + "latitude": 37.787252, + "longitude": -81.195122, + "city": "Sprague", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25927, + "latitude": 37.748935, + "longitude": -81.224458, + "city": "Stanaford", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25928, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Stephenson", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 25931, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Summerlee", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25932, + "latitude": 37.764228, + "longitude": -81.221724, + "city": "Surveyor", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25934, + "latitude": 37.848955, + "longitude": -81.093678, + "city": "Terry", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 25936, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Thurmond", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25938, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Victor", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25942, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Winona", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25943, + "latitude": 37.603344, + "longitude": -81.53998, + "city": "Wyco", + "state": "WV", + "county": "Wyoming" + }, + { + "zip_code": 25951, + "latitude": 37.645544, + "longitude": -80.864634, + "city": "Hinton", + "state": "WV", + "county": "Summers" + }, + { + "zip_code": 25958, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Charmco", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 25961, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Crichton", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 25962, + "latitude": 37.973212, + "longitude": -80.74519, + "city": "Rainelle", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 25965, + "latitude": 37.648541, + "longitude": -80.877395, + "city": "Elton", + "state": "WV", + "county": "Summers" + }, + { + "zip_code": 25966, + "latitude": 37.648541, + "longitude": -80.877395, + "city": "Green Sulphur Springs", + "state": "WV", + "county": "Summers" + }, + { + "zip_code": 25967, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Hines", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 25969, + "latitude": 37.648541, + "longitude": -80.877395, + "city": "Jumping Branch", + "state": "WV", + "county": "Summers" + }, + { + "zip_code": 25971, + "latitude": 37.416395, + "longitude": -81.105803, + "city": "Lerona", + "state": "WV", + "county": "Mercer" + }, + { + "zip_code": 25972, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Leslie", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 25976, + "latitude": 37.865186, + "longitude": -80.874366, + "city": "Meadow Bridge", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25977, + "latitude": 37.648541, + "longitude": -80.877395, + "city": "Meadow Creek", + "state": "WV", + "county": "Summers" + }, + { + "zip_code": 25978, + "latitude": 37.648541, + "longitude": -80.877395, + "city": "Nimitz", + "state": "WV", + "county": "Summers" + }, + { + "zip_code": 25979, + "latitude": 37.648541, + "longitude": -80.877395, + "city": "Pipestem", + "state": "WV", + "county": "Summers" + }, + { + "zip_code": 25981, + "latitude": 37.975595, + "longitude": -80.426874, + "city": "Quinwood", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 25984, + "latitude": 37.968468, + "longitude": -80.669597, + "city": "Rupert", + "state": "WV", + "county": "Greenbrier" + }, + { + "zip_code": 25985, + "latitude": 37.648541, + "longitude": -80.877395, + "city": "Sandstone", + "state": "WV", + "county": "Summers" + }, + { + "zip_code": 25986, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Spring Dale", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 25988, + "latitude": 37.648541, + "longitude": -80.877395, + "city": "True", + "state": "WV", + "county": "Summers" + }, + { + "zip_code": 25989, + "latitude": 37.684255, + "longitude": -81.048923, + "city": "White Oak", + "state": "WV", + "county": "Raleigh" + }, + { + "zip_code": 26003, + "latitude": 40.102703, + "longitude": -80.647599, + "city": "Wheeling", + "state": "WV", + "county": "Ohio" + }, + { + "zip_code": 26030, + "latitude": 40.225862, + "longitude": -80.65135, + "city": "Beech Bottom", + "state": "WV", + "county": "Brooke" + }, + { + "zip_code": 26031, + "latitude": 39.955349, + "longitude": -80.710507, + "city": "Benwood", + "state": "WV", + "county": "Marshall" + }, + { + "zip_code": 26032, + "latitude": 40.210727, + "longitude": -80.550337, + "city": "Bethany", + "state": "WV", + "county": "Brooke" + }, + { + "zip_code": 26033, + "latitude": 39.872322, + "longitude": -80.555275, + "city": "Cameron", + "state": "WV", + "county": "Marshall" + }, + { + "zip_code": 26034, + "latitude": 40.556137, + "longitude": -80.565784, + "city": "Chester", + "state": "WV", + "county": "Hancock" + }, + { + "zip_code": 26035, + "latitude": 40.373181, + "longitude": -80.566155, + "city": "Colliers", + "state": "WV", + "county": "Brooke" + }, + { + "zip_code": 26036, + "latitude": 40.015394, + "longitude": -80.550114, + "city": "Dallas", + "state": "WV", + "county": "Marshall" + }, + { + "zip_code": 26037, + "latitude": 40.335218, + "longitude": -80.570953, + "city": "Follansbee", + "state": "WV", + "county": "Brooke" + }, + { + "zip_code": 26038, + "latitude": 39.962545, + "longitude": -80.719815, + "city": "Glen Dale", + "state": "WV", + "county": "Marshall" + }, + { + "zip_code": 26039, + "latitude": 39.868737, + "longitude": -80.600655, + "city": "Glen Easton", + "state": "WV", + "county": "Marshall" + }, + { + "zip_code": 26040, + "latitude": 39.985905, + "longitude": -80.719565, + "city": "Mc Mechen", + "state": "WV", + "county": "Marshall" + }, + { + "zip_code": 26041, + "latitude": 39.916748, + "longitude": -80.737134, + "city": "Moundsville", + "state": "WV", + "county": "Marshall" + }, + { + "zip_code": 26047, + "latitude": 40.522005, + "longitude": -80.571689, + "city": "New Cumberland", + "state": "WV", + "county": "Hancock" + }, + { + "zip_code": 26050, + "latitude": 40.608776, + "longitude": -80.613199, + "city": "Newell", + "state": "WV", + "county": "Hancock" + }, + { + "zip_code": 26055, + "latitude": 39.877162, + "longitude": -80.694606, + "city": "Proctor", + "state": "WV", + "county": "Marshall" + }, + { + "zip_code": 26056, + "latitude": 40.516234, + "longitude": -80.592823, + "city": "New Manchester", + "state": "WV", + "county": "Hancock" + }, + { + "zip_code": 26058, + "latitude": 40.27932, + "longitude": -80.599949, + "city": "Short Creek", + "state": "WV", + "county": "Brooke" + }, + { + "zip_code": 26059, + "latitude": 40.081064, + "longitude": -80.59733, + "city": "Triadelphia", + "state": "WV", + "county": "Ohio" + }, + { + "zip_code": 26060, + "latitude": 40.078249, + "longitude": -80.589611, + "city": "Valley Grove", + "state": "WV", + "county": "Ohio" + }, + { + "zip_code": 26062, + "latitude": 40.507729, + "longitude": -80.565292, + "city": "Weirton", + "state": "WV", + "county": "Hancock" + }, + { + "zip_code": 26070, + "latitude": 40.293469, + "longitude": -80.594036, + "city": "Wellsburg", + "state": "WV", + "county": "Brooke" + }, + { + "zip_code": 26074, + "latitude": 40.169839, + "longitude": -80.595763, + "city": "West Liberty", + "state": "WV", + "county": "Ohio" + }, + { + "zip_code": 26075, + "latitude": 40.192679, + "longitude": -80.665879, + "city": "Windsor Heights", + "state": "WV", + "county": "Brooke" + }, + { + "zip_code": 26101, + "latitude": 39.286315, + "longitude": -81.55477, + "city": "Parkersburg", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26102, + "latitude": 39.218276, + "longitude": -81.497865, + "city": "Parkersburg", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26103, + "latitude": 39.236427, + "longitude": -81.540501, + "city": "Parkersburg", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26104, + "latitude": 39.28037, + "longitude": -81.493574, + "city": "Parkersburg", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26105, + "latitude": 39.324924, + "longitude": -81.538034, + "city": "Vienna", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26106, + "latitude": 39.218276, + "longitude": -81.497865, + "city": "Parkersburg", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26120, + "latitude": 39.218276, + "longitude": -81.497865, + "city": "Mineral Wells", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26121, + "latitude": 39.218276, + "longitude": -81.497865, + "city": "Mineral Wells", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26133, + "latitude": 39.155706, + "longitude": -81.736307, + "city": "Belleville", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26134, + "latitude": 39.375025, + "longitude": -81.263875, + "city": "Belmont", + "state": "WV", + "county": "Pleasants" + }, + { + "zip_code": 26135, + "latitude": 39.450612, + "longitude": -80.870081, + "city": "Bens Run", + "state": "WV", + "county": "Tyler" + }, + { + "zip_code": 26136, + "latitude": 38.828582, + "longitude": -81.132151, + "city": "Big Bend", + "state": "WV", + "county": "Calhoun" + }, + { + "zip_code": 26137, + "latitude": 38.828582, + "longitude": -81.132151, + "city": "Big Springs", + "state": "WV", + "county": "Calhoun" + }, + { + "zip_code": 26138, + "latitude": 39.040511, + "longitude": -81.371951, + "city": "Brohard", + "state": "WV", + "county": "Wirt" + }, + { + "zip_code": 26141, + "latitude": 39.040511, + "longitude": -81.371951, + "city": "Creston", + "state": "WV", + "county": "Wirt" + }, + { + "zip_code": 26142, + "latitude": 39.216011, + "longitude": -81.48079, + "city": "Davisville", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26143, + "latitude": 39.032058, + "longitude": -81.380692, + "city": "Elizabeth", + "state": "WV", + "county": "Wirt" + }, + { + "zip_code": 26146, + "latitude": 39.496137, + "longitude": -81.057241, + "city": "Friendly", + "state": "WV", + "county": "Tyler" + }, + { + "zip_code": 26147, + "latitude": 38.921782, + "longitude": -81.093773, + "city": "Grantsville", + "state": "WV", + "county": "Calhoun" + }, + { + "zip_code": 26148, + "latitude": 39.198501, + "longitude": -81.068913, + "city": "Macfarlan", + "state": "WV", + "county": "Ritchie" + }, + { + "zip_code": 26149, + "latitude": 39.494178, + "longitude": -80.907644, + "city": "Middlebourne", + "state": "WV", + "county": "Tyler" + }, + { + "zip_code": 26150, + "latitude": 39.189677, + "longitude": -81.513911, + "city": "Mineral Wells", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26151, + "latitude": 38.828582, + "longitude": -81.132151, + "city": "Mount Zion", + "state": "WV", + "county": "Calhoun" + }, + { + "zip_code": 26152, + "latitude": 39.040511, + "longitude": -81.371951, + "city": "Munday", + "state": "WV", + "county": "Wirt" + }, + { + "zip_code": 26155, + "latitude": 39.611459, + "longitude": -80.817928, + "city": "New Martinsville", + "state": "WV", + "county": "Wetzel" + }, + { + "zip_code": 26159, + "latitude": 39.606691, + "longitude": -80.929167, + "city": "Paden City", + "state": "WV", + "county": "Wetzel" + }, + { + "zip_code": 26160, + "latitude": 39.040511, + "longitude": -81.371951, + "city": "Palestine", + "state": "WV", + "county": "Wirt" + }, + { + "zip_code": 26161, + "latitude": 39.198501, + "longitude": -81.068913, + "city": "Petroleum", + "state": "WV", + "county": "Ritchie" + }, + { + "zip_code": 26162, + "latitude": 39.575518, + "longitude": -80.666712, + "city": "Porters Falls", + "state": "WV", + "county": "Wetzel" + }, + { + "zip_code": 26164, + "latitude": 38.98882, + "longitude": -81.713983, + "city": "Ravenswood", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 26167, + "latitude": 39.575518, + "longitude": -80.666712, + "city": "Reader", + "state": "WV", + "county": "Wetzel" + }, + { + "zip_code": 26169, + "latitude": 39.218276, + "longitude": -81.497865, + "city": "Rockport", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26170, + "latitude": 39.408888, + "longitude": -81.20786, + "city": "Saint Marys", + "state": "WV", + "county": "Pleasants" + }, + { + "zip_code": 26173, + "latitude": 38.95192, + "longitude": -81.709496, + "city": "Sherman", + "state": "WV", + "county": "Jackson" + }, + { + "zip_code": 26175, + "latitude": 39.541445, + "longitude": -80.975638, + "city": "Sistersville", + "state": "WV", + "county": "Tyler" + }, + { + "zip_code": 26178, + "latitude": 39.198501, + "longitude": -81.068913, + "city": "Smithville", + "state": "WV", + "county": "Ritchie" + }, + { + "zip_code": 26180, + "latitude": 39.218276, + "longitude": -81.497865, + "city": "Walker", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26181, + "latitude": 39.206816, + "longitude": -81.65769, + "city": "Washington", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26184, + "latitude": 39.322871, + "longitude": -81.401137, + "city": "Waverly", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26186, + "latitude": 39.575518, + "longitude": -80.666712, + "city": "Wileyville", + "state": "WV", + "county": "Wetzel" + }, + { + "zip_code": 26187, + "latitude": 39.367796, + "longitude": -81.455899, + "city": "Williamstown", + "state": "WV", + "county": "Wood" + }, + { + "zip_code": 26201, + "latitude": 38.975479, + "longitude": -80.240664, + "city": "Buckhannon", + "state": "WV", + "county": "Upshur" + }, + { + "zip_code": 26202, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Fenwick", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26203, + "latitude": 38.522709, + "longitude": -80.607651, + "city": "Erbacon", + "state": "WV", + "county": "Webster" + }, + { + "zip_code": 26205, + "latitude": 38.329918, + "longitude": -80.645376, + "city": "Craigsville", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26206, + "latitude": 38.423224, + "longitude": -80.564685, + "city": "Cowen", + "state": "WV", + "county": "Webster" + }, + { + "zip_code": 26208, + "latitude": 38.387147, + "longitude": -80.590651, + "city": "Camden On Gauley", + "state": "WV", + "county": "Webster" + }, + { + "zip_code": 26209, + "latitude": 38.387966, + "longitude": -79.990585, + "city": "Snowshoe", + "state": "WV", + "county": "Pocahontas" + }, + { + "zip_code": 26210, + "latitude": 38.899314, + "longitude": -80.226855, + "city": "Adrian", + "state": "WV", + "county": "Upshur" + }, + { + "zip_code": 26215, + "latitude": 38.899314, + "longitude": -80.226855, + "city": "Cleveland", + "state": "WV", + "county": "Upshur" + }, + { + "zip_code": 26217, + "latitude": 38.601167, + "longitude": -80.465431, + "city": "Diana", + "state": "WV", + "county": "Webster" + }, + { + "zip_code": 26218, + "latitude": 38.899314, + "longitude": -80.226855, + "city": "French Creek", + "state": "WV", + "county": "Upshur" + }, + { + "zip_code": 26219, + "latitude": 38.899314, + "longitude": -80.226855, + "city": "Frenchton", + "state": "WV", + "county": "Upshur" + }, + { + "zip_code": 26222, + "latitude": 38.645017, + "longitude": -80.432189, + "city": "Hacker Valley", + "state": "WV", + "county": "Webster" + }, + { + "zip_code": 26224, + "latitude": 38.89487, + "longitude": -79.850148, + "city": "Helvetia", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26228, + "latitude": 38.899314, + "longitude": -80.226855, + "city": "Kanawha Head", + "state": "WV", + "county": "Upshur" + }, + { + "zip_code": 26229, + "latitude": 38.899314, + "longitude": -80.226855, + "city": "Lorentz", + "state": "WV", + "county": "Upshur" + }, + { + "zip_code": 26230, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Pickens", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26234, + "latitude": 38.899314, + "longitude": -80.226855, + "city": "Rock Cave", + "state": "WV", + "county": "Upshur" + }, + { + "zip_code": 26236, + "latitude": 38.899314, + "longitude": -80.226855, + "city": "Selbyville", + "state": "WV", + "county": "Upshur" + }, + { + "zip_code": 26237, + "latitude": 38.864632, + "longitude": -80.21241, + "city": "Tallmansville", + "state": "WV", + "county": "Upshur" + }, + { + "zip_code": 26238, + "latitude": 39.125078, + "longitude": -80.017982, + "city": "Volga", + "state": "WV", + "county": "Barbour" + }, + { + "zip_code": 26241, + "latitude": 38.846815, + "longitude": -79.892841, + "city": "Elkins", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26250, + "latitude": 39.022982, + "longitude": -79.932, + "city": "Belington", + "state": "WV", + "county": "Barbour" + }, + { + "zip_code": 26253, + "latitude": 38.836615, + "longitude": -79.872553, + "city": "Beverly", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26254, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Bowden", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26257, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Coalton", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26259, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Dailey", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26260, + "latitude": 39.130056, + "longitude": -79.468329, + "city": "Davis", + "state": "WV", + "county": "Tucker" + }, + { + "zip_code": 26261, + "latitude": 38.230265, + "longitude": -80.578921, + "city": "Richwood", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26263, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Dryfork", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26264, + "latitude": 38.387966, + "longitude": -79.990585, + "city": "Durbin", + "state": "WV", + "county": "Pocahontas" + }, + { + "zip_code": 26266, + "latitude": 38.482539, + "longitude": -80.431111, + "city": "Upperglade", + "state": "WV", + "county": "Webster" + }, + { + "zip_code": 26267, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Ellamore", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26268, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Glady", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26269, + "latitude": 39.117906, + "longitude": -79.563678, + "city": "Hambleton", + "state": "WV", + "county": "Tucker" + }, + { + "zip_code": 26270, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Harman", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26271, + "latitude": 39.117906, + "longitude": -79.563678, + "city": "Hendricks", + "state": "WV", + "county": "Tucker" + }, + { + "zip_code": 26273, + "latitude": 38.696059, + "longitude": -79.974846, + "city": "Huttonsville", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26275, + "latitude": 38.978405, + "longitude": -79.949417, + "city": "Junior", + "state": "WV", + "county": "Barbour" + }, + { + "zip_code": 26276, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Kerens", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26278, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Mabie", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26280, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Mill Creek", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26282, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Monterville", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26283, + "latitude": 39.056458, + "longitude": -79.821443, + "city": "Montrose", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26285, + "latitude": 38.93074, + "longitude": -79.967754, + "city": "Norton", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26287, + "latitude": 39.096016, + "longitude": -79.678724, + "city": "Parsons", + "state": "WV", + "county": "Tucker" + }, + { + "zip_code": 26288, + "latitude": 38.483244, + "longitude": -80.447555, + "city": "Webster Springs", + "state": "WV", + "county": "Webster" + }, + { + "zip_code": 26289, + "latitude": 39.117906, + "longitude": -79.563678, + "city": "Red Creek", + "state": "WV", + "county": "Tucker" + }, + { + "zip_code": 26291, + "latitude": 38.387966, + "longitude": -79.990585, + "city": "Slatyfork", + "state": "WV", + "county": "Pocahontas" + }, + { + "zip_code": 26292, + "latitude": 39.138003, + "longitude": -79.481555, + "city": "Thomas", + "state": "WV", + "county": "Tucker" + }, + { + "zip_code": 26293, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Valley Bend", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26294, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Valley Head", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26296, + "latitude": 38.75338, + "longitude": -79.814713, + "city": "Whitmer", + "state": "WV", + "county": "Randolph" + }, + { + "zip_code": 26298, + "latitude": 38.482539, + "longitude": -80.431111, + "city": "Bergoo", + "state": "WV", + "county": "Webster" + }, + { + "zip_code": 26301, + "latitude": 39.287434, + "longitude": -80.341883, + "city": "Clarksburg", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26302, + "latitude": 39.267736, + "longitude": -80.307718, + "city": "Clarksburg", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26306, + "latitude": 39.285204, + "longitude": -80.385344, + "city": "Clarksburg", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26320, + "latitude": 39.450612, + "longitude": -80.870081, + "city": "Alma", + "state": "WV", + "county": "Tyler" + }, + { + "zip_code": 26321, + "latitude": 39.09078, + "longitude": -80.470734, + "city": "Alum Bridge", + "state": "WV", + "county": "Lewis" + }, + { + "zip_code": 26323, + "latitude": 39.258671, + "longitude": -80.287544, + "city": "Anmoore", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26325, + "latitude": 39.198501, + "longitude": -81.068913, + "city": "Auburn", + "state": "WV", + "county": "Ritchie" + }, + { + "zip_code": 26327, + "latitude": 39.198501, + "longitude": -81.068913, + "city": "Berea", + "state": "WV", + "county": "Ritchie" + }, + { + "zip_code": 26328, + "latitude": 39.270846, + "longitude": -80.719742, + "city": "Blandville", + "state": "WV", + "county": "Doddridge" + }, + { + "zip_code": 26330, + "latitude": 39.309303, + "longitude": -80.282306, + "city": "Bridgeport", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26332, + "latitude": 39.285204, + "longitude": -80.385344, + "city": "Bristol", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26334, + "latitude": 39.125078, + "longitude": -80.017982, + "city": "Brownton", + "state": "WV", + "county": "Barbour" + }, + { + "zip_code": 26335, + "latitude": 38.777546, + "longitude": -80.656974, + "city": "Burnsville", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26337, + "latitude": 39.198501, + "longitude": -81.068913, + "city": "Cairo", + "state": "WV", + "county": "Ritchie" + }, + { + "zip_code": 26338, + "latitude": 39.115329, + "longitude": -80.58037, + "city": "Camden", + "state": "WV", + "county": "Lewis" + }, + { + "zip_code": 26339, + "latitude": 39.270846, + "longitude": -80.719742, + "city": "Center Point", + "state": "WV", + "county": "Doddridge" + }, + { + "zip_code": 26342, + "latitude": 38.913649, + "longitude": -80.831256, + "city": "Coxs Mills", + "state": "WV", + "county": "Gilmer" + }, + { + "zip_code": 26343, + "latitude": 38.945847, + "longitude": -80.51449, + "city": "Crawford", + "state": "WV", + "county": "Lewis" + }, + { + "zip_code": 26346, + "latitude": 39.198501, + "longitude": -81.068913, + "city": "Ellenboro", + "state": "WV", + "county": "Ritchie" + }, + { + "zip_code": 26347, + "latitude": 39.345364, + "longitude": -80.04977, + "city": "Flemington", + "state": "WV", + "county": "Taylor" + }, + { + "zip_code": 26348, + "latitude": 39.575518, + "longitude": -80.666712, + "city": "Folsom", + "state": "WV", + "county": "Wetzel" + }, + { + "zip_code": 26349, + "latitude": 39.125078, + "longitude": -80.017982, + "city": "Galloway", + "state": "WV", + "county": "Barbour" + }, + { + "zip_code": 26350, + "latitude": 38.913649, + "longitude": -80.831256, + "city": "Gilmer", + "state": "WV", + "county": "Gilmer" + }, + { + "zip_code": 26351, + "latitude": 38.940946, + "longitude": -80.83133, + "city": "Glenville", + "state": "WV", + "county": "Gilmer" + }, + { + "zip_code": 26354, + "latitude": 39.336266, + "longitude": -80.015686, + "city": "Grafton", + "state": "WV", + "county": "Taylor" + }, + { + "zip_code": 26361, + "latitude": 39.285204, + "longitude": -80.385344, + "city": "Gypsy", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26362, + "latitude": 39.145318, + "longitude": -81.034061, + "city": "Harrisville", + "state": "WV", + "county": "Ritchie" + }, + { + "zip_code": 26366, + "latitude": 39.374487, + "longitude": -80.348925, + "city": "Haywood", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26369, + "latitude": 39.331202, + "longitude": -80.332455, + "city": "Hepzibah", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26372, + "latitude": 38.945847, + "longitude": -80.51449, + "city": "Horner", + "state": "WV", + "county": "Lewis" + }, + { + "zip_code": 26374, + "latitude": 39.48274, + "longitude": -79.836968, + "city": "Independence", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26375, + "latitude": 39.279818, + "longitude": -80.575379, + "city": "Industrial", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26376, + "latitude": 38.945847, + "longitude": -80.51449, + "city": "Ireland", + "state": "WV", + "county": "Lewis" + }, + { + "zip_code": 26377, + "latitude": 39.575518, + "longitude": -80.666712, + "city": "Jacksonburg", + "state": "WV", + "county": "Wetzel" + }, + { + "zip_code": 26378, + "latitude": 39.109143, + "longitude": -80.441713, + "city": "Jane Lew", + "state": "WV", + "county": "Lewis" + }, + { + "zip_code": 26384, + "latitude": 38.913649, + "longitude": -80.831256, + "city": "Linn", + "state": "WV", + "county": "Gilmer" + }, + { + "zip_code": 26385, + "latitude": 39.152121, + "longitude": -80.357602, + "city": "Lost Creek", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26386, + "latitude": 39.377263, + "longitude": -80.354173, + "city": "Lumberport", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26404, + "latitude": 39.346214, + "longitude": -80.313875, + "city": "Meadowbrook", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26405, + "latitude": 39.125078, + "longitude": -80.017982, + "city": "Moatsville", + "state": "WV", + "county": "Barbour" + }, + { + "zip_code": 26407, + "latitude": 39.198501, + "longitude": -81.068913, + "city": "Mountain", + "state": "WV", + "county": "Ritchie" + }, + { + "zip_code": 26408, + "latitude": 39.21751, + "longitude": -80.295772, + "city": "Mount Clare", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26410, + "latitude": 39.458091, + "longitude": -79.688154, + "city": "Newburg", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26411, + "latitude": 39.270846, + "longitude": -80.719742, + "city": "New Milton", + "state": "WV", + "county": "Doddridge" + }, + { + "zip_code": 26412, + "latitude": 38.945847, + "longitude": -80.51449, + "city": "Orlando", + "state": "WV", + "county": "Lewis" + }, + { + "zip_code": 26415, + "latitude": 39.279104, + "longitude": -81.001944, + "city": "Pennsboro", + "state": "WV", + "county": "Ritchie" + }, + { + "zip_code": 26416, + "latitude": 39.161343, + "longitude": -80.049182, + "city": "Philippi", + "state": "WV", + "county": "Barbour" + }, + { + "zip_code": 26419, + "latitude": 39.575518, + "longitude": -80.666712, + "city": "Pine Grove", + "state": "WV", + "county": "Wetzel" + }, + { + "zip_code": 26421, + "latitude": 39.198501, + "longitude": -81.068913, + "city": "Pullman", + "state": "WV", + "county": "Ritchie" + }, + { + "zip_code": 26422, + "latitude": 39.285204, + "longitude": -80.385344, + "city": "Reynoldsville", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26424, + "latitude": 39.345364, + "longitude": -80.04977, + "city": "Rosemont", + "state": "WV", + "county": "Taylor" + }, + { + "zip_code": 26425, + "latitude": 39.312958, + "longitude": -79.704927, + "city": "Rowlesburg", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26426, + "latitude": 39.245329, + "longitude": -80.49102, + "city": "Salem", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26430, + "latitude": 38.913649, + "longitude": -80.831256, + "city": "Sand Fork", + "state": "WV", + "county": "Gilmer" + }, + { + "zip_code": 26431, + "latitude": 39.328705, + "longitude": -80.273372, + "city": "Shinnston", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26434, + "latitude": 39.450612, + "longitude": -80.870081, + "city": "Shirley", + "state": "WV", + "county": "Tyler" + }, + { + "zip_code": 26435, + "latitude": 39.345364, + "longitude": -80.04977, + "city": "Simpson", + "state": "WV", + "county": "Taylor" + }, + { + "zip_code": 26436, + "latitude": 39.270846, + "longitude": -80.719742, + "city": "Smithburg", + "state": "WV", + "county": "Doddridge" + }, + { + "zip_code": 26437, + "latitude": 39.575518, + "longitude": -80.666712, + "city": "Smithfield", + "state": "WV", + "county": "Wetzel" + }, + { + "zip_code": 26438, + "latitude": 39.346511, + "longitude": -80.32056, + "city": "Spelter", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26440, + "latitude": 39.345364, + "longitude": -80.04977, + "city": "Thornton", + "state": "WV", + "county": "Taylor" + }, + { + "zip_code": 26443, + "latitude": 38.913649, + "longitude": -80.831256, + "city": "Troy", + "state": "WV", + "county": "Gilmer" + }, + { + "zip_code": 26444, + "latitude": 39.458091, + "longitude": -79.688154, + "city": "Tunnelton", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26447, + "latitude": 38.945847, + "longitude": -80.51449, + "city": "Walkersville", + "state": "WV", + "county": "Lewis" + }, + { + "zip_code": 26448, + "latitude": 39.285204, + "longitude": -80.385344, + "city": "Wallace", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26451, + "latitude": 39.199606, + "longitude": -80.40256, + "city": "West Milford", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26452, + "latitude": 39.042331, + "longitude": -80.447878, + "city": "Weston", + "state": "WV", + "county": "Lewis" + }, + { + "zip_code": 26456, + "latitude": 39.296522, + "longitude": -80.774491, + "city": "West Union", + "state": "WV", + "county": "Doddridge" + }, + { + "zip_code": 26461, + "latitude": 39.285204, + "longitude": -80.385344, + "city": "Wilsonburg", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26463, + "latitude": 39.285204, + "longitude": -80.385344, + "city": "Wyatt", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26501, + "latitude": 39.609911, + "longitude": -79.983141, + "city": "Morgantown", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26502, + "latitude": 39.625302, + "longitude": -79.967184, + "city": "Morgantown", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26503, + "latitude": 39.636606, + "longitude": -79.895639, + "city": "Morgantown", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26504, + "latitude": 39.578512, + "longitude": -80.093007, + "city": "Morgantown", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26505, + "latitude": 39.609596, + "longitude": -79.967623, + "city": "Morgantown", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26506, + "latitude": 39.645276, + "longitude": -79.962669, + "city": "Morgantown", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26507, + "latitude": 39.680786, + "longitude": -79.836473, + "city": "Morgantown", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26508, + "latitude": 39.595329, + "longitude": -79.922871, + "city": "Morgantown", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26519, + "latitude": 39.516364, + "longitude": -79.617653, + "city": "Albright", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26520, + "latitude": 39.458091, + "longitude": -79.688154, + "city": "Arthurdale", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26521, + "latitude": 39.578512, + "longitude": -80.093007, + "city": "Blacksville", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26522, + "latitude": 39.578512, + "longitude": -80.093007, + "city": "Booth", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26524, + "latitude": 39.458091, + "longitude": -79.688154, + "city": "Bretz", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26525, + "latitude": 39.666293, + "longitude": -79.620241, + "city": "Bruceton Mills", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26527, + "latitude": 39.578512, + "longitude": -80.093007, + "city": "Cassville", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26529, + "latitude": 39.651628, + "longitude": -80.159737, + "city": "Core", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26531, + "latitude": 39.605344, + "longitude": -79.895832, + "city": "Dellslow", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26533, + "latitude": 39.578512, + "longitude": -80.093007, + "city": "Everettville", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26534, + "latitude": 39.62764, + "longitude": -79.942937, + "city": "Granville", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26535, + "latitude": 39.458091, + "longitude": -79.688154, + "city": "Hazelton", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26537, + "latitude": 39.471673, + "longitude": -79.67596, + "city": "Kingwood", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26541, + "latitude": 39.658416, + "longitude": -80.028814, + "city": "Maidsville", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26542, + "latitude": 39.458091, + "longitude": -79.688154, + "city": "Masontown", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26543, + "latitude": 39.578512, + "longitude": -80.093007, + "city": "Osage", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26544, + "latitude": 39.578512, + "longitude": -80.093007, + "city": "Pentress", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26546, + "latitude": 39.674575, + "longitude": -80.034965, + "city": "Pursglove", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26547, + "latitude": 39.458091, + "longitude": -79.688154, + "city": "Reedsville", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26554, + "latitude": 39.494115, + "longitude": -80.221282, + "city": "Fairmont", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26555, + "latitude": 39.514343, + "longitude": -80.218538, + "city": "Fairmont", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26559, + "latitude": 39.505155, + "longitude": -80.172524, + "city": "Barrackville", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26560, + "latitude": 39.514343, + "longitude": -80.218538, + "city": "Baxter", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26561, + "latitude": 39.575518, + "longitude": -80.666712, + "city": "Big Run", + "state": "WV", + "county": "Wetzel" + }, + { + "zip_code": 26562, + "latitude": 39.651148, + "longitude": -80.416065, + "city": "Burton", + "state": "WV", + "county": "Wetzel" + }, + { + "zip_code": 26563, + "latitude": 39.478198, + "longitude": -80.271988, + "city": "Carolina", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26566, + "latitude": 39.514343, + "longitude": -80.218538, + "city": "Colfax", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26568, + "latitude": 39.285204, + "longitude": -80.385344, + "city": "Enterprise", + "state": "WV", + "county": "Harrison" + }, + { + "zip_code": 26570, + "latitude": 39.584289, + "longitude": -80.23895, + "city": "Fairview", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26571, + "latitude": 39.506654, + "longitude": -80.252582, + "city": "Farmington", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26572, + "latitude": 39.514343, + "longitude": -80.218538, + "city": "Four States", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26574, + "latitude": 39.558696, + "longitude": -80.180468, + "city": "Grant Town", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26575, + "latitude": 39.575518, + "longitude": -80.666712, + "city": "Hundred", + "state": "WV", + "county": "Wetzel" + }, + { + "zip_code": 26576, + "latitude": 39.48774, + "longitude": -80.266588, + "city": "Idamay", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26578, + "latitude": 39.446631, + "longitude": -80.176171, + "city": "Kingmont", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26581, + "latitude": 39.575518, + "longitude": -80.666712, + "city": "Littleton", + "state": "WV", + "county": "Wetzel" + }, + { + "zip_code": 26582, + "latitude": 39.536663, + "longitude": -80.23996, + "city": "Mannington", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26585, + "latitude": 39.579171, + "longitude": -80.368694, + "city": "Metz", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26586, + "latitude": 39.519136, + "longitude": -80.089673, + "city": "Montana Mines", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26587, + "latitude": 39.521541, + "longitude": -80.299082, + "city": "Rachel", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26588, + "latitude": 39.535089, + "longitude": -80.127883, + "city": "Rivesville", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26589, + "latitude": 39.6572, + "longitude": -80.366185, + "city": "Wadestown", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26590, + "latitude": 39.578512, + "longitude": -80.093007, + "city": "Wana", + "state": "WV", + "county": "Monongalia" + }, + { + "zip_code": 26591, + "latitude": 39.451967, + "longitude": -80.26255, + "city": "Worthington", + "state": "WV", + "county": "Marion" + }, + { + "zip_code": 26601, + "latitude": 38.654141, + "longitude": -80.67597, + "city": "Sutton", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26610, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Birch River", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26611, + "latitude": 38.913649, + "longitude": -80.831256, + "city": "Cedarville", + "state": "WV", + "county": "Gilmer" + }, + { + "zip_code": 26612, + "latitude": 38.620506, + "longitude": -80.586148, + "city": "Centralia", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26615, + "latitude": 38.706017, + "longitude": -80.736884, + "city": "Copen", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26617, + "latitude": 38.465777, + "longitude": -81.050662, + "city": "Dille", + "state": "WV", + "county": "Clay" + }, + { + "zip_code": 26618, + "latitude": 38.706017, + "longitude": -80.736884, + "city": "Elmira", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26619, + "latitude": 38.735774, + "longitude": -80.732359, + "city": "Exchange", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26621, + "latitude": 38.733696, + "longitude": -80.574704, + "city": "Flatwoods", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26623, + "latitude": 38.630462, + "longitude": -80.858859, + "city": "Frametown", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26624, + "latitude": 38.718522, + "longitude": -80.687337, + "city": "Gassaway", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26627, + "latitude": 38.762122, + "longitude": -80.640614, + "city": "Heaters", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26629, + "latitude": 38.580977, + "longitude": -80.693054, + "city": "Little Birch", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26631, + "latitude": 38.706017, + "longitude": -80.736884, + "city": "Napier", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26634, + "latitude": 38.913649, + "longitude": -80.831256, + "city": "Perkins", + "state": "WV", + "county": "Gilmer" + }, + { + "zip_code": 26636, + "latitude": 38.913649, + "longitude": -80.831256, + "city": "Rosedale", + "state": "WV", + "county": "Gilmer" + }, + { + "zip_code": 26638, + "latitude": 38.913649, + "longitude": -80.831256, + "city": "Shock", + "state": "WV", + "county": "Gilmer" + }, + { + "zip_code": 26639, + "latitude": 38.574978, + "longitude": -80.799944, + "city": "Strange Creek", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26641, + "latitude": 38.706017, + "longitude": -80.736884, + "city": "Wilsie", + "state": "WV", + "county": "Braxton" + }, + { + "zip_code": 26651, + "latitude": 38.326251, + "longitude": -80.854096, + "city": "Summersville", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26656, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Belva", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26660, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Calvin", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26662, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Canvas", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26667, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Drennen", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26671, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Gilboa", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26674, + "latitude": 38.20125, + "longitude": -81.185153, + "city": "Jodie", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 26675, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Keslers Cross Lanes", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26676, + "latitude": 38.155842, + "longitude": -80.682702, + "city": "Leivasy", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26678, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Mount Lookout", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26679, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Mount Nebo", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26680, + "latitude": 38.041293, + "longitude": -81.064784, + "city": "Nallen", + "state": "WV", + "county": "Fayette" + }, + { + "zip_code": 26681, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Nettie", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26684, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Pool", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26690, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Swiss", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26691, + "latitude": 38.318389, + "longitude": -80.834152, + "city": "Tioga", + "state": "WV", + "county": "Nicholas" + }, + { + "zip_code": 26704, + "latitude": 39.251133, + "longitude": -78.618258, + "city": "Augusta", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26705, + "latitude": 39.458091, + "longitude": -79.688154, + "city": "Aurora", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26707, + "latitude": 38.986974, + "longitude": -79.146211, + "city": "Bayard", + "state": "WV", + "county": "Grant" + }, + { + "zip_code": 26710, + "latitude": 39.443055, + "longitude": -78.964749, + "city": "Burlington", + "state": "WV", + "county": "Mineral" + }, + { + "zip_code": 26711, + "latitude": 39.314071, + "longitude": -78.659428, + "city": "Capon Bridge", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26714, + "latitude": 39.314071, + "longitude": -78.659428, + "city": "Delray", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26716, + "latitude": 39.458091, + "longitude": -79.688154, + "city": "Eglon", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26717, + "latitude": 39.443055, + "longitude": -78.964749, + "city": "Elk Garden", + "state": "WV", + "county": "Mineral" + }, + { + "zip_code": 26719, + "latitude": 39.500536, + "longitude": -78.744739, + "city": "Fort Ashby", + "state": "WV", + "county": "Mineral" + }, + { + "zip_code": 26720, + "latitude": 39.070601, + "longitude": -79.233536, + "city": "Gormania", + "state": "WV", + "county": "Grant" + }, + { + "zip_code": 26722, + "latitude": 39.314071, + "longitude": -78.659428, + "city": "Green Spring", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26726, + "latitude": 39.452686, + "longitude": -78.892554, + "city": "Keyser", + "state": "WV", + "county": "Mineral" + }, + { + "zip_code": 26731, + "latitude": 39.070601, + "longitude": -79.233536, + "city": "Lahmansville", + "state": "WV", + "county": "Grant" + }, + { + "zip_code": 26734, + "latitude": 39.070601, + "longitude": -79.233536, + "city": "Medley", + "state": "WV", + "county": "Grant" + }, + { + "zip_code": 26739, + "latitude": 39.070601, + "longitude": -79.233536, + "city": "Mount Storm", + "state": "WV", + "county": "Grant" + }, + { + "zip_code": 26743, + "latitude": 39.32047, + "longitude": -79.045902, + "city": "New Creek", + "state": "WV", + "county": "Mineral" + }, + { + "zip_code": 26750, + "latitude": 39.546831, + "longitude": -78.909518, + "city": "Piedmont", + "state": "WV", + "county": "Mineral" + }, + { + "zip_code": 26753, + "latitude": 39.600736, + "longitude": -78.769112, + "city": "Ridgeley", + "state": "WV", + "county": "Mineral" + }, + { + "zip_code": 26755, + "latitude": 39.18471, + "longitude": -78.726985, + "city": "Rio", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26757, + "latitude": 39.34487, + "longitude": -78.758487, + "city": "Romney", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26761, + "latitude": 39.314071, + "longitude": -78.659428, + "city": "Shanks", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26763, + "latitude": 39.314071, + "longitude": -78.659428, + "city": "Springfield", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26764, + "latitude": 39.430634, + "longitude": -79.519679, + "city": "Terra Alta", + "state": "WV", + "county": "Preston" + }, + { + "zip_code": 26767, + "latitude": 39.617003, + "longitude": -78.763194, + "city": "Wiley Ford", + "state": "WV", + "county": "Mineral" + }, + { + "zip_code": 26801, + "latitude": 38.999518, + "longitude": -78.821226, + "city": "Baker", + "state": "WV", + "county": "Hardy" + }, + { + "zip_code": 26802, + "latitude": 38.684692, + "longitude": -79.353564, + "city": "Brandywine", + "state": "WV", + "county": "Pendleton" + }, + { + "zip_code": 26804, + "latitude": 38.684692, + "longitude": -79.353564, + "city": "Circleville", + "state": "WV", + "county": "Pendleton" + }, + { + "zip_code": 26807, + "latitude": 38.648787, + "longitude": -79.327196, + "city": "Franklin", + "state": "WV", + "county": "Pendleton" + }, + { + "zip_code": 26808, + "latitude": 39.211295, + "longitude": -78.436258, + "city": "High View", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26810, + "latitude": 38.999518, + "longitude": -78.821226, + "city": "Lost City", + "state": "WV", + "county": "Hardy" + }, + { + "zip_code": 26812, + "latitude": 38.999518, + "longitude": -78.821226, + "city": "Mathias", + "state": "WV", + "county": "Hardy" + }, + { + "zip_code": 26814, + "latitude": 38.684692, + "longitude": -79.353564, + "city": "Riverton", + "state": "WV", + "county": "Pendleton" + }, + { + "zip_code": 26815, + "latitude": 38.684692, + "longitude": -79.353564, + "city": "Sugar Grove", + "state": "WV", + "county": "Pendleton" + }, + { + "zip_code": 26817, + "latitude": 39.314071, + "longitude": -78.659428, + "city": "Bloomery", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26818, + "latitude": 38.999518, + "longitude": -78.821226, + "city": "Fisher", + "state": "WV", + "county": "Hardy" + }, + { + "zip_code": 26823, + "latitude": 39.314071, + "longitude": -78.659428, + "city": "Capon Springs", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26824, + "latitude": 39.314071, + "longitude": -78.659428, + "city": "Junction", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26833, + "latitude": 39.116709, + "longitude": -79.134177, + "city": "Maysville", + "state": "WV", + "county": "Grant" + }, + { + "zip_code": 26836, + "latitude": 39.018679, + "longitude": -78.820561, + "city": "Moorefield", + "state": "WV", + "county": "Hardy" + }, + { + "zip_code": 26838, + "latitude": 38.999518, + "longitude": -78.821226, + "city": "Milam", + "state": "WV", + "county": "Hardy" + }, + { + "zip_code": 26845, + "latitude": 38.999518, + "longitude": -78.821226, + "city": "Old Fields", + "state": "WV", + "county": "Hardy" + }, + { + "zip_code": 26847, + "latitude": 38.990838, + "longitude": -79.129301, + "city": "Petersburg", + "state": "WV", + "county": "Grant" + }, + { + "zip_code": 26851, + "latitude": 39.077365, + "longitude": -78.593865, + "city": "Wardensville", + "state": "WV", + "county": "Hardy" + }, + { + "zip_code": 26852, + "latitude": 39.314071, + "longitude": -78.659428, + "city": "Purgitsville", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26855, + "latitude": 39.070601, + "longitude": -79.233536, + "city": "Cabins", + "state": "WV", + "county": "Grant" + }, + { + "zip_code": 26865, + "latitude": 39.314071, + "longitude": -78.659428, + "city": "Yellow Spring", + "state": "WV", + "county": "Hampshire" + }, + { + "zip_code": 26866, + "latitude": 38.684692, + "longitude": -79.353564, + "city": "Upper Tract", + "state": "WV", + "county": "Pendleton" + }, + { + "zip_code": 26884, + "latitude": 38.684692, + "longitude": -79.353564, + "city": "Seneca Rocks", + "state": "WV", + "county": "Pendleton" + }, + { + "zip_code": 26886, + "latitude": 38.684692, + "longitude": -79.353564, + "city": "Onego", + "state": "WV", + "county": "Pendleton" + }, + { + "zip_code": 27006, + "latitude": 35.945381, + "longitude": -80.448686, + "city": "Advance", + "state": "NC", + "county": "Davie" + }, + { + "zip_code": 27007, + "latitude": 36.385903, + "longitude": -80.589507, + "city": "Ararat", + "state": "NC", + "county": "Surry" + }, + { + "zip_code": 27009, + "latitude": 36.213266, + "longitude": -80.084667, + "city": "Belews Creek", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27010, + "latitude": 36.182975, + "longitude": -80.338662, + "city": "Bethania", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27011, + "latitude": 36.21397, + "longitude": -80.690386, + "city": "Boonville", + "state": "NC", + "county": "Yadkin" + }, + { + "zip_code": 27012, + "latitude": 36.081218, + "longitude": -80.328298, + "city": "Clemmons", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27013, + "latitude": 35.755719, + "longitude": -80.681056, + "city": "Cleveland", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 27014, + "latitude": 35.819175, + "longitude": -80.54826, + "city": "Cooleemee", + "state": "NC", + "county": "Davie" + }, + { + "zip_code": 27016, + "latitude": 36.446831, + "longitude": -80.220095, + "city": "Danbury", + "state": "NC", + "county": "Stokes" + }, + { + "zip_code": 27017, + "latitude": 36.357619, + "longitude": -80.697202, + "city": "Dobson", + "state": "NC", + "county": "Surry" + }, + { + "zip_code": 27018, + "latitude": 36.197851, + "longitude": -80.575334, + "city": "East Bend", + "state": "NC", + "county": "Yadkin" + }, + { + "zip_code": 27019, + "latitude": 36.316152, + "longitude": -80.234934, + "city": "Germanton", + "state": "NC", + "county": "Stokes" + }, + { + "zip_code": 27020, + "latitude": 36.119371, + "longitude": -80.80111, + "city": "Hamptonville", + "state": "NC", + "county": "Yadkin" + }, + { + "zip_code": 27021, + "latitude": 36.320179, + "longitude": -80.292174, + "city": "King", + "state": "NC", + "county": "Stokes" + }, + { + "zip_code": 27022, + "latitude": 36.503292, + "longitude": -80.216866, + "city": "Lawsonville", + "state": "NC", + "county": "Stokes" + }, + { + "zip_code": 27023, + "latitude": 36.15511, + "longitude": -80.441566, + "city": "Lewisville", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27024, + "latitude": 36.490434, + "longitude": -80.823878, + "city": "Lowgap", + "state": "NC", + "county": "Surry" + }, + { + "zip_code": 27025, + "latitude": 36.348831, + "longitude": -79.894851, + "city": "Madison", + "state": "NC", + "county": "Rockingham" + }, + { + "zip_code": 27027, + "latitude": 36.447936, + "longitude": -79.930301, + "city": "Mayodan", + "state": "NC", + "county": "Rockingham" + }, + { + "zip_code": 27028, + "latitude": 35.906241, + "longitude": -80.54609, + "city": "Mocksville", + "state": "NC", + "county": "Davie" + }, + { + "zip_code": 27030, + "latitude": 36.444303, + "longitude": -80.665406, + "city": "Mount Airy", + "state": "NC", + "county": "Surry" + }, + { + "zip_code": 27031, + "latitude": 36.399366, + "longitude": -80.70809, + "city": "White Plains", + "state": "NC", + "county": "Surry" + }, + { + "zip_code": 27040, + "latitude": 36.160959, + "longitude": -80.378143, + "city": "Pfafftown", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27041, + "latitude": 36.422632, + "longitude": -80.505421, + "city": "Pilot Mountain", + "state": "NC", + "county": "Surry" + }, + { + "zip_code": 27042, + "latitude": 36.340817, + "longitude": -80.055357, + "city": "Pine Hall", + "state": "NC", + "county": "Stokes" + }, + { + "zip_code": 27043, + "latitude": 36.346198, + "longitude": -80.404421, + "city": "Pinnacle", + "state": "NC", + "county": "Stokes" + }, + { + "zip_code": 27045, + "latitude": 36.230211, + "longitude": -80.329602, + "city": "Rural Hall", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27046, + "latitude": 36.483901, + "longitude": -80.105319, + "city": "Sandy Ridge", + "state": "NC", + "county": "Stokes" + }, + { + "zip_code": 27047, + "latitude": 36.329166, + "longitude": -80.56777, + "city": "Siloam", + "state": "NC", + "county": "Surry" + }, + { + "zip_code": 27048, + "latitude": 36.466883, + "longitude": -79.912823, + "city": "Stoneville", + "state": "NC", + "county": "Rockingham" + }, + { + "zip_code": 27049, + "latitude": 36.551332, + "longitude": -80.655786, + "city": "Toast", + "state": "NC", + "county": "Surry" + }, + { + "zip_code": 27050, + "latitude": 36.22358, + "longitude": -80.395517, + "city": "Tobaccoville", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27051, + "latitude": 36.191405, + "longitude": -80.16357, + "city": "Walkertown", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27052, + "latitude": 36.34518, + "longitude": -80.159989, + "city": "Walnut Cove", + "state": "NC", + "county": "Stokes" + }, + { + "zip_code": 27053, + "latitude": 36.490659, + "longitude": -80.463069, + "city": "Westfield", + "state": "NC", + "county": "Surry" + }, + { + "zip_code": 27054, + "latitude": 35.790116, + "longitude": -80.605096, + "city": "Woodleaf", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 27055, + "latitude": 36.136665, + "longitude": -80.682984, + "city": "Yadkinville", + "state": "NC", + "county": "Yadkin" + }, + { + "zip_code": 27094, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Rural Hall", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27098, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Rural Hall", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27099, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Rural Hall", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27101, + "latitude": 36.101817, + "longitude": -80.28762, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27102, + "latitude": 36.032304, + "longitude": -80.396168, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27103, + "latitude": 36.058599, + "longitude": -80.320965, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27104, + "latitude": 36.097952, + "longitude": -80.329096, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27105, + "latitude": 36.161935, + "longitude": -80.241287, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27106, + "latitude": 36.149337, + "longitude": -80.325815, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27107, + "latitude": 36.04803, + "longitude": -80.182863, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27108, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27109, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27110, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27111, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27113, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27114, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27115, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27116, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27117, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27120, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27127, + "latitude": 36.040815, + "longitude": -80.282645, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27130, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27150, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27151, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27152, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27155, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27156, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27157, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27198, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27199, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Winston Salem", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27201, + "latitude": 36.031836, + "longitude": -79.485643, + "city": "Alamance", + "state": "NC", + "county": "Alamance" + }, + { + "zip_code": 27202, + "latitude": 36.185517, + "longitude": -79.505479, + "city": "Altamahaw", + "state": "NC", + "county": "Alamance" + }, + { + "zip_code": 27203, + "latitude": 35.708376, + "longitude": -79.85213, + "city": "Asheboro", + "state": "NC", + "county": "Randolph" + }, + { + "zip_code": 27204, + "latitude": 35.788286, + "longitude": -79.720556, + "city": "Asheboro", + "state": "NC", + "county": "Randolph" + }, + { + "zip_code": 27205, + "latitude": "", + "longitude": "", + "city": "Asheboro", + "state": "NC", + "county": "Randolph" + }, + { + "zip_code": 27207, + "latitude": 35.608354, + "longitude": -79.372362, + "city": "Bear Creek", + "state": "NC", + "county": "Chatham" + }, + { + "zip_code": 27208, + "latitude": 35.573086, + "longitude": -79.52309, + "city": "Bennett", + "state": "NC", + "county": "Chatham" + }, + { + "zip_code": 27209, + "latitude": 35.365836, + "longitude": -79.943839, + "city": "Biscoe", + "state": "NC", + "county": "Montgomery" + }, + { + "zip_code": 27212, + "latitude": 36.466412, + "longitude": -79.275549, + "city": "Blanch", + "state": "NC", + "county": "Caswell" + }, + { + "zip_code": 27213, + "latitude": 35.648194, + "longitude": -79.414859, + "city": "Bonlee", + "state": "NC", + "county": "Chatham" + }, + { + "zip_code": 27214, + "latitude": 36.193624, + "longitude": -79.674079, + "city": "Browns Summit", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27215, + "latitude": 36.091025, + "longitude": -79.430129, + "city": "Burlington", + "state": "NC", + "county": "Alamance" + }, + { + "zip_code": 27216, + "latitude": 36.047523, + "longitude": -79.479743, + "city": "Burlington", + "state": "NC", + "county": "Alamance" + }, + { + "zip_code": 27217, + "latitude": 36.150681, + "longitude": -79.3944, + "city": "Burlington", + "state": "NC", + "county": "Alamance" + }, + { + "zip_code": 27220, + "latitude": 36.046677, + "longitude": -79.389631, + "city": "Burlington", + "state": "NC", + "county": "Alamance" + }, + { + "zip_code": 27228, + "latitude": 35.783476, + "longitude": -79.129791, + "city": "Bynum", + "state": "NC", + "county": "Chatham" + }, + { + "zip_code": 27229, + "latitude": 35.264204, + "longitude": -79.800002, + "city": "Candor", + "state": "NC", + "county": "Montgomery" + }, + { + "zip_code": 27230, + "latitude": 35.802758, + "longitude": -79.879711, + "city": "Cedar Falls", + "state": "NC", + "county": "Randolph" + }, + { + "zip_code": 27231, + "latitude": 36.181138, + "longitude": -79.164741, + "city": "Cedar Grove", + "state": "NC", + "county": "Orange" + }, + { + "zip_code": 27233, + "latitude": 35.937583, + "longitude": -79.69325, + "city": "Climax", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27235, + "latitude": 36.094489, + "longitude": -80.004721, + "city": "Colfax", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27237, + "latitude": 35.467567, + "longitude": -79.165314, + "city": "Cumnock", + "state": "NC", + "county": "Lee" + }, + { + "zip_code": 27239, + "latitude": 35.608108, + "longitude": -80.144554, + "city": "Denton", + "state": "NC", + "county": "Davidson" + }, + { + "zip_code": 27242, + "latitude": 35.326471, + "longitude": -79.548614, + "city": "Eagle Springs", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 27243, + "latitude": 36.06984, + "longitude": -79.198764, + "city": "Efland", + "state": "NC", + "county": "Orange" + }, + { + "zip_code": 27244, + "latitude": 36.164963, + "longitude": -79.446213, + "city": "Elon College", + "state": "NC", + "county": "Alamance" + }, + { + "zip_code": 27247, + "latitude": 35.451411, + "longitude": -79.783404, + "city": "Ether", + "state": "NC", + "county": "Montgomery" + }, + { + "zip_code": 27248, + "latitude": 35.785766, + "longitude": -79.710068, + "city": "Franklinville", + "state": "NC", + "county": "Randolph" + }, + { + "zip_code": 27249, + "latitude": 36.150393, + "longitude": -79.610426, + "city": "Gibsonville", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27252, + "latitude": 35.576848, + "longitude": -79.363115, + "city": "Goldston", + "state": "NC", + "county": "Chatham" + }, + { + "zip_code": 27253, + "latitude": 35.972114, + "longitude": -79.347527, + "city": "Graham", + "state": "NC", + "county": "Alamance" + }, + { + "zip_code": 27256, + "latitude": 35.562695, + "longitude": -79.33863, + "city": "Gulf", + "state": "NC", + "county": "Chatham" + }, + { + "zip_code": 27258, + "latitude": 36.042367, + "longitude": -79.324239, + "city": "Haw River", + "state": "NC", + "county": "Alamance" + }, + { + "zip_code": 27259, + "latitude": 35.492077, + "longitude": -79.479016, + "city": "Highfalls", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 27260, + "latitude": 35.993538, + "longitude": -79.988711, + "city": "High Point", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27261, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "High Point", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27262, + "latitude": 35.955786, + "longitude": -80.013043, + "city": "High Point", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27263, + "latitude": 35.935894, + "longitude": -79.93955, + "city": "High Point", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27264, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "High Point", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27265, + "latitude": 36.029892, + "longitude": -79.991542, + "city": "High Point", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27278, + "latitude": 36.077432, + "longitude": -79.085469, + "city": "Hillsborough", + "state": "NC", + "county": "Orange" + }, + { + "zip_code": 27281, + "latitude": 35.186814, + "longitude": -79.561566, + "city": "Jackson Springs", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 27282, + "latitude": 35.996926, + "longitude": -79.926902, + "city": "Jamestown", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27283, + "latitude": 35.952564, + "longitude": -79.636747, + "city": "Julian", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27284, + "latitude": 36.118312, + "longitude": -80.101271, + "city": "Kernersville", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27285, + "latitude": 36.027482, + "longitude": -80.20728, + "city": "Kernersville", + "state": "NC", + "county": "Forsyth" + }, + { + "zip_code": 27288, + "latitude": 36.486369, + "longitude": -79.749957, + "city": "Eden", + "state": "NC", + "county": "Rockingham" + }, + { + "zip_code": 27289, + "latitude": 36.392135, + "longitude": -79.773094, + "city": "Eden", + "state": "NC", + "county": "Rockingham" + }, + { + "zip_code": 27291, + "latitude": 36.364834, + "longitude": -79.187938, + "city": "Leasburg", + "state": "NC", + "county": "Caswell" + }, + { + "zip_code": 27292, + "latitude": 35.801894, + "longitude": -80.210762, + "city": "Lexington", + "state": "NC", + "county": "Davidson" + }, + { + "zip_code": 27293, + "latitude": 35.882943, + "longitude": -80.275963, + "city": "Lexington", + "state": "NC", + "county": "Davidson" + }, + { + "zip_code": 27294, + "latitude": 35.882943, + "longitude": -80.275963, + "city": "Lexington", + "state": "NC", + "county": "Davidson" + }, + { + "zip_code": 27295, + "latitude": 35.813292, + "longitude": -80.277877, + "city": "Lexington", + "state": "NC", + "county": "Davidson" + }, + { + "zip_code": 27298, + "latitude": 35.838293, + "longitude": -79.674436, + "city": "Liberty", + "state": "NC", + "county": "Randolph" + }, + { + "zip_code": 27299, + "latitude": 35.743919, + "longitude": -80.349473, + "city": "Linwood", + "state": "NC", + "county": "Davidson" + }, + { + "zip_code": 27301, + "latitude": 36.108629, + "longitude": -79.670689, + "city": "Mc Leansville", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27302, + "latitude": 36.087114, + "longitude": -79.306093, + "city": "Mebane", + "state": "NC", + "county": "Alamance" + }, + { + "zip_code": 27305, + "latitude": 36.512445, + "longitude": -79.235356, + "city": "Milton", + "state": "NC", + "county": "Caswell" + }, + { + "zip_code": 27306, + "latitude": 35.247617, + "longitude": -79.923328, + "city": "Mount Gilead", + "state": "NC", + "county": "Montgomery" + }, + { + "zip_code": 27310, + "latitude": 36.166822, + "longitude": -79.948214, + "city": "Oak Ridge", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27311, + "latitude": 36.47025, + "longitude": -79.460025, + "city": "Pelham", + "state": "NC", + "county": "Caswell" + }, + { + "zip_code": 27312, + "latitude": 35.745239, + "longitude": -79.213195, + "city": "Pittsboro", + "state": "NC", + "county": "Chatham" + }, + { + "zip_code": 27313, + "latitude": 35.950913, + "longitude": -79.765959, + "city": "Pleasant Garden", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27314, + "latitude": 36.293921, + "longitude": -79.200365, + "city": "Prospect Hill", + "state": "NC", + "county": "Caswell" + }, + { + "zip_code": 27315, + "latitude": 36.487281, + "longitude": -79.404114, + "city": "Providence", + "state": "NC", + "county": "Caswell" + }, + { + "zip_code": 27316, + "latitude": 35.714279, + "longitude": -79.646945, + "city": "Ramseur", + "state": "NC", + "county": "Randolph" + }, + { + "zip_code": 27317, + "latitude": 35.823611, + "longitude": -79.712537, + "city": "Randleman", + "state": "NC", + "county": "Randolph" + }, + { + "zip_code": 27320, + "latitude": 36.358275, + "longitude": -79.742001, + "city": "Reidsville", + "state": "NC", + "county": "Rockingham" + }, + { + "zip_code": 27321, + "latitude": 36.347568, + "longitude": -79.680318, + "city": "Reidsville", + "state": "NC", + "county": "Rockingham" + }, + { + "zip_code": 27322, + "latitude": 36.392135, + "longitude": -79.773094, + "city": "Reidsville", + "state": "NC", + "county": "Rockingham" + }, + { + "zip_code": 27323, + "latitude": 36.392135, + "longitude": -79.773094, + "city": "Reidsville", + "state": "NC", + "county": "Rockingham" + }, + { + "zip_code": 27325, + "latitude": 35.393319, + "longitude": -79.518562, + "city": "Robbins", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 27326, + "latitude": 36.461083, + "longitude": -79.597001, + "city": "Ruffin", + "state": "NC", + "county": "Rockingham" + }, + { + "zip_code": 27330, + "latitude": 35.469782, + "longitude": -79.171723, + "city": "Sanford", + "state": "NC", + "county": "Lee" + }, + { + "zip_code": 27331, + "latitude": 35.372577, + "longitude": -79.276577, + "city": "Sanford", + "state": "NC", + "county": "Lee" + }, + { + "zip_code": 27332, + "latitude": "", + "longitude": "", + "city": "Sanford", + "state": "NC", + "county": "Lee" + }, + { + "zip_code": 27340, + "latitude": 35.948814, + "longitude": -79.329664, + "city": "Saxapahaw", + "state": "NC", + "county": "Alamance" + }, + { + "zip_code": 27341, + "latitude": 35.562753, + "longitude": -79.698691, + "city": "Seagrove", + "state": "NC", + "county": "Randolph" + }, + { + "zip_code": 27342, + "latitude": 36.075623, + "longitude": -79.620641, + "city": "Sedalia", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27343, + "latitude": 36.493537, + "longitude": -79.060407, + "city": "Semora", + "state": "NC", + "county": "Person" + }, + { + "zip_code": 27344, + "latitude": 35.711578, + "longitude": -79.333922, + "city": "Siler City", + "state": "NC", + "county": "Chatham" + }, + { + "zip_code": 27349, + "latitude": 35.91485, + "longitude": -79.403671, + "city": "Snow Camp", + "state": "NC", + "county": "Alamance" + }, + { + "zip_code": 27350, + "latitude": 35.817452, + "longitude": -79.908483, + "city": "Sophia", + "state": "NC", + "county": "Randolph" + }, + { + "zip_code": 27351, + "latitude": 35.660548, + "longitude": -80.283647, + "city": "Southmont", + "state": "NC", + "county": "Davidson" + }, + { + "zip_code": 27355, + "latitude": 35.799927, + "longitude": -79.593442, + "city": "Staley", + "state": "NC", + "county": "Randolph" + }, + { + "zip_code": 27356, + "latitude": 35.439894, + "longitude": -79.825137, + "city": "Star", + "state": "NC", + "county": "Montgomery" + }, + { + "zip_code": 27357, + "latitude": 36.225751, + "longitude": -79.974028, + "city": "Stokesdale", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27358, + "latitude": 36.200019, + "longitude": -79.880028, + "city": "Summerfield", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27359, + "latitude": 36.021389, + "longitude": -79.357399, + "city": "Swepsonville", + "state": "NC", + "county": "Alamance" + }, + { + "zip_code": 27360, + "latitude": 35.854539, + "longitude": -80.124764, + "city": "Thomasville", + "state": "NC", + "county": "Davidson" + }, + { + "zip_code": 27361, + "latitude": 35.882943, + "longitude": -80.275963, + "city": "Thomasville", + "state": "NC", + "county": "Davidson" + }, + { + "zip_code": 27370, + "latitude": 35.801501, + "longitude": -79.961118, + "city": "Trinity", + "state": "NC", + "county": "Randolph" + }, + { + "zip_code": 27371, + "latitude": 35.393595, + "longitude": -79.907346, + "city": "Troy", + "state": "NC", + "county": "Montgomery" + }, + { + "zip_code": 27373, + "latitude": 35.882943, + "longitude": -80.275963, + "city": "Wallburg", + "state": "NC", + "county": "Davidson" + }, + { + "zip_code": 27374, + "latitude": 35.781848, + "longitude": -80.203546, + "city": "Welcome", + "state": "NC", + "county": "Davidson" + }, + { + "zip_code": 27375, + "latitude": 36.392135, + "longitude": -79.773094, + "city": "Wentworth", + "state": "NC", + "county": "Rockingham" + }, + { + "zip_code": 27376, + "latitude": 35.240268, + "longitude": -79.468201, + "city": "West End", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 27377, + "latitude": 36.046202, + "longitude": -79.608882, + "city": "Whitsett", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27379, + "latitude": 36.379479, + "longitude": -79.366733, + "city": "Yanceyville", + "state": "NC", + "county": "Caswell" + }, + { + "zip_code": 27401, + "latitude": 36.055285, + "longitude": -79.831692, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27402, + "latitude": 36.106711, + "longitude": -79.791901, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27403, + "latitude": 36.089396, + "longitude": -79.823336, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27404, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27405, + "latitude": 36.114003, + "longitude": -79.787099, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27406, + "latitude": 35.991647, + "longitude": -79.759794, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27407, + "latitude": 36.001791, + "longitude": -79.888672, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27408, + "latitude": 36.103685, + "longitude": -79.816254, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27409, + "latitude": 36.087534, + "longitude": -79.93439, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27410, + "latitude": 36.119984, + "longitude": -79.870925, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27411, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27412, + "latitude": 36.066129, + "longitude": -79.806735, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27413, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27415, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27416, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27417, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27419, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27420, + "latitude": 36.112987, + "longitude": -79.775913, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27425, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27427, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27429, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27435, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27438, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27455, + "latitude": 36.182391, + "longitude": -79.805975, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27480, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27495, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27498, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27499, + "latitude": 36.080707, + "longitude": -80.0244, + "city": "Greensboro", + "state": "NC", + "county": "Guilford" + }, + { + "zip_code": 27501, + "latitude": 35.478164, + "longitude": -78.729411, + "city": "Angier", + "state": "NC", + "county": "Harnett" + }, + { + "zip_code": 27502, + "latitude": 35.748012, + "longitude": -78.834012, + "city": "Apex", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27503, + "latitude": 36.09206, + "longitude": -78.885147, + "city": "Bahama", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27504, + "latitude": 35.40709, + "longitude": -78.402967, + "city": "Benson", + "state": "NC", + "county": "Johnston" + }, + { + "zip_code": 27505, + "latitude": 35.471966, + "longitude": -79.058238, + "city": "Broadway", + "state": "NC", + "county": "Lee" + }, + { + "zip_code": 27506, + "latitude": 35.420467, + "longitude": -78.713729, + "city": "Buies Creek", + "state": "NC", + "county": "Harnett" + }, + { + "zip_code": 27507, + "latitude": 36.451463, + "longitude": -78.566691, + "city": "Bullock", + "state": "NC", + "county": "Granville" + }, + { + "zip_code": 27508, + "latitude": 35.982555, + "longitude": -78.208581, + "city": "Bunn", + "state": "NC", + "county": "Franklin" + }, + { + "zip_code": 27509, + "latitude": 36.119588, + "longitude": -78.768421, + "city": "Butner", + "state": "NC", + "county": "Granville" + }, + { + "zip_code": 27510, + "latitude": 35.905477, + "longitude": -79.090077, + "city": "Carrboro", + "state": "NC", + "county": "Orange" + }, + { + "zip_code": 27511, + "latitude": 35.751243, + "longitude": -78.70732, + "city": "Cary", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27512, + "latitude": 35.808387, + "longitude": -78.839488, + "city": "Cary", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27513, + "latitude": 35.801341, + "longitude": -78.816564, + "city": "Cary", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27514, + "latitude": 36.004647, + "longitude": -79.054475, + "city": "Chapel Hill", + "state": "NC", + "county": "Orange" + }, + { + "zip_code": 27515, + "latitude": 36.05251, + "longitude": -79.107692, + "city": "Chapel Hill", + "state": "NC", + "county": "Orange" + }, + { + "zip_code": 27516, + "latitude": 35.946263, + "longitude": -79.136862, + "city": "Chapel Hill", + "state": "NC", + "county": "Orange" + }, + { + "zip_code": 27517, + "latitude": "", + "longitude": "", + "city": "Chapel Hill", + "state": "NC", + "county": "Orange" + }, + { + "zip_code": 27518, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Cary", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27519, + "latitude": 35.76812, + "longitude": -78.829548, + "city": "Cary", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27520, + "latitude": 35.633257, + "longitude": -78.435416, + "city": "Clayton", + "state": "NC", + "county": "Johnston" + }, + { + "zip_code": 27521, + "latitude": 35.425247, + "longitude": -78.656553, + "city": "Coats", + "state": "NC", + "county": "Harnett" + }, + { + "zip_code": 27522, + "latitude": 36.108089, + "longitude": -78.671974, + "city": "Creedmoor", + "state": "NC", + "county": "Granville" + }, + { + "zip_code": 27524, + "latitude": 35.4282, + "longitude": -78.339839, + "city": "Four Oaks", + "state": "NC", + "county": "Johnston" + }, + { + "zip_code": 27525, + "latitude": 36.068066, + "longitude": -78.399881, + "city": "Franklinton", + "state": "NC", + "county": "Franklin" + }, + { + "zip_code": 27526, + "latitude": 35.758691, + "longitude": -78.646886, + "city": "Fuquay Varina", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27529, + "latitude": 35.714139, + "longitude": -78.66304, + "city": "Garner", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27530, + "latitude": 35.368277, + "longitude": -78.092871, + "city": "Goldsboro", + "state": "NC", + "county": "Wayne" + }, + { + "zip_code": 27531, + "latitude": 35.463121, + "longitude": -77.995728, + "city": "Goldsboro", + "state": "NC", + "county": "Wayne" + }, + { + "zip_code": 27532, + "latitude": 35.372045, + "longitude": -78.052422, + "city": "Goldsboro", + "state": "NC", + "county": "Wayne" + }, + { + "zip_code": 27533, + "latitude": 35.372045, + "longitude": -78.052422, + "city": "Goldsboro", + "state": "NC", + "county": "Wayne" + }, + { + "zip_code": 27534, + "latitude": 35.385571, + "longitude": -78.03207, + "city": "Goldsboro", + "state": "NC", + "county": "Wayne" + }, + { + "zip_code": 27536, + "latitude": 36.38698, + "longitude": -78.396213, + "city": "Henderson", + "state": "NC", + "county": "Vance" + }, + { + "zip_code": 27537, + "latitude": "", + "longitude": "", + "city": "Henderson", + "state": "NC", + "county": "Vance" + }, + { + "zip_code": 27540, + "latitude": 35.607666, + "longitude": -78.829724, + "city": "Holly Springs", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27541, + "latitude": 36.314975, + "longitude": -79.06404, + "city": "Hurdle Mills", + "state": "NC", + "county": "Person" + }, + { + "zip_code": 27542, + "latitude": 35.571141, + "longitude": -78.287178, + "city": "Kenly", + "state": "NC", + "county": "Johnston" + }, + { + "zip_code": 27543, + "latitude": 35.429849, + "longitude": -78.882395, + "city": "Kipling", + "state": "NC", + "county": "Harnett" + }, + { + "zip_code": 27544, + "latitude": 36.220048, + "longitude": -78.450087, + "city": "Kittrell", + "state": "NC", + "county": "Vance" + }, + { + "zip_code": 27545, + "latitude": 35.788031, + "longitude": -78.459605, + "city": "Knightdale", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27546, + "latitude": 35.399221, + "longitude": -78.871194, + "city": "Lillington", + "state": "NC", + "county": "Harnett" + }, + { + "zip_code": 27549, + "latitude": 36.065143, + "longitude": -78.277943, + "city": "Louisburg", + "state": "NC", + "county": "Franklin" + }, + { + "zip_code": 27551, + "latitude": 36.507009, + "longitude": -77.997521, + "city": "Macon", + "state": "NC", + "county": "Warren" + }, + { + "zip_code": 27552, + "latitude": 35.413579, + "longitude": -78.979964, + "city": "Mamers", + "state": "NC", + "county": "Harnett" + }, + { + "zip_code": 27553, + "latitude": 36.468871, + "longitude": -78.336604, + "city": "Manson", + "state": "NC", + "county": "Vance" + }, + { + "zip_code": 27555, + "latitude": 35.629518, + "longitude": -78.204968, + "city": "Micro", + "state": "NC", + "county": "Johnston" + }, + { + "zip_code": 27556, + "latitude": 36.413473, + "longitude": -78.327491, + "city": "Middleburg", + "state": "NC", + "county": "Vance" + }, + { + "zip_code": 27557, + "latitude": 35.587186, + "longitude": -78.232745, + "city": "Middlesex", + "state": "NC", + "county": "Johnston" + }, + { + "zip_code": 27559, + "latitude": 35.623508, + "longitude": -79.098782, + "city": "Moncure", + "state": "NC", + "county": "Chatham" + }, + { + "zip_code": 27560, + "latitude": 35.852458, + "longitude": -78.843526, + "city": "Morrisville", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27562, + "latitude": 35.643693, + "longitude": -78.867658, + "city": "New Hill", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27563, + "latitude": 36.449642, + "longitude": -78.185544, + "city": "Norlina", + "state": "NC", + "county": "Warren" + }, + { + "zip_code": 27564, + "latitude": 36.101529, + "longitude": -78.713346, + "city": "Creedmoor", + "state": "NC", + "county": "Granville" + }, + { + "zip_code": 27565, + "latitude": 36.348168, + "longitude": -78.65313, + "city": "Oxford", + "state": "NC", + "county": "Granville" + }, + { + "zip_code": 27568, + "latitude": 35.488348, + "longitude": -78.217864, + "city": "Pine Level", + "state": "NC", + "county": "Johnston" + }, + { + "zip_code": 27569, + "latitude": 35.471193, + "longitude": -78.164309, + "city": "Princeton", + "state": "NC", + "county": "Johnston" + }, + { + "zip_code": 27570, + "latitude": 36.37367, + "longitude": -78.110931, + "city": "Ridgeway", + "state": "NC", + "county": "Warren" + }, + { + "zip_code": 27571, + "latitude": 35.906468, + "longitude": -78.45482, + "city": "Rolesville", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27572, + "latitude": 36.205828, + "longitude": -78.878578, + "city": "Rougemont", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27573, + "latitude": 36.39165, + "longitude": -78.950937, + "city": "Roxboro", + "state": "NC", + "county": "Person" + }, + { + "zip_code": 27576, + "latitude": 35.563572, + "longitude": -78.244459, + "city": "Selma", + "state": "NC", + "county": "Johnston" + }, + { + "zip_code": 27577, + "latitude": 35.536543, + "longitude": -78.336001, + "city": "Smithfield", + "state": "NC", + "county": "Johnston" + }, + { + "zip_code": 27581, + "latitude": 36.209675, + "longitude": -78.72704, + "city": "Stem", + "state": "NC", + "county": "Granville" + }, + { + "zip_code": 27582, + "latitude": 36.442431, + "longitude": -78.557098, + "city": "Stovall", + "state": "NC", + "county": "Granville" + }, + { + "zip_code": 27583, + "latitude": 36.311201, + "longitude": -78.92292, + "city": "Timberlake", + "state": "NC", + "county": "Person" + }, + { + "zip_code": 27584, + "latitude": 36.518058, + "longitude": -78.400865, + "city": "Townsville", + "state": "NC", + "county": "Vance" + }, + { + "zip_code": 27586, + "latitude": 36.37367, + "longitude": -78.110931, + "city": "Vaughan", + "state": "NC", + "county": "Warren" + }, + { + "zip_code": 27587, + "latitude": 35.858041, + "longitude": -78.586534, + "city": "Wake Forest", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27588, + "latitude": 35.973108, + "longitude": -78.450754, + "city": "Wake Forest", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27589, + "latitude": 36.339089, + "longitude": -78.190028, + "city": "Warrenton", + "state": "NC", + "county": "Warren" + }, + { + "zip_code": 27591, + "latitude": 35.811324, + "longitude": -78.395966, + "city": "Wendell", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27592, + "latitude": 35.67238, + "longitude": -78.534929, + "city": "Willow Spring", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27593, + "latitude": 35.590731, + "longitude": -78.360723, + "city": "Wilsons Mills", + "state": "NC", + "county": "Johnston" + }, + { + "zip_code": 27594, + "latitude": 36.37367, + "longitude": -78.110931, + "city": "Wise", + "state": "NC", + "county": "Warren" + }, + { + "zip_code": 27596, + "latitude": 36.018749, + "longitude": -78.438181, + "city": "Youngsville", + "state": "NC", + "county": "Franklin" + }, + { + "zip_code": 27597, + "latitude": 35.87922, + "longitude": -78.355582, + "city": "Zebulon", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27599, + "latitude": 36.05251, + "longitude": -79.107692, + "city": "Chapel Hill", + "state": "NC", + "county": "Orange" + }, + { + "zip_code": 27601, + "latitude": 35.773755, + "longitude": -78.604175, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27602, + "latitude": 35.758667, + "longitude": -78.671089, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27603, + "latitude": 35.689086, + "longitude": -78.675118, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27604, + "latitude": 35.837111, + "longitude": -78.555342, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27605, + "latitude": 35.789601, + "longitude": -78.652475, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27606, + "latitude": 35.715972, + "longitude": -78.747741, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27607, + "latitude": 35.804237, + "longitude": -78.707101, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27608, + "latitude": 35.80895, + "longitude": -78.646238, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27609, + "latitude": 35.841146, + "longitude": -78.630413, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27610, + "latitude": 35.7429, + "longitude": -78.564443, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27611, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27612, + "latitude": 35.821942, + "longitude": -78.675135, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27613, + "latitude": 35.86952, + "longitude": -78.705465, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27614, + "latitude": 35.972686, + "longitude": -78.620292, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27615, + "latitude": 35.918893, + "longitude": -78.627455, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27616, + "latitude": 35.805765, + "longitude": -78.688301, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27617, + "latitude": "", + "longitude": "", + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27619, + "latitude": 35.851463, + "longitude": -78.63141, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27620, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27621, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27622, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27623, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27624, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27625, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27626, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27627, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27628, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27629, + "latitude": 35.817497, + "longitude": -78.552388, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27634, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27635, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27636, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27640, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27650, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27656, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27658, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27661, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27668, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27675, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27676, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27690, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27695, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27697, + "latitude": 35.88224, + "longitude": -78.413371, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27698, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27699, + "latitude": 35.797692, + "longitude": -78.625265, + "city": "Raleigh", + "state": "NC", + "county": "Wake" + }, + { + "zip_code": 27701, + "latitude": 36.004307, + "longitude": -78.875467, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27702, + "latitude": 36.051155, + "longitude": -78.857651, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27703, + "latitude": 35.957366, + "longitude": -78.821694, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27704, + "latitude": 36.037132, + "longitude": -78.828086, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27705, + "latitude": 36.019354, + "longitude": -78.899525, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27706, + "latitude": 35.997043, + "longitude": -78.94223, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27707, + "latitude": 35.94816, + "longitude": -78.941599, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27708, + "latitude": 36.028685, + "longitude": -78.92398, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27709, + "latitude": 36.051155, + "longitude": -78.857651, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27710, + "latitude": 36.051155, + "longitude": -78.857651, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27711, + "latitude": 36.051155, + "longitude": -78.857651, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27712, + "latitude": 36.091848, + "longitude": -78.908043, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27713, + "latitude": 35.911215, + "longitude": -78.917768, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27715, + "latitude": 36.051155, + "longitude": -78.857651, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27717, + "latitude": 36.051155, + "longitude": -78.857651, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27722, + "latitude": 36.051155, + "longitude": -78.857651, + "city": "Durham", + "state": "NC", + "county": "Durham" + }, + { + "zip_code": 27801, + "latitude": 35.949051, + "longitude": -77.641181, + "city": "Rocky Mount", + "state": "NC", + "county": "Edgecombe" + }, + { + "zip_code": 27802, + "latitude": 35.935563, + "longitude": -77.78077, + "city": "Rocky Mount", + "state": "NC", + "county": "Edgecombe" + }, + { + "zip_code": 27803, + "latitude": 35.902088, + "longitude": -77.874947, + "city": "Rocky Mount", + "state": "NC", + "county": "Nash" + }, + { + "zip_code": 27804, + "latitude": 35.941739, + "longitude": -77.939841, + "city": "Rocky Mount", + "state": "NC", + "county": "Nash" + }, + { + "zip_code": 27805, + "latitude": 36.169398, + "longitude": -77.097225, + "city": "Aulander", + "state": "NC", + "county": "Bertie" + }, + { + "zip_code": 27806, + "latitude": 35.373666, + "longitude": -76.861978, + "city": "Aurora", + "state": "NC", + "county": "Beaufort" + }, + { + "zip_code": 27807, + "latitude": 35.800198, + "longitude": -78.10562, + "city": "Bailey", + "state": "NC", + "county": "Nash" + }, + { + "zip_code": 27808, + "latitude": 35.469911, + "longitude": -76.756914, + "city": "Bath", + "state": "NC", + "county": "Beaufort" + }, + { + "zip_code": 27809, + "latitude": 36.006705, + "longitude": -77.707389, + "city": "Battleboro", + "state": "NC", + "county": "Edgecombe" + }, + { + "zip_code": 27810, + "latitude": 35.445752, + "longitude": -76.639119, + "city": "Belhaven", + "state": "NC", + "county": "Beaufort" + }, + { + "zip_code": 27811, + "latitude": 35.584685, + "longitude": -77.513357, + "city": "Bellarthur", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 27812, + "latitude": 35.757803, + "longitude": -77.39351, + "city": "Bethel", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 27813, + "latitude": 35.616471, + "longitude": -77.935161, + "city": "Black Creek", + "state": "NC", + "county": "Wilson" + }, + { + "zip_code": 27814, + "latitude": 35.500693, + "longitude": -76.977521, + "city": "Blounts Creek", + "state": "NC", + "county": "Beaufort" + }, + { + "zip_code": 27816, + "latitude": 36.09786, + "longitude": -78.03876, + "city": "Castalia", + "state": "NC", + "county": "Nash" + }, + { + "zip_code": 27817, + "latitude": 35.460458, + "longitude": -77.063047, + "city": "Chocowinity", + "state": "NC", + "county": "Beaufort" + }, + { + "zip_code": 27818, + "latitude": 36.491011, + "longitude": -77.031055, + "city": "Como", + "state": "NC", + "county": "Hertford" + }, + { + "zip_code": 27819, + "latitude": 35.817763, + "longitude": -77.453286, + "city": "Conetoe", + "state": "NC", + "county": "Edgecombe" + }, + { + "zip_code": 27820, + "latitude": 36.450554, + "longitude": -77.452452, + "city": "Conway", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27821, + "latitude": 35.327785, + "longitude": -76.872371, + "city": "Edward", + "state": "NC", + "county": "Beaufort" + }, + { + "zip_code": 27822, + "latitude": 35.787273, + "longitude": -77.856015, + "city": "Elm City", + "state": "NC", + "county": "Wilson" + }, + { + "zip_code": 27823, + "latitude": 36.279884, + "longitude": -77.723443, + "city": "Enfield", + "state": "NC", + "county": "Halifax" + }, + { + "zip_code": 27824, + "latitude": 35.325223, + "longitude": -76.028472, + "city": "Engelhard", + "state": "NC", + "county": "Hyde" + }, + { + "zip_code": 27825, + "latitude": 35.866711, + "longitude": -77.084958, + "city": "Everetts", + "state": "NC", + "county": "Martin" + }, + { + "zip_code": 27826, + "latitude": 35.510544, + "longitude": -76.179248, + "city": "Fairfield", + "state": "NC", + "county": "Hyde" + }, + { + "zip_code": 27827, + "latitude": 35.693518, + "longitude": -77.511147, + "city": "Falkland", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 27828, + "latitude": 35.663061, + "longitude": -77.456086, + "city": "Farmville", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 27829, + "latitude": 35.687351, + "longitude": -77.59113, + "city": "Fountain", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 27830, + "latitude": 35.469355, + "longitude": -77.979026, + "city": "Fremont", + "state": "NC", + "county": "Wayne" + }, + { + "zip_code": 27831, + "latitude": 36.482084, + "longitude": -77.568112, + "city": "Garysburg", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27832, + "latitude": 36.417965, + "longitude": -77.441731, + "city": "Gaston", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27833, + "latitude": 35.580444, + "longitude": -77.392609, + "city": "Greenville", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 27834, + "latitude": 35.631003, + "longitude": -77.381019, + "city": "Greenville", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 27835, + "latitude": 35.588523, + "longitude": -77.353092, + "city": "Greenville", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 27836, + "latitude": 35.580444, + "longitude": -77.392609, + "city": "Greenville", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 27837, + "latitude": 35.506325, + "longitude": -77.214568, + "city": "Grimesland", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 27838, + "latitude": 36.356129, + "longitude": -77.483072, + "city": "Gumberry", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27839, + "latitude": 36.33719, + "longitude": -77.629192, + "city": "Halifax", + "state": "NC", + "county": "Halifax" + }, + { + "zip_code": 27840, + "latitude": 35.963174, + "longitude": -77.223554, + "city": "Hamilton", + "state": "NC", + "county": "Martin" + }, + { + "zip_code": 27841, + "latitude": 35.906104, + "longitude": -77.273825, + "city": "Hassell", + "state": "NC", + "county": "Martin" + }, + { + "zip_code": 27842, + "latitude": 36.525838, + "longitude": -77.8555, + "city": "Henrico", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27843, + "latitude": 36.059381, + "longitude": -77.406093, + "city": "Hobgood", + "state": "NC", + "county": "Halifax" + }, + { + "zip_code": 27844, + "latitude": 36.237677, + "longitude": -77.706792, + "city": "Hollister", + "state": "NC", + "county": "Halifax" + }, + { + "zip_code": 27845, + "latitude": 36.374826, + "longitude": -77.370513, + "city": "Jackson", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27846, + "latitude": 35.805568, + "longitude": -76.997456, + "city": "Jamesville", + "state": "NC", + "county": "Martin" + }, + { + "zip_code": 27847, + "latitude": 36.187122, + "longitude": -77.189818, + "city": "Kelford", + "state": "NC", + "county": "Bertie" + }, + { + "zip_code": 27849, + "latitude": 36.093332, + "longitude": -77.143875, + "city": "Lewiston Woodville", + "state": "NC", + "county": "Bertie" + }, + { + "zip_code": 27850, + "latitude": 36.376924, + "longitude": -77.709017, + "city": "Littleton", + "state": "NC", + "county": "Halifax" + }, + { + "zip_code": 27851, + "latitude": 35.674077, + "longitude": -78.026484, + "city": "Lucama", + "state": "NC", + "county": "Wilson" + }, + { + "zip_code": 27852, + "latitude": 35.750972, + "longitude": -77.670582, + "city": "Macclesfield", + "state": "NC", + "county": "Edgecombe" + }, + { + "zip_code": 27853, + "latitude": 36.356129, + "longitude": -77.483072, + "city": "Margarettsville", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27854, + "latitude": 36.363144, + "longitude": -77.386748, + "city": "Milwaukee", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27855, + "latitude": 36.449543, + "longitude": -77.052051, + "city": "Murfreesboro", + "state": "NC", + "county": "Hertford" + }, + { + "zip_code": 27856, + "latitude": 36.02049, + "longitude": -77.982782, + "city": "Nashville", + "state": "NC", + "county": "Nash" + }, + { + "zip_code": 27857, + "latitude": 35.970377, + "longitude": -77.251106, + "city": "Oak City", + "state": "NC", + "county": "Martin" + }, + { + "zip_code": 27858, + "latitude": 35.616949, + "longitude": -77.402789, + "city": "Greenville", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 27860, + "latitude": 35.610477, + "longitude": -76.717723, + "city": "Pantego", + "state": "NC", + "county": "Beaufort" + }, + { + "zip_code": 27861, + "latitude": 35.819037, + "longitude": -77.314288, + "city": "Parmele", + "state": "NC", + "county": "Martin" + }, + { + "zip_code": 27862, + "latitude": 36.356129, + "longitude": -77.483072, + "city": "Pendleton", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27863, + "latitude": 35.488295, + "longitude": -77.972713, + "city": "Pikeville", + "state": "NC", + "county": "Wayne" + }, + { + "zip_code": 27864, + "latitude": 35.793, + "longitude": -77.633263, + "city": "Pinetops", + "state": "NC", + "county": "Edgecombe" + }, + { + "zip_code": 27865, + "latitude": 35.574633, + "longitude": -76.776212, + "city": "Pinetown", + "state": "NC", + "county": "Beaufort" + }, + { + "zip_code": 27866, + "latitude": 36.5044, + "longitude": -77.55694, + "city": "Pleasant Hill", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27867, + "latitude": 36.356129, + "longitude": -77.483072, + "city": "Potecasi", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27868, + "latitude": 36.054832, + "longitude": -77.911635, + "city": "Red Oak", + "state": "NC", + "county": "Nash" + }, + { + "zip_code": 27869, + "latitude": 36.31037, + "longitude": -77.318446, + "city": "Rich Square", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27870, + "latitude": 36.303962, + "longitude": -77.641063, + "city": "Roanoke Rapids", + "state": "NC", + "county": "Halifax" + }, + { + "zip_code": 27871, + "latitude": 35.834564, + "longitude": -77.248489, + "city": "Robersonville", + "state": "NC", + "county": "Martin" + }, + { + "zip_code": 27872, + "latitude": 36.216644, + "longitude": -77.222348, + "city": "Roxobel", + "state": "NC", + "county": "Bertie" + }, + { + "zip_code": 27873, + "latitude": 35.649494, + "longitude": -77.791845, + "city": "Saratoga", + "state": "NC", + "county": "Wilson" + }, + { + "zip_code": 27874, + "latitude": 36.23245, + "longitude": -77.608355, + "city": "Scotland Neck", + "state": "NC", + "county": "Halifax" + }, + { + "zip_code": 27875, + "latitude": 35.471657, + "longitude": -76.495091, + "city": "Scranton", + "state": "NC", + "county": "Hyde" + }, + { + "zip_code": 27876, + "latitude": 36.490454, + "longitude": -77.442173, + "city": "Seaboard", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27877, + "latitude": 36.356129, + "longitude": -77.483072, + "city": "Severn", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27878, + "latitude": 35.865387, + "longitude": -77.838886, + "city": "Sharpsburg", + "state": "NC", + "county": "Nash" + }, + { + "zip_code": 27879, + "latitude": 35.567478, + "longitude": -77.280169, + "city": "Simpson", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 27880, + "latitude": 35.738821, + "longitude": -78.10039, + "city": "Sims", + "state": "NC", + "county": "Wilson" + }, + { + "zip_code": 27881, + "latitude": 35.915927, + "longitude": -77.585471, + "city": "Speed", + "state": "NC", + "county": "Edgecombe" + }, + { + "zip_code": 27882, + "latitude": 35.94476, + "longitude": -78.093002, + "city": "Spring Hope", + "state": "NC", + "county": "Nash" + }, + { + "zip_code": 27883, + "latitude": 35.656386, + "longitude": -77.805965, + "city": "Stantonsburg", + "state": "NC", + "county": "Wilson" + }, + { + "zip_code": 27884, + "latitude": 35.711302, + "longitude": -77.266682, + "city": "Stokes", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 27885, + "latitude": 35.465559, + "longitude": -76.271685, + "city": "Swanquarter", + "state": "NC", + "county": "Hyde" + }, + { + "zip_code": 27886, + "latitude": 35.928437, + "longitude": -77.581631, + "city": "Tarboro", + "state": "NC", + "county": "Edgecombe" + }, + { + "zip_code": 27887, + "latitude": 36.235198, + "longitude": -77.502602, + "city": "Tillery", + "state": "NC", + "county": "Halifax" + }, + { + "zip_code": 27888, + "latitude": 35.609289, + "longitude": -77.713073, + "city": "Walstonburg", + "state": "NC", + "county": "Greene" + }, + { + "zip_code": 27889, + "latitude": 35.519268, + "longitude": -76.8892, + "city": "Washington", + "state": "NC", + "county": "Beaufort" + }, + { + "zip_code": 27890, + "latitude": 36.389174, + "longitude": -77.750353, + "city": "Weldon", + "state": "NC", + "county": "Halifax" + }, + { + "zip_code": 27891, + "latitude": 36.124661, + "longitude": -77.825049, + "city": "Whitakers", + "state": "NC", + "county": "Nash" + }, + { + "zip_code": 27892, + "latitude": 35.821205, + "longitude": -77.102193, + "city": "Williamston", + "state": "NC", + "county": "Martin" + }, + { + "zip_code": 27893, + "latitude": 35.723264, + "longitude": -77.925269, + "city": "Wilson", + "state": "NC", + "county": "Wilson" + }, + { + "zip_code": 27894, + "latitude": 35.715778, + "longitude": -77.904283, + "city": "Wilson", + "state": "NC", + "county": "Wilson" + }, + { + "zip_code": 27895, + "latitude": 35.719923, + "longitude": -77.926691, + "city": "Wilson", + "state": "NC", + "county": "Wilson" + }, + { + "zip_code": 27896, + "latitude": 35.771467, + "longitude": -77.973007, + "city": "Wilson", + "state": "NC", + "county": "Wilson" + }, + { + "zip_code": 27897, + "latitude": 36.393691, + "longitude": -77.313667, + "city": "Woodland", + "state": "NC", + "county": "Northampton" + }, + { + "zip_code": 27906, + "latitude": 36.285388, + "longitude": -76.213284, + "city": "Elizabeth City", + "state": "NC", + "county": "Pasquotank" + }, + { + "zip_code": 27907, + "latitude": 36.285026, + "longitude": -76.255312, + "city": "Elizabeth City", + "state": "NC", + "county": "Pasquotank" + }, + { + "zip_code": 27909, + "latitude": 36.293633, + "longitude": -76.271958, + "city": "Elizabeth City", + "state": "NC", + "county": "Pasquotank" + }, + { + "zip_code": 27910, + "latitude": 36.339311, + "longitude": -76.990498, + "city": "Ahoskie", + "state": "NC", + "county": "Hertford" + }, + { + "zip_code": 27915, + "latitude": 35.776474, + "longitude": -75.635823, + "city": "Avon", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27916, + "latitude": 36.307995, + "longitude": -75.918814, + "city": "Aydlett", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27917, + "latitude": 36.370898, + "longitude": -75.989967, + "city": "Barco", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27919, + "latitude": 36.257499, + "longitude": -76.544379, + "city": "Belvidere", + "state": "NC", + "county": "Perquimans" + }, + { + "zip_code": 27920, + "latitude": 35.252534, + "longitude": -75.572155, + "city": "Buxton", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27921, + "latitude": 36.389961, + "longitude": -76.199736, + "city": "Camden", + "state": "NC", + "county": "Camden" + }, + { + "zip_code": 27922, + "latitude": 36.360803, + "longitude": -76.905529, + "city": "Cofield", + "state": "NC", + "county": "Hertford" + }, + { + "zip_code": 27923, + "latitude": 36.383368, + "longitude": -75.954658, + "city": "Coinjock", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27924, + "latitude": 36.152409, + "longitude": -76.852518, + "city": "Colerain", + "state": "NC", + "county": "Bertie" + }, + { + "zip_code": 27925, + "latitude": 35.936934, + "longitude": -76.203339, + "city": "Columbia", + "state": "NC", + "county": "Tyrrell" + }, + { + "zip_code": 27926, + "latitude": 36.520104, + "longitude": -76.59285, + "city": "Corapeake", + "state": "NC", + "county": "Gates" + }, + { + "zip_code": 27927, + "latitude": 36.391941, + "longitude": -75.825512, + "city": "Corolla", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27928, + "latitude": 35.829692, + "longitude": -76.567703, + "city": "Creswell", + "state": "NC", + "county": "Washington" + }, + { + "zip_code": 27929, + "latitude": 36.439774, + "longitude": -76.005478, + "city": "Currituck", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27930, + "latitude": 36.198539, + "longitude": -76.373908, + "city": "Durants Neck", + "state": "NC", + "county": "Perquimans" + }, + { + "zip_code": 27932, + "latitude": 36.135621, + "longitude": -76.580107, + "city": "Edenton", + "state": "NC", + "county": "Chowan" + }, + { + "zip_code": 27935, + "latitude": 36.416392, + "longitude": -76.797951, + "city": "Eure", + "state": "NC", + "county": "Gates" + }, + { + "zip_code": 27936, + "latitude": 35.233846, + "longitude": -75.614493, + "city": "Frisco", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27937, + "latitude": 36.493521, + "longitude": -76.815386, + "city": "Gates", + "state": "NC", + "county": "Gates" + }, + { + "zip_code": 27938, + "latitude": 36.422539, + "longitude": -76.714802, + "city": "Gatesville", + "state": "NC", + "county": "Gates" + }, + { + "zip_code": 27939, + "latitude": 36.293128, + "longitude": -75.975578, + "city": "Grandy", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27941, + "latitude": 36.157985, + "longitude": -75.833856, + "city": "Harbinger", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27942, + "latitude": 36.274551, + "longitude": -76.786498, + "city": "Harrellsville", + "state": "NC", + "county": "Hertford" + }, + { + "zip_code": 27943, + "latitude": 35.692774, + "longitude": -75.713785, + "city": "Hatteras", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27944, + "latitude": 36.168529, + "longitude": -76.373128, + "city": "Hertford", + "state": "NC", + "county": "Perquimans" + }, + { + "zip_code": 27946, + "latitude": 36.365847, + "longitude": -76.625361, + "city": "Hobbsville", + "state": "NC", + "county": "Gates" + }, + { + "zip_code": 27947, + "latitude": 36.171411, + "longitude": -75.862128, + "city": "Jarvisburg", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27948, + "latitude": 35.772912, + "longitude": -75.634892, + "city": "Kill Devil Hills", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27949, + "latitude": 36.083688, + "longitude": -75.696557, + "city": "Kitty Hawk", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27950, + "latitude": 36.427047, + "longitude": -75.976651, + "city": "Knotts Island", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27953, + "latitude": 35.823791, + "longitude": -75.846714, + "city": "Manns Harbor", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27954, + "latitude": 35.950867, + "longitude": -75.681122, + "city": "Manteo", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27956, + "latitude": 36.401953, + "longitude": -75.997651, + "city": "Maple", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27957, + "latitude": 36.113612, + "longitude": -76.912879, + "city": "Merry Hill", + "state": "NC", + "county": "Bertie" + }, + { + "zip_code": 27958, + "latitude": 36.399081, + "longitude": -76.064702, + "city": "Moyock", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27959, + "latitude": 36.02153, + "longitude": -75.661879, + "city": "Nags Head", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27960, + "latitude": 35.355633, + "longitude": -76.187429, + "city": "Ocracoke", + "state": "NC", + "county": "Hyde" + }, + { + "zip_code": 27962, + "latitude": 35.818681, + "longitude": -76.609454, + "city": "Plymouth", + "state": "NC", + "county": "Washington" + }, + { + "zip_code": 27964, + "latitude": 36.084092, + "longitude": -75.804485, + "city": "Point Harbor", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27965, + "latitude": 36.273673, + "longitude": -75.909652, + "city": "Poplar Branch", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27966, + "latitude": 36.201721, + "longitude": -75.865772, + "city": "Powells Point", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27967, + "latitude": 36.164672, + "longitude": -76.967234, + "city": "Powellsville", + "state": "NC", + "county": "Bertie" + }, + { + "zip_code": 27968, + "latitude": 35.692774, + "longitude": -75.713785, + "city": "Rodanthe", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27969, + "latitude": 36.424152, + "longitude": -76.702125, + "city": "Roduco", + "state": "NC", + "county": "Gates" + }, + { + "zip_code": 27970, + "latitude": 35.835272, + "longitude": -76.554122, + "city": "Roper", + "state": "NC", + "county": "Washington" + }, + { + "zip_code": 27972, + "latitude": 35.554569, + "longitude": -75.469319, + "city": "Salvo", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27973, + "latitude": 36.400991, + "longitude": -76.09242, + "city": "Shawboro", + "state": "NC", + "county": "Currituck" + }, + { + "zip_code": 27974, + "latitude": 36.239776, + "longitude": -76.022486, + "city": "Shiloh", + "state": "NC", + "county": "Camden" + }, + { + "zip_code": 27976, + "latitude": 36.455346, + "longitude": -76.280026, + "city": "South Mills", + "state": "NC", + "county": "Camden" + }, + { + "zip_code": 27978, + "latitude": 35.698493, + "longitude": -75.772775, + "city": "Stumpy Point", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27979, + "latitude": 36.434329, + "longitude": -76.620014, + "city": "Sunbury", + "state": "NC", + "county": "Gates" + }, + { + "zip_code": 27980, + "latitude": 36.249278, + "longitude": -76.630775, + "city": "Tyner", + "state": "NC", + "county": "Chowan" + }, + { + "zip_code": 27981, + "latitude": 35.862175, + "longitude": -75.643747, + "city": "Wanchese", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27982, + "latitude": 35.559564, + "longitude": -75.465858, + "city": "Waves", + "state": "NC", + "county": "Dare" + }, + { + "zip_code": 27983, + "latitude": 36.039911, + "longitude": -76.936954, + "city": "Windsor", + "state": "NC", + "county": "Bertie" + }, + { + "zip_code": 27985, + "latitude": 36.219345, + "longitude": -76.466689, + "city": "Winfall", + "state": "NC", + "county": "Perquimans" + }, + { + "zip_code": 27986, + "latitude": 36.418251, + "longitude": -76.954858, + "city": "Winton", + "state": "NC", + "county": "Hertford" + }, + { + "zip_code": 28001, + "latitude": 35.319817, + "longitude": -80.253448, + "city": "Albemarle", + "state": "NC", + "county": "Stanly" + }, + { + "zip_code": 28002, + "latitude": 35.264179, + "longitude": -80.108188, + "city": "Albemarle", + "state": "NC", + "county": "Stanly" + }, + { + "zip_code": 28006, + "latitude": 35.365255, + "longitude": -81.087967, + "city": "Alexis", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28007, + "latitude": 35.021874, + "longitude": -80.085232, + "city": "Ansonville", + "state": "NC", + "county": "Anson" + }, + { + "zip_code": 28009, + "latitude": 35.41569, + "longitude": -80.159356, + "city": "Badin", + "state": "NC", + "county": "Stanly" + }, + { + "zip_code": 28010, + "latitude": 35.719228, + "longitude": -80.89909, + "city": "Barium Springs", + "state": "NC", + "county": "Iredell" + }, + { + "zip_code": 28012, + "latitude": 35.278438, + "longitude": -81.197088, + "city": "Belmont", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28016, + "latitude": 35.319564, + "longitude": -81.234751, + "city": "Bessemer City", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28017, + "latitude": 35.254876, + "longitude": -81.691402, + "city": "Boiling Springs", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28018, + "latitude": 35.440832, + "longitude": -81.789415, + "city": "Bostic", + "state": "NC", + "county": "Rutherford" + }, + { + "zip_code": 28019, + "latitude": 35.316793, + "longitude": -81.831944, + "city": "Caroleen", + "state": "NC", + "county": "Rutherford" + }, + { + "zip_code": 28020, + "latitude": 35.519973, + "longitude": -81.627064, + "city": "Casar", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28021, + "latitude": 35.306707, + "longitude": -81.236958, + "city": "Cherryville", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28023, + "latitude": 35.571468, + "longitude": -80.596523, + "city": "China Grove", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 28024, + "latitude": 35.241615, + "longitude": -81.775456, + "city": "Cliffside", + "state": "NC", + "county": "Rutherford" + }, + { + "zip_code": 28025, + "latitude": 35.371633, + "longitude": -80.562141, + "city": "Concord", + "state": "NC", + "county": "Cabarrus" + }, + { + "zip_code": 28026, + "latitude": 35.346285, + "longitude": -80.541088, + "city": "Concord", + "state": "NC", + "county": "Cabarrus" + }, + { + "zip_code": 28027, + "latitude": 35.410688, + "longitude": -80.658405, + "city": "Concord", + "state": "NC", + "county": "Cabarrus" + }, + { + "zip_code": 28031, + "latitude": 35.473286, + "longitude": -80.872585, + "city": "Cornelius", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28032, + "latitude": 35.314194, + "longitude": -81.134336, + "city": "Cramerton", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28033, + "latitude": 35.435922, + "longitude": -81.33848, + "city": "Crouse", + "state": "NC", + "county": "Lincoln" + }, + { + "zip_code": 28034, + "latitude": 35.349898, + "longitude": -81.221463, + "city": "Dallas", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28036, + "latitude": 35.283427, + "longitude": -80.844594, + "city": "Davidson", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28037, + "latitude": 35.486134, + "longitude": -81.0553, + "city": "Denver", + "state": "NC", + "county": "Lincoln" + }, + { + "zip_code": 28038, + "latitude": 35.196998, + "longitude": -81.538645, + "city": "Earl", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28039, + "latitude": 35.677889, + "longitude": -80.44593, + "city": "East Spencer", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 28040, + "latitude": 35.382054, + "longitude": -81.774, + "city": "Ellenboro", + "state": "NC", + "county": "Rutherford" + }, + { + "zip_code": 28041, + "latitude": 35.58167, + "longitude": -80.45806, + "city": "Faith", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 28042, + "latitude": 35.373884, + "longitude": -81.543706, + "city": "Fallston", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28043, + "latitude": 35.325025, + "longitude": -81.846013, + "city": "Forest City", + "state": "NC", + "county": "Rutherford" + }, + { + "zip_code": 28052, + "latitude": 35.267916, + "longitude": -81.178725, + "city": "Gastonia", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28053, + "latitude": 35.275073, + "longitude": -81.213369, + "city": "Gastonia", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28054, + "latitude": 35.249452, + "longitude": -81.133003, + "city": "Gastonia", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28055, + "latitude": 35.284018, + "longitude": -81.189693, + "city": "Gastonia", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28056, + "latitude": 35.242038, + "longitude": -81.169072, + "city": "Gastonia", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28070, + "latitude": 35.462187, + "longitude": -80.898668, + "city": "Huntersville", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28071, + "latitude": 35.547494, + "longitude": -80.310215, + "city": "Gold Hill", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 28072, + "latitude": 35.610921, + "longitude": -80.436124, + "city": "Granite Quarry", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 28073, + "latitude": 35.204027, + "longitude": -81.471909, + "city": "Grover", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28074, + "latitude": 35.224743, + "longitude": -81.885081, + "city": "Harris", + "state": "NC", + "county": "Rutherford" + }, + { + "zip_code": 28075, + "latitude": 35.353672, + "longitude": -80.672368, + "city": "Harrisburg", + "state": "NC", + "county": "Cabarrus" + }, + { + "zip_code": 28076, + "latitude": 35.226581, + "longitude": -81.795027, + "city": "Henrietta", + "state": "NC", + "county": "Rutherford" + }, + { + "zip_code": 28077, + "latitude": 35.404157, + "longitude": -81.194174, + "city": "High Shoals", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28078, + "latitude": 35.401071, + "longitude": -80.869457, + "city": "Huntersville", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28079, + "latitude": 35.115644, + "longitude": -80.597878, + "city": "Indian Trail", + "state": "NC", + "county": "Union" + }, + { + "zip_code": 28080, + "latitude": 35.472855, + "longitude": -81.106202, + "city": "Iron Station", + "state": "NC", + "county": "Lincoln" + }, + { + "zip_code": 28081, + "latitude": 35.462981, + "longitude": -80.672531, + "city": "Kannapolis", + "state": "NC", + "county": "Cabarrus" + }, + { + "zip_code": 28082, + "latitude": 35.346285, + "longitude": -80.541088, + "city": "Kannapolis", + "state": "NC", + "county": "Cabarrus" + }, + { + "zip_code": 28083, + "latitude": 35.476586, + "longitude": -80.571498, + "city": "Kannapolis", + "state": "NC", + "county": "Cabarrus" + }, + { + "zip_code": 28086, + "latitude": 35.296207, + "longitude": -81.491436, + "city": "Kings Mountain", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28088, + "latitude": 35.545428, + "longitude": -80.608038, + "city": "Landis", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 28089, + "latitude": 35.308726, + "longitude": -81.661675, + "city": "Lattimore", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28090, + "latitude": 35.433739, + "longitude": -81.569729, + "city": "Lawndale", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28091, + "latitude": 34.967043, + "longitude": -79.98678, + "city": "Lilesville", + "state": "NC", + "county": "Anson" + }, + { + "zip_code": 28092, + "latitude": 35.485145, + "longitude": -81.181799, + "city": "Lincolnton", + "state": "NC", + "county": "Lincoln" + }, + { + "zip_code": 28093, + "latitude": 35.484822, + "longitude": -81.239543, + "city": "Lincolnton", + "state": "NC", + "county": "Lincoln" + }, + { + "zip_code": 28097, + "latitude": 35.262131, + "longitude": -80.424512, + "city": "Locust", + "state": "NC", + "county": "Stanly" + }, + { + "zip_code": 28098, + "latitude": 35.262444, + "longitude": -81.097965, + "city": "Lowell", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28101, + "latitude": 35.26749, + "longitude": -81.09104, + "city": "Mc Adenville", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28102, + "latitude": 34.813634, + "longitude": -79.97756, + "city": "Mc Farlan", + "state": "NC", + "county": "Anson" + }, + { + "zip_code": 28103, + "latitude": 34.997268, + "longitude": -80.364223, + "city": "Marshville", + "state": "NC", + "county": "Union" + }, + { + "zip_code": 28104, + "latitude": 35.089042, + "longitude": -80.704424, + "city": "Matthews", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28105, + "latitude": 35.114887, + "longitude": -80.704991, + "city": "Matthews", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28106, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Matthews", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28107, + "latitude": 35.250608, + "longitude": -80.535601, + "city": "Midland", + "state": "NC", + "county": "Cabarrus" + }, + { + "zip_code": 28108, + "latitude": 34.916253, + "longitude": -80.640383, + "city": "Mineral Springs", + "state": "NC", + "county": "Union" + }, + { + "zip_code": 28109, + "latitude": 35.480124, + "longitude": -80.270445, + "city": "Misenheimer", + "state": "NC", + "county": "Stanly" + }, + { + "zip_code": 28110, + "latitude": 35.074176, + "longitude": -80.527827, + "city": "Monroe", + "state": "NC", + "county": "Union" + }, + { + "zip_code": 28111, + "latitude": 35.011204, + "longitude": -80.558743, + "city": "Monroe", + "state": "NC", + "county": "Union" + }, + { + "zip_code": 28112, + "latitude": 34.901591, + "longitude": -80.527201, + "city": "Monroe", + "state": "NC", + "county": "Union" + }, + { + "zip_code": 28114, + "latitude": 35.256702, + "longitude": -81.700869, + "city": "Mooresboro", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28115, + "latitude": 35.688136, + "longitude": -80.819825, + "city": "Mooresville", + "state": "NC", + "county": "Iredell" + }, + { + "zip_code": 28117, + "latitude": 35.583962, + "longitude": -80.868463, + "city": "Mooresville", + "state": "NC", + "county": "Iredell" + }, + { + "zip_code": 28119, + "latitude": 34.921646, + "longitude": -80.135131, + "city": "Morven", + "state": "NC", + "county": "Anson" + }, + { + "zip_code": 28120, + "latitude": 35.318697, + "longitude": -81.026738, + "city": "Mount Holly", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28123, + "latitude": 35.529792, + "longitude": -80.947028, + "city": "Mount Mourne", + "state": "NC", + "county": "Iredell" + }, + { + "zip_code": 28124, + "latitude": 35.416779, + "longitude": -80.416474, + "city": "Mount Pleasant", + "state": "NC", + "county": "Cabarrus" + }, + { + "zip_code": 28125, + "latitude": 35.656287, + "longitude": -80.701616, + "city": "Mount Ulla", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 28126, + "latitude": 35.276794, + "longitude": -80.716495, + "city": "Newell", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28127, + "latitude": 35.44125, + "longitude": -80.225068, + "city": "New London", + "state": "NC", + "county": "Stanly" + }, + { + "zip_code": 28128, + "latitude": 35.30281, + "longitude": -80.196863, + "city": "Norwood", + "state": "NC", + "county": "Stanly" + }, + { + "zip_code": 28129, + "latitude": 35.240666, + "longitude": -80.319154, + "city": "Oakboro", + "state": "NC", + "county": "Stanly" + }, + { + "zip_code": 28130, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Paw Creek", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28133, + "latitude": 35.011107, + "longitude": -80.255799, + "city": "Peachland", + "state": "NC", + "county": "Anson" + }, + { + "zip_code": 28134, + "latitude": 35.07854, + "longitude": -80.891141, + "city": "Pineville", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28135, + "latitude": 35.023262, + "longitude": -80.210985, + "city": "Polkton", + "state": "NC", + "county": "Anson" + }, + { + "zip_code": 28136, + "latitude": 35.396126, + "longitude": -81.630272, + "city": "Polkville", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28137, + "latitude": 35.454142, + "longitude": -80.283764, + "city": "Richfield", + "state": "NC", + "county": "Stanly" + }, + { + "zip_code": 28138, + "latitude": 35.541642, + "longitude": -80.455915, + "city": "Rockwell", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 28139, + "latitude": 35.339729, + "longitude": -82.004874, + "city": "Rutherfordton", + "state": "NC", + "county": "Rutherford" + }, + { + "zip_code": 28144, + "latitude": 35.680441, + "longitude": -80.45316, + "city": "Salisbury", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 28145, + "latitude": 35.682683, + "longitude": -80.477116, + "city": "Salisbury", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 28146, + "latitude": 35.618694, + "longitude": -80.402235, + "city": "Salisbury", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 28147, + "latitude": 35.681714, + "longitude": -80.561516, + "city": "Salisbury", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 28150, + "latitude": 35.312012, + "longitude": -81.556777, + "city": "Shelby", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28151, + "latitude": 35.233125, + "longitude": -81.574711, + "city": "Shelby", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28152, + "latitude": 35.329336, + "longitude": -81.580919, + "city": "Shelby", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28159, + "latitude": 35.691689, + "longitude": -80.432679, + "city": "Spencer", + "state": "NC", + "county": "Rowan" + }, + { + "zip_code": 28160, + "latitude": 35.354511, + "longitude": -81.9211, + "city": "Spindale", + "state": "NC", + "county": "Rutherford" + }, + { + "zip_code": 28163, + "latitude": 35.258365, + "longitude": -80.415177, + "city": "Stanfield", + "state": "NC", + "county": "Stanly" + }, + { + "zip_code": 28164, + "latitude": 35.329185, + "longitude": -81.057419, + "city": "Stanley", + "state": "NC", + "county": "Gaston" + }, + { + "zip_code": 28166, + "latitude": 35.679407, + "longitude": -80.898817, + "city": "Troutman", + "state": "NC", + "county": "Iredell" + }, + { + "zip_code": 28167, + "latitude": 35.486941, + "longitude": -81.975821, + "city": "Union Mills", + "state": "NC", + "county": "Rutherford" + }, + { + "zip_code": 28168, + "latitude": 35.521229, + "longitude": -81.418729, + "city": "Vale", + "state": "NC", + "county": "Lincoln" + }, + { + "zip_code": 28169, + "latitude": 35.35289, + "longitude": -81.425111, + "city": "Waco", + "state": "NC", + "county": "Cleveland" + }, + { + "zip_code": 28170, + "latitude": 34.924469, + "longitude": -80.05003, + "city": "Wadesboro", + "state": "NC", + "county": "Anson" + }, + { + "zip_code": 28173, + "latitude": 34.925105, + "longitude": -80.72775, + "city": "Waxhaw", + "state": "NC", + "county": "Union" + }, + { + "zip_code": 28174, + "latitude": 34.964812, + "longitude": -80.427656, + "city": "Wingate", + "state": "NC", + "county": "Union" + }, + { + "zip_code": 28201, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28202, + "latitude": 35.226192, + "longitude": -80.843493, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28203, + "latitude": 35.208992, + "longitude": -80.856343, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28204, + "latitude": 35.215342, + "longitude": -80.828706, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28205, + "latitude": 35.325959, + "longitude": -80.827444, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28206, + "latitude": 35.250841, + "longitude": -80.820091, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28207, + "latitude": 35.195393, + "longitude": -80.826393, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28208, + "latitude": 35.209125, + "longitude": -80.92175, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28209, + "latitude": 35.174351, + "longitude": -80.853396, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28210, + "latitude": 35.156753, + "longitude": -80.851319, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28211, + "latitude": 35.169586, + "longitude": -80.79076, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28212, + "latitude": 35.186185, + "longitude": -80.749617, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28213, + "latitude": 35.283599, + "longitude": -80.763757, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28214, + "latitude": 35.279945, + "longitude": -80.864057, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28215, + "latitude": 35.246597, + "longitude": -80.788726, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28216, + "latitude": 35.298775, + "longitude": -80.895731, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28217, + "latitude": 35.133618, + "longitude": -80.963642, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28218, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28219, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28220, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28221, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28222, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28223, + "latitude": 35.304093, + "longitude": -80.726687, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28224, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28225, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28226, + "latitude": 35.108637, + "longitude": -80.82747, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28227, + "latitude": 35.136591, + "longitude": -80.711197, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28228, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28229, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28230, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28231, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28232, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28233, + "latitude": 35.489411, + "longitude": -80.825368, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28234, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28235, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28236, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28237, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28240, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28241, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28242, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28243, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28244, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28246, + "latitude": 35.227542, + "longitude": -80.842543, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28247, + "latitude": 35.065595, + "longitude": -80.851149, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28250, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28253, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28254, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28255, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28256, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28258, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28260, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28261, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28262, + "latitude": 35.318311, + "longitude": -80.747559, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28265, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28266, + "latitude": 35.284459, + "longitude": -80.858155, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28269, + "latitude": 35.331981, + "longitude": -80.798583, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28270, + "latitude": 35.112999, + "longitude": -80.762565, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28271, + "latitude": "", + "longitude": "", + "city": "Charlotte", + "state": "NC", + "county": "" + }, + { + "zip_code": 28272, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28273, + "latitude": 35.128678, + "longitude": -80.933793, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28274, + "latitude": 35.187943, + "longitude": -80.831693, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28275, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28277, + "latitude": 35.055216, + "longitude": -80.819488, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28278, + "latitude": 35.20724, + "longitude": -80.956766, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28280, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28281, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28282, + "latitude": 35.224242, + "longitude": -80.844743, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28283, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28284, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28285, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28286, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28287, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28288, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28289, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28290, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28296, + "latitude": 35.225242, + "longitude": -80.845843, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28297, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28299, + "latitude": 35.26002, + "longitude": -80.804151, + "city": "Charlotte", + "state": "NC", + "county": "Mecklenburg" + }, + { + "zip_code": 28301, + "latitude": 35.053416, + "longitude": -78.781027, + "city": "Fayetteville", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28302, + "latitude": 35.034307, + "longitude": -78.908828, + "city": "Fayetteville", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28303, + "latitude": 35.074168, + "longitude": -78.964952, + "city": "Fayetteville", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28304, + "latitude": 35.020629, + "longitude": -78.99091, + "city": "Fayetteville", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28305, + "latitude": 35.050713, + "longitude": -78.906552, + "city": "Fayetteville", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28306, + "latitude": 34.942986, + "longitude": -78.884801, + "city": "Fayetteville", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28307, + "latitude": 35.140193, + "longitude": -78.987942, + "city": "Fort Bragg", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28308, + "latitude": 35.173377, + "longitude": -79.013799, + "city": "Pope A F B", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28309, + "latitude": 35.039726, + "longitude": -78.842868, + "city": "Fayetteville", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28310, + "latitude": 35.050612, + "longitude": -78.80384, + "city": "Fort Bragg", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28311, + "latitude": 35.156447, + "longitude": -78.912281, + "city": "Fayetteville", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28314, + "latitude": 35.05425, + "longitude": -79.011328, + "city": "Fayetteville", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28315, + "latitude": 35.203802, + "longitude": -79.517795, + "city": "Aberdeen", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 28318, + "latitude": 35.066726, + "longitude": -78.590479, + "city": "Autryville", + "state": "NC", + "county": "Sampson" + }, + { + "zip_code": 28319, + "latitude": 34.595364, + "longitude": -79.197058, + "city": "Barnesville", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28320, + "latitude": 34.621027, + "longitude": -78.725506, + "city": "Bladenboro", + "state": "NC", + "county": "Bladen" + }, + { + "zip_code": 28323, + "latitude": 35.312764, + "longitude": -78.914817, + "city": "Bunnlevel", + "state": "NC", + "county": "Harnett" + }, + { + "zip_code": 28325, + "latitude": 35.141931, + "longitude": -78.099221, + "city": "Calypso", + "state": "NC", + "county": "Duplin" + }, + { + "zip_code": 28326, + "latitude": 35.310584, + "longitude": -79.347244, + "city": "Cameron", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 28327, + "latitude": 35.32304, + "longitude": -79.428264, + "city": "Carthage", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 28328, + "latitude": 35.006676, + "longitude": -78.415415, + "city": "Clinton", + "state": "NC", + "county": "Sampson" + }, + { + "zip_code": 28329, + "latitude": 34.994005, + "longitude": -78.277669, + "city": "Clinton", + "state": "NC", + "county": "Sampson" + }, + { + "zip_code": 28330, + "latitude": 34.974434, + "longitude": -79.79851, + "city": "Cordova", + "state": "NC", + "county": "Richmond" + }, + { + "zip_code": 28331, + "latitude": 35.150896, + "longitude": -78.915788, + "city": "Cumberland", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28332, + "latitude": 34.64374, + "longitude": -78.737402, + "city": "Dublin", + "state": "NC", + "county": "Bladen" + }, + { + "zip_code": 28333, + "latitude": 35.266919, + "longitude": -78.025587, + "city": "Dudley", + "state": "NC", + "county": "Wayne" + }, + { + "zip_code": 28334, + "latitude": 35.325672, + "longitude": -78.693354, + "city": "Dunn", + "state": "NC", + "county": "Harnett" + }, + { + "zip_code": 28335, + "latitude": 35.350774, + "longitude": -78.625362, + "city": "Dunn", + "state": "NC", + "county": "Harnett" + }, + { + "zip_code": 28337, + "latitude": 34.660959, + "longitude": -78.621643, + "city": "Elizabethtown", + "state": "NC", + "county": "Bladen" + }, + { + "zip_code": 28338, + "latitude": 35.095959, + "longitude": -79.714244, + "city": "Ellerbe", + "state": "NC", + "county": "Richmond" + }, + { + "zip_code": 28339, + "latitude": 35.330059, + "longitude": -78.705859, + "city": "Erwin", + "state": "NC", + "county": "Harnett" + }, + { + "zip_code": 28340, + "latitude": 34.623018, + "longitude": -79.148832, + "city": "Fairmont", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28341, + "latitude": 35.105419, + "longitude": -78.102083, + "city": "Faison", + "state": "NC", + "county": "Duplin" + }, + { + "zip_code": 28342, + "latitude": 35.210565, + "longitude": -78.649602, + "city": "Falcon", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28343, + "latitude": 34.795061, + "longitude": -79.577405, + "city": "Gibson", + "state": "NC", + "county": "Scotland" + }, + { + "zip_code": 28344, + "latitude": 35.194383, + "longitude": -78.678821, + "city": "Godwin", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28345, + "latitude": 34.937085, + "longitude": -79.649111, + "city": "Hamlet", + "state": "NC", + "county": "Richmond" + }, + { + "zip_code": 28347, + "latitude": 35.035103, + "longitude": -79.551692, + "city": "Hoffman", + "state": "NC", + "county": "Richmond" + }, + { + "zip_code": 28348, + "latitude": 34.921277, + "longitude": -78.93292, + "city": "Hope Mills", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28349, + "latitude": 35.015157, + "longitude": -77.896863, + "city": "Kenansville", + "state": "NC", + "county": "Duplin" + }, + { + "zip_code": 28350, + "latitude": 35.230608, + "longitude": -79.315694, + "city": "Lakeview", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 28351, + "latitude": 34.77465, + "longitude": -79.571125, + "city": "Laurel Hill", + "state": "NC", + "county": "Scotland" + }, + { + "zip_code": 28352, + "latitude": 34.796929, + "longitude": -79.475606, + "city": "Laurinburg", + "state": "NC", + "county": "Scotland" + }, + { + "zip_code": 28353, + "latitude": 34.781768, + "longitude": -79.482423, + "city": "Laurinburg", + "state": "NC", + "county": "Scotland" + }, + { + "zip_code": 28355, + "latitude": 35.467567, + "longitude": -79.165314, + "city": "Lemon Springs", + "state": "NC", + "county": "Lee" + }, + { + "zip_code": 28356, + "latitude": 35.218025, + "longitude": -78.783749, + "city": "Linden", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28357, + "latitude": 34.778165, + "longitude": -79.163606, + "city": "Lumber Bridge", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28358, + "latitude": 34.631016, + "longitude": -79.106224, + "city": "Lumberton", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28359, + "latitude": 34.607669, + "longitude": -79.014425, + "city": "Lumberton", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28360, + "latitude": 34.669719, + "longitude": -79.108363, + "city": "Lumberton", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28361, + "latitude": 35.02363, + "longitude": -79.246841, + "city": "Mccain", + "state": "NC", + "county": "Hoke" + }, + { + "zip_code": 28362, + "latitude": 34.379114, + "longitude": -79.127936, + "city": "Marietta", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28363, + "latitude": 34.97281, + "longitude": -79.61268, + "city": "Marston", + "state": "NC", + "county": "Richmond" + }, + { + "zip_code": 28364, + "latitude": 34.711437, + "longitude": -79.318072, + "city": "Maxton", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28365, + "latitude": 35.229061, + "longitude": -78.09006, + "city": "Mount Olive", + "state": "NC", + "county": "Wayne" + }, + { + "zip_code": 28366, + "latitude": 35.14936, + "longitude": -78.333526, + "city": "Newton Grove", + "state": "NC", + "county": "Sampson" + }, + { + "zip_code": 28367, + "latitude": 35.162723, + "longitude": -79.73794, + "city": "Norman", + "state": "NC", + "county": "Richmond" + }, + { + "zip_code": 28368, + "latitude": 35.322949, + "longitude": -79.107381, + "city": "Olivia", + "state": "NC", + "county": "Harnett" + }, + { + "zip_code": 28369, + "latitude": 34.473204, + "longitude": -79.034509, + "city": "Orrum", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28370, + "latitude": 35.216222, + "longitude": -79.452352, + "city": "Pinehurst", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 28371, + "latitude": 34.896504, + "longitude": -78.99298, + "city": "Parkton", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28372, + "latitude": 34.716443, + "longitude": -79.127951, + "city": "Pembroke", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28373, + "latitude": 35.100733, + "longitude": -79.466296, + "city": "Pinebluff", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 28374, + "latitude": 35.211461, + "longitude": -79.413311, + "city": "Pinehurst", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 28375, + "latitude": 34.471259, + "longitude": -79.041388, + "city": "Proctorville", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28376, + "latitude": 34.953431, + "longitude": -79.233178, + "city": "Raeford", + "state": "NC", + "county": "Hoke" + }, + { + "zip_code": 28377, + "latitude": 34.700472, + "longitude": -79.113936, + "city": "Red Springs", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28378, + "latitude": 34.854316, + "longitude": -79.064165, + "city": "Rex", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28379, + "latitude": 34.974134, + "longitude": -79.724173, + "city": "Rockingham", + "state": "NC", + "county": "Richmond" + }, + { + "zip_code": 28380, + "latitude": 34.994152, + "longitude": -79.767341, + "city": "Rockingham", + "state": "NC", + "county": "Richmond" + }, + { + "zip_code": 28382, + "latitude": 35.00116, + "longitude": -78.451568, + "city": "Roseboro", + "state": "NC", + "county": "Sampson" + }, + { + "zip_code": 28383, + "latitude": 34.665311, + "longitude": -79.196744, + "city": "Rowland", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28384, + "latitude": 34.797081, + "longitude": -78.968753, + "city": "Saint Pauls", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28385, + "latitude": 35.045096, + "longitude": -78.508895, + "city": "Salemburg", + "state": "NC", + "county": "Sampson" + }, + { + "zip_code": 28386, + "latitude": 34.765637, + "longitude": -79.031674, + "city": "Shannon", + "state": "NC", + "county": "Robeson" + }, + { + "zip_code": 28387, + "latitude": 35.218064, + "longitude": -79.394988, + "city": "Southern Pines", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 28388, + "latitude": 35.280335, + "longitude": -79.432734, + "city": "Southern Pines", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 28390, + "latitude": 35.189079, + "longitude": -78.977243, + "city": "Spring Lake", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28391, + "latitude": 35.030903, + "longitude": -78.700219, + "city": "Stedman", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28392, + "latitude": 34.745753, + "longitude": -78.809292, + "city": "Tar Heel", + "state": "NC", + "county": "Bladen" + }, + { + "zip_code": 28393, + "latitude": 34.984688, + "longitude": -78.198087, + "city": "Turkey", + "state": "NC", + "county": "Sampson" + }, + { + "zip_code": 28394, + "latitude": 35.230348, + "longitude": -79.337956, + "city": "Vass", + "state": "NC", + "county": "Moore" + }, + { + "zip_code": 28395, + "latitude": 35.142518, + "longitude": -78.745001, + "city": "Wade", + "state": "NC", + "county": "Cumberland" + }, + { + "zip_code": 28396, + "latitude": 34.903601, + "longitude": -79.404128, + "city": "Wagram", + "state": "NC", + "county": "Scotland" + }, + { + "zip_code": 28398, + "latitude": 35.01803, + "longitude": -78.031022, + "city": "Warsaw", + "state": "NC", + "county": "Duplin" + }, + { + "zip_code": 28399, + "latitude": 34.762175, + "longitude": -78.679332, + "city": "White Oak", + "state": "NC", + "county": "Bladen" + }, + { + "zip_code": 28401, + "latitude": 34.163503, + "longitude": -77.95481, + "city": "Wilmington", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28402, + "latitude": 34.340518, + "longitude": -77.901408, + "city": "Wilmington", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28403, + "latitude": 34.139742, + "longitude": -77.870418, + "city": "Wilmington", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28404, + "latitude": 33.926255, + "longitude": -78.07127, + "city": "Wilmington", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28405, + "latitude": 34.184682, + "longitude": -77.836109, + "city": "Wilmington", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28406, + "latitude": 34.088079, + "longitude": -77.852599, + "city": "Wilmington", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28407, + "latitude": 34.088079, + "longitude": -77.852599, + "city": "Wilmington", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28408, + "latitude": 34.212707, + "longitude": -77.792177, + "city": "Wilmington", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28409, + "latitude": 34.13637, + "longitude": -77.862667, + "city": "Wilmington", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28410, + "latitude": 34.088079, + "longitude": -77.852599, + "city": "Wilmington", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28411, + "latitude": 34.303335, + "longitude": -77.803856, + "city": "Wilmington", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28412, + "latitude": 34.127458, + "longitude": -77.91859, + "city": "Wilmington", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28420, + "latitude": 34.06493, + "longitude": -78.494942, + "city": "Ash", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28421, + "latitude": 34.510936, + "longitude": -78.094517, + "city": "Atkinson", + "state": "NC", + "county": "Pender" + }, + { + "zip_code": 28422, + "latitude": 34.017181, + "longitude": -78.172242, + "city": "Bolivia", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28423, + "latitude": 34.275295, + "longitude": -78.350029, + "city": "Bolton", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28424, + "latitude": 34.290716, + "longitude": -78.699417, + "city": "Brunswick", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28425, + "latitude": 34.546108, + "longitude": -77.937122, + "city": "Burgaw", + "state": "NC", + "county": "Pender" + }, + { + "zip_code": 28428, + "latitude": 34.035151, + "longitude": -77.895702, + "city": "Carolina Beach", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28429, + "latitude": 34.329932, + "longitude": -77.887477, + "city": "Castle Hayne", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28430, + "latitude": 34.301907, + "longitude": -78.725768, + "city": "Cerro Gordo", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28431, + "latitude": 34.316747, + "longitude": -78.891483, + "city": "Chadbourn", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28432, + "latitude": 34.165516, + "longitude": -78.789061, + "city": "Clarendon", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28433, + "latitude": 34.529167, + "longitude": -78.592149, + "city": "Clarkton", + "state": "NC", + "county": "Bladen" + }, + { + "zip_code": 28434, + "latitude": 34.471042, + "longitude": -78.477201, + "city": "Council", + "state": "NC", + "county": "Bladen" + }, + { + "zip_code": 28435, + "latitude": 34.441229, + "longitude": -78.115064, + "city": "Currie", + "state": "NC", + "county": "Pender" + }, + { + "zip_code": 28436, + "latitude": 34.283839, + "longitude": -78.260664, + "city": "Delco", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28438, + "latitude": 34.420379, + "longitude": -78.894652, + "city": "Evergreen", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28439, + "latitude": 34.278093, + "longitude": -78.987194, + "city": "Fair Bluff", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28441, + "latitude": 34.822898, + "longitude": -78.323226, + "city": "Garland", + "state": "NC", + "county": "Sampson" + }, + { + "zip_code": 28442, + "latitude": 34.337401, + "longitude": -78.652989, + "city": "Hallsboro", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28443, + "latitude": 34.391419, + "longitude": -77.658725, + "city": "Hampstead", + "state": "NC", + "county": "Pender" + }, + { + "zip_code": 28444, + "latitude": 34.711792, + "longitude": -78.26273, + "city": "Harrells", + "state": "NC", + "county": "Sampson" + }, + { + "zip_code": 28445, + "latitude": 34.527983, + "longitude": -77.514707, + "city": "Holly Ridge", + "state": "NC", + "county": "Onslow" + }, + { + "zip_code": 28446, + "latitude": 34.83661, + "longitude": -78.348111, + "city": "Ingold", + "state": "NC", + "county": "Sampson" + }, + { + "zip_code": 28447, + "latitude": 34.623287, + "longitude": -78.234209, + "city": "Ivanhoe", + "state": "NC", + "county": "Sampson" + }, + { + "zip_code": 28448, + "latitude": 34.497157, + "longitude": -78.322339, + "city": "Kelly", + "state": "NC", + "county": "Bladen" + }, + { + "zip_code": 28449, + "latitude": 33.986817, + "longitude": -77.920117, + "city": "Kure Beach", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28450, + "latitude": 34.345825, + "longitude": -78.751361, + "city": "Lake Waccamaw", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28451, + "latitude": 34.245499, + "longitude": -78.083622, + "city": "Leland", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28452, + "latitude": 33.997292, + "longitude": -78.554121, + "city": "Longwood", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28453, + "latitude": 34.885139, + "longitude": -78.034098, + "city": "Magnolia", + "state": "NC", + "county": "Duplin" + }, + { + "zip_code": 28454, + "latitude": 34.659359, + "longitude": -77.711665, + "city": "Maple Hill", + "state": "NC", + "county": "Pender" + }, + { + "zip_code": 28455, + "latitude": 34.117032, + "longitude": -78.690122, + "city": "Nakina", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28456, + "latitude": 34.353063, + "longitude": -78.24873, + "city": "Riegelwood", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28457, + "latitude": 34.477635, + "longitude": -77.816971, + "city": "Rocky Point", + "state": "NC", + "county": "Pender" + }, + { + "zip_code": 28458, + "latitude": 34.829225, + "longitude": -78.022982, + "city": "Rose Hill", + "state": "NC", + "county": "Duplin" + }, + { + "zip_code": 28459, + "latitude": 33.933388, + "longitude": -78.412864, + "city": "Shallotte", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28460, + "latitude": 34.60694, + "longitude": -77.426164, + "city": "Sneads Ferry", + "state": "NC", + "county": "Onslow" + }, + { + "zip_code": 28461, + "latitude": 33.966293, + "longitude": -78.238126, + "city": "Southport", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28462, + "latitude": 34.002551, + "longitude": -78.223678, + "city": "Supply", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28463, + "latitude": 34.153412, + "longitude": -78.635372, + "city": "Tabor City", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28464, + "latitude": 34.778119, + "longitude": -77.967075, + "city": "Teachey", + "state": "NC", + "county": "Duplin" + }, + { + "zip_code": 28465, + "latitude": 34.090202, + "longitude": -78.127035, + "city": "Oak Island", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28466, + "latitude": 34.76743, + "longitude": -77.940027, + "city": "Wallace", + "state": "NC", + "county": "Duplin" + }, + { + "zip_code": 28467, + "latitude": 33.911953, + "longitude": -78.395641, + "city": "Calabash", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28468, + "latitude": 33.945533, + "longitude": -78.327029, + "city": "Sunset Beach", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28469, + "latitude": 33.936658, + "longitude": -78.271319, + "city": "Ocean Isle Beach", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28470, + "latitude": 33.992923, + "longitude": -78.311346, + "city": "Shallotte", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28471, + "latitude": 34.613953, + "longitude": -78.03154, + "city": "Watha", + "state": "NC", + "county": "Pender" + }, + { + "zip_code": 28472, + "latitude": 34.262252, + "longitude": -78.625479, + "city": "Whiteville", + "state": "NC", + "county": "Columbus" + }, + { + "zip_code": 28478, + "latitude": 34.67509, + "longitude": -78.044929, + "city": "Willard", + "state": "NC", + "county": "Pender" + }, + { + "zip_code": 28479, + "latitude": 34.155253, + "longitude": -78.055776, + "city": "Winnabow", + "state": "NC", + "county": "Brunswick" + }, + { + "zip_code": 28480, + "latitude": 34.214489, + "longitude": -77.859467, + "city": "Wrightsville Beach", + "state": "NC", + "county": "New Hanover" + }, + { + "zip_code": 28501, + "latitude": 35.220079, + "longitude": -77.615508, + "city": "Kinston", + "state": "NC", + "county": "Lenoir" + }, + { + "zip_code": 28502, + "latitude": 35.288558, + "longitude": -77.662614, + "city": "Kinston", + "state": "NC", + "county": "Lenoir" + }, + { + "zip_code": 28503, + "latitude": 35.319066, + "longitude": -77.595034, + "city": "Kinston", + "state": "NC", + "county": "Lenoir" + }, + { + "zip_code": 28504, + "latitude": 35.205977, + "longitude": -77.657605, + "city": "Kinston", + "state": "NC", + "county": "Lenoir" + }, + { + "zip_code": 28508, + "latitude": 35.103676, + "longitude": -77.824959, + "city": "Albertson", + "state": "NC", + "county": "Duplin" + }, + { + "zip_code": 28509, + "latitude": 35.156145, + "longitude": -76.632264, + "city": "Alliance", + "state": "NC", + "county": "Pamlico" + }, + { + "zip_code": 28510, + "latitude": 35.034156, + "longitude": -76.798574, + "city": "Arapahoe", + "state": "NC", + "county": "Pamlico" + }, + { + "zip_code": 28511, + "latitude": 34.873922, + "longitude": -76.587097, + "city": "Atlantic", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28512, + "latitude": 34.741717, + "longitude": -76.755456, + "city": "Atlantic Beach", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28513, + "latitude": 35.463405, + "longitude": -77.359224, + "city": "Ayden", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 28515, + "latitude": 35.13584, + "longitude": -76.70564, + "city": "Bayboro", + "state": "NC", + "county": "Pamlico" + }, + { + "zip_code": 28516, + "latitude": 34.753777, + "longitude": -76.610744, + "city": "Beaufort", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28518, + "latitude": 34.895292, + "longitude": -77.785362, + "city": "Beulaville", + "state": "NC", + "county": "Duplin" + }, + { + "zip_code": 28519, + "latitude": 35.129461, + "longitude": -77.01996, + "city": "Bridgeton", + "state": "NC", + "county": "Craven" + }, + { + "zip_code": 28520, + "latitude": 34.873922, + "longitude": -76.587097, + "city": "Cedar Island", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28521, + "latitude": 34.897753, + "longitude": -77.77497, + "city": "Chinquapin", + "state": "NC", + "county": "Duplin" + }, + { + "zip_code": 28522, + "latitude": 35.005079, + "longitude": -77.523102, + "city": "Comfort", + "state": "NC", + "county": "Jones" + }, + { + "zip_code": 28523, + "latitude": 35.229878, + "longitude": -77.304943, + "city": "Cove City", + "state": "NC", + "county": "Craven" + }, + { + "zip_code": 28524, + "latitude": 34.873922, + "longitude": -76.587097, + "city": "Davis", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28525, + "latitude": 35.134409, + "longitude": -77.688191, + "city": "Deep Run", + "state": "NC", + "county": "Lenoir" + }, + { + "zip_code": 28526, + "latitude": 35.255441, + "longitude": -77.364631, + "city": "Dover", + "state": "NC", + "county": "Craven" + }, + { + "zip_code": 28527, + "latitude": 35.226396, + "longitude": -77.020149, + "city": "Ernul", + "state": "NC", + "county": "Craven" + }, + { + "zip_code": 28528, + "latitude": 34.873922, + "longitude": -76.587097, + "city": "Gloucester", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28529, + "latitude": 35.090185, + "longitude": -76.828552, + "city": "Grantsboro", + "state": "NC", + "county": "Pamlico" + }, + { + "zip_code": 28530, + "latitude": 35.440556, + "longitude": -77.399501, + "city": "Grifton", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 28531, + "latitude": 34.873922, + "longitude": -76.587097, + "city": "Harkers Island", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28532, + "latitude": 35.028677, + "longitude": -77.053443, + "city": "Havelock", + "state": "NC", + "county": "Craven" + }, + { + "zip_code": 28533, + "latitude": 34.903793, + "longitude": -76.899976, + "city": "Cherry Point", + "state": "NC", + "county": "Craven" + }, + { + "zip_code": 28537, + "latitude": 35.266039, + "longitude": -76.577201, + "city": "Hobucken", + "state": "NC", + "county": "Pamlico" + }, + { + "zip_code": 28538, + "latitude": 35.421956, + "longitude": -77.591228, + "city": "Hookerton", + "state": "NC", + "county": "Greene" + }, + { + "zip_code": 28539, + "latitude": 34.709544, + "longitude": -77.222926, + "city": "Hubert", + "state": "NC", + "county": "Onslow" + }, + { + "zip_code": 28540, + "latitude": 34.726587, + "longitude": -77.414673, + "city": "Jacksonville", + "state": "NC", + "county": "Onslow" + }, + { + "zip_code": 28541, + "latitude": 34.692056, + "longitude": -77.391199, + "city": "Jacksonville", + "state": "NC", + "county": "Onslow" + }, + { + "zip_code": 28542, + "latitude": 34.664035, + "longitude": -77.463687, + "city": "Camp Lejeune", + "state": "NC", + "county": "Onslow" + }, + { + "zip_code": 28543, + "latitude": 34.736045, + "longitude": -77.382049, + "city": "Tarawa Terrace", + "state": "NC", + "county": "Onslow" + }, + { + "zip_code": 28544, + "latitude": 34.622795, + "longitude": -77.417426, + "city": "Midway Park", + "state": "NC", + "county": "Onslow" + }, + { + "zip_code": 28545, + "latitude": 34.692056, + "longitude": -77.391199, + "city": "Mccutcheon Field", + "state": "NC", + "county": "Onslow" + }, + { + "zip_code": 28546, + "latitude": 34.720825, + "longitude": -77.444847, + "city": "Jacksonville", + "state": "NC", + "county": "Onslow" + }, + { + "zip_code": 28547, + "latitude": 34.690934, + "longitude": -77.361429, + "city": "Camp Lejeune", + "state": "NC", + "county": "Onslow" + }, + { + "zip_code": 28551, + "latitude": 35.215944, + "longitude": -77.631048, + "city": "La Grange", + "state": "NC", + "county": "Lenoir" + }, + { + "zip_code": 28552, + "latitude": 35.282911, + "longitude": -76.583839, + "city": "Lowland", + "state": "NC", + "county": "Pamlico" + }, + { + "zip_code": 28553, + "latitude": 34.873922, + "longitude": -76.587097, + "city": "Marshallberg", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28554, + "latitude": 35.49993, + "longitude": -77.651024, + "city": "Maury", + "state": "NC", + "county": "Greene" + }, + { + "zip_code": 28555, + "latitude": 34.934067, + "longitude": -77.280066, + "city": "Maysville", + "state": "NC", + "county": "Jones" + }, + { + "zip_code": 28556, + "latitude": 35.122377, + "longitude": -76.671887, + "city": "Merritt", + "state": "NC", + "county": "Pamlico" + }, + { + "zip_code": 28557, + "latitude": 34.727798, + "longitude": -76.770987, + "city": "Morehead City", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28560, + "latitude": 35.098109, + "longitude": -77.178429, + "city": "New Bern", + "state": "NC", + "county": "Craven" + }, + { + "zip_code": 28561, + "latitude": 35.103736, + "longitude": -77.07585, + "city": "New Bern", + "state": "NC", + "county": "Craven" + }, + { + "zip_code": 28562, + "latitude": 35.116959, + "longitude": -77.190548, + "city": "New Bern", + "state": "NC", + "county": "Craven" + }, + { + "zip_code": 28563, + "latitude": 35.110855, + "longitude": -77.06336, + "city": "New Bern", + "state": "NC", + "county": "Craven" + }, + { + "zip_code": 28564, + "latitude": 35.110855, + "longitude": -77.06336, + "city": "New Bern", + "state": "NC", + "county": "Craven" + }, + { + "zip_code": 28570, + "latitude": 34.766818, + "longitude": -76.878174, + "city": "Newport", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28571, + "latitude": 35.053819, + "longitude": -76.723675, + "city": "Oriental", + "state": "NC", + "county": "Pamlico" + }, + { + "zip_code": 28572, + "latitude": 35.057332, + "longitude": -77.694287, + "city": "Pink Hill", + "state": "NC", + "county": "Lenoir" + }, + { + "zip_code": 28573, + "latitude": 35.009751, + "longitude": -77.240202, + "city": "Pollocksville", + "state": "NC", + "county": "Jones" + }, + { + "zip_code": 28574, + "latitude": 34.860048, + "longitude": -77.581206, + "city": "Richlands", + "state": "NC", + "county": "Onslow" + }, + { + "zip_code": 28575, + "latitude": 34.873922, + "longitude": -76.587097, + "city": "Salter Path", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28577, + "latitude": 34.873922, + "longitude": -76.587097, + "city": "Sealevel", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28578, + "latitude": 35.217099, + "longitude": -77.897418, + "city": "Seven Springs", + "state": "NC", + "county": "Wayne" + }, + { + "zip_code": 28579, + "latitude": 34.873922, + "longitude": -76.587097, + "city": "Smyrna", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28580, + "latitude": 35.428349, + "longitude": -77.701329, + "city": "Snow Hill", + "state": "NC", + "county": "Greene" + }, + { + "zip_code": 28581, + "latitude": 34.873922, + "longitude": -76.587097, + "city": "Stacy", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28582, + "latitude": 34.873922, + "longitude": -76.587097, + "city": "Stella", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28583, + "latitude": 35.156145, + "longitude": -76.632264, + "city": "Stonewall", + "state": "NC", + "county": "Pamlico" + }, + { + "zip_code": 28584, + "latitude": 34.776677, + "longitude": -77.173963, + "city": "Swansboro", + "state": "NC", + "county": "Onslow" + }, + { + "zip_code": 28585, + "latitude": 35.057695, + "longitude": -77.431386, + "city": "Trenton", + "state": "NC", + "county": "Jones" + }, + { + "zip_code": 28586, + "latitude": 35.31313, + "longitude": -77.177912, + "city": "Vanceboro", + "state": "NC", + "county": "Craven" + }, + { + "zip_code": 28587, + "latitude": 35.191279, + "longitude": -76.660435, + "city": "Vandemere", + "state": "NC", + "county": "Pamlico" + }, + { + "zip_code": 28589, + "latitude": 34.873922, + "longitude": -76.587097, + "city": "Williston", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28590, + "latitude": 35.47461, + "longitude": -77.327423, + "city": "Winterville", + "state": "NC", + "county": "Pitt" + }, + { + "zip_code": 28594, + "latitude": 34.695016, + "longitude": -76.862415, + "city": "Emerald Isle", + "state": "NC", + "county": "Carteret" + }, + { + "zip_code": 28601, + "latitude": 35.758221, + "longitude": -81.308224, + "city": "Hickory", + "state": "NC", + "county": "Catawba" + }, + { + "zip_code": 28602, + "latitude": 35.661511, + "longitude": -81.269348, + "city": "Hickory", + "state": "NC", + "county": "Catawba" + }, + { + "zip_code": 28603, + "latitude": 35.679876, + "longitude": -81.287181, + "city": "Hickory", + "state": "NC", + "county": "Catawba" + }, + { + "zip_code": 28604, + "latitude": 36.072025, + "longitude": -81.910144, + "city": "Banner Elk", + "state": "NC", + "county": "Avery" + }, + { + "zip_code": 28605, + "latitude": 36.163862, + "longitude": -81.714505, + "city": "Blowing Rock", + "state": "NC", + "county": "Watauga" + }, + { + "zip_code": 28606, + "latitude": 36.122485, + "longitude": -81.23358, + "city": "Boomer", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28607, + "latitude": 36.222156, + "longitude": -81.699784, + "city": "Boone", + "state": "NC", + "county": "Watauga" + }, + { + "zip_code": 28608, + "latitude": 36.221334, + "longitude": -81.713416, + "city": "Boone", + "state": "NC", + "county": "Watauga" + }, + { + "zip_code": 28609, + "latitude": 35.684978, + "longitude": -81.044672, + "city": "Catawba", + "state": "NC", + "county": "Catawba" + }, + { + "zip_code": 28610, + "latitude": 35.730213, + "longitude": -81.12693, + "city": "Claremont", + "state": "NC", + "county": "Catawba" + }, + { + "zip_code": 28611, + "latitude": 35.994554, + "longitude": -81.726617, + "city": "Collettsville", + "state": "NC", + "county": "Caldwell" + }, + { + "zip_code": 28612, + "latitude": 35.689483, + "longitude": -81.538697, + "city": "Connellys Springs", + "state": "NC", + "county": "Burke" + }, + { + "zip_code": 28613, + "latitude": 35.740848, + "longitude": -81.209458, + "city": "Conover", + "state": "NC", + "county": "Catawba" + }, + { + "zip_code": 28615, + "latitude": 36.464673, + "longitude": -81.596886, + "city": "Creston", + "state": "NC", + "county": "Ashe" + }, + { + "zip_code": 28616, + "latitude": 36.059123, + "longitude": -81.889238, + "city": "Crossnore", + "state": "NC", + "county": "Avery" + }, + { + "zip_code": 28617, + "latitude": 36.494803, + "longitude": -81.385406, + "city": "Crumpler", + "state": "NC", + "county": "Ashe" + }, + { + "zip_code": 28618, + "latitude": 36.207343, + "longitude": -81.541072, + "city": "Deep Gap", + "state": "NC", + "county": "Watauga" + }, + { + "zip_code": 28619, + "latitude": 35.717868, + "longitude": -81.640557, + "city": "Drexel", + "state": "NC", + "county": "Burke" + }, + { + "zip_code": 28621, + "latitude": 36.318035, + "longitude": -80.799944, + "city": "Elkin", + "state": "NC", + "county": "Surry" + }, + { + "zip_code": 28622, + "latitude": 36.185475, + "longitude": -81.919892, + "city": "Elk Park", + "state": "NC", + "county": "Avery" + }, + { + "zip_code": 28623, + "latitude": 36.520689, + "longitude": -80.983323, + "city": "Ennice", + "state": "NC", + "county": "Alleghany" + }, + { + "zip_code": 28624, + "latitude": 36.114413, + "longitude": -81.412744, + "city": "Ferguson", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28625, + "latitude": 35.790866, + "longitude": -80.89757, + "city": "Statesville", + "state": "NC", + "county": "Iredell" + }, + { + "zip_code": 28626, + "latitude": 36.330187, + "longitude": -81.508408, + "city": "Fleetwood", + "state": "NC", + "county": "Ashe" + }, + { + "zip_code": 28627, + "latitude": 36.470469, + "longitude": -81.006386, + "city": "Glade Valley", + "state": "NC", + "county": "Alleghany" + }, + { + "zip_code": 28628, + "latitude": 35.721174, + "longitude": -81.817998, + "city": "Glen Alpine", + "state": "NC", + "county": "Burke" + }, + { + "zip_code": 28629, + "latitude": 36.348613, + "longitude": -81.374732, + "city": "Glendale Springs", + "state": "NC", + "county": "Ashe" + }, + { + "zip_code": 28630, + "latitude": 35.834865, + "longitude": -81.454664, + "city": "Granite Falls", + "state": "NC", + "county": "Caldwell" + }, + { + "zip_code": 28631, + "latitude": 36.545329, + "longitude": -81.41463, + "city": "Grassy Creek", + "state": "NC", + "county": "Ashe" + }, + { + "zip_code": 28633, + "latitude": 35.937564, + "longitude": -81.539847, + "city": "Lenoir", + "state": "NC", + "county": "Caldwell" + }, + { + "zip_code": 28634, + "latitude": 35.964392, + "longitude": -80.777838, + "city": "Harmony", + "state": "NC", + "county": "Iredell" + }, + { + "zip_code": 28635, + "latitude": 36.308091, + "longitude": -81.116941, + "city": "Hays", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28636, + "latitude": 35.938931, + "longitude": -81.149233, + "city": "Hiddenite", + "state": "NC", + "county": "Alexander" + }, + { + "zip_code": 28637, + "latitude": 35.727107, + "longitude": -81.497816, + "city": "Hildebran", + "state": "NC", + "county": "Burke" + }, + { + "zip_code": 28638, + "latitude": 35.839777, + "longitude": -81.479726, + "city": "Hudson", + "state": "NC", + "county": "Caldwell" + }, + { + "zip_code": 28640, + "latitude": 36.403558, + "longitude": -81.414753, + "city": "Jefferson", + "state": "NC", + "county": "Ashe" + }, + { + "zip_code": 28641, + "latitude": 35.938422, + "longitude": -81.884521, + "city": "Jonas Ridge", + "state": "NC", + "county": "Burke" + }, + { + "zip_code": 28642, + "latitude": 36.210523, + "longitude": -80.801365, + "city": "Jonesville", + "state": "NC", + "county": "Yadkin" + }, + { + "zip_code": 28643, + "latitude": 36.502581, + "longitude": -81.553069, + "city": "Lansing", + "state": "NC", + "county": "Ashe" + }, + { + "zip_code": 28644, + "latitude": 36.422183, + "longitude": -81.300052, + "city": "Laurel Springs", + "state": "NC", + "county": "Ashe" + }, + { + "zip_code": 28645, + "latitude": 35.947401, + "longitude": -81.560742, + "city": "Lenoir", + "state": "NC", + "county": "Caldwell" + }, + { + "zip_code": 28646, + "latitude": 36.040964, + "longitude": -81.917716, + "city": "Linville", + "state": "NC", + "county": "Avery" + }, + { + "zip_code": 28647, + "latitude": 35.779182, + "longitude": -81.675545, + "city": "Linville Falls", + "state": "NC", + "county": "Burke" + }, + { + "zip_code": 28649, + "latitude": 36.307698, + "longitude": -81.200766, + "city": "Mc Grady", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28650, + "latitude": 35.588869, + "longitude": -81.162793, + "city": "Maiden", + "state": "NC", + "county": "Catawba" + }, + { + "zip_code": 28651, + "latitude": 36.241997, + "longitude": -81.224811, + "city": "Millers Creek", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28652, + "latitude": 36.086466, + "longitude": -81.934265, + "city": "Minneapolis", + "state": "NC", + "county": "Avery" + }, + { + "zip_code": 28653, + "latitude": 36.065053, + "longitude": -81.901715, + "city": "Montezuma", + "state": "NC", + "county": "Avery" + }, + { + "zip_code": 28654, + "latitude": 36.100492, + "longitude": -81.165221, + "city": "Moravian Falls", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28655, + "latitude": 35.772992, + "longitude": -81.676229, + "city": "Morganton", + "state": "NC", + "county": "Burke" + }, + { + "zip_code": 28656, + "latitude": 36.238438, + "longitude": -81.045963, + "city": "North Wilkesboro", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28657, + "latitude": 36.059029, + "longitude": -81.930337, + "city": "Newland", + "state": "NC", + "county": "Avery" + }, + { + "zip_code": 28658, + "latitude": 35.631914, + "longitude": -81.17193, + "city": "Newton", + "state": "NC", + "county": "Catawba" + }, + { + "zip_code": 28659, + "latitude": 36.208773, + "longitude": -81.067495, + "city": "North Wilkesboro", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28660, + "latitude": 35.974905, + "longitude": -80.864673, + "city": "Olin", + "state": "NC", + "county": "Iredell" + }, + { + "zip_code": 28661, + "latitude": 35.99726, + "longitude": -81.562609, + "city": "Patterson", + "state": "NC", + "county": "Caldwell" + }, + { + "zip_code": 28662, + "latitude": 36.085582, + "longitude": -81.876049, + "city": "Pineola", + "state": "NC", + "county": "Avery" + }, + { + "zip_code": 28663, + "latitude": 36.527637, + "longitude": -81.301935, + "city": "Piney Creek", + "state": "NC", + "county": "Alleghany" + }, + { + "zip_code": 28664, + "latitude": 36.044098, + "longitude": -82.003691, + "city": "Plumtree", + "state": "NC", + "county": "Avery" + }, + { + "zip_code": 28665, + "latitude": 36.223349, + "longitude": -81.179412, + "city": "Purlear", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28666, + "latitude": 35.73005, + "longitude": -81.495395, + "city": "Icard", + "state": "NC", + "county": "Burke" + }, + { + "zip_code": 28667, + "latitude": 35.777241, + "longitude": -81.43023, + "city": "Rhodhiss", + "state": "NC", + "county": "Caldwell" + }, + { + "zip_code": 28668, + "latitude": 36.398983, + "longitude": -80.987489, + "city": "Roaring Gap", + "state": "NC", + "county": "Alleghany" + }, + { + "zip_code": 28669, + "latitude": 36.227255, + "longitude": -80.998644, + "city": "Roaring River", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28670, + "latitude": 36.20083, + "longitude": -80.929782, + "city": "Ronda", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28671, + "latitude": 35.74858, + "longitude": -81.563674, + "city": "Rutherford College", + "state": "NC", + "county": "Burke" + }, + { + "zip_code": 28672, + "latitude": 36.414156, + "longitude": -81.492983, + "city": "Scottville", + "state": "NC", + "county": "Ashe" + }, + { + "zip_code": 28673, + "latitude": 35.603076, + "longitude": -80.997147, + "city": "Sherrills Ford", + "state": "NC", + "county": "Catawba" + }, + { + "zip_code": 28674, + "latitude": 36.216247, + "longitude": -81.207166, + "city": "North Wilkesboro", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28675, + "latitude": 36.495157, + "longitude": -81.140955, + "city": "Sparta", + "state": "NC", + "county": "Alleghany" + }, + { + "zip_code": 28676, + "latitude": 36.336635, + "longitude": -80.852275, + "city": "State Road", + "state": "NC", + "county": "Surry" + }, + { + "zip_code": 28677, + "latitude": 35.773406, + "longitude": -80.901036, + "city": "Statesville", + "state": "NC", + "county": "Iredell" + }, + { + "zip_code": 28678, + "latitude": 35.88313, + "longitude": -81.162749, + "city": "Stony Point", + "state": "NC", + "county": "Alexander" + }, + { + "zip_code": 28679, + "latitude": 36.254958, + "longitude": -81.835794, + "city": "Sugar Grove", + "state": "NC", + "county": "Watauga" + }, + { + "zip_code": 28680, + "latitude": 35.750657, + "longitude": -81.695292, + "city": "Morganton", + "state": "NC", + "county": "Burke" + }, + { + "zip_code": 28681, + "latitude": 35.916914, + "longitude": -81.209656, + "city": "Taylorsville", + "state": "NC", + "county": "Alexander" + }, + { + "zip_code": 28682, + "latitude": 35.579418, + "longitude": -80.968153, + "city": "Terrell", + "state": "NC", + "county": "Catawba" + }, + { + "zip_code": 28683, + "latitude": 36.346341, + "longitude": -80.989986, + "city": "Thurmond", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28684, + "latitude": 36.340991, + "longitude": -81.579496, + "city": "Todd", + "state": "NC", + "county": "Ashe" + }, + { + "zip_code": 28685, + "latitude": 36.331988, + "longitude": -81.031598, + "city": "Traphill", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28687, + "latitude": 35.529792, + "longitude": -80.947028, + "city": "Statesville", + "state": "NC", + "county": "Iredell" + }, + { + "zip_code": 28688, + "latitude": 35.529792, + "longitude": -80.947028, + "city": "Turnersburg", + "state": "NC", + "county": "Iredell" + }, + { + "zip_code": 28689, + "latitude": 36.029749, + "longitude": -80.887909, + "city": "Union Grove", + "state": "NC", + "county": "Iredell" + }, + { + "zip_code": 28690, + "latitude": 35.737757, + "longitude": -81.6166, + "city": "Valdese", + "state": "NC", + "county": "Burke" + }, + { + "zip_code": 28691, + "latitude": 36.209158, + "longitude": -81.778871, + "city": "Valle Crucis", + "state": "NC", + "county": "Watauga" + }, + { + "zip_code": 28692, + "latitude": 36.266185, + "longitude": -81.802644, + "city": "Vilas", + "state": "NC", + "county": "Watauga" + }, + { + "zip_code": 28693, + "latitude": 36.455704, + "longitude": -81.572935, + "city": "Warrensville", + "state": "NC", + "county": "Ashe" + }, + { + "zip_code": 28694, + "latitude": 36.359734, + "longitude": -81.484857, + "city": "West Jefferson", + "state": "NC", + "county": "Ashe" + }, + { + "zip_code": 28697, + "latitude": 36.211148, + "longitude": -81.129235, + "city": "Wilkesboro", + "state": "NC", + "county": "Wilkes" + }, + { + "zip_code": 28698, + "latitude": 36.324526, + "longitude": -81.739308, + "city": "Zionville", + "state": "NC", + "county": "Watauga" + }, + { + "zip_code": 28699, + "latitude": 35.831037, + "longitude": -81.00762, + "city": "Scotts", + "state": "NC", + "county": "Iredell" + }, + { + "zip_code": 28701, + "latitude": 35.628016, + "longitude": -82.556751, + "city": "Alexander", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28702, + "latitude": 35.409905, + "longitude": -83.479397, + "city": "Almond", + "state": "NC", + "county": "Swain" + }, + { + "zip_code": 28704, + "latitude": 35.589686, + "longitude": -82.541808, + "city": "Arden", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28705, + "latitude": 36.038317, + "longitude": -82.205783, + "city": "Bakersville", + "state": "NC", + "county": "Mitchell" + }, + { + "zip_code": 28707, + "latitude": 35.430091, + "longitude": -83.092783, + "city": "Balsam", + "state": "NC", + "county": "Jackson" + }, + { + "zip_code": 28708, + "latitude": 35.205962, + "longitude": -82.898272, + "city": "Balsam Grove", + "state": "NC", + "county": "Transylvania" + }, + { + "zip_code": 28709, + "latitude": 35.71628, + "longitude": -82.529787, + "city": "Barnardsville", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28710, + "latitude": 35.4319, + "longitude": -82.544826, + "city": "Bat Cave", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28711, + "latitude": 35.564616, + "longitude": -82.461196, + "city": "Black Mountain", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28712, + "latitude": 35.174351, + "longitude": -82.753971, + "city": "Brevard", + "state": "NC", + "county": "Transylvania" + }, + { + "zip_code": 28713, + "latitude": 35.38563, + "longitude": -83.508554, + "city": "Bryson City", + "state": "NC", + "county": "Swain" + }, + { + "zip_code": 28714, + "latitude": 35.835649, + "longitude": -82.268193, + "city": "Burnsville", + "state": "NC", + "county": "Yancey" + }, + { + "zip_code": 28715, + "latitude": 35.535096, + "longitude": -82.529962, + "city": "Candler", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28716, + "latitude": 35.492743, + "longitude": -82.959555, + "city": "Canton", + "state": "NC", + "county": "Haywood" + }, + { + "zip_code": 28717, + "latitude": 35.101156, + "longitude": -83.093769, + "city": "Cashiers", + "state": "NC", + "county": "Jackson" + }, + { + "zip_code": 28718, + "latitude": 35.15081, + "longitude": -82.637352, + "city": "Cedar Mountain", + "state": "NC", + "county": "Transylvania" + }, + { + "zip_code": 28719, + "latitude": 35.494881, + "longitude": -83.34906, + "city": "Cherokee", + "state": "NC", + "county": "Swain" + }, + { + "zip_code": 28720, + "latitude": 35.436893, + "longitude": -82.241744, + "city": "Chimney Rock", + "state": "NC", + "county": "Rutherford" + }, + { + "zip_code": 28721, + "latitude": 35.637588, + "longitude": -82.978588, + "city": "Clyde", + "state": "NC", + "county": "Haywood" + }, + { + "zip_code": 28722, + "latitude": 35.261201, + "longitude": -82.123534, + "city": "Columbus", + "state": "NC", + "county": "Polk" + }, + { + "zip_code": 28723, + "latitude": 35.249256, + "longitude": -83.132409, + "city": "Cullowhee", + "state": "NC", + "county": "Jackson" + }, + { + "zip_code": 28724, + "latitude": 35.295403, + "longitude": -82.388325, + "city": "Dana", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28725, + "latitude": 35.373461, + "longitude": -83.259211, + "city": "Dillsboro", + "state": "NC", + "county": "Jackson" + }, + { + "zip_code": 28726, + "latitude": 35.313136, + "longitude": -82.442057, + "city": "East Flat Rock", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28727, + "latitude": 35.322276, + "longitude": -82.503226, + "city": "Edneyville", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28728, + "latitude": 35.498797, + "longitude": -82.708024, + "city": "Enka", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28729, + "latitude": 35.31252, + "longitude": -82.587192, + "city": "Etowah", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28730, + "latitude": 35.529188, + "longitude": -82.404704, + "city": "Fairview", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28731, + "latitude": 35.297055, + "longitude": -82.403731, + "city": "Flat Rock", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28732, + "latitude": 35.370666, + "longitude": -82.494647, + "city": "Fletcher", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28733, + "latitude": 35.423135, + "longitude": -83.779522, + "city": "Fontana Dam", + "state": "NC", + "county": "Graham" + }, + { + "zip_code": 28734, + "latitude": 35.155829, + "longitude": -83.422421, + "city": "Franklin", + "state": "NC", + "county": "Macon" + }, + { + "zip_code": 28735, + "latitude": 35.322276, + "longitude": -82.503226, + "city": "Gerton", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28736, + "latitude": 35.230342, + "longitude": -83.107379, + "city": "Glenville", + "state": "NC", + "county": "Jackson" + }, + { + "zip_code": 28737, + "latitude": 35.738725, + "longitude": -82.059494, + "city": "Glenwood", + "state": "NC", + "county": "Mcdowell" + }, + { + "zip_code": 28738, + "latitude": 35.468264, + "longitude": -83.002841, + "city": "Hazelwood", + "state": "NC", + "county": "Haywood" + }, + { + "zip_code": 28739, + "latitude": 35.318016, + "longitude": -82.45034, + "city": "Hendersonville", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28740, + "latitude": 35.89163, + "longitude": -82.319283, + "city": "Green Mountain", + "state": "NC", + "county": "Yancey" + }, + { + "zip_code": 28741, + "latitude": 35.123767, + "longitude": -83.419534, + "city": "Highlands", + "state": "NC", + "county": "Macon" + }, + { + "zip_code": 28742, + "latitude": 35.333332, + "longitude": -82.524772, + "city": "Horse Shoe", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28743, + "latitude": 35.808232, + "longitude": -82.752619, + "city": "Hot Springs", + "state": "NC", + "county": "Madison" + }, + { + "zip_code": 28744, + "latitude": 35.117299, + "longitude": -83.295244, + "city": "Franklin", + "state": "NC", + "county": "Macon" + }, + { + "zip_code": 28745, + "latitude": 35.56115, + "longitude": -83.013022, + "city": "Lake Junaluska", + "state": "NC", + "county": "Haywood" + }, + { + "zip_code": 28746, + "latitude": 35.463527, + "longitude": -82.183853, + "city": "Lake Lure", + "state": "NC", + "county": "Rutherford" + }, + { + "zip_code": 28747, + "latitude": 35.157059, + "longitude": -82.826781, + "city": "Lake Toxaway", + "state": "NC", + "county": "Transylvania" + }, + { + "zip_code": 28748, + "latitude": 35.579969, + "longitude": -82.683175, + "city": "Leicester", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28749, + "latitude": 35.738725, + "longitude": -82.059494, + "city": "Little Switzerland", + "state": "NC", + "county": "Mcdowell" + }, + { + "zip_code": 28750, + "latitude": 35.236179, + "longitude": -82.236198, + "city": "Lynn", + "state": "NC", + "county": "Polk" + }, + { + "zip_code": 28751, + "latitude": 35.527318, + "longitude": -83.036558, + "city": "Maggie Valley", + "state": "NC", + "county": "Haywood" + }, + { + "zip_code": 28752, + "latitude": 35.684187, + "longitude": -82.034672, + "city": "Marion", + "state": "NC", + "county": "Mcdowell" + }, + { + "zip_code": 28753, + "latitude": 35.859719, + "longitude": -82.710523, + "city": "Marshall", + "state": "NC", + "county": "Madison" + }, + { + "zip_code": 28754, + "latitude": 35.879456, + "longitude": -82.516228, + "city": "Mars Hill", + "state": "NC", + "county": "Madison" + }, + { + "zip_code": 28755, + "latitude": 35.83924, + "longitude": -82.196202, + "city": "Micaville", + "state": "NC", + "county": "Yancey" + }, + { + "zip_code": 28756, + "latitude": 35.336371, + "longitude": -82.158975, + "city": "Mill Spring", + "state": "NC", + "county": "Polk" + }, + { + "zip_code": 28757, + "latitude": 35.641473, + "longitude": -82.315637, + "city": "Montreat", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28758, + "latitude": 35.371065, + "longitude": -82.49375, + "city": "Mountain Home", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28760, + "latitude": 35.381677, + "longitude": -82.481257, + "city": "Naples", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28761, + "latitude": 35.669058, + "longitude": -81.906612, + "city": "Nebo", + "state": "NC", + "county": "Mcdowell" + }, + { + "zip_code": 28762, + "latitude": 35.616257, + "longitude": -82.148319, + "city": "Old Fort", + "state": "NC", + "county": "Mcdowell" + }, + { + "zip_code": 28763, + "latitude": 35.051539, + "longitude": -83.38539, + "city": "Otto", + "state": "NC", + "county": "Macon" + }, + { + "zip_code": 28765, + "latitude": 35.921862, + "longitude": -82.110672, + "city": "Penland", + "state": "NC", + "county": "Mitchell" + }, + { + "zip_code": 28766, + "latitude": 35.260991, + "longitude": -82.644584, + "city": "Penrose", + "state": "NC", + "county": "Transylvania" + }, + { + "zip_code": 28768, + "latitude": 35.231828, + "longitude": -82.748346, + "city": "Pisgah Forest", + "state": "NC", + "county": "Transylvania" + }, + { + "zip_code": 28770, + "latitude": 35.618596, + "longitude": -82.30048, + "city": "Ridgecrest", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28771, + "latitude": 35.343758, + "longitude": -83.773869, + "city": "Robbinsville", + "state": "NC", + "county": "Graham" + }, + { + "zip_code": 28772, + "latitude": 35.159152, + "longitude": -82.83832, + "city": "Rosman", + "state": "NC", + "county": "Transylvania" + }, + { + "zip_code": 28773, + "latitude": 35.257579, + "longitude": -82.288029, + "city": "Saluda", + "state": "NC", + "county": "Polk" + }, + { + "zip_code": 28774, + "latitude": 35.097862, + "longitude": -82.988872, + "city": "Sapphire", + "state": "NC", + "county": "Transylvania" + }, + { + "zip_code": 28775, + "latitude": 35.03107, + "longitude": -83.327411, + "city": "Scaly Mountain", + "state": "NC", + "county": "Macon" + }, + { + "zip_code": 28776, + "latitude": 35.483482, + "longitude": -82.520707, + "city": "Skyland", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28777, + "latitude": 35.91464, + "longitude": -82.07647, + "city": "Spruce Pine", + "state": "NC", + "county": "Mitchell" + }, + { + "zip_code": 28778, + "latitude": 35.608576, + "longitude": -82.453107, + "city": "Swannanoa", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28779, + "latitude": 35.275674, + "longitude": -83.187963, + "city": "Sylva", + "state": "NC", + "county": "Jackson" + }, + { + "zip_code": 28781, + "latitude": 35.219991, + "longitude": -83.785397, + "city": "Topton", + "state": "NC", + "county": "Cherokee" + }, + { + "zip_code": 28782, + "latitude": 35.279322, + "longitude": -82.179654, + "city": "Tryon", + "state": "NC", + "county": "Polk" + }, + { + "zip_code": 28783, + "latitude": 35.246573, + "longitude": -83.044292, + "city": "Tuckasegee", + "state": "NC", + "county": "Jackson" + }, + { + "zip_code": 28784, + "latitude": 35.217377, + "longitude": -82.417819, + "city": "Tuxedo", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28785, + "latitude": "", + "longitude": "", + "city": "Waynesville", + "state": "NC", + "county": "Haywood" + }, + { + "zip_code": 28786, + "latitude": 35.585619, + "longitude": -82.959617, + "city": "Waynesville", + "state": "NC", + "county": "Haywood" + }, + { + "zip_code": 28787, + "latitude": 35.702704, + "longitude": -82.588915, + "city": "Weaverville", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28788, + "latitude": 35.328533, + "longitude": -83.233302, + "city": "Webster", + "state": "NC", + "county": "Jackson" + }, + { + "zip_code": 28789, + "latitude": 35.423045, + "longitude": -83.263368, + "city": "Whittier", + "state": "NC", + "county": "Jackson" + }, + { + "zip_code": 28790, + "latitude": 35.208041, + "longitude": -82.488614, + "city": "Zirconia", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28791, + "latitude": 35.346415, + "longitude": -82.525027, + "city": "Hendersonville", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28792, + "latitude": 35.317413, + "longitude": -82.450455, + "city": "Hendersonville", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28793, + "latitude": 35.292714, + "longitude": -82.503611, + "city": "Hendersonville", + "state": "NC", + "county": "Henderson" + }, + { + "zip_code": 28801, + "latitude": 35.602711, + "longitude": -82.567281, + "city": "Asheville", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28802, + "latitude": 35.623732, + "longitude": -82.667132, + "city": "Asheville", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28803, + "latitude": 35.573619, + "longitude": -82.580635, + "city": "Asheville", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28804, + "latitude": 35.624512, + "longitude": -82.589146, + "city": "Asheville", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28805, + "latitude": 35.615785, + "longitude": -82.517148, + "city": "Asheville", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28806, + "latitude": 35.570357, + "longitude": -82.605913, + "city": "Asheville", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28810, + "latitude": 35.620335, + "longitude": -82.528558, + "city": "Asheville", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28813, + "latitude": 35.50042, + "longitude": -82.502644, + "city": "Asheville", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28814, + "latitude": 35.664752, + "longitude": -82.492664, + "city": "Asheville", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28815, + "latitude": 35.620335, + "longitude": -82.528558, + "city": "Asheville", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28816, + "latitude": 35.620335, + "longitude": -82.528558, + "city": "Asheville", + "state": "NC", + "county": "Buncombe" + }, + { + "zip_code": 28901, + "latitude": 35.170731, + "longitude": -83.87111, + "city": "Andrews", + "state": "NC", + "county": "Cherokee" + }, + { + "zip_code": 28902, + "latitude": 35.025885, + "longitude": -83.878025, + "city": "Brasstown", + "state": "NC", + "county": "Clay" + }, + { + "zip_code": 28903, + "latitude": 35.094379, + "longitude": -84.035916, + "city": "Culberson", + "state": "NC", + "county": "Cherokee" + }, + { + "zip_code": 28904, + "latitude": 35.071416, + "longitude": -83.778309, + "city": "Hayesville", + "state": "NC", + "county": "Clay" + }, + { + "zip_code": 28905, + "latitude": 35.14641, + "longitude": -83.902545, + "city": "Marble", + "state": "NC", + "county": "Cherokee" + }, + { + "zip_code": 28906, + "latitude": 35.131159, + "longitude": -84.038776, + "city": "Murphy", + "state": "NC", + "county": "Cherokee" + }, + { + "zip_code": 28909, + "latitude": 35.015083, + "longitude": -83.905055, + "city": "Warne", + "state": "NC", + "county": "Clay" + }, + { + "zip_code": 29001, + "latitude": 33.685155, + "longitude": -80.190733, + "city": "Alcolu", + "state": "SC", + "county": "Clarendon" + }, + { + "zip_code": 29002, + "latitude": 34.126535, + "longitude": -81.234811, + "city": "Ballentine", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29003, + "latitude": 33.206294, + "longitude": -80.973559, + "city": "Bamberg", + "state": "SC", + "county": "Bamberg" + }, + { + "zip_code": 29006, + "latitude": 33.871866, + "longitude": -81.414643, + "city": "Batesburg", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29009, + "latitude": 34.436891, + "longitude": -80.532238, + "city": "Bethune", + "state": "SC", + "county": "Kershaw" + }, + { + "zip_code": 29010, + "latitude": 34.207324, + "longitude": -80.306569, + "city": "Bishopville", + "state": "SC", + "county": "Lee" + }, + { + "zip_code": 29014, + "latitude": 34.596281, + "longitude": -81.083171, + "city": "Blackstock", + "state": "SC", + "county": "Chester" + }, + { + "zip_code": 29015, + "latitude": 34.41478, + "longitude": -81.270211, + "city": "Blair", + "state": "SC", + "county": "Fairfield" + }, + { + "zip_code": 29016, + "latitude": 34.104758, + "longitude": -80.918919, + "city": "Blythewood", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29018, + "latitude": 33.341855, + "longitude": -80.565482, + "city": "Bowman", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29020, + "latitude": 34.313477, + "longitude": -80.612489, + "city": "Camden", + "state": "SC", + "county": "Kershaw" + }, + { + "zip_code": 29030, + "latitude": 33.570316, + "longitude": -80.708141, + "city": "Cameron", + "state": "SC", + "county": "Calhoun" + }, + { + "zip_code": 29031, + "latitude": 34.567049, + "longitude": -81.481439, + "city": "Carlisle", + "state": "SC", + "county": "Union" + }, + { + "zip_code": 29032, + "latitude": 34.35723, + "longitude": -80.54149, + "city": "Cassatt", + "state": "SC", + "county": "Kershaw" + }, + { + "zip_code": 29033, + "latitude": 33.868493, + "longitude": -81.294081, + "city": "Cayce", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29036, + "latitude": 34.135909, + "longitude": -81.334355, + "city": "Chapin", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29037, + "latitude": 34.221772, + "longitude": -81.872428, + "city": "Chappells", + "state": "SC", + "county": "Newberry" + }, + { + "zip_code": 29038, + "latitude": 33.381696, + "longitude": -80.956389, + "city": "Cope", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29039, + "latitude": 33.417322, + "longitude": -80.91752, + "city": "Cordova", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29040, + "latitude": 34.025111, + "longitude": -80.478151, + "city": "Dalzell", + "state": "SC", + "county": "Sumter" + }, + { + "zip_code": 29041, + "latitude": 33.688373, + "longitude": -80.208109, + "city": "Davis Station", + "state": "SC", + "county": "Clarendon" + }, + { + "zip_code": 29042, + "latitude": 33.237543, + "longitude": -81.104895, + "city": "Denmark", + "state": "SC", + "county": "Bamberg" + }, + { + "zip_code": 29044, + "latitude": 33.992252, + "longitude": -80.94791, + "city": "Eastover", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29045, + "latitude": 34.19522, + "longitude": -80.79861, + "city": "Elgin", + "state": "SC", + "county": "Kershaw" + }, + { + "zip_code": 29046, + "latitude": 34.15998, + "longitude": -80.240955, + "city": "Elliott", + "state": "SC", + "county": "Lee" + }, + { + "zip_code": 29047, + "latitude": 33.496664, + "longitude": -80.582264, + "city": "Elloree", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29048, + "latitude": 33.416449, + "longitude": -80.402308, + "city": "Eutawville", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29051, + "latitude": 33.688373, + "longitude": -80.208109, + "city": "Gable", + "state": "SC", + "county": "Clarendon" + }, + { + "zip_code": 29052, + "latitude": 33.84642, + "longitude": -80.733782, + "city": "Gadsden", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29053, + "latitude": 33.815305, + "longitude": -81.104235, + "city": "Gaston", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29054, + "latitude": 33.925422, + "longitude": -81.410107, + "city": "Gilbert", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29055, + "latitude": 34.612456, + "longitude": -80.940759, + "city": "Great Falls", + "state": "SC", + "county": "Chester" + }, + { + "zip_code": 29056, + "latitude": 33.785465, + "longitude": -79.832218, + "city": "Greeleyville", + "state": "SC", + "county": "Williamsburg" + }, + { + "zip_code": 29058, + "latitude": 34.588803, + "longitude": -80.718482, + "city": "Heath Springs", + "state": "SC", + "county": "Lancaster" + }, + { + "zip_code": 29059, + "latitude": 33.349458, + "longitude": -80.438902, + "city": "Holly Hill", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29061, + "latitude": 33.920355, + "longitude": -80.823, + "city": "Hopkins", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29062, + "latitude": 34.012593, + "longitude": -80.567589, + "city": "Horatio", + "state": "SC", + "county": "Sumter" + }, + { + "zip_code": 29063, + "latitude": 34.085949, + "longitude": -81.131151, + "city": "Irmo", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29065, + "latitude": 34.301089, + "longitude": -81.285308, + "city": "Jenkinsville", + "state": "SC", + "county": "Fairfield" + }, + { + "zip_code": 29067, + "latitude": 34.600417, + "longitude": -80.542015, + "city": "Kershaw", + "state": "SC", + "county": "Lancaster" + }, + { + "zip_code": 29069, + "latitude": 34.269558, + "longitude": -80.005897, + "city": "Lamar", + "state": "SC", + "county": "Darlington" + }, + { + "zip_code": 29070, + "latitude": 33.895434, + "longitude": -81.423918, + "city": "Leesville", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29071, + "latitude": 33.925183, + "longitude": -81.248345, + "city": "Lexington", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29072, + "latitude": 33.976907, + "longitude": -81.253034, + "city": "Lexington", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29073, + "latitude": 33.905323, + "longitude": -81.335083, + "city": "Lexington", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29074, + "latitude": 34.456984, + "longitude": -80.789236, + "city": "Liberty Hill", + "state": "SC", + "county": "Kershaw" + }, + { + "zip_code": 29075, + "latitude": 34.193507, + "longitude": -81.396654, + "city": "Little Mountain", + "state": "SC", + "county": "Newberry" + }, + { + "zip_code": 29078, + "latitude": 34.260265, + "longitude": -80.731308, + "city": "Lugoff", + "state": "SC", + "county": "Kershaw" + }, + { + "zip_code": 29079, + "latitude": 34.278255, + "longitude": -80.100896, + "city": "Lydia", + "state": "SC", + "county": "Darlington" + }, + { + "zip_code": 29080, + "latitude": 34.049335, + "longitude": -80.043417, + "city": "Lynchburg", + "state": "SC", + "county": "Lee" + }, + { + "zip_code": 29081, + "latitude": 33.08885, + "longitude": -81.014013, + "city": "Ehrhardt", + "state": "SC", + "county": "Bamberg" + }, + { + "zip_code": 29082, + "latitude": 33.029619, + "longitude": -80.762449, + "city": "Lodge", + "state": "SC", + "county": "Colleton" + }, + { + "zip_code": 29101, + "latitude": 34.470238, + "longitude": -80.256814, + "city": "Mc Bee", + "state": "SC", + "county": "Chesterfield" + }, + { + "zip_code": 29102, + "latitude": 33.618408, + "longitude": -80.21155, + "city": "Manning", + "state": "SC", + "county": "Clarendon" + }, + { + "zip_code": 29104, + "latitude": 33.950173, + "longitude": -80.217283, + "city": "Mayesville", + "state": "SC", + "county": "Sumter" + }, + { + "zip_code": 29105, + "latitude": 33.88797, + "longitude": -81.679404, + "city": "Monetta", + "state": "SC", + "county": "Saluda" + }, + { + "zip_code": 29106, + "latitude": 34.373596, + "longitude": -81.098735, + "city": "Monticello", + "state": "SC", + "county": "Fairfield" + }, + { + "zip_code": 29107, + "latitude": 33.525625, + "longitude": -81.121253, + "city": "Neeses", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29108, + "latitude": 34.310027, + "longitude": -81.608611, + "city": "Newberry", + "state": "SC", + "county": "Newberry" + }, + { + "zip_code": 29111, + "latitude": 33.688373, + "longitude": -80.208109, + "city": "New Zion", + "state": "SC", + "county": "Clarendon" + }, + { + "zip_code": 29112, + "latitude": 33.554183, + "longitude": -81.07622, + "city": "North", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29113, + "latitude": 33.409377, + "longitude": -80.977637, + "city": "Norway", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29114, + "latitude": 33.937811, + "longitude": -79.903726, + "city": "Olanta", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29115, + "latitude": 33.490935, + "longitude": -80.821825, + "city": "Orangeburg", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29116, + "latitude": 33.49593, + "longitude": -80.824603, + "city": "Orangeburg", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29117, + "latitude": 33.442019, + "longitude": -80.797486, + "city": "Orangeburg", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29118, + "latitude": 33.567493, + "longitude": -80.924805, + "city": "Orangeburg", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29122, + "latitude": 34.23862, + "longitude": -81.327116, + "city": "Peak", + "state": "SC", + "county": "Newberry" + }, + { + "zip_code": 29123, + "latitude": 33.766538, + "longitude": -81.247547, + "city": "Pelion", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29125, + "latitude": 33.756082, + "longitude": -80.457854, + "city": "Pinewood", + "state": "SC", + "county": "Sumter" + }, + { + "zip_code": 29126, + "latitude": 34.323019, + "longitude": -81.412148, + "city": "Pomaria", + "state": "SC", + "county": "Newberry" + }, + { + "zip_code": 29127, + "latitude": 34.188062, + "longitude": -81.552888, + "city": "Prosperity", + "state": "SC", + "county": "Newberry" + }, + { + "zip_code": 29128, + "latitude": 34.059796, + "longitude": -80.513051, + "city": "Rembert", + "state": "SC", + "county": "Sumter" + }, + { + "zip_code": 29129, + "latitude": 33.844203, + "longitude": -81.65509, + "city": "Ridge Spring", + "state": "SC", + "county": "Saluda" + }, + { + "zip_code": 29130, + "latitude": 34.306879, + "longitude": -80.926792, + "city": "Ridgeway", + "state": "SC", + "county": "Fairfield" + }, + { + "zip_code": 29132, + "latitude": 34.307413, + "longitude": -81.12523, + "city": "Rion", + "state": "SC", + "county": "Fairfield" + }, + { + "zip_code": 29133, + "latitude": 33.4008, + "longitude": -80.701135, + "city": "Rowesville", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29135, + "latitude": 33.696732, + "longitude": -80.867833, + "city": "Saint Matthews", + "state": "SC", + "county": "Calhoun" + }, + { + "zip_code": 29137, + "latitude": 33.605723, + "longitude": -81.365813, + "city": "Salley", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29138, + "latitude": 34.031353, + "longitude": -81.77374, + "city": "Saluda", + "state": "SC", + "county": "Saluda" + }, + { + "zip_code": 29142, + "latitude": 33.466571, + "longitude": -80.782531, + "city": "Santee", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29143, + "latitude": 33.688373, + "longitude": -80.208109, + "city": "Sardinia", + "state": "SC", + "county": "Clarendon" + }, + { + "zip_code": 29145, + "latitude": 34.28357, + "longitude": -81.624583, + "city": "Silverstreet", + "state": "SC", + "county": "Newberry" + }, + { + "zip_code": 29146, + "latitude": 33.517097, + "longitude": -81.269821, + "city": "Springfield", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29147, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "State Park", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29148, + "latitude": 33.55156, + "longitude": -80.322756, + "city": "Summerton", + "state": "SC", + "county": "Clarendon" + }, + { + "zip_code": 29150, + "latitude": 33.913678, + "longitude": -80.354238, + "city": "Sumter", + "state": "SC", + "county": "Sumter" + }, + { + "zip_code": 29151, + "latitude": 33.899856, + "longitude": -80.37434, + "city": "Sumter", + "state": "SC", + "county": "Sumter" + }, + { + "zip_code": 29152, + "latitude": 33.918824, + "longitude": -80.370098, + "city": "Shaw A F B", + "state": "SC", + "county": "Sumter" + }, + { + "zip_code": 29153, + "latitude": 33.94462, + "longitude": -80.320637, + "city": "Sumter", + "state": "SC", + "county": "Sumter" + }, + { + "zip_code": 29154, + "latitude": 33.866953, + "longitude": -80.426703, + "city": "Sumter", + "state": "SC", + "county": "Sumter" + }, + { + "zip_code": 29160, + "latitude": 33.729014, + "longitude": -81.102992, + "city": "Swansea", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29161, + "latitude": 34.062595, + "longitude": -79.933777, + "city": "Timmonsville", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29162, + "latitude": 33.884239, + "longitude": -80.022566, + "city": "Turbeville", + "state": "SC", + "county": "Clarendon" + }, + { + "zip_code": 29163, + "latitude": 33.417884, + "longitude": -80.434809, + "city": "Vance", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29164, + "latitude": 33.655015, + "longitude": -81.416321, + "city": "Wagener", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29166, + "latitude": 34.000971, + "longitude": -81.741069, + "city": "Ward", + "state": "SC", + "county": "Saluda" + }, + { + "zip_code": 29168, + "latitude": 33.895272, + "longitude": -80.498019, + "city": "Wedgefield", + "state": "SC", + "county": "Sumter" + }, + { + "zip_code": 29169, + "latitude": 33.953664, + "longitude": -81.187338, + "city": "West Columbia", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29170, + "latitude": 33.932043, + "longitude": -81.15429, + "city": "West Columbia", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29171, + "latitude": 33.925183, + "longitude": -81.248345, + "city": "West Columbia", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29172, + "latitude": 33.901578, + "longitude": -81.090419, + "city": "West Columbia", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29175, + "latitude": 34.441802, + "longitude": -80.603298, + "city": "Westville", + "state": "SC", + "county": "Kershaw" + }, + { + "zip_code": 29176, + "latitude": 34.373596, + "longitude": -81.098735, + "city": "White Oak", + "state": "SC", + "county": "Fairfield" + }, + { + "zip_code": 29177, + "latitude": 34.150446, + "longitude": -81.260051, + "city": "White Rock", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29178, + "latitude": 34.454376, + "longitude": -81.563222, + "city": "Whitmire", + "state": "SC", + "county": "Newberry" + }, + { + "zip_code": 29180, + "latitude": 34.387337, + "longitude": -81.082923, + "city": "Winnsboro", + "state": "SC", + "county": "Fairfield" + }, + { + "zip_code": 29201, + "latitude": 33.987454, + "longitude": -81.024864, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29202, + "latitude": 33.962455, + "longitude": -80.979652, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29203, + "latitude": 34.075613, + "longitude": -81.039585, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29204, + "latitude": 34.051603, + "longitude": -80.978511, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29205, + "latitude": 33.987555, + "longitude": -81.000013, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29206, + "latitude": 34.030004, + "longitude": -80.951029, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29207, + "latitude": 34.01974, + "longitude": -80.939131, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29208, + "latitude": 33.993705, + "longitude": -81.019913, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29209, + "latitude": 33.944163, + "longitude": -80.942597, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29210, + "latitude": 33.981468, + "longitude": -80.993483, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29211, + "latitude": 34.096716, + "longitude": -80.922338, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29212, + "latitude": 34.020988, + "longitude": -81.197778, + "city": "Columbia", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29214, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29215, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29216, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29217, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29218, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29219, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29220, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29221, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29222, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29223, + "latitude": 34.099488, + "longitude": -80.924638, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29224, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29225, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29226, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29227, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29228, + "latitude": 33.925183, + "longitude": -81.248345, + "city": "Columbia", + "state": "SC", + "county": "Lexington" + }, + { + "zip_code": 29229, + "latitude": 34.12266, + "longitude": -80.884194, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29230, + "latitude": 34.107483, + "longitude": -81.062623, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29240, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29250, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29260, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29290, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29292, + "latitude": 34.005992, + "longitude": -80.970766, + "city": "Columbia", + "state": "SC", + "county": "Richland" + }, + { + "zip_code": 29301, + "latitude": 35.011309, + "longitude": -81.993403, + "city": "Spartanburg", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29302, + "latitude": 34.893907, + "longitude": -81.83404, + "city": "Spartanburg", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29303, + "latitude": 34.980316, + "longitude": -81.916778, + "city": "Spartanburg", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29304, + "latitude": 34.916625, + "longitude": -81.863874, + "city": "Spartanburg", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29305, + "latitude": 35.111404, + "longitude": -82.105503, + "city": "Spartanburg", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29306, + "latitude": 34.899493, + "longitude": -81.86309, + "city": "Spartanburg", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29307, + "latitude": 35.058097, + "longitude": -81.98003, + "city": "Spartanburg", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29316, + "latitude": 35.030481, + "longitude": -81.979347, + "city": "Spartanburg", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29318, + "latitude": 34.888237, + "longitude": -81.96902, + "city": "Spartanburg", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29319, + "latitude": 34.888237, + "longitude": -81.96902, + "city": "Spartanburg", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29320, + "latitude": 34.95717, + "longitude": -81.991626, + "city": "Arcadia", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29321, + "latitude": 34.720999, + "longitude": -81.733884, + "city": "Buffalo", + "state": "SC", + "county": "Union" + }, + { + "zip_code": 29322, + "latitude": 35.113668, + "longitude": -82.040137, + "city": "Campobello", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29323, + "latitude": 35.109575, + "longitude": -82.010515, + "city": "Chesnee", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29324, + "latitude": 34.99056, + "longitude": -81.83271, + "city": "Clifton", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29325, + "latitude": 34.43492, + "longitude": -81.893558, + "city": "Clinton", + "state": "SC", + "county": "Laurens" + }, + { + "zip_code": 29329, + "latitude": 35.001748, + "longitude": -81.832999, + "city": "Converse", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29330, + "latitude": 35.04921, + "longitude": -81.83128, + "city": "Cowpens", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29331, + "latitude": 34.638315, + "longitude": -81.856745, + "city": "Cross Anchor", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29332, + "latitude": 34.281449, + "longitude": -81.977214, + "city": "Cross Hill", + "state": "SC", + "county": "Laurens" + }, + { + "zip_code": 29333, + "latitude": 34.968472, + "longitude": -81.906376, + "city": "Drayton", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29334, + "latitude": 34.935427, + "longitude": -81.992532, + "city": "Duncan", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29335, + "latitude": 34.749045, + "longitude": -81.882943, + "city": "Enoree", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29336, + "latitude": 34.888237, + "longitude": -81.96902, + "city": "Fairforest", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29338, + "latitude": 34.999397, + "longitude": -82.057103, + "city": "Fingerville", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29340, + "latitude": 35.00549, + "longitude": -81.63383, + "city": "Gaffney", + "state": "SC", + "county": "Cherokee" + }, + { + "zip_code": 29341, + "latitude": 35.099884, + "longitude": -81.705609, + "city": "Gaffney", + "state": "SC", + "county": "Cherokee" + }, + { + "zip_code": 29342, + "latitude": 34.996314, + "longitude": -81.652395, + "city": "Gaffney", + "state": "SC", + "county": "Cherokee" + }, + { + "zip_code": 29346, + "latitude": 35.044719, + "longitude": -81.977324, + "city": "Glendale", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29348, + "latitude": 34.888237, + "longitude": -81.96902, + "city": "Gramling", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29349, + "latitude": 35.075367, + "longitude": -82.02964, + "city": "Inman", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29351, + "latitude": 34.415357, + "longitude": -81.804172, + "city": "Joanna", + "state": "SC", + "county": "Laurens" + }, + { + "zip_code": 29353, + "latitude": 34.81248, + "longitude": -81.64306, + "city": "Jonesville", + "state": "SC", + "county": "Union" + }, + { + "zip_code": 29355, + "latitude": 34.35512, + "longitude": -81.65907, + "city": "Kinards", + "state": "SC", + "county": "Newberry" + }, + { + "zip_code": 29356, + "latitude": 35.146058, + "longitude": -82.153545, + "city": "Landrum", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29360, + "latitude": 34.528882, + "longitude": -82.055091, + "city": "Laurens", + "state": "SC", + "county": "Laurens" + }, + { + "zip_code": 29364, + "latitude": 34.79259, + "longitude": -81.477843, + "city": "Lockhart", + "state": "SC", + "county": "Union" + }, + { + "zip_code": 29365, + "latitude": 35.006816, + "longitude": -81.985214, + "city": "Lyman", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29368, + "latitude": 34.949241, + "longitude": -81.990216, + "city": "Mayo", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29369, + "latitude": 34.970097, + "longitude": -82.02732, + "city": "Moore", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29370, + "latitude": 34.375065, + "longitude": -81.967088, + "city": "Mountville", + "state": "SC", + "county": "Laurens" + }, + { + "zip_code": 29372, + "latitude": 34.889502, + "longitude": -81.773952, + "city": "Pacolet", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29373, + "latitude": 34.912385, + "longitude": -81.748663, + "city": "Pacolet Mills", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29374, + "latitude": 34.887498, + "longitude": -81.944611, + "city": "Pauline", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29375, + "latitude": 34.863648, + "longitude": -82.110149, + "city": "Reidville", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29376, + "latitude": 34.829502, + "longitude": -81.947247, + "city": "Roebuck", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29377, + "latitude": 34.987543, + "longitude": -82.135145, + "city": "Startex", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29378, + "latitude": 34.853013, + "longitude": -81.772738, + "city": "Una", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29379, + "latitude": 34.700463, + "longitude": -81.647687, + "city": "Union", + "state": "SC", + "county": "Union" + }, + { + "zip_code": 29384, + "latitude": 34.335762, + "longitude": -82.095499, + "city": "Waterloo", + "state": "SC", + "county": "Laurens" + }, + { + "zip_code": 29385, + "latitude": 34.834143, + "longitude": -82.009137, + "city": "Wellford", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29386, + "latitude": 34.888237, + "longitude": -81.96902, + "city": "White Stone", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29388, + "latitude": 34.890526, + "longitude": -81.991496, + "city": "Woodruff", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29390, + "latitude": 34.888237, + "longitude": -81.96902, + "city": "Duncan", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29391, + "latitude": 34.888237, + "longitude": -81.96902, + "city": "Duncan", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29395, + "latitude": "", + "longitude": "", + "city": "Jonesville", + "state": "SC", + "county": "Union" + }, + { + "zip_code": 29401, + "latitude": 32.780326, + "longitude": -79.940844, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29402, + "latitude": 32.84885, + "longitude": -79.85773, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29403, + "latitude": 32.822391, + "longitude": -79.965464, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29404, + "latitude": 32.898194, + "longitude": -80.068564, + "city": "Charleston Afb", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29405, + "latitude": 32.853019, + "longitude": -79.991295, + "city": "North Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29406, + "latitude": 32.927344, + "longitude": -80.022009, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29407, + "latitude": 32.812039, + "longitude": -80.093128, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29409, + "latitude": 32.84885, + "longitude": -79.85773, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29410, + "latitude": 33.192514, + "longitude": -80.03063, + "city": "North Charleston", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29412, + "latitude": 32.717954, + "longitude": -79.953725, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29413, + "latitude": 32.84885, + "longitude": -79.85773, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29414, + "latitude": 32.810035, + "longitude": -80.025928, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29415, + "latitude": 32.84885, + "longitude": -79.85773, + "city": "North Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29416, + "latitude": 32.84885, + "longitude": -79.85773, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29417, + "latitude": 32.84885, + "longitude": -79.85773, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29418, + "latitude": 32.89295, + "longitude": -80.045849, + "city": "North Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29419, + "latitude": 32.84885, + "longitude": -79.85773, + "city": "North Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29420, + "latitude": 33.014817, + "longitude": -80.195143, + "city": "North Charleston", + "state": "SC", + "county": "Dorchester" + }, + { + "zip_code": 29422, + "latitude": 32.84885, + "longitude": -79.85773, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29423, + "latitude": 32.84885, + "longitude": -79.85773, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29424, + "latitude": 32.783076, + "longitude": -79.93701, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29425, + "latitude": 32.786176, + "longitude": -79.94711, + "city": "Charleston", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29426, + "latitude": 32.779028, + "longitude": -80.328772, + "city": "Adams Run", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29429, + "latitude": 33.006254, + "longitude": -79.656119, + "city": "Awendaw", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29430, + "latitude": 33.214551, + "longitude": -79.816871, + "city": "Bethera", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29431, + "latitude": 33.270301, + "longitude": -79.873606, + "city": "Bonneau", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29432, + "latitude": 33.272291, + "longitude": -80.792496, + "city": "Branchville", + "state": "SC", + "county": "Orangeburg" + }, + { + "zip_code": 29433, + "latitude": 33.061376, + "longitude": -80.631208, + "city": "Canadys", + "state": "SC", + "county": "Colleton" + }, + { + "zip_code": 29434, + "latitude": 33.136208, + "longitude": -79.88258, + "city": "Cordesville", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29435, + "latitude": 32.778856, + "longitude": -80.42646, + "city": "Cottageville", + "state": "SC", + "county": "Colleton" + }, + { + "zip_code": 29436, + "latitude": 33.298903, + "longitude": -80.123972, + "city": "Cross", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29437, + "latitude": 33.14975, + "longitude": -80.493683, + "city": "Dorchester", + "state": "SC", + "county": "Dorchester" + }, + { + "zip_code": 29438, + "latitude": 32.502398, + "longitude": -80.307509, + "city": "Edisto Island", + "state": "SC", + "county": "Colleton" + }, + { + "zip_code": 29439, + "latitude": 32.663043, + "longitude": -79.92697, + "city": "Folly Beach", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29440, + "latitude": 33.439327, + "longitude": -79.367525, + "city": "Georgetown", + "state": "SC", + "county": "Georgetown" + }, + { + "zip_code": 29442, + "latitude": 33.403693, + "longitude": -79.226361, + "city": "Georgetown", + "state": "SC", + "county": "Georgetown" + }, + { + "zip_code": 29445, + "latitude": 33.057972, + "longitude": -80.010088, + "city": "Goose Creek", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29446, + "latitude": 32.656443, + "longitude": -80.566105, + "city": "Green Pond", + "state": "SC", + "county": "Colleton" + }, + { + "zip_code": 29447, + "latitude": 33.086324, + "longitude": -80.62279, + "city": "Grover", + "state": "SC", + "county": "Dorchester" + }, + { + "zip_code": 29448, + "latitude": 33.239304, + "longitude": -80.453386, + "city": "Harleyville", + "state": "SC", + "county": "Dorchester" + }, + { + "zip_code": 29449, + "latitude": 32.710486, + "longitude": -80.27443, + "city": "Hollywood", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29450, + "latitude": 33.043929, + "longitude": -79.784137, + "city": "Huger", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29451, + "latitude": 32.807206, + "longitude": -79.760516, + "city": "Isle Of Palms", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29452, + "latitude": 32.730451, + "longitude": -80.460935, + "city": "Jacksonboro", + "state": "SC", + "county": "Colleton" + }, + { + "zip_code": 29453, + "latitude": 33.183389, + "longitude": -79.714992, + "city": "Jamestown", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29455, + "latitude": 32.835713, + "longitude": -79.821702, + "city": "Johns Island", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29456, + "latitude": 33.01317, + "longitude": -80.107174, + "city": "Ladson", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29457, + "latitude": 32.84885, + "longitude": -79.85773, + "city": "Johns Island", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29458, + "latitude": 33.119382, + "longitude": -79.507388, + "city": "Mc Clellanville", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29461, + "latitude": 33.197118, + "longitude": -80.023339, + "city": "Moncks Corner", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29464, + "latitude": 32.847273, + "longitude": -79.820563, + "city": "Mount Pleasant", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29465, + "latitude": 32.84885, + "longitude": -79.85773, + "city": "Mount Pleasant", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29466, + "latitude": 32.867373, + "longitude": -79.804893, + "city": "Mount Pleasant", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29468, + "latitude": 33.411753, + "longitude": -80.071194, + "city": "Pineville", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29469, + "latitude": 33.245244, + "longitude": -80.098656, + "city": "Pinopolis", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29470, + "latitude": 32.787774, + "longitude": -80.224756, + "city": "Ravenel", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29471, + "latitude": 33.172596, + "longitude": -80.660654, + "city": "Reevesville", + "state": "SC", + "county": "Dorchester" + }, + { + "zip_code": 29472, + "latitude": 33.032573, + "longitude": -80.37462, + "city": "Ridgeville", + "state": "SC", + "county": "Dorchester" + }, + { + "zip_code": 29474, + "latitude": 32.846691, + "longitude": -80.595162, + "city": "Round O", + "state": "SC", + "county": "Colleton" + }, + { + "zip_code": 29475, + "latitude": 32.899004, + "longitude": -80.819421, + "city": "Ruffin", + "state": "SC", + "county": "Colleton" + }, + { + "zip_code": 29476, + "latitude": 33.164201, + "longitude": -79.904182, + "city": "Russellville", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29477, + "latitude": 33.151503, + "longitude": -80.478782, + "city": "Saint George", + "state": "SC", + "county": "Dorchester" + }, + { + "zip_code": 29479, + "latitude": 33.33618, + "longitude": -79.92364, + "city": "Saint Stephen", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29481, + "latitude": 33.098059, + "longitude": -80.682465, + "city": "Smoaks", + "state": "SC", + "county": "Colleton" + }, + { + "zip_code": 29482, + "latitude": 32.766336, + "longitude": -79.83951, + "city": "Sullivans Island", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29483, + "latitude": 33.040201, + "longitude": -80.431751, + "city": "Summerville", + "state": "SC", + "county": "Dorchester" + }, + { + "zip_code": 29484, + "latitude": 33.00234, + "longitude": -80.226694, + "city": "Summerville", + "state": "SC", + "county": "Dorchester" + }, + { + "zip_code": 29485, + "latitude": 32.999726, + "longitude": -80.329328, + "city": "Summerville", + "state": "SC", + "county": "Dorchester" + }, + { + "zip_code": 29487, + "latitude": 32.659087, + "longitude": -80.167357, + "city": "Wadmalaw Island", + "state": "SC", + "county": "Charleston" + }, + { + "zip_code": 29488, + "latitude": 32.925196, + "longitude": -80.703213, + "city": "Walterboro", + "state": "SC", + "county": "Colleton" + }, + { + "zip_code": 29492, + "latitude": 32.96678, + "longitude": -79.852835, + "city": "Charleston", + "state": "SC", + "county": "Berkeley" + }, + { + "zip_code": 29493, + "latitude": 33.032704, + "longitude": -80.84452, + "city": "Williams", + "state": "SC", + "county": "Colleton" + }, + { + "zip_code": 29501, + "latitude": 34.049849, + "longitude": -79.685361, + "city": "Florence", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29502, + "latitude": 34.200994, + "longitude": -79.784721, + "city": "Florence", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29503, + "latitude": 34.062999, + "longitude": -79.650627, + "city": "Florence", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29504, + "latitude": 34.041582, + "longitude": -79.693294, + "city": "Florence", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29505, + "latitude": 34.049881, + "longitude": -79.693907, + "city": "Florence", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29506, + "latitude": 34.061465, + "longitude": -79.622227, + "city": "Florence", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29510, + "latitude": 33.435562, + "longitude": -79.409083, + "city": "Andrews", + "state": "SC", + "county": "Georgetown" + }, + { + "zip_code": 29511, + "latitude": 33.939968, + "longitude": -79.041027, + "city": "Aynor", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29512, + "latitude": 34.598755, + "longitude": -79.707693, + "city": "Bennettsville", + "state": "SC", + "county": "Marlboro" + }, + { + "zip_code": 29516, + "latitude": 34.517149, + "longitude": -79.644187, + "city": "Blenheim", + "state": "SC", + "county": "Marlboro" + }, + { + "zip_code": 29518, + "latitude": 33.598355, + "longitude": -79.709369, + "city": "Cades", + "state": "SC", + "county": "Williamsburg" + }, + { + "zip_code": 29519, + "latitude": 34.026958, + "longitude": -79.353715, + "city": "Centenary", + "state": "SC", + "county": "Marion" + }, + { + "zip_code": 29520, + "latitude": 34.691548, + "longitude": -79.943741, + "city": "Cheraw", + "state": "SC", + "county": "Chesterfield" + }, + { + "zip_code": 29525, + "latitude": 34.584251, + "longitude": -79.587852, + "city": "Clio", + "state": "SC", + "county": "Marlboro" + }, + { + "zip_code": 29526, + "latitude": 33.868775, + "longitude": -78.948287, + "city": "Conway", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29527, + "latitude": 33.82352, + "longitude": -79.022331, + "city": "Conway", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29528, + "latitude": 33.935814, + "longitude": -78.919205, + "city": "Conway", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29530, + "latitude": 33.980551, + "longitude": -79.756816, + "city": "Coward", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29532, + "latitude": 34.317738, + "longitude": -79.931655, + "city": "Darlington", + "state": "SC", + "county": "Darlington" + }, + { + "zip_code": 29536, + "latitude": 34.422187, + "longitude": -79.341359, + "city": "Dillon", + "state": "SC", + "county": "Dillon" + }, + { + "zip_code": 29540, + "latitude": 34.384261, + "longitude": -79.842182, + "city": "Darlington", + "state": "SC", + "county": "Darlington" + }, + { + "zip_code": 29541, + "latitude": 34.063272, + "longitude": -79.733541, + "city": "Effingham", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29542, + "latitude": 34.425629, + "longitude": -79.352291, + "city": "Floyd Dale", + "state": "SC", + "county": "Dillon" + }, + { + "zip_code": 29543, + "latitude": 34.375384, + "longitude": -79.276529, + "city": "Fork", + "state": "SC", + "county": "Dillon" + }, + { + "zip_code": 29544, + "latitude": 33.953007, + "longitude": -78.994502, + "city": "Galivants Ferry", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29545, + "latitude": 34.166757, + "longitude": -78.958922, + "city": "Green Sea", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29546, + "latitude": 33.952411, + "longitude": -79.360418, + "city": "Gresham", + "state": "SC", + "county": "Marion" + }, + { + "zip_code": 29547, + "latitude": 34.484912, + "longitude": -79.350207, + "city": "Hamer", + "state": "SC", + "county": "Dillon" + }, + { + "zip_code": 29550, + "latitude": 34.345106, + "longitude": -80.073953, + "city": "Hartsville", + "state": "SC", + "county": "Darlington" + }, + { + "zip_code": 29551, + "latitude": 34.365898, + "longitude": -80.132418, + "city": "Hartsville", + "state": "SC", + "county": "Darlington" + }, + { + "zip_code": 29554, + "latitude": 33.732071, + "longitude": -79.430945, + "city": "Hemingway", + "state": "SC", + "county": "Williamsburg" + }, + { + "zip_code": 29555, + "latitude": 33.886864, + "longitude": -79.489745, + "city": "Johnsonville", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29556, + "latitude": 33.663869, + "longitude": -79.837756, + "city": "Kingstree", + "state": "SC", + "county": "Williamsburg" + }, + { + "zip_code": 29560, + "latitude": 33.908371, + "longitude": -79.743104, + "city": "Lake City", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29563, + "latitude": 34.350121, + "longitude": -79.240676, + "city": "Lake View", + "state": "SC", + "county": "Dillon" + }, + { + "zip_code": 29564, + "latitude": 33.598355, + "longitude": -79.709369, + "city": "Lane", + "state": "SC", + "county": "Williamsburg" + }, + { + "zip_code": 29565, + "latitude": 34.384337, + "longitude": -79.478122, + "city": "Latta", + "state": "SC", + "county": "Dillon" + }, + { + "zip_code": 29566, + "latitude": 33.816472, + "longitude": -78.758018, + "city": "Little River", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29567, + "latitude": 34.495502, + "longitude": -79.348165, + "city": "Little Rock", + "state": "SC", + "county": "Dillon" + }, + { + "zip_code": 29568, + "latitude": 33.833574, + "longitude": -78.885268, + "city": "Longs", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29569, + "latitude": 33.977392, + "longitude": -78.918109, + "city": "Loris", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29570, + "latitude": 34.686733, + "longitude": -79.555879, + "city": "Mc Coll", + "state": "SC", + "county": "Marlboro" + }, + { + "zip_code": 29571, + "latitude": 34.164144, + "longitude": -79.363948, + "city": "Marion", + "state": "SC", + "county": "Marion" + }, + { + "zip_code": 29572, + "latitude": 33.711741, + "longitude": -78.852005, + "city": "Myrtle Beach", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29573, + "latitude": 34.488255, + "longitude": -79.476859, + "city": "Minturn", + "state": "SC", + "county": "Dillon" + }, + { + "zip_code": 29574, + "latitude": 34.159262, + "longitude": -79.273221, + "city": "Mullins", + "state": "SC", + "county": "Marion" + }, + { + "zip_code": 29575, + "latitude": 33.7577, + "longitude": -78.907599, + "city": "Myrtle Beach", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29576, + "latitude": 33.529642, + "longitude": -79.04822, + "city": "Murrells Inlet", + "state": "SC", + "county": "Georgetown" + }, + { + "zip_code": 29577, + "latitude": 33.788817, + "longitude": -78.96918, + "city": "Myrtle Beach", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29578, + "latitude": 33.738887, + "longitude": -78.999561, + "city": "Myrtle Beach", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29579, + "latitude": 33.737697, + "longitude": -78.978653, + "city": "Myrtle Beach", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29580, + "latitude": 33.598355, + "longitude": -79.709369, + "city": "Nesmith", + "state": "SC", + "county": "Williamsburg" + }, + { + "zip_code": 29581, + "latitude": 34.000746, + "longitude": -79.102314, + "city": "Nichols", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29582, + "latitude": 33.770465, + "longitude": -78.771832, + "city": "North Myrtle Beach", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29583, + "latitude": 33.972437, + "longitude": -79.59917, + "city": "Pamplico", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29584, + "latitude": 34.591849, + "longitude": -80.170691, + "city": "Patrick", + "state": "SC", + "county": "Chesterfield" + }, + { + "zip_code": 29585, + "latitude": 33.464107, + "longitude": -79.183904, + "city": "Pawleys Island", + "state": "SC", + "county": "Georgetown" + }, + { + "zip_code": 29587, + "latitude": 33.621094, + "longitude": -78.963155, + "city": "Myrtle Beach", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29588, + "latitude": "", + "longitude": "", + "city": "Myrtle Beach", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29589, + "latitude": 34.105265, + "longitude": -79.322116, + "city": "Rains", + "state": "SC", + "county": "Marion" + }, + { + "zip_code": 29590, + "latitude": 33.598355, + "longitude": -79.709369, + "city": "Salters", + "state": "SC", + "county": "Williamsburg" + }, + { + "zip_code": 29591, + "latitude": 33.937275, + "longitude": -79.769899, + "city": "Scranton", + "state": "SC", + "county": "Florence" + }, + { + "zip_code": 29592, + "latitude": 34.258011, + "longitude": -79.478292, + "city": "Sellers", + "state": "SC", + "county": "Marion" + }, + { + "zip_code": 29593, + "latitude": 34.442018, + "longitude": -79.880497, + "city": "Society Hill", + "state": "SC", + "county": "Darlington" + }, + { + "zip_code": 29594, + "latitude": 34.64051, + "longitude": -79.586895, + "city": "Tatum", + "state": "SC", + "county": "Marlboro" + }, + { + "zip_code": 29596, + "latitude": 34.732322, + "longitude": -79.829665, + "city": "Wallace", + "state": "SC", + "county": "Marlboro" + }, + { + "zip_code": 29597, + "latitude": 33.785803, + "longitude": -78.971795, + "city": "North Myrtle Beach", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29598, + "latitude": 33.935814, + "longitude": -78.919205, + "city": "North Myrtle Beach", + "state": "SC", + "county": "Horry" + }, + { + "zip_code": 29601, + "latitude": 34.848567, + "longitude": -82.402871, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29602, + "latitude": 34.800718, + "longitude": -82.395594, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29603, + "latitude": 34.837666, + "longitude": -82.371519, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29604, + "latitude": 34.849745, + "longitude": -82.453779, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29605, + "latitude": 34.772107, + "longitude": -82.374371, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29606, + "latitude": 34.849745, + "longitude": -82.453779, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29607, + "latitude": 34.909132, + "longitude": -82.384232, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29608, + "latitude": 34.849745, + "longitude": -82.453779, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29609, + "latitude": 34.902126, + "longitude": -82.386943, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29610, + "latitude": 34.849745, + "longitude": -82.453779, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29611, + "latitude": 34.83889, + "longitude": -82.420851, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29612, + "latitude": 34.849745, + "longitude": -82.453779, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29613, + "latitude": 34.924876, + "longitude": -82.433132, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29614, + "latitude": 34.872423, + "longitude": -82.362585, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29615, + "latitude": 34.938893, + "longitude": -82.358999, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29616, + "latitude": 34.849745, + "longitude": -82.453779, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29617, + "latitude": 34.955463, + "longitude": -82.465633, + "city": "Greenville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29620, + "latitude": 34.215714, + "longitude": -82.446307, + "city": "Abbeville", + "state": "SC", + "county": "Abbeville" + }, + { + "zip_code": 29621, + "latitude": 34.492718, + "longitude": -82.638297, + "city": "Anderson", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29622, + "latitude": 34.491988, + "longitude": -82.782868, + "city": "Anderson", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29623, + "latitude": 34.438087, + "longitude": -82.835449, + "city": "Anderson", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29624, + "latitude": 34.51236, + "longitude": -82.708334, + "city": "Anderson", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29625, + "latitude": 34.468005, + "longitude": -82.685702, + "city": "Anderson", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29626, + "latitude": 34.415763, + "longitude": -82.705099, + "city": "Anderson", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29627, + "latitude": 34.492422, + "longitude": -82.569083, + "city": "Belton", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29628, + "latitude": 34.191846, + "longitude": -82.490284, + "city": "Calhoun Falls", + "state": "SC", + "county": "Abbeville" + }, + { + "zip_code": 29630, + "latitude": 34.744649, + "longitude": -82.797267, + "city": "Central", + "state": "SC", + "county": "Pickens" + }, + { + "zip_code": 29631, + "latitude": 34.75974, + "longitude": -82.802154, + "city": "Clemson", + "state": "SC", + "county": "Pickens" + }, + { + "zip_code": 29632, + "latitude": 34.847372, + "longitude": -82.710126, + "city": "Clemson", + "state": "SC", + "county": "Pickens" + }, + { + "zip_code": 29633, + "latitude": 34.847372, + "longitude": -82.710126, + "city": "Clemson", + "state": "SC", + "county": "Pickens" + }, + { + "zip_code": 29634, + "latitude": 34.847372, + "longitude": -82.710126, + "city": "Clemson", + "state": "SC", + "county": "Pickens" + }, + { + "zip_code": 29635, + "latitude": 35.078914, + "longitude": -82.507625, + "city": "Cleveland", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29636, + "latitude": 34.849745, + "longitude": -82.453779, + "city": "Conestee", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29638, + "latitude": 34.330362, + "longitude": -82.336693, + "city": "Donalds", + "state": "SC", + "county": "Abbeville" + }, + { + "zip_code": 29639, + "latitude": 34.326755, + "longitude": -82.430787, + "city": "Due West", + "state": "SC", + "county": "Abbeville" + }, + { + "zip_code": 29640, + "latitude": 34.843968, + "longitude": -82.643754, + "city": "Easley", + "state": "SC", + "county": "Pickens" + }, + { + "zip_code": 29641, + "latitude": 34.813542, + "longitude": -82.653067, + "city": "Easley", + "state": "SC", + "county": "Pickens" + }, + { + "zip_code": 29642, + "latitude": 34.790129, + "longitude": -82.593723, + "city": "Easley", + "state": "SC", + "county": "Pickens" + }, + { + "zip_code": 29643, + "latitude": 34.542683, + "longitude": -83.029707, + "city": "Fair Play", + "state": "SC", + "county": "Oconee" + }, + { + "zip_code": 29644, + "latitude": 34.65781, + "longitude": -82.2441, + "city": "Fountain Inn", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29645, + "latitude": 34.595311, + "longitude": -82.114703, + "city": "Gray Court", + "state": "SC", + "county": "Laurens" + }, + { + "zip_code": 29646, + "latitude": 34.114209, + "longitude": -82.128301, + "city": "Greenwood", + "state": "SC", + "county": "Greenwood" + }, + { + "zip_code": 29647, + "latitude": 34.178813, + "longitude": -82.163078, + "city": "Greenwood", + "state": "SC", + "county": "Greenwood" + }, + { + "zip_code": 29648, + "latitude": 34.21241, + "longitude": -82.168139, + "city": "Greenwood", + "state": "SC", + "county": "Greenwood" + }, + { + "zip_code": 29649, + "latitude": 34.290916, + "longitude": -82.154473, + "city": "Greenwood", + "state": "SC", + "county": "Greenwood" + }, + { + "zip_code": 29650, + "latitude": 34.948738, + "longitude": -82.368415, + "city": "Greer", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29651, + "latitude": 34.962338, + "longitude": -82.330093, + "city": "Greer", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29652, + "latitude": 34.849745, + "longitude": -82.453779, + "city": "Greer", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29653, + "latitude": 34.274203, + "longitude": -82.21392, + "city": "Hodges", + "state": "SC", + "county": "Greenwood" + }, + { + "zip_code": 29654, + "latitude": 34.416329, + "longitude": -82.508821, + "city": "Honea Path", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29655, + "latitude": 34.420766, + "longitude": -82.608768, + "city": "Iva", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29656, + "latitude": 34.625157, + "longitude": -82.765393, + "city": "La France", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29657, + "latitude": 34.783697, + "longitude": -82.70937, + "city": "Liberty", + "state": "SC", + "county": "Pickens" + }, + { + "zip_code": 29658, + "latitude": 34.763442, + "longitude": -83.277599, + "city": "Long Creek", + "state": "SC", + "county": "Oconee" + }, + { + "zip_code": 29659, + "latitude": 34.221282, + "longitude": -82.63181, + "city": "Lowndesville", + "state": "SC", + "county": "Abbeville" + }, + { + "zip_code": 29661, + "latitude": 35.071605, + "longitude": -82.531215, + "city": "Marietta", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29662, + "latitude": 34.750238, + "longitude": -82.267062, + "city": "Mauldin", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29664, + "latitude": 34.85656, + "longitude": -83.191276, + "city": "Mountain Rest", + "state": "SC", + "county": "Oconee" + }, + { + "zip_code": 29665, + "latitude": 34.724743, + "longitude": -82.910578, + "city": "Newry", + "state": "SC", + "county": "Oconee" + }, + { + "zip_code": 29666, + "latitude": 34.119292, + "longitude": -81.998485, + "city": "Ninety Six", + "state": "SC", + "county": "Greenwood" + }, + { + "zip_code": 29667, + "latitude": 34.764198, + "longitude": -82.76478, + "city": "Norris", + "state": "SC", + "county": "Pickens" + }, + { + "zip_code": 29669, + "latitude": 34.656799, + "longitude": -82.535325, + "city": "Pelzer", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29670, + "latitude": 34.608943, + "longitude": -82.597346, + "city": "Pendleton", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29671, + "latitude": 34.873784, + "longitude": -82.712484, + "city": "Pickens", + "state": "SC", + "county": "Pickens" + }, + { + "zip_code": 29672, + "latitude": 34.773984, + "longitude": -82.945651, + "city": "Seneca", + "state": "SC", + "county": "Oconee" + }, + { + "zip_code": 29673, + "latitude": 34.72209, + "longitude": -82.392453, + "city": "Piedmont", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29675, + "latitude": 34.764076, + "longitude": -83.088332, + "city": "Richland", + "state": "SC", + "county": "Oconee" + }, + { + "zip_code": 29676, + "latitude": 34.866881, + "longitude": -82.97658, + "city": "Salem", + "state": "SC", + "county": "Oconee" + }, + { + "zip_code": 29677, + "latitude": 34.59755, + "longitude": -82.756844, + "city": "Sandy Springs", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29678, + "latitude": 34.715679, + "longitude": -82.963909, + "city": "Seneca", + "state": "SC", + "county": "Oconee" + }, + { + "zip_code": 29679, + "latitude": 34.607898, + "longitude": -82.939668, + "city": "Seneca", + "state": "SC", + "county": "Oconee" + }, + { + "zip_code": 29680, + "latitude": 34.696203, + "longitude": -82.289322, + "city": "Simpsonville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29681, + "latitude": 34.80728, + "longitude": -82.266734, + "city": "Simpsonville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29682, + "latitude": 34.837186, + "longitude": -82.825562, + "city": "Six Mile", + "state": "SC", + "county": "Pickens" + }, + { + "zip_code": 29683, + "latitude": 35.028924, + "longitude": -82.494068, + "city": "Slater", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29684, + "latitude": 34.409132, + "longitude": -82.660151, + "city": "Starr", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29685, + "latitude": 34.977961, + "longitude": -82.784806, + "city": "Sunset", + "state": "SC", + "county": "Pickens" + }, + { + "zip_code": 29686, + "latitude": 34.897008, + "longitude": -83.037482, + "city": "Tamassee", + "state": "SC", + "county": "Oconee" + }, + { + "zip_code": 29687, + "latitude": 34.970915, + "longitude": -82.38156, + "city": "Taylors", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29688, + "latitude": 35.047684, + "longitude": -82.353038, + "city": "Tigerville", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29689, + "latitude": 34.533588, + "longitude": -82.892202, + "city": "Townville", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29690, + "latitude": 35.071632, + "longitude": -82.374186, + "city": "Travelers Rest", + "state": "SC", + "county": "Greenville" + }, + { + "zip_code": 29691, + "latitude": 34.845676, + "longitude": -83.067197, + "city": "Walhalla", + "state": "SC", + "county": "Oconee" + }, + { + "zip_code": 29692, + "latitude": 34.388579, + "longitude": -82.248844, + "city": "Ware Shoals", + "state": "SC", + "county": "Greenwood" + }, + { + "zip_code": 29693, + "latitude": 34.696493, + "longitude": -83.153509, + "city": "Westminster", + "state": "SC", + "county": "Oconee" + }, + { + "zip_code": 29695, + "latitude": 34.218582, + "longitude": -82.304658, + "city": "Hodges", + "state": "SC", + "county": "Greenwood" + }, + { + "zip_code": 29696, + "latitude": 34.703943, + "longitude": -83.035205, + "city": "West Union", + "state": "SC", + "county": "Oconee" + }, + { + "zip_code": 29697, + "latitude": 34.553642, + "longitude": -82.612123, + "city": "Williamston", + "state": "SC", + "county": "Anderson" + }, + { + "zip_code": 29698, + "latitude": 34.888237, + "longitude": -81.96902, + "city": "Greenville", + "state": "SC", + "county": "Spartanburg" + }, + { + "zip_code": 29702, + "latitude": 35.10953, + "longitude": -81.494193, + "city": "Blacksburg", + "state": "SC", + "county": "Cherokee" + }, + { + "zip_code": 29703, + "latitude": 34.992612, + "longitude": -81.178712, + "city": "Bowling Green", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29704, + "latitude": 34.859604, + "longitude": -80.938257, + "city": "Catawba", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29706, + "latitude": 34.693285, + "longitude": -81.168022, + "city": "Chester", + "state": "SC", + "county": "Chester" + }, + { + "zip_code": 29708, + "latitude": 35.050243, + "longitude": -80.990828, + "city": "Fort Mill", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29709, + "latitude": 34.755564, + "longitude": -80.129515, + "city": "Chesterfield", + "state": "SC", + "county": "Chesterfield" + }, + { + "zip_code": 29710, + "latitude": 35.035952, + "longitude": -81.165152, + "city": "Clover", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29712, + "latitude": 34.778195, + "longitude": -80.996122, + "city": "Edgemoor", + "state": "SC", + "county": "Chester" + }, + { + "zip_code": 29714, + "latitude": 34.696331, + "longitude": -80.943356, + "city": "Fort Lawn", + "state": "SC", + "county": "Chester" + }, + { + "zip_code": 29715, + "latitude": 34.987625, + "longitude": -81.155211, + "city": "Fort Mill", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29716, + "latitude": 35.062815, + "longitude": -80.969035, + "city": "Fort Mill", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29717, + "latitude": 34.963339, + "longitude": -81.433448, + "city": "Hickory Grove", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29718, + "latitude": 34.71154, + "longitude": -80.392891, + "city": "Jefferson", + "state": "SC", + "county": "Chesterfield" + }, + { + "zip_code": 29720, + "latitude": 34.717915, + "longitude": -80.683935, + "city": "Lancaster", + "state": "SC", + "county": "Lancaster" + }, + { + "zip_code": 29721, + "latitude": 34.699412, + "longitude": -80.781721, + "city": "Lancaster", + "state": "SC", + "county": "Lancaster" + }, + { + "zip_code": 29722, + "latitude": 34.767269, + "longitude": -80.658932, + "city": "Lancaster", + "state": "SC", + "county": "Lancaster" + }, + { + "zip_code": 29724, + "latitude": 34.775302, + "longitude": -81.022816, + "city": "Lando", + "state": "SC", + "county": "Chester" + }, + { + "zip_code": 29726, + "latitude": 34.859857, + "longitude": -81.227432, + "city": "Mc Connells", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29727, + "latitude": 34.591849, + "longitude": -80.170691, + "city": "Mount Croghan", + "state": "SC", + "county": "Chesterfield" + }, + { + "zip_code": 29728, + "latitude": 34.768882, + "longitude": -80.3751, + "city": "Pageland", + "state": "SC", + "county": "Chesterfield" + }, + { + "zip_code": 29729, + "latitude": 34.692493, + "longitude": -81.003877, + "city": "Richburg", + "state": "SC", + "county": "Chester" + }, + { + "zip_code": 29730, + "latitude": 34.909109, + "longitude": -81.052437, + "city": "Rock Hill", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29731, + "latitude": 34.992612, + "longitude": -81.178712, + "city": "Rock Hill", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29732, + "latitude": 34.937706, + "longitude": -81.092227, + "city": "Rock Hill", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29733, + "latitude": 34.992612, + "longitude": -81.178712, + "city": "Rock Hill", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29734, + "latitude": 34.992612, + "longitude": -81.178712, + "city": "Rock Hill", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29741, + "latitude": 34.721259, + "longitude": -80.18961, + "city": "Ruby", + "state": "SC", + "county": "Chesterfield" + }, + { + "zip_code": 29742, + "latitude": 34.932788, + "longitude": -81.338537, + "city": "Sharon", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29743, + "latitude": 35.025155, + "longitude": -81.407268, + "city": "Smyrna", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29744, + "latitude": 34.973866, + "longitude": -80.851836, + "city": "Van Wyck", + "state": "SC", + "county": "Lancaster" + }, + { + "zip_code": 29745, + "latitude": 34.991814, + "longitude": -81.208605, + "city": "York", + "state": "SC", + "county": "York" + }, + { + "zip_code": 29801, + "latitude": 33.554433, + "longitude": -81.69588, + "city": "Aiken", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29802, + "latitude": 33.723519, + "longitude": -81.59072, + "city": "Aiken", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29803, + "latitude": 33.505914, + "longitude": -81.695053, + "city": "Aiken", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29804, + "latitude": 33.53773, + "longitude": -81.599891, + "city": "Aiken", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29805, + "latitude": 33.699335, + "longitude": -81.646528, + "city": "Aiken", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29808, + "latitude": 33.53773, + "longitude": -81.599891, + "city": "Aiken", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29809, + "latitude": 33.413029, + "longitude": -81.689951, + "city": "New Ellenton", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29810, + "latitude": 32.990158, + "longitude": -81.287561, + "city": "Allendale", + "state": "SC", + "county": "Allendale" + }, + { + "zip_code": 29812, + "latitude": 33.249806, + "longitude": -81.349595, + "city": "Barnwell", + "state": "SC", + "county": "Barnwell" + }, + { + "zip_code": 29813, + "latitude": 33.291666, + "longitude": -81.482658, + "city": "Hilda", + "state": "SC", + "county": "Barnwell" + }, + { + "zip_code": 29816, + "latitude": 33.496998, + "longitude": -81.850871, + "city": "Bath", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29817, + "latitude": 33.363819, + "longitude": -81.29751, + "city": "Blackville", + "state": "SC", + "county": "Barnwell" + }, + { + "zip_code": 29819, + "latitude": 34.059884, + "longitude": -82.201429, + "city": "Bradley", + "state": "SC", + "county": "Greenwood" + }, + { + "zip_code": 29821, + "latitude": 33.623057, + "longitude": -82.132655, + "city": "Clarks Hill", + "state": "SC", + "county": "Mccormick" + }, + { + "zip_code": 29822, + "latitude": 33.499656, + "longitude": -81.86485, + "city": "Clearwater", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29824, + "latitude": 33.767808, + "longitude": -81.987524, + "city": "Edgefield", + "state": "SC", + "county": "Edgefield" + }, + { + "zip_code": 29826, + "latitude": 33.38599, + "longitude": -81.378496, + "city": "Elko", + "state": "SC", + "county": "Barnwell" + }, + { + "zip_code": 29827, + "latitude": 32.959892, + "longitude": -81.249224, + "city": "Fairfax", + "state": "SC", + "county": "Allendale" + }, + { + "zip_code": 29828, + "latitude": 33.518235, + "longitude": -81.827708, + "city": "Gloverville", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29829, + "latitude": 33.641442, + "longitude": -81.79287, + "city": "Graniteville", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29831, + "latitude": 33.421714, + "longitude": -81.724702, + "city": "Jackson", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29832, + "latitude": 33.783177, + "longitude": -81.818415, + "city": "Johnston", + "state": "SC", + "county": "Edgefield" + }, + { + "zip_code": 29834, + "latitude": 33.497937, + "longitude": -81.844485, + "city": "Langley", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29835, + "latitude": 33.893238, + "longitude": -82.260861, + "city": "Mc Cormick", + "state": "SC", + "county": "Mccormick" + }, + { + "zip_code": 29836, + "latitude": 32.951573, + "longitude": -81.348337, + "city": "Martin", + "state": "SC", + "county": "Allendale" + }, + { + "zip_code": 29838, + "latitude": 33.705234, + "longitude": -82.218723, + "city": "Modoc", + "state": "SC", + "county": "Mccormick" + }, + { + "zip_code": 29839, + "latitude": 33.507335, + "longitude": -81.599198, + "city": "Montmorenci", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29840, + "latitude": 33.83562, + "longitude": -82.319983, + "city": "Mount Carmel", + "state": "SC", + "county": "Mccormick" + }, + { + "zip_code": 29841, + "latitude": 33.466705, + "longitude": -81.739059, + "city": "North Augusta", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29842, + "latitude": 33.470747, + "longitude": -81.8639, + "city": "Beech Island", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29843, + "latitude": 33.178426, + "longitude": -81.182699, + "city": "Olar", + "state": "SC", + "county": "Bamberg" + }, + { + "zip_code": 29844, + "latitude": 33.785444, + "longitude": -82.211086, + "city": "Parksville", + "state": "SC", + "county": "Mccormick" + }, + { + "zip_code": 29845, + "latitude": 33.83562, + "longitude": -82.319983, + "city": "Plum Branch", + "state": "SC", + "county": "Mccormick" + }, + { + "zip_code": 29846, + "latitude": 33.024104, + "longitude": -81.225755, + "city": "Sycamore", + "state": "SC", + "county": "Allendale" + }, + { + "zip_code": 29847, + "latitude": 33.698302, + "longitude": -81.864218, + "city": "Trenton", + "state": "SC", + "county": "Edgefield" + }, + { + "zip_code": 29848, + "latitude": 33.996062, + "longitude": -82.150998, + "city": "Troy", + "state": "SC", + "county": "Greenwood" + }, + { + "zip_code": 29849, + "latitude": 33.098848, + "longitude": -81.206789, + "city": "Ulmer", + "state": "SC", + "county": "Allendale" + }, + { + "zip_code": 29850, + "latitude": 33.545819, + "longitude": -81.686183, + "city": "Vaucluse", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29851, + "latitude": 33.526017, + "longitude": -81.795561, + "city": "Warrenville", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29853, + "latitude": 33.302264, + "longitude": -81.376276, + "city": "Williston", + "state": "SC", + "county": "Barnwell" + }, + { + "zip_code": 29856, + "latitude": 33.480097, + "longitude": -81.549415, + "city": "Windsor", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29860, + "latitude": 33.556645, + "longitude": -81.855456, + "city": "North Augusta", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29861, + "latitude": 33.53773, + "longitude": -81.599891, + "city": "North Augusta", + "state": "SC", + "county": "Aiken" + }, + { + "zip_code": 29899, + "latitude": 33.83562, + "longitude": -82.319983, + "city": "Mc Cormick", + "state": "SC", + "county": "Mccormick" + }, + { + "zip_code": 29901, + "latitude": 32.424353, + "longitude": -80.565343, + "city": "Beaufort", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29902, + "latitude": 32.404673, + "longitude": -80.653104, + "city": "Beaufort", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29903, + "latitude": 32.443974, + "longitude": -80.735245, + "city": "Beaufort", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29904, + "latitude": 32.390605, + "longitude": -80.661027, + "city": "Beaufort", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29905, + "latitude": 32.340119, + "longitude": -80.689041, + "city": "Beaufort", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29906, + "latitude": 32.382327, + "longitude": -80.760332, + "city": "Beaufort", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29910, + "latitude": 32.34969, + "longitude": -80.899506, + "city": "Bluffton", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29911, + "latitude": 32.885698, + "longitude": -81.206373, + "city": "Brunson", + "state": "SC", + "county": "Hampton" + }, + { + "zip_code": 29912, + "latitude": 32.488929, + "longitude": -80.989142, + "city": "Coosawatchie", + "state": "SC", + "county": "Jasper" + }, + { + "zip_code": 29913, + "latitude": 32.929902, + "longitude": -81.184627, + "city": "Crocketville", + "state": "SC", + "county": "Hampton" + }, + { + "zip_code": 29914, + "latitude": 32.552652, + "longitude": -80.677001, + "city": "Dale", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29915, + "latitude": 32.156011, + "longitude": -80.787899, + "city": "Daufuskie Island", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29916, + "latitude": 32.718903, + "longitude": -81.151373, + "city": "Early Branch", + "state": "SC", + "county": "Hampton" + }, + { + "zip_code": 29918, + "latitude": 32.80661, + "longitude": -81.183087, + "city": "Estill", + "state": "SC", + "county": "Hampton" + }, + { + "zip_code": 29920, + "latitude": 32.371627, + "longitude": -80.538322, + "city": "Saint Helena Island", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29921, + "latitude": 32.718212, + "longitude": -81.207112, + "city": "Furman", + "state": "SC", + "county": "Hampton" + }, + { + "zip_code": 29922, + "latitude": 32.74172, + "longitude": -81.193318, + "city": "Garnett", + "state": "SC", + "county": "Hampton" + }, + { + "zip_code": 29923, + "latitude": 32.788773, + "longitude": -81.126913, + "city": "Gifford", + "state": "SC", + "county": "Hampton" + }, + { + "zip_code": 29924, + "latitude": 32.882332, + "longitude": -81.132412, + "city": "Hampton", + "state": "SC", + "county": "Hampton" + }, + { + "zip_code": 29925, + "latitude": 32.21319, + "longitude": -80.799698, + "city": "Hilton Head Island", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29926, + "latitude": 32.207724, + "longitude": -80.747577, + "city": "Hilton Head Island", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29927, + "latitude": 32.244037, + "longitude": -81.074835, + "city": "Hardeeville", + "state": "SC", + "county": "Jasper" + }, + { + "zip_code": 29928, + "latitude": 32.265135, + "longitude": -80.644117, + "city": "Hilton Head Island", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29929, + "latitude": 32.946307, + "longitude": -80.948043, + "city": "Islandton", + "state": "SC", + "county": "Colleton" + }, + { + "zip_code": 29931, + "latitude": 32.538432, + "longitude": -80.702594, + "city": "Lobeco", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29932, + "latitude": 32.788773, + "longitude": -81.126913, + "city": "Luray", + "state": "SC", + "county": "Hampton" + }, + { + "zip_code": 29933, + "latitude": 32.788773, + "longitude": -81.126913, + "city": "Miley", + "state": "SC", + "county": "Hampton" + }, + { + "zip_code": 29934, + "latitude": 32.271811, + "longitude": -81.061485, + "city": "Pineland", + "state": "SC", + "county": "Jasper" + }, + { + "zip_code": 29935, + "latitude": 32.387434, + "longitude": -80.684392, + "city": "Port Royal", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29936, + "latitude": 32.486826, + "longitude": -80.925708, + "city": "Ridgeland", + "state": "SC", + "county": "Jasper" + }, + { + "zip_code": 29938, + "latitude": 32.390605, + "longitude": -80.661027, + "city": "Hilton Head Island", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29939, + "latitude": 32.678624, + "longitude": -81.245487, + "city": "Scotia", + "state": "SC", + "county": "Hampton" + }, + { + "zip_code": 29940, + "latitude": 32.569296, + "longitude": -80.719179, + "city": "Seabrook", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29941, + "latitude": 32.587814, + "longitude": -80.718285, + "city": "Sheldon", + "state": "SC", + "county": "Beaufort" + }, + { + "zip_code": 29943, + "latitude": 32.393253, + "longitude": -81.011496, + "city": "Tillman", + "state": "SC", + "county": "Jasper" + }, + { + "zip_code": 29944, + "latitude": 32.797222, + "longitude": -81.079803, + "city": "Varnville", + "state": "SC", + "county": "Hampton" + }, + { + "zip_code": 29945, + "latitude": 32.692321, + "longitude": -80.887321, + "city": "Yemassee", + "state": "SC", + "county": "Hampton" + }, + { + "zip_code": 30002, + "latitude": 33.771704, + "longitude": -84.23937, + "city": "Avondale Estates", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30003, + "latitude": 33.960353, + "longitude": -84.037859, + "city": "Norcross", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30004, + "latitude": 34.112373, + "longitude": -84.30205, + "city": "Alpharetta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30005, + "latitude": 34.078229, + "longitude": -84.228131, + "city": "Alpharetta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30006, + "latitude": 33.912473, + "longitude": -84.557181, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30007, + "latitude": 33.912473, + "longitude": -84.557181, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30008, + "latitude": 33.897203, + "longitude": -84.591983, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30009, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Alpharetta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30010, + "latitude": 33.960353, + "longitude": -84.037859, + "city": "Norcross", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30011, + "latitude": 34.019109, + "longitude": -83.826094, + "city": "Auburn", + "state": "GA", + "county": "Barrow" + }, + { + "zip_code": 30012, + "latitude": 33.719178, + "longitude": -84.002061, + "city": "Conyers", + "state": "GA", + "county": "Rockdale" + }, + { + "zip_code": 30013, + "latitude": 33.643597, + "longitude": -83.968359, + "city": "Conyers", + "state": "GA", + "county": "Rockdale" + }, + { + "zip_code": 30014, + "latitude": 33.529341, + "longitude": -83.849622, + "city": "Covington", + "state": "GA", + "county": "Newton" + }, + { + "zip_code": 30015, + "latitude": 33.555791, + "longitude": -83.864915, + "city": "Covington", + "state": "GA", + "county": "Newton" + }, + { + "zip_code": 30016, + "latitude": 33.514565, + "longitude": -83.862612, + "city": "Covington", + "state": "GA", + "county": "Newton" + }, + { + "zip_code": 30017, + "latitude": 33.916922, + "longitude": -84.040973, + "city": "Grayson", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30018, + "latitude": 33.717989, + "longitude": -83.801451, + "city": "Jersey", + "state": "GA", + "county": "Walton" + }, + { + "zip_code": 30019, + "latitude": 33.988309, + "longitude": -83.879494, + "city": "Dacula", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30021, + "latitude": 33.810953, + "longitude": -84.23797, + "city": "Clarkston", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30022, + "latitude": 34.02679, + "longitude": -84.242235, + "city": "Alpharetta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30023, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Alpharetta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30024, + "latitude": 34.042479, + "longitude": -84.026171, + "city": "Suwanee", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30025, + "latitude": 33.679092, + "longitude": -83.683477, + "city": "Social Circle", + "state": "GA", + "county": "Walton" + }, + { + "zip_code": 30026, + "latitude": 33.962979, + "longitude": -84.092267, + "city": "North Metro", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30028, + "latitude": 34.193041, + "longitude": -84.092588, + "city": "Cumming", + "state": "GA", + "county": "Forsyth" + }, + { + "zip_code": 30029, + "latitude": 33.960353, + "longitude": -84.037859, + "city": "North Metro", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30030, + "latitude": 33.772554, + "longitude": -84.291723, + "city": "Decatur", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30031, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Decatur", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30032, + "latitude": 33.749655, + "longitude": -84.272871, + "city": "Decatur", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30033, + "latitude": 33.816452, + "longitude": -84.285772, + "city": "Decatur", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30034, + "latitude": 33.690757, + "longitude": -84.251171, + "city": "Decatur", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30035, + "latitude": 33.732056, + "longitude": -84.200919, + "city": "Decatur", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30036, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Decatur", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30037, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Decatur", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30038, + "latitude": 33.667509, + "longitude": -84.144816, + "city": "Lithonia", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30039, + "latitude": 33.817803, + "longitude": -84.022911, + "city": "Snellville", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30040, + "latitude": 34.232095, + "longitude": -84.157975, + "city": "Cumming", + "state": "GA", + "county": "Forsyth" + }, + { + "zip_code": 30041, + "latitude": 34.203659, + "longitude": -84.103108, + "city": "Cumming", + "state": "GA", + "county": "Forsyth" + }, + { + "zip_code": 30042, + "latitude": 33.929464, + "longitude": -84.103226, + "city": "Lawrenceville", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30043, + "latitude": 34.00309, + "longitude": -84.012608, + "city": "Lawrenceville", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30044, + "latitude": 33.941847, + "longitude": -84.070567, + "city": "Lawrenceville", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30045, + "latitude": 33.936729, + "longitude": -83.957347, + "city": "Lawrenceville", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30046, + "latitude": 33.960353, + "longitude": -84.037859, + "city": "Lawrenceville", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30047, + "latitude": 33.865587, + "longitude": -84.072463, + "city": "Lilburn", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30048, + "latitude": 33.960353, + "longitude": -84.037859, + "city": "Lilburn", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30049, + "latitude": "", + "longitude": "", + "city": "Lawrenceville", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30052, + "latitude": 33.876889, + "longitude": -83.896781, + "city": "Loganville", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30054, + "latitude": 33.670567, + "longitude": -83.874013, + "city": "Oxford", + "state": "GA", + "county": "Newton" + }, + { + "zip_code": 30055, + "latitude": 33.431362, + "longitude": -83.790756, + "city": "Mansfield", + "state": "GA", + "county": "Jasper" + }, + { + "zip_code": 30056, + "latitude": 33.514898, + "longitude": -83.70718, + "city": "Newborn", + "state": "GA", + "county": "Newton" + }, + { + "zip_code": 30058, + "latitude": 33.735607, + "longitude": -84.100915, + "city": "Lithonia", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30060, + "latitude": 33.938206, + "longitude": -84.540333, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30061, + "latitude": 33.932842, + "longitude": -84.556004, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30062, + "latitude": 33.982269, + "longitude": -84.48803, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30063, + "latitude": 33.965294, + "longitude": -84.511209, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30064, + "latitude": 33.923652, + "longitude": -84.629241, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30065, + "latitude": 33.912473, + "longitude": -84.557181, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30066, + "latitude": 34.024849, + "longitude": -84.498365, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30067, + "latitude": 33.932551, + "longitude": -84.462379, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30068, + "latitude": 33.970894, + "longitude": -84.445734, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30069, + "latitude": 33.912473, + "longitude": -84.557181, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30070, + "latitude": 33.571234, + "longitude": -83.895063, + "city": "Porterdale", + "state": "GA", + "county": "Newton" + }, + { + "zip_code": 30071, + "latitude": 33.944461, + "longitude": -84.210969, + "city": "Norcross", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30072, + "latitude": 33.790606, + "longitude": -84.205269, + "city": "Pine Lake", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30074, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Redan", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30075, + "latitude": 34.055198, + "longitude": -84.370475, + "city": "Roswell", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30076, + "latitude": 34.027783, + "longitude": -84.320162, + "city": "Roswell", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30077, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Roswell", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30078, + "latitude": 33.863454, + "longitude": -84.008066, + "city": "Snellville", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30079, + "latitude": 33.793491, + "longitude": -84.258421, + "city": "Scottdale", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30080, + "latitude": 33.864604, + "longitude": -84.556181, + "city": "Smyrna", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30081, + "latitude": 33.858836, + "longitude": -84.71062, + "city": "Smyrna", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30082, + "latitude": 33.856754, + "longitude": -84.534496, + "city": "Smyrna", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30083, + "latitude": 33.786405, + "longitude": -84.203419, + "city": "Stone Mountain", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30084, + "latitude": 33.853945, + "longitude": -84.215369, + "city": "Tucker", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30085, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Tucker", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30086, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Stone Mountain", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30087, + "latitude": 33.810475, + "longitude": -84.136145, + "city": "Stone Mountain", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30088, + "latitude": 33.761106, + "longitude": -84.176618, + "city": "Stone Mountain", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30090, + "latitude": 33.952451, + "longitude": -84.547082, + "city": "Marietta", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30091, + "latitude": 33.960353, + "longitude": -84.037859, + "city": "Norcross", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30092, + "latitude": 33.910725, + "longitude": -84.138468, + "city": "Norcross", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30093, + "latitude": 33.932173, + "longitude": -84.181881, + "city": "Norcross", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30094, + "latitude": 33.611119, + "longitude": -84.068288, + "city": "Conyers", + "state": "GA", + "county": "Rockdale" + }, + { + "zip_code": 30095, + "latitude": 34.025598, + "longitude": -84.13045, + "city": "Duluth", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30096, + "latitude": 33.984534, + "longitude": -84.152915, + "city": "Duluth", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30097, + "latitude": 34.006019, + "longitude": -84.144674, + "city": "Duluth", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30098, + "latitude": 33.960353, + "longitude": -84.037859, + "city": "Duluth", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30099, + "latitude": 33.959535, + "longitude": -84.105011, + "city": "Duluth", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30101, + "latitude": 34.023398, + "longitude": -84.673784, + "city": "Acworth", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30102, + "latitude": 34.07068, + "longitude": -84.589406, + "city": "Acworth", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30103, + "latitude": 34.296339, + "longitude": -84.909216, + "city": "Adairsville", + "state": "GA", + "county": "Bartow" + }, + { + "zip_code": 30104, + "latitude": 34.053167, + "longitude": -85.079865, + "city": "Aragon", + "state": "GA", + "county": "Polk" + }, + { + "zip_code": 30105, + "latitude": 34.479253, + "longitude": -85.149208, + "city": "Armuchee", + "state": "GA", + "county": "Floyd" + }, + { + "zip_code": 30106, + "latitude": 33.836897, + "longitude": -84.630729, + "city": "Austell", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30107, + "latitude": 34.30116, + "longitude": -84.442937, + "city": "Ball Ground", + "state": "GA", + "county": "Cherokee" + }, + { + "zip_code": 30108, + "latitude": 33.587706, + "longitude": -85.123883, + "city": "Bowdon", + "state": "GA", + "county": "Carroll" + }, + { + "zip_code": 30109, + "latitude": 33.653355, + "longitude": -85.136227, + "city": "Bowdon Junction", + "state": "GA", + "county": "Carroll" + }, + { + "zip_code": 30110, + "latitude": 33.767997, + "longitude": -85.172928, + "city": "Bremen", + "state": "GA", + "county": "Haralson" + }, + { + "zip_code": 30111, + "latitude": 33.912473, + "longitude": -84.557181, + "city": "Clarkdale", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30113, + "latitude": 33.836682, + "longitude": -85.210444, + "city": "Buchanan", + "state": "GA", + "county": "Haralson" + }, + { + "zip_code": 30114, + "latitude": 34.250547, + "longitude": -84.49093, + "city": "Canton", + "state": "GA", + "county": "Cherokee" + }, + { + "zip_code": 30115, + "latitude": 34.199345, + "longitude": -84.419935, + "city": "Canton", + "state": "GA", + "county": "Cherokee" + }, + { + "zip_code": 30116, + "latitude": 33.604458, + "longitude": -85.04987, + "city": "Carrollton", + "state": "GA", + "county": "Carroll" + }, + { + "zip_code": 30117, + "latitude": 33.566767, + "longitude": -85.078863, + "city": "Carrollton", + "state": "GA", + "county": "Carroll" + }, + { + "zip_code": 30118, + "latitude": 33.571176, + "longitude": -85.09612, + "city": "Carrollton", + "state": "GA", + "county": "Carroll" + }, + { + "zip_code": 30119, + "latitude": 33.618931, + "longitude": -85.073582, + "city": "Carrollton", + "state": "GA", + "county": "Carroll" + }, + { + "zip_code": 30120, + "latitude": 34.200787, + "longitude": -84.847108, + "city": "Cartersville", + "state": "GA", + "county": "Bartow" + }, + { + "zip_code": 30121, + "latitude": 34.20787, + "longitude": -84.76727, + "city": "Cartersville", + "state": "GA", + "county": "Bartow" + }, + { + "zip_code": 30122, + "latitude": 33.765457, + "longitude": -84.646946, + "city": "Lithia Springs", + "state": "GA", + "county": "Douglas" + }, + { + "zip_code": 30123, + "latitude": 34.244179, + "longitude": -84.845684, + "city": "Cassville", + "state": "GA", + "county": "Bartow" + }, + { + "zip_code": 30124, + "latitude": 34.16159, + "longitude": -85.33281, + "city": "Cave Spring", + "state": "GA", + "county": "Floyd" + }, + { + "zip_code": 30125, + "latitude": 33.998841, + "longitude": -85.239429, + "city": "Cedartown", + "state": "GA", + "county": "Polk" + }, + { + "zip_code": 30126, + "latitude": 33.833161, + "longitude": -84.603102, + "city": "Mableton", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30127, + "latitude": 33.91351, + "longitude": -84.685885, + "city": "Powder Springs", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30129, + "latitude": 34.333308, + "longitude": -85.233721, + "city": "Coosa", + "state": "GA", + "county": "Floyd" + }, + { + "zip_code": 30132, + "latitude": 33.935396, + "longitude": -84.866654, + "city": "Dallas", + "state": "GA", + "county": "Paulding" + }, + { + "zip_code": 30133, + "latitude": 33.68966, + "longitude": -84.744595, + "city": "Douglasville", + "state": "GA", + "county": "Douglas" + }, + { + "zip_code": 30134, + "latitude": 33.759543, + "longitude": -84.777337, + "city": "Douglasville", + "state": "GA", + "county": "Douglas" + }, + { + "zip_code": 30135, + "latitude": 33.667491, + "longitude": -84.750615, + "city": "Douglasville", + "state": "GA", + "county": "Douglas" + }, + { + "zip_code": 30137, + "latitude": 34.118352, + "longitude": -84.762315, + "city": "Emerson", + "state": "GA", + "county": "Bartow" + }, + { + "zip_code": 30138, + "latitude": 33.99994, + "longitude": -85.172297, + "city": "Esom Hill", + "state": "GA", + "county": "Polk" + }, + { + "zip_code": 30139, + "latitude": 34.462493, + "longitude": -84.743027, + "city": "Fairmount", + "state": "GA", + "county": "Gordon" + }, + { + "zip_code": 30140, + "latitude": 33.88232, + "longitude": -85.234946, + "city": "Felton", + "state": "GA", + "county": "Haralson" + }, + { + "zip_code": 30141, + "latitude": 33.879416, + "longitude": -84.844274, + "city": "Hiram", + "state": "GA", + "county": "Paulding" + }, + { + "zip_code": 30142, + "latitude": 34.242944, + "longitude": -84.458326, + "city": "Holly Springs", + "state": "GA", + "county": "Cherokee" + }, + { + "zip_code": 30143, + "latitude": 34.469042, + "longitude": -84.428243, + "city": "Jasper", + "state": "GA", + "county": "Pickens" + }, + { + "zip_code": 30144, + "latitude": 34.03384, + "longitude": -84.597433, + "city": "Kennesaw", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30145, + "latitude": 34.233908, + "longitude": -84.962055, + "city": "Kingston", + "state": "GA", + "county": "Bartow" + }, + { + "zip_code": 30146, + "latitude": 34.242944, + "longitude": -84.458326, + "city": "Lebanon", + "state": "GA", + "county": "Cherokee" + }, + { + "zip_code": 30147, + "latitude": 34.152211, + "longitude": -85.220364, + "city": "Lindale", + "state": "GA", + "county": "Floyd" + }, + { + "zip_code": 30148, + "latitude": 34.439829, + "longitude": -84.302964, + "city": "Marble Hill", + "state": "GA", + "county": "Pickens" + }, + { + "zip_code": 30149, + "latitude": 34.280355, + "longitude": -85.182085, + "city": "Mount Berry", + "state": "GA", + "county": "Floyd" + }, + { + "zip_code": 30150, + "latitude": 33.643002, + "longitude": -85.181782, + "city": "Mount Zion", + "state": "GA", + "county": "Carroll" + }, + { + "zip_code": 30151, + "latitude": 34.242944, + "longitude": -84.458326, + "city": "Nelson", + "state": "GA", + "county": "Cherokee" + }, + { + "zip_code": 30152, + "latitude": 33.995132, + "longitude": -84.654385, + "city": "Kennesaw", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30153, + "latitude": 33.993766, + "longitude": -85.091511, + "city": "Rockmart", + "state": "GA", + "county": "Polk" + }, + { + "zip_code": 30154, + "latitude": 33.68966, + "longitude": -84.744595, + "city": "Douglasville", + "state": "GA", + "county": "Douglas" + }, + { + "zip_code": 30156, + "latitude": "", + "longitude": "", + "city": "Kennesaw", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30157, + "latitude": 33.90448, + "longitude": -84.862139, + "city": "Dallas", + "state": "GA", + "county": "Paulding" + }, + { + "zip_code": 30160, + "latitude": "", + "longitude": "", + "city": "Kennesaw", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30161, + "latitude": 34.262335, + "longitude": -85.22089, + "city": "Rome", + "state": "GA", + "county": "Floyd" + }, + { + "zip_code": 30162, + "latitude": 34.290508, + "longitude": -85.213817, + "city": "Rome", + "state": "GA", + "county": "Floyd" + }, + { + "zip_code": 30163, + "latitude": 34.333308, + "longitude": -85.233721, + "city": "Rome", + "state": "GA", + "county": "Floyd" + }, + { + "zip_code": 30164, + "latitude": 34.333308, + "longitude": -85.233721, + "city": "Rome", + "state": "GA", + "county": "Floyd" + }, + { + "zip_code": 30165, + "latitude": 34.315817, + "longitude": -85.272949, + "city": "Rome", + "state": "GA", + "county": "Floyd" + }, + { + "zip_code": 30168, + "latitude": 33.783756, + "longitude": -84.595232, + "city": "Austell", + "state": "GA", + "county": "Cobb" + }, + { + "zip_code": 30170, + "latitude": 33.524163, + "longitude": -85.165295, + "city": "Roopville", + "state": "GA", + "county": "Carroll" + }, + { + "zip_code": 30171, + "latitude": 34.337901, + "longitude": -84.737644, + "city": "Rydal", + "state": "GA", + "county": "Bartow" + }, + { + "zip_code": 30172, + "latitude": 34.333308, + "longitude": -85.233721, + "city": "Shannon", + "state": "GA", + "county": "Floyd" + }, + { + "zip_code": 30173, + "latitude": 34.145452, + "longitude": -85.117749, + "city": "Silver Creek", + "state": "GA", + "county": "Floyd" + }, + { + "zip_code": 30175, + "latitude": 34.515653, + "longitude": -84.523407, + "city": "Talking Rock", + "state": "GA", + "county": "Pickens" + }, + { + "zip_code": 30176, + "latitude": 33.770057, + "longitude": -85.261585, + "city": "Tallapoosa", + "state": "GA", + "county": "Haralson" + }, + { + "zip_code": 30177, + "latitude": 34.402724, + "longitude": -84.378511, + "city": "Tate", + "state": "GA", + "county": "Pickens" + }, + { + "zip_code": 30178, + "latitude": 34.129573, + "longitude": -84.973364, + "city": "Taylorsville", + "state": "GA", + "county": "Bartow" + }, + { + "zip_code": 30179, + "latitude": 33.73746, + "longitude": -85.026107, + "city": "Temple", + "state": "GA", + "county": "Carroll" + }, + { + "zip_code": 30180, + "latitude": 33.705546, + "longitude": -84.975668, + "city": "Villa Rica", + "state": "GA", + "county": "Carroll" + }, + { + "zip_code": 30182, + "latitude": 33.680148, + "longitude": -85.251297, + "city": "Waco", + "state": "GA", + "county": "Haralson" + }, + { + "zip_code": 30183, + "latitude": 34.338605, + "longitude": -84.577601, + "city": "Waleska", + "state": "GA", + "county": "Cherokee" + }, + { + "zip_code": 30184, + "latitude": 34.264331, + "longitude": -84.753929, + "city": "White", + "state": "GA", + "county": "Bartow" + }, + { + "zip_code": 30185, + "latitude": 33.509001, + "longitude": -84.910211, + "city": "Whitesburg", + "state": "GA", + "county": "Carroll" + }, + { + "zip_code": 30187, + "latitude": 33.659494, + "longitude": -84.778163, + "city": "Winston", + "state": "GA", + "county": "Douglas" + }, + { + "zip_code": 30188, + "latitude": 34.127398, + "longitude": -84.481787, + "city": "Woodstock", + "state": "GA", + "county": "Cherokee" + }, + { + "zip_code": 30189, + "latitude": 34.147985, + "longitude": -84.47725, + "city": "Woodstock", + "state": "GA", + "county": "Cherokee" + }, + { + "zip_code": 30204, + "latitude": 33.07577, + "longitude": -84.145706, + "city": "Barnesville", + "state": "GA", + "county": "Lamar" + }, + { + "zip_code": 30205, + "latitude": 33.30009, + "longitude": -84.453196, + "city": "Brooks", + "state": "GA", + "county": "Fayette" + }, + { + "zip_code": 30206, + "latitude": 33.104729, + "longitude": -84.456917, + "city": "Concord", + "state": "GA", + "county": "Pike" + }, + { + "zip_code": 30212, + "latitude": 33.278205, + "longitude": -84.288803, + "city": "Experiment", + "state": "GA", + "county": "Spalding" + }, + { + "zip_code": 30213, + "latitude": 33.591462, + "longitude": -84.608907, + "city": "Fairburn", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30214, + "latitude": 33.467941, + "longitude": -84.480626, + "city": "Fayetteville", + "state": "GA", + "county": "Fayette" + }, + { + "zip_code": 30215, + "latitude": 33.394307, + "longitude": -84.473778, + "city": "Fayetteville", + "state": "GA", + "county": "Fayette" + }, + { + "zip_code": 30216, + "latitude": 33.237156, + "longitude": -83.898277, + "city": "Flovilla", + "state": "GA", + "county": "Butts" + }, + { + "zip_code": 30217, + "latitude": 33.278005, + "longitude": -85.134045, + "city": "Franklin", + "state": "GA", + "county": "Heard" + }, + { + "zip_code": 30218, + "latitude": 33.06913, + "longitude": -84.613189, + "city": "Gay", + "state": "GA", + "county": "Meriwether" + }, + { + "zip_code": 30219, + "latitude": 33.157214, + "longitude": -85.170588, + "city": "Glenn", + "state": "GA", + "county": "Heard" + }, + { + "zip_code": 30220, + "latitude": 33.275619, + "longitude": -84.741266, + "city": "Grantville", + "state": "GA", + "county": "Coweta" + }, + { + "zip_code": 30222, + "latitude": 33.046754, + "longitude": -84.740188, + "city": "Greenville", + "state": "GA", + "county": "Meriwether" + }, + { + "zip_code": 30223, + "latitude": 33.265854, + "longitude": -84.289552, + "city": "Griffin", + "state": "GA", + "county": "Spalding" + }, + { + "zip_code": 30224, + "latitude": 33.240386, + "longitude": -84.273402, + "city": "Griffin", + "state": "GA", + "county": "Spalding" + }, + { + "zip_code": 30228, + "latitude": 33.408112, + "longitude": -84.273764, + "city": "Hampton", + "state": "GA", + "county": "Henry" + }, + { + "zip_code": 30229, + "latitude": 33.232156, + "longitude": -84.56854, + "city": "Haralson", + "state": "GA", + "county": "Coweta" + }, + { + "zip_code": 30230, + "latitude": 33.144151, + "longitude": -84.960566, + "city": "Hogansville", + "state": "GA", + "county": "Troup" + }, + { + "zip_code": 30232, + "latitude": 33.403811, + "longitude": -84.504403, + "city": "Inman", + "state": "GA", + "county": "Fayette" + }, + { + "zip_code": 30233, + "latitude": 33.319863, + "longitude": -83.981112, + "city": "Jackson", + "state": "GA", + "county": "Butts" + }, + { + "zip_code": 30234, + "latitude": 33.322351, + "longitude": -84.028744, + "city": "Jenkinsburg", + "state": "GA", + "county": "Butts" + }, + { + "zip_code": 30236, + "latitude": 33.518505, + "longitude": -84.337523, + "city": "Jonesboro", + "state": "GA", + "county": "Clayton" + }, + { + "zip_code": 30237, + "latitude": 33.500697, + "longitude": -84.351273, + "city": "Jonesboro", + "state": "GA", + "county": "Clayton" + }, + { + "zip_code": 30238, + "latitude": 33.494387, + "longitude": -84.379724, + "city": "Jonesboro", + "state": "GA", + "county": "Clayton" + }, + { + "zip_code": 30240, + "latitude": 33.024347, + "longitude": -85.073906, + "city": "Lagrange", + "state": "GA", + "county": "Troup" + }, + { + "zip_code": 30241, + "latitude": 33.024935, + "longitude": -84.957664, + "city": "Lagrange", + "state": "GA", + "county": "Troup" + }, + { + "zip_code": 30248, + "latitude": 33.372111, + "longitude": -84.115645, + "city": "Locust Grove", + "state": "GA", + "county": "Henry" + }, + { + "zip_code": 30250, + "latitude": 33.442909, + "longitude": -84.313582, + "city": "Lovejoy", + "state": "GA", + "county": "Clayton" + }, + { + "zip_code": 30251, + "latitude": 33.179184, + "longitude": -84.699455, + "city": "Luthersville", + "state": "GA", + "county": "Meriwether" + }, + { + "zip_code": 30252, + "latitude": 33.476762, + "longitude": -84.055005, + "city": "Mcdonough", + "state": "GA", + "county": "Henry" + }, + { + "zip_code": 30253, + "latitude": 33.451043, + "longitude": -84.154412, + "city": "Mcdonough", + "state": "GA", + "county": "Henry" + }, + { + "zip_code": 30256, + "latitude": 33.039123, + "longitude": -84.377639, + "city": "Meansville", + "state": "GA", + "county": "Pike" + }, + { + "zip_code": 30257, + "latitude": 33.1365, + "longitude": -84.148695, + "city": "Milner", + "state": "GA", + "county": "Lamar" + }, + { + "zip_code": 30258, + "latitude": 33.022288, + "longitude": -84.436925, + "city": "Molena", + "state": "GA", + "county": "Pike" + }, + { + "zip_code": 30259, + "latitude": 33.276279, + "longitude": -84.738721, + "city": "Moreland", + "state": "GA", + "county": "Coweta" + }, + { + "zip_code": 30260, + "latitude": 33.58016, + "longitude": -84.326757, + "city": "Morrow", + "state": "GA", + "county": "Clayton" + }, + { + "zip_code": 30261, + "latitude": 33.04567, + "longitude": -85.048995, + "city": "Lagrange", + "state": "GA", + "county": "Troup" + }, + { + "zip_code": 30263, + "latitude": 33.369595, + "longitude": -84.819397, + "city": "Newnan", + "state": "GA", + "county": "Coweta" + }, + { + "zip_code": 30264, + "latitude": 33.361003, + "longitude": -84.814173, + "city": "Newnan", + "state": "GA", + "county": "Coweta" + }, + { + "zip_code": 30265, + "latitude": 33.415987, + "longitude": -84.705681, + "city": "Newnan", + "state": "GA", + "county": "Coweta" + }, + { + "zip_code": 30266, + "latitude": 33.265656, + "longitude": -84.298964, + "city": "Orchard Hill", + "state": "GA", + "county": "Spalding" + }, + { + "zip_code": 30268, + "latitude": 33.559191, + "longitude": -84.710082, + "city": "Palmetto", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30269, + "latitude": 33.395759, + "longitude": -84.568173, + "city": "Peachtree City", + "state": "GA", + "county": "Fayette" + }, + { + "zip_code": 30271, + "latitude": 33.351401, + "longitude": -84.756109, + "city": "Newnan", + "state": "GA", + "county": "Coweta" + }, + { + "zip_code": 30272, + "latitude": 33.625894, + "longitude": -84.516327, + "city": "Red Oak", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30273, + "latitude": 33.577049, + "longitude": -84.272559, + "city": "Rex", + "state": "GA", + "county": "Clayton" + }, + { + "zip_code": 30274, + "latitude": 33.555536, + "longitude": -84.397997, + "city": "Riverdale", + "state": "GA", + "county": "Clayton" + }, + { + "zip_code": 30275, + "latitude": 33.42985, + "longitude": -84.874406, + "city": "Sargent", + "state": "GA", + "county": "Coweta" + }, + { + "zip_code": 30276, + "latitude": 33.285373, + "longitude": -84.602516, + "city": "Senoia", + "state": "GA", + "county": "Coweta" + }, + { + "zip_code": 30277, + "latitude": 33.363069, + "longitude": -84.659393, + "city": "Sharpsburg", + "state": "GA", + "county": "Coweta" + }, + { + "zip_code": 30281, + "latitude": 33.549947, + "longitude": -84.207969, + "city": "Stockbridge", + "state": "GA", + "county": "Henry" + }, + { + "zip_code": 30284, + "latitude": 33.345253, + "longitude": -84.289814, + "city": "Sunny Side", + "state": "GA", + "county": "Spalding" + }, + { + "zip_code": 30285, + "latitude": 32.965021, + "longitude": -84.219349, + "city": "The Rock", + "state": "GA", + "county": "Upson" + }, + { + "zip_code": 30286, + "latitude": 32.884509, + "longitude": -84.336486, + "city": "Thomaston", + "state": "GA", + "county": "Upson" + }, + { + "zip_code": 30287, + "latitude": 33.500697, + "longitude": -84.351273, + "city": "Morrow", + "state": "GA", + "county": "Clayton" + }, + { + "zip_code": 30288, + "latitude": 33.636858, + "longitude": -84.337139, + "city": "Conley", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30289, + "latitude": 33.32603, + "longitude": -84.637108, + "city": "Turin", + "state": "GA", + "county": "Coweta" + }, + { + "zip_code": 30290, + "latitude": 33.460036, + "longitude": -84.585773, + "city": "Tyrone", + "state": "GA", + "county": "Fayette" + }, + { + "zip_code": 30291, + "latitude": 33.573098, + "longitude": -84.551011, + "city": "Union City", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30292, + "latitude": 33.117012, + "longitude": -84.399149, + "city": "Williamson", + "state": "GA", + "county": "Pike" + }, + { + "zip_code": 30293, + "latitude": 32.968248, + "longitude": -84.625409, + "city": "Woodbury", + "state": "GA", + "county": "Meriwether" + }, + { + "zip_code": 30294, + "latitude": 33.616559, + "longitude": -84.293942, + "city": "Ellenwood", + "state": "GA", + "county": "Clayton" + }, + { + "zip_code": 30295, + "latitude": 33.077371, + "longitude": -84.321736, + "city": "Zebulon", + "state": "GA", + "county": "Pike" + }, + { + "zip_code": 30296, + "latitude": 33.558361, + "longitude": -84.434776, + "city": "Riverdale", + "state": "GA", + "county": "Clayton" + }, + { + "zip_code": 30297, + "latitude": 33.611509, + "longitude": -84.374496, + "city": "Forest Park", + "state": "GA", + "county": "Clayton" + }, + { + "zip_code": 30298, + "latitude": 33.500697, + "longitude": -84.351273, + "city": "Forest Park", + "state": "GA", + "county": "Clayton" + }, + { + "zip_code": 30301, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30302, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30303, + "latitude": 33.752456, + "longitude": -84.392026, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30304, + "latitude": 33.848196, + "longitude": -84.429296, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30305, + "latitude": 33.834989, + "longitude": -84.386826, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30306, + "latitude": 33.787804, + "longitude": -84.359775, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30307, + "latitude": 33.762855, + "longitude": -84.357375, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30308, + "latitude": 33.794055, + "longitude": -84.377326, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30309, + "latitude": 33.797854, + "longitude": -84.387726, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30310, + "latitude": 33.718257, + "longitude": -84.430877, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30311, + "latitude": 33.724907, + "longitude": -84.468329, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30312, + "latitude": 33.829743, + "longitude": -84.381529, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30313, + "latitude": 33.760505, + "longitude": -84.399626, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30314, + "latitude": 33.757806, + "longitude": -84.433649, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30315, + "latitude": 33.697257, + "longitude": -84.383725, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30316, + "latitude": 33.726906, + "longitude": -84.358525, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30317, + "latitude": 33.753555, + "longitude": -84.351125, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30318, + "latitude": 33.792005, + "longitude": -84.442778, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30319, + "latitude": 33.876752, + "longitude": -84.329124, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30320, + "latitude": 33.656824, + "longitude": -84.423648, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30321, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30322, + "latitude": 33.795204, + "longitude": -84.324824, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30324, + "latitude": 33.820104, + "longitude": -84.366475, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30325, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30326, + "latitude": 33.849615, + "longitude": -84.360881, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30327, + "latitude": 33.863953, + "longitude": -84.422028, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30328, + "latitude": 33.933543, + "longitude": -84.395777, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30329, + "latitude": 33.826553, + "longitude": -84.324874, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30330, + "latitude": 33.707107, + "longitude": -84.432127, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30331, + "latitude": 33.724275, + "longitude": -84.578581, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30332, + "latitude": 33.776305, + "longitude": -84.397976, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30333, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30334, + "latitude": 33.702657, + "longitude": -84.439127, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30336, + "latitude": 33.740581, + "longitude": -84.554542, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30337, + "latitude": 33.642809, + "longitude": -84.461778, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30338, + "latitude": 33.96685, + "longitude": -84.324916, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30339, + "latitude": 33.906202, + "longitude": -84.433678, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30340, + "latitude": 33.893201, + "longitude": -84.253871, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30341, + "latitude": 33.890102, + "longitude": -84.278222, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30342, + "latitude": 33.881052, + "longitude": -84.379476, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30343, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30344, + "latitude": 33.691858, + "longitude": -84.448027, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30345, + "latitude": 33.845603, + "longitude": -84.281422, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30346, + "latitude": 33.924401, + "longitude": -84.337557, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30347, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30348, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30349, + "latitude": 33.61806, + "longitude": -84.550147, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30350, + "latitude": 33.9632, + "longitude": -84.314224, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30353, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30354, + "latitude": 33.667508, + "longitude": -84.389616, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30355, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30356, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30357, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30358, + "latitude": 33.998151, + "longitude": -84.34112, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30359, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30360, + "latitude": 33.931069, + "longitude": -84.277772, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30361, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30362, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30364, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30366, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 30368, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30369, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30370, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30371, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30374, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30375, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30376, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30377, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30378, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30379, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30380, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30384, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30385, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30386, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30387, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30388, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30389, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30390, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30392, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30394, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30396, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30398, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30399, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 30401, + "latitude": 32.569871, + "longitude": -82.346181, + "city": "Swainsboro", + "state": "GA", + "county": "Emanuel" + }, + { + "zip_code": 30410, + "latitude": 32.17966, + "longitude": -82.516557, + "city": "Ailey", + "state": "GA", + "county": "Montgomery" + }, + { + "zip_code": 30411, + "latitude": 32.143021, + "longitude": -82.82677, + "city": "Alamo", + "state": "GA", + "county": "Wheeler" + }, + { + "zip_code": 30412, + "latitude": 32.077458, + "longitude": -82.482488, + "city": "Alston", + "state": "GA", + "county": "Montgomery" + }, + { + "zip_code": 30413, + "latitude": 32.88914, + "longitude": -82.466644, + "city": "Bartow", + "state": "GA", + "county": "Jefferson" + }, + { + "zip_code": 30414, + "latitude": 32.163392, + "longitude": -81.87191, + "city": "Bellville", + "state": "GA", + "county": "Evans" + }, + { + "zip_code": 30415, + "latitude": 32.352307, + "longitude": -81.6571, + "city": "Brooklet", + "state": "GA", + "county": "Bulloch" + }, + { + "zip_code": 30417, + "latitude": 32.160611, + "longitude": -81.923832, + "city": "Claxton", + "state": "GA", + "county": "Evans" + }, + { + "zip_code": 30420, + "latitude": 32.10597, + "longitude": -82.03389, + "city": "Cobbtown", + "state": "GA", + "county": "Tattnall" + }, + { + "zip_code": 30421, + "latitude": 32.058597, + "longitude": -82.027358, + "city": "Collins", + "state": "GA", + "county": "Tattnall" + }, + { + "zip_code": 30423, + "latitude": 32.163392, + "longitude": -81.87191, + "city": "Daisy", + "state": "GA", + "county": "Evans" + }, + { + "zip_code": 30424, + "latitude": 32.767634, + "longitude": -81.629062, + "city": "Dover", + "state": "GA", + "county": "Screven" + }, + { + "zip_code": 30425, + "latitude": 32.654937, + "longitude": -82.100208, + "city": "Garfield", + "state": "GA", + "county": "Emanuel" + }, + { + "zip_code": 30426, + "latitude": 33.05387, + "longitude": -81.684489, + "city": "Girard", + "state": "GA", + "county": "Burke" + }, + { + "zip_code": 30427, + "latitude": 32.066649, + "longitude": -82.012344, + "city": "Glennville", + "state": "GA", + "county": "Tattnall" + }, + { + "zip_code": 30428, + "latitude": 32.118831, + "longitude": -82.724555, + "city": "Glenwood", + "state": "GA", + "county": "Wheeler" + }, + { + "zip_code": 30429, + "latitude": 32.152808, + "longitude": -81.925865, + "city": "Hagan", + "state": "GA", + "county": "Evans" + }, + { + "zip_code": 30434, + "latitude": 33.028798, + "longitude": -82.437965, + "city": "Louisville", + "state": "GA", + "county": "Jefferson" + }, + { + "zip_code": 30436, + "latitude": 32.129147, + "longitude": -82.330546, + "city": "Lyons", + "state": "GA", + "county": "Toombs" + }, + { + "zip_code": 30438, + "latitude": 32.050694, + "longitude": -81.998348, + "city": "Manassas", + "state": "GA", + "county": "Tattnall" + }, + { + "zip_code": 30439, + "latitude": 32.39938, + "longitude": -82.048201, + "city": "Metter", + "state": "GA", + "county": "Candler" + }, + { + "zip_code": 30441, + "latitude": 32.926431, + "longitude": -82.172337, + "city": "Midville", + "state": "GA", + "county": "Burke" + }, + { + "zip_code": 30442, + "latitude": 32.779376, + "longitude": -81.973904, + "city": "Millen", + "state": "GA", + "county": "Jenkins" + }, + { + "zip_code": 30445, + "latitude": 32.183157, + "longitude": -82.566698, + "city": "Mount Vernon", + "state": "GA", + "county": "Montgomery" + }, + { + "zip_code": 30446, + "latitude": 32.580957, + "longitude": -81.482625, + "city": "Newington", + "state": "GA", + "county": "Screven" + }, + { + "zip_code": 30447, + "latitude": 32.504092, + "longitude": -82.484754, + "city": "Norristown", + "state": "GA", + "county": "Emanuel" + }, + { + "zip_code": 30448, + "latitude": 32.475892, + "longitude": -82.372622, + "city": "Nunez", + "state": "GA", + "county": "Emanuel" + }, + { + "zip_code": 30449, + "latitude": 32.528104, + "longitude": -81.533198, + "city": "Oliver", + "state": "GA", + "county": "Screven" + }, + { + "zip_code": 30450, + "latitude": 32.552055, + "longitude": -81.924195, + "city": "Portal", + "state": "GA", + "county": "Bulloch" + }, + { + "zip_code": 30451, + "latitude": 32.414349, + "longitude": -82.086658, + "city": "Pulaski", + "state": "GA", + "county": "Candler" + }, + { + "zip_code": 30452, + "latitude": 32.398006, + "longitude": -81.889152, + "city": "Register", + "state": "GA", + "county": "Bulloch" + }, + { + "zip_code": 30453, + "latitude": 32.031081, + "longitude": -82.146011, + "city": "Reidsville", + "state": "GA", + "county": "Tattnall" + }, + { + "zip_code": 30454, + "latitude": 32.50631, + "longitude": -82.713743, + "city": "Rockledge", + "state": "GA", + "county": "Laurens" + }, + { + "zip_code": 30455, + "latitude": 32.722971, + "longitude": -81.793305, + "city": "Rocky Ford", + "state": "GA", + "county": "Screven" + }, + { + "zip_code": 30456, + "latitude": 32.980305, + "longitude": -81.84486, + "city": "Sardis", + "state": "GA", + "county": "Burke" + }, + { + "zip_code": 30457, + "latitude": 32.383145, + "longitude": -82.557135, + "city": "Soperton", + "state": "GA", + "county": "Treutlen" + }, + { + "zip_code": 30458, + "latitude": 32.425, + "longitude": -81.784956, + "city": "Statesboro", + "state": "GA", + "county": "Bulloch" + }, + { + "zip_code": 30459, + "latitude": 32.447036, + "longitude": -81.77772, + "city": "Statesboro", + "state": "GA", + "county": "Bulloch" + }, + { + "zip_code": 30460, + "latitude": 32.41795, + "longitude": -81.78233, + "city": "Statesboro", + "state": "GA", + "county": "Bulloch" + }, + { + "zip_code": 30461, + "latitude": 32.450032, + "longitude": -81.715799, + "city": "Statesboro", + "state": "GA", + "county": "Bulloch" + }, + { + "zip_code": 30464, + "latitude": 32.445915, + "longitude": -82.258728, + "city": "Stillmore", + "state": "GA", + "county": "Emanuel" + }, + { + "zip_code": 30467, + "latitude": 32.743851, + "longitude": -81.628687, + "city": "Sylvania", + "state": "GA", + "county": "Screven" + }, + { + "zip_code": 30470, + "latitude": 32.188768, + "longitude": -82.522115, + "city": "Tarrytown", + "state": "GA", + "county": "Montgomery" + }, + { + "zip_code": 30471, + "latitude": 32.54978, + "longitude": -82.183916, + "city": "Twin City", + "state": "GA", + "county": "Emanuel" + }, + { + "zip_code": 30473, + "latitude": 32.028823, + "longitude": -82.516246, + "city": "Uvalda", + "state": "GA", + "county": "Montgomery" + }, + { + "zip_code": 30474, + "latitude": 32.198683, + "longitude": -82.39208, + "city": "Vidalia", + "state": "GA", + "county": "Toombs" + }, + { + "zip_code": 30475, + "latitude": 32.177513, + "longitude": -82.373889, + "city": "Vidalia", + "state": "GA", + "county": "Toombs" + }, + { + "zip_code": 30477, + "latitude": 32.863678, + "longitude": -82.407516, + "city": "Wadley", + "state": "GA", + "county": "Jefferson" + }, + { + "zip_code": 30499, + "latitude": 32.050694, + "longitude": -81.998348, + "city": "Reidsville", + "state": "GA", + "county": "Tattnall" + }, + { + "zip_code": 30501, + "latitude": 34.334398, + "longitude": -83.837912, + "city": "Gainesville", + "state": "GA", + "county": "Hall" + }, + { + "zip_code": 30502, + "latitude": 34.212993, + "longitude": -83.794858, + "city": "Chestnut Mountain", + "state": "GA", + "county": "Hall" + }, + { + "zip_code": 30503, + "latitude": 34.345432, + "longitude": -83.950541, + "city": "Gainesville", + "state": "GA", + "county": "Hall" + }, + { + "zip_code": 30504, + "latitude": 34.241066, + "longitude": -83.886508, + "city": "Gainesville", + "state": "GA", + "county": "Hall" + }, + { + "zip_code": 30506, + "latitude": 34.336238, + "longitude": -83.860031, + "city": "Gainesville", + "state": "GA", + "county": "Hall" + }, + { + "zip_code": 30507, + "latitude": 34.257212, + "longitude": -83.824574, + "city": "Gainesville", + "state": "GA", + "county": "Hall" + }, + { + "zip_code": 30510, + "latitude": 34.50429, + "longitude": -83.594758, + "city": "Alto", + "state": "GA", + "county": "Habersham" + }, + { + "zip_code": 30511, + "latitude": 34.393713, + "longitude": -83.473886, + "city": "Baldwin", + "state": "GA", + "county": "Banks" + }, + { + "zip_code": 30512, + "latitude": 34.867512, + "longitude": -83.967636, + "city": "Blairsville", + "state": "GA", + "county": "Union" + }, + { + "zip_code": 30513, + "latitude": 34.831246, + "longitude": -84.331339, + "city": "Blue Ridge", + "state": "GA", + "county": "Fannin" + }, + { + "zip_code": 30514, + "latitude": 34.903398, + "longitude": -84.019157, + "city": "Blairsville", + "state": "GA", + "county": "Union" + }, + { + "zip_code": 30515, + "latitude": 33.960353, + "longitude": -84.037859, + "city": "Buford", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30516, + "latitude": 34.383987, + "longitude": -83.03321, + "city": "Bowersville", + "state": "GA", + "county": "Hart" + }, + { + "zip_code": 30517, + "latitude": 34.109873, + "longitude": -83.685149, + "city": "Braselton", + "state": "GA", + "county": "Jackson" + }, + { + "zip_code": 30518, + "latitude": 34.113712, + "longitude": -84.033984, + "city": "Buford", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30519, + "latitude": 34.079715, + "longitude": -83.930765, + "city": "Buford", + "state": "GA", + "county": "Gwinnett" + }, + { + "zip_code": 30520, + "latitude": 34.355933, + "longitude": -83.152947, + "city": "Canon", + "state": "GA", + "county": "Franklin" + }, + { + "zip_code": 30521, + "latitude": 34.363122, + "longitude": -83.254745, + "city": "Carnesville", + "state": "GA", + "county": "Franklin" + }, + { + "zip_code": 30522, + "latitude": 34.73249, + "longitude": -84.425035, + "city": "Cherrylog", + "state": "GA", + "county": "Gilmer" + }, + { + "zip_code": 30523, + "latitude": 34.655918, + "longitude": -83.508274, + "city": "Clarkesville", + "state": "GA", + "county": "Habersham" + }, + { + "zip_code": 30525, + "latitude": 34.886868, + "longitude": -83.375358, + "city": "Clayton", + "state": "GA", + "county": "Rabun" + }, + { + "zip_code": 30527, + "latitude": 34.397806, + "longitude": -83.775657, + "city": "Clermont", + "state": "GA", + "county": "Hall" + }, + { + "zip_code": 30528, + "latitude": 34.610466, + "longitude": -83.74615, + "city": "Cleveland", + "state": "GA", + "county": "White" + }, + { + "zip_code": 30529, + "latitude": 34.169691, + "longitude": -83.570671, + "city": "Commerce", + "state": "GA", + "county": "Jackson" + }, + { + "zip_code": 30530, + "latitude": 34.168274, + "longitude": -83.402226, + "city": "Commerce", + "state": "GA", + "county": "Jackson" + }, + { + "zip_code": 30531, + "latitude": 34.535213, + "longitude": -83.574032, + "city": "Cornelia", + "state": "GA", + "county": "Habersham" + }, + { + "zip_code": 30533, + "latitude": 34.541371, + "longitude": -84.024387, + "city": "Dahlonega", + "state": "GA", + "county": "Lumpkin" + }, + { + "zip_code": 30534, + "latitude": 34.453661, + "longitude": -84.155043, + "city": "Dawsonville", + "state": "GA", + "county": "Dawson" + }, + { + "zip_code": 30535, + "latitude": 34.631639, + "longitude": -83.569657, + "city": "Demorest", + "state": "GA", + "county": "Habersham" + }, + { + "zip_code": 30537, + "latitude": 34.97, + "longitude": -83.357507, + "city": "Dillard", + "state": "GA", + "county": "Rabun" + }, + { + "zip_code": 30538, + "latitude": 34.53512, + "longitude": -83.258748, + "city": "Eastanollee", + "state": "GA", + "county": "Stephens" + }, + { + "zip_code": 30539, + "latitude": 34.658482, + "longitude": -84.493207, + "city": "East Ellijay", + "state": "GA", + "county": "Gilmer" + }, + { + "zip_code": 30540, + "latitude": 34.70129, + "longitude": -84.449007, + "city": "Ellijay", + "state": "GA", + "county": "Gilmer" + }, + { + "zip_code": 30541, + "latitude": 34.92873, + "longitude": -84.436752, + "city": "Epworth", + "state": "GA", + "county": "Fannin" + }, + { + "zip_code": 30542, + "latitude": 34.282818, + "longitude": -83.891451, + "city": "Flowery Branch", + "state": "GA", + "county": "Hall" + }, + { + "zip_code": 30543, + "latitude": 34.364396, + "longitude": -83.735421, + "city": "Gillsville", + "state": "GA", + "county": "Hall" + }, + { + "zip_code": 30544, + "latitude": 34.593092, + "longitude": -83.562922, + "city": "Demorest", + "state": "GA", + "county": "Habersham" + }, + { + "zip_code": 30545, + "latitude": 34.729196, + "longitude": -83.720937, + "city": "Helen", + "state": "GA", + "county": "White" + }, + { + "zip_code": 30546, + "latitude": 34.906339, + "longitude": -83.72739, + "city": "Hiawassee", + "state": "GA", + "county": "Towns" + }, + { + "zip_code": 30547, + "latitude": 34.373145, + "longitude": -83.491925, + "city": "Homer", + "state": "GA", + "county": "Banks" + }, + { + "zip_code": 30548, + "latitude": 34.099031, + "longitude": -83.71817, + "city": "Hoschton", + "state": "GA", + "county": "Jackson" + }, + { + "zip_code": 30549, + "latitude": 34.10601, + "longitude": -83.589021, + "city": "Jefferson", + "state": "GA", + "county": "Jackson" + }, + { + "zip_code": 30552, + "latitude": 34.78992, + "longitude": -83.443351, + "city": "Lakemont", + "state": "GA", + "county": "Rabun" + }, + { + "zip_code": 30553, + "latitude": 34.408031, + "longitude": -83.144241, + "city": "Lavonia", + "state": "GA", + "county": "Franklin" + }, + { + "zip_code": 30554, + "latitude": 34.41088, + "longitude": -83.703923, + "city": "Lula", + "state": "GA", + "county": "Hall" + }, + { + "zip_code": 30555, + "latitude": 34.936986, + "longitude": -84.403709, + "city": "Mc Caysville", + "state": "GA", + "county": "Fannin" + }, + { + "zip_code": 30557, + "latitude": 34.527955, + "longitude": -83.23208, + "city": "Martin", + "state": "GA", + "county": "Stephens" + }, + { + "zip_code": 30558, + "latitude": 34.329372, + "longitude": -83.543357, + "city": "Maysville", + "state": "GA", + "county": "Banks" + }, + { + "zip_code": 30559, + "latitude": 34.936697, + "longitude": -84.268863, + "city": "Mineral Bluff", + "state": "GA", + "county": "Fannin" + }, + { + "zip_code": 30560, + "latitude": 34.86263, + "longitude": -84.248612, + "city": "Morganton", + "state": "GA", + "county": "Fannin" + }, + { + "zip_code": 30562, + "latitude": 34.914393, + "longitude": -83.402766, + "city": "Mountain City", + "state": "GA", + "county": "Rabun" + }, + { + "zip_code": 30563, + "latitude": 34.541683, + "longitude": -83.52283, + "city": "Mount Airy", + "state": "GA", + "county": "Habersham" + }, + { + "zip_code": 30564, + "latitude": 34.445369, + "longitude": -83.906516, + "city": "Murrayville", + "state": "GA", + "county": "Hall" + }, + { + "zip_code": 30565, + "latitude": 34.113429, + "longitude": -83.474576, + "city": "Nicholson", + "state": "GA", + "county": "Jackson" + }, + { + "zip_code": 30566, + "latitude": 34.239428, + "longitude": -83.897612, + "city": "Oakwood", + "state": "GA", + "county": "Hall" + }, + { + "zip_code": 30567, + "latitude": 34.159431, + "longitude": -83.59706, + "city": "Pendergrass", + "state": "GA", + "county": "Jackson" + }, + { + "zip_code": 30568, + "latitude": 34.944609, + "longitude": -83.381415, + "city": "Rabun Gap", + "state": "GA", + "county": "Rabun" + }, + { + "zip_code": 30571, + "latitude": 34.66578, + "longitude": -83.709564, + "city": "Sautee Nacoochee", + "state": "GA", + "county": "White" + }, + { + "zip_code": 30572, + "latitude": 34.712091, + "longitude": -84.027629, + "city": "Suches", + "state": "GA", + "county": "Union" + }, + { + "zip_code": 30573, + "latitude": 34.742007, + "longitude": -83.397716, + "city": "Tallulah Falls", + "state": "GA", + "county": "Rabun" + }, + { + "zip_code": 30575, + "latitude": 34.195058, + "longitude": -83.713188, + "city": "Talmo", + "state": "GA", + "county": "Jackson" + }, + { + "zip_code": 30576, + "latitude": 34.856395, + "longitude": -83.457267, + "city": "Tiger", + "state": "GA", + "county": "Rabun" + }, + { + "zip_code": 30577, + "latitude": 34.554103, + "longitude": -83.288828, + "city": "Toccoa", + "state": "GA", + "county": "Stephens" + }, + { + "zip_code": 30580, + "latitude": 34.676584, + "longitude": -83.43578, + "city": "Turnerville", + "state": "GA", + "county": "Habersham" + }, + { + "zip_code": 30581, + "latitude": 34.804473, + "longitude": -83.419137, + "city": "Wiley", + "state": "GA", + "county": "Rabun" + }, + { + "zip_code": 30582, + "latitude": 34.934417, + "longitude": -83.828504, + "city": "Young Harris", + "state": "GA", + "county": "Towns" + }, + { + "zip_code": 30596, + "latitude": 34.629391, + "longitude": -83.509934, + "city": "Alto", + "state": "GA", + "county": "Habersham" + }, + { + "zip_code": 30597, + "latitude": 34.527671, + "longitude": -83.980879, + "city": "Dahlonega", + "state": "GA", + "county": "Lumpkin" + }, + { + "zip_code": 30598, + "latitude": 34.59179, + "longitude": -83.352534, + "city": "Toccoa Falls", + "state": "GA", + "county": "Stephens" + }, + { + "zip_code": 30599, + "latitude": 34.130594, + "longitude": -83.587419, + "city": "Commerce", + "state": "GA", + "county": "Jackson" + }, + { + "zip_code": 30601, + "latitude": 33.992902, + "longitude": -83.353697, + "city": "Athens", + "state": "GA", + "county": "Clarke" + }, + { + "zip_code": 30602, + "latitude": 33.925971, + "longitude": -83.365029, + "city": "Athens", + "state": "GA", + "county": "Clarke" + }, + { + "zip_code": 30603, + "latitude": 33.947587, + "longitude": -83.408897, + "city": "Athens", + "state": "GA", + "county": "Clarke" + }, + { + "zip_code": 30604, + "latitude": 33.944339, + "longitude": -83.38908, + "city": "Athens", + "state": "GA", + "county": "Clarke" + }, + { + "zip_code": 30605, + "latitude": 33.923088, + "longitude": -83.364038, + "city": "Athens", + "state": "GA", + "county": "Clarke" + }, + { + "zip_code": 30606, + "latitude": 33.951348, + "longitude": -83.43064, + "city": "Athens", + "state": "GA", + "county": "Clarke" + }, + { + "zip_code": 30607, + "latitude": 33.998267, + "longitude": -83.439569, + "city": "Athens", + "state": "GA", + "county": "Clarke" + }, + { + "zip_code": 30608, + "latitude": 33.944339, + "longitude": -83.38908, + "city": "Athens", + "state": "GA", + "county": "Clarke" + }, + { + "zip_code": 30609, + "latitude": 33.946364, + "longitude": -83.37743, + "city": "Athens", + "state": "GA", + "county": "Clarke" + }, + { + "zip_code": 30612, + "latitude": 33.944339, + "longitude": -83.38908, + "city": "Athens", + "state": "GA", + "county": "Clarke" + }, + { + "zip_code": 30619, + "latitude": 33.888662, + "longitude": -83.222254, + "city": "Arnoldsville", + "state": "GA", + "county": "Oglethorpe" + }, + { + "zip_code": 30620, + "latitude": 33.943652, + "longitude": -83.721536, + "city": "Bethlehem", + "state": "GA", + "county": "Barrow" + }, + { + "zip_code": 30621, + "latitude": 33.805718, + "longitude": -83.48171, + "city": "Bishop", + "state": "GA", + "county": "Oconee" + }, + { + "zip_code": 30622, + "latitude": 33.901988, + "longitude": -83.518452, + "city": "Bogart", + "state": "GA", + "county": "Oconee" + }, + { + "zip_code": 30623, + "latitude": 33.754235, + "longitude": -83.511055, + "city": "Bostwick", + "state": "GA", + "county": "Morgan" + }, + { + "zip_code": 30624, + "latitude": 34.164131, + "longitude": -82.957102, + "city": "Bowman", + "state": "GA", + "county": "Elbert" + }, + { + "zip_code": 30625, + "latitude": 33.525614, + "longitude": -83.365611, + "city": "Buckhead", + "state": "GA", + "county": "Morgan" + }, + { + "zip_code": 30627, + "latitude": 34.05918, + "longitude": -83.099349, + "city": "Carlton", + "state": "GA", + "county": "Madison" + }, + { + "zip_code": 30628, + "latitude": 34.088156, + "longitude": -83.202379, + "city": "Colbert", + "state": "GA", + "county": "Madison" + }, + { + "zip_code": 30629, + "latitude": 34.105661, + "longitude": -83.144463, + "city": "Comer", + "state": "GA", + "county": "Madison" + }, + { + "zip_code": 30630, + "latitude": 33.907589, + "longitude": -83.164573, + "city": "Crawford", + "state": "GA", + "county": "Oglethorpe" + }, + { + "zip_code": 30631, + "latitude": 33.577007, + "longitude": -82.858099, + "city": "Crawfordville", + "state": "GA", + "county": "Taliaferro" + }, + { + "zip_code": 30633, + "latitude": 34.152968, + "longitude": -83.262772, + "city": "Danielsville", + "state": "GA", + "county": "Madison" + }, + { + "zip_code": 30634, + "latitude": 34.185291, + "longitude": -82.943399, + "city": "Dewy Rose", + "state": "GA", + "county": "Elbert" + }, + { + "zip_code": 30635, + "latitude": 34.129737, + "longitude": -82.840971, + "city": "Elberton", + "state": "GA", + "county": "Elbert" + }, + { + "zip_code": 30638, + "latitude": 33.755811, + "longitude": -83.420094, + "city": "Farmington", + "state": "GA", + "county": "Oconee" + }, + { + "zip_code": 30639, + "latitude": 34.274306, + "longitude": -83.147024, + "city": "Franklin Springs", + "state": "GA", + "county": "Franklin" + }, + { + "zip_code": 30641, + "latitude": 33.778257, + "longitude": -83.580359, + "city": "Good Hope", + "state": "GA", + "county": "Walton" + }, + { + "zip_code": 30642, + "latitude": 33.560655, + "longitude": -83.193389, + "city": "Greensboro", + "state": "GA", + "county": "Greene" + }, + { + "zip_code": 30643, + "latitude": 34.361177, + "longitude": -82.941703, + "city": "Hartwell", + "state": "GA", + "county": "Hart" + }, + { + "zip_code": 30645, + "latitude": 33.801274, + "longitude": -83.516374, + "city": "High Shoals", + "state": "GA", + "county": "Morgan" + }, + { + "zip_code": 30646, + "latitude": 34.088693, + "longitude": -83.30911, + "city": "Hull", + "state": "GA", + "county": "Madison" + }, + { + "zip_code": 30647, + "latitude": 34.120239, + "longitude": -83.288117, + "city": "Ila", + "state": "GA", + "county": "Madison" + }, + { + "zip_code": 30648, + "latitude": 33.85281, + "longitude": -83.020293, + "city": "Lexington", + "state": "GA", + "county": "Oglethorpe" + }, + { + "zip_code": 30650, + "latitude": 33.591117, + "longitude": -83.492928, + "city": "Madison", + "state": "GA", + "county": "Morgan" + }, + { + "zip_code": 30655, + "latitude": 33.788322, + "longitude": -83.701264, + "city": "Monroe", + "state": "GA", + "county": "Walton" + }, + { + "zip_code": 30656, + "latitude": 33.838638, + "longitude": -83.710359, + "city": "Monroe", + "state": "GA", + "county": "Walton" + }, + { + "zip_code": 30660, + "latitude": 33.763817, + "longitude": -82.899831, + "city": "Rayle", + "state": "GA", + "county": "Wilkes" + }, + { + "zip_code": 30662, + "latitude": 34.297968, + "longitude": -83.192787, + "city": "Royston", + "state": "GA", + "county": "Franklin" + }, + { + "zip_code": 30663, + "latitude": 33.61101, + "longitude": -83.602459, + "city": "Rutledge", + "state": "GA", + "county": "Morgan" + }, + { + "zip_code": 30664, + "latitude": 33.559964, + "longitude": -82.794766, + "city": "Sharon", + "state": "GA", + "county": "Taliaferro" + }, + { + "zip_code": 30665, + "latitude": 33.561871, + "longitude": -83.074186, + "city": "Siloam", + "state": "GA", + "county": "Greene" + }, + { + "zip_code": 30666, + "latitude": 33.980323, + "longitude": -83.590148, + "city": "Statham", + "state": "GA", + "county": "Barrow" + }, + { + "zip_code": 30667, + "latitude": 33.804626, + "longitude": -83.151661, + "city": "Stephens", + "state": "GA", + "county": "Oglethorpe" + }, + { + "zip_code": 30668, + "latitude": 33.877751, + "longitude": -82.747023, + "city": "Tignall", + "state": "GA", + "county": "Wilkes" + }, + { + "zip_code": 30669, + "latitude": 33.634342, + "longitude": -83.122065, + "city": "Union Point", + "state": "GA", + "county": "Greene" + }, + { + "zip_code": 30671, + "latitude": 33.740502, + "longitude": -83.1706, + "city": "Maxeys", + "state": "GA", + "county": "Oglethorpe" + }, + { + "zip_code": 30673, + "latitude": 33.73149, + "longitude": -82.710833, + "city": "Washington", + "state": "GA", + "county": "Wilkes" + }, + { + "zip_code": 30677, + "latitude": 33.81673, + "longitude": -83.43347, + "city": "Watkinsville", + "state": "GA", + "county": "Oconee" + }, + { + "zip_code": 30678, + "latitude": 33.458056, + "longitude": -83.08023, + "city": "White Plains", + "state": "GA", + "county": "Greene" + }, + { + "zip_code": 30680, + "latitude": 33.987138, + "longitude": -83.698498, + "city": "Winder", + "state": "GA", + "county": "Barrow" + }, + { + "zip_code": 30683, + "latitude": 33.930735, + "longitude": -83.292152, + "city": "Winterville", + "state": "GA", + "county": "Clarke" + }, + { + "zip_code": 30701, + "latitude": 34.496921, + "longitude": -84.887942, + "city": "Calhoun", + "state": "GA", + "county": "Gordon" + }, + { + "zip_code": 30703, + "latitude": 34.479066, + "longitude": -84.762161, + "city": "Calhoun", + "state": "GA", + "county": "Gordon" + }, + { + "zip_code": 30705, + "latitude": 34.785543, + "longitude": -84.771623, + "city": "Chatsworth", + "state": "GA", + "county": "Murray" + }, + { + "zip_code": 30707, + "latitude": 34.76416, + "longitude": -85.353517, + "city": "Chickamauga", + "state": "GA", + "county": "Walker" + }, + { + "zip_code": 30708, + "latitude": 34.872473, + "longitude": -84.75688, + "city": "Cisco", + "state": "GA", + "county": "Murray" + }, + { + "zip_code": 30710, + "latitude": 34.867821, + "longitude": -84.919498, + "city": "Cohutta", + "state": "GA", + "county": "Whitfield" + }, + { + "zip_code": 30711, + "latitude": 34.887628, + "longitude": -84.744577, + "city": "Crandall", + "state": "GA", + "county": "Murray" + }, + { + "zip_code": 30719, + "latitude": 34.801861, + "longitude": -84.989796, + "city": "Dalton", + "state": "GA", + "county": "Whitfield" + }, + { + "zip_code": 30720, + "latitude": 34.791428, + "longitude": -84.992771, + "city": "Dalton", + "state": "GA", + "county": "Whitfield" + }, + { + "zip_code": 30721, + "latitude": 34.788493, + "longitude": -84.91381, + "city": "Dalton", + "state": "GA", + "county": "Whitfield" + }, + { + "zip_code": 30722, + "latitude": 34.759522, + "longitude": -84.951261, + "city": "Dalton", + "state": "GA", + "county": "Whitfield" + }, + { + "zip_code": 30724, + "latitude": 34.78783, + "longitude": -84.777863, + "city": "Eton", + "state": "GA", + "county": "Murray" + }, + { + "zip_code": 30725, + "latitude": 34.846843, + "longitude": -85.238041, + "city": "Flintstone", + "state": "GA", + "county": "Walker" + }, + { + "zip_code": 30726, + "latitude": 34.980249, + "longitude": -85.140798, + "city": "Graysville", + "state": "GA", + "county": "Catoosa" + }, + { + "zip_code": 30728, + "latitude": 34.697006, + "longitude": -85.255273, + "city": "La Fayette", + "state": "GA", + "county": "Walker" + }, + { + "zip_code": 30730, + "latitude": 34.392073, + "longitude": -85.417428, + "city": "Lyerly", + "state": "GA", + "county": "Chattooga" + }, + { + "zip_code": 30731, + "latitude": 34.518597, + "longitude": -85.414081, + "city": "Menlo", + "state": "GA", + "county": "Chattooga" + }, + { + "zip_code": 30732, + "latitude": 34.569015, + "longitude": -84.711863, + "city": "Oakman", + "state": "GA", + "county": "Gordon" + }, + { + "zip_code": 30733, + "latitude": 34.414048, + "longitude": -85.052629, + "city": "Plainville", + "state": "GA", + "county": "Gordon" + }, + { + "zip_code": 30734, + "latitude": 34.535071, + "longitude": -84.724186, + "city": "Ranger", + "state": "GA", + "county": "Gordon" + }, + { + "zip_code": 30735, + "latitude": 34.583318, + "longitude": -84.906803, + "city": "Resaca", + "state": "GA", + "county": "Gordon" + }, + { + "zip_code": 30736, + "latitude": 34.888709, + "longitude": -85.118699, + "city": "Ringgold", + "state": "GA", + "county": "Catoosa" + }, + { + "zip_code": 30738, + "latitude": 34.813904, + "longitude": -85.501868, + "city": "Rising Fawn", + "state": "GA", + "county": "Dade" + }, + { + "zip_code": 30739, + "latitude": 34.801819, + "longitude": -85.212809, + "city": "Rock Spring", + "state": "GA", + "county": "Walker" + }, + { + "zip_code": 30740, + "latitude": 34.766976, + "longitude": -85.072681, + "city": "Rocky Face", + "state": "GA", + "county": "Whitfield" + }, + { + "zip_code": 30741, + "latitude": 34.798084, + "longitude": -85.246291, + "city": "Rossville", + "state": "GA", + "county": "Walker" + }, + { + "zip_code": 30742, + "latitude": 34.931497, + "longitude": -85.175034, + "city": "Fort Oglethorpe", + "state": "GA", + "county": "Catoosa" + }, + { + "zip_code": 30746, + "latitude": 34.571753, + "longitude": -85.025616, + "city": "Sugar Valley", + "state": "GA", + "county": "Gordon" + }, + { + "zip_code": 30747, + "latitude": 34.484159, + "longitude": -85.315546, + "city": "Summerville", + "state": "GA", + "county": "Chattooga" + }, + { + "zip_code": 30750, + "latitude": 34.93473, + "longitude": -85.384631, + "city": "Lookout Mountain", + "state": "GA", + "county": "Walker" + }, + { + "zip_code": 30751, + "latitude": 34.981449, + "longitude": -84.735233, + "city": "Tennga", + "state": "GA", + "county": "Murray" + }, + { + "zip_code": 30752, + "latitude": 34.871687, + "longitude": -85.50208, + "city": "Trenton", + "state": "GA", + "county": "Dade" + }, + { + "zip_code": 30753, + "latitude": 34.532713, + "longitude": -85.368362, + "city": "Trion", + "state": "GA", + "county": "Chattooga" + }, + { + "zip_code": 30755, + "latitude": 34.875416, + "longitude": -85.050047, + "city": "Tunnel Hill", + "state": "GA", + "county": "Whitfield" + }, + { + "zip_code": 30756, + "latitude": 34.9298, + "longitude": -84.988536, + "city": "Varnell", + "state": "GA", + "county": "Whitfield" + }, + { + "zip_code": 30757, + "latitude": 34.922998, + "longitude": -85.448302, + "city": "Wildwood", + "state": "GA", + "county": "Dade" + }, + { + "zip_code": 30802, + "latitude": 33.573999, + "longitude": -82.312058, + "city": "Appling", + "state": "GA", + "county": "Columbia" + }, + { + "zip_code": 30803, + "latitude": 33.141307, + "longitude": -82.527009, + "city": "Avera", + "state": "GA", + "county": "Jefferson" + }, + { + "zip_code": 30805, + "latitude": 33.359709, + "longitude": -82.198897, + "city": "Blythe", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30806, + "latitude": 33.527993, + "longitude": -82.5104, + "city": "Boneville", + "state": "GA", + "county": "Mcduffie" + }, + { + "zip_code": 30807, + "latitude": 33.447102, + "longitude": -82.642214, + "city": "Camak", + "state": "GA", + "county": "Warren" + }, + { + "zip_code": 30808, + "latitude": 33.404395, + "longitude": -82.401622, + "city": "Dearing", + "state": "GA", + "county": "Mcduffie" + }, + { + "zip_code": 30809, + "latitude": 33.551132, + "longitude": -82.143617, + "city": "Evans", + "state": "GA", + "county": "Columbia" + }, + { + "zip_code": 30810, + "latitude": 33.223471, + "longitude": -82.599738, + "city": "Gibson", + "state": "GA", + "county": "Glascock" + }, + { + "zip_code": 30811, + "latitude": 33.050487, + "longitude": -81.929165, + "city": "Gough", + "state": "GA", + "county": "Burke" + }, + { + "zip_code": 30812, + "latitude": 33.386041, + "longitude": -82.090996, + "city": "Gracewood", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30813, + "latitude": 33.466721, + "longitude": -82.213991, + "city": "Grovetown", + "state": "GA", + "county": "Columbia" + }, + { + "zip_code": 30814, + "latitude": 33.456131, + "longitude": -82.307337, + "city": "Harlem", + "state": "GA", + "county": "Columbia" + }, + { + "zip_code": 30815, + "latitude": 33.32229, + "longitude": -82.058032, + "city": "Hephzibah", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30816, + "latitude": 33.155067, + "longitude": -82.134871, + "city": "Keysville", + "state": "GA", + "county": "Burke" + }, + { + "zip_code": 30817, + "latitude": 33.812714, + "longitude": -82.453456, + "city": "Lincolnton", + "state": "GA", + "county": "Lincoln" + }, + { + "zip_code": 30818, + "latitude": 33.189975, + "longitude": -82.34339, + "city": "Matthews", + "state": "GA", + "county": "Jefferson" + }, + { + "zip_code": 30819, + "latitude": 33.432384, + "longitude": -82.625213, + "city": "Mesena", + "state": "GA", + "county": "Warren" + }, + { + "zip_code": 30820, + "latitude": 33.231593, + "longitude": -82.631164, + "city": "Mitchell", + "state": "GA", + "county": "Glascock" + }, + { + "zip_code": 30821, + "latitude": 33.484966, + "longitude": -82.718794, + "city": "Norwood", + "state": "GA", + "county": "Warren" + }, + { + "zip_code": 30822, + "latitude": 32.873466, + "longitude": -81.875482, + "city": "Perkins", + "state": "GA", + "county": "Jenkins" + }, + { + "zip_code": 30823, + "latitude": 33.181447, + "longitude": -82.438568, + "city": "Stapleton", + "state": "GA", + "county": "Jefferson" + }, + { + "zip_code": 30824, + "latitude": 33.494908, + "longitude": -82.513847, + "city": "Thomson", + "state": "GA", + "county": "Mcduffie" + }, + { + "zip_code": 30828, + "latitude": 33.406118, + "longitude": -82.641067, + "city": "Warrenton", + "state": "GA", + "county": "Warren" + }, + { + "zip_code": 30830, + "latitude": 33.080724, + "longitude": -81.986767, + "city": "Waynesboro", + "state": "GA", + "county": "Burke" + }, + { + "zip_code": 30833, + "latitude": 33.192426, + "longitude": -82.361546, + "city": "Wrens", + "state": "GA", + "county": "Jefferson" + }, + { + "zip_code": 30901, + "latitude": 33.456687, + "longitude": -81.969184, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30903, + "latitude": 33.386041, + "longitude": -82.090996, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30904, + "latitude": 33.478686, + "longitude": -82.015988, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30905, + "latitude": 33.412986, + "longitude": -82.133732, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30906, + "latitude": 33.358865, + "longitude": -82.009938, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30907, + "latitude": 33.457921, + "longitude": -82.068935, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30909, + "latitude": 33.416616, + "longitude": -82.055973, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30910, + "latitude": 33.386041, + "longitude": -82.090996, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30911, + "latitude": 33.386041, + "longitude": -82.090996, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30912, + "latitude": 33.386041, + "longitude": -82.090996, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30913, + "latitude": 33.386041, + "longitude": -82.090996, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30914, + "latitude": 33.386041, + "longitude": -82.090996, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30916, + "latitude": 33.386041, + "longitude": -82.090996, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30917, + "latitude": 33.527678, + "longitude": -82.235542, + "city": "Augusta", + "state": "GA", + "county": "Columbia" + }, + { + "zip_code": 30919, + "latitude": 33.386041, + "longitude": -82.090996, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 30999, + "latitude": 33.386041, + "longitude": -82.090996, + "city": "Augusta", + "state": "GA", + "county": "Richmond" + }, + { + "zip_code": 31001, + "latitude": 31.977048, + "longitude": -83.372515, + "city": "Abbeville", + "state": "GA", + "county": "Wilcox" + }, + { + "zip_code": 31002, + "latitude": 32.56887, + "longitude": -82.540305, + "city": "Adrian", + "state": "GA", + "county": "Emanuel" + }, + { + "zip_code": 31003, + "latitude": 32.606433, + "longitude": -83.20951, + "city": "Allentown", + "state": "GA", + "county": "Wilkinson" + }, + { + "zip_code": 31004, + "latitude": 32.946971, + "longitude": -83.800628, + "city": "Bolingbroke", + "state": "GA", + "county": "Monroe" + }, + { + "zip_code": 31005, + "latitude": 32.539506, + "longitude": -83.662733, + "city": "Bonaire", + "state": "GA", + "county": "Houston" + }, + { + "zip_code": 31006, + "latitude": 32.572668, + "longitude": -84.226075, + "city": "Butler", + "state": "GA", + "county": "Taylor" + }, + { + "zip_code": 31007, + "latitude": 32.185828, + "longitude": -83.901376, + "city": "Byromville", + "state": "GA", + "county": "Dooly" + }, + { + "zip_code": 31008, + "latitude": 32.618051, + "longitude": -83.788976, + "city": "Byron", + "state": "GA", + "county": "Peach" + }, + { + "zip_code": 31009, + "latitude": 32.303915, + "longitude": -83.009422, + "city": "Cadwell", + "state": "GA", + "county": "Laurens" + }, + { + "zip_code": 31010, + "latitude": 31.917178, + "longitude": -83.785365, + "city": "Cordele", + "state": "GA", + "county": "Crisp" + }, + { + "zip_code": 31011, + "latitude": 32.150374, + "longitude": -83.055544, + "city": "Chauncey", + "state": "GA", + "county": "Dodge" + }, + { + "zip_code": 31012, + "latitude": 32.310632, + "longitude": -83.160882, + "city": "Chester", + "state": "GA", + "county": "Dodge" + }, + { + "zip_code": 31013, + "latitude": 32.338639, + "longitude": -83.692562, + "city": "Clinchfield", + "state": "GA", + "county": "Houston" + }, + { + "zip_code": 31014, + "latitude": 32.383904, + "longitude": -83.321095, + "city": "Cochran", + "state": "GA", + "county": "Bleckley" + }, + { + "zip_code": 31015, + "latitude": 31.919861, + "longitude": -83.777354, + "city": "Cordele", + "state": "GA", + "county": "Crisp" + }, + { + "zip_code": 31016, + "latitude": 32.900292, + "longitude": -84.062584, + "city": "Culloden", + "state": "GA", + "county": "Monroe" + }, + { + "zip_code": 31017, + "latitude": 32.607654, + "longitude": -83.269106, + "city": "Danville", + "state": "GA", + "county": "Twiggs" + }, + { + "zip_code": 31018, + "latitude": 32.968449, + "longitude": -82.648357, + "city": "Davisboro", + "state": "GA", + "county": "Washington" + }, + { + "zip_code": 31019, + "latitude": 32.428425, + "longitude": -83.044502, + "city": "Dexter", + "state": "GA", + "county": "Laurens" + }, + { + "zip_code": 31020, + "latitude": 32.715133, + "longitude": -83.455788, + "city": "Dry Branch", + "state": "GA", + "county": "Twiggs" + }, + { + "zip_code": 31021, + "latitude": 32.459291, + "longitude": -82.938121, + "city": "Dublin", + "state": "GA", + "county": "Laurens" + }, + { + "zip_code": 31022, + "latitude": 32.505705, + "longitude": -83.108975, + "city": "Dudley", + "state": "GA", + "county": "Laurens" + }, + { + "zip_code": 31023, + "latitude": 32.143564, + "longitude": -83.194358, + "city": "Eastman", + "state": "GA", + "county": "Dodge" + }, + { + "zip_code": 31024, + "latitude": 33.320818, + "longitude": -83.355865, + "city": "Eatonton", + "state": "GA", + "county": "Putnam" + }, + { + "zip_code": 31025, + "latitude": 32.360242, + "longitude": -83.749048, + "city": "Elko", + "state": "GA", + "county": "Houston" + }, + { + "zip_code": 31027, + "latitude": 32.552377, + "longitude": -82.781684, + "city": "Dublin", + "state": "GA", + "county": "Laurens" + }, + { + "zip_code": 31028, + "latitude": 32.56822, + "longitude": -83.70177, + "city": "Centerville", + "state": "GA", + "county": "Houston" + }, + { + "zip_code": 31029, + "latitude": 33.025944, + "longitude": -83.915021, + "city": "Forsyth", + "state": "GA", + "county": "Monroe" + }, + { + "zip_code": 31030, + "latitude": 32.560698, + "longitude": -83.854528, + "city": "Fort Valley", + "state": "GA", + "county": "Peach" + }, + { + "zip_code": 31031, + "latitude": 32.881267, + "longitude": -83.302945, + "city": "Gordon", + "state": "GA", + "county": "Wilkinson" + }, + { + "zip_code": 31032, + "latitude": 32.991607, + "longitude": -83.567362, + "city": "Gray", + "state": "GA", + "county": "Jones" + }, + { + "zip_code": 31033, + "latitude": 33.056543, + "longitude": -83.424672, + "city": "Haddock", + "state": "GA", + "county": "Jones" + }, + { + "zip_code": 31034, + "latitude": 33.022658, + "longitude": -83.246975, + "city": "Hardwick", + "state": "GA", + "county": "Baldwin" + }, + { + "zip_code": 31035, + "latitude": 32.855295, + "longitude": -82.702399, + "city": "Harrison", + "state": "GA", + "county": "Washington" + }, + { + "zip_code": 31036, + "latitude": 32.275664, + "longitude": -83.49009, + "city": "Hawkinsville", + "state": "GA", + "county": "Pulaski" + }, + { + "zip_code": 31037, + "latitude": 32.047457, + "longitude": -82.9747, + "city": "Helena", + "state": "GA", + "county": "Telfair" + }, + { + "zip_code": 31038, + "latitude": 33.207511, + "longitude": -83.618059, + "city": "Hillsboro", + "state": "GA", + "county": "Jasper" + }, + { + "zip_code": 31039, + "latitude": 32.559781, + "longitude": -84.227675, + "city": "Howard", + "state": "GA", + "county": "Taylor" + }, + { + "zip_code": 31040, + "latitude": 32.540073, + "longitude": -82.914974, + "city": "Dublin", + "state": "GA", + "county": "Laurens" + }, + { + "zip_code": 31041, + "latitude": 32.372937, + "longitude": -84.212159, + "city": "Ideal", + "state": "GA", + "county": "Macon" + }, + { + "zip_code": 31042, + "latitude": 32.751414, + "longitude": -83.145237, + "city": "Irwinton", + "state": "GA", + "county": "Wilkinson" + }, + { + "zip_code": 31044, + "latitude": 32.661271, + "longitude": -83.331033, + "city": "Jeffersonville", + "state": "GA", + "county": "Twiggs" + }, + { + "zip_code": 31045, + "latitude": 33.296633, + "longitude": -82.755599, + "city": "Jewell", + "state": "GA", + "county": "Warren" + }, + { + "zip_code": 31046, + "latitude": 33.027607, + "longitude": -83.803166, + "city": "Juliette", + "state": "GA", + "county": "Monroe" + }, + { + "zip_code": 31047, + "latitude": 32.454331, + "longitude": -83.646436, + "city": "Kathleen", + "state": "GA", + "county": "Houston" + }, + { + "zip_code": 31049, + "latitude": 32.698954, + "longitude": -82.525306, + "city": "Kite", + "state": "GA", + "county": "Johnson" + }, + { + "zip_code": 31050, + "latitude": 32.715632, + "longitude": -83.915762, + "city": "Knoxville", + "state": "GA", + "county": "Crawford" + }, + { + "zip_code": 31051, + "latitude": 32.146879, + "longitude": -83.891349, + "city": "Lilly", + "state": "GA", + "county": "Dooly" + }, + { + "zip_code": 31052, + "latitude": 32.783332, + "longitude": -83.823023, + "city": "Lizella", + "state": "GA", + "county": "Crawford" + }, + { + "zip_code": 31054, + "latitude": 32.886524, + "longitude": -83.231724, + "city": "Mc Intyre", + "state": "GA", + "county": "Wilkinson" + }, + { + "zip_code": 31055, + "latitude": 32.047918, + "longitude": -82.910927, + "city": "Mc Rae", + "state": "GA", + "county": "Telfair" + }, + { + "zip_code": 31057, + "latitude": 32.438321, + "longitude": -83.905039, + "city": "Marshallville", + "state": "GA", + "county": "Macon" + }, + { + "zip_code": 31058, + "latitude": 32.559781, + "longitude": -84.227675, + "city": "Mauk", + "state": "GA", + "county": "Taylor" + }, + { + "zip_code": 31059, + "latitude": "", + "longitude": "", + "city": "Milledgeville", + "state": "GA", + "county": "Baldwin" + }, + { + "zip_code": 31060, + "latitude": 31.964005, + "longitude": -82.926588, + "city": "Milan", + "state": "GA", + "county": "Telfair" + }, + { + "zip_code": 31061, + "latitude": 33.072279, + "longitude": -83.239008, + "city": "Milledgeville", + "state": "GA", + "county": "Baldwin" + }, + { + "zip_code": 31062, + "latitude": 33.087138, + "longitude": -83.22492, + "city": "Milledgeville", + "state": "GA", + "county": "Baldwin" + }, + { + "zip_code": 31063, + "latitude": 32.240448, + "longitude": -83.863997, + "city": "Montezuma", + "state": "GA", + "county": "Macon" + }, + { + "zip_code": 31064, + "latitude": 33.337906, + "longitude": -83.698508, + "city": "Monticello", + "state": "GA", + "county": "Jasper" + }, + { + "zip_code": 31065, + "latitude": 32.56204, + "longitude": -83.159741, + "city": "Montrose", + "state": "GA", + "county": "Laurens" + }, + { + "zip_code": 31066, + "latitude": 32.786842, + "longitude": -83.979228, + "city": "Musella", + "state": "GA", + "county": "Crawford" + }, + { + "zip_code": 31067, + "latitude": 32.876666, + "longitude": -82.946903, + "city": "Oconee", + "state": "GA", + "county": "Washington" + }, + { + "zip_code": 31068, + "latitude": 32.327479, + "longitude": -84.101472, + "city": "Oglethorpe", + "state": "GA", + "county": "Macon" + }, + { + "zip_code": 31069, + "latitude": 32.43194, + "longitude": -83.722649, + "city": "Perry", + "state": "GA", + "county": "Houston" + }, + { + "zip_code": 31070, + "latitude": 32.182652, + "longitude": -83.778422, + "city": "Pinehurst", + "state": "GA", + "county": "Dooly" + }, + { + "zip_code": 31071, + "latitude": 32.09813, + "longitude": -83.504479, + "city": "Pineview", + "state": "GA", + "county": "Wilcox" + }, + { + "zip_code": 31072, + "latitude": 31.948637, + "longitude": -83.539522, + "city": "Pitts", + "state": "GA", + "county": "Wilcox" + }, + { + "zip_code": 31073, + "latitude": 32.176429, + "longitude": -83.122891, + "city": "Plainfield", + "state": "GA", + "county": "Dodge" + }, + { + "zip_code": 31075, + "latitude": 32.379902, + "longitude": -82.966995, + "city": "Rentz", + "state": "GA", + "county": "Laurens" + }, + { + "zip_code": 31076, + "latitude": 32.551695, + "longitude": -84.092715, + "city": "Reynolds", + "state": "GA", + "county": "Taylor" + }, + { + "zip_code": 31077, + "latitude": 32.176429, + "longitude": -83.122891, + "city": "Rhine", + "state": "GA", + "county": "Dodge" + }, + { + "zip_code": 31078, + "latitude": 32.687207, + "longitude": -84.010581, + "city": "Roberta", + "state": "GA", + "county": "Crawford" + }, + { + "zip_code": 31079, + "latitude": 31.948411, + "longitude": -83.453578, + "city": "Rochelle", + "state": "GA", + "county": "Wilcox" + }, + { + "zip_code": 31081, + "latitude": 32.559781, + "longitude": -84.227675, + "city": "Rupert", + "state": "GA", + "county": "Taylor" + }, + { + "zip_code": 31082, + "latitude": 32.974982, + "longitude": -82.840564, + "city": "Sandersville", + "state": "GA", + "county": "Washington" + }, + { + "zip_code": 31083, + "latitude": 32.084139, + "longitude": -82.912341, + "city": "Scotland", + "state": "GA", + "county": "Telfair" + }, + { + "zip_code": 31084, + "latitude": 31.989039, + "longitude": -83.394574, + "city": "Seville", + "state": "GA", + "county": "Wilcox" + }, + { + "zip_code": 31085, + "latitude": 33.435022, + "longitude": -83.626885, + "city": "Shady Dale", + "state": "GA", + "county": "Jasper" + }, + { + "zip_code": 31086, + "latitude": 32.989503, + "longitude": -83.876108, + "city": "Smarr", + "state": "GA", + "county": "Monroe" + }, + { + "zip_code": 31087, + "latitude": 33.257068, + "longitude": -83.08922, + "city": "Sparta", + "state": "GA", + "county": "Hancock" + }, + { + "zip_code": 31088, + "latitude": 32.555039, + "longitude": -83.644751, + "city": "Warner Robins", + "state": "GA", + "county": "Houston" + }, + { + "zip_code": 31089, + "latitude": 32.873449, + "longitude": -82.782879, + "city": "Tennille", + "state": "GA", + "county": "Washington" + }, + { + "zip_code": 31090, + "latitude": 32.806595, + "longitude": -83.066814, + "city": "Toomsboro", + "state": "GA", + "county": "Wilkinson" + }, + { + "zip_code": 31091, + "latitude": 32.219249, + "longitude": -83.731718, + "city": "Unadilla", + "state": "GA", + "county": "Dooly" + }, + { + "zip_code": 31092, + "latitude": 32.115981, + "longitude": -83.791644, + "city": "Vienna", + "state": "GA", + "county": "Dooly" + }, + { + "zip_code": 31093, + "latitude": 32.587303, + "longitude": -83.658174, + "city": "Warner Robins", + "state": "GA", + "county": "Houston" + }, + { + "zip_code": 31094, + "latitude": 33.07975, + "longitude": -82.805591, + "city": "Warthen", + "state": "GA", + "county": "Washington" + }, + { + "zip_code": 31095, + "latitude": 32.487403, + "longitude": -83.669655, + "city": "Warner Robins", + "state": "GA", + "county": "Houston" + }, + { + "zip_code": 31096, + "latitude": 32.635692, + "longitude": -82.657495, + "city": "Wrightsville", + "state": "GA", + "county": "Johnson" + }, + { + "zip_code": 31097, + "latitude": 32.901627, + "longitude": -84.212644, + "city": "Yatesville", + "state": "GA", + "county": "Upson" + }, + { + "zip_code": 31098, + "latitude": 32.49372, + "longitude": -83.640099, + "city": "Warner Robins", + "state": "GA", + "county": "Houston" + }, + { + "zip_code": 31099, + "latitude": 32.646236, + "longitude": -83.6513, + "city": "Warner Robins", + "state": "GA", + "county": "Houston" + }, + { + "zip_code": 31106, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31107, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31119, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 31126, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31131, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31139, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31141, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 31145, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 31146, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 31150, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31156, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31191, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31192, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31193, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31195, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31196, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31197, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31198, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31199, + "latitude": 33.844371, + "longitude": -84.47405, + "city": "Atlanta", + "state": "GA", + "county": "Fulton" + }, + { + "zip_code": 31201, + "latitude": 32.827949, + "longitude": -83.595066, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31202, + "latitude": 32.806707, + "longitude": -83.691315, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31203, + "latitude": 32.806707, + "longitude": -83.691315, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31204, + "latitude": 32.852249, + "longitude": -83.667064, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31205, + "latitude": 32.806707, + "longitude": -83.691315, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31206, + "latitude": 32.834861, + "longitude": -83.668091, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31207, + "latitude": 32.830389, + "longitude": -83.648552, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31208, + "latitude": 32.806707, + "longitude": -83.691315, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31209, + "latitude": 32.806707, + "longitude": -83.691315, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31210, + "latitude": 32.843368, + "longitude": -83.680078, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31211, + "latitude": 32.866987, + "longitude": -83.607363, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31212, + "latitude": 32.806707, + "longitude": -83.691315, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31213, + "latitude": 32.839289, + "longitude": -83.638752, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31216, + "latitude": 32.74857, + "longitude": -83.747721, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31217, + "latitude": 32.811767, + "longitude": -83.565009, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31220, + "latitude": 32.859461, + "longitude": -83.802047, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31221, + "latitude": 32.806707, + "longitude": -83.691315, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31294, + "latitude": 32.806707, + "longitude": -83.691315, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31295, + "latitude": 32.810189, + "longitude": -83.569001, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31296, + "latitude": 32.806707, + "longitude": -83.691315, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31297, + "latitude": 32.70045, + "longitude": -83.657207, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31298, + "latitude": 32.87333, + "longitude": -83.708399, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31299, + "latitude": 32.806707, + "longitude": -83.691315, + "city": "Macon", + "state": "GA", + "county": "Bibb" + }, + { + "zip_code": 31301, + "latitude": 31.779116, + "longitude": -81.60385, + "city": "Allenhurst", + "state": "GA", + "county": "Liberty" + }, + { + "zip_code": 31302, + "latitude": 32.107103, + "longitude": -81.291335, + "city": "Bloomingdale", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31303, + "latitude": 32.488015, + "longitude": -81.322392, + "city": "Clyo", + "state": "GA", + "county": "Effingham" + }, + { + "zip_code": 31304, + "latitude": 31.495071, + "longitude": -81.381908, + "city": "Crescent", + "state": "GA", + "county": "Mcintosh" + }, + { + "zip_code": 31305, + "latitude": 31.413831, + "longitude": -81.369263, + "city": "Darien", + "state": "GA", + "county": "Mcintosh" + }, + { + "zip_code": 31307, + "latitude": 32.174021, + "longitude": -81.353756, + "city": "Eden", + "state": "GA", + "county": "Effingham" + }, + { + "zip_code": 31308, + "latitude": 32.159233, + "longitude": -81.502963, + "city": "Ellabell", + "state": "GA", + "county": "Bryan" + }, + { + "zip_code": 31309, + "latitude": 31.87673, + "longitude": -81.457959, + "city": "Fleming", + "state": "GA", + "county": "Liberty" + }, + { + "zip_code": 31310, + "latitude": 31.806832, + "longitude": -81.437074, + "city": "Hinesville", + "state": "GA", + "county": "Liberty" + }, + { + "zip_code": 31312, + "latitude": 32.331563, + "longitude": -81.384181, + "city": "Guyton", + "state": "GA", + "county": "Effingham" + }, + { + "zip_code": 31313, + "latitude": 31.804838, + "longitude": -81.523649, + "city": "Hinesville", + "state": "GA", + "county": "Liberty" + }, + { + "zip_code": 31314, + "latitude": 31.806832, + "longitude": -81.437074, + "city": "Fort Stewart", + "state": "GA", + "county": "Liberty" + }, + { + "zip_code": 31315, + "latitude": 31.844332, + "longitude": -81.654696, + "city": "Fort Stewart", + "state": "GA", + "county": "Liberty" + }, + { + "zip_code": 31316, + "latitude": 31.780996, + "longitude": -81.773916, + "city": "Ludowici", + "state": "GA", + "county": "Long" + }, + { + "zip_code": 31318, + "latitude": 32.149861, + "longitude": -81.372184, + "city": "Meldrim", + "state": "GA", + "county": "Effingham" + }, + { + "zip_code": 31319, + "latitude": 31.459045, + "longitude": -81.368884, + "city": "Meridian", + "state": "GA", + "county": "Mcintosh" + }, + { + "zip_code": 31320, + "latitude": 31.778847, + "longitude": -81.420626, + "city": "Midway", + "state": "GA", + "county": "Liberty" + }, + { + "zip_code": 31321, + "latitude": 32.009967, + "longitude": -81.514752, + "city": "Pembroke", + "state": "GA", + "county": "Bryan" + }, + { + "zip_code": 31322, + "latitude": 32.071917, + "longitude": -81.083881, + "city": "Pooler", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31323, + "latitude": 31.785934, + "longitude": -81.57385, + "city": "Riceboro", + "state": "GA", + "county": "Liberty" + }, + { + "zip_code": 31324, + "latitude": 31.951531, + "longitude": -81.407336, + "city": "Richmond Hill", + "state": "GA", + "county": "Bryan" + }, + { + "zip_code": 31326, + "latitude": 32.285205, + "longitude": -81.287526, + "city": "Rincon", + "state": "GA", + "county": "Effingham" + }, + { + "zip_code": 31327, + "latitude": 31.495071, + "longitude": -81.381908, + "city": "Sapelo Island", + "state": "GA", + "county": "Mcintosh" + }, + { + "zip_code": 31328, + "latitude": 32.00593, + "longitude": -80.855322, + "city": "Tybee Island", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31329, + "latitude": 32.369703, + "longitude": -81.361775, + "city": "Springfield", + "state": "GA", + "county": "Effingham" + }, + { + "zip_code": 31331, + "latitude": 31.512024, + "longitude": -81.358252, + "city": "Townsend", + "state": "GA", + "county": "Mcintosh" + }, + { + "zip_code": 31333, + "latitude": 31.770473, + "longitude": -81.62083, + "city": "Walthourville", + "state": "GA", + "county": "Liberty" + }, + { + "zip_code": 31401, + "latitude": 32.072257, + "longitude": -81.135618, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31402, + "latitude": 31.971394, + "longitude": -81.07156, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31403, + "latitude": 31.971394, + "longitude": -81.07156, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31404, + "latitude": 32.048247, + "longitude": -81.11748, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31405, + "latitude": 32.065317, + "longitude": -81.181413, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31406, + "latitude": 31.975611, + "longitude": -81.086617, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31407, + "latitude": 32.167235, + "longitude": -81.199897, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31408, + "latitude": 32.108154, + "longitude": -81.174612, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31409, + "latitude": 31.971394, + "longitude": -81.07156, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31410, + "latitude": 32.017461, + "longitude": -80.997043, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31411, + "latitude": 31.942645, + "longitude": -81.045795, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31412, + "latitude": 31.971394, + "longitude": -81.07156, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31414, + "latitude": 31.971394, + "longitude": -81.07156, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31415, + "latitude": 32.075307, + "longitude": -81.128865, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31416, + "latitude": 32.005255, + "longitude": -81.047711, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31418, + "latitude": 31.971394, + "longitude": -81.07156, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31419, + "latitude": 32.008492, + "longitude": -81.214369, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31420, + "latitude": 31.971394, + "longitude": -81.07156, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31421, + "latitude": 31.971394, + "longitude": -81.07156, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31422, + "latitude": 31.971394, + "longitude": -81.07156, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31498, + "latitude": 31.971394, + "longitude": -81.07156, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31499, + "latitude": 31.971394, + "longitude": -81.07156, + "city": "Savannah", + "state": "GA", + "county": "Chatham" + }, + { + "zip_code": 31501, + "latitude": 31.224262, + "longitude": -82.359628, + "city": "Waycross", + "state": "GA", + "county": "Ware" + }, + { + "zip_code": 31502, + "latitude": 31.018954, + "longitude": -82.416543, + "city": "Waycross", + "state": "GA", + "county": "Ware" + }, + { + "zip_code": 31503, + "latitude": 31.193229, + "longitude": -82.376595, + "city": "Waycross", + "state": "GA", + "county": "Ware" + }, + { + "zip_code": 31510, + "latitude": 31.576952, + "longitude": -82.461197, + "city": "Alma", + "state": "GA", + "county": "Bacon" + }, + { + "zip_code": 31512, + "latitude": 31.549597, + "longitude": -82.987305, + "city": "Ambrose", + "state": "GA", + "county": "Coffee" + }, + { + "zip_code": 31513, + "latitude": 31.756861, + "longitude": -82.350837, + "city": "Baxley", + "state": "GA", + "county": "Appling" + }, + { + "zip_code": 31515, + "latitude": 31.717717, + "longitude": -82.299677, + "city": "Baxley", + "state": "GA", + "county": "Appling" + }, + { + "zip_code": 31516, + "latitude": 31.326324, + "longitude": -82.271206, + "city": "Blackshear", + "state": "GA", + "county": "Pierce" + }, + { + "zip_code": 31518, + "latitude": 31.483312, + "longitude": -82.214987, + "city": "Bristol", + "state": "GA", + "county": "Pierce" + }, + { + "zip_code": 31519, + "latitude": 31.671903, + "longitude": -82.864903, + "city": "Broxton", + "state": "GA", + "county": "Coffee" + }, + { + "zip_code": 31520, + "latitude": 31.230428, + "longitude": -81.492883, + "city": "Brunswick", + "state": "GA", + "county": "Glynn" + }, + { + "zip_code": 31521, + "latitude": 31.241505, + "longitude": -81.532489, + "city": "Brunswick", + "state": "GA", + "county": "Glynn" + }, + { + "zip_code": 31522, + "latitude": 31.213223, + "longitude": -81.449141, + "city": "Saint Simons Island", + "state": "GA", + "county": "Glynn" + }, + { + "zip_code": 31523, + "latitude": 31.218921, + "longitude": -81.546047, + "city": "Brunswick", + "state": "GA", + "county": "Glynn" + }, + { + "zip_code": 31524, + "latitude": 31.221995, + "longitude": -81.482551, + "city": "Brunswick", + "state": "GA", + "county": "Glynn" + }, + { + "zip_code": 31525, + "latitude": 31.280403, + "longitude": -81.530477, + "city": "Brunswick", + "state": "GA", + "county": "Glynn" + }, + { + "zip_code": 31527, + "latitude": 31.059721, + "longitude": -81.416665, + "city": "Jekyll Island", + "state": "GA", + "county": "Glynn" + }, + { + "zip_code": 31532, + "latitude": 31.795977, + "longitude": -82.707079, + "city": "Denton", + "state": "GA", + "county": "Jeff Davis" + }, + { + "zip_code": 31533, + "latitude": 31.509338, + "longitude": -82.857131, + "city": "Douglas", + "state": "GA", + "county": "Coffee" + }, + { + "zip_code": 31534, + "latitude": 31.571596, + "longitude": -82.854631, + "city": "Douglas", + "state": "GA", + "county": "Coffee" + }, + { + "zip_code": 31535, + "latitude": 31.504581, + "longitude": -82.824636, + "city": "Douglas", + "state": "GA", + "county": "Coffee" + }, + { + "zip_code": 31537, + "latitude": 30.855314, + "longitude": -82.027252, + "city": "Folkston", + "state": "GA", + "county": "Charlton" + }, + { + "zip_code": 31539, + "latitude": 31.806871, + "longitude": -82.626991, + "city": "Hazlehurst", + "state": "GA", + "county": "Jeff Davis" + }, + { + "zip_code": 31542, + "latitude": 31.178954, + "longitude": -82.123686, + "city": "Hoboken", + "state": "GA", + "county": "Brantley" + }, + { + "zip_code": 31543, + "latitude": 31.26837, + "longitude": -81.810366, + "city": "Hortense", + "state": "GA", + "county": "Brantley" + }, + { + "zip_code": 31544, + "latitude": 31.83245, + "longitude": -82.977178, + "city": "Jacksonville", + "state": "GA", + "county": "Telfair" + }, + { + "zip_code": 31545, + "latitude": 31.600775, + "longitude": -81.957787, + "city": "Jesup", + "state": "GA", + "county": "Wayne" + }, + { + "zip_code": 31546, + "latitude": 31.531938, + "longitude": -81.804924, + "city": "Jesup", + "state": "GA", + "county": "Wayne" + }, + { + "zip_code": 31547, + "latitude": 30.804684, + "longitude": -81.627717, + "city": "Kings Bay", + "state": "GA", + "county": "Camden" + }, + { + "zip_code": 31548, + "latitude": 30.784384, + "longitude": -81.692042, + "city": "Kingsland", + "state": "GA", + "county": "Camden" + }, + { + "zip_code": 31549, + "latitude": 31.931373, + "longitude": -82.682963, + "city": "Lumber City", + "state": "GA", + "county": "Telfair" + }, + { + "zip_code": 31550, + "latitude": 31.168101, + "longitude": -82.594815, + "city": "Manor", + "state": "GA", + "county": "Ware" + }, + { + "zip_code": 31551, + "latitude": 31.453629, + "longitude": -82.230385, + "city": "Mershon", + "state": "GA", + "county": "Pierce" + }, + { + "zip_code": 31552, + "latitude": 31.307256, + "longitude": -82.600728, + "city": "Millwood", + "state": "GA", + "county": "Ware" + }, + { + "zip_code": 31553, + "latitude": 31.158299, + "longitude": -81.954478, + "city": "Nahunta", + "state": "GA", + "county": "Brantley" + }, + { + "zip_code": 31554, + "latitude": 31.504909, + "longitude": -82.703064, + "city": "Nicholls", + "state": "GA", + "county": "Coffee" + }, + { + "zip_code": 31555, + "latitude": 31.685101, + "longitude": -82.037562, + "city": "Odum", + "state": "GA", + "county": "Wayne" + }, + { + "zip_code": 31556, + "latitude": 31.412649, + "longitude": -82.115541, + "city": "Offerman", + "state": "GA", + "county": "Pierce" + }, + { + "zip_code": 31557, + "latitude": 31.369686, + "longitude": -82.115363, + "city": "Patterson", + "state": "GA", + "county": "Pierce" + }, + { + "zip_code": 31558, + "latitude": 30.844019, + "longitude": -81.630984, + "city": "Saint Marys", + "state": "GA", + "county": "Camden" + }, + { + "zip_code": 31560, + "latitude": 31.512923, + "longitude": -82.010258, + "city": "Screven", + "state": "GA", + "county": "Wayne" + }, + { + "zip_code": 31561, + "latitude": 31.198914, + "longitude": -81.332211, + "city": "Sea Island", + "state": "GA", + "county": "Glynn" + }, + { + "zip_code": 31563, + "latitude": 31.731163, + "longitude": -82.194912, + "city": "Surrency", + "state": "GA", + "county": "Appling" + }, + { + "zip_code": 31564, + "latitude": 31.018954, + "longitude": -82.416543, + "city": "Waresboro", + "state": "GA", + "county": "Ware" + }, + { + "zip_code": 31565, + "latitude": 31.069415, + "longitude": -81.633658, + "city": "Waverly", + "state": "GA", + "county": "Camden" + }, + { + "zip_code": 31566, + "latitude": 31.187918, + "longitude": -81.889563, + "city": "Waynesville", + "state": "GA", + "county": "Brantley" + }, + { + "zip_code": 31567, + "latitude": 31.614312, + "longitude": -82.724308, + "city": "West Green", + "state": "GA", + "county": "Coffee" + }, + { + "zip_code": 31568, + "latitude": 30.995235, + "longitude": -81.778181, + "city": "White Oak", + "state": "GA", + "county": "Camden" + }, + { + "zip_code": 31569, + "latitude": 30.939072, + "longitude": -81.703469, + "city": "Woodbine", + "state": "GA", + "county": "Camden" + }, + { + "zip_code": 31598, + "latitude": 31.578181, + "longitude": -81.880222, + "city": "Jesup", + "state": "GA", + "county": "Wayne" + }, + { + "zip_code": 31599, + "latitude": 31.578181, + "longitude": -81.880222, + "city": "Jesup", + "state": "GA", + "county": "Wayne" + }, + { + "zip_code": 31601, + "latitude": 30.753904, + "longitude": -83.332068, + "city": "Valdosta", + "state": "GA", + "county": "Lowndes" + }, + { + "zip_code": 31602, + "latitude": 30.893109, + "longitude": -83.327812, + "city": "Valdosta", + "state": "GA", + "county": "Lowndes" + }, + { + "zip_code": 31603, + "latitude": 30.827965, + "longitude": -83.252192, + "city": "Valdosta", + "state": "GA", + "county": "Lowndes" + }, + { + "zip_code": 31604, + "latitude": 30.827965, + "longitude": -83.252192, + "city": "Valdosta", + "state": "GA", + "county": "Lowndes" + }, + { + "zip_code": 31605, + "latitude": 30.945994, + "longitude": -83.247371, + "city": "Valdosta", + "state": "GA", + "county": "Lowndes" + }, + { + "zip_code": 31606, + "latitude": 30.826306, + "longitude": -83.245331, + "city": "Valdosta", + "state": "GA", + "county": "Lowndes" + }, + { + "zip_code": 31620, + "latitude": 31.151742, + "longitude": -83.407143, + "city": "Adel", + "state": "GA", + "county": "Cook" + }, + { + "zip_code": 31622, + "latitude": 31.383968, + "longitude": -83.221348, + "city": "Alapaha", + "state": "GA", + "county": "Berrien" + }, + { + "zip_code": 31623, + "latitude": 31.064114, + "longitude": -82.68954, + "city": "Argyle", + "state": "GA", + "county": "Clinch" + }, + { + "zip_code": 31624, + "latitude": 31.303159, + "longitude": -82.847997, + "city": "Axson", + "state": "GA", + "county": "Atkinson" + }, + { + "zip_code": 31625, + "latitude": 30.856633, + "longitude": -83.526479, + "city": "Barney", + "state": "GA", + "county": "Brooks" + }, + { + "zip_code": 31626, + "latitude": 30.828644, + "longitude": -83.910971, + "city": "Boston", + "state": "GA", + "county": "Thomas" + }, + { + "zip_code": 31627, + "latitude": 31.040257, + "longitude": -83.391519, + "city": "Cecil", + "state": "GA", + "county": "Cook" + }, + { + "zip_code": 31629, + "latitude": 30.761316, + "longitude": -83.708223, + "city": "Dixie", + "state": "GA", + "county": "Brooks" + }, + { + "zip_code": 31630, + "latitude": 30.975874, + "longitude": -82.880688, + "city": "Du Pont", + "state": "GA", + "county": "Clinch" + }, + { + "zip_code": 31631, + "latitude": 31.05682, + "longitude": -82.772422, + "city": "Fargo", + "state": "GA", + "county": "Clinch" + }, + { + "zip_code": 31632, + "latitude": 30.942022, + "longitude": -83.333206, + "city": "Hahira", + "state": "GA", + "county": "Lowndes" + }, + { + "zip_code": 31634, + "latitude": 31.050929, + "longitude": -82.76133, + "city": "Homerville", + "state": "GA", + "county": "Clinch" + }, + { + "zip_code": 31635, + "latitude": 31.035327, + "longitude": -83.098737, + "city": "Lakeland", + "state": "GA", + "county": "Lanier" + }, + { + "zip_code": 31636, + "latitude": 30.745322, + "longitude": -83.184325, + "city": "Lake Park", + "state": "GA", + "county": "Lowndes" + }, + { + "zip_code": 31637, + "latitude": 31.271045, + "longitude": -83.468529, + "city": "Lenox", + "state": "GA", + "county": "Cook" + }, + { + "zip_code": 31638, + "latitude": 30.924839, + "longitude": -83.539952, + "city": "Morven", + "state": "GA", + "county": "Brooks" + }, + { + "zip_code": 31639, + "latitude": 31.199826, + "longitude": -83.218233, + "city": "Nashville", + "state": "GA", + "county": "Berrien" + }, + { + "zip_code": 31641, + "latitude": 30.899018, + "longitude": -83.128478, + "city": "Naylor", + "state": "GA", + "county": "Lowndes" + }, + { + "zip_code": 31642, + "latitude": 31.340836, + "longitude": -82.853406, + "city": "Pearson", + "state": "GA", + "county": "Atkinson" + }, + { + "zip_code": 31643, + "latitude": 30.78944, + "longitude": -83.587777, + "city": "Quitman", + "state": "GA", + "county": "Brooks" + }, + { + "zip_code": 31645, + "latitude": 31.083619, + "longitude": -83.228709, + "city": "Ray City", + "state": "GA", + "county": "Berrien" + }, + { + "zip_code": 31646, + "latitude": 30.434346, + "longitude": -82.165527, + "city": "Saint George", + "state": "GA", + "county": "Charlton" + }, + { + "zip_code": 31647, + "latitude": 31.212878, + "longitude": -83.412143, + "city": "Sparks", + "state": "GA", + "county": "Cook" + }, + { + "zip_code": 31648, + "latitude": 30.768894, + "longitude": -83.037116, + "city": "Statenville", + "state": "GA", + "county": "Echols" + }, + { + "zip_code": 31649, + "latitude": 30.955111, + "longitude": -83.013828, + "city": "Stockton", + "state": "GA", + "county": "Lanier" + }, + { + "zip_code": 31650, + "latitude": 31.361682, + "longitude": -82.968235, + "city": "Willacoochee", + "state": "GA", + "county": "Atkinson" + }, + { + "zip_code": 31698, + "latitude": 30.84848, + "longitude": -83.287753, + "city": "Valdosta", + "state": "GA", + "county": "Lowndes" + }, + { + "zip_code": 31699, + "latitude": 30.975119, + "longitude": -83.207206, + "city": "Valdosta", + "state": "GA", + "county": "Lowndes" + }, + { + "zip_code": 31701, + "latitude": 31.560674, + "longitude": -84.176751, + "city": "Albany", + "state": "GA", + "county": "Dougherty" + }, + { + "zip_code": 31702, + "latitude": 31.594782, + "longitude": -84.194812, + "city": "Albany", + "state": "GA", + "county": "Dougherty" + }, + { + "zip_code": 31703, + "latitude": 31.543065, + "longitude": -84.219594, + "city": "Albany", + "state": "GA", + "county": "Dougherty" + }, + { + "zip_code": 31704, + "latitude": 31.549975, + "longitude": -84.061155, + "city": "Albany", + "state": "GA", + "county": "Dougherty" + }, + { + "zip_code": 31705, + "latitude": 31.546375, + "longitude": -84.078338, + "city": "Albany", + "state": "GA", + "county": "Dougherty" + }, + { + "zip_code": 31706, + "latitude": 31.559274, + "longitude": -84.176507, + "city": "Albany", + "state": "GA", + "county": "Dougherty" + }, + { + "zip_code": 31707, + "latitude": 31.529269, + "longitude": -84.293109, + "city": "Albany", + "state": "GA", + "county": "Dougherty" + }, + { + "zip_code": 31708, + "latitude": 31.591073, + "longitude": -84.132357, + "city": "Albany", + "state": "GA", + "county": "Dougherty" + }, + { + "zip_code": 31709, + "latitude": 32.040432, + "longitude": -84.215282, + "city": "Americus", + "state": "GA", + "county": "Sumter" + }, + { + "zip_code": 31710, + "latitude": 32.051235, + "longitude": -84.181547, + "city": "Americus", + "state": "GA", + "county": "Sumter" + }, + { + "zip_code": 31711, + "latitude": 32.155949, + "longitude": -84.163983, + "city": "Andersonville", + "state": "GA", + "county": "Sumter" + }, + { + "zip_code": 31712, + "latitude": 31.849613, + "longitude": -83.7277, + "city": "Arabi", + "state": "GA", + "county": "Crisp" + }, + { + "zip_code": 31713, + "latitude": 31.47718, + "longitude": -84.699156, + "city": "Arlington", + "state": "GA", + "county": "Calhoun" + }, + { + "zip_code": 31714, + "latitude": 31.723074, + "longitude": -83.644063, + "city": "Ashburn", + "state": "GA", + "county": "Turner" + }, + { + "zip_code": 31715, + "latitude": 30.835331, + "longitude": -84.511949, + "city": "Attapulgus", + "state": "GA", + "county": "Decatur" + }, + { + "zip_code": 31716, + "latitude": 31.358861, + "longitude": -84.100301, + "city": "Baconton", + "state": "GA", + "county": "Mitchell" + }, + { + "zip_code": 31717, + "latitude": 30.888734, + "longitude": -84.617836, + "city": "Bainbridge", + "state": "GA", + "county": "Decatur" + }, + { + "zip_code": 31718, + "latitude": 30.901863, + "longitude": -84.570049, + "city": "Bainbridge", + "state": "GA", + "county": "Decatur" + }, + { + "zip_code": 31720, + "latitude": 30.856633, + "longitude": -83.526479, + "city": "Barwick", + "state": "GA", + "county": "Brooks" + }, + { + "zip_code": 31722, + "latitude": 31.080682, + "longitude": -83.649138, + "city": "Berlin", + "state": "GA", + "county": "Colquitt" + }, + { + "zip_code": 31723, + "latitude": 31.346088, + "longitude": -84.901178, + "city": "Blakely", + "state": "GA", + "county": "Early" + }, + { + "zip_code": 31724, + "latitude": 31.557533, + "longitude": -84.854212, + "city": "Bluffton", + "state": "GA", + "county": "Clay" + }, + { + "zip_code": 31725, + "latitude": 30.907915, + "longitude": -84.703795, + "city": "Brinson", + "state": "GA", + "county": "Decatur" + }, + { + "zip_code": 31726, + "latitude": 31.824017, + "longitude": -84.343163, + "city": "Bronwood", + "state": "GA", + "county": "Terrell" + }, + { + "zip_code": 31727, + "latitude": 31.44172, + "longitude": -83.503715, + "city": "Brookfield", + "state": "GA", + "county": "Tift" + }, + { + "zip_code": 31728, + "latitude": 30.857503, + "longitude": -84.22903, + "city": "Cairo", + "state": "GA", + "county": "Grady" + }, + { + "zip_code": 31729, + "latitude": 30.71471, + "longitude": -84.351846, + "city": "Calvary", + "state": "GA", + "county": "Grady" + }, + { + "zip_code": 31730, + "latitude": 31.249152, + "longitude": -84.242837, + "city": "Camilla", + "state": "GA", + "county": "Mitchell" + }, + { + "zip_code": 31732, + "latitude": 31.29563, + "longitude": -84.871091, + "city": "Cedar Springs", + "state": "GA", + "county": "Early" + }, + { + "zip_code": 31733, + "latitude": 31.557454, + "longitude": -83.509385, + "city": "Chula", + "state": "GA", + "county": "Tift" + }, + { + "zip_code": 31734, + "latitude": 30.887347, + "longitude": -84.468281, + "city": "Climax", + "state": "GA", + "county": "Decatur" + }, + { + "zip_code": 31735, + "latitude": 31.968395, + "longitude": -83.978975, + "city": "Cobb", + "state": "GA", + "county": "Sumter" + }, + { + "zip_code": 31736, + "latitude": 31.775195, + "longitude": -84.747201, + "city": "Coleman", + "state": "GA", + "county": "Randolph" + }, + { + "zip_code": 31737, + "latitude": 31.16251, + "longitude": -84.713359, + "city": "Colquitt", + "state": "GA", + "county": "Miller" + }, + { + "zip_code": 31738, + "latitude": 30.976287, + "longitude": -83.871284, + "city": "Coolidge", + "state": "GA", + "county": "Thomas" + }, + { + "zip_code": 31739, + "latitude": 31.260443, + "longitude": -84.253089, + "city": "Cotton", + "state": "GA", + "county": "Mitchell" + }, + { + "zip_code": 31740, + "latitude": 31.731183, + "longitude": -84.832234, + "city": "Cuthbert", + "state": "GA", + "county": "Randolph" + }, + { + "zip_code": 31741, + "latitude": 31.298124, + "longitude": -84.71746, + "city": "Damascus", + "state": "GA", + "county": "Early" + }, + { + "zip_code": 31742, + "latitude": 31.76615, + "longitude": -84.438586, + "city": "Dawson", + "state": "GA", + "county": "Terrell" + }, + { + "zip_code": 31743, + "latitude": 31.938088, + "longitude": -84.03104, + "city": "De Soto", + "state": "GA", + "county": "Sumter" + }, + { + "zip_code": 31744, + "latitude": 31.272009, + "longitude": -83.889951, + "city": "Doerun", + "state": "GA", + "county": "Colquitt" + }, + { + "zip_code": 31745, + "latitude": 30.918229, + "longitude": -84.867238, + "city": "Donalsonville", + "state": "GA", + "county": "Seminole" + }, + { + "zip_code": 31746, + "latitude": 31.506869, + "longitude": -84.721045, + "city": "Edison", + "state": "GA", + "county": "Calhoun" + }, + { + "zip_code": 31747, + "latitude": 31.17885, + "longitude": -83.588901, + "city": "Ellenton", + "state": "GA", + "county": "Colquitt" + }, + { + "zip_code": 31749, + "latitude": 31.417797, + "longitude": -83.355349, + "city": "Enigma", + "state": "GA", + "county": "Berrien" + }, + { + "zip_code": 31750, + "latitude": 31.748753, + "longitude": -83.235412, + "city": "Fitzgerald", + "state": "GA", + "county": "Ben Hill" + }, + { + "zip_code": 31751, + "latitude": 31.63618, + "longitude": -85.054942, + "city": "Fort Gaines", + "state": "GA", + "county": "Clay" + }, + { + "zip_code": 31752, + "latitude": 30.791856, + "longitude": -84.549907, + "city": "Fowlstown", + "state": "GA", + "county": "Decatur" + }, + { + "zip_code": 31753, + "latitude": 31.205365, + "longitude": -83.877554, + "city": "Funston", + "state": "GA", + "county": "Colquitt" + }, + { + "zip_code": 31754, + "latitude": 31.844937, + "longitude": -85.104383, + "city": "Georgetown", + "state": "GA", + "county": "Quitman" + }, + { + "zip_code": 31756, + "latitude": 31.200827, + "longitude": -83.945527, + "city": "Hartsfield", + "state": "GA", + "county": "Colquitt" + }, + { + "zip_code": 31757, + "latitude": 30.853592, + "longitude": -83.888269, + "city": "Thomasville", + "state": "GA", + "county": "Thomas" + }, + { + "zip_code": 31758, + "latitude": 30.868187, + "longitude": -83.927785, + "city": "Thomasville", + "state": "GA", + "county": "Thomas" + }, + { + "zip_code": 31759, + "latitude": 30.985082, + "longitude": -84.834731, + "city": "Iron City", + "state": "GA", + "county": "Seminole" + }, + { + "zip_code": 31760, + "latitude": 31.706283, + "longitude": -83.408633, + "city": "Irwinville", + "state": "GA", + "county": "Irwin" + }, + { + "zip_code": 31761, + "latitude": 31.089377, + "longitude": -84.986113, + "city": "Jakin", + "state": "GA", + "county": "Early" + }, + { + "zip_code": 31762, + "latitude": 31.484266, + "longitude": -84.513659, + "city": "Leary", + "state": "GA", + "county": "Calhoun" + }, + { + "zip_code": 31763, + "latitude": 31.763715, + "longitude": -84.160359, + "city": "Leesburg", + "state": "GA", + "county": "Lee" + }, + { + "zip_code": 31764, + "latitude": 32.000148, + "longitude": -84.088354, + "city": "Leslie", + "state": "GA", + "county": "Sumter" + }, + { + "zip_code": 31765, + "latitude": 31.021859, + "longitude": -84.061389, + "city": "Meigs", + "state": "GA", + "county": "Thomas" + }, + { + "zip_code": 31766, + "latitude": 31.53796, + "longitude": -84.611559, + "city": "Morgan", + "state": "GA", + "county": "Calhoun" + }, + { + "zip_code": 31767, + "latitude": 31.88141, + "longitude": -85.024468, + "city": "Morris", + "state": "GA", + "county": "Quitman" + }, + { + "zip_code": 31768, + "latitude": 31.183438, + "longitude": -83.789698, + "city": "Moultrie", + "state": "GA", + "county": "Colquitt" + }, + { + "zip_code": 31769, + "latitude": 31.620866, + "longitude": -83.249754, + "city": "Mystic", + "state": "GA", + "county": "Irwin" + }, + { + "zip_code": 31770, + "latitude": 31.37168, + "longitude": -84.338325, + "city": "Newton", + "state": "GA", + "county": "Baker" + }, + { + "zip_code": 31771, + "latitude": 31.246179, + "longitude": -83.654904, + "city": "Norman Park", + "state": "GA", + "county": "Colquitt" + }, + { + "zip_code": 31772, + "latitude": 31.726629, + "longitude": -83.959728, + "city": "Oakfield", + "state": "GA", + "county": "Worth" + }, + { + "zip_code": 31773, + "latitude": 30.968592, + "longitude": -84.02725, + "city": "Ochlocknee", + "state": "GA", + "county": "Thomas" + }, + { + "zip_code": 31774, + "latitude": 31.571754, + "longitude": -83.269632, + "city": "Ocilla", + "state": "GA", + "county": "Irwin" + }, + { + "zip_code": 31775, + "latitude": 31.359156, + "longitude": -83.59029, + "city": "Omega", + "state": "GA", + "county": "Tift" + }, + { + "zip_code": 31776, + "latitude": 31.172696, + "longitude": -83.792379, + "city": "Moultrie", + "state": "GA", + "county": "Colquitt" + }, + { + "zip_code": 31777, + "latitude": 31.911689, + "longitude": -84.506058, + "city": "Parrott", + "state": "GA", + "county": "Terrell" + }, + { + "zip_code": 31778, + "latitude": 30.869228, + "longitude": -83.900766, + "city": "Pavo", + "state": "GA", + "county": "Thomas" + }, + { + "zip_code": 31779, + "latitude": 31.225572, + "longitude": -84.223371, + "city": "Pelham", + "state": "GA", + "county": "Mitchell" + }, + { + "zip_code": 31780, + "latitude": 32.027663, + "longitude": -84.37249, + "city": "Plains", + "state": "GA", + "county": "Sumter" + }, + { + "zip_code": 31781, + "latitude": 31.538397, + "longitude": -83.784347, + "city": "Poulan", + "state": "GA", + "county": "Worth" + }, + { + "zip_code": 31782, + "latitude": 31.543065, + "longitude": -84.219594, + "city": "Putney", + "state": "GA", + "county": "Dougherty" + }, + { + "zip_code": 31783, + "latitude": 31.780373, + "longitude": -83.526041, + "city": "Rebecca", + "state": "GA", + "county": "Turner" + }, + { + "zip_code": 31784, + "latitude": 31.27433, + "longitude": -84.047656, + "city": "Sale City", + "state": "GA", + "county": "Mitchell" + }, + { + "zip_code": 31785, + "latitude": 31.689973, + "longitude": -84.32748, + "city": "Sasser", + "state": "GA", + "county": "Terrell" + }, + { + "zip_code": 31786, + "latitude": 31.760361, + "longitude": -84.614914, + "city": "Shellman", + "state": "GA", + "county": "Randolph" + }, + { + "zip_code": 31787, + "latitude": 31.772073, + "longitude": -84.222541, + "city": "Smithville", + "state": "GA", + "county": "Lee" + }, + { + "zip_code": 31789, + "latitude": 31.481811, + "longitude": -83.727288, + "city": "Sumner", + "state": "GA", + "county": "Worth" + }, + { + "zip_code": 31790, + "latitude": 31.652867, + "longitude": -83.578336, + "city": "Sycamore", + "state": "GA", + "county": "Turner" + }, + { + "zip_code": 31791, + "latitude": 31.603336, + "longitude": -83.850054, + "city": "Sylvester", + "state": "GA", + "county": "Worth" + }, + { + "zip_code": 31792, + "latitude": 30.825551, + "longitude": -83.950795, + "city": "Thomasville", + "state": "GA", + "county": "Thomas" + }, + { + "zip_code": 31793, + "latitude": 31.485438, + "longitude": -83.503621, + "city": "Tifton", + "state": "GA", + "county": "Tift" + }, + { + "zip_code": 31794, + "latitude": 31.463918, + "longitude": -83.499944, + "city": "Tifton", + "state": "GA", + "county": "Tift" + }, + { + "zip_code": 31795, + "latitude": 31.475155, + "longitude": -83.592123, + "city": "Ty Ty", + "state": "GA", + "county": "Tift" + }, + { + "zip_code": 31796, + "latitude": 31.762219, + "longitude": -83.876179, + "city": "Warwick", + "state": "GA", + "county": "Worth" + }, + { + "zip_code": 31797, + "latitude": 30.901959, + "longitude": -84.311493, + "city": "Whigham", + "state": "GA", + "county": "Grady" + }, + { + "zip_code": 31798, + "latitude": 31.571849, + "longitude": -83.087813, + "city": "Wray", + "state": "GA", + "county": "Irwin" + }, + { + "zip_code": 31799, + "latitude": 30.880968, + "longitude": -83.885902, + "city": "Thomasville", + "state": "GA", + "county": "Thomas" + }, + { + "zip_code": 31801, + "latitude": 32.701117, + "longitude": -84.494946, + "city": "Box Springs", + "state": "GA", + "county": "Talbot" + }, + { + "zip_code": 31803, + "latitude": 32.254152, + "longitude": -84.489818, + "city": "Buena Vista", + "state": "GA", + "county": "Marion" + }, + { + "zip_code": 31804, + "latitude": 32.661625, + "longitude": -84.855447, + "city": "Cataula", + "state": "GA", + "county": "Harris" + }, + { + "zip_code": 31805, + "latitude": 32.292547, + "longitude": -84.736706, + "city": "Cusseta", + "state": "GA", + "county": "Chattahoochee" + }, + { + "zip_code": 31806, + "latitude": 32.209028, + "longitude": -84.277064, + "city": "Ellaville", + "state": "GA", + "county": "Schley" + }, + { + "zip_code": 31807, + "latitude": 32.631243, + "longitude": -84.789524, + "city": "Ellerslie", + "state": "GA", + "county": "Harris" + }, + { + "zip_code": 31808, + "latitude": 32.563874, + "longitude": -84.991501, + "city": "Fortson", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31810, + "latitude": 32.701117, + "longitude": -84.494946, + "city": "Geneva", + "state": "GA", + "county": "Talbot" + }, + { + "zip_code": 31811, + "latitude": 32.746007, + "longitude": -84.934906, + "city": "Hamilton", + "state": "GA", + "county": "Harris" + }, + { + "zip_code": 31812, + "latitude": 32.701117, + "longitude": -84.494946, + "city": "Junction City", + "state": "GA", + "county": "Talbot" + }, + { + "zip_code": 31814, + "latitude": 32.07663, + "longitude": -84.849724, + "city": "Louvale", + "state": "GA", + "county": "Stewart" + }, + { + "zip_code": 31815, + "latitude": 32.069538, + "longitude": -84.728093, + "city": "Lumpkin", + "state": "GA", + "county": "Stewart" + }, + { + "zip_code": 31816, + "latitude": 32.91107, + "longitude": -84.615478, + "city": "Manchester", + "state": "GA", + "county": "Meriwether" + }, + { + "zip_code": 31820, + "latitude": 32.565782, + "longitude": -84.850953, + "city": "Midland", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31821, + "latitude": 32.07663, + "longitude": -84.849724, + "city": "Omaha", + "state": "GA", + "county": "Stewart" + }, + { + "zip_code": 31822, + "latitude": 32.834241, + "longitude": -84.904638, + "city": "Pine Mountain", + "state": "GA", + "county": "Harris" + }, + { + "zip_code": 31823, + "latitude": 32.822628, + "longitude": -84.820364, + "city": "Pine Mountain Valley", + "state": "GA", + "county": "Harris" + }, + { + "zip_code": 31824, + "latitude": 32.076133, + "longitude": -84.543517, + "city": "Preston", + "state": "GA", + "county": "Webster" + }, + { + "zip_code": 31825, + "latitude": 32.074331, + "longitude": -84.718627, + "city": "Richland", + "state": "GA", + "county": "Stewart" + }, + { + "zip_code": 31826, + "latitude": 32.791278, + "longitude": -84.733595, + "city": "Shiloh", + "state": "GA", + "county": "Harris" + }, + { + "zip_code": 31827, + "latitude": 32.673738, + "longitude": -84.537989, + "city": "Talbotton", + "state": "GA", + "county": "Talbot" + }, + { + "zip_code": 31829, + "latitude": 32.564771, + "longitude": -84.733865, + "city": "Upatoi", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31830, + "latitude": 32.906319, + "longitude": -84.716723, + "city": "Warm Springs", + "state": "GA", + "county": "Meriwether" + }, + { + "zip_code": 31831, + "latitude": 32.738687, + "longitude": -84.78546, + "city": "Waverly Hall", + "state": "GA", + "county": "Harris" + }, + { + "zip_code": 31832, + "latitude": 32.076133, + "longitude": -84.543517, + "city": "Weston", + "state": "GA", + "county": "Webster" + }, + { + "zip_code": 31833, + "latitude": 32.907328, + "longitude": -85.077535, + "city": "West Point", + "state": "GA", + "county": "Troup" + }, + { + "zip_code": 31836, + "latitude": 32.790007, + "longitude": -84.56542, + "city": "Woodland", + "state": "GA", + "county": "Talbot" + }, + { + "zip_code": 31901, + "latitude": 32.472864, + "longitude": -84.97823, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31902, + "latitude": 32.524252, + "longitude": -84.955843, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31903, + "latitude": 32.41851, + "longitude": -84.934344, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31904, + "latitude": 32.534374, + "longitude": -84.99698, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31905, + "latitude": 32.392337, + "longitude": -84.931457, + "city": "Fort Benning", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31906, + "latitude": 32.493455, + "longitude": -84.95328, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31907, + "latitude": 32.483084, + "longitude": -84.914976, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31908, + "latitude": 32.534852, + "longitude": -84.906483, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31909, + "latitude": 32.542198, + "longitude": -84.920187, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31914, + "latitude": 32.491005, + "longitude": -84.874123, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31917, + "latitude": 32.491005, + "longitude": -84.874123, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31993, + "latitude": 32.482142, + "longitude": -84.977131, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31994, + "latitude": 32.491005, + "longitude": -84.874123, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31995, + "latitude": 32.495841, + "longitude": -84.963981, + "city": "Fort Benning", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31997, + "latitude": 32.491005, + "longitude": -84.874123, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31998, + "latitude": 32.491005, + "longitude": -84.874123, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 31999, + "latitude": 32.491005, + "longitude": -84.874123, + "city": "Columbus", + "state": "GA", + "county": "Muscogee" + }, + { + "zip_code": 32003, + "latitude": "", + "longitude": "", + "city": "Orange Park", + "state": "FL", + "county": "Clay" + }, + { + "zip_code": 32004, + "latitude": 29.937673, + "longitude": -81.420603, + "city": "Ponte Vedra Beach", + "state": "FL", + "county": "Saint Johns" + }, + { + "zip_code": 32007, + "latitude": 29.799631, + "longitude": -81.627324, + "city": "Bostwick", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32008, + "latitude": 30.101927, + "longitude": -82.908004, + "city": "Branford", + "state": "FL", + "county": "Suwannee" + }, + { + "zip_code": 32009, + "latitude": 30.521109, + "longitude": -81.906051, + "city": "Bryceville", + "state": "FL", + "county": "Nassau" + }, + { + "zip_code": 32011, + "latitude": 30.556322, + "longitude": -81.837594, + "city": "Callahan", + "state": "FL", + "county": "Nassau" + }, + { + "zip_code": 32013, + "latitude": 30.041449, + "longitude": -83.123055, + "city": "Day", + "state": "FL", + "county": "Lafayette" + }, + { + "zip_code": 32024, + "latitude": 30.105451, + "longitude": -82.68778, + "city": "Lake City", + "state": "FL", + "county": "Columbia" + }, + { + "zip_code": 32025, + "latitude": 30.160115, + "longitude": -82.639606, + "city": "Lake City", + "state": "FL", + "county": "Columbia" + }, + { + "zip_code": 32030, + "latitude": 30.105553, + "longitude": -81.768964, + "city": "Doctors Inlet", + "state": "FL", + "county": "Clay" + }, + { + "zip_code": 32033, + "latitude": 29.813208, + "longitude": -81.468724, + "city": "Elkton", + "state": "FL", + "county": "Saint Johns" + }, + { + "zip_code": 32034, + "latitude": 30.60778, + "longitude": -81.682889, + "city": "Fernandina Beach", + "state": "FL", + "county": "Nassau" + }, + { + "zip_code": 32035, + "latitude": 30.551558, + "longitude": -81.698422, + "city": "Fernandina Beach", + "state": "FL", + "county": "Nassau" + }, + { + "zip_code": 32038, + "latitude": 30.211903, + "longitude": -82.626332, + "city": "Fort White", + "state": "FL", + "county": "Columbia" + }, + { + "zip_code": 32040, + "latitude": 30.302616, + "longitude": -82.190828, + "city": "Glen Saint Mary", + "state": "FL", + "county": "Baker" + }, + { + "zip_code": 32041, + "latitude": 30.6233, + "longitude": -81.590249, + "city": "Yulee", + "state": "FL", + "county": "Nassau" + }, + { + "zip_code": 32042, + "latitude": 29.968926, + "longitude": -82.122553, + "city": "Graham", + "state": "FL", + "county": "Bradford" + }, + { + "zip_code": 32043, + "latitude": 29.998318, + "longitude": -81.76468, + "city": "Green Cove Springs", + "state": "FL", + "county": "Clay" + }, + { + "zip_code": 32044, + "latitude": 29.862285, + "longitude": -82.143297, + "city": "Hampton", + "state": "FL", + "county": "Bradford" + }, + { + "zip_code": 32046, + "latitude": 30.670745, + "longitude": -81.894528, + "city": "Hilliard", + "state": "FL", + "county": "Nassau" + }, + { + "zip_code": 32050, + "latitude": 30.031702, + "longitude": -81.848401, + "city": "Middleburg", + "state": "FL", + "county": "Clay" + }, + { + "zip_code": 32052, + "latitude": 30.495814, + "longitude": -82.985428, + "city": "Jasper", + "state": "FL", + "county": "Hamilton" + }, + { + "zip_code": 32053, + "latitude": 30.555263, + "longitude": -83.148179, + "city": "Jennings", + "state": "FL", + "county": "Hamilton" + }, + { + "zip_code": 32054, + "latitude": 30.007626, + "longitude": -82.341422, + "city": "Lake Butler", + "state": "FL", + "county": "Union" + }, + { + "zip_code": 32055, + "latitude": 30.155907, + "longitude": -82.652551, + "city": "Lake City", + "state": "FL", + "county": "Columbia" + }, + { + "zip_code": 32056, + "latitude": 30.162772, + "longitude": -82.651184, + "city": "Lake City", + "state": "FL", + "county": "Columbia" + }, + { + "zip_code": 32058, + "latitude": 30.047063, + "longitude": -82.12691, + "city": "Lawtey", + "state": "FL", + "county": "Bradford" + }, + { + "zip_code": 32059, + "latitude": 30.498591, + "longitude": -83.361506, + "city": "Lee", + "state": "FL", + "county": "Madison" + }, + { + "zip_code": 32060, + "latitude": 30.175865, + "longitude": -83.030438, + "city": "Live Oak", + "state": "FL", + "county": "Suwannee" + }, + { + "zip_code": 32061, + "latitude": 30.211903, + "longitude": -82.626332, + "city": "Lulu", + "state": "FL", + "county": "Columbia" + }, + { + "zip_code": 32062, + "latitude": 30.186428, + "longitude": -82.983576, + "city": "Mc Alpin", + "state": "FL", + "county": "Suwannee" + }, + { + "zip_code": 32063, + "latitude": 30.284628, + "longitude": -82.160139, + "city": "Macclenny", + "state": "FL", + "county": "Baker" + }, + { + "zip_code": 32064, + "latitude": 30.331517, + "longitude": -82.957151, + "city": "Live Oak", + "state": "FL", + "county": "Suwannee" + }, + { + "zip_code": 32065, + "latitude": 29.986046, + "longitude": -81.883212, + "city": "Orange Park", + "state": "FL", + "county": "Clay" + }, + { + "zip_code": 32066, + "latitude": 30.148296, + "longitude": -83.210982, + "city": "Mayo", + "state": "FL", + "county": "Lafayette" + }, + { + "zip_code": 32067, + "latitude": 29.956068, + "longitude": -81.815115, + "city": "Orange Park", + "state": "FL", + "county": "Clay" + }, + { + "zip_code": 32068, + "latitude": 30.078597, + "longitude": -81.847794, + "city": "Middleburg", + "state": "FL", + "county": "Clay" + }, + { + "zip_code": 32071, + "latitude": 30.036193, + "longitude": -82.932228, + "city": "O Brien", + "state": "FL", + "county": "Suwannee" + }, + { + "zip_code": 32072, + "latitude": 30.36036, + "longitude": -82.25418, + "city": "Olustee", + "state": "FL", + "county": "Baker" + }, + { + "zip_code": 32073, + "latitude": 30.119884, + "longitude": -81.791546, + "city": "Orange Park", + "state": "FL", + "county": "Clay" + }, + { + "zip_code": 32079, + "latitude": 29.984882, + "longitude": -81.802221, + "city": "Penney Farms", + "state": "FL", + "county": "Clay" + }, + { + "zip_code": 32080, + "latitude": "", + "longitude": "", + "city": "Saint Augustine", + "state": "FL", + "county": "Saint Johns" + }, + { + "zip_code": 32082, + "latitude": 30.102212, + "longitude": -81.382302, + "city": "Ponte Vedra Beach", + "state": "FL", + "county": "Saint Johns" + }, + { + "zip_code": 32083, + "latitude": 30.054956, + "longitude": -82.213361, + "city": "Raiford", + "state": "FL", + "county": "Union" + }, + { + "zip_code": 32084, + "latitude": 29.849505, + "longitude": -81.332552, + "city": "Saint Augustine", + "state": "FL", + "county": "Saint Johns" + }, + { + "zip_code": 32085, + "latitude": 29.937673, + "longitude": -81.420603, + "city": "Saint Augustine", + "state": "FL", + "county": "Saint Johns" + }, + { + "zip_code": 32086, + "latitude": 29.775409, + "longitude": -81.302246, + "city": "Saint Augustine", + "state": "FL", + "county": "Saint Johns" + }, + { + "zip_code": 32087, + "latitude": 30.291034, + "longitude": -82.334017, + "city": "Sanderson", + "state": "FL", + "county": "Baker" + }, + { + "zip_code": 32091, + "latitude": 29.928149, + "longitude": -82.179651, + "city": "Starke", + "state": "FL", + "county": "Bradford" + }, + { + "zip_code": 32092, + "latitude": 29.921998, + "longitude": -81.504509, + "city": "Saint Augustine", + "state": "FL", + "county": "Saint Johns" + }, + { + "zip_code": 32094, + "latitude": 30.194651, + "longitude": -82.857328, + "city": "Wellborn", + "state": "FL", + "county": "Suwannee" + }, + { + "zip_code": 32095, + "latitude": 29.983058, + "longitude": -81.450583, + "city": "Saint Augustine", + "state": "FL", + "county": "Saint Johns" + }, + { + "zip_code": 32096, + "latitude": 30.386063, + "longitude": -82.77389, + "city": "White Springs", + "state": "FL", + "county": "Hamilton" + }, + { + "zip_code": 32097, + "latitude": 30.659689, + "longitude": -81.683649, + "city": "Yulee", + "state": "FL", + "county": "Nassau" + }, + { + "zip_code": 32099, + "latitude": 30.337538, + "longitude": -81.768622, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32102, + "latitude": 29.174011, + "longitude": -81.575044, + "city": "Astor", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32105, + "latitude": 29.200508, + "longitude": -81.406458, + "city": "Barberville", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32110, + "latitude": 29.402177, + "longitude": -81.33425, + "city": "Bunnell", + "state": "FL", + "county": "Flagler" + }, + { + "zip_code": 32111, + "latitude": 29.060711, + "longitude": -81.969048, + "city": "Candler", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32112, + "latitude": 29.511518, + "longitude": -81.681387, + "city": "Crescent City", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32113, + "latitude": 29.411299, + "longitude": -82.084651, + "city": "Citra", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32114, + "latitude": 29.146163, + "longitude": -81.053368, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32115, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32116, + "latitude": 29.10909, + "longitude": -80.984344, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32117, + "latitude": 29.188732, + "longitude": -81.231384, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32118, + "latitude": 29.208908, + "longitude": -81.00227, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32119, + "latitude": 29.150622, + "longitude": -81.025223, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32120, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32121, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32122, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32123, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32124, + "latitude": 29.14192, + "longitude": -81.140241, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32125, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32126, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32127, + "latitude": 29.113539, + "longitude": -80.976485, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32128, + "latitude": "", + "longitude": "", + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32129, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Port Orange", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32130, + "latitude": 29.183646, + "longitude": -81.329387, + "city": "De Leon Springs", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32131, + "latitude": 29.612208, + "longitude": -81.699606, + "city": "East Palatka", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32132, + "latitude": 28.974136, + "longitude": -80.92291, + "city": "Edgewater", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32133, + "latitude": 29.008805, + "longitude": -81.909445, + "city": "Eastlake Weir", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32134, + "latitude": 29.390965, + "longitude": -81.855082, + "city": "Fort Mc Coy", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32135, + "latitude": 29.466085, + "longitude": -81.282815, + "city": "Palm Coast", + "state": "FL", + "county": "Flagler" + }, + { + "zip_code": 32136, + "latitude": 29.509845, + "longitude": -81.18295, + "city": "Flagler Beach", + "state": "FL", + "county": "Flagler" + }, + { + "zip_code": 32137, + "latitude": 29.564391, + "longitude": -81.201389, + "city": "Palm Coast", + "state": "FL", + "county": "Flagler" + }, + { + "zip_code": 32138, + "latitude": 29.699255, + "longitude": -81.922362, + "city": "Grandin", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32139, + "latitude": 29.384185, + "longitude": -81.618309, + "city": "Georgetown", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32140, + "latitude": 29.611384, + "longitude": -81.73499, + "city": "Florahome", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32141, + "latitude": 28.933217, + "longitude": -80.900037, + "city": "Edgewater", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32142, + "latitude": 29.466085, + "longitude": -81.282815, + "city": "Palm Coast", + "state": "FL", + "county": "Flagler" + }, + { + "zip_code": 32145, + "latitude": 29.68875, + "longitude": -81.406081, + "city": "Hastings", + "state": "FL", + "county": "Saint Johns" + }, + { + "zip_code": 32147, + "latitude": 29.657611, + "longitude": -81.779652, + "city": "Hollister", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32148, + "latitude": 29.598959, + "longitude": -81.762249, + "city": "Interlachen", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32149, + "latitude": 29.58203, + "longitude": -81.744852, + "city": "Interlachen", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32151, + "latitude": 29.466085, + "longitude": -81.282815, + "city": "Flagler Beach", + "state": "FL", + "county": "Flagler" + }, + { + "zip_code": 32157, + "latitude": 29.45817, + "longitude": -81.591447, + "city": "Lake Como", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32158, + "latitude": 28.811078, + "longitude": -81.653642, + "city": "Lady Lake", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32159, + "latitude": 28.923468, + "longitude": -81.894367, + "city": "Lady Lake", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32160, + "latitude": 29.768321, + "longitude": -81.990729, + "city": "Lake Geneva", + "state": "FL", + "county": "Clay" + }, + { + "zip_code": 32162, + "latitude": "", + "longitude": "", + "city": "Lady Lake", + "state": "FL", + "county": "Sumter" + }, + { + "zip_code": 32164, + "latitude": 29.486141, + "longitude": -81.204491, + "city": "Palm Coast", + "state": "FL", + "county": "Flagler" + }, + { + "zip_code": 32168, + "latitude": 28.951931, + "longitude": -81.033705, + "city": "New Smyrna Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32169, + "latitude": 29.131714, + "longitude": -81.133519, + "city": "New Smyrna Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32170, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "New Smyrna Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32173, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Ormond Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32174, + "latitude": 29.30766, + "longitude": -81.177846, + "city": "Ormond Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32175, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Ormond Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32176, + "latitude": 29.335111, + "longitude": -81.249977, + "city": "Ormond Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32177, + "latitude": 29.611093, + "longitude": -81.785957, + "city": "Palatka", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32178, + "latitude": 29.644306, + "longitude": -81.668593, + "city": "Palatka", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32179, + "latitude": 29.086882, + "longitude": -81.905259, + "city": "Ocklawaha", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32180, + "latitude": 29.244623, + "longitude": -81.471982, + "city": "Pierson", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32181, + "latitude": 29.539751, + "longitude": -81.613183, + "city": "Pomona Park", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32182, + "latitude": 29.485625, + "longitude": -81.958901, + "city": "Orange Springs", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32183, + "latitude": 29.059673, + "longitude": -81.905068, + "city": "Ocklawaha", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32185, + "latitude": 29.736833, + "longitude": -81.957967, + "city": "Putnam Hall", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32187, + "latitude": 29.59344, + "longitude": -81.589937, + "city": "San Mateo", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32189, + "latitude": 29.536502, + "longitude": -81.633608, + "city": "Satsuma", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32190, + "latitude": 29.28926, + "longitude": -81.503244, + "city": "Seville", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32192, + "latitude": 29.326821, + "longitude": -82.104632, + "city": "Sparr", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32193, + "latitude": 29.463627, + "longitude": -81.640527, + "city": "Welaka", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32195, + "latitude": 29.006144, + "longitude": -81.87785, + "city": "Weirsdale", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32198, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Daytona Beach", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32201, + "latitude": 30.389438, + "longitude": -81.680806, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32202, + "latitude": 30.328439, + "longitude": -81.65602, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32203, + "latitude": 30.32281, + "longitude": -81.547044, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32204, + "latitude": 30.323539, + "longitude": -81.681068, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32205, + "latitude": 30.330938, + "longitude": -81.833074, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32206, + "latitude": 30.352488, + "longitude": -81.665918, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32207, + "latitude": 30.290839, + "longitude": -81.631465, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32208, + "latitude": 30.391988, + "longitude": -81.685569, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32209, + "latitude": 30.347838, + "longitude": -81.813774, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32210, + "latitude": 30.274539, + "longitude": -81.786671, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32211, + "latitude": 30.347139, + "longitude": -81.581959, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32212, + "latitude": 30.213189, + "longitude": -81.690016, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32214, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32215, + "latitude": 30.240689, + "longitude": -81.892982, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32216, + "latitude": 30.28434, + "longitude": -81.54074, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32217, + "latitude": 30.24058, + "longitude": -81.618814, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32218, + "latitude": 30.47548, + "longitude": -81.67602, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32219, + "latitude": 30.378738, + "longitude": -81.745368, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32220, + "latitude": 30.337236, + "longitude": -81.863176, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32221, + "latitude": 30.259438, + "longitude": -81.848561, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32222, + "latitude": 30.218289, + "longitude": -81.820628, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32223, + "latitude": 30.166809, + "longitude": -81.63425, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32224, + "latitude": 30.24359, + "longitude": -81.715976, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32225, + "latitude": 30.331905, + "longitude": -81.50091, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32226, + "latitude": 30.479666, + "longitude": -81.527063, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32227, + "latitude": 30.38024, + "longitude": -81.41602, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32228, + "latitude": 30.38239, + "longitude": -81.436859, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32229, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32230, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32231, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32232, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32233, + "latitude": 30.35239, + "longitude": -81.517761, + "city": "Atlantic Beach", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32234, + "latitude": 30.275711, + "longitude": -81.968614, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32235, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32236, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32237, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32238, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32239, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32240, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville Beach", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32241, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32244, + "latitude": 30.220302, + "longitude": -81.747414, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32245, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32246, + "latitude": 30.293273, + "longitude": -81.50916, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32247, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32250, + "latitude": 30.280143, + "longitude": -81.416506, + "city": "Jacksonville Beach", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32254, + "latitude": 30.357888, + "longitude": -81.674018, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32255, + "latitude": 30.287041, + "longitude": -81.389305, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32256, + "latitude": 30.213733, + "longitude": -81.539129, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32257, + "latitude": 30.191737, + "longitude": -81.603557, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32258, + "latitude": 30.156591, + "longitude": -81.560415, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32259, + "latitude": 29.877289, + "longitude": -81.561245, + "city": "Jacksonville", + "state": "FL", + "county": "Saint Johns" + }, + { + "zip_code": 32260, + "latitude": 29.937673, + "longitude": -81.420603, + "city": "Jacksonville", + "state": "FL", + "county": "Saint Johns" + }, + { + "zip_code": 32266, + "latitude": 30.315978, + "longitude": -81.408006, + "city": "Neptune Beach", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32267, + "latitude": 30.34494, + "longitude": -81.683107, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32276, + "latitude": 30.325739, + "longitude": -81.659017, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32277, + "latitude": 30.370439, + "longitude": -81.586394, + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32290, + "latitude": "", + "longitude": "", + "city": "Jacksonville", + "state": "FL", + "county": "Duval" + }, + { + "zip_code": 32301, + "latitude": 30.418514, + "longitude": -84.203379, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32302, + "latitude": 30.479347, + "longitude": -84.346204, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32303, + "latitude": 30.535698, + "longitude": -84.247698, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32304, + "latitude": 30.437954, + "longitude": -84.347459, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32305, + "latitude": 30.130775, + "longitude": -84.406629, + "city": "Tallahassee", + "state": "FL", + "county": "Wakulla" + }, + { + "zip_code": 32306, + "latitude": 30.442499, + "longitude": -84.29855, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32307, + "latitude": 30.42565, + "longitude": -84.287749, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32308, + "latitude": 30.556205, + "longitude": -84.176838, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32309, + "latitude": 30.514599, + "longitude": -84.188446, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32310, + "latitude": 30.364812, + "longitude": -84.460793, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32311, + "latitude": 30.433478, + "longitude": -84.135913, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32312, + "latitude": 30.572171, + "longitude": -84.21548, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32313, + "latitude": 30.479347, + "longitude": -84.346204, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32314, + "latitude": 30.479347, + "longitude": -84.346204, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32315, + "latitude": 30.479347, + "longitude": -84.346204, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32316, + "latitude": 30.479347, + "longitude": -84.346204, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32317, + "latitude": 30.479347, + "longitude": -84.346204, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32318, + "latitude": "", + "longitude": "", + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32320, + "latitude": 29.819333, + "longitude": -84.852937, + "city": "Apalachicola", + "state": "FL", + "county": "Franklin" + }, + { + "zip_code": 32321, + "latitude": 30.419284, + "longitude": -84.97804, + "city": "Bristol", + "state": "FL", + "county": "Liberty" + }, + { + "zip_code": 32322, + "latitude": 29.853775, + "longitude": -84.735838, + "city": "Carrabelle", + "state": "FL", + "county": "Franklin" + }, + { + "zip_code": 32323, + "latitude": 29.882567, + "longitude": -84.596417, + "city": "Lanark Village", + "state": "FL", + "county": "Franklin" + }, + { + "zip_code": 32324, + "latitude": 30.640548, + "longitude": -84.780758, + "city": "Chattahoochee", + "state": "FL", + "county": "Gadsden" + }, + { + "zip_code": 32326, + "latitude": 30.183372, + "longitude": -84.34906, + "city": "Crawfordville", + "state": "FL", + "county": "Wakulla" + }, + { + "zip_code": 32327, + "latitude": 30.165498, + "longitude": -84.430777, + "city": "Crawfordville", + "state": "FL", + "county": "Wakulla" + }, + { + "zip_code": 32328, + "latitude": 29.749548, + "longitude": -84.816238, + "city": "Eastpoint", + "state": "FL", + "county": "Franklin" + }, + { + "zip_code": 32329, + "latitude": 29.745526, + "longitude": -85.023947, + "city": "Apalachicola", + "state": "FL", + "county": "Franklin" + }, + { + "zip_code": 32330, + "latitude": 30.565334, + "longitude": -84.735972, + "city": "Greensboro", + "state": "FL", + "county": "Gadsden" + }, + { + "zip_code": 32331, + "latitude": 30.441092, + "longitude": -83.516133, + "city": "Greenville", + "state": "FL", + "county": "Madison" + }, + { + "zip_code": 32332, + "latitude": 30.589232, + "longitude": -84.564944, + "city": "Gretna", + "state": "FL", + "county": "Gadsden" + }, + { + "zip_code": 32333, + "latitude": 30.591733, + "longitude": -84.574009, + "city": "Havana", + "state": "FL", + "county": "Gadsden" + }, + { + "zip_code": 32334, + "latitude": 30.288896, + "longitude": -84.848444, + "city": "Hosford", + "state": "FL", + "county": "Liberty" + }, + { + "zip_code": 32335, + "latitude": 30.288896, + "longitude": -84.848444, + "city": "Sumatra", + "state": "FL", + "county": "Liberty" + }, + { + "zip_code": 32336, + "latitude": 30.298333, + "longitude": -83.900753, + "city": "Lamont", + "state": "FL", + "county": "Jefferson" + }, + { + "zip_code": 32337, + "latitude": 30.342161, + "longitude": -83.840177, + "city": "Lloyd", + "state": "FL", + "county": "Jefferson" + }, + { + "zip_code": 32340, + "latitude": 30.527068, + "longitude": -83.388742, + "city": "Madison", + "state": "FL", + "county": "Madison" + }, + { + "zip_code": 32341, + "latitude": 30.47756, + "longitude": -83.391393, + "city": "Madison", + "state": "FL", + "county": "Madison" + }, + { + "zip_code": 32343, + "latitude": 30.565524, + "longitude": -84.429835, + "city": "Midway", + "state": "FL", + "county": "Gadsden" + }, + { + "zip_code": 32344, + "latitude": 30.504216, + "longitude": -83.843279, + "city": "Monticello", + "state": "FL", + "county": "Jefferson" + }, + { + "zip_code": 32345, + "latitude": 30.342161, + "longitude": -83.840177, + "city": "Monticello", + "state": "FL", + "county": "Jefferson" + }, + { + "zip_code": 32346, + "latitude": 30.021079, + "longitude": -84.386837, + "city": "Panacea", + "state": "FL", + "county": "Wakulla" + }, + { + "zip_code": 32347, + "latitude": 29.931864, + "longitude": -83.55146, + "city": "Perry", + "state": "FL", + "county": "Taylor" + }, + { + "zip_code": 32348, + "latitude": 29.966454, + "longitude": -83.659371, + "city": "Perry", + "state": "FL", + "county": "Taylor" + }, + { + "zip_code": 32350, + "latitude": 30.584683, + "longitude": -83.328781, + "city": "Pinetta", + "state": "FL", + "county": "Madison" + }, + { + "zip_code": 32351, + "latitude": 30.555675, + "longitude": -84.63183, + "city": "Quincy", + "state": "FL", + "county": "Gadsden" + }, + { + "zip_code": 32352, + "latitude": 30.665715, + "longitude": -84.75363, + "city": "Quincy", + "state": "FL", + "county": "Gadsden" + }, + { + "zip_code": 32353, + "latitude": 30.549676, + "longitude": -84.606864, + "city": "Quincy", + "state": "FL", + "county": "Gadsden" + }, + { + "zip_code": 32355, + "latitude": 30.163062, + "longitude": -84.208346, + "city": "Saint Marks", + "state": "FL", + "county": "Wakulla" + }, + { + "zip_code": 32356, + "latitude": 29.853852, + "longitude": -83.442125, + "city": "Salem", + "state": "FL", + "county": "Taylor" + }, + { + "zip_code": 32357, + "latitude": 30.214672, + "longitude": -83.711084, + "city": "Shady Grove", + "state": "FL", + "county": "Taylor" + }, + { + "zip_code": 32358, + "latitude": 30.141958, + "longitude": -84.552965, + "city": "Sopchoppy", + "state": "FL", + "county": "Wakulla" + }, + { + "zip_code": 32359, + "latitude": 29.693191, + "longitude": -83.37638, + "city": "Steinhatchee", + "state": "FL", + "county": "Taylor" + }, + { + "zip_code": 32360, + "latitude": 30.288896, + "longitude": -84.848444, + "city": "Telogia", + "state": "FL", + "county": "Liberty" + }, + { + "zip_code": 32361, + "latitude": 30.342161, + "longitude": -83.840177, + "city": "Wacissa", + "state": "FL", + "county": "Jefferson" + }, + { + "zip_code": 32362, + "latitude": 30.319263, + "longitude": -84.267397, + "city": "Woodville", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32395, + "latitude": 30.479347, + "longitude": -84.346204, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32399, + "latitude": 30.449428, + "longitude": -84.29095, + "city": "Tallahassee", + "state": "FL", + "county": "Leon" + }, + { + "zip_code": 32401, + "latitude": 30.1922, + "longitude": -85.663027, + "city": "Panama City", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32402, + "latitude": 30.234451, + "longitude": -85.692035, + "city": "Panama City", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32403, + "latitude": 30.086746, + "longitude": -85.630745, + "city": "Panama City", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32404, + "latitude": 30.14697, + "longitude": -85.521142, + "city": "Panama City", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32405, + "latitude": 30.205121, + "longitude": -85.668892, + "city": "Panama City", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32406, + "latitude": 30.234451, + "longitude": -85.692035, + "city": "Panama City", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32407, + "latitude": 30.200682, + "longitude": -85.813624, + "city": "Panama City Beach", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32408, + "latitude": 30.165546, + "longitude": -85.711603, + "city": "Panama City", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32409, + "latitude": 30.311713, + "longitude": -85.692309, + "city": "Panama City", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32410, + "latitude": 29.939543, + "longitude": -85.409602, + "city": "Mexico Beach", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32411, + "latitude": 30.234451, + "longitude": -85.692035, + "city": "Panama City", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32412, + "latitude": 30.234451, + "longitude": -85.692035, + "city": "Panama City", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32413, + "latitude": 30.169689, + "longitude": -85.693681, + "city": "Panama City Beach", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32417, + "latitude": 30.243832, + "longitude": -85.916988, + "city": "Panama City", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32420, + "latitude": 30.641158, + "longitude": -85.375585, + "city": "Alford", + "state": "FL", + "county": "Jackson" + }, + { + "zip_code": 32421, + "latitude": 30.553171, + "longitude": -85.171315, + "city": "Altha", + "state": "FL", + "county": "Calhoun" + }, + { + "zip_code": 32422, + "latitude": 30.705557, + "longitude": -86.031448, + "city": "Argyle", + "state": "FL", + "county": "Walton" + }, + { + "zip_code": 32423, + "latitude": 30.940432, + "longitude": -85.063884, + "city": "Bascom", + "state": "FL", + "county": "Jackson" + }, + { + "zip_code": 32424, + "latitude": 30.442582, + "longitude": -85.046048, + "city": "Blountstown", + "state": "FL", + "county": "Calhoun" + }, + { + "zip_code": 32425, + "latitude": 30.875532, + "longitude": -85.684243, + "city": "Bonifay", + "state": "FL", + "county": "Holmes" + }, + { + "zip_code": 32426, + "latitude": 30.935644, + "longitude": -85.346802, + "city": "Campbellton", + "state": "FL", + "county": "Jackson" + }, + { + "zip_code": 32427, + "latitude": 30.707368, + "longitude": -85.793737, + "city": "Caryville", + "state": "FL", + "county": "Washington" + }, + { + "zip_code": 32428, + "latitude": 30.634834, + "longitude": -85.577618, + "city": "Chipley", + "state": "FL", + "county": "Washington" + }, + { + "zip_code": 32430, + "latitude": 30.403984, + "longitude": -85.161075, + "city": "Clarksville", + "state": "FL", + "county": "Calhoun" + }, + { + "zip_code": 32431, + "latitude": 30.801747, + "longitude": -85.287774, + "city": "Cottondale", + "state": "FL", + "county": "Jackson" + }, + { + "zip_code": 32432, + "latitude": 30.715807, + "longitude": -85.078384, + "city": "Cypress", + "state": "FL", + "county": "Jackson" + }, + { + "zip_code": 32433, + "latitude": 30.6393, + "longitude": -86.145909, + "city": "Defuniak Springs", + "state": "FL", + "county": "Walton" + }, + { + "zip_code": 32434, + "latitude": 30.762486, + "longitude": -86.342683, + "city": "Mossy Head", + "state": "FL", + "county": "Walton" + }, + { + "zip_code": 32435, + "latitude": 30.603777, + "longitude": -86.12111, + "city": "Defuniak Springs", + "state": "FL", + "county": "Walton" + }, + { + "zip_code": 32437, + "latitude": 30.451272, + "longitude": -85.872398, + "city": "Ebro", + "state": "FL", + "county": "Washington" + }, + { + "zip_code": 32438, + "latitude": 30.45245, + "longitude": -85.491959, + "city": "Fountain", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32439, + "latitude": 30.561269, + "longitude": -86.1706, + "city": "Freeport", + "state": "FL", + "county": "Walton" + }, + { + "zip_code": 32440, + "latitude": 30.882994, + "longitude": -85.361113, + "city": "Graceville", + "state": "FL", + "county": "Jackson" + }, + { + "zip_code": 32442, + "latitude": 30.719031, + "longitude": -85.083627, + "city": "Grand Ridge", + "state": "FL", + "county": "Jackson" + }, + { + "zip_code": 32443, + "latitude": 30.859204, + "longitude": -85.14758, + "city": "Greenwood", + "state": "FL", + "county": "Jackson" + }, + { + "zip_code": 32444, + "latitude": 30.094456, + "longitude": -85.537104, + "city": "Lynn Haven", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32445, + "latitude": 30.963462, + "longitude": -85.187828, + "city": "Malone", + "state": "FL", + "county": "Jackson" + }, + { + "zip_code": 32446, + "latitude": 30.799574, + "longitude": -85.229347, + "city": "Marianna", + "state": "FL", + "county": "Jackson" + }, + { + "zip_code": 32447, + "latitude": 30.760299, + "longitude": -85.202225, + "city": "Marianna", + "state": "FL", + "county": "Jackson" + }, + { + "zip_code": 32448, + "latitude": 30.674946, + "longitude": -85.212174, + "city": "Marianna", + "state": "FL", + "county": "Jackson" + }, + { + "zip_code": 32449, + "latitude": 30.403984, + "longitude": -85.161075, + "city": "Kinard", + "state": "FL", + "county": "Calhoun" + }, + { + "zip_code": 32452, + "latitude": 30.849972, + "longitude": -85.768022, + "city": "Noma", + "state": "FL", + "county": "Holmes" + }, + { + "zip_code": 32454, + "latitude": 30.603777, + "longitude": -86.12111, + "city": "Point Washington", + "state": "FL", + "county": "Walton" + }, + { + "zip_code": 32455, + "latitude": 30.845927, + "longitude": -85.930198, + "city": "Ponce De Leon", + "state": "FL", + "county": "Holmes" + }, + { + "zip_code": 32456, + "latitude": 29.9323, + "longitude": -85.235414, + "city": "Port Saint Joe", + "state": "FL", + "county": "Gulf" + }, + { + "zip_code": 32457, + "latitude": 29.902484, + "longitude": -85.242169, + "city": "Port Saint Joe", + "state": "FL", + "county": "Gulf" + }, + { + "zip_code": 32459, + "latitude": 30.513484, + "longitude": -86.160893, + "city": "Santa Rosa Beach", + "state": "FL", + "county": "Walton" + }, + { + "zip_code": 32460, + "latitude": 30.777609, + "longitude": -84.955871, + "city": "Sneads", + "state": "FL", + "county": "Jackson" + }, + { + "zip_code": 32461, + "latitude": 30.252531, + "longitude": -85.942389, + "city": "Rosemary Bch", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32462, + "latitude": 30.591268, + "longitude": -85.739452, + "city": "Vernon", + "state": "FL", + "county": "Washington" + }, + { + "zip_code": 32463, + "latitude": 30.639134, + "longitude": -85.587862, + "city": "Wausau", + "state": "FL", + "county": "Washington" + }, + { + "zip_code": 32464, + "latitude": 30.872298, + "longitude": -85.929742, + "city": "Westville", + "state": "FL", + "county": "Holmes" + }, + { + "zip_code": 32465, + "latitude": 30.025584, + "longitude": -85.215173, + "city": "Wewahitchka", + "state": "FL", + "county": "Gulf" + }, + { + "zip_code": 32466, + "latitude": 30.383156, + "longitude": -85.51506, + "city": "Youngstown", + "state": "FL", + "county": "Bay" + }, + { + "zip_code": 32501, + "latitude": 30.424838, + "longitude": -87.256471, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32502, + "latitude": 30.474288, + "longitude": -87.225691, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32503, + "latitude": 30.462646, + "longitude": -87.216523, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32504, + "latitude": 30.488696, + "longitude": -87.214171, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32505, + "latitude": 30.457046, + "longitude": -87.257722, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32506, + "latitude": 30.391835, + "longitude": -87.348931, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32507, + "latitude": 30.358927, + "longitude": -87.380931, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32508, + "latitude": 30.359464, + "longitude": -87.312205, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32509, + "latitude": 30.464324, + "longitude": -87.340262, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32511, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32512, + "latitude": 30.394327, + "longitude": -87.299129, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32513, + "latitude": 30.557064, + "longitude": -87.259592, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32514, + "latitude": 30.537068, + "longitude": -87.241202, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32516, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32520, + "latitude": 30.412377, + "longitude": -87.203543, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32521, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32522, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32523, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32524, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32526, + "latitude": 30.493102, + "longitude": -87.359621, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32530, + "latitude": 30.598564, + "longitude": -87.031496, + "city": "Bagdad", + "state": "FL", + "county": "Santa Rosa" + }, + { + "zip_code": 32531, + "latitude": 30.85525, + "longitude": -86.674139, + "city": "Baker", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32533, + "latitude": 30.665519, + "longitude": -87.350295, + "city": "Cantonment", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32534, + "latitude": 30.534235, + "longitude": -87.292335, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32535, + "latitude": 30.955907, + "longitude": -87.364552, + "city": "Century", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32536, + "latitude": 30.713591, + "longitude": -86.557478, + "city": "Crestview", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32537, + "latitude": 30.741965, + "longitude": -86.655208, + "city": "Milligan", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32538, + "latitude": 30.970853, + "longitude": -86.311093, + "city": "Paxton", + "state": "FL", + "county": "Walton" + }, + { + "zip_code": 32539, + "latitude": 30.777294, + "longitude": -86.483154, + "city": "Crestview", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32540, + "latitude": 30.661155, + "longitude": -86.594479, + "city": "Destin", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32541, + "latitude": 30.582064, + "longitude": -86.57345, + "city": "Destin", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32542, + "latitude": 30.539331, + "longitude": -86.608737, + "city": "Eglin Afb", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32544, + "latitude": 30.422926, + "longitude": -86.698525, + "city": "Hurlburt Field", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32547, + "latitude": 30.448726, + "longitude": -86.62545, + "city": "Fort Walton Beach", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32548, + "latitude": 30.42057, + "longitude": -86.628607, + "city": "Fort Walton Beach", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32549, + "latitude": 30.661155, + "longitude": -86.594479, + "city": "Fort Walton Beach", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32550, + "latitude": "", + "longitude": "", + "city": "Destin", + "state": "FL", + "county": "Walton" + }, + { + "zip_code": 32559, + "latitude": 30.356287, + "longitude": -87.277307, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32560, + "latitude": 30.581825, + "longitude": -87.292918, + "city": "Gonzalez", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32561, + "latitude": 30.669276, + "longitude": -87.060696, + "city": "Gulf Breeze", + "state": "FL", + "county": "Santa Rosa" + }, + { + "zip_code": 32562, + "latitude": 30.659159, + "longitude": -87.04972, + "city": "Gulf Breeze", + "state": "FL", + "county": "Santa Rosa" + }, + { + "zip_code": 32563, + "latitude": 30.659159, + "longitude": -87.04972, + "city": "Gulf Breeze", + "state": "FL", + "county": "Santa Rosa" + }, + { + "zip_code": 32564, + "latitude": 30.741616, + "longitude": -86.719764, + "city": "Holt", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32565, + "latitude": 30.88276, + "longitude": -87.102495, + "city": "Jay", + "state": "FL", + "county": "Santa Rosa" + }, + { + "zip_code": 32566, + "latitude": 30.427685, + "longitude": -86.927118, + "city": "Navarre", + "state": "FL", + "county": "Santa Rosa" + }, + { + "zip_code": 32567, + "latitude": 30.715985, + "longitude": -86.512784, + "city": "Laurel Hill", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32568, + "latitude": 30.868646, + "longitude": -87.453852, + "city": "Mc David", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32569, + "latitude": 30.659587, + "longitude": -86.602385, + "city": "Mary Esther", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32570, + "latitude": 30.792885, + "longitude": -86.985834, + "city": "Milton", + "state": "FL", + "county": "Santa Rosa" + }, + { + "zip_code": 32571, + "latitude": 30.669808, + "longitude": -87.179447, + "city": "Milton", + "state": "FL", + "county": "Santa Rosa" + }, + { + "zip_code": 32572, + "latitude": 30.659159, + "longitude": -87.04972, + "city": "Milton", + "state": "FL", + "county": "Santa Rosa" + }, + { + "zip_code": 32573, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32574, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32575, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32576, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32577, + "latitude": 30.690231, + "longitude": -87.385248, + "city": "Molino", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32578, + "latitude": 30.687036, + "longitude": -86.566325, + "city": "Niceville", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32579, + "latitude": 30.581826, + "longitude": -86.581628, + "city": "Shalimar", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32580, + "latitude": 30.50821, + "longitude": -86.49706, + "city": "Valparaiso", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32581, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32582, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32583, + "latitude": 30.577638, + "longitude": -86.966835, + "city": "Milton", + "state": "FL", + "county": "Santa Rosa" + }, + { + "zip_code": 32588, + "latitude": 30.661155, + "longitude": -86.594479, + "city": "Niceville", + "state": "FL", + "county": "Okaloosa" + }, + { + "zip_code": 32589, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32590, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32591, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32592, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32593, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32594, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32595, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32596, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32597, + "latitude": 30.529739, + "longitude": -87.275693, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32598, + "latitude": 30.61428, + "longitude": -87.275772, + "city": "Pensacola", + "state": "FL", + "county": "Escambia" + }, + { + "zip_code": 32601, + "latitude": 29.68041, + "longitude": -82.345739, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32602, + "latitude": 29.629887, + "longitude": -82.396567, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32603, + "latitude": 29.718807, + "longitude": -82.353874, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32604, + "latitude": 29.573293, + "longitude": -82.397904, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32605, + "latitude": 29.677899, + "longitude": -82.466362, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32606, + "latitude": 29.697133, + "longitude": -82.403746, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32607, + "latitude": 29.653042, + "longitude": -82.440667, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32608, + "latitude": 29.575246, + "longitude": -82.407395, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32609, + "latitude": 29.761371, + "longitude": -82.398315, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32610, + "latitude": 29.681312, + "longitude": -82.353862, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32611, + "latitude": 29.681312, + "longitude": -82.353862, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32612, + "latitude": 29.681312, + "longitude": -82.353862, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32613, + "latitude": 29.681312, + "longitude": -82.353862, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32614, + "latitude": 29.681312, + "longitude": -82.353862, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32615, + "latitude": 29.813456, + "longitude": -82.472049, + "city": "Alachua", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32616, + "latitude": 29.792034, + "longitude": -82.495964, + "city": "Alachua", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32617, + "latitude": 29.337795, + "longitude": -82.082367, + "city": "Anthony", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32618, + "latitude": 29.569316, + "longitude": -82.506445, + "city": "Archer", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32619, + "latitude": 29.749093, + "longitude": -82.865081, + "city": "Bell", + "state": "FL", + "county": "Gilchrist" + }, + { + "zip_code": 32621, + "latitude": 29.431045, + "longitude": -82.549823, + "city": "Bronson", + "state": "FL", + "county": "Levy" + }, + { + "zip_code": 32622, + "latitude": 29.905008, + "longitude": -82.298477, + "city": "Brooker", + "state": "FL", + "county": "Bradford" + }, + { + "zip_code": 32625, + "latitude": 29.188034, + "longitude": -82.991541, + "city": "Cedar Key", + "state": "FL", + "county": "Levy" + }, + { + "zip_code": 32626, + "latitude": 29.389639, + "longitude": -82.834776, + "city": "Chiefland", + "state": "FL", + "county": "Levy" + }, + { + "zip_code": 32627, + "latitude": 29.681312, + "longitude": -82.353862, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32628, + "latitude": 29.680616, + "longitude": -83.089669, + "city": "Cross City", + "state": "FL", + "county": "Dixie" + }, + { + "zip_code": 32631, + "latitude": 29.730413, + "longitude": -82.097095, + "city": "Earleton", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32633, + "latitude": 29.681312, + "longitude": -82.353862, + "city": "Evinston", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32634, + "latitude": 29.35089, + "longitude": -82.27648, + "city": "Fairfield", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32635, + "latitude": 29.681312, + "longitude": -82.353862, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32639, + "latitude": 29.24467, + "longitude": -82.740173, + "city": "Gulf Hammock", + "state": "FL", + "county": "Levy" + }, + { + "zip_code": 32640, + "latitude": 29.642025, + "longitude": -82.327515, + "city": "Hawthorne", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32641, + "latitude": 29.682383, + "longitude": -82.201383, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32643, + "latitude": 29.740704, + "longitude": -82.366367, + "city": "High Springs", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32644, + "latitude": 29.460221, + "longitude": -82.855334, + "city": "Chiefland", + "state": "FL", + "county": "Levy" + }, + { + "zip_code": 32648, + "latitude": 29.538213, + "longitude": -83.19261, + "city": "Horseshoe Beach", + "state": "FL", + "county": "Dixie" + }, + { + "zip_code": 32653, + "latitude": 29.772819, + "longitude": -82.378158, + "city": "Gainesville", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32654, + "latitude": 29.681312, + "longitude": -82.353862, + "city": "Island Grove", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32655, + "latitude": 29.817457, + "longitude": -82.60064, + "city": "High Springs", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32656, + "latitude": 29.813555, + "longitude": -81.946556, + "city": "Keystone Heights", + "state": "FL", + "county": "Clay" + }, + { + "zip_code": 32658, + "latitude": 29.826139, + "longitude": -82.416024, + "city": "La Crosse", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32662, + "latitude": 29.681312, + "longitude": -82.353862, + "city": "Lochloosa", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32663, + "latitude": 29.342404, + "longitude": -82.212649, + "city": "Lowell", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32664, + "latitude": 29.437972, + "longitude": -82.229534, + "city": "Mc Intosh", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32666, + "latitude": 29.697588, + "longitude": -81.97397, + "city": "Melrose", + "state": "FL", + "county": "Putnam" + }, + { + "zip_code": 32667, + "latitude": 29.565077, + "longitude": -82.417182, + "city": "Micanopy", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32668, + "latitude": 29.328402, + "longitude": -82.703766, + "city": "Morriston", + "state": "FL", + "county": "Levy" + }, + { + "zip_code": 32669, + "latitude": 29.687249, + "longitude": -82.564624, + "city": "Newberry", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32680, + "latitude": 29.669866, + "longitude": -83.004951, + "city": "Old Town", + "state": "FL", + "county": "Dixie" + }, + { + "zip_code": 32681, + "latitude": 29.428088, + "longitude": -82.24489, + "city": "Orange Lake", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32683, + "latitude": 29.310929, + "longitude": -82.794469, + "city": "Otter Creek", + "state": "FL", + "county": "Levy" + }, + { + "zip_code": 32686, + "latitude": 29.362674, + "longitude": -82.254723, + "city": "Reddick", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 32692, + "latitude": 29.329518, + "longitude": -83.139957, + "city": "Suwannee", + "state": "FL", + "county": "Dixie" + }, + { + "zip_code": 32693, + "latitude": 29.674633, + "longitude": -82.811678, + "city": "Trenton", + "state": "FL", + "county": "Gilchrist" + }, + { + "zip_code": 32694, + "latitude": 29.7968, + "longitude": -82.156228, + "city": "Waldo", + "state": "FL", + "county": "Alachua" + }, + { + "zip_code": 32696, + "latitude": 29.354149, + "longitude": -82.635652, + "city": "Williston", + "state": "FL", + "county": "Levy" + }, + { + "zip_code": 32697, + "latitude": 29.931522, + "longitude": -82.425518, + "city": "Worthington Springs", + "state": "FL", + "county": "Union" + }, + { + "zip_code": 32701, + "latitude": 28.666625, + "longitude": -81.365039, + "city": "Altamonte Springs", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32702, + "latitude": 29.059052, + "longitude": -81.581964, + "city": "Altoona", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32703, + "latitude": 28.635425, + "longitude": -81.488843, + "city": "Apopka", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32704, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Apopka", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32706, + "latitude": 28.966351, + "longitude": -81.237061, + "city": "Cassadaga", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32707, + "latitude": 28.661468, + "longitude": -81.313989, + "city": "Casselberry", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32708, + "latitude": 28.690114, + "longitude": -81.222547, + "city": "Winter Springs", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32709, + "latitude": 28.486379, + "longitude": -81.009032, + "city": "Christmas", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32710, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Clarcona", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32712, + "latitude": 28.731322, + "longitude": -81.537602, + "city": "Apopka", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32713, + "latitude": 28.889107, + "longitude": -81.319985, + "city": "Debary", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32714, + "latitude": 28.688256, + "longitude": -81.280369, + "city": "Altamonte Springs", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32715, + "latitude": 28.744752, + "longitude": -81.22328, + "city": "Altamonte Springs", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32716, + "latitude": 28.744752, + "longitude": -81.22328, + "city": "Altamonte Springs", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32718, + "latitude": 28.744752, + "longitude": -81.22328, + "city": "Casselberry", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32719, + "latitude": 28.744752, + "longitude": -81.22328, + "city": "Winter Springs", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32720, + "latitude": 29.07198, + "longitude": -81.403355, + "city": "Deland", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32721, + "latitude": 28.997288, + "longitude": -81.299521, + "city": "Deland", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32722, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Glenwood", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32724, + "latitude": 29.056227, + "longitude": -81.096461, + "city": "Deland", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32725, + "latitude": 28.900274, + "longitude": -81.245074, + "city": "Deltona", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32726, + "latitude": 28.710129, + "longitude": -81.683696, + "city": "Eustis", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32727, + "latitude": 28.855517, + "longitude": -81.674147, + "city": "Eustis", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32728, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Deltona", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32730, + "latitude": 28.651275, + "longitude": -81.34184, + "city": "Casselberry", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32732, + "latitude": 28.751078, + "longitude": -81.107884, + "city": "Geneva", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32733, + "latitude": 28.613308, + "longitude": -81.258108, + "city": "Goldenrod", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32735, + "latitude": 28.904429, + "longitude": -81.743634, + "city": "Grand Island", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32736, + "latitude": 28.910207, + "longitude": -81.523516, + "city": "Eustis", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32738, + "latitude": 28.939718, + "longitude": -81.233099, + "city": "Deltona", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32739, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Deltona", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32744, + "latitude": 28.988027, + "longitude": -81.220829, + "city": "Lake Helen", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32746, + "latitude": 28.7577, + "longitude": -81.350772, + "city": "Lake Mary", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32747, + "latitude": 28.827219, + "longitude": -81.332888, + "city": "Lake Monroe", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32750, + "latitude": 28.705924, + "longitude": -81.340639, + "city": "Longwood", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32751, + "latitude": 28.625476, + "longitude": -81.36459, + "city": "Maitland", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32752, + "latitude": 28.744752, + "longitude": -81.22328, + "city": "Longwood", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32753, + "latitude": "", + "longitude": "", + "city": "Debary", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32754, + "latitude": 28.699314, + "longitude": -80.895344, + "city": "Mims", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32756, + "latitude": 28.811078, + "longitude": -81.653642, + "city": "Mount Dora", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32757, + "latitude": 28.773952, + "longitude": -81.643943, + "city": "Mount Dora", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32759, + "latitude": 28.853312, + "longitude": -80.993118, + "city": "Oak Hill", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32762, + "latitude": 28.744752, + "longitude": -81.22328, + "city": "Oviedo", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32763, + "latitude": 28.939904, + "longitude": -81.301856, + "city": "Orange City", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32764, + "latitude": 28.854824, + "longitude": -81.084188, + "city": "Osteen", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32765, + "latitude": 28.666574, + "longitude": -81.207353, + "city": "Oviedo", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32766, + "latitude": 28.660674, + "longitude": -81.113444, + "city": "Oviedo", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32767, + "latitude": 28.981525, + "longitude": -81.482049, + "city": "Paisley", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32768, + "latitude": 28.698542, + "longitude": -81.569764, + "city": "Plymouth", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32771, + "latitude": 28.793491, + "longitude": -81.299169, + "city": "Sanford", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32772, + "latitude": 28.80722, + "longitude": -81.250236, + "city": "Sanford", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32773, + "latitude": 28.754582, + "longitude": -81.26418, + "city": "Sanford", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32774, + "latitude": 29.022729, + "longitude": -81.172169, + "city": "Orange City", + "state": "FL", + "county": "Volusia" + }, + { + "zip_code": 32775, + "latitude": 28.77016, + "longitude": -80.872042, + "city": "Scottsmoor", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32776, + "latitude": 28.831447, + "longitude": -81.505121, + "city": "Sorrento", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32777, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Tangerine", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32778, + "latitude": 28.767762, + "longitude": -81.725272, + "city": "Tavares", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32779, + "latitude": 28.72449, + "longitude": -81.294452, + "city": "Longwood", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32780, + "latitude": 28.548877, + "longitude": -80.853421, + "city": "Titusville", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32781, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Titusville", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32782, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Titusville", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32783, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Titusville", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32784, + "latitude": 28.925371, + "longitude": -81.680144, + "city": "Umatilla", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 32789, + "latitude": 28.602327, + "longitude": -81.35874, + "city": "Winter Park", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32790, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Winter Park", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32791, + "latitude": 28.744752, + "longitude": -81.22328, + "city": "Longwood", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32792, + "latitude": 28.597377, + "longitude": -81.303592, + "city": "Winter Park", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32793, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Winter Park", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32794, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Maitland", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32795, + "latitude": 28.744752, + "longitude": -81.22328, + "city": "Lake Mary", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32796, + "latitude": 28.509529, + "longitude": -80.831574, + "city": "Titusville", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32798, + "latitude": 28.717472, + "longitude": -81.583045, + "city": "Zellwood", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32799, + "latitude": 28.744752, + "longitude": -81.22328, + "city": "Mid Florida", + "state": "FL", + "county": "Seminole" + }, + { + "zip_code": 32801, + "latitude": 28.545179, + "longitude": -81.373291, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32802, + "latitude": 28.519024, + "longitude": -81.343903, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32803, + "latitude": 28.556479, + "longitude": -81.33664, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32804, + "latitude": 28.575428, + "longitude": -81.395503, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32805, + "latitude": 28.52823, + "longitude": -81.408642, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32806, + "latitude": 28.51103, + "longitude": -81.357841, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32807, + "latitude": 28.551479, + "longitude": -81.30514, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32808, + "latitude": 28.580344, + "longitude": -81.439562, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32809, + "latitude": 28.463682, + "longitude": -81.394771, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32810, + "latitude": 28.59965, + "longitude": -81.433892, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32811, + "latitude": 28.51633, + "longitude": -81.451559, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32812, + "latitude": 28.470392, + "longitude": -81.386077, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32814, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32815, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Orlando", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32816, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32817, + "latitude": 28.589077, + "longitude": -81.227652, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32818, + "latitude": 28.594747, + "longitude": -81.496741, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32819, + "latitude": 28.452157, + "longitude": -81.46784, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32820, + "latitude": 28.572527, + "longitude": -81.121885, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32821, + "latitude": 28.385285, + "longitude": -81.472748, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32822, + "latitude": 28.494385, + "longitude": -81.29024, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32824, + "latitude": 28.43522, + "longitude": -81.349743, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32825, + "latitude": 28.535094, + "longitude": -81.220237, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32826, + "latitude": 28.510802, + "longitude": -81.34349, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32827, + "latitude": 28.399634, + "longitude": -81.290418, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32828, + "latitude": 28.529582, + "longitude": -81.175502, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32829, + "latitude": 28.467101, + "longitude": -81.241651, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32830, + "latitude": 28.385549, + "longitude": -81.505894, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32831, + "latitude": 28.465553, + "longitude": -81.151009, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32832, + "latitude": 28.388834, + "longitude": -81.175651, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32833, + "latitude": 28.508779, + "longitude": -81.070334, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32834, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32835, + "latitude": 28.52038, + "longitude": -81.483543, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32836, + "latitude": 28.411534, + "longitude": -81.525044, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32837, + "latitude": 28.390234, + "longitude": -81.433155, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32839, + "latitude": 28.489931, + "longitude": -81.406142, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32853, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32854, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32855, + "latitude": 28.550028, + "longitude": -81.104185, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32856, + "latitude": 28.548379, + "longitude": -81.420092, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32857, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32858, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32859, + "latitude": 28.442926, + "longitude": -81.402613, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32860, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32861, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32862, + "latitude": 28.417368, + "longitude": -81.332763, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32867, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32868, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32869, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32872, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32877, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32878, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32886, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32887, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32890, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32891, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32893, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32897, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32898, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Orlando", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 32899, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Orlando", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32901, + "latitude": 28.012189, + "longitude": -80.585519, + "city": "Melbourne", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32902, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Melbourne", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32903, + "latitude": 28.107943, + "longitude": -80.579625, + "city": "Indialantic", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32904, + "latitude": 28.051946, + "longitude": -80.739647, + "city": "Melbourne", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32905, + "latitude": 27.96861, + "longitude": -80.611642, + "city": "Palm Bay", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32906, + "latitude": 28.067128, + "longitude": -80.650341, + "city": "Palm Bay", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32907, + "latitude": 28.017577, + "longitude": -80.659539, + "city": "Palm Bay", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32908, + "latitude": 27.95504, + "longitude": -80.692096, + "city": "Palm Bay", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32909, + "latitude": 27.933086, + "longitude": -80.638504, + "city": "Palm Bay", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32910, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Palm Bay", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32911, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Palm Bay", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32912, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Melbourne", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32919, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Melbourne", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32920, + "latitude": 28.394642, + "longitude": -80.614323, + "city": "Cape Canaveral", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32922, + "latitude": 28.315086, + "longitude": -80.723445, + "city": "Cocoa", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32923, + "latitude": 28.427535, + "longitude": -80.828991, + "city": "Cocoa", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32924, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Cocoa", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32925, + "latitude": 28.174349, + "longitude": -80.583979, + "city": "Patrick Afb", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32926, + "latitude": 28.386561, + "longitude": -80.799662, + "city": "Cocoa", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32927, + "latitude": 28.45663, + "longitude": -80.797847, + "city": "Cocoa", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32931, + "latitude": 28.325685, + "longitude": -80.623424, + "city": "Cocoa Beach", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32932, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Cocoa Beach", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32934, + "latitude": 28.088526, + "longitude": -80.62782, + "city": "Melbourne", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32935, + "latitude": 28.210733, + "longitude": -80.680583, + "city": "Melbourne", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32936, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Melbourne", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32937, + "latitude": 28.167091, + "longitude": -80.615835, + "city": "Satellite Beach", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32940, + "latitude": 28.216262, + "longitude": -80.697829, + "city": "Melbourne", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32941, + "latitude": 27.924577, + "longitude": -80.523463, + "city": "Melbourne", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32948, + "latitude": 27.775251, + "longitude": -80.609403, + "city": "Fellsmere", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32949, + "latitude": 27.936416, + "longitude": -80.555597, + "city": "Grant", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32950, + "latitude": 28.072093, + "longitude": -80.596021, + "city": "Malabar", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32951, + "latitude": 27.953124, + "longitude": -80.634, + "city": "Melbourne Beach", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32952, + "latitude": 28.276389, + "longitude": -80.656825, + "city": "Merritt Island", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32953, + "latitude": 28.388797, + "longitude": -80.730088, + "city": "Merritt Island", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32954, + "latitude": 28.22571, + "longitude": -80.673356, + "city": "Merritt Island", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32955, + "latitude": 28.28714, + "longitude": -80.723065, + "city": "Rockledge", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32956, + "latitude": 28.329785, + "longitude": -80.732327, + "city": "Rockledge", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32957, + "latitude": 27.709049, + "longitude": -80.572557, + "city": "Roseland", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32958, + "latitude": 27.799123, + "longitude": -80.483098, + "city": "Sebastian", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32959, + "latitude": 28.306726, + "longitude": -80.686159, + "city": "Sharpes", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32960, + "latitude": 27.638005, + "longitude": -80.40294, + "city": "Vero Beach", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32961, + "latitude": 27.617473, + "longitude": -80.423083, + "city": "Vero Beach", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32962, + "latitude": 27.658291, + "longitude": -80.476926, + "city": "Vero Beach", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32963, + "latitude": 27.689785, + "longitude": -80.375726, + "city": "Vero Beach", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32964, + "latitude": 27.709049, + "longitude": -80.572557, + "city": "Vero Beach", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32965, + "latitude": 27.709049, + "longitude": -80.572557, + "city": "Vero Beach", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32966, + "latitude": 27.697229, + "longitude": -80.631131, + "city": "Vero Beach", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32967, + "latitude": 27.696114, + "longitude": -80.467458, + "city": "Vero Beach", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32968, + "latitude": 27.588524, + "longitude": -80.525331, + "city": "Vero Beach", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32969, + "latitude": 27.709049, + "longitude": -80.572557, + "city": "Vero Beach", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32970, + "latitude": 27.752905, + "longitude": -80.474297, + "city": "Wabasso", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32971, + "latitude": 27.709049, + "longitude": -80.572557, + "city": "Winter Beach", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 32976, + "latitude": 27.867945, + "longitude": -80.541647, + "city": "Sebastian", + "state": "FL", + "county": "Brevard" + }, + { + "zip_code": 32978, + "latitude": 27.709049, + "longitude": -80.572557, + "city": "Sebastian", + "state": "FL", + "county": "Indian River" + }, + { + "zip_code": 33001, + "latitude": 24.83059, + "longitude": -80.804872, + "city": "Long Key", + "state": "FL", + "county": "Monroe" + }, + { + "zip_code": 33002, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Hialeah", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33004, + "latitude": 26.062416, + "longitude": -80.159667, + "city": "Dania", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33008, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Hallandale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33009, + "latitude": 25.992118, + "longitude": -80.146701, + "city": "Hallandale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33010, + "latitude": 25.829024, + "longitude": -80.286355, + "city": "Hialeah", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33011, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Hialeah", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33012, + "latitude": 25.859523, + "longitude": -80.22387, + "city": "Hialeah", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33013, + "latitude": 25.860023, + "longitude": -80.271571, + "city": "Hialeah", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33014, + "latitude": 25.910972, + "longitude": -80.290572, + "city": "Hialeah", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33015, + "latitude": 25.909923, + "longitude": -80.361224, + "city": "Hialeah", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33016, + "latitude": 25.891822, + "longitude": -80.372824, + "city": "Hialeah", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33017, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Hialeah", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33018, + "latitude": 25.909809, + "longitude": -80.388874, + "city": "Hialeah", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33019, + "latitude": 26.091514, + "longitude": -80.192966, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33020, + "latitude": 26.022217, + "longitude": -80.155017, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33021, + "latitude": 26.023267, + "longitude": -80.211942, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33022, + "latitude": 26.013368, + "longitude": -80.144217, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33023, + "latitude": 25.996668, + "longitude": -80.257444, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33024, + "latitude": 26.029582, + "longitude": -80.248916, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33025, + "latitude": 26.142322, + "longitude": -80.231595, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33026, + "latitude": 26.153819, + "longitude": -80.25357, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33027, + "latitude": 26.039737, + "longitude": -80.365429, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33028, + "latitude": 26.004868, + "longitude": -80.313445, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33029, + "latitude": 26.097815, + "longitude": -80.319019, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33030, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Homestead", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33031, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Homestead", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33032, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Homestead", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33033, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Homestead", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33034, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Homestead", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33035, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Homestead", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33036, + "latitude": 24.90169, + "longitude": -80.682667, + "city": "Islamorada", + "state": "FL", + "county": "Monroe" + }, + { + "zip_code": 33037, + "latitude": 24.963509, + "longitude": -80.961294, + "city": "Key Largo", + "state": "FL", + "county": "Monroe" + }, + { + "zip_code": 33039, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Homestead", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33040, + "latitude": 24.655692, + "longitude": -81.382372, + "city": "Key West", + "state": "FL", + "county": "Monroe" + }, + { + "zip_code": 33041, + "latitude": 25.100957, + "longitude": -81.568862, + "city": "Key West", + "state": "FL", + "county": "Monroe" + }, + { + "zip_code": 33042, + "latitude": 24.860066, + "longitude": -81.003803, + "city": "Summerland Key", + "state": "FL", + "county": "Monroe" + }, + { + "zip_code": 33043, + "latitude": 24.687493, + "longitude": -81.249423, + "city": "Big Pine Key", + "state": "FL", + "county": "Monroe" + }, + { + "zip_code": 33044, + "latitude": 24.664649, + "longitude": -81.565319, + "city": "Sugarloaf Shores", + "state": "FL", + "county": "Monroe" + }, + { + "zip_code": 33045, + "latitude": 25.100957, + "longitude": -81.568862, + "city": "Key West", + "state": "FL", + "county": "Monroe" + }, + { + "zip_code": 33050, + "latitude": 24.687724, + "longitude": -81.294685, + "city": "Marathon", + "state": "FL", + "county": "Monroe" + }, + { + "zip_code": 33051, + "latitude": 24.72339, + "longitude": -81.020281, + "city": "Key Colony Beach", + "state": "FL", + "county": "Monroe" + }, + { + "zip_code": 33052, + "latitude": 24.723283, + "longitude": -81.063249, + "city": "Marathon Shores", + "state": "FL", + "county": "Monroe" + }, + { + "zip_code": 33054, + "latitude": 25.924821, + "longitude": -80.324273, + "city": "Opa Locka", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33055, + "latitude": 25.94762, + "longitude": -80.277821, + "city": "Opa Locka", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33056, + "latitude": 25.94837, + "longitude": -80.24792, + "city": "Opa Locka", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33060, + "latitude": 26.240059, + "longitude": -80.139816, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33061, + "latitude": 26.253909, + "longitude": -80.134216, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33062, + "latitude": 26.178661, + "longitude": -80.144873, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33063, + "latitude": 26.267436, + "longitude": -80.209176, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33064, + "latitude": 26.22116, + "longitude": -80.125066, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33065, + "latitude": 26.22131, + "longitude": -80.26137, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33066, + "latitude": 26.251906, + "longitude": -80.165406, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33067, + "latitude": 26.303307, + "longitude": -80.241539, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33068, + "latitude": 26.154262, + "longitude": -80.208569, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33069, + "latitude": 26.247379, + "longitude": -80.182393, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33070, + "latitude": 24.925108, + "longitude": -80.713465, + "city": "Tavernier", + "state": "FL", + "county": "Monroe" + }, + { + "zip_code": 33071, + "latitude": 26.135692, + "longitude": -80.253284, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33072, + "latitude": 26.233459, + "longitude": -80.092365, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33073, + "latitude": 26.298352, + "longitude": -80.180078, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33074, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33075, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33076, + "latitude": 26.221054, + "longitude": -80.313415, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33077, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33081, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33082, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Pembroke Pines", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33083, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33084, + "latitude": 26.289057, + "longitude": -80.129816, + "city": "Hollywood", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33090, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Homestead", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33092, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Homestead", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33093, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33097, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Pompano Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33101, + "latitude": 25.779076, + "longitude": -80.19782, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33102, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33107, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33109, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami Beach", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33110, + "latitude": 25.846874, + "longitude": -80.20827, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33111, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33112, + "latitude": "", + "longitude": "", + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33114, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33116, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33119, + "latitude": 25.784526, + "longitude": -80.131967, + "city": "Miami Beach", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33121, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33122, + "latitude": 25.800075, + "longitude": -80.280972, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33124, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33125, + "latitude": 25.783676, + "longitude": -80.235421, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33126, + "latitude": 25.790376, + "longitude": -80.288372, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33127, + "latitude": 25.813625, + "longitude": -80.203169, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33128, + "latitude": 25.775926, + "longitude": -80.205019, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33129, + "latitude": 25.754277, + "longitude": -80.203519, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33130, + "latitude": 25.807425, + "longitude": -80.22952, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33131, + "latitude": 25.759926, + "longitude": -80.187519, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33132, + "latitude": 25.782275, + "longitude": -80.179407, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33133, + "latitude": 25.737777, + "longitude": -80.22477, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33134, + "latitude": 25.767977, + "longitude": -80.271372, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33135, + "latitude": 25.767476, + "longitude": -80.234971, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33136, + "latitude": 25.783426, + "longitude": -80.204469, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33137, + "latitude": 25.814275, + "longitude": -80.187219, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33138, + "latitude": 25.852073, + "longitude": -80.182118, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33139, + "latitude": 25.787326, + "longitude": -80.156368, + "city": "Miami Beach", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33140, + "latitude": 25.819825, + "longitude": -80.133717, + "city": "Miami Beach", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33141, + "latitude": 25.848623, + "longitude": -80.144617, + "city": "Miami Beach", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33142, + "latitude": 25.811575, + "longitude": -80.236821, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33143, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33144, + "latitude": 25.766427, + "longitude": -80.304172, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33145, + "latitude": 25.753877, + "longitude": -80.22527, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33146, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33147, + "latitude": 25.851523, + "longitude": -80.23812, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33148, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33149, + "latitude": 25.709978, + "longitude": -80.173295, + "city": "Key Biscayne", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33150, + "latitude": 25.852273, + "longitude": -80.207219, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33151, + "latitude": 25.832074, + "longitude": -80.20942, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33152, + "latitude": 25.795476, + "longitude": -80.312873, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33153, + "latitude": 25.865523, + "longitude": -80.193619, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33154, + "latitude": 25.912671, + "longitude": -80.195719, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33155, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33156, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33157, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33158, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33159, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33160, + "latitude": 25.944859, + "longitude": -80.139067, + "city": "North Miami Beach", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33161, + "latitude": 25.893422, + "longitude": -80.175768, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33162, + "latitude": 25.92862, + "longitude": -80.182969, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33163, + "latitude": 25.94497, + "longitude": -80.21452, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33164, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33165, + "latitude": 25.826996, + "longitude": -80.319991, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33166, + "latitude": 25.830124, + "longitude": -80.292572, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33167, + "latitude": 25.891872, + "longitude": -80.22267, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33168, + "latitude": 25.853667, + "longitude": -80.174618, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33169, + "latitude": 25.94262, + "longitude": -80.214621, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33170, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33172, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33173, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33174, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33175, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33176, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33177, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33178, + "latitude": 25.874473, + "longitude": -80.350023, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33179, + "latitude": 25.954336, + "longitude": -80.182018, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33180, + "latitude": 25.959719, + "longitude": -80.140267, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33181, + "latitude": 25.896522, + "longitude": -80.156988, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33182, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33183, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33184, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33185, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33186, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33187, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33188, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33189, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33190, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33192, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33193, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33194, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33195, + "latitude": 25.772876, + "longitude": -80.187019, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33196, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33197, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33199, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33231, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33233, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33234, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33238, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33239, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami Beach", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33242, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33243, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33245, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33247, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33255, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33256, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33257, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33261, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33265, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33266, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33269, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33280, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33283, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33296, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33299, + "latitude": 25.558428, + "longitude": -80.458168, + "city": "Miami", + "state": "FL", + "county": "Miami-Dade" + }, + { + "zip_code": 33301, + "latitude": 26.085115, + "longitude": -80.159317, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33302, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33303, + "latitude": 26.196911, + "longitude": -80.095165, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33304, + "latitude": 26.124513, + "longitude": -80.120216, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33305, + "latitude": 26.149662, + "longitude": -80.122916, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33306, + "latitude": 26.165612, + "longitude": -80.111766, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33307, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33308, + "latitude": 26.098414, + "longitude": -80.182168, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33309, + "latitude": 26.186109, + "longitude": -80.179318, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33310, + "latitude": 26.144263, + "longitude": -80.206919, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33311, + "latitude": 26.144303, + "longitude": -80.183868, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33312, + "latitude": 26.177411, + "longitude": -80.209085, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33313, + "latitude": 26.148662, + "longitude": -80.207519, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33314, + "latitude": 26.069666, + "longitude": -80.224569, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33315, + "latitude": 26.08329, + "longitude": -80.162266, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33316, + "latitude": 26.103114, + "longitude": -80.123866, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33317, + "latitude": 26.091765, + "longitude": -80.286534, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33318, + "latitude": 26.11842, + "longitude": -80.251988, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33319, + "latitude": 26.184761, + "longitude": -80.24057, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33320, + "latitude": 26.162462, + "longitude": -80.25822, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33321, + "latitude": 26.144589, + "longitude": -80.26052, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33322, + "latitude": 26.118845, + "longitude": -80.331401, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33323, + "latitude": 26.139766, + "longitude": -80.359157, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33324, + "latitude": 26.125463, + "longitude": -80.264371, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33325, + "latitude": 26.070747, + "longitude": -80.24417, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33326, + "latitude": 26.202757, + "longitude": -80.281527, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33327, + "latitude": 26.11363, + "longitude": -80.41699, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33328, + "latitude": 26.105514, + "longitude": -80.255133, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33329, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33330, + "latitude": 26.066316, + "longitude": -80.333872, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33331, + "latitude": 26.048032, + "longitude": -80.374894, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33332, + "latitude": 26.059583, + "longitude": -80.414605, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33334, + "latitude": 26.184511, + "longitude": -80.134366, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33335, + "latitude": 26.089215, + "longitude": -80.335973, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33337, + "latitude": 26.129013, + "longitude": -80.260071, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33338, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33339, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33340, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33345, + "latitude": 26.165424, + "longitude": -80.29589, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33346, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33348, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33349, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33351, + "latitude": 26.108554, + "longitude": -80.266437, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33355, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33359, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33388, + "latitude": 26.120864, + "longitude": -80.25327, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33394, + "latitude": 26.122063, + "longitude": -80.138967, + "city": "Fort Lauderdale", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33401, + "latitude": 26.672643, + "longitude": -80.070613, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33402, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33403, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33404, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33405, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33406, + "latitude": 26.639594, + "longitude": -80.082714, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33407, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33408, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "North Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33409, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33410, + "latitude": 26.598446, + "longitude": -80.054613, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33411, + "latitude": 26.664443, + "longitude": -80.174116, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33412, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33413, + "latitude": 26.655494, + "longitude": -80.159616, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33414, + "latitude": 26.645659, + "longitude": -80.25144, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33415, + "latitude": 26.656044, + "longitude": -80.125952, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33416, + "latitude": 26.665394, + "longitude": -80.092864, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33417, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33418, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33419, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33420, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33421, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33422, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "West Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33424, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Boynton Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33425, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Boynton Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33426, + "latitude": 26.528233, + "longitude": -80.084764, + "city": "Boynton Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33427, + "latitude": 26.375954, + "longitude": -80.10717, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33428, + "latitude": 26.348017, + "longitude": -80.218991, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33429, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33430, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Belle Glade", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33431, + "latitude": 26.378704, + "longitude": -80.104343, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33432, + "latitude": 26.384203, + "longitude": -80.081114, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33433, + "latitude": 26.350274, + "longitude": -80.158367, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33434, + "latitude": 26.381132, + "longitude": -80.170567, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33435, + "latitude": 26.518049, + "longitude": -80.079114, + "city": "Boynton Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33436, + "latitude": 26.535402, + "longitude": -80.112447, + "city": "Boynton Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33437, + "latitude": 26.513629, + "longitude": -80.174297, + "city": "Boynton Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33438, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Canal Point", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33439, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Bryant", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33440, + "latitude": 26.630066, + "longitude": -81.090897, + "city": "Clewiston", + "state": "FL", + "county": "Hendry" + }, + { + "zip_code": 33441, + "latitude": 26.273761, + "longitude": -80.140769, + "city": "Deerfield Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33442, + "latitude": 26.301407, + "longitude": -80.138516, + "city": "Deerfield Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33443, + "latitude": 26.145724, + "longitude": -80.448254, + "city": "Deerfield Beach", + "state": "FL", + "county": "Broward" + }, + { + "zip_code": 33444, + "latitude": 26.457598, + "longitude": -80.081614, + "city": "Delray Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33445, + "latitude": 26.548504, + "longitude": -80.100015, + "city": "Delray Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33446, + "latitude": 26.454017, + "longitude": -80.181862, + "city": "Delray Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33447, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Delray Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33448, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Delray Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33454, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Lake Worth", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33455, + "latitude": 27.050934, + "longitude": -80.158594, + "city": "Hobe Sound", + "state": "FL", + "county": "Martin" + }, + { + "zip_code": 33458, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Jupiter", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33459, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Lake Harbor", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33460, + "latitude": 26.619627, + "longitude": -80.059063, + "city": "Lake Worth", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33461, + "latitude": 26.619546, + "longitude": -80.091704, + "city": "Lake Worth", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33462, + "latitude": 26.574736, + "longitude": -80.079405, + "city": "Lake Worth", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33463, + "latitude": 26.595537, + "longitude": -80.129065, + "city": "Lake Worth", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33464, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33465, + "latitude": 26.628272, + "longitude": -80.132569, + "city": "Lake Worth", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33466, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Lake Worth", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33467, + "latitude": 26.595867, + "longitude": -80.22087, + "city": "Lake Worth", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33468, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Jupiter", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33469, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Jupiter", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33470, + "latitude": 26.649816, + "longitude": -80.294771, + "city": "Loxahatchee", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33471, + "latitude": 26.886471, + "longitude": -81.195575, + "city": "Moore Haven", + "state": "FL", + "county": "Glades" + }, + { + "zip_code": 33474, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Boynton Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33475, + "latitude": 27.110182, + "longitude": -80.454196, + "city": "Hobe Sound", + "state": "FL", + "county": "Martin" + }, + { + "zip_code": 33476, + "latitude": 26.623067, + "longitude": -80.17864, + "city": "Pahokee", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33477, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Jupiter", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33478, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Jupiter", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33480, + "latitude": 26.600995, + "longitude": -80.038113, + "city": "Palm Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33481, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33482, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Delray Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33483, + "latitude": 26.464145, + "longitude": -80.064844, + "city": "Delray Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33484, + "latitude": 26.454218, + "longitude": -80.13473, + "city": "Delray Beach", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33486, + "latitude": 26.348293, + "longitude": -80.117265, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33487, + "latitude": 26.411642, + "longitude": -80.09277, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33488, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33493, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "South Bay", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33496, + "latitude": 26.409333, + "longitude": -80.162567, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33497, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33498, + "latitude": 26.39341, + "longitude": -80.222751, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33499, + "latitude": 26.645895, + "longitude": -80.430269, + "city": "Boca Raton", + "state": "FL", + "county": "Palm Beach" + }, + { + "zip_code": 33503, + "latitude": 27.764761, + "longitude": -82.273409, + "city": "Balm", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33508, + "latitude": "", + "longitude": "", + "city": "Brandon", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33509, + "latitude": 28.119579, + "longitude": -82.451959, + "city": "Brandon", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33510, + "latitude": 27.83083, + "longitude": -82.356458, + "city": "Brandon", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33511, + "latitude": 27.903679, + "longitude": -82.294021, + "city": "Brandon", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33513, + "latitude": 28.676288, + "longitude": -82.149168, + "city": "Bushnell", + "state": "FL", + "county": "Sumter" + }, + { + "zip_code": 33514, + "latitude": 28.668113, + "longitude": -82.02883, + "city": "Center Hill", + "state": "FL", + "county": "Sumter" + }, + { + "zip_code": 33521, + "latitude": 28.775537, + "longitude": -82.059745, + "city": "Coleman", + "state": "FL", + "county": "Sumter" + }, + { + "zip_code": 33523, + "latitude": 28.36886, + "longitude": -82.322756, + "city": "Dade City", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 33524, + "latitude": 28.182209, + "longitude": -82.152341, + "city": "Crystal Springs", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 33525, + "latitude": 28.331765, + "longitude": -82.244624, + "city": "Dade City", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 33526, + "latitude": 28.310134, + "longitude": -82.247783, + "city": "Dade City", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 33527, + "latitude": 27.975742, + "longitude": -82.240415, + "city": "Dover", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33530, + "latitude": 27.906823, + "longitude": -82.176749, + "city": "Durant", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33534, + "latitude": 27.911823, + "longitude": -82.385728, + "city": "Gibsonton", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33537, + "latitude": 28.324796, + "longitude": -82.481766, + "city": "Lacoochee", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 33538, + "latitude": 28.781677, + "longitude": -82.121086, + "city": "Lake Panasoffkee", + "state": "FL", + "county": "Sumter" + }, + { + "zip_code": 33539, + "latitude": 28.21305, + "longitude": -82.16568, + "city": "Zephyrhills", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 33540, + "latitude": 28.240942, + "longitude": -82.156491, + "city": "Zephyrhills", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 33541, + "latitude": 28.240543, + "longitude": -82.446251, + "city": "Zephyrhills", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 33543, + "latitude": 28.20592, + "longitude": -82.306326, + "city": "Zephyrhills", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 33544, + "latitude": 28.271989, + "longitude": -82.284738, + "city": "Zephyrhills", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 33547, + "latitude": 27.893718, + "longitude": -82.205331, + "city": "Lithia", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33548, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Lutz", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33549, + "latitude": 28.060825, + "longitude": -82.391666, + "city": "Lutz", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33550, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Mango", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33556, + "latitude": 28.128688, + "longitude": -82.584113, + "city": "Odessa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33558, + "latitude": "", + "longitude": "", + "city": "Lutz", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33559, + "latitude": "", + "longitude": "", + "city": "Lutz", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33564, + "latitude": 28.029627, + "longitude": -82.134741, + "city": "Plant City", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33565, + "latitude": 28.082724, + "longitude": -82.156607, + "city": "Plant City", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33566, + "latitude": 28.008056, + "longitude": -82.341905, + "city": "Plant City", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33567, + "latitude": 27.980218, + "longitude": -82.322484, + "city": "Plant City", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33568, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Riverview", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33569, + "latitude": 27.846419, + "longitude": -82.301249, + "city": "Riverview", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33570, + "latitude": 27.69913, + "longitude": -82.45263, + "city": "Ruskin", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33571, + "latitude": 27.720111, + "longitude": -82.453041, + "city": "Sun City Center", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33572, + "latitude": 27.84579, + "longitude": -82.331983, + "city": "Apollo Beach", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33573, + "latitude": 27.704046, + "longitude": -82.35742, + "city": "Sun City Center", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33574, + "latitude": 28.334752, + "longitude": -82.269323, + "city": "Saint Leo", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 33576, + "latitude": 28.331729, + "longitude": -82.300982, + "city": "San Antonio", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 33583, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Seffner", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33584, + "latitude": 27.999687, + "longitude": -82.287957, + "city": "Seffner", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33585, + "latitude": 28.735643, + "longitude": -82.061556, + "city": "Sumterville", + "state": "FL", + "county": "Sumter" + }, + { + "zip_code": 33586, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Sun City", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33587, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Sydney", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33592, + "latitude": 28.092775, + "longitude": -82.278977, + "city": "Thonotosassa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33593, + "latitude": 28.324796, + "longitude": -82.481766, + "city": "Trilby", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 33594, + "latitude": 27.937779, + "longitude": -82.347371, + "city": "Valrico", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33595, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Valrico", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33597, + "latitude": 28.647306, + "longitude": -82.108078, + "city": "Webster", + "state": "FL", + "county": "Sumter" + }, + { + "zip_code": 33598, + "latitude": 27.73383, + "longitude": -82.297468, + "city": "Wimauma", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33601, + "latitude": 27.996097, + "longitude": -82.582035, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33602, + "latitude": 27.950898, + "longitude": -82.461517, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33603, + "latitude": 27.986147, + "longitude": -82.463804, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33604, + "latitude": 28.014096, + "longitude": -82.449816, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33605, + "latitude": 27.946665, + "longitude": -82.427265, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33606, + "latitude": 27.930552, + "longitude": -82.465326, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33607, + "latitude": 27.966697, + "longitude": -82.556868, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33608, + "latitude": 27.84343, + "longitude": -82.488413, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33609, + "latitude": 27.942648, + "longitude": -82.513067, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33610, + "latitude": 27.995997, + "longitude": -82.375733, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33611, + "latitude": 27.942099, + "longitude": -82.512017, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33612, + "latitude": 28.054195, + "longitude": -82.442683, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33613, + "latitude": 28.077403, + "longitude": -82.444209, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33614, + "latitude": 28.031495, + "longitude": -82.496367, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33615, + "latitude": 28.039847, + "longitude": -82.548749, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33616, + "latitude": 27.867201, + "longitude": -82.529567, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33617, + "latitude": 28.030714, + "longitude": -82.386351, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33618, + "latitude": 28.076299, + "longitude": -82.485188, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33619, + "latitude": 27.92485, + "longitude": -82.379447, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33620, + "latitude": 28.059994, + "longitude": -82.407887, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33621, + "latitude": 27.849135, + "longitude": -82.494582, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33622, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33623, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33624, + "latitude": 28.074809, + "longitude": -82.554404, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33625, + "latitude": 28.072671, + "longitude": -82.559501, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33626, + "latitude": 28.066478, + "longitude": -82.611596, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33629, + "latitude": 27.921056, + "longitude": -82.508867, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33630, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33631, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33633, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33634, + "latitude": 28.002755, + "longitude": -82.545466, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33635, + "latitude": 28.026337, + "longitude": -82.613819, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33637, + "latitude": 28.047044, + "longitude": -82.363024, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33647, + "latitude": 28.127834, + "longitude": -82.350338, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33650, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33651, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33655, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33660, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33661, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33662, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33663, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33664, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33672, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33673, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33674, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33675, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33677, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33679, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33680, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33681, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33682, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33684, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33685, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33686, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33687, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33688, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33689, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33690, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33694, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33697, + "latitude": 27.871964, + "longitude": -82.438841, + "city": "Tampa", + "state": "FL", + "county": "Hillsborough" + }, + { + "zip_code": 33701, + "latitude": 27.775654, + "longitude": -82.64092, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33702, + "latitude": 27.863201, + "longitude": -82.631509, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33703, + "latitude": 27.816003, + "longitude": -82.62092, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33704, + "latitude": 27.798053, + "longitude": -82.63077, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33705, + "latitude": 27.743555, + "longitude": -82.64182, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33706, + "latitude": 27.749529, + "longitude": -82.754223, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33707, + "latitude": 27.757005, + "longitude": -82.726422, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33708, + "latitude": 27.811608, + "longitude": -82.80143, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33709, + "latitude": 27.820082, + "longitude": -82.730798, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33710, + "latitude": 27.788853, + "longitude": -82.699621, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33711, + "latitude": 27.733448, + "longitude": -82.690035, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33712, + "latitude": 27.735925, + "longitude": -82.672426, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33713, + "latitude": 27.789403, + "longitude": -82.677321, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33714, + "latitude": 27.817335, + "longitude": -82.68324, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33715, + "latitude": 27.670536, + "longitude": -82.711927, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33716, + "latitude": 27.890727, + "longitude": -82.692961, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33728, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33729, + "latitude": 27.881909, + "longitude": -82.664359, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33730, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33731, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33732, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33733, + "latitude": 27.925755, + "longitude": -82.75211, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33734, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33736, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33737, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33738, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33740, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33741, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33742, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33743, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33744, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Bay Pines", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33747, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33755, + "latitude": 27.978147, + "longitude": -82.781523, + "city": "Clearwater", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33756, + "latitude": 27.946998, + "longitude": -82.794324, + "city": "Clearwater", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33757, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Clearwater", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33758, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Clearwater", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33759, + "latitude": 27.984851, + "longitude": -82.704321, + "city": "Clearwater", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33760, + "latitude": 27.90045, + "longitude": -82.715166, + "city": "Clearwater", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33761, + "latitude": 27.925501, + "longitude": -82.725852, + "city": "Clearwater", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33762, + "latitude": 27.89417, + "longitude": -82.674571, + "city": "Clearwater", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33763, + "latitude": 28.017296, + "longitude": -82.746082, + "city": "Clearwater", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33764, + "latitude": 27.916038, + "longitude": -82.734299, + "city": "Clearwater", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33765, + "latitude": 27.990179, + "longitude": -82.743298, + "city": "Clearwater", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33766, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Clearwater", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33767, + "latitude": 27.959847, + "longitude": -82.828625, + "city": "Clearwater Beach", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33769, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Clearwater", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33770, + "latitude": 27.916998, + "longitude": -82.802668, + "city": "Largo", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33771, + "latitude": 27.908479, + "longitude": -82.756823, + "city": "Largo", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33772, + "latitude": 27.846601, + "longitude": -82.795385, + "city": "Seminole", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33773, + "latitude": 27.88015, + "longitude": -82.753373, + "city": "Largo", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33774, + "latitude": 27.883949, + "longitude": -82.826525, + "city": "Largo", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33775, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Seminole", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33776, + "latitude": 27.850547, + "longitude": -82.826267, + "city": "Seminole", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33777, + "latitude": 27.854588, + "longitude": -82.754528, + "city": "Seminole", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33778, + "latitude": 27.88403, + "longitude": -82.802466, + "city": "Largo", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33779, + "latitude": 27.839698, + "longitude": -82.772483, + "city": "Largo", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33780, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Pinellas Park", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33781, + "latitude": 27.868101, + "longitude": -82.758523, + "city": "Pinellas Park", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33782, + "latitude": 27.868115, + "longitude": -82.708639, + "city": "Pinellas Park", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33784, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Saint Petersburg", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33785, + "latitude": 27.886757, + "longitude": -82.843525, + "city": "Indian Rocks Beach", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33786, + "latitude": 27.922922, + "longitude": -82.839325, + "city": "Belleair Beach", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 33801, + "latitude": 28.059997, + "longitude": -81.956122, + "city": "Lakeland", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33802, + "latitude": 28.020992, + "longitude": -81.985185, + "city": "Lakeland", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33803, + "latitude": 27.894389, + "longitude": -81.850798, + "city": "Lakeland", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33804, + "latitude": 28.002553, + "longitude": -81.61864, + "city": "Lakeland", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33805, + "latitude": 28.094746, + "longitude": -81.947117, + "city": "Lakeland", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33806, + "latitude": 28.002553, + "longitude": -81.61864, + "city": "Lakeland", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33807, + "latitude": 28.002553, + "longitude": -81.61864, + "city": "Lakeland", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33809, + "latitude": 28.176194, + "longitude": -81.959132, + "city": "Lakeland", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33810, + "latitude": 28.147923, + "longitude": -82.037153, + "city": "Lakeland", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33811, + "latitude": 27.986538, + "longitude": -82.013855, + "city": "Lakeland", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33813, + "latitude": 27.963896, + "longitude": -81.917604, + "city": "Lakeland", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33815, + "latitude": 28.049648, + "longitude": -82.006855, + "city": "Lakeland", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33820, + "latitude": 28.002553, + "longitude": -81.61864, + "city": "Alturas", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33823, + "latitude": 28.086751, + "longitude": -81.742864, + "city": "Auburndale", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33825, + "latitude": 27.473059, + "longitude": -81.464053, + "city": "Avon Park", + "state": "FL", + "county": "Highlands" + }, + { + "zip_code": 33826, + "latitude": 27.339483, + "longitude": -81.252872, + "city": "Avon Park", + "state": "FL", + "county": "Highlands" + }, + { + "zip_code": 33827, + "latitude": 27.906571, + "longitude": -81.549715, + "city": "Babson Park", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33830, + "latitude": 27.918445, + "longitude": -81.790794, + "city": "Bartow", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33831, + "latitude": 27.955426, + "longitude": -81.951673, + "city": "Bartow", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33834, + "latitude": 27.601936, + "longitude": -81.85069, + "city": "Bowling Green", + "state": "FL", + "county": "Hardee" + }, + { + "zip_code": 33835, + "latitude": 27.699258, + "longitude": -81.949419, + "city": "Bradley", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33836, + "latitude": 28.167211, + "longitude": -81.631589, + "city": "Davenport", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33837, + "latitude": 28.164093, + "longitude": -81.647317, + "city": "Davenport", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33838, + "latitude": 28.009099, + "longitude": -81.677776, + "city": "Dundee", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33839, + "latitude": 28.005662, + "longitude": -81.702448, + "city": "Eagle Lake", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33840, + "latitude": 28.084383, + "longitude": -81.5415, + "city": "Eaton Park", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33841, + "latitude": 27.742463, + "longitude": -81.723311, + "city": "Fort Meade", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33843, + "latitude": 27.72938, + "longitude": -81.55934, + "city": "Frostproof", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33844, + "latitude": 28.075834, + "longitude": -81.592933, + "city": "Haines City", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33845, + "latitude": 28.002553, + "longitude": -81.61864, + "city": "Haines City", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33846, + "latitude": 27.964651, + "longitude": -81.867153, + "city": "Highland City", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33847, + "latitude": 27.984091, + "longitude": -81.716682, + "city": "Homeland", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33848, + "latitude": 28.263489, + "longitude": -81.512387, + "city": "Intercession City", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 33849, + "latitude": 28.197539, + "longitude": -82.039587, + "city": "Kathleen", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33850, + "latitude": 28.092424, + "longitude": -81.727551, + "city": "Lake Alfred", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33851, + "latitude": 28.036937, + "longitude": -81.627998, + "city": "Lake Hamilton", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33852, + "latitude": 27.336002, + "longitude": -81.36628, + "city": "Lake Placid", + "state": "FL", + "county": "Highlands" + }, + { + "zip_code": 33853, + "latitude": 27.991865, + "longitude": -81.480831, + "city": "Lake Wales", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33854, + "latitude": 28.002553, + "longitude": -81.61864, + "city": "Fedhaven", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33855, + "latitude": 27.798022, + "longitude": -81.357154, + "city": "Indian Lake Estates", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33856, + "latitude": 27.855686, + "longitude": -81.430915, + "city": "Nalcrest", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33857, + "latitude": 27.391447, + "longitude": -81.228096, + "city": "Lorida", + "state": "FL", + "county": "Highlands" + }, + { + "zip_code": 33858, + "latitude": 28.050121, + "longitude": -81.505211, + "city": "Loughman", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33859, + "latitude": 27.885359, + "longitude": -81.522998, + "city": "Lake Wales", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33860, + "latitude": 27.844612, + "longitude": -81.835864, + "city": "Mulberry", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33862, + "latitude": 27.244668, + "longitude": -81.288424, + "city": "Lake Placid", + "state": "FL", + "county": "Highlands" + }, + { + "zip_code": 33863, + "latitude": 28.002553, + "longitude": -81.61864, + "city": "Nichols", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33865, + "latitude": 27.450538, + "longitude": -81.899723, + "city": "Ona", + "state": "FL", + "county": "Hardee" + }, + { + "zip_code": 33867, + "latitude": 27.768567, + "longitude": -81.19664, + "city": "River Ranch", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33868, + "latitude": 28.03668, + "longitude": -81.760824, + "city": "Polk City", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33870, + "latitude": 27.457947, + "longitude": -81.373012, + "city": "Sebring", + "state": "FL", + "county": "Highlands" + }, + { + "zip_code": 33871, + "latitude": 27.485803, + "longitude": -81.407884, + "city": "Sebring", + "state": "FL", + "county": "Highlands" + }, + { + "zip_code": 33872, + "latitude": 27.393804, + "longitude": -81.287076, + "city": "Sebring", + "state": "FL", + "county": "Highlands" + }, + { + "zip_code": 33873, + "latitude": 27.518602, + "longitude": -81.784123, + "city": "Wauchula", + "state": "FL", + "county": "Hardee" + }, + { + "zip_code": 33875, + "latitude": "", + "longitude": "", + "city": "Sebring", + "state": "FL", + "county": "Highlands" + }, + { + "zip_code": 33876, + "latitude": "", + "longitude": "", + "city": "Sebring", + "state": "FL", + "county": "Highlands" + }, + { + "zip_code": 33877, + "latitude": 27.976883, + "longitude": -81.614414, + "city": "Waverly", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33880, + "latitude": 27.987284, + "longitude": -81.762456, + "city": "Winter Haven", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33881, + "latitude": 28.06374, + "longitude": -81.711071, + "city": "Winter Haven", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33882, + "latitude": 28.029402, + "longitude": -81.732139, + "city": "Winter Haven", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33883, + "latitude": 28.002553, + "longitude": -81.61864, + "city": "Winter Haven", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33884, + "latitude": 28.053322, + "longitude": -81.668575, + "city": "Winter Haven", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33885, + "latitude": 28.002553, + "longitude": -81.61864, + "city": "Winter Haven", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33888, + "latitude": 28.023115, + "longitude": -81.723417, + "city": "Winter Haven", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33890, + "latitude": 27.457687, + "longitude": -81.721609, + "city": "Zolfo Springs", + "state": "FL", + "county": "Hardee" + }, + { + "zip_code": 33896, + "latitude": "", + "longitude": "", + "city": "Davenport", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33897, + "latitude": "", + "longitude": "", + "city": "Davenport", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33898, + "latitude": "", + "longitude": "", + "city": "Lake Wales", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 33901, + "latitude": 26.564355, + "longitude": -81.925065, + "city": "Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33902, + "latitude": 26.623908, + "longitude": -81.883648, + "city": "Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33903, + "latitude": 26.693048, + "longitude": -81.912454, + "city": "North Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33904, + "latitude": 26.606491, + "longitude": -81.95016, + "city": "Cape Coral", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33905, + "latitude": 26.607784, + "longitude": -81.832214, + "city": "Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33906, + "latitude": 26.552895, + "longitude": -81.94861, + "city": "Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33907, + "latitude": 26.634845, + "longitude": -81.959923, + "city": "Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33908, + "latitude": 26.561955, + "longitude": -81.911422, + "city": "Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33909, + "latitude": 26.623638, + "longitude": -81.968, + "city": "Cape Coral", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33910, + "latitude": 26.552895, + "longitude": -81.94861, + "city": "Cape Coral", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33911, + "latitude": 26.596286, + "longitude": -81.882373, + "city": "Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33912, + "latitude": 26.563728, + "longitude": -81.726965, + "city": "Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33913, + "latitude": 26.529206, + "longitude": -81.693572, + "city": "Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33914, + "latitude": 26.622535, + "longitude": -81.923974, + "city": "Cape Coral", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33915, + "latitude": 26.659942, + "longitude": -81.893427, + "city": "Cape Coral", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33916, + "latitude": 26.635461, + "longitude": -81.843807, + "city": "Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33917, + "latitude": 26.648211, + "longitude": -81.844716, + "city": "North Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33918, + "latitude": 26.71613, + "longitude": -81.607007, + "city": "North Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33919, + "latitude": 26.572627, + "longitude": -81.937186, + "city": "Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33920, + "latitude": 26.595182, + "longitude": -81.6815, + "city": "Alva", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33921, + "latitude": 26.754493, + "longitude": -82.261149, + "city": "Boca Grande", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33922, + "latitude": 26.624433, + "longitude": -82.128052, + "city": "Bokeelia", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33924, + "latitude": 26.521464, + "longitude": -82.180242, + "city": "Captiva", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33927, + "latitude": 26.901981, + "longitude": -82.000005, + "city": "El Jobean", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33928, + "latitude": 26.472274, + "longitude": -81.705902, + "city": "Estero", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33930, + "latitude": 26.612772, + "longitude": -81.479912, + "city": "Felda", + "state": "FL", + "county": "Hendry" + }, + { + "zip_code": 33931, + "latitude": 26.5761, + "longitude": -82.071178, + "city": "Fort Myers Beach", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33932, + "latitude": 26.552895, + "longitude": -81.94861, + "city": "Fort Myers Beach", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33935, + "latitude": 26.690881, + "longitude": -81.448873, + "city": "Labelle", + "state": "FL", + "county": "Hendry" + }, + { + "zip_code": 33936, + "latitude": 26.593573, + "longitude": -81.661922, + "city": "Lehigh Acres", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33938, + "latitude": 26.901981, + "longitude": -82.000005, + "city": "Murdock", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33944, + "latitude": 26.946449, + "longitude": -81.309114, + "city": "Palmdale", + "state": "FL", + "county": "Glades" + }, + { + "zip_code": 33945, + "latitude": 26.658313, + "longitude": -82.1434, + "city": "Pineland", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33946, + "latitude": 26.879424, + "longitude": -82.266405, + "city": "Placida", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33947, + "latitude": 26.884228, + "longitude": -82.269126, + "city": "Rotonda West", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33948, + "latitude": 26.94099, + "longitude": -82.20688, + "city": "Port Charlotte", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33949, + "latitude": 26.993904, + "longitude": -82.098418, + "city": "Port Charlotte", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33950, + "latitude": 26.860103, + "longitude": -82.013411, + "city": "Punta Gorda", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33951, + "latitude": 26.970756, + "longitude": -81.984504, + "city": "Punta Gorda", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33952, + "latitude": 26.994048, + "longitude": -82.156128, + "city": "Port Charlotte", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33953, + "latitude": 26.997956, + "longitude": -82.200524, + "city": "Port Charlotte", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33954, + "latitude": 27.019741, + "longitude": -82.123194, + "city": "Port Charlotte", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33955, + "latitude": 26.828631, + "longitude": -81.909078, + "city": "Punta Gorda", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33956, + "latitude": 26.575762, + "longitude": -82.107459, + "city": "Saint James City", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33957, + "latitude": 26.458308, + "longitude": -82.100065, + "city": "Sanibel", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33960, + "latitude": 27.120281, + "longitude": -81.390945, + "city": "Venus", + "state": "FL", + "county": "Highlands" + }, + { + "zip_code": 33965, + "latitude": 26.552895, + "longitude": -81.94861, + "city": "Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33970, + "latitude": 26.564718, + "longitude": -81.620778, + "city": "Lehigh Acres", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33971, + "latitude": 26.589408, + "longitude": -81.670757, + "city": "Lehigh Acres", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33972, + "latitude": 26.641661, + "longitude": -81.913575, + "city": "Lehigh Acres", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33975, + "latitude": 26.763312, + "longitude": -81.438833, + "city": "Labelle", + "state": "FL", + "county": "Hendry" + }, + { + "zip_code": 33980, + "latitude": 26.986122, + "longitude": -82.055747, + "city": "Port Charlotte", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33981, + "latitude": 26.93457, + "longitude": -82.232398, + "city": "Port Charlotte", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33982, + "latitude": 26.959685, + "longitude": -81.819036, + "city": "Punta Gorda", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33983, + "latitude": 27.001845, + "longitude": -82.018382, + "city": "Punta Gorda", + "state": "FL", + "county": "Charlotte" + }, + { + "zip_code": 33990, + "latitude": 26.6265, + "longitude": -81.967657, + "city": "Cape Coral", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33991, + "latitude": 26.628091, + "longitude": -82.018158, + "city": "Cape Coral", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33993, + "latitude": 26.678619, + "longitude": -82.025384, + "city": "Cape Coral", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 33994, + "latitude": 26.552895, + "longitude": -81.94861, + "city": "Fort Myers", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 34002, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34003, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34009, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34020, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34021, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34022, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34023, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34024, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34025, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34030, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34031, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34032, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34033, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34034, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34035, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34036, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34037, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34038, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34039, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34040, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34041, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34042, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34050, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34051, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34053, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34054, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34055, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34058, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34060, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34071, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34077, + "latitude": "", + "longitude": "", + "city": "Apo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34078, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34079, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34086, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34090, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34091, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34092, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34093, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34095, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34098, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34099, + "latitude": "", + "longitude": "", + "city": "Fpo", + "state": "AA", + "county": "" + }, + { + "zip_code": 34101, + "latitude": 25.855534, + "longitude": -81.38719, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34102, + "latitude": 26.133968, + "longitude": -81.795309, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34103, + "latitude": 26.191666, + "longitude": -81.803944, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34104, + "latitude": 26.178752, + "longitude": -81.745447, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34105, + "latitude": 26.193769, + "longitude": -81.763609, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34106, + "latitude": 26.14326, + "longitude": -81.389124, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34107, + "latitude": 26.14326, + "longitude": -81.389124, + "city": "Vanderbilt Beach", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34108, + "latitude": 26.241595, + "longitude": -81.807056, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34109, + "latitude": 26.253416, + "longitude": -81.764364, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34110, + "latitude": 26.282328, + "longitude": -81.757284, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34112, + "latitude": 26.118429, + "longitude": -81.736052, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34113, + "latitude": 26.042638, + "longitude": -81.718172, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34114, + "latitude": 26.014314, + "longitude": -81.585552, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34116, + "latitude": 26.187256, + "longitude": -81.711048, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34117, + "latitude": 26.115558, + "longitude": -81.523853, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34119, + "latitude": 26.239288, + "longitude": -81.66871, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34120, + "latitude": 26.330438, + "longitude": -81.587104, + "city": "Naples", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34133, + "latitude": 26.552895, + "longitude": -81.94861, + "city": "Bonita Springs", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 34134, + "latitude": 26.362566, + "longitude": -81.818279, + "city": "Bonita Springs", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 34135, + "latitude": 26.377129, + "longitude": -81.733377, + "city": "Bonita Springs", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 34136, + "latitude": 26.552895, + "longitude": -81.94861, + "city": "Bonita Springs", + "state": "FL", + "county": "Lee" + }, + { + "zip_code": 34137, + "latitude": 26.14326, + "longitude": -81.389124, + "city": "Copeland", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34138, + "latitude": 25.836746, + "longitude": -81.121963, + "city": "Chokoloskee", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34139, + "latitude": 25.856971, + "longitude": -81.377791, + "city": "Everglades City", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34140, + "latitude": 26.14326, + "longitude": -81.389124, + "city": "Goodland", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34141, + "latitude": 25.873412, + "longitude": -81.159938, + "city": "Ochopee", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34142, + "latitude": 26.18437, + "longitude": -81.415175, + "city": "Immokalee", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34143, + "latitude": 26.464183, + "longitude": -81.504661, + "city": "Immokalee", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34145, + "latitude": 25.938768, + "longitude": -81.696751, + "city": "Marco Island", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34146, + "latitude": 26.14326, + "longitude": -81.389124, + "city": "Marco Island", + "state": "FL", + "county": "Collier" + }, + { + "zip_code": 34201, + "latitude": 27.404731, + "longitude": -82.470456, + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34202, + "latitude": 27.471379, + "longitude": -82.37934, + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34203, + "latitude": 27.454723, + "longitude": -82.535883, + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34204, + "latitude": 27.427213, + "longitude": -82.438689, + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34205, + "latitude": 27.466869, + "longitude": -82.456033, + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34206, + "latitude": 27.427213, + "longitude": -82.438689, + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34207, + "latitude": 27.439419, + "longitude": -82.577779, + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34208, + "latitude": 27.467817, + "longitude": -82.512018, + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34209, + "latitude": 27.475853, + "longitude": -82.616719, + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34210, + "latitude": 27.473598, + "longitude": -82.660725, + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34211, + "latitude": "", + "longitude": "", + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34212, + "latitude": "", + "longitude": "", + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34215, + "latitude": 27.471256, + "longitude": -82.682262, + "city": "Cortez", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34216, + "latitude": 27.529113, + "longitude": -82.731722, + "city": "Anna Maria", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34217, + "latitude": 27.485915, + "longitude": -82.710221, + "city": "Bradenton Beach", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34218, + "latitude": 27.499515, + "longitude": -82.709871, + "city": "Holmes Beach", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34219, + "latitude": 27.566457, + "longitude": -82.269458, + "city": "Parrish", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34220, + "latitude": 27.427213, + "longitude": -82.438689, + "city": "Palmetto", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34221, + "latitude": 27.577315, + "longitude": -82.516004, + "city": "Palmetto", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34222, + "latitude": 27.546332, + "longitude": -82.496732, + "city": "Ellenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34223, + "latitude": 27.143931, + "longitude": -82.404959, + "city": "Englewood", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34224, + "latitude": 27.064882, + "longitude": -82.400124, + "city": "Englewood", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34228, + "latitude": 27.357231, + "longitude": -82.443071, + "city": "Longboat Key", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34229, + "latitude": 27.213378, + "longitude": -82.488818, + "city": "Osprey", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34230, + "latitude": 27.335023, + "longitude": -82.537169, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34231, + "latitude": 27.227589, + "longitude": -82.432111, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34232, + "latitude": 27.203872, + "longitude": -82.443249, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34233, + "latitude": 27.127372, + "longitude": -82.423776, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34234, + "latitude": 27.368769, + "longitude": -82.526768, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34235, + "latitude": 27.363072, + "longitude": -82.478376, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34236, + "latitude": 27.326863, + "longitude": -82.543319, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34237, + "latitude": 27.337173, + "longitude": -82.514176, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34238, + "latitude": 27.242689, + "longitude": -82.475145, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34239, + "latitude": 27.310774, + "longitude": -82.520868, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34240, + "latitude": 27.231941, + "longitude": -82.3504, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34241, + "latitude": 27.241077, + "longitude": -82.351349, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34242, + "latitude": 27.256626, + "longitude": -82.539819, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34243, + "latitude": 27.415606, + "longitude": -82.528065, + "city": "Sarasota", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34250, + "latitude": 27.572236, + "longitude": -82.583168, + "city": "Terra Ceia", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34251, + "latitude": 27.372771, + "longitude": -82.225911, + "city": "Myakka City", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34260, + "latitude": 27.427213, + "longitude": -82.438689, + "city": "Manasota", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34264, + "latitude": 27.427213, + "longitude": -82.438689, + "city": "Oneco", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34265, + "latitude": 27.186146, + "longitude": -81.809939, + "city": "Arcadia", + "state": "FL", + "county": "De Soto" + }, + { + "zip_code": 34266, + "latitude": 27.186075, + "longitude": -81.866661, + "city": "Arcadia", + "state": "FL", + "county": "De Soto" + }, + { + "zip_code": 34267, + "latitude": 27.186146, + "longitude": -81.809939, + "city": "Fort Ogden", + "state": "FL", + "county": "De Soto" + }, + { + "zip_code": 34268, + "latitude": 27.203827, + "longitude": -81.864443, + "city": "Nocatee", + "state": "FL", + "county": "De Soto" + }, + { + "zip_code": 34269, + "latitude": "", + "longitude": "", + "city": "Arcadia", + "state": "FL", + "county": "De Soto" + }, + { + "zip_code": 34270, + "latitude": 27.405429, + "longitude": -82.543519, + "city": "Tallevast", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34272, + "latitude": 27.146963, + "longitude": -82.425512, + "city": "Laurel", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34274, + "latitude": 27.144031, + "longitude": -82.464468, + "city": "Nokomis", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34275, + "latitude": 27.229227, + "longitude": -82.459848, + "city": "Nokomis", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34276, + "latitude": 27.167521, + "longitude": -82.380967, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34277, + "latitude": 27.167521, + "longitude": -82.380967, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34278, + "latitude": 27.331628, + "longitude": -82.528488, + "city": "Sarasota", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34280, + "latitude": 27.427213, + "longitude": -82.438689, + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34281, + "latitude": 27.427213, + "longitude": -82.438689, + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34282, + "latitude": 27.427213, + "longitude": -82.438689, + "city": "Bradenton", + "state": "FL", + "county": "Manatee" + }, + { + "zip_code": 34284, + "latitude": 27.167521, + "longitude": -82.380967, + "city": "Venice", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34285, + "latitude": 27.09639, + "longitude": -82.433818, + "city": "Venice", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34286, + "latitude": 27.074755, + "longitude": -82.175602, + "city": "North Port", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34287, + "latitude": 27.189487, + "longitude": -82.334882, + "city": "North Port", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34288, + "latitude": "", + "longitude": "", + "city": "North Port", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34289, + "latitude": "", + "longitude": "", + "city": "North Port", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34292, + "latitude": 27.090034, + "longitude": -82.370028, + "city": "Venice", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34293, + "latitude": 27.060576, + "longitude": -82.352038, + "city": "Venice", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34295, + "latitude": 27.085985, + "longitude": -82.438918, + "city": "Englewood", + "state": "FL", + "county": "Sarasota" + }, + { + "zip_code": 34420, + "latitude": 29.101476, + "longitude": -82.044371, + "city": "Belleview", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34421, + "latitude": 29.240728, + "longitude": -82.087458, + "city": "Belleview", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34423, + "latitude": 28.867027, + "longitude": -82.572703, + "city": "Crystal River", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34428, + "latitude": 28.958393, + "longitude": -82.599279, + "city": "Crystal River", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34429, + "latitude": 28.904358, + "longitude": -82.596051, + "city": "Crystal River", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34430, + "latitude": 29.240728, + "longitude": -82.087458, + "city": "Dunnellon", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34431, + "latitude": 29.09481, + "longitude": -82.249223, + "city": "Dunnellon", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34432, + "latitude": 29.101529, + "longitude": -82.34129, + "city": "Dunnellon", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34433, + "latitude": 28.994902, + "longitude": -82.519629, + "city": "Dunnellon", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34434, + "latitude": 28.993778, + "longitude": -82.424132, + "city": "Dunnellon", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34436, + "latitude": 28.73035, + "longitude": -82.307734, + "city": "Floral City", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34442, + "latitude": 28.922317, + "longitude": -82.390044, + "city": "Hernando", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34445, + "latitude": 28.948753, + "longitude": -82.406476, + "city": "Holder", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34446, + "latitude": 28.7508, + "longitude": -82.513889, + "city": "Homosassa", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34447, + "latitude": 28.804911, + "longitude": -82.574264, + "city": "Homosassa Springs", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34448, + "latitude": 28.787963, + "longitude": -82.567981, + "city": "Homosassa", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34449, + "latitude": 29.095501, + "longitude": -82.656099, + "city": "Inglis", + "state": "FL", + "county": "Levy" + }, + { + "zip_code": 34450, + "latitude": 28.834011, + "longitude": -82.282224, + "city": "Inverness", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34451, + "latitude": 28.803207, + "longitude": -82.32167, + "city": "Inverness", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34452, + "latitude": 28.777849, + "longitude": -82.360295, + "city": "Inverness", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34453, + "latitude": 28.872256, + "longitude": -82.345411, + "city": "Inverness", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34460, + "latitude": 28.859286, + "longitude": -82.508694, + "city": "Lecanto", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34461, + "latitude": 28.819711, + "longitude": -82.464061, + "city": "Lecanto", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34464, + "latitude": 28.859286, + "longitude": -82.508694, + "city": "Beverly Hills", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34465, + "latitude": 28.817853, + "longitude": -82.446209, + "city": "Beverly Hills", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34470, + "latitude": 29.238672, + "longitude": -82.169401, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34471, + "latitude": 29.160525, + "longitude": -81.942516, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34472, + "latitude": 29.125344, + "longitude": -82.008571, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34473, + "latitude": 29.113464, + "longitude": -82.195635, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34474, + "latitude": 29.150148, + "longitude": -82.137774, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34475, + "latitude": 29.154639, + "longitude": -82.304525, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34476, + "latitude": 29.115896, + "longitude": -82.242211, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34477, + "latitude": 29.240728, + "longitude": -82.087458, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34478, + "latitude": 29.187178, + "longitude": -82.112278, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34479, + "latitude": 29.178235, + "longitude": -82.02819, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34480, + "latitude": 29.180072, + "longitude": -82.03227, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34481, + "latitude": 29.128062, + "longitude": -82.297544, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34482, + "latitude": 29.261079, + "longitude": -82.219513, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34483, + "latitude": 29.240728, + "longitude": -82.087458, + "city": "Ocala", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34484, + "latitude": 28.905906, + "longitude": -82.061193, + "city": "Oxford", + "state": "FL", + "county": "Sumter" + }, + { + "zip_code": 34487, + "latitude": 28.859286, + "longitude": -82.508694, + "city": "Homosassa", + "state": "FL", + "county": "Citrus" + }, + { + "zip_code": 34488, + "latitude": 29.263549, + "longitude": -81.95316, + "city": "Silver Springs", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34489, + "latitude": 29.215153, + "longitude": -82.097163, + "city": "Silver Springs", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34491, + "latitude": 29.01123, + "longitude": -82.032463, + "city": "Summerfield", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34492, + "latitude": 28.99796, + "longitude": -82.016139, + "city": "Summerfield", + "state": "FL", + "county": "Marion" + }, + { + "zip_code": 34498, + "latitude": 29.030531, + "longitude": -82.719003, + "city": "Yankeetown", + "state": "FL", + "county": "Levy" + }, + { + "zip_code": 34601, + "latitude": 28.586197, + "longitude": -82.395858, + "city": "Brooksville", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34602, + "latitude": 28.509319, + "longitude": -82.295675, + "city": "Brooksville", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34603, + "latitude": 28.564167, + "longitude": -82.416515, + "city": "Brooksville", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34604, + "latitude": "", + "longitude": "", + "city": "Brooksville", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34605, + "latitude": 28.505896, + "longitude": -82.422554, + "city": "Brooksville", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34606, + "latitude": 28.496411, + "longitude": -82.40101, + "city": "Spring Hill", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34607, + "latitude": 28.504888, + "longitude": -82.625672, + "city": "Spring Hill", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34608, + "latitude": 28.483643, + "longitude": -82.542698, + "city": "Spring Hill", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34609, + "latitude": 28.494344, + "longitude": -82.450658, + "city": "Spring Hill", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34610, + "latitude": 28.377455, + "longitude": -82.524063, + "city": "Spring Hill", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34611, + "latitude": 28.564167, + "longitude": -82.416515, + "city": "Spring Hill", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34613, + "latitude": 28.604951, + "longitude": -82.531987, + "city": "Brooksville", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34614, + "latitude": 28.627958, + "longitude": -82.536465, + "city": "Brooksville", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34636, + "latitude": 28.65503, + "longitude": -82.267706, + "city": "Istachatta", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34639, + "latitude": 28.250774, + "longitude": -82.46263, + "city": "Land O Lakes", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34652, + "latitude": 28.239369, + "longitude": -82.736882, + "city": "New Port Richey", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34653, + "latitude": 28.242508, + "longitude": -82.695536, + "city": "New Port Richey", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34654, + "latitude": 28.296388, + "longitude": -82.617095, + "city": "New Port Richey", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34655, + "latitude": 28.216016, + "longitude": -82.67162, + "city": "New Port Richey", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34656, + "latitude": 28.324796, + "longitude": -82.481766, + "city": "New Port Richey", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34660, + "latitude": 28.067043, + "longitude": -82.778424, + "city": "Ozona", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 34661, + "latitude": 28.64364, + "longitude": -82.263836, + "city": "Nobleton", + "state": "FL", + "county": "Hernando" + }, + { + "zip_code": 34667, + "latitude": 28.382489, + "longitude": -82.64803, + "city": "Hudson", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34668, + "latitude": 28.297976, + "longitude": -82.704101, + "city": "Port Richey", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34669, + "latitude": 28.360086, + "longitude": -82.62074, + "city": "Hudson", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34673, + "latitude": 28.324796, + "longitude": -82.481766, + "city": "Port Richey", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34674, + "latitude": 28.324796, + "longitude": -82.481766, + "city": "Hudson", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34677, + "latitude": 28.050324, + "longitude": -82.677379, + "city": "Oldsmar", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 34679, + "latitude": 28.430213, + "longitude": -82.661555, + "city": "Aripeka", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34680, + "latitude": 28.324796, + "longitude": -82.481766, + "city": "Elfers", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34681, + "latitude": 28.087401, + "longitude": -82.777683, + "city": "Crystal Beach", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 34682, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Palm Harbor", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 34683, + "latitude": 28.074144, + "longitude": -82.744889, + "city": "Palm Harbor", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 34684, + "latitude": 28.084797, + "longitude": -82.725257, + "city": "Palm Harbor", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 34685, + "latitude": 28.109717, + "longitude": -82.692882, + "city": "Palm Harbor", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 34688, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Tarpon Springs", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 34689, + "latitude": 28.092104, + "longitude": -82.732165, + "city": "Tarpon Springs", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 34690, + "latitude": 28.191434, + "longitude": -82.724448, + "city": "Holiday", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34691, + "latitude": 28.196394, + "longitude": -82.762191, + "city": "Holiday", + "state": "FL", + "county": "Pasco" + }, + { + "zip_code": 34695, + "latitude": 28.017645, + "longitude": -82.747692, + "city": "Safety Harbor", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 34697, + "latitude": 27.891809, + "longitude": -82.724763, + "city": "Dunedin", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 34698, + "latitude": 28.010895, + "longitude": -82.773995, + "city": "Dunedin", + "state": "FL", + "county": "Pinellas" + }, + { + "zip_code": 34705, + "latitude": 28.706723, + "longitude": -81.718455, + "city": "Astatula", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34711, + "latitude": 28.584025, + "longitude": -81.779423, + "city": "Clermont", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34712, + "latitude": 28.811078, + "longitude": -81.653642, + "city": "Clermont", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34713, + "latitude": 28.811078, + "longitude": -81.653642, + "city": "Clermont", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34729, + "latitude": 28.811078, + "longitude": -81.653642, + "city": "Ferndale", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34731, + "latitude": 28.863361, + "longitude": -81.905624, + "city": "Fruitland Park", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34734, + "latitude": 28.538407, + "longitude": -81.520774, + "city": "Gotha", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 34736, + "latitude": 28.587996, + "longitude": -81.870269, + "city": "Groveland", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34737, + "latitude": 28.697081, + "longitude": -81.797564, + "city": "Howey In The Hills", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34739, + "latitude": 27.933215, + "longitude": -81.092447, + "city": "Kenansville", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34740, + "latitude": 28.545385, + "longitude": -81.650667, + "city": "Killarney", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 34741, + "latitude": 28.307138, + "longitude": -81.461385, + "city": "Kissimmee", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34742, + "latitude": 27.995287, + "longitude": -81.259332, + "city": "Kissimmee", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34743, + "latitude": 28.326039, + "longitude": -81.405894, + "city": "Kissimmee", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34744, + "latitude": 28.297638, + "longitude": -81.32402, + "city": "Kissimmee", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34745, + "latitude": 27.995287, + "longitude": -81.259332, + "city": "Kissimmee", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34746, + "latitude": 28.243011, + "longitude": -81.400997, + "city": "Kissimmee", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34747, + "latitude": 28.303738, + "longitude": -81.589782, + "city": "Kissimmee", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34748, + "latitude": 28.758895, + "longitude": -81.888695, + "city": "Leesburg", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34749, + "latitude": 28.811078, + "longitude": -81.653642, + "city": "Leesburg", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34753, + "latitude": 28.58299, + "longitude": -81.894119, + "city": "Mascotte", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34755, + "latitude": 28.578234, + "longitude": -81.831883, + "city": "Minneola", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34756, + "latitude": 28.581499, + "longitude": -81.685146, + "city": "Montverde", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34758, + "latitude": 28.203877, + "longitude": -81.487992, + "city": "Kissimmee", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34759, + "latitude": 28.094636, + "longitude": -81.498979, + "city": "Kissimmee", + "state": "FL", + "county": "Polk" + }, + { + "zip_code": 34760, + "latitude": 28.550978, + "longitude": -81.621546, + "city": "Oakland", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 34761, + "latitude": 28.569438, + "longitude": -81.530251, + "city": "Ocoee", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 34762, + "latitude": 28.74751, + "longitude": -81.895885, + "city": "Okahumpka", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34769, + "latitude": 28.230351, + "longitude": -81.359092, + "city": "Saint Cloud", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34770, + "latitude": 27.995287, + "longitude": -81.259332, + "city": "Saint Cloud", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34771, + "latitude": 28.246439, + "longitude": -81.231589, + "city": "Saint Cloud", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34772, + "latitude": 28.172669, + "longitude": -81.26899, + "city": "Saint Cloud", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34773, + "latitude": 28.146663, + "longitude": -80.993806, + "city": "Saint Cloud", + "state": "FL", + "county": "Osceola" + }, + { + "zip_code": 34777, + "latitude": 28.541579, + "longitude": -81.605846, + "city": "Winter Garden", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 34778, + "latitude": 28.566338, + "longitude": -81.260818, + "city": "Winter Garden", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 34785, + "latitude": 28.844473, + "longitude": -82.078342, + "city": "Wildwood", + "state": "FL", + "county": "Sumter" + }, + { + "zip_code": 34786, + "latitude": 28.481031, + "longitude": -81.543979, + "city": "Windermere", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 34787, + "latitude": 28.468581, + "longitude": -81.512343, + "city": "Winter Garden", + "state": "FL", + "county": "Orange" + }, + { + "zip_code": 34788, + "latitude": 28.888724, + "longitude": -81.782704, + "city": "Leesburg", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34789, + "latitude": 28.811078, + "longitude": -81.653642, + "city": "Leesburg", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34797, + "latitude": 28.712017, + "longitude": -81.808159, + "city": "Yalaha", + "state": "FL", + "county": "Lake" + }, + { + "zip_code": 34945, + "latitude": 27.412128, + "longitude": -80.534169, + "city": "Fort Pierce", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34946, + "latitude": 27.511616, + "longitude": -80.364447, + "city": "Fort Pierce", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34947, + "latitude": 27.445611, + "longitude": -80.387742, + "city": "Fort Pierce", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34948, + "latitude": 27.382196, + "longitude": -80.409024, + "city": "Fort Pierce", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34949, + "latitude": 27.456687, + "longitude": -80.285812, + "city": "Fort Pierce", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34950, + "latitude": 27.448066, + "longitude": -80.333224, + "city": "Fort Pierce", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34951, + "latitude": 27.513925, + "longitude": -80.457475, + "city": "Fort Pierce", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34952, + "latitude": 27.312492, + "longitude": -80.313322, + "city": "Port Saint Lucie", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34953, + "latitude": 27.257707, + "longitude": -80.380277, + "city": "Port Saint Lucie", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34954, + "latitude": 27.382196, + "longitude": -80.409024, + "city": "Fort Pierce", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34956, + "latitude": 27.106451, + "longitude": -80.45192, + "city": "Indiantown", + "state": "FL", + "county": "Martin" + }, + { + "zip_code": 34957, + "latitude": 27.236473, + "longitude": -80.237943, + "city": "Jensen Beach", + "state": "FL", + "county": "Martin" + }, + { + "zip_code": 34958, + "latitude": 27.242402, + "longitude": -80.224613, + "city": "Jensen Beach", + "state": "FL", + "county": "Martin" + }, + { + "zip_code": 34972, + "latitude": 27.420316, + "longitude": -80.945361, + "city": "Okeechobee", + "state": "FL", + "county": "Okeechobee" + }, + { + "zip_code": 34973, + "latitude": 27.297631, + "longitude": -80.802656, + "city": "Okeechobee", + "state": "FL", + "county": "Okeechobee" + }, + { + "zip_code": 34974, + "latitude": 27.216626, + "longitude": -80.827757, + "city": "Okeechobee", + "state": "FL", + "county": "Okeechobee" + }, + { + "zip_code": 34979, + "latitude": 27.382196, + "longitude": -80.409024, + "city": "Fort Pierce", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34981, + "latitude": 27.391213, + "longitude": -80.374042, + "city": "Fort Pierce", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34982, + "latitude": 27.362859, + "longitude": -80.307717, + "city": "Fort Pierce", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34983, + "latitude": 27.347284, + "longitude": -80.347722, + "city": "Port Saint Lucie", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34984, + "latitude": 27.251266, + "longitude": -80.345407, + "city": "Port Saint Lucie", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34985, + "latitude": 27.382196, + "longitude": -80.409024, + "city": "Port Saint Lucie", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34986, + "latitude": 27.333392, + "longitude": -80.397427, + "city": "Port Saint Lucie", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34987, + "latitude": 27.29076, + "longitude": -80.484851, + "city": "Port Saint Lucie", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34988, + "latitude": 27.386818, + "longitude": -80.503746, + "city": "Port Saint Lucie", + "state": "FL", + "county": "Saint Lucie" + }, + { + "zip_code": 34990, + "latitude": 27.111235, + "longitude": -80.419042, + "city": "Palm City", + "state": "FL", + "county": "Martin" + }, + { + "zip_code": 34991, + "latitude": 27.110182, + "longitude": -80.454196, + "city": "Palm City", + "state": "FL", + "county": "Martin" + }, + { + "zip_code": 34992, + "latitude": 27.110182, + "longitude": -80.454196, + "city": "Port Salerno", + "state": "FL", + "county": "Martin" + }, + { + "zip_code": 34994, + "latitude": 27.189748, + "longitude": -80.254768, + "city": "Stuart", + "state": "FL", + "county": "Martin" + }, + { + "zip_code": 34995, + "latitude": 27.17537, + "longitude": -80.241512, + "city": "Stuart", + "state": "FL", + "county": "Martin" + }, + { + "zip_code": 34996, + "latitude": 27.205819, + "longitude": -80.195911, + "city": "Stuart", + "state": "FL", + "county": "Martin" + }, + { + "zip_code": 34997, + "latitude": 27.108081, + "longitude": -80.230818, + "city": "Stuart", + "state": "FL", + "county": "Martin" + }, + { + "zip_code": 35004, + "latitude": 33.603543, + "longitude": -86.466833, + "city": "Moody", + "state": "AL", + "county": "Saint Clair" + }, + { + "zip_code": 35005, + "latitude": 33.578097, + "longitude": -86.987228, + "city": "Adamsville", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35006, + "latitude": 33.437653, + "longitude": -87.207592, + "city": "Adger", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35007, + "latitude": 33.193415, + "longitude": -86.794377, + "city": "Alabaster", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35010, + "latitude": 32.930079, + "longitude": -85.805026, + "city": "Alexander City", + "state": "AL", + "county": "Tallapoosa" + }, + { + "zip_code": 35011, + "latitude": 32.990191, + "longitude": -85.958001, + "city": "Alexander City", + "state": "AL", + "county": "Tallapoosa" + }, + { + "zip_code": 35013, + "latitude": 33.922162, + "longitude": -86.449262, + "city": "Allgood", + "state": "AL", + "county": "Blount" + }, + { + "zip_code": 35014, + "latitude": 33.403969, + "longitude": -86.233878, + "city": "Alpine", + "state": "AL", + "county": "Talladega" + }, + { + "zip_code": 35015, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Alton", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35016, + "latitude": 34.393855, + "longitude": -86.365403, + "city": "Arab", + "state": "AL", + "county": "Marshall" + }, + { + "zip_code": 35019, + "latitude": 34.265451, + "longitude": -86.712779, + "city": "Baileyton", + "state": "AL", + "county": "Cullman" + }, + { + "zip_code": 35020, + "latitude": 33.441602, + "longitude": -86.88857, + "city": "Bessemer", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35021, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Bessemer", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35022, + "latitude": 33.352745, + "longitude": -86.968328, + "city": "Bessemer", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35023, + "latitude": 33.478989, + "longitude": -86.944763, + "city": "Bessemer", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35031, + "latitude": 34.091285, + "longitude": -86.559625, + "city": "Blountsville", + "state": "AL", + "county": "Blount" + }, + { + "zip_code": 35032, + "latitude": 33.256886, + "longitude": -86.338572, + "city": "Bon Air", + "state": "AL", + "county": "Talladega" + }, + { + "zip_code": 35033, + "latitude": 33.957886, + "longitude": -87.003767, + "city": "Bremen", + "state": "AL", + "county": "Cullman" + }, + { + "zip_code": 35034, + "latitude": 32.989499, + "longitude": -87.220392, + "city": "Brent", + "state": "AL", + "county": "Bibb" + }, + { + "zip_code": 35035, + "latitude": 33.016616, + "longitude": -86.9598, + "city": "Brierfield", + "state": "AL", + "county": "Bibb" + }, + { + "zip_code": 35036, + "latitude": 33.63628, + "longitude": -86.916202, + "city": "Brookside", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35038, + "latitude": 33.804411, + "longitude": -87.202136, + "city": "Burnwell", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35040, + "latitude": 33.138832, + "longitude": -86.725315, + "city": "Calera", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35041, + "latitude": 33.64672, + "longitude": -86.931818, + "city": "Cardiff", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35042, + "latitude": 32.948233, + "longitude": -87.139316, + "city": "Centreville", + "state": "AL", + "county": "Bibb" + }, + { + "zip_code": 35043, + "latitude": 33.298238, + "longitude": -86.656328, + "city": "Chelsea", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35044, + "latitude": 33.245885, + "longitude": -86.364148, + "city": "Childersburg", + "state": "AL", + "county": "Talladega" + }, + { + "zip_code": 35045, + "latitude": 32.856632, + "longitude": -86.652875, + "city": "Clanton", + "state": "AL", + "county": "Chilton" + }, + { + "zip_code": 35046, + "latitude": 32.886365, + "longitude": -86.648931, + "city": "Clanton", + "state": "AL", + "county": "Chilton" + }, + { + "zip_code": 35048, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Clay", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35049, + "latitude": 33.977816, + "longitude": -86.55985, + "city": "Cleveland", + "state": "AL", + "county": "Blount" + }, + { + "zip_code": 35051, + "latitude": 33.232849, + "longitude": -86.554849, + "city": "Columbiana", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35052, + "latitude": 33.589518, + "longitude": -86.392283, + "city": "Cook Springs", + "state": "AL", + "county": "Saint Clair" + }, + { + "zip_code": 35053, + "latitude": 34.044614, + "longitude": -87.051404, + "city": "Crane Hill", + "state": "AL", + "county": "Cullman" + }, + { + "zip_code": 35054, + "latitude": 33.529643, + "longitude": -86.300691, + "city": "Cropwell", + "state": "AL", + "county": "Saint Clair" + }, + { + "zip_code": 35055, + "latitude": 34.111067, + "longitude": -86.853185, + "city": "Cullman", + "state": "AL", + "county": "Cullman" + }, + { + "zip_code": 35056, + "latitude": 34.196448, + "longitude": -86.895226, + "city": "Cullman", + "state": "AL", + "county": "Cullman" + }, + { + "zip_code": 35057, + "latitude": 34.087769, + "longitude": -86.944713, + "city": "Cullman", + "state": "AL", + "county": "Cullman" + }, + { + "zip_code": 35058, + "latitude": 34.209766, + "longitude": -86.752029, + "city": "Cullman", + "state": "AL", + "county": "Cullman" + }, + { + "zip_code": 35060, + "latitude": 33.558905, + "longitude": -86.929443, + "city": "Docena", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35061, + "latitude": 33.460807, + "longitude": -86.960864, + "city": "Dolomite", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35062, + "latitude": 33.735709, + "longitude": -87.054641, + "city": "Dora", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35063, + "latitude": 33.827269, + "longitude": -87.027469, + "city": "Empire", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35064, + "latitude": 33.475407, + "longitude": -86.925391, + "city": "Fairfield", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35068, + "latitude": 33.601739, + "longitude": -86.826491, + "city": "Fultondale", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35070, + "latitude": 34.005773, + "longitude": -86.74995, + "city": "Garden City", + "state": "AL", + "county": "Cullman" + }, + { + "zip_code": 35071, + "latitude": 33.70615, + "longitude": -86.848289, + "city": "Gardendale", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35072, + "latitude": 33.058725, + "longitude": -86.079106, + "city": "Goodwater", + "state": "AL", + "county": "Coosa" + }, + { + "zip_code": 35073, + "latitude": 33.659545, + "longitude": -86.801693, + "city": "Graysville", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35074, + "latitude": 33.202691, + "longitude": -87.118044, + "city": "Green Pond", + "state": "AL", + "county": "Bibb" + }, + { + "zip_code": 35077, + "latitude": 34.034276, + "longitude": -86.841753, + "city": "Hanceville", + "state": "AL", + "county": "Cullman" + }, + { + "zip_code": 35078, + "latitude": 33.199274, + "longitude": -86.459291, + "city": "Harpersville", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35079, + "latitude": 33.953352, + "longitude": -86.745469, + "city": "Hayden", + "state": "AL", + "county": "Blount" + }, + { + "zip_code": 35080, + "latitude": 33.266341, + "longitude": -86.901975, + "city": "Helena", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35082, + "latitude": 33.116229, + "longitude": -86.138624, + "city": "Hollins", + "state": "AL", + "county": "Clay" + }, + { + "zip_code": 35083, + "latitude": 34.152149, + "longitude": -86.791286, + "city": "Holly Pond", + "state": "AL", + "county": "Cullman" + }, + { + "zip_code": 35085, + "latitude": 32.970056, + "longitude": -86.734146, + "city": "Jemison", + "state": "AL", + "county": "Chilton" + }, + { + "zip_code": 35087, + "latitude": 34.272537, + "longitude": -86.576125, + "city": "Joppa", + "state": "AL", + "county": "Cullman" + }, + { + "zip_code": 35089, + "latitude": 32.934298, + "longitude": -86.095801, + "city": "Kellyton", + "state": "AL", + "county": "Coosa" + }, + { + "zip_code": 35091, + "latitude": 33.769928, + "longitude": -86.800573, + "city": "Kimberly", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35094, + "latitude": 33.51828, + "longitude": -86.584472, + "city": "Leeds", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35096, + "latitude": 33.445821, + "longitude": -86.255605, + "city": "Lincoln", + "state": "AL", + "county": "Talladega" + }, + { + "zip_code": 35097, + "latitude": 33.904975, + "longitude": -86.626094, + "city": "Locust Fork", + "state": "AL", + "county": "Blount" + }, + { + "zip_code": 35098, + "latitude": 34.137678, + "longitude": -87.026554, + "city": "Logan", + "state": "AL", + "county": "Cullman" + }, + { + "zip_code": 35111, + "latitude": 33.299704, + "longitude": -87.048881, + "city": "Mc Calla", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35112, + "latitude": 33.695814, + "longitude": -86.46564, + "city": "Margaret", + "state": "AL", + "county": "Saint Clair" + }, + { + "zip_code": 35114, + "latitude": 33.337916, + "longitude": -86.733796, + "city": "Maylene", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35115, + "latitude": 33.136658, + "longitude": -86.883586, + "city": "Montevallo", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35116, + "latitude": 33.727106, + "longitude": -86.763967, + "city": "Morris", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35117, + "latitude": 33.637322, + "longitude": -86.875181, + "city": "Mount Olive", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35118, + "latitude": 33.536339, + "longitude": -87.051031, + "city": "Mulga", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35119, + "latitude": 33.650832, + "longitude": -86.769698, + "city": "New Castle", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35120, + "latitude": 33.657096, + "longitude": -86.38336, + "city": "Odenville", + "state": "AL", + "county": "Saint Clair" + }, + { + "zip_code": 35121, + "latitude": 33.968171, + "longitude": -86.5535, + "city": "Oneonta", + "state": "AL", + "county": "Blount" + }, + { + "zip_code": 35123, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Palmerdale", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35124, + "latitude": 33.293157, + "longitude": -86.767961, + "city": "Pelham", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35125, + "latitude": 33.592484, + "longitude": -86.325995, + "city": "Pell City", + "state": "AL", + "county": "Saint Clair" + }, + { + "zip_code": 35126, + "latitude": 33.72988, + "longitude": -86.645081, + "city": "Pinson", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35127, + "latitude": 33.549138, + "longitude": -86.884204, + "city": "Pleasant Grove", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35128, + "latitude": 33.587299, + "longitude": -86.336607, + "city": "Pell City", + "state": "AL", + "county": "Saint Clair" + }, + { + "zip_code": 35130, + "latitude": 33.721814, + "longitude": -87.124359, + "city": "Quinton", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35131, + "latitude": 33.715229, + "longitude": -86.24746, + "city": "Ragland", + "state": "AL", + "county": "Saint Clair" + }, + { + "zip_code": 35133, + "latitude": 33.845846, + "longitude": -86.586724, + "city": "Remlap", + "state": "AL", + "county": "Blount" + }, + { + "zip_code": 35135, + "latitude": 33.622079, + "longitude": -86.221589, + "city": "Riverside", + "state": "AL", + "county": "Saint Clair" + }, + { + "zip_code": 35136, + "latitude": 32.897085, + "longitude": -86.156068, + "city": "Rockford", + "state": "AL", + "county": "Coosa" + }, + { + "zip_code": 35137, + "latitude": 33.206302, + "longitude": -86.781162, + "city": "Saginaw", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35139, + "latitude": 33.711096, + "longitude": -86.975856, + "city": "Sayre", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35142, + "latitude": 33.406869, + "longitude": -86.87347, + "city": "Shannon", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35143, + "latitude": 33.080188, + "longitude": -86.550392, + "city": "Shelby", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35144, + "latitude": 33.28241, + "longitude": -86.683891, + "city": "Siluria", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35146, + "latitude": 33.705871, + "longitude": -86.403202, + "city": "Springville", + "state": "AL", + "county": "Saint Clair" + }, + { + "zip_code": 35147, + "latitude": 33.419068, + "longitude": -86.544426, + "city": "Sterrett", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35148, + "latitude": 33.757716, + "longitude": -87.0461, + "city": "Sumiton", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35149, + "latitude": 33.272776, + "longitude": -86.204925, + "city": "Sycamore", + "state": "AL", + "county": "Talladega" + }, + { + "zip_code": 35150, + "latitude": 33.316003, + "longitude": -86.228703, + "city": "Sylacauga", + "state": "AL", + "county": "Talladega" + }, + { + "zip_code": 35151, + "latitude": 33.175552, + "longitude": -86.357359, + "city": "Sylacauga", + "state": "AL", + "county": "Talladega" + }, + { + "zip_code": 35160, + "latitude": 33.387375, + "longitude": -86.144681, + "city": "Talladega", + "state": "AL", + "county": "Talladega" + }, + { + "zip_code": 35161, + "latitude": 33.420206, + "longitude": -86.102782, + "city": "Talladega", + "state": "AL", + "county": "Talladega" + }, + { + "zip_code": 35171, + "latitude": 32.893156, + "longitude": -86.756368, + "city": "Thorsby", + "state": "AL", + "county": "Chilton" + }, + { + "zip_code": 35172, + "latitude": 33.810179, + "longitude": -86.724855, + "city": "Trafford", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35173, + "latitude": 33.646334, + "longitude": -86.58589, + "city": "Trussville", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35175, + "latitude": 34.433986, + "longitude": -86.501338, + "city": "Union Grove", + "state": "AL", + "county": "Marshall" + }, + { + "zip_code": 35176, + "latitude": 33.464255, + "longitude": -86.509972, + "city": "Vandiver", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35178, + "latitude": 33.309634, + "longitude": -86.5613, + "city": "Vincent", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35179, + "latitude": 34.258747, + "longitude": -86.925471, + "city": "Vinemont", + "state": "AL", + "county": "Cullman" + }, + { + "zip_code": 35180, + "latitude": 33.790134, + "longitude": -86.829871, + "city": "Warrior", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35181, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Watson", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35182, + "latitude": 33.706786, + "longitude": -86.256658, + "city": "Wattsville", + "state": "AL", + "county": "Saint Clair" + }, + { + "zip_code": 35183, + "latitude": 33.06767, + "longitude": -86.303403, + "city": "Weogufka", + "state": "AL", + "county": "Coosa" + }, + { + "zip_code": 35184, + "latitude": 33.102111, + "longitude": -87.141467, + "city": "West Blocton", + "state": "AL", + "county": "Bibb" + }, + { + "zip_code": 35185, + "latitude": 33.335629, + "longitude": -86.543692, + "city": "Westover", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35186, + "latitude": 33.285635, + "longitude": -86.496647, + "city": "Wilsonville", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35187, + "latitude": 33.08104, + "longitude": -86.879328, + "city": "Wilton", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35188, + "latitude": 33.17994, + "longitude": -87.165935, + "city": "Woodstock", + "state": "AL", + "county": "Bibb" + }, + { + "zip_code": 35201, + "latitude": 33.456412, + "longitude": -86.801904, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35202, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35203, + "latitude": 33.519204, + "longitude": -86.807889, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35204, + "latitude": 33.524455, + "longitude": -86.837898, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35205, + "latitude": 33.569398, + "longitude": -86.782584, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35206, + "latitude": 33.566137, + "longitude": -86.705192, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35207, + "latitude": 33.572576, + "longitude": -86.837341, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35208, + "latitude": 33.498055, + "longitude": -86.879941, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35209, + "latitude": 33.465336, + "longitude": -86.808213, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35210, + "latitude": 33.579661, + "longitude": -86.734969, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35211, + "latitude": 33.45717, + "longitude": -86.864909, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35212, + "latitude": 33.547803, + "longitude": -86.749538, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35213, + "latitude": 33.455408, + "longitude": -86.749588, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35214, + "latitude": 33.575142, + "longitude": -86.905859, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35215, + "latitude": 33.542055, + "longitude": -86.80604, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35216, + "latitude": 33.56014, + "longitude": -86.78134, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35217, + "latitude": 33.56076, + "longitude": -86.856553, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35218, + "latitude": 33.506305, + "longitude": -86.895191, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35219, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35220, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35221, + "latitude": 33.453807, + "longitude": -86.898341, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35222, + "latitude": 33.523204, + "longitude": -86.763788, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35223, + "latitude": 33.499513, + "longitude": -86.726838, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35224, + "latitude": 33.521455, + "longitude": -86.974735, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35225, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35226, + "latitude": 33.396723, + "longitude": -86.834563, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35228, + "latitude": 33.455807, + "longitude": -86.911841, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35229, + "latitude": 33.462856, + "longitude": -86.790389, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35230, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35231, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35232, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35233, + "latitude": 33.508205, + "longitude": -86.802339, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35234, + "latitude": 33.513505, + "longitude": -86.83244, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35235, + "latitude": 33.632816, + "longitude": -86.649293, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35236, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35237, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35238, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35240, + "latitude": 33.425892, + "longitude": -86.776926, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35242, + "latitude": 33.381339, + "longitude": -86.704571, + "city": "Birmingham", + "state": "AL", + "county": "Shelby" + }, + { + "zip_code": 35243, + "latitude": 33.445932, + "longitude": -86.750203, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35244, + "latitude": 33.351944, + "longitude": -86.949784, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35245, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35246, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35249, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35253, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35254, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35255, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35259, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35260, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35261, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35263, + "latitude": 33.522505, + "longitude": -86.80939, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35266, + "latitude": 33.372861, + "longitude": -86.853075, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35277, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35278, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35279, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35280, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35281, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35282, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35283, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35285, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35286, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35287, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35288, + "latitude": 33.445808, + "longitude": -86.928542, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35289, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35290, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35291, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35292, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35293, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35294, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35295, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35296, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35297, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35298, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35299, + "latitude": 33.544622, + "longitude": -86.929208, + "city": "Birmingham", + "state": "AL", + "county": "Jefferson" + }, + { + "zip_code": 35401, + "latitude": 33.241899, + "longitude": -87.597599, + "city": "Tuscaloosa", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35402, + "latitude": 33.306606, + "longitude": -87.453224, + "city": "Tuscaloosa", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35403, + "latitude": 33.20445, + "longitude": -87.526953, + "city": "Tuscaloosa", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35404, + "latitude": 33.182563, + "longitude": -87.482744, + "city": "Tuscaloosa", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35405, + "latitude": 33.10407, + "longitude": -87.518144, + "city": "Tuscaloosa", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35406, + "latitude": 33.335596, + "longitude": -87.533495, + "city": "Tuscaloosa", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35407, + "latitude": 33.306606, + "longitude": -87.453224, + "city": "Tuscaloosa", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35440, + "latitude": 33.311014, + "longitude": -87.18975, + "city": "Abernant", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35441, + "latitude": 32.855347, + "longitude": -87.721868, + "city": "Akron", + "state": "AL", + "county": "Hale" + }, + { + "zip_code": 35442, + "latitude": 33.236962, + "longitude": -88.061517, + "city": "Aliceville", + "state": "AL", + "county": "Pickens" + }, + { + "zip_code": 35443, + "latitude": 32.737366, + "longitude": -87.967724, + "city": "Boligee", + "state": "AL", + "county": "Greene" + }, + { + "zip_code": 35444, + "latitude": 33.333139, + "longitude": -87.277818, + "city": "Brookwood", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35446, + "latitude": 33.230568, + "longitude": -87.754733, + "city": "Buhl", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35447, + "latitude": 33.289682, + "longitude": -88.117113, + "city": "Carrollton", + "state": "AL", + "county": "Pickens" + }, + { + "zip_code": 35448, + "latitude": 32.835692, + "longitude": -87.956884, + "city": "Clinton", + "state": "AL", + "county": "Greene" + }, + { + "zip_code": 35449, + "latitude": 33.135876, + "longitude": -87.338369, + "city": "Coaling", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35452, + "latitude": 33.293358, + "longitude": -87.688789, + "city": "Coker", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35453, + "latitude": 33.18178, + "longitude": -87.383843, + "city": "Cottondale", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35456, + "latitude": 33.072735, + "longitude": -87.432921, + "city": "Duncanville", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35457, + "latitude": 33.294004, + "longitude": -87.776584, + "city": "Echola", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35458, + "latitude": 33.367757, + "longitude": -87.801689, + "city": "Elrod", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35459, + "latitude": 32.621168, + "longitude": -88.285932, + "city": "Emelle", + "state": "AL", + "county": "Sumter" + }, + { + "zip_code": 35460, + "latitude": 32.672049, + "longitude": -88.120605, + "city": "Epes", + "state": "AL", + "county": "Sumter" + }, + { + "zip_code": 35461, + "latitude": 33.413277, + "longitude": -88.209276, + "city": "Ethelsville", + "state": "AL", + "county": "Pickens" + }, + { + "zip_code": 35462, + "latitude": 32.836298, + "longitude": -87.893016, + "city": "Eutaw", + "state": "AL", + "county": "Greene" + }, + { + "zip_code": 35463, + "latitude": 33.084337, + "longitude": -87.697507, + "city": "Fosters", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35464, + "latitude": 32.778274, + "longitude": -88.145715, + "city": "Gainesville", + "state": "AL", + "county": "Sumter" + }, + { + "zip_code": 35466, + "latitude": 33.290717, + "longitude": -87.875835, + "city": "Gordo", + "state": "AL", + "county": "Pickens" + }, + { + "zip_code": 35468, + "latitude": 33.306606, + "longitude": -87.453224, + "city": "Kellerman", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35469, + "latitude": 32.835692, + "longitude": -87.956884, + "city": "Knoxville", + "state": "AL", + "county": "Greene" + }, + { + "zip_code": 35470, + "latitude": 32.571432, + "longitude": -88.133322, + "city": "Livingston", + "state": "AL", + "county": "Sumter" + }, + { + "zip_code": 35471, + "latitude": 33.262603, + "longitude": -88.088514, + "city": "Mc Shan", + "state": "AL", + "county": "Pickens" + }, + { + "zip_code": 35473, + "latitude": 33.347539, + "longitude": -87.537152, + "city": "Northport", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35474, + "latitude": 32.910756, + "longitude": -87.593514, + "city": "Moundville", + "state": "AL", + "county": "Hale" + }, + { + "zip_code": 35475, + "latitude": 33.39924, + "longitude": -87.559894, + "city": "Northport", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35476, + "latitude": 33.356502, + "longitude": -87.538006, + "city": "Northport", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35477, + "latitude": 32.872597, + "longitude": -88.237388, + "city": "Panola", + "state": "AL", + "county": "Sumter" + }, + { + "zip_code": 35478, + "latitude": 33.306606, + "longitude": -87.453224, + "city": "Peterson", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35480, + "latitude": 33.127407, + "longitude": -87.762393, + "city": "Ralph", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35481, + "latitude": 33.314928, + "longitude": -88.042923, + "city": "Reform", + "state": "AL", + "county": "Pickens" + }, + { + "zip_code": 35482, + "latitude": 33.306606, + "longitude": -87.453224, + "city": "Samantha", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35485, + "latitude": 33.306606, + "longitude": -87.453224, + "city": "Tuscaloosa", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35486, + "latitude": 33.272662, + "longitude": -87.793794, + "city": "Tuscaloosa", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35487, + "latitude": 33.307222, + "longitude": -87.585902, + "city": "Tuscaloosa", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35490, + "latitude": 33.226133, + "longitude": -87.225842, + "city": "Vance", + "state": "AL", + "county": "Tuscaloosa" + }, + { + "zip_code": 35491, + "latitude": 32.835692, + "longitude": -87.956884, + "city": "West Greene", + "state": "AL", + "county": "Greene" + }, + { + "zip_code": 35501, + "latitude": 33.796234, + "longitude": -87.316923, + "city": "Jasper", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35502, + "latitude": 33.901993, + "longitude": -87.293888, + "city": "Jasper", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35503, + "latitude": 33.915182, + "longitude": -87.307386, + "city": "Jasper", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35504, + "latitude": 33.818309, + "longitude": -87.235474, + "city": "Jasper", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35540, + "latitude": 34.229897, + "longitude": -87.358538, + "city": "Addison", + "state": "AL", + "county": "Winston" + }, + { + "zip_code": 35541, + "latitude": 34.095345, + "longitude": -87.188237, + "city": "Arley", + "state": "AL", + "county": "Winston" + }, + { + "zip_code": 35542, + "latitude": 33.712675, + "longitude": -87.774117, + "city": "Bankston", + "state": "AL", + "county": "Fayette" + }, + { + "zip_code": 35543, + "latitude": 34.16493, + "longitude": -87.739592, + "city": "Bear Creek", + "state": "AL", + "county": "Marion" + }, + { + "zip_code": 35544, + "latitude": 33.950211, + "longitude": -88.018981, + "city": "Beaverton", + "state": "AL", + "county": "Lamar" + }, + { + "zip_code": 35545, + "latitude": 33.645228, + "longitude": -87.923872, + "city": "Belk", + "state": "AL", + "county": "Fayette" + }, + { + "zip_code": 35546, + "latitude": 33.634468, + "longitude": -87.676862, + "city": "Berry", + "state": "AL", + "county": "Fayette" + }, + { + "zip_code": 35548, + "latitude": 34.038126, + "longitude": -87.75667, + "city": "Brilliant", + "state": "AL", + "county": "Marion" + }, + { + "zip_code": 35549, + "latitude": 33.772696, + "longitude": -87.455456, + "city": "Carbon Hill", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35550, + "latitude": 33.740956, + "longitude": -87.225644, + "city": "Cordova", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35551, + "latitude": 34.145939, + "longitude": -87.373241, + "city": "Delmar", + "state": "AL", + "county": "Winston" + }, + { + "zip_code": 35552, + "latitude": 34.025325, + "longitude": -88.153299, + "city": "Detroit", + "state": "AL", + "county": "Lamar" + }, + { + "zip_code": 35553, + "latitude": 34.121357, + "longitude": -87.360437, + "city": "Double Springs", + "state": "AL", + "county": "Winston" + }, + { + "zip_code": 35554, + "latitude": 33.92856, + "longitude": -87.613508, + "city": "Eldridge", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35555, + "latitude": 33.72005, + "longitude": -87.809908, + "city": "Fayette", + "state": "AL", + "county": "Fayette" + }, + { + "zip_code": 35559, + "latitude": 33.889566, + "longitude": -87.696401, + "city": "Glen Allen", + "state": "AL", + "county": "Fayette" + }, + { + "zip_code": 35560, + "latitude": 33.679503, + "longitude": -87.237372, + "city": "Goodsprings", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35563, + "latitude": 34.078901, + "longitude": -87.813808, + "city": "Guin", + "state": "AL", + "county": "Marion" + }, + { + "zip_code": 35564, + "latitude": 34.122514, + "longitude": -87.828236, + "city": "Hackleburg", + "state": "AL", + "county": "Marion" + }, + { + "zip_code": 35565, + "latitude": 34.179569, + "longitude": -87.505293, + "city": "Haleyville", + "state": "AL", + "county": "Winston" + }, + { + "zip_code": 35570, + "latitude": 34.167583, + "longitude": -87.994648, + "city": "Hamilton", + "state": "AL", + "county": "Marion" + }, + { + "zip_code": 35571, + "latitude": 34.373392, + "longitude": -87.946916, + "city": "Hodges", + "state": "AL", + "county": "Franklin" + }, + { + "zip_code": 35572, + "latitude": 34.188775, + "longitude": -87.2786, + "city": "Houston", + "state": "AL", + "county": "Winston" + }, + { + "zip_code": 35573, + "latitude": 33.92169, + "longitude": -87.524264, + "city": "Kansas", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35574, + "latitude": 33.615308, + "longitude": -87.99477, + "city": "Kennedy", + "state": "AL", + "county": "Lamar" + }, + { + "zip_code": 35575, + "latitude": 34.049571, + "longitude": -87.552646, + "city": "Lynn", + "state": "AL", + "county": "Winston" + }, + { + "zip_code": 35576, + "latitude": 33.606342, + "longitude": -88.131425, + "city": "Millport", + "state": "AL", + "county": "Lamar" + }, + { + "zip_code": 35577, + "latitude": 34.093409, + "longitude": -87.600815, + "city": "Natural Bridge", + "state": "AL", + "county": "Winston" + }, + { + "zip_code": 35578, + "latitude": 33.885529, + "longitude": -87.469627, + "city": "Nauvoo", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35579, + "latitude": 33.664909, + "longitude": -87.376844, + "city": "Oakman", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35580, + "latitude": 33.713348, + "longitude": -87.298601, + "city": "Parrish", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35581, + "latitude": 34.390917, + "longitude": -87.859392, + "city": "Phil Campbell", + "state": "AL", + "county": "Franklin" + }, + { + "zip_code": 35582, + "latitude": 34.453468, + "longitude": -88.067792, + "city": "Red Bay", + "state": "AL", + "county": "Franklin" + }, + { + "zip_code": 35584, + "latitude": 33.820144, + "longitude": -87.077898, + "city": "Sipsey", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35585, + "latitude": 34.424572, + "longitude": -87.81446, + "city": "Spruce Pine", + "state": "AL", + "county": "Franklin" + }, + { + "zip_code": 35586, + "latitude": 33.854224, + "longitude": -88.10667, + "city": "Sulligent", + "state": "AL", + "county": "Lamar" + }, + { + "zip_code": 35587, + "latitude": 33.793322, + "longitude": -87.440648, + "city": "Townley", + "state": "AL", + "county": "Walker" + }, + { + "zip_code": 35592, + "latitude": 33.732286, + "longitude": -88.086009, + "city": "Vernon", + "state": "AL", + "county": "Lamar" + }, + { + "zip_code": 35593, + "latitude": 34.404307, + "longitude": -87.954816, + "city": "Vina", + "state": "AL", + "county": "Franklin" + }, + { + "zip_code": 35594, + "latitude": 34.062, + "longitude": -87.814078, + "city": "Winfield", + "state": "AL", + "county": "Marion" + }, + { + "zip_code": 35601, + "latitude": 34.549833, + "longitude": -86.995551, + "city": "Decatur", + "state": "AL", + "county": "Morgan" + }, + { + "zip_code": 35602, + "latitude": 34.606216, + "longitude": -87.088142, + "city": "Decatur", + "state": "AL", + "county": "Morgan" + }, + { + "zip_code": 35603, + "latitude": 34.53832, + "longitude": -86.96556, + "city": "Decatur", + "state": "AL", + "county": "Morgan" + }, + { + "zip_code": 35609, + "latitude": 34.495365, + "longitude": -86.82993, + "city": "Decatur", + "state": "AL", + "county": "Morgan" + }, + { + "zip_code": 35610, + "latitude": 34.942388, + "longitude": -87.273375, + "city": "Anderson", + "state": "AL", + "county": "Lauderdale" + }, + { + "zip_code": 35611, + "latitude": 34.764976, + "longitude": -87.103488, + "city": "Athens", + "state": "AL", + "county": "Limestone" + }, + { + "zip_code": 35612, + "latitude": 34.774907, + "longitude": -87.030479, + "city": "Athens", + "state": "AL", + "county": "Limestone" + }, + { + "zip_code": 35613, + "latitude": 34.831704, + "longitude": -86.886679, + "city": "Athens", + "state": "AL", + "county": "Limestone" + }, + { + "zip_code": 35614, + "latitude": 34.847364, + "longitude": -87.060696, + "city": "Athens", + "state": "AL", + "county": "Limestone" + }, + { + "zip_code": 35615, + "latitude": 34.774907, + "longitude": -87.030479, + "city": "Belle Mina", + "state": "AL", + "county": "Limestone" + }, + { + "zip_code": 35616, + "latitude": 34.733866, + "longitude": -87.90624, + "city": "Cherokee", + "state": "AL", + "county": "Colbert" + }, + { + "zip_code": 35617, + "latitude": 34.869964, + "longitude": -87.706859, + "city": "Cloverdale", + "state": "AL", + "county": "Lauderdale" + }, + { + "zip_code": 35618, + "latitude": 34.673954, + "longitude": -87.28962, + "city": "Courtland", + "state": "AL", + "county": "Lawrence" + }, + { + "zip_code": 35619, + "latitude": 34.459389, + "longitude": -87.054151, + "city": "Danville", + "state": "AL", + "county": "Morgan" + }, + { + "zip_code": 35620, + "latitude": 34.899993, + "longitude": -86.972554, + "city": "Elkmont", + "state": "AL", + "county": "Limestone" + }, + { + "zip_code": 35621, + "latitude": 34.367528, + "longitude": -86.73641, + "city": "Eva", + "state": "AL", + "county": "Morgan" + }, + { + "zip_code": 35622, + "latitude": 34.361909, + "longitude": -86.899143, + "city": "Falkville", + "state": "AL", + "county": "Morgan" + }, + { + "zip_code": 35630, + "latitude": 34.869601, + "longitude": -87.686915, + "city": "Florence", + "state": "AL", + "county": "Lauderdale" + }, + { + "zip_code": 35631, + "latitude": 34.869964, + "longitude": -87.706859, + "city": "Florence", + "state": "AL", + "county": "Lauderdale" + }, + { + "zip_code": 35632, + "latitude": 34.869964, + "longitude": -87.706859, + "city": "Florence", + "state": "AL", + "county": "Lauderdale" + }, + { + "zip_code": 35633, + "latitude": 34.880706, + "longitude": -87.742362, + "city": "Florence", + "state": "AL", + "county": "Lauderdale" + }, + { + "zip_code": 35634, + "latitude": 34.900446, + "longitude": -87.794596, + "city": "Florence", + "state": "AL", + "county": "Lauderdale" + }, + { + "zip_code": 35640, + "latitude": 34.491606, + "longitude": -86.934715, + "city": "Hartselle", + "state": "AL", + "county": "Morgan" + }, + { + "zip_code": 35643, + "latitude": 34.635459, + "longitude": -87.267871, + "city": "Hillsboro", + "state": "AL", + "county": "Lawrence" + }, + { + "zip_code": 35645, + "latitude": 34.907715, + "longitude": -87.50135, + "city": "Killen", + "state": "AL", + "county": "Lauderdale" + }, + { + "zip_code": 35646, + "latitude": 34.677233, + "longitude": -87.53399, + "city": "Leighton", + "state": "AL", + "county": "Colbert" + }, + { + "zip_code": 35647, + "latitude": 34.959647, + "longitude": -87.100579, + "city": "Lester", + "state": "AL", + "county": "Limestone" + }, + { + "zip_code": 35648, + "latitude": 34.944077, + "longitude": -87.365663, + "city": "Lexington", + "state": "AL", + "county": "Lauderdale" + }, + { + "zip_code": 35649, + "latitude": 34.625877, + "longitude": -86.874641, + "city": "Mooresville", + "state": "AL", + "county": "Limestone" + }, + { + "zip_code": 35650, + "latitude": 34.492894, + "longitude": -87.299281, + "city": "Moulton", + "state": "AL", + "county": "Lawrence" + }, + { + "zip_code": 35651, + "latitude": 34.47926, + "longitude": -87.476911, + "city": "Mount Hope", + "state": "AL", + "county": "Lawrence" + }, + { + "zip_code": 35652, + "latitude": 34.844868, + "longitude": -87.321426, + "city": "Rogersville", + "state": "AL", + "county": "Lauderdale" + }, + { + "zip_code": 35653, + "latitude": 34.444903, + "longitude": -87.854726, + "city": "Russellville", + "state": "AL", + "county": "Franklin" + }, + { + "zip_code": 35654, + "latitude": 34.46752, + "longitude": -87.647762, + "city": "Russellville", + "state": "AL", + "county": "Franklin" + }, + { + "zip_code": 35660, + "latitude": 34.691165, + "longitude": -87.710054, + "city": "Sheffield", + "state": "AL", + "county": "Colbert" + }, + { + "zip_code": 35661, + "latitude": 34.758537, + "longitude": -87.70004, + "city": "Muscle Shoals", + "state": "AL", + "county": "Colbert" + }, + { + "zip_code": 35662, + "latitude": 34.757152, + "longitude": -87.966575, + "city": "Muscle Shoals", + "state": "AL", + "county": "Colbert" + }, + { + "zip_code": 35670, + "latitude": 34.436256, + "longitude": -86.729737, + "city": "Somerville", + "state": "AL", + "county": "Morgan" + }, + { + "zip_code": 35671, + "latitude": 34.679634, + "longitude": -86.962519, + "city": "Tanner", + "state": "AL", + "county": "Limestone" + }, + { + "zip_code": 35672, + "latitude": 34.633251, + "longitude": -87.418659, + "city": "Town Creek", + "state": "AL", + "county": "Lawrence" + }, + { + "zip_code": 35673, + "latitude": 34.591393, + "longitude": -87.078896, + "city": "Trinity", + "state": "AL", + "county": "Morgan" + }, + { + "zip_code": 35674, + "latitude": 34.66604, + "longitude": -87.749232, + "city": "Tuscumbia", + "state": "AL", + "county": "Colbert" + }, + { + "zip_code": 35677, + "latitude": 34.925311, + "longitude": -87.991142, + "city": "Waterloo", + "state": "AL", + "county": "Lauderdale" + }, + { + "zip_code": 35699, + "latitude": 34.495365, + "longitude": -86.82993, + "city": "Decatur", + "state": "AL", + "county": "Morgan" + }, + { + "zip_code": 35739, + "latitude": 34.961697, + "longitude": -86.844257, + "city": "Ardmore", + "state": "AL", + "county": "Limestone" + }, + { + "zip_code": 35740, + "latitude": 34.799983, + "longitude": -85.803464, + "city": "Bridgeport", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35741, + "latitude": 34.719303, + "longitude": -86.475425, + "city": "Brownsboro", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35742, + "latitude": 34.774907, + "longitude": -87.030479, + "city": "Capshaw", + "state": "AL", + "county": "Limestone" + }, + { + "zip_code": 35744, + "latitude": 34.60335, + "longitude": -85.911106, + "city": "Dutton", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35745, + "latitude": 34.925315, + "longitude": -86.190432, + "city": "Estillfork", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35746, + "latitude": 34.75343, + "longitude": -85.98022, + "city": "Fackler", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35747, + "latitude": 34.41847, + "longitude": -86.289976, + "city": "Grant", + "state": "AL", + "county": "Marshall" + }, + { + "zip_code": 35748, + "latitude": 34.722737, + "longitude": -86.40353, + "city": "Gurley", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35749, + "latitude": 34.829768, + "longitude": -86.703349, + "city": "Harvest", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35750, + "latitude": 34.937132, + "longitude": -86.581015, + "city": "Hazel Green", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35751, + "latitude": 34.79549, + "longitude": -86.274287, + "city": "Hollytree", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35752, + "latitude": 34.807443, + "longitude": -85.887684, + "city": "Hollywood", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35754, + "latitude": 34.50544, + "longitude": -86.62488, + "city": "Laceys Spring", + "state": "AL", + "county": "Morgan" + }, + { + "zip_code": 35755, + "latitude": 34.733585, + "longitude": -86.020239, + "city": "Langston", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35756, + "latitude": 34.651409, + "longitude": -86.754233, + "city": "Madison", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35757, + "latitude": 34.778246, + "longitude": -86.744163, + "city": "Madison", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35758, + "latitude": 34.710815, + "longitude": -86.742478, + "city": "Madison", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35759, + "latitude": 34.88186, + "longitude": -86.555622, + "city": "Meridianville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35760, + "latitude": 34.56112, + "longitude": -86.385064, + "city": "New Hope", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35761, + "latitude": 34.893332, + "longitude": -86.452042, + "city": "New Market", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35762, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Normal", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35763, + "latitude": 34.724161, + "longitude": -86.464438, + "city": "Owens Cross Roads", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35764, + "latitude": 34.703063, + "longitude": -86.306794, + "city": "Paint Rock", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35765, + "latitude": 34.669329, + "longitude": -86.016699, + "city": "Pisgah", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35766, + "latitude": 34.871329, + "longitude": -86.251275, + "city": "Princeton", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35767, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Ryland", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35768, + "latitude": 34.750724, + "longitude": -86.142151, + "city": "Scottsboro", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35769, + "latitude": 34.617951, + "longitude": -86.056162, + "city": "Scottsboro", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35771, + "latitude": 34.671536, + "longitude": -85.958355, + "city": "Section", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35772, + "latitude": 34.856233, + "longitude": -85.871317, + "city": "Stevenson", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35773, + "latitude": 34.904492, + "longitude": -86.681104, + "city": "Toney", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35774, + "latitude": 34.717551, + "longitude": -86.073788, + "city": "Trenton", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35775, + "latitude": 34.541985, + "longitude": -86.687136, + "city": "Valhermoso Springs", + "state": "AL", + "county": "Morgan" + }, + { + "zip_code": 35776, + "latitude": 34.746425, + "longitude": -86.076117, + "city": "Woodville", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35801, + "latitude": 34.718428, + "longitude": -86.556439, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35802, + "latitude": 34.660866, + "longitude": -86.560608, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35803, + "latitude": 34.58639, + "longitude": -86.536754, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35804, + "latitude": 34.728366, + "longitude": -86.585312, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35805, + "latitude": 34.702327, + "longitude": -86.628864, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35806, + "latitude": 34.76184, + "longitude": -86.686994, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35807, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35808, + "latitude": 34.677627, + "longitude": -86.612147, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35809, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35810, + "latitude": 34.797685, + "longitude": -86.593583, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35811, + "latitude": 34.791497, + "longitude": -86.513152, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35812, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35813, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35814, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35815, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35816, + "latitude": 34.753078, + "longitude": -86.628643, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35824, + "latitude": 34.645603, + "longitude": -86.752294, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35893, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35894, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35895, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35896, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35897, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35898, + "latitude": 34.733964, + "longitude": -86.522913, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35899, + "latitude": 34.733898, + "longitude": -86.645592, + "city": "Huntsville", + "state": "AL", + "county": "Madison" + }, + { + "zip_code": 35901, + "latitude": 34.024285, + "longitude": -86.074145, + "city": "Gadsden", + "state": "AL", + "county": "Etowah" + }, + { + "zip_code": 35902, + "latitude": 33.984062, + "longitude": -85.803434, + "city": "Gadsden", + "state": "AL", + "county": "Etowah" + }, + { + "zip_code": 35903, + "latitude": 33.984547, + "longitude": -85.907668, + "city": "Gadsden", + "state": "AL", + "county": "Etowah" + }, + { + "zip_code": 35904, + "latitude": 34.05744, + "longitude": -86.107869, + "city": "Gadsden", + "state": "AL", + "county": "Etowah" + }, + { + "zip_code": 35905, + "latitude": 33.93523, + "longitude": -85.957593, + "city": "Gadsden", + "state": "AL", + "county": "Etowah" + }, + { + "zip_code": 35906, + "latitude": 34.033764, + "longitude": -86.085173, + "city": "Rainbow City", + "state": "AL", + "county": "Etowah" + }, + { + "zip_code": 35907, + "latitude": 33.959647, + "longitude": -85.973173, + "city": "Gadsden", + "state": "AL", + "county": "Etowah" + }, + { + "zip_code": 35950, + "latitude": 34.314291, + "longitude": -86.242033, + "city": "Albertville", + "state": "AL", + "county": "Marshall" + }, + { + "zip_code": 35951, + "latitude": 34.322334, + "longitude": -86.193529, + "city": "Albertville", + "state": "AL", + "county": "Marshall" + }, + { + "zip_code": 35952, + "latitude": 34.07097, + "longitude": -86.209599, + "city": "Altoona", + "state": "AL", + "county": "Etowah" + }, + { + "zip_code": 35953, + "latitude": 33.785173, + "longitude": -86.216884, + "city": "Ashville", + "state": "AL", + "county": "Saint Clair" + }, + { + "zip_code": 35954, + "latitude": 34.051848, + "longitude": -86.061397, + "city": "Attalla", + "state": "AL", + "county": "Etowah" + }, + { + "zip_code": 35956, + "latitude": 34.267, + "longitude": -86.166021, + "city": "Boaz", + "state": "AL", + "county": "Marshall" + }, + { + "zip_code": 35957, + "latitude": 34.280737, + "longitude": -86.229092, + "city": "Boaz", + "state": "AL", + "county": "Marshall" + }, + { + "zip_code": 35958, + "latitude": 34.917606, + "longitude": -85.64924, + "city": "Bryant", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35959, + "latitude": 34.359072, + "longitude": -85.611793, + "city": "Cedar Bluff", + "state": "AL", + "county": "Cherokee" + }, + { + "zip_code": 35960, + "latitude": 34.110859, + "longitude": -85.590218, + "city": "Centre", + "state": "AL", + "county": "Cherokee" + }, + { + "zip_code": 35961, + "latitude": 34.337295, + "longitude": -85.85769, + "city": "Collinsville", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35962, + "latitude": 34.302028, + "longitude": -86.004164, + "city": "Crossville", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35963, + "latitude": 34.359123, + "longitude": -85.923978, + "city": "Dawson", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35964, + "latitude": 34.34962, + "longitude": -86.319824, + "city": "Douglas", + "state": "AL", + "county": "Marshall" + }, + { + "zip_code": 35966, + "latitude": 34.803085, + "longitude": -85.720245, + "city": "Flat Rock", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35967, + "latitude": 34.417112, + "longitude": -85.828068, + "city": "Fort Payne", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35968, + "latitude": 34.507242, + "longitude": -85.797851, + "city": "Fort Payne", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35971, + "latitude": 34.43038, + "longitude": -85.898669, + "city": "Fyffe", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35972, + "latitude": 34.00233, + "longitude": -86.224672, + "city": "Gallant", + "state": "AL", + "county": "Etowah" + }, + { + "zip_code": 35973, + "latitude": 34.373726, + "longitude": -85.557307, + "city": "Gaylesville", + "state": "AL", + "county": "Cherokee" + }, + { + "zip_code": 35974, + "latitude": 34.359204, + "longitude": -86.02397, + "city": "Geraldine", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35975, + "latitude": 34.435197, + "longitude": -86.038915, + "city": "Groveoak", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35976, + "latitude": 34.344851, + "longitude": -86.27518, + "city": "Guntersville", + "state": "AL", + "county": "Marshall" + }, + { + "zip_code": 35978, + "latitude": 34.600393, + "longitude": -85.730615, + "city": "Henagar", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35979, + "latitude": 34.839084, + "longitude": -85.619582, + "city": "Higdon", + "state": "AL", + "county": "Jackson" + }, + { + "zip_code": 35980, + "latitude": 34.209898, + "longitude": -86.343937, + "city": "Horton", + "state": "AL", + "county": "Marshall" + }, + { + "zip_code": 35981, + "latitude": 34.719358, + "longitude": -85.658943, + "city": "Ider", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35983, + "latitude": 34.144013, + "longitude": -85.748018, + "city": "Leesburg", + "state": "AL", + "county": "Cherokee" + }, + { + "zip_code": 35984, + "latitude": 34.556856, + "longitude": -85.578584, + "city": "Mentone", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35986, + "latitude": 34.419163, + "longitude": -85.761585, + "city": "Rainsville", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35987, + "latitude": 33.916778, + "longitude": -86.243593, + "city": "Steele", + "state": "AL", + "county": "Saint Clair" + }, + { + "zip_code": 35988, + "latitude": 34.570198, + "longitude": -85.729289, + "city": "Sylvania", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35989, + "latitude": 34.4879, + "longitude": -85.689133, + "city": "Valley Head", + "state": "AL", + "county": "De Kalb" + }, + { + "zip_code": 35990, + "latitude": 34.056618, + "longitude": -86.275434, + "city": "Walnut Grove", + "state": "AL", + "county": "Etowah" + }, + { + "zip_code": 36003, + "latitude": 32.450328, + "longitude": -86.721712, + "city": "Autaugaville", + "state": "AL", + "county": "Autauga" + }, + { + "zip_code": 36005, + "latitude": 31.839131, + "longitude": -85.928538, + "city": "Banks", + "state": "AL", + "county": "Pike" + }, + { + "zip_code": 36006, + "latitude": 32.576407, + "longitude": -86.711472, + "city": "Billingsley", + "state": "AL", + "county": "Autauga" + }, + { + "zip_code": 36008, + "latitude": 32.501649, + "longitude": -86.572711, + "city": "Booth", + "state": "AL", + "county": "Autauga" + }, + { + "zip_code": 36009, + "latitude": 31.560143, + "longitude": -86.327501, + "city": "Brantley", + "state": "AL", + "county": "Crenshaw" + }, + { + "zip_code": 36010, + "latitude": 31.713427, + "longitude": -85.816261, + "city": "Brundidge", + "state": "AL", + "county": "Pike" + }, + { + "zip_code": 36013, + "latitude": 32.310624, + "longitude": -86.186132, + "city": "Cecil", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36015, + "latitude": 31.642713, + "longitude": -86.734317, + "city": "Chapman", + "state": "AL", + "county": "Butler" + }, + { + "zip_code": 36016, + "latitude": 31.805322, + "longitude": -85.421299, + "city": "Clayton", + "state": "AL", + "county": "Barbour" + }, + { + "zip_code": 36017, + "latitude": 31.749142, + "longitude": -85.561944, + "city": "Clio", + "state": "AL", + "county": "Barbour" + }, + { + "zip_code": 36020, + "latitude": 32.505625, + "longitude": -86.332245, + "city": "Coosada", + "state": "AL", + "county": "Elmore" + }, + { + "zip_code": 36022, + "latitude": 32.614355, + "longitude": -86.35842, + "city": "Deatsville", + "state": "AL", + "county": "Elmore" + }, + { + "zip_code": 36023, + "latitude": 32.800155, + "longitude": -85.803427, + "city": "East Tallassee", + "state": "AL", + "county": "Tallapoosa" + }, + { + "zip_code": 36024, + "latitude": 32.645178, + "longitude": -86.036529, + "city": "Eclectic", + "state": "AL", + "county": "Elmore" + }, + { + "zip_code": 36025, + "latitude": 32.632954, + "longitude": -86.134553, + "city": "Elmore", + "state": "AL", + "county": "Elmore" + }, + { + "zip_code": 36026, + "latitude": 32.77522, + "longitude": -86.1216, + "city": "Equality", + "state": "AL", + "county": "Coosa" + }, + { + "zip_code": 36027, + "latitude": 31.914745, + "longitude": -85.389969, + "city": "Eufaula", + "state": "AL", + "county": "Barbour" + }, + { + "zip_code": 36028, + "latitude": 31.518541, + "longitude": -86.354365, + "city": "Dozier", + "state": "AL", + "county": "Crenshaw" + }, + { + "zip_code": 36029, + "latitude": 32.092808, + "longitude": -85.704649, + "city": "Fitzpatrick", + "state": "AL", + "county": "Bullock" + }, + { + "zip_code": 36030, + "latitude": 31.850138, + "longitude": -86.837211, + "city": "Forest Home", + "state": "AL", + "county": "Butler" + }, + { + "zip_code": 36031, + "latitude": 32.250651, + "longitude": -85.752417, + "city": "Fort Davis", + "state": "AL", + "county": "Macon" + }, + { + "zip_code": 36032, + "latitude": 32.01285, + "longitude": -86.608238, + "city": "Fort Deposit", + "state": "AL", + "county": "Lowndes" + }, + { + "zip_code": 36033, + "latitude": 31.624666, + "longitude": -86.634844, + "city": "Georgiana", + "state": "AL", + "county": "Butler" + }, + { + "zip_code": 36034, + "latitude": 31.611203, + "longitude": -86.167727, + "city": "Glenwood", + "state": "AL", + "county": "Crenshaw" + }, + { + "zip_code": 36035, + "latitude": 31.810302, + "longitude": -86.092603, + "city": "Goshen", + "state": "AL", + "county": "Pike" + }, + { + "zip_code": 36036, + "latitude": 32.011697, + "longitude": -86.166847, + "city": "Grady", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36037, + "latitude": 31.796729, + "longitude": -86.596233, + "city": "Greenville", + "state": "AL", + "county": "Butler" + }, + { + "zip_code": 36038, + "latitude": 31.260882, + "longitude": -86.444833, + "city": "Gantt", + "state": "AL", + "county": "Covington" + }, + { + "zip_code": 36039, + "latitude": 32.293879, + "longitude": -85.813517, + "city": "Hardaway", + "state": "AL", + "county": "Macon" + }, + { + "zip_code": 36040, + "latitude": 32.152198, + "longitude": -86.597157, + "city": "Hayneville", + "state": "AL", + "county": "Lowndes" + }, + { + "zip_code": 36041, + "latitude": 31.945789, + "longitude": -86.306248, + "city": "Highland Home", + "state": "AL", + "county": "Crenshaw" + }, + { + "zip_code": 36042, + "latitude": 31.871334, + "longitude": -86.405406, + "city": "Honoraville", + "state": "AL", + "county": "Crenshaw" + }, + { + "zip_code": 36043, + "latitude": 32.206441, + "longitude": -86.380464, + "city": "Hope Hull", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36045, + "latitude": 32.587631, + "longitude": -86.132981, + "city": "Kent", + "state": "AL", + "county": "Elmore" + }, + { + "zip_code": 36046, + "latitude": 32.081409, + "longitude": -86.356906, + "city": "Lapine", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36047, + "latitude": 32.072616, + "longitude": -86.510331, + "city": "Letohatchee", + "state": "AL", + "county": "Lowndes" + }, + { + "zip_code": 36048, + "latitude": 31.785579, + "longitude": -85.551104, + "city": "Louisville", + "state": "AL", + "county": "Barbour" + }, + { + "zip_code": 36049, + "latitude": 31.754655, + "longitude": -86.291595, + "city": "Luverne", + "state": "AL", + "county": "Crenshaw" + }, + { + "zip_code": 36051, + "latitude": 32.601807, + "longitude": -86.516424, + "city": "Marbury", + "state": "AL", + "county": "Autauga" + }, + { + "zip_code": 36052, + "latitude": 32.239196, + "longitude": -86.036354, + "city": "Mathews", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36053, + "latitude": 32.092808, + "longitude": -85.704649, + "city": "Midway", + "state": "AL", + "county": "Bullock" + }, + { + "zip_code": 36054, + "latitude": 32.584717, + "longitude": -86.225602, + "city": "Millbrook", + "state": "AL", + "county": "Elmore" + }, + { + "zip_code": 36057, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Mount Meigs", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36061, + "latitude": 32.092808, + "longitude": -85.704649, + "city": "Perote", + "state": "AL", + "county": "Bullock" + }, + { + "zip_code": 36062, + "latitude": 31.74589, + "longitude": -86.323949, + "city": "Petrey", + "state": "AL", + "county": "Crenshaw" + }, + { + "zip_code": 36064, + "latitude": 32.296092, + "longitude": -86.09259, + "city": "Pike Road", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36065, + "latitude": 32.072585, + "longitude": -86.060586, + "city": "Pine Level", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36066, + "latitude": 32.50919, + "longitude": -86.440879, + "city": "Prattville", + "state": "AL", + "county": "Autauga" + }, + { + "zip_code": 36067, + "latitude": 32.540642, + "longitude": -86.658347, + "city": "Prattville", + "state": "AL", + "county": "Autauga" + }, + { + "zip_code": 36068, + "latitude": 32.507893, + "longitude": -86.666272, + "city": "Prattville", + "state": "AL", + "county": "Autauga" + }, + { + "zip_code": 36069, + "latitude": 32.089321, + "longitude": -86.174619, + "city": "Ramer", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36071, + "latitude": 31.706155, + "longitude": -86.371489, + "city": "Rutledge", + "state": "AL", + "county": "Crenshaw" + }, + { + "zip_code": 36072, + "latitude": 31.826055, + "longitude": -85.166028, + "city": "Eufaula", + "state": "AL", + "county": "Barbour" + }, + { + "zip_code": 36075, + "latitude": 32.383939, + "longitude": -85.910123, + "city": "Shorter", + "state": "AL", + "county": "Macon" + }, + { + "zip_code": 36078, + "latitude": 32.594995, + "longitude": -85.985078, + "city": "Tallassee", + "state": "AL", + "county": "Elmore" + }, + { + "zip_code": 36079, + "latitude": 31.802786, + "longitude": -85.954983, + "city": "Troy", + "state": "AL", + "county": "Pike" + }, + { + "zip_code": 36080, + "latitude": 32.700393, + "longitude": -86.257604, + "city": "Titus", + "state": "AL", + "county": "Elmore" + }, + { + "zip_code": 36081, + "latitude": 31.869128, + "longitude": -85.966268, + "city": "Troy", + "state": "AL", + "county": "Pike" + }, + { + "zip_code": 36082, + "latitude": 31.816474, + "longitude": -85.964713, + "city": "Troy", + "state": "AL", + "county": "Pike" + }, + { + "zip_code": 36083, + "latitude": 32.372144, + "longitude": -85.66671, + "city": "Tuskegee", + "state": "AL", + "county": "Macon" + }, + { + "zip_code": 36087, + "latitude": 32.40926, + "longitude": -85.738032, + "city": "Tuskegee Institute", + "state": "AL", + "county": "Macon" + }, + { + "zip_code": 36088, + "latitude": 32.414501, + "longitude": -85.72525, + "city": "Tuskegee Institute", + "state": "AL", + "county": "Macon" + }, + { + "zip_code": 36089, + "latitude": 32.142191, + "longitude": -85.742406, + "city": "Union Springs", + "state": "AL", + "county": "Bullock" + }, + { + "zip_code": 36091, + "latitude": 32.776052, + "longitude": -86.644088, + "city": "Verbena", + "state": "AL", + "county": "Chilton" + }, + { + "zip_code": 36092, + "latitude": 32.592659, + "longitude": -86.215304, + "city": "Wetumpka", + "state": "AL", + "county": "Elmore" + }, + { + "zip_code": 36093, + "latitude": 32.562179, + "longitude": -86.099371, + "city": "Wetumpka", + "state": "AL", + "county": "Elmore" + }, + { + "zip_code": 36101, + "latitude": 32.356988, + "longitude": -86.257817, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36102, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36103, + "latitude": 32.346158, + "longitude": -86.287316, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36104, + "latitude": 32.373788, + "longitude": -86.289182, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36105, + "latitude": 32.22558, + "longitude": -86.290586, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36106, + "latitude": 32.353338, + "longitude": -86.257517, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36107, + "latitude": 32.380587, + "longitude": -86.280718, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36108, + "latitude": 32.340688, + "longitude": -86.37382, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36109, + "latitude": 32.390547, + "longitude": -86.239667, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36110, + "latitude": 32.441374, + "longitude": -86.253327, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36111, + "latitude": 32.342438, + "longitude": -86.267317, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36112, + "latitude": 32.374287, + "longitude": -86.345719, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36113, + "latitude": 32.384587, + "longitude": -86.303868, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36114, + "latitude": 32.403987, + "longitude": -86.253867, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36115, + "latitude": 32.407587, + "longitude": -86.247417, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36116, + "latitude": 32.285501, + "longitude": -86.228765, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36117, + "latitude": 32.370048, + "longitude": -86.116486, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36118, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36119, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36120, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36121, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36123, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36124, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36125, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36130, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36131, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36132, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36133, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36134, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36135, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36140, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36141, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36142, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36177, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36191, + "latitude": 32.233377, + "longitude": -86.208528, + "city": "Montgomery", + "state": "AL", + "county": "Montgomery" + }, + { + "zip_code": 36201, + "latitude": 33.759768, + "longitude": -85.792328, + "city": "Anniston", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36202, + "latitude": 33.762195, + "longitude": -85.837828, + "city": "Anniston", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36203, + "latitude": 33.725908, + "longitude": -85.899397, + "city": "Oxford", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36204, + "latitude": 33.762195, + "longitude": -85.837828, + "city": "Anniston", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36205, + "latitude": 33.735842, + "longitude": -85.793257, + "city": "Anniston", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36206, + "latitude": 33.806783, + "longitude": -85.759952, + "city": "Anniston", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36207, + "latitude": 33.720373, + "longitude": -85.753344, + "city": "Anniston", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36250, + "latitude": 33.780861, + "longitude": -85.904456, + "city": "Alexandria", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36251, + "latitude": 33.234539, + "longitude": -85.847477, + "city": "Ashland", + "state": "AL", + "county": "Clay" + }, + { + "zip_code": 36253, + "latitude": 33.762195, + "longitude": -85.837828, + "city": "Bynum", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36254, + "latitude": 33.657349, + "longitude": -85.699116, + "city": "Choccolocco", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36255, + "latitude": 33.193639, + "longitude": -85.745014, + "city": "Cragford", + "state": "AL", + "county": "Clay" + }, + { + "zip_code": 36256, + "latitude": 33.022741, + "longitude": -85.696391, + "city": "Daviston", + "state": "AL", + "county": "Tallapoosa" + }, + { + "zip_code": 36257, + "latitude": 33.762195, + "longitude": -85.837828, + "city": "De Armanville", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36258, + "latitude": 33.418514, + "longitude": -85.711041, + "city": "Delta", + "state": "AL", + "county": "Clay" + }, + { + "zip_code": 36260, + "latitude": 33.640094, + "longitude": -85.991753, + "city": "Eastaboga", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36261, + "latitude": 33.706595, + "longitude": -85.509902, + "city": "Edwardsville", + "state": "AL", + "county": "Cleburne" + }, + { + "zip_code": 36262, + "latitude": 33.779335, + "longitude": -85.463112, + "city": "Fruithurst", + "state": "AL", + "county": "Cleburne" + }, + { + "zip_code": 36263, + "latitude": 33.456308, + "longitude": -85.369167, + "city": "Graham", + "state": "AL", + "county": "Randolph" + }, + { + "zip_code": 36264, + "latitude": 33.627166, + "longitude": -85.502022, + "city": "Heflin", + "state": "AL", + "county": "Cleburne" + }, + { + "zip_code": 36265, + "latitude": 33.853627, + "longitude": -85.758295, + "city": "Jacksonville", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36266, + "latitude": 33.340127, + "longitude": -85.789238, + "city": "Lineville", + "state": "AL", + "county": "Clay" + }, + { + "zip_code": 36267, + "latitude": 33.18082, + "longitude": -85.941752, + "city": "Millerville", + "state": "AL", + "county": "Clay" + }, + { + "zip_code": 36268, + "latitude": 33.486183, + "longitude": -85.920854, + "city": "Munford", + "state": "AL", + "county": "Talladega" + }, + { + "zip_code": 36269, + "latitude": 33.729152, + "longitude": -85.394198, + "city": "Muscadine", + "state": "AL", + "county": "Cleburne" + }, + { + "zip_code": 36270, + "latitude": 33.42978, + "longitude": -85.468493, + "city": "Newell", + "state": "AL", + "county": "Randolph" + }, + { + "zip_code": 36271, + "latitude": 33.807215, + "longitude": -85.905573, + "city": "Ohatchee", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36272, + "latitude": 33.827328, + "longitude": -85.795257, + "city": "Piedmont", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36273, + "latitude": 33.565683, + "longitude": -85.38201, + "city": "Ranburne", + "state": "AL", + "county": "Cleburne" + }, + { + "zip_code": 36274, + "latitude": 33.216876, + "longitude": -85.405707, + "city": "Roanoke", + "state": "AL", + "county": "Randolph" + }, + { + "zip_code": 36275, + "latitude": 33.977829, + "longitude": -85.552143, + "city": "Spring Garden", + "state": "AL", + "county": "Cherokee" + }, + { + "zip_code": 36276, + "latitude": 33.207578, + "longitude": -85.480892, + "city": "Wadley", + "state": "AL", + "county": "Randolph" + }, + { + "zip_code": 36277, + "latitude": 33.81408, + "longitude": -85.835693, + "city": "Weaver", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36278, + "latitude": 33.318053, + "longitude": -85.498377, + "city": "Wedowee", + "state": "AL", + "county": "Randolph" + }, + { + "zip_code": 36279, + "latitude": 33.866182, + "longitude": -85.87097, + "city": "Wellington", + "state": "AL", + "county": "Calhoun" + }, + { + "zip_code": 36280, + "latitude": 33.351626, + "longitude": -85.372497, + "city": "Woodland", + "state": "AL", + "county": "Randolph" + }, + { + "zip_code": 36301, + "latitude": 31.148124, + "longitude": -85.371845, + "city": "Dothan", + "state": "AL", + "county": "Houston" + }, + { + "zip_code": 36302, + "latitude": 31.156018, + "longitude": -85.355931, + "city": "Dothan", + "state": "AL", + "county": "Houston" + }, + { + "zip_code": 36303, + "latitude": 31.160148, + "longitude": -85.322984, + "city": "Dothan", + "state": "AL", + "county": "Houston" + }, + { + "zip_code": 36304, + "latitude": 31.156018, + "longitude": -85.355931, + "city": "Dothan", + "state": "AL", + "county": "Houston" + }, + { + "zip_code": 36305, + "latitude": 31.219697, + "longitude": -85.4828, + "city": "Dothan", + "state": "AL", + "county": "Houston" + }, + { + "zip_code": 36310, + "latitude": 31.559402, + "longitude": -85.222965, + "city": "Abbeville", + "state": "AL", + "county": "Henry" + }, + { + "zip_code": 36311, + "latitude": 31.455485, + "longitude": -85.633907, + "city": "Ariton", + "state": "AL", + "county": "Dale" + }, + { + "zip_code": 36312, + "latitude": 31.189627, + "longitude": -85.262314, + "city": "Ashford", + "state": "AL", + "county": "Houston" + }, + { + "zip_code": 36313, + "latitude": 31.150094, + "longitude": -85.813687, + "city": "Bellwood", + "state": "AL", + "county": "Geneva" + }, + { + "zip_code": 36314, + "latitude": 31.096354, + "longitude": -85.83934, + "city": "Black", + "state": "AL", + "county": "Geneva" + }, + { + "zip_code": 36316, + "latitude": 31.176749, + "longitude": -85.813483, + "city": "Chancellor", + "state": "AL", + "county": "Geneva" + }, + { + "zip_code": 36317, + "latitude": 31.407872, + "longitude": -85.603458, + "city": "Clopton", + "state": "AL", + "county": "Dale" + }, + { + "zip_code": 36318, + "latitude": 31.149764, + "longitude": -85.946093, + "city": "Coffee Springs", + "state": "AL", + "county": "Geneva" + }, + { + "zip_code": 36319, + "latitude": 31.22514, + "longitude": -85.171875, + "city": "Columbia", + "state": "AL", + "county": "Houston" + }, + { + "zip_code": 36320, + "latitude": 31.099623, + "longitude": -85.314295, + "city": "Cottonwood", + "state": "AL", + "county": "Houston" + }, + { + "zip_code": 36321, + "latitude": 31.202473, + "longitude": -85.301373, + "city": "Cowarts", + "state": "AL", + "county": "Houston" + }, + { + "zip_code": 36322, + "latitude": 31.272415, + "longitude": -85.705129, + "city": "Daleville", + "state": "AL", + "county": "Dale" + }, + { + "zip_code": 36323, + "latitude": 31.407434, + "longitude": -86.083517, + "city": "Elba", + "state": "AL", + "county": "Coffee" + }, + { + "zip_code": 36330, + "latitude": 31.315846, + "longitude": -85.942956, + "city": "Enterprise", + "state": "AL", + "county": "Coffee" + }, + { + "zip_code": 36331, + "latitude": 31.297817, + "longitude": -85.90364, + "city": "Enterprise", + "state": "AL", + "county": "Coffee" + }, + { + "zip_code": 36340, + "latitude": 31.053473, + "longitude": -85.784393, + "city": "Geneva", + "state": "AL", + "county": "Geneva" + }, + { + "zip_code": 36343, + "latitude": 31.080374, + "longitude": -85.168005, + "city": "Gordon", + "state": "AL", + "county": "Houston" + }, + { + "zip_code": 36344, + "latitude": 31.105822, + "longitude": -85.690252, + "city": "Hartford", + "state": "AL", + "county": "Geneva" + }, + { + "zip_code": 36345, + "latitude": 31.357917, + "longitude": -85.30124, + "city": "Headland", + "state": "AL", + "county": "Henry" + }, + { + "zip_code": 36346, + "latitude": 31.565157, + "longitude": -85.970956, + "city": "Jack", + "state": "AL", + "county": "Coffee" + }, + { + "zip_code": 36349, + "latitude": 31.121244, + "longitude": -85.559235, + "city": "Malvern", + "state": "AL", + "county": "Geneva" + }, + { + "zip_code": 36350, + "latitude": 31.33494, + "longitude": -85.511331, + "city": "Midland City", + "state": "AL", + "county": "Dale" + }, + { + "zip_code": 36351, + "latitude": 31.398322, + "longitude": -85.927933, + "city": "New Brockton", + "state": "AL", + "county": "Coffee" + }, + { + "zip_code": 36352, + "latitude": 31.352897, + "longitude": -85.659319, + "city": "Newton", + "state": "AL", + "county": "Dale" + }, + { + "zip_code": 36353, + "latitude": 31.411109, + "longitude": -85.366472, + "city": "Newville", + "state": "AL", + "county": "Henry" + }, + { + "zip_code": 36360, + "latitude": 31.450171, + "longitude": -85.65182, + "city": "Ozark", + "state": "AL", + "county": "Dale" + }, + { + "zip_code": 36361, + "latitude": 31.407872, + "longitude": -85.603458, + "city": "Ozark", + "state": "AL", + "county": "Dale" + }, + { + "zip_code": 36362, + "latitude": 31.327347, + "longitude": -85.737811, + "city": "Fort Rucker", + "state": "AL", + "county": "Dale" + }, + { + "zip_code": 36370, + "latitude": 31.14031, + "longitude": -85.157345, + "city": "Pansey", + "state": "AL", + "county": "Houston" + }, + { + "zip_code": 36371, + "latitude": 31.307446, + "longitude": -85.52633, + "city": "Pinckard", + "state": "AL", + "county": "Dale" + }, + { + "zip_code": 36373, + "latitude": 31.501042, + "longitude": -85.113506, + "city": "Shorterville", + "state": "AL", + "county": "Henry" + }, + { + "zip_code": 36374, + "latitude": 31.574779, + "longitude": -85.536957, + "city": "Skipperville", + "state": "AL", + "county": "Dale" + }, + { + "zip_code": 36375, + "latitude": 31.137138, + "longitude": -85.564508, + "city": "Slocomb", + "state": "AL", + "county": "Geneva" + }, + { + "zip_code": 36376, + "latitude": 31.252306, + "longitude": -85.264387, + "city": "Webb", + "state": "AL", + "county": "Houston" + }, + { + "zip_code": 36401, + "latitude": 31.489241, + "longitude": -87.052004, + "city": "Evergreen", + "state": "AL", + "county": "Conecuh" + }, + { + "zip_code": 36420, + "latitude": 31.304166, + "longitude": -86.386398, + "city": "Andalusia", + "state": "AL", + "county": "Covington" + }, + { + "zip_code": 36425, + "latitude": 31.56779, + "longitude": -87.250028, + "city": "Beatrice", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36426, + "latitude": 31.129427, + "longitude": -87.096126, + "city": "Brewton", + "state": "AL", + "county": "Escambia" + }, + { + "zip_code": 36427, + "latitude": 31.091784, + "longitude": -87.26404, + "city": "Brewton", + "state": "AL", + "county": "Escambia" + }, + { + "zip_code": 36429, + "latitude": 31.466945, + "longitude": -87.044687, + "city": "Brooklyn", + "state": "AL", + "county": "Conecuh" + }, + { + "zip_code": 36431, + "latitude": 31.529531, + "longitude": -87.345345, + "city": "Burnt Corn", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36432, + "latitude": 31.370941, + "longitude": -86.998104, + "city": "Castleberry", + "state": "AL", + "county": "Conecuh" + }, + { + "zip_code": 36435, + "latitude": 31.871803, + "longitude": -87.412893, + "city": "Coy", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36436, + "latitude": 31.58842, + "longitude": -87.840875, + "city": "Dickinson", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36439, + "latitude": 31.429472, + "longitude": -87.339329, + "city": "Excel", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36441, + "latitude": 31.060013, + "longitude": -87.199942, + "city": "Flomaton", + "state": "AL", + "county": "Escambia" + }, + { + "zip_code": 36442, + "latitude": 31.019653, + "longitude": -86.329568, + "city": "Florala", + "state": "AL", + "county": "Covington" + }, + { + "zip_code": 36444, + "latitude": 31.590428, + "longitude": -87.447935, + "city": "Franklin", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36445, + "latitude": 31.522005, + "longitude": -87.381527, + "city": "Frisco City", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36446, + "latitude": 31.782639, + "longitude": -87.741085, + "city": "Fulton", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36449, + "latitude": 31.529531, + "longitude": -87.345345, + "city": "Goodway", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36451, + "latitude": 31.704953, + "longitude": -87.801307, + "city": "Grove Hill", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36453, + "latitude": 31.238943, + "longitude": -86.124023, + "city": "Kinston", + "state": "AL", + "county": "Coffee" + }, + { + "zip_code": 36454, + "latitude": 31.466945, + "longitude": -87.044687, + "city": "Lenox", + "state": "AL", + "county": "Conecuh" + }, + { + "zip_code": 36455, + "latitude": 31.260882, + "longitude": -86.444833, + "city": "Lockhart", + "state": "AL", + "county": "Covington" + }, + { + "zip_code": 36456, + "latitude": 31.546733, + "longitude": -86.713793, + "city": "Mc Kenzie", + "state": "AL", + "county": "Butler" + }, + { + "zip_code": 36457, + "latitude": 31.361214, + "longitude": -87.435279, + "city": "Megargel", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36458, + "latitude": 31.514659, + "longitude": -87.408362, + "city": "Mexia", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36460, + "latitude": 31.56713, + "longitude": -87.314222, + "city": "Monroeville", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36461, + "latitude": 31.522093, + "longitude": -87.341108, + "city": "Monroeville", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36462, + "latitude": 31.529531, + "longitude": -87.345345, + "city": "Monroeville", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36467, + "latitude": 31.260401, + "longitude": -86.356208, + "city": "Opp", + "state": "AL", + "county": "Covington" + }, + { + "zip_code": 36470, + "latitude": 31.508073, + "longitude": -87.428429, + "city": "Perdue Hill", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36471, + "latitude": 31.606263, + "longitude": -87.21944, + "city": "Peterman", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36473, + "latitude": 31.466945, + "longitude": -87.044687, + "city": "Range", + "state": "AL", + "county": "Conecuh" + }, + { + "zip_code": 36474, + "latitude": 31.260882, + "longitude": -86.444833, + "city": "Red Level", + "state": "AL", + "county": "Covington" + }, + { + "zip_code": 36475, + "latitude": 31.371175, + "longitude": -87.298377, + "city": "Repton", + "state": "AL", + "county": "Conecuh" + }, + { + "zip_code": 36476, + "latitude": 31.260882, + "longitude": -86.444833, + "city": "River Falls", + "state": "AL", + "county": "Covington" + }, + { + "zip_code": 36477, + "latitude": 31.07181, + "longitude": -86.113647, + "city": "Samson", + "state": "AL", + "county": "Geneva" + }, + { + "zip_code": 36480, + "latitude": 31.541789, + "longitude": -87.500236, + "city": "Uriah", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36481, + "latitude": 31.808458, + "longitude": -87.316372, + "city": "Vredenburgh", + "state": "AL", + "county": "Monroe" + }, + { + "zip_code": 36482, + "latitude": 31.67448, + "longitude": -87.675884, + "city": "Whatley", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36483, + "latitude": 31.022268, + "longitude": -86.629331, + "city": "Wing", + "state": "AL", + "county": "Covington" + }, + { + "zip_code": 36501, + "latitude": 31.482494, + "longitude": -87.880106, + "city": "Alma", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36502, + "latitude": 31.119972, + "longitude": -87.470001, + "city": "Atmore", + "state": "AL", + "county": "Escambia" + }, + { + "zip_code": 36503, + "latitude": 31.128242, + "longitude": -87.152068, + "city": "Atmore", + "state": "AL", + "county": "Escambia" + }, + { + "zip_code": 36504, + "latitude": 31.015817, + "longitude": -87.497165, + "city": "Atmore", + "state": "AL", + "county": "Escambia" + }, + { + "zip_code": 36505, + "latitude": 30.939368, + "longitude": -88.015868, + "city": "Axis", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36507, + "latitude": 30.763492, + "longitude": -87.756371, + "city": "Bay Minette", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36509, + "latitude": 30.419006, + "longitude": -88.253643, + "city": "Bayou La Batre", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36511, + "latitude": 30.465497, + "longitude": -87.753507, + "city": "Bon Secour", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36512, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Bucks", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36513, + "latitude": 31.406683, + "longitude": -88.175846, + "city": "Calvert", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36515, + "latitude": 31.58842, + "longitude": -87.840875, + "city": "Carlton", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36518, + "latitude": 31.436682, + "longitude": -88.245363, + "city": "Chatom", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36521, + "latitude": 30.929148, + "longitude": -88.181921, + "city": "Chunchula", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36522, + "latitude": 30.798501, + "longitude": -88.273482, + "city": "Citronelle", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36523, + "latitude": 30.390301, + "longitude": -88.207586, + "city": "Coden", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36524, + "latitude": 31.816246, + "longitude": -88.061865, + "city": "Coffeeville", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36525, + "latitude": 30.944616, + "longitude": -88.090905, + "city": "Creola", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36526, + "latitude": 30.540328, + "longitude": -87.6912, + "city": "Daphne", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36527, + "latitude": 30.737792, + "longitude": -87.900287, + "city": "Spanish Fort", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36528, + "latitude": 30.254867, + "longitude": -88.1349, + "city": "Dauphin Island", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36529, + "latitude": 31.406683, + "longitude": -88.175846, + "city": "Deer Park", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36530, + "latitude": 30.412773, + "longitude": -87.549041, + "city": "Elberta", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36532, + "latitude": 30.562883, + "longitude": -87.810464, + "city": "Fairhope", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36533, + "latitude": 30.484131, + "longitude": -87.860613, + "city": "Fairhope", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36535, + "latitude": 30.467608, + "longitude": -87.692401, + "city": "Foley", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36536, + "latitude": 30.42216, + "longitude": -87.706371, + "city": "Foley", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36538, + "latitude": 31.406683, + "longitude": -88.175846, + "city": "Frankville", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36539, + "latitude": 31.406683, + "longitude": -88.175846, + "city": "Fruitdale", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36540, + "latitude": 31.58842, + "longitude": -87.840875, + "city": "Gainestown", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36541, + "latitude": 30.498046, + "longitude": -88.332468, + "city": "Grand Bay", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36542, + "latitude": 30.284936, + "longitude": -87.794246, + "city": "Gulf Shores", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36543, + "latitude": 31.216132, + "longitude": -87.461537, + "city": "Huxford", + "state": "AL", + "county": "Escambia" + }, + { + "zip_code": 36544, + "latitude": 30.479141, + "longitude": -88.232843, + "city": "Irvington", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36545, + "latitude": 31.592985, + "longitude": -87.898539, + "city": "Jackson", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36547, + "latitude": 30.265325, + "longitude": -87.629926, + "city": "Gulf Shores", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36548, + "latitude": 31.406683, + "longitude": -88.175846, + "city": "Leroy", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36549, + "latitude": 30.39736, + "longitude": -87.458796, + "city": "Lillian", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36550, + "latitude": 31.22896, + "longitude": -87.713373, + "city": "Little River", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36551, + "latitude": 30.513519, + "longitude": -87.667604, + "city": "Loxley", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36553, + "latitude": 31.209178, + "longitude": -88.075266, + "city": "Mc Intosh", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36555, + "latitude": 30.427641, + "longitude": -87.796011, + "city": "Magnolia Springs", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36556, + "latitude": 31.406683, + "longitude": -88.175846, + "city": "Malcolm", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36558, + "latitude": 31.553004, + "longitude": -88.294124, + "city": "Millry", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36559, + "latitude": 30.562308, + "longitude": -87.900545, + "city": "Montrose", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36560, + "latitude": 31.080313, + "longitude": -88.057203, + "city": "Mount Vernon", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36561, + "latitude": 30.281046, + "longitude": -87.581457, + "city": "Orange Beach", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36562, + "latitude": 31.040286, + "longitude": -87.666699, + "city": "Perdido", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36564, + "latitude": 30.475955, + "longitude": -87.917867, + "city": "Point Clear", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36567, + "latitude": 30.749915, + "longitude": -87.577231, + "city": "Robertsdale", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36568, + "latitude": 30.49434, + "longitude": -88.269865, + "city": "Saint Elmo", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36569, + "latitude": 31.552362, + "longitude": -88.090115, + "city": "Saint Stephens", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36570, + "latitude": 31.58842, + "longitude": -87.840875, + "city": "Salitpa", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36571, + "latitude": 30.869984, + "longitude": -88.118401, + "city": "Saraland", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36572, + "latitude": 30.585158, + "longitude": -88.087879, + "city": "Satsuma", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36574, + "latitude": 30.51715, + "longitude": -87.603901, + "city": "Seminole", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36575, + "latitude": 30.779545, + "longitude": -88.272544, + "city": "Semmes", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36576, + "latitude": 30.527068, + "longitude": -87.735, + "city": "Silverhill", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36577, + "latitude": 30.732789, + "longitude": -87.70195, + "city": "Spanish Fort", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36578, + "latitude": 30.85852, + "longitude": -87.728987, + "city": "Stapleton", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36579, + "latitude": 31.079113, + "longitude": -87.798576, + "city": "Stockton", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36580, + "latitude": 30.468691, + "longitude": -87.703035, + "city": "Summerdale", + "state": "AL", + "county": "Baldwin" + }, + { + "zip_code": 36581, + "latitude": 31.369572, + "longitude": -88.012236, + "city": "Sunflower", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36582, + "latitude": 30.486565, + "longitude": -88.20225, + "city": "Theodore", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36583, + "latitude": 31.406683, + "longitude": -88.175846, + "city": "Tibbie", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36584, + "latitude": 31.213691, + "longitude": -88.393047, + "city": "Vinegar Bend", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36585, + "latitude": 31.406683, + "longitude": -88.175846, + "city": "Wagarville", + "state": "AL", + "county": "Washington" + }, + { + "zip_code": 36586, + "latitude": 31.58842, + "longitude": -87.840875, + "city": "Walker Springs", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36587, + "latitude": 30.812649, + "longitude": -88.318487, + "city": "Wilmer", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36590, + "latitude": 30.487953, + "longitude": -88.253278, + "city": "Theodore", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36601, + "latitude": 30.701142, + "longitude": -88.103184, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36602, + "latitude": 30.692389, + "longitude": -88.046698, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36603, + "latitude": 30.69117, + "longitude": -88.057773, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36604, + "latitude": 30.684039, + "longitude": -88.067048, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36605, + "latitude": 30.601842, + "longitude": -88.118975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36606, + "latitude": 30.66709, + "longitude": -88.1052, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36607, + "latitude": 30.788123, + "longitude": -88.088073, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36608, + "latitude": 30.639867, + "longitude": -88.25445, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36609, + "latitude": 30.551887, + "longitude": -88.185603, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36610, + "latitude": 30.7309, + "longitude": -88.078949, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36611, + "latitude": 30.768787, + "longitude": -88.11085, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36612, + "latitude": 30.747387, + "longitude": -88.118001, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36613, + "latitude": 30.769758, + "longitude": -88.196296, + "city": "Eight Mile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36614, + "latitude": 30.601892, + "longitude": -88.211103, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36615, + "latitude": 30.64109, + "longitude": -88.062248, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36616, + "latitude": 30.671048, + "longitude": -88.126656, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36617, + "latitude": 30.715588, + "longitude": -88.096, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36618, + "latitude": 30.681689, + "longitude": -88.149001, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36619, + "latitude": 30.462987, + "longitude": -88.216493, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36621, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36622, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36623, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36625, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36626, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36628, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36630, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36631, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36633, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36640, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36641, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36644, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36652, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36660, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36663, + "latitude": 30.81901, + "longitude": -88.231726, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36670, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36671, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36675, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36685, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36688, + "latitude": 30.696589, + "longitude": -88.173652, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36689, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36690, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36691, + "latitude": 30.658865, + "longitude": -88.177975, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36693, + "latitude": 30.635741, + "longitude": -88.174502, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36695, + "latitude": 30.666959, + "longitude": -88.226989, + "city": "Mobile", + "state": "AL", + "county": "Mobile" + }, + { + "zip_code": 36701, + "latitude": 32.43372, + "longitude": -87.055532, + "city": "Selma", + "state": "AL", + "county": "Dallas" + }, + { + "zip_code": 36702, + "latitude": 32.419259, + "longitude": -87.124708, + "city": "Selma", + "state": "AL", + "county": "Dallas" + }, + { + "zip_code": 36703, + "latitude": 32.467164, + "longitude": -86.959844, + "city": "Selma", + "state": "AL", + "county": "Dallas" + }, + { + "zip_code": 36720, + "latitude": 32.145564, + "longitude": -87.354953, + "city": "Alberta", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36721, + "latitude": 32.048079, + "longitude": -87.26226, + "city": "Annemanie", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36722, + "latitude": 32.051214, + "longitude": -87.569778, + "city": "Arlington", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36723, + "latitude": 32.082415, + "longitude": -87.294855, + "city": "Boykin", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36726, + "latitude": 31.998366, + "longitude": -87.351944, + "city": "Camden", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36727, + "latitude": 31.58842, + "longitude": -87.840875, + "city": "Campbell", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36728, + "latitude": 32.192472, + "longitude": -87.467873, + "city": "Catherine", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36732, + "latitude": 32.384949, + "longitude": -87.824556, + "city": "Demopolis", + "state": "AL", + "county": "Marengo" + }, + { + "zip_code": 36736, + "latitude": 32.261286, + "longitude": -87.77611, + "city": "Dixons Mills", + "state": "AL", + "county": "Marengo" + }, + { + "zip_code": 36738, + "latitude": 32.365963, + "longitude": -87.721033, + "city": "Faunsdale", + "state": "AL", + "county": "Marengo" + }, + { + "zip_code": 36740, + "latitude": 32.610762, + "longitude": -87.844122, + "city": "Forkland", + "state": "AL", + "county": "Greene" + }, + { + "zip_code": 36741, + "latitude": 32.006129, + "longitude": -86.981703, + "city": "Furman", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36742, + "latitude": 32.52418, + "longitude": -87.672092, + "city": "Gallion", + "state": "AL", + "county": "Hale" + }, + { + "zip_code": 36744, + "latitude": 32.699872, + "longitude": -87.586079, + "city": "Greensboro", + "state": "AL", + "county": "Hale" + }, + { + "zip_code": 36745, + "latitude": 32.414036, + "longitude": -87.898611, + "city": "Jefferson", + "state": "AL", + "county": "Marengo" + }, + { + "zip_code": 36748, + "latitude": 32.321943, + "longitude": -87.749847, + "city": "Linden", + "state": "AL", + "county": "Marengo" + }, + { + "zip_code": 36749, + "latitude": 32.510383, + "longitude": -86.813834, + "city": "Jones", + "state": "AL", + "county": "Autauga" + }, + { + "zip_code": 36750, + "latitude": 32.83217, + "longitude": -86.843808, + "city": "Maplesville", + "state": "AL", + "county": "Chilton" + }, + { + "zip_code": 36751, + "latitude": 31.902773, + "longitude": -87.577911, + "city": "Lower Peach Tree", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36752, + "latitude": 32.294321, + "longitude": -86.647119, + "city": "Lowndesboro", + "state": "AL", + "county": "Lowndes" + }, + { + "zip_code": 36753, + "latitude": 32.048079, + "longitude": -87.26226, + "city": "Mc Williams", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36754, + "latitude": 32.129123, + "longitude": -87.706019, + "city": "Magnolia", + "state": "AL", + "county": "Marengo" + }, + { + "zip_code": 36756, + "latitude": 32.608995, + "longitude": -87.350401, + "city": "Marion", + "state": "AL", + "county": "Perry" + }, + { + "zip_code": 36758, + "latitude": 32.484147, + "longitude": -87.076236, + "city": "Plantersville", + "state": "AL", + "county": "Dallas" + }, + { + "zip_code": 36759, + "latitude": 32.388235, + "longitude": -87.26262, + "city": "Marion Junction", + "state": "AL", + "county": "Dallas" + }, + { + "zip_code": 36761, + "latitude": 32.189926, + "longitude": -87.063331, + "city": "Minter", + "state": "AL", + "county": "Dallas" + }, + { + "zip_code": 36762, + "latitude": 31.940191, + "longitude": -88.00336, + "city": "Morvin", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36763, + "latitude": 32.251626, + "longitude": -87.949363, + "city": "Myrtlewood", + "state": "AL", + "county": "Marengo" + }, + { + "zip_code": 36764, + "latitude": 32.268329, + "longitude": -87.795275, + "city": "Nanafalia", + "state": "AL", + "county": "Marengo" + }, + { + "zip_code": 36765, + "latitude": 32.58819, + "longitude": -87.56625, + "city": "Newbern", + "state": "AL", + "county": "Hale" + }, + { + "zip_code": 36766, + "latitude": 31.947005, + "longitude": -87.074497, + "city": "Oak Hill", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36767, + "latitude": 32.289861, + "longitude": -87.219864, + "city": "Orrville", + "state": "AL", + "county": "Dallas" + }, + { + "zip_code": 36768, + "latitude": 31.932526, + "longitude": -87.044855, + "city": "Pine Apple", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36769, + "latitude": 31.994807, + "longitude": -87.545406, + "city": "Pine Hill", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36773, + "latitude": 32.322859, + "longitude": -87.376446, + "city": "Safford", + "state": "AL", + "county": "Dallas" + }, + { + "zip_code": 36775, + "latitude": 32.213977, + "longitude": -87.078655, + "city": "Sardis", + "state": "AL", + "county": "Dallas" + }, + { + "zip_code": 36776, + "latitude": 32.755975, + "longitude": -87.705829, + "city": "Sawyerville", + "state": "AL", + "county": "Hale" + }, + { + "zip_code": 36778, + "latitude": 32.01998, + "longitude": -87.054284, + "city": "Snow Hill", + "state": "AL", + "county": "Wilcox" + }, + { + "zip_code": 36779, + "latitude": 32.591207, + "longitude": -87.271667, + "city": "Sprott", + "state": "AL", + "county": "Perry" + }, + { + "zip_code": 36782, + "latitude": 32.131469, + "longitude": -87.83266, + "city": "Sweet Water", + "state": "AL", + "county": "Marengo" + }, + { + "zip_code": 36783, + "latitude": 32.302397, + "longitude": -87.678612, + "city": "Thomaston", + "state": "AL", + "county": "Marengo" + }, + { + "zip_code": 36784, + "latitude": 31.745135, + "longitude": -87.769476, + "city": "Thomasville", + "state": "AL", + "county": "Clarke" + }, + { + "zip_code": 36785, + "latitude": 32.323895, + "longitude": -86.86458, + "city": "Tyler", + "state": "AL", + "county": "Dallas" + }, + { + "zip_code": 36786, + "latitude": 32.446243, + "longitude": -87.503256, + "city": "Uniontown", + "state": "AL", + "county": "Perry" + }, + { + "zip_code": 36790, + "latitude": 32.723537, + "longitude": -86.875759, + "city": "Stanton", + "state": "AL", + "county": "Chilton" + }, + { + "zip_code": 36792, + "latitude": 32.931293, + "longitude": -86.917506, + "city": "Randolph", + "state": "AL", + "county": "Bibb" + }, + { + "zip_code": 36793, + "latitude": 32.891444, + "longitude": -86.983385, + "city": "Lawley", + "state": "AL", + "county": "Bibb" + }, + { + "zip_code": 36801, + "latitude": 32.621147, + "longitude": -85.392878, + "city": "Opelika", + "state": "AL", + "county": "Lee" + }, + { + "zip_code": 36802, + "latitude": 32.578185, + "longitude": -85.349003, + "city": "Opelika", + "state": "AL", + "county": "Lee" + }, + { + "zip_code": 36803, + "latitude": 32.522567, + "longitude": -85.431517, + "city": "Opelika", + "state": "AL", + "county": "Lee" + }, + { + "zip_code": 36804, + "latitude": 32.576792, + "longitude": -85.311984, + "city": "Opelika", + "state": "AL", + "county": "Lee" + }, + { + "zip_code": 36830, + "latitude": 32.547542, + "longitude": -85.468222, + "city": "Auburn", + "state": "AL", + "county": "Lee" + }, + { + "zip_code": 36831, + "latitude": 32.578185, + "longitude": -85.349003, + "city": "Auburn", + "state": "AL", + "county": "Lee" + }, + { + "zip_code": 36832, + "latitude": 32.592036, + "longitude": -85.518913, + "city": "Auburn", + "state": "AL", + "county": "Lee" + }, + { + "zip_code": 36849, + "latitude": 32.578185, + "longitude": -85.349003, + "city": "Auburn University", + "state": "AL", + "county": "Lee" + }, + { + "zip_code": 36850, + "latitude": 32.808407, + "longitude": -85.703776, + "city": "Camp Hill", + "state": "AL", + "county": "Tallapoosa" + }, + { + "zip_code": 36851, + "latitude": 32.286092, + "longitude": -85.161497, + "city": "Cottonton", + "state": "AL", + "county": "Russell" + }, + { + "zip_code": 36852, + "latitude": 32.783137, + "longitude": -85.275581, + "city": "Cusseta", + "state": "AL", + "county": "Chambers" + }, + { + "zip_code": 36853, + "latitude": 32.794796, + "longitude": -85.744428, + "city": "Dadeville", + "state": "AL", + "county": "Tallapoosa" + }, + { + "zip_code": 36854, + "latitude": 32.885631, + "longitude": -85.264695, + "city": "Valley", + "state": "AL", + "county": "Chambers" + }, + { + "zip_code": 36855, + "latitude": 32.91934, + "longitude": -85.311223, + "city": "Five Points", + "state": "AL", + "county": "Chambers" + }, + { + "zip_code": 36856, + "latitude": 32.296518, + "longitude": -84.997165, + "city": "Fort Mitchell", + "state": "AL", + "county": "Russell" + }, + { + "zip_code": 36858, + "latitude": 32.295844, + "longitude": -85.292938, + "city": "Hatchechubbee", + "state": "AL", + "county": "Russell" + }, + { + "zip_code": 36859, + "latitude": 32.229846, + "longitude": -85.008178, + "city": "Holy Trinity", + "state": "AL", + "county": "Russell" + }, + { + "zip_code": 36860, + "latitude": 32.238147, + "longitude": -85.36233, + "city": "Hurtsboro", + "state": "AL", + "county": "Russell" + }, + { + "zip_code": 36861, + "latitude": 32.900767, + "longitude": -85.822787, + "city": "Jacksons Gap", + "state": "AL", + "county": "Tallapoosa" + }, + { + "zip_code": 36862, + "latitude": 32.912315, + "longitude": -85.388079, + "city": "Lafayette", + "state": "AL", + "county": "Chambers" + }, + { + "zip_code": 36863, + "latitude": 32.900173, + "longitude": -85.296659, + "city": "Lanett", + "state": "AL", + "county": "Chambers" + }, + { + "zip_code": 36865, + "latitude": 32.578185, + "longitude": -85.349003, + "city": "Loachapoka", + "state": "AL", + "county": "Lee" + }, + { + "zip_code": 36866, + "latitude": 32.536635, + "longitude": -85.697354, + "city": "Notasulga", + "state": "AL", + "county": "Macon" + }, + { + "zip_code": 36867, + "latitude": 32.375318, + "longitude": -85.203923, + "city": "Phenix City", + "state": "AL", + "county": "Russell" + }, + { + "zip_code": 36868, + "latitude": 32.464614, + "longitude": -85.020604, + "city": "Phenix City", + "state": "AL", + "county": "Russell" + }, + { + "zip_code": 36869, + "latitude": 32.318701, + "longitude": -85.111997, + "city": "Phenix City", + "state": "AL", + "county": "Russell" + }, + { + "zip_code": 36870, + "latitude": 32.478145, + "longitude": -85.123979, + "city": "Phenix City", + "state": "AL", + "county": "Russell" + }, + { + "zip_code": 36871, + "latitude": 32.166569, + "longitude": -85.165575, + "city": "Pittsview", + "state": "AL", + "county": "Russell" + }, + { + "zip_code": 36872, + "latitude": 32.578185, + "longitude": -85.349003, + "city": "Valley", + "state": "AL", + "county": "Lee" + }, + { + "zip_code": 36874, + "latitude": 32.580449, + "longitude": -85.217224, + "city": "Salem", + "state": "AL", + "county": "Lee" + }, + { + "zip_code": 36875, + "latitude": 32.257831, + "longitude": -85.129772, + "city": "Seale", + "state": "AL", + "county": "Russell" + }, + { + "zip_code": 36877, + "latitude": 32.558314, + "longitude": -85.091498, + "city": "Smiths", + "state": "AL", + "county": "Lee" + }, + { + "zip_code": 36879, + "latitude": 32.681539, + "longitude": -85.565954, + "city": "Waverly", + "state": "AL", + "county": "Lee" + }, + { + "zip_code": 36901, + "latitude": 32.467134, + "longitude": -88.140634, + "city": "Bellamy", + "state": "AL", + "county": "Sumter" + }, + { + "zip_code": 36904, + "latitude": 32.115939, + "longitude": -88.273598, + "city": "Butler", + "state": "AL", + "county": "Choctaw" + }, + { + "zip_code": 36906, + "latitude": 32.004227, + "longitude": -88.200738, + "city": "Cromwell", + "state": "AL", + "county": "Choctaw" + }, + { + "zip_code": 36907, + "latitude": 32.435545, + "longitude": -88.329881, + "city": "Cuba", + "state": "AL", + "county": "Sumter" + }, + { + "zip_code": 36908, + "latitude": 31.922384, + "longitude": -88.323669, + "city": "Gilbertown", + "state": "AL", + "county": "Choctaw" + }, + { + "zip_code": 36910, + "latitude": 32.004227, + "longitude": -88.200738, + "city": "Jachin", + "state": "AL", + "county": "Choctaw" + }, + { + "zip_code": 36912, + "latitude": 32.233182, + "longitude": -88.321388, + "city": "Lisman", + "state": "AL", + "county": "Choctaw" + }, + { + "zip_code": 36913, + "latitude": 32.004227, + "longitude": -88.200738, + "city": "Melvin", + "state": "AL", + "county": "Choctaw" + }, + { + "zip_code": 36915, + "latitude": 32.004227, + "longitude": -88.200738, + "city": "Needham", + "state": "AL", + "county": "Choctaw" + }, + { + "zip_code": 36916, + "latitude": 32.209362, + "longitude": -88.048983, + "city": "Pennington", + "state": "AL", + "county": "Choctaw" + }, + { + "zip_code": 36919, + "latitude": 31.947815, + "longitude": -88.32911, + "city": "Silas", + "state": "AL", + "county": "Choctaw" + }, + { + "zip_code": 36921, + "latitude": 31.915506, + "longitude": -88.151048, + "city": "Toxey", + "state": "AL", + "county": "Choctaw" + }, + { + "zip_code": 36922, + "latitude": 32.210259, + "longitude": -88.065479, + "city": "Ward", + "state": "AL", + "county": "Choctaw" + }, + { + "zip_code": 36925, + "latitude": 32.444907, + "longitude": -88.193305, + "city": "York", + "state": "AL", + "county": "Sumter" + }, + { + "zip_code": 37010, + "latitude": 36.556825, + "longitude": -87.018127, + "city": "Adams", + "state": "TN", + "county": "Robertson" + }, + { + "zip_code": 37011, + "latitude": 36.170556, + "longitude": -86.8825, + "city": "Antioch", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37012, + "latitude": 36.034524, + "longitude": -85.997115, + "city": "Alexandria", + "state": "TN", + "county": "Dekalb" + }, + { + "zip_code": 37013, + "latitude": 36.036032, + "longitude": -86.645598, + "city": "Antioch", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37014, + "latitude": 35.856609, + "longitude": -86.663307, + "city": "Arrington", + "state": "TN", + "county": "Williamson" + }, + { + "zip_code": 37015, + "latitude": 36.297807, + "longitude": -87.083657, + "city": "Ashland City", + "state": "TN", + "county": "Cheatham" + }, + { + "zip_code": 37016, + "latitude": 35.933832, + "longitude": -86.112561, + "city": "Auburntown", + "state": "TN", + "county": "Cannon" + }, + { + "zip_code": 37018, + "latitude": 35.643787, + "longitude": -86.183248, + "city": "Beechgrove", + "state": "TN", + "county": "Coffee" + }, + { + "zip_code": 37019, + "latitude": 35.431968, + "longitude": -86.762712, + "city": "Belfast", + "state": "TN", + "county": "Marshall" + }, + { + "zip_code": 37020, + "latitude": 35.580793, + "longitude": -86.399852, + "city": "Bell Buckle", + "state": "TN", + "county": "Bedford" + }, + { + "zip_code": 37022, + "latitude": 36.477191, + "longitude": -86.460853, + "city": "Bethpage", + "state": "TN", + "county": "Sumner" + }, + { + "zip_code": 37023, + "latitude": 36.580898, + "longitude": -87.774854, + "city": "Big Rock", + "state": "TN", + "county": "Stewart" + }, + { + "zip_code": 37024, + "latitude": 35.874553, + "longitude": -86.907565, + "city": "Brentwood", + "state": "TN", + "county": "Williamson" + }, + { + "zip_code": 37025, + "latitude": 35.92171, + "longitude": -87.348964, + "city": "Bon Aqua", + "state": "TN", + "county": "Hickman" + }, + { + "zip_code": 37026, + "latitude": 35.701738, + "longitude": -86.107742, + "city": "Bradyville", + "state": "TN", + "county": "Cannon" + }, + { + "zip_code": 37027, + "latitude": 35.982981, + "longitude": -86.816058, + "city": "Brentwood", + "state": "TN", + "county": "Williamson" + }, + { + "zip_code": 37028, + "latitude": 36.584621, + "longitude": -87.843106, + "city": "Bumpus Mills", + "state": "TN", + "county": "Stewart" + }, + { + "zip_code": 37029, + "latitude": 36.039122, + "longitude": -87.26284, + "city": "Burns", + "state": "TN", + "county": "Dickson" + }, + { + "zip_code": 37030, + "latitude": 36.276278, + "longitude": -85.95174, + "city": "Carthage", + "state": "TN", + "county": "Smith" + }, + { + "zip_code": 37031, + "latitude": 36.380555, + "longitude": -86.310674, + "city": "Castalian Springs", + "state": "TN", + "county": "Sumner" + }, + { + "zip_code": 37032, + "latitude": 36.521638, + "longitude": -87.008437, + "city": "Cedar Hill", + "state": "TN", + "county": "Robertson" + }, + { + "zip_code": 37033, + "latitude": 35.750099, + "longitude": -87.502405, + "city": "Centerville", + "state": "TN", + "county": "Hickman" + }, + { + "zip_code": 37034, + "latitude": 35.640617, + "longitude": -86.718225, + "city": "Chapel Hill", + "state": "TN", + "county": "Marshall" + }, + { + "zip_code": 37035, + "latitude": 36.376837, + "longitude": -87.112668, + "city": "Chapmansboro", + "state": "TN", + "county": "Cheatham" + }, + { + "zip_code": 37036, + "latitude": 36.232191, + "longitude": -87.278993, + "city": "Charlotte", + "state": "TN", + "county": "Dickson" + }, + { + "zip_code": 37037, + "latitude": 35.695974, + "longitude": -86.368041, + "city": "Christiana", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37040, + "latitude": 36.51674, + "longitude": -87.308491, + "city": "Clarksville", + "state": "TN", + "county": "Montgomery" + }, + { + "zip_code": 37041, + "latitude": 36.477428, + "longitude": -87.377197, + "city": "Clarksville", + "state": "TN", + "county": "Montgomery" + }, + { + "zip_code": 37042, + "latitude": 36.501766, + "longitude": -87.399188, + "city": "Clarksville", + "state": "TN", + "county": "Montgomery" + }, + { + "zip_code": 37043, + "latitude": 36.512666, + "longitude": -87.301283, + "city": "Clarksville", + "state": "TN", + "county": "Montgomery" + }, + { + "zip_code": 37044, + "latitude": 36.531398, + "longitude": -87.353008, + "city": "Clarksville", + "state": "TN", + "county": "Montgomery" + }, + { + "zip_code": 37046, + "latitude": 35.790897, + "longitude": -86.726133, + "city": "College Grove", + "state": "TN", + "county": "Williamson" + }, + { + "zip_code": 37047, + "latitude": 35.354815, + "longitude": -86.829364, + "city": "Cornersville", + "state": "TN", + "county": "Marshall" + }, + { + "zip_code": 37048, + "latitude": 36.485607, + "longitude": -86.528398, + "city": "Cottontown", + "state": "TN", + "county": "Sumner" + }, + { + "zip_code": 37049, + "latitude": 36.521044, + "longitude": -86.712734, + "city": "Cross Plains", + "state": "TN", + "county": "Robertson" + }, + { + "zip_code": 37050, + "latitude": 36.452109, + "longitude": -87.701641, + "city": "Cumberland City", + "state": "TN", + "county": "Stewart" + }, + { + "zip_code": 37051, + "latitude": 36.272071, + "longitude": -87.391396, + "city": "Cumberland Furnace", + "state": "TN", + "county": "Dickson" + }, + { + "zip_code": 37052, + "latitude": 36.398614, + "longitude": -87.376496, + "city": "Cunningham", + "state": "TN", + "county": "Montgomery" + }, + { + "zip_code": 37055, + "latitude": 36.141461, + "longitude": -87.396417, + "city": "Dickson", + "state": "TN", + "county": "Dickson" + }, + { + "zip_code": 37056, + "latitude": 36.146949, + "longitude": -87.352971, + "city": "Dickson", + "state": "TN", + "county": "Dickson" + }, + { + "zip_code": 37057, + "latitude": 36.358212, + "longitude": -86.037379, + "city": "Dixon Springs", + "state": "TN", + "county": "Smith" + }, + { + "zip_code": 37058, + "latitude": 36.494203, + "longitude": -87.878742, + "city": "Dover", + "state": "TN", + "county": "Stewart" + }, + { + "zip_code": 37059, + "latitude": 35.993753, + "longitude": -85.945143, + "city": "Dowelltown", + "state": "TN", + "county": "Dekalb" + }, + { + "zip_code": 37060, + "latitude": 35.73168, + "longitude": -86.558626, + "city": "Eagleville", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37061, + "latitude": 36.288768, + "longitude": -87.749245, + "city": "Erin", + "state": "TN", + "county": "Houston" + }, + { + "zip_code": 37062, + "latitude": 35.97805, + "longitude": -87.135938, + "city": "Fairview", + "state": "TN", + "county": "Williamson" + }, + { + "zip_code": 37063, + "latitude": 35.859565, + "longitude": -86.420958, + "city": "Fosterville", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37064, + "latitude": 35.890746, + "longitude": -86.965691, + "city": "Franklin", + "state": "TN", + "county": "Williamson" + }, + { + "zip_code": 37065, + "latitude": 35.895085, + "longitude": -86.921416, + "city": "Franklin", + "state": "TN", + "county": "Williamson" + }, + { + "zip_code": 37066, + "latitude": 36.401201, + "longitude": -86.449479, + "city": "Gallatin", + "state": "TN", + "county": "Sumner" + }, + { + "zip_code": 37067, + "latitude": 35.912072, + "longitude": -86.765537, + "city": "Franklin", + "state": "TN", + "county": "Williamson" + }, + { + "zip_code": 37068, + "latitude": 35.874553, + "longitude": -86.907565, + "city": "Franklin", + "state": "TN", + "county": "Williamson" + }, + { + "zip_code": 37069, + "latitude": 35.979553, + "longitude": -86.910623, + "city": "Franklin", + "state": "TN", + "county": "Williamson" + }, + { + "zip_code": 37070, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Goodlettsville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37071, + "latitude": 36.156231, + "longitude": -86.304922, + "city": "Gladeville", + "state": "TN", + "county": "Wilson" + }, + { + "zip_code": 37072, + "latitude": 36.34145, + "longitude": -86.775747, + "city": "Goodlettsville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37073, + "latitude": 36.437397, + "longitude": -86.809567, + "city": "Greenbrier", + "state": "TN", + "county": "Robertson" + }, + { + "zip_code": 37074, + "latitude": 36.402012, + "longitude": -86.143252, + "city": "Hartsville", + "state": "TN", + "county": "Trousdale" + }, + { + "zip_code": 37075, + "latitude": 36.347551, + "longitude": -86.612045, + "city": "Hendersonville", + "state": "TN", + "county": "Sumner" + }, + { + "zip_code": 37076, + "latitude": 36.153572, + "longitude": -86.583994, + "city": "Hermitage", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37077, + "latitude": 36.304701, + "longitude": -86.621095, + "city": "Hendersonville", + "state": "TN", + "county": "Sumner" + }, + { + "zip_code": 37078, + "latitude": 35.923959, + "longitude": -87.810501, + "city": "Hurricane Mills", + "state": "TN", + "county": "Humphreys" + }, + { + "zip_code": 37079, + "latitude": 36.490214, + "longitude": -87.697982, + "city": "Indian Mound", + "state": "TN", + "county": "Stewart" + }, + { + "zip_code": 37080, + "latitude": 36.326101, + "longitude": -86.899299, + "city": "Joelton", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37082, + "latitude": 36.189656, + "longitude": -87.089254, + "city": "Kingston Springs", + "state": "TN", + "county": "Cheatham" + }, + { + "zip_code": 37083, + "latitude": 36.52772, + "longitude": -86.025585, + "city": "Lafayette", + "state": "TN", + "county": "Macon" + }, + { + "zip_code": 37085, + "latitude": 35.936886, + "longitude": -86.291678, + "city": "Lascassas", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37086, + "latitude": 36.008511, + "longitude": -86.559194, + "city": "La Vergne", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37087, + "latitude": 36.267266, + "longitude": -86.291167, + "city": "Lebanon", + "state": "TN", + "county": "Wilson" + }, + { + "zip_code": 37088, + "latitude": 36.156231, + "longitude": -86.304922, + "city": "Lebanon", + "state": "TN", + "county": "Wilson" + }, + { + "zip_code": 37089, + "latitude": 35.859565, + "longitude": -86.420958, + "city": "La Vergne", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37090, + "latitude": 36.118515, + "longitude": -86.263, + "city": "Lebanon", + "state": "TN", + "county": "Wilson" + }, + { + "zip_code": 37091, + "latitude": 35.504165, + "longitude": -86.792003, + "city": "Lewisburg", + "state": "TN", + "county": "Marshall" + }, + { + "zip_code": 37095, + "latitude": 35.999286, + "longitude": -85.944738, + "city": "Liberty", + "state": "TN", + "county": "Dekalb" + }, + { + "zip_code": 37096, + "latitude": 35.594367, + "longitude": -87.856665, + "city": "Linden", + "state": "TN", + "county": "Perry" + }, + { + "zip_code": 37097, + "latitude": 35.786732, + "longitude": -87.787992, + "city": "Lobelville", + "state": "TN", + "county": "Perry" + }, + { + "zip_code": 37098, + "latitude": 35.850248, + "longitude": -87.312683, + "city": "Lyles", + "state": "TN", + "county": "Hickman" + }, + { + "zip_code": 37101, + "latitude": 36.066188, + "longitude": -87.659245, + "city": "Mc Ewen", + "state": "TN", + "county": "Humphreys" + }, + { + "zip_code": 37110, + "latitude": 35.684033, + "longitude": -85.778151, + "city": "Mc Minnville", + "state": "TN", + "county": "Warren" + }, + { + "zip_code": 37111, + "latitude": 35.678368, + "longitude": -85.777633, + "city": "Mc Minnville", + "state": "TN", + "county": "Warren" + }, + { + "zip_code": 37115, + "latitude": 36.259503, + "longitude": -86.706296, + "city": "Madison", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37116, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Madison", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37118, + "latitude": 35.908701, + "longitude": -86.19487, + "city": "Milton", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37119, + "latitude": 36.631981, + "longitude": -86.539028, + "city": "Mitchellville", + "state": "TN", + "county": "Sumner" + }, + { + "zip_code": 37121, + "latitude": 36.156231, + "longitude": -86.304922, + "city": "Mount Juliet", + "state": "TN", + "county": "Wilson" + }, + { + "zip_code": 37122, + "latitude": 36.184603, + "longitude": -86.468695, + "city": "Mount Juliet", + "state": "TN", + "county": "Wilson" + }, + { + "zip_code": 37127, + "latitude": 35.762951, + "longitude": -86.372158, + "city": "Murfreesboro", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37128, + "latitude": 35.845418, + "longitude": -86.486683, + "city": "Murfreesboro", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37129, + "latitude": 35.901746, + "longitude": -86.423535, + "city": "Murfreesboro", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37130, + "latitude": 35.886984, + "longitude": -86.35778, + "city": "Murfreesboro", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37131, + "latitude": 35.859565, + "longitude": -86.420958, + "city": "Murfreesboro", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37132, + "latitude": 35.859565, + "longitude": -86.420958, + "city": "Murfreesboro", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37133, + "latitude": 35.859565, + "longitude": -86.420958, + "city": "Murfreesboro", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37134, + "latitude": 36.014193, + "longitude": -87.938738, + "city": "New Johnsonville", + "state": "TN", + "county": "Humphreys" + }, + { + "zip_code": 37135, + "latitude": 35.925201, + "longitude": -86.675349, + "city": "Nolensville", + "state": "TN", + "county": "Williamson" + }, + { + "zip_code": 37136, + "latitude": 36.156231, + "longitude": -86.304922, + "city": "Norene", + "state": "TN", + "county": "Wilson" + }, + { + "zip_code": 37137, + "latitude": 35.873344, + "longitude": -87.491254, + "city": "Nunnelly", + "state": "TN", + "county": "Hickman" + }, + { + "zip_code": 37138, + "latitude": 36.137706, + "longitude": -86.633545, + "city": "Old Hickory", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37140, + "latitude": 35.877706, + "longitude": -87.642386, + "city": "Only", + "state": "TN", + "county": "Hickman" + }, + { + "zip_code": 37141, + "latitude": 36.616801, + "longitude": -86.66518, + "city": "Orlinda", + "state": "TN", + "county": "Robertson" + }, + { + "zip_code": 37142, + "latitude": 36.402215, + "longitude": -87.492837, + "city": "Palmyra", + "state": "TN", + "county": "Montgomery" + }, + { + "zip_code": 37143, + "latitude": 36.135105, + "longitude": -87.039855, + "city": "Pegram", + "state": "TN", + "county": "Cheatham" + }, + { + "zip_code": 37144, + "latitude": 35.285712, + "longitude": -86.639625, + "city": "Petersburg", + "state": "TN", + "county": "Lincoln" + }, + { + "zip_code": 37145, + "latitude": 36.346164, + "longitude": -85.918944, + "city": "Pleasant Shade", + "state": "TN", + "county": "Smith" + }, + { + "zip_code": 37146, + "latitude": 36.271077, + "longitude": -87.047966, + "city": "Pleasant View", + "state": "TN", + "county": "Cheatham" + }, + { + "zip_code": 37147, + "latitude": 35.692395, + "longitude": -87.662335, + "city": "Pleasantville", + "state": "TN", + "county": "Hickman" + }, + { + "zip_code": 37148, + "latitude": 36.547545, + "longitude": -86.515887, + "city": "Portland", + "state": "TN", + "county": "Sumner" + }, + { + "zip_code": 37149, + "latitude": 35.80362, + "longitude": -86.148505, + "city": "Readyville", + "state": "TN", + "county": "Cannon" + }, + { + "zip_code": 37150, + "latitude": 36.517717, + "longitude": -85.866182, + "city": "Red Boiling Springs", + "state": "TN", + "county": "Macon" + }, + { + "zip_code": 37151, + "latitude": 36.314537, + "longitude": -86.045992, + "city": "Riddleton", + "state": "TN", + "county": "Smith" + }, + { + "zip_code": 37152, + "latitude": 36.402548, + "longitude": -86.772247, + "city": "Ridgetop", + "state": "TN", + "county": "Robertson" + }, + { + "zip_code": 37153, + "latitude": 35.766806, + "longitude": -86.542707, + "city": "Rockvale", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37155, + "latitude": 36.477428, + "longitude": -87.377197, + "city": "Saint Bethlehem", + "state": "TN", + "county": "Montgomery" + }, + { + "zip_code": 37160, + "latitude": 35.486335, + "longitude": -86.462357, + "city": "Shelbyville", + "state": "TN", + "county": "Bedford" + }, + { + "zip_code": 37161, + "latitude": 35.471531, + "longitude": -86.489019, + "city": "Shelbyville", + "state": "TN", + "county": "Bedford" + }, + { + "zip_code": 37162, + "latitude": 35.510825, + "longitude": -86.450042, + "city": "Shelbyville", + "state": "TN", + "county": "Bedford" + }, + { + "zip_code": 37165, + "latitude": 36.283543, + "longitude": -87.458058, + "city": "Slayden", + "state": "TN", + "county": "Dickson" + }, + { + "zip_code": 37166, + "latitude": 35.958503, + "longitude": -85.835635, + "city": "Smithville", + "state": "TN", + "county": "Dekalb" + }, + { + "zip_code": 37167, + "latitude": 35.856167, + "longitude": -86.45336, + "city": "Smyrna", + "state": "TN", + "county": "Rutherford" + }, + { + "zip_code": 37171, + "latitude": 36.361093, + "longitude": -87.316272, + "city": "Southside", + "state": "TN", + "county": "Montgomery" + }, + { + "zip_code": 37172, + "latitude": 36.51351, + "longitude": -86.888624, + "city": "Springfield", + "state": "TN", + "county": "Robertson" + }, + { + "zip_code": 37174, + "latitude": 35.712381, + "longitude": -86.901661, + "city": "Spring Hill", + "state": "TN", + "county": "Maury" + }, + { + "zip_code": 37175, + "latitude": 36.272979, + "longitude": -87.747374, + "city": "Stewart", + "state": "TN", + "county": "Houston" + }, + { + "zip_code": 37178, + "latitude": 36.315226, + "longitude": -87.798852, + "city": "Tennessee Ridge", + "state": "TN", + "county": "Houston" + }, + { + "zip_code": 37179, + "latitude": 35.809026, + "longitude": -86.891286, + "city": "Thompsons Station", + "state": "TN", + "county": "Williamson" + }, + { + "zip_code": 37180, + "latitude": 35.622306, + "longitude": -86.573246, + "city": "Unionville", + "state": "TN", + "county": "Bedford" + }, + { + "zip_code": 37181, + "latitude": 36.245657, + "longitude": -87.465507, + "city": "Vanleer", + "state": "TN", + "county": "Dickson" + }, + { + "zip_code": 37183, + "latitude": 35.501239, + "longitude": -86.335135, + "city": "Wartrace", + "state": "TN", + "county": "Bedford" + }, + { + "zip_code": 37184, + "latitude": 36.087694, + "longitude": -86.151145, + "city": "Watertown", + "state": "TN", + "county": "Wilson" + }, + { + "zip_code": 37185, + "latitude": 36.032353, + "longitude": -87.82746, + "city": "Waverly", + "state": "TN", + "county": "Humphreys" + }, + { + "zip_code": 37186, + "latitude": 36.572762, + "longitude": -86.305594, + "city": "Westmoreland", + "state": "TN", + "county": "Sumner" + }, + { + "zip_code": 37187, + "latitude": 36.124378, + "longitude": -87.226354, + "city": "White Bluff", + "state": "TN", + "county": "Dickson" + }, + { + "zip_code": 37188, + "latitude": 36.481635, + "longitude": -86.689867, + "city": "White House", + "state": "TN", + "county": "Robertson" + }, + { + "zip_code": 37189, + "latitude": 36.276652, + "longitude": -86.832048, + "city": "Whites Creek", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37190, + "latitude": 35.836335, + "longitude": -86.033176, + "city": "Woodbury", + "state": "TN", + "county": "Cannon" + }, + { + "zip_code": 37191, + "latitude": 36.495848, + "longitude": -87.538989, + "city": "Woodlawn", + "state": "TN", + "county": "Montgomery" + }, + { + "zip_code": 37201, + "latitude": 36.165688, + "longitude": -86.778098, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37202, + "latitude": 36.340304, + "longitude": -86.827254, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37203, + "latitude": 36.150406, + "longitude": -86.791598, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37204, + "latitude": 36.119294, + "longitude": -86.850099, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37205, + "latitude": 36.108558, + "longitude": -86.865776, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37206, + "latitude": 36.180143, + "longitude": -86.73575, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37207, + "latitude": 36.233916, + "longitude": -86.784698, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37208, + "latitude": 36.174256, + "longitude": -86.810198, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37209, + "latitude": 36.142007, + "longitude": -86.89995, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37210, + "latitude": 36.137475, + "longitude": -86.729947, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37211, + "latitude": 36.070359, + "longitude": -86.718347, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37212, + "latitude": 36.132607, + "longitude": -86.803748, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37213, + "latitude": 36.168626, + "longitude": -86.762899, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37214, + "latitude": 36.174205, + "longitude": -86.662146, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37215, + "latitude": 36.086531, + "longitude": -86.885987, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37216, + "latitude": 36.204255, + "longitude": -86.723997, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37217, + "latitude": 36.107372, + "longitude": -86.662914, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37218, + "latitude": 36.234304, + "longitude": -86.89585, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37219, + "latitude": 36.161906, + "longitude": -86.781748, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37220, + "latitude": 36.067109, + "longitude": -86.782098, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37221, + "latitude": 36.06616, + "longitude": -86.963852, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37222, + "latitude": 36.056164, + "longitude": -86.980116, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37224, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37227, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37228, + "latitude": 36.193205, + "longitude": -86.8083, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37229, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37230, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37232, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37234, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37235, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37236, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37237, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37238, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37239, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37240, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37241, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37242, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37243, + "latitude": 36.167606, + "longitude": -86.784498, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37244, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37245, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37246, + "latitude": 36.158606, + "longitude": -86.789998, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37247, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37248, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37249, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37250, + "latitude": 36.186605, + "longitude": -86.785248, + "city": "Nashville", + "state": "TN", + "county": "Davidson" + }, + { + "zip_code": 37301, + "latitude": 35.360328, + "longitude": -85.789682, + "city": "Altamont", + "state": "TN", + "county": "Grundy" + }, + { + "zip_code": 37302, + "latitude": 35.017572, + "longitude": -85.018914, + "city": "Apison", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37303, + "latitude": 35.457491, + "longitude": -84.63982, + "city": "Athens", + "state": "TN", + "county": "Mcminn" + }, + { + "zip_code": 37304, + "latitude": 35.345216, + "longitude": -85.138046, + "city": "Bakewell", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37305, + "latitude": 35.373473, + "longitude": -85.699601, + "city": "Beersheba Springs", + "state": "TN", + "county": "Grundy" + }, + { + "zip_code": 37306, + "latitude": 35.089483, + "longitude": -86.175941, + "city": "Belvidere", + "state": "TN", + "county": "Franklin" + }, + { + "zip_code": 37307, + "latitude": 35.130815, + "longitude": -84.521805, + "city": "Benton", + "state": "TN", + "county": "Polk" + }, + { + "zip_code": 37308, + "latitude": 35.312806, + "longitude": -85.009853, + "city": "Birchwood", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37309, + "latitude": 35.322816, + "longitude": -84.736414, + "city": "Calhoun", + "state": "TN", + "county": "Mcminn" + }, + { + "zip_code": 37310, + "latitude": 35.2637, + "longitude": -84.793619, + "city": "Charleston", + "state": "TN", + "county": "Bradley" + }, + { + "zip_code": 37311, + "latitude": 35.149223, + "longitude": -84.874031, + "city": "Cleveland", + "state": "TN", + "county": "Bradley" + }, + { + "zip_code": 37312, + "latitude": 35.255097, + "longitude": -84.86844, + "city": "Cleveland", + "state": "TN", + "county": "Bradley" + }, + { + "zip_code": 37313, + "latitude": 35.351615, + "longitude": -85.70031, + "city": "Coalmont", + "state": "TN", + "county": "Grundy" + }, + { + "zip_code": 37314, + "latitude": 35.246689, + "longitude": -84.303121, + "city": "Cokercreek", + "state": "TN", + "county": "Monroe" + }, + { + "zip_code": 37315, + "latitude": 35.047891, + "longitude": -85.057359, + "city": "Collegedale", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37316, + "latitude": 34.997057, + "longitude": -84.732656, + "city": "Conasauga", + "state": "TN", + "county": "Polk" + }, + { + "zip_code": 37317, + "latitude": 35.020673, + "longitude": -84.374828, + "city": "Copperhill", + "state": "TN", + "county": "Polk" + }, + { + "zip_code": 37318, + "latitude": 35.178335, + "longitude": -86.016657, + "city": "Cowan", + "state": "TN", + "county": "Franklin" + }, + { + "zip_code": 37320, + "latitude": 35.17272, + "longitude": -84.861885, + "city": "Cleveland", + "state": "TN", + "county": "Bradley" + }, + { + "zip_code": 37321, + "latitude": 35.556414, + "longitude": -84.979171, + "city": "Dayton", + "state": "TN", + "county": "Rhea" + }, + { + "zip_code": 37322, + "latitude": 35.484053, + "longitude": -84.84546, + "city": "Decatur", + "state": "TN", + "county": "Meigs" + }, + { + "zip_code": 37323, + "latitude": 35.136098, + "longitude": -84.845707, + "city": "Cleveland", + "state": "TN", + "county": "Bradley" + }, + { + "zip_code": 37324, + "latitude": 35.255505, + "longitude": -86.068439, + "city": "Decherd", + "state": "TN", + "county": "Franklin" + }, + { + "zip_code": 37325, + "latitude": 35.240205, + "longitude": -84.573882, + "city": "Delano", + "state": "TN", + "county": "Polk" + }, + { + "zip_code": 37326, + "latitude": 35.033927, + "longitude": -84.379169, + "city": "Ducktown", + "state": "TN", + "county": "Polk" + }, + { + "zip_code": 37327, + "latitude": 35.386535, + "longitude": -85.376504, + "city": "Dunlap", + "state": "TN", + "county": "Sequatchie" + }, + { + "zip_code": 37328, + "latitude": 35.068833, + "longitude": -86.412827, + "city": "Elora", + "state": "TN", + "county": "Lincoln" + }, + { + "zip_code": 37329, + "latitude": 35.374591, + "longitude": -84.488998, + "city": "Englewood", + "state": "TN", + "county": "Mcminn" + }, + { + "zip_code": 37330, + "latitude": 35.270666, + "longitude": -86.056548, + "city": "Estill Springs", + "state": "TN", + "county": "Franklin" + }, + { + "zip_code": 37331, + "latitude": 35.347928, + "longitude": -84.534548, + "city": "Etowah", + "state": "TN", + "county": "Mcminn" + }, + { + "zip_code": 37332, + "latitude": 35.531335, + "longitude": -84.945661, + "city": "Evensville", + "state": "TN", + "county": "Rhea" + }, + { + "zip_code": 37333, + "latitude": 35.13081, + "longitude": -84.328172, + "city": "Farner", + "state": "TN", + "county": "Polk" + }, + { + "zip_code": 37334, + "latitude": 35.168227, + "longitude": -86.601925, + "city": "Fayetteville", + "state": "TN", + "county": "Lincoln" + }, + { + "zip_code": 37335, + "latitude": 35.058083, + "longitude": -86.412954, + "city": "Flintville", + "state": "TN", + "county": "Lincoln" + }, + { + "zip_code": 37336, + "latitude": 35.310427, + "longitude": -84.935342, + "city": "Georgetown", + "state": "TN", + "county": "Meigs" + }, + { + "zip_code": 37337, + "latitude": 35.623951, + "longitude": -84.942494, + "city": "Grandview", + "state": "TN", + "county": "Rhea" + }, + { + "zip_code": 37338, + "latitude": 35.602658, + "longitude": -84.998978, + "city": "Graysville", + "state": "TN", + "county": "Rhea" + }, + { + "zip_code": 37339, + "latitude": 35.385223, + "longitude": -85.653738, + "city": "Gruetli Laager", + "state": "TN", + "county": "Grundy" + }, + { + "zip_code": 37340, + "latitude": 35.029115, + "longitude": -85.517231, + "city": "Guild", + "state": "TN", + "county": "Marion" + }, + { + "zip_code": 37341, + "latitude": 35.214176, + "longitude": -85.091744, + "city": "Harrison", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37342, + "latitude": 35.380586, + "longitude": -85.965585, + "city": "Hillsboro", + "state": "TN", + "county": "Coffee" + }, + { + "zip_code": 37343, + "latitude": 35.166775, + "longitude": -85.21024, + "city": "Hixson", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37345, + "latitude": 35.045745, + "longitude": -86.25541, + "city": "Huntland", + "state": "TN", + "county": "Franklin" + }, + { + "zip_code": 37347, + "latitude": 35.097012, + "longitude": -85.589691, + "city": "Jasper", + "state": "TN", + "county": "Marion" + }, + { + "zip_code": 37348, + "latitude": 35.103977, + "longitude": -86.418625, + "city": "Kelso", + "state": "TN", + "county": "Lincoln" + }, + { + "zip_code": 37349, + "latitude": 35.497637, + "longitude": -86.07482, + "city": "Manchester", + "state": "TN", + "county": "Coffee" + }, + { + "zip_code": 37350, + "latitude": 35.130697, + "longitude": -85.301627, + "city": "Lookout Mountain", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37351, + "latitude": 35.104522, + "longitude": -85.2631, + "city": "Lupton City", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37352, + "latitude": 35.282767, + "longitude": -86.305403, + "city": "Lynchburg", + "state": "TN", + "county": "Moore" + }, + { + "zip_code": 37353, + "latitude": 35.160258, + "longitude": -84.889237, + "city": "Mc Donald", + "state": "TN", + "county": "Bradley" + }, + { + "zip_code": 37354, + "latitude": 35.491574, + "longitude": -84.33952, + "city": "Madisonville", + "state": "TN", + "county": "Monroe" + }, + { + "zip_code": 37355, + "latitude": 35.517946, + "longitude": -86.06988, + "city": "Manchester", + "state": "TN", + "county": "Coffee" + }, + { + "zip_code": 37356, + "latitude": 35.264698, + "longitude": -85.822933, + "city": "Monteagle", + "state": "TN", + "county": "Grundy" + }, + { + "zip_code": 37357, + "latitude": 35.621365, + "longitude": -85.875966, + "city": "Morrison", + "state": "TN", + "county": "Warren" + }, + { + "zip_code": 37359, + "latitude": 35.194599, + "longitude": -86.467197, + "city": "Mulberry", + "state": "TN", + "county": "Lincoln" + }, + { + "zip_code": 37360, + "latitude": 35.468961, + "longitude": -86.305194, + "city": "Normandy", + "state": "TN", + "county": "Bedford" + }, + { + "zip_code": 37361, + "latitude": 35.101062, + "longitude": -84.689716, + "city": "Ocoee", + "state": "TN", + "county": "Polk" + }, + { + "zip_code": 37362, + "latitude": 35.049197, + "longitude": -84.735366, + "city": "Oldfort", + "state": "TN", + "county": "Polk" + }, + { + "zip_code": 37363, + "latitude": 35.120227, + "longitude": -85.060369, + "city": "Ooltewah", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37364, + "latitude": 35.17272, + "longitude": -84.861885, + "city": "Cleveland", + "state": "TN", + "county": "Bradley" + }, + { + "zip_code": 37365, + "latitude": 35.373473, + "longitude": -85.699601, + "city": "Palmer", + "state": "TN", + "county": "Grundy" + }, + { + "zip_code": 37366, + "latitude": 35.373473, + "longitude": -85.699601, + "city": "Pelham", + "state": "TN", + "county": "Grundy" + }, + { + "zip_code": 37367, + "latitude": 35.609437, + "longitude": -85.210253, + "city": "Pikeville", + "state": "TN", + "county": "Bledsoe" + }, + { + "zip_code": 37369, + "latitude": 35.171646, + "longitude": -84.502303, + "city": "Reliance", + "state": "TN", + "county": "Polk" + }, + { + "zip_code": 37370, + "latitude": 35.373143, + "longitude": -84.695085, + "city": "Riceville", + "state": "TN", + "county": "Mcminn" + }, + { + "zip_code": 37371, + "latitude": 35.441376, + "longitude": -84.641623, + "city": "Athens", + "state": "TN", + "county": "Mcminn" + }, + { + "zip_code": 37372, + "latitude": 35.175522, + "longitude": -86.098338, + "city": "Saint Andrews", + "state": "TN", + "county": "Franklin" + }, + { + "zip_code": 37373, + "latitude": 35.388975, + "longitude": -85.104336, + "city": "Sale Creek", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37374, + "latitude": 35.170416, + "longitude": -85.632114, + "city": "Sequatchie", + "state": "TN", + "county": "Marion" + }, + { + "zip_code": 37375, + "latitude": 35.184313, + "longitude": -86.06546, + "city": "Sewanee", + "state": "TN", + "county": "Franklin" + }, + { + "zip_code": 37376, + "latitude": 35.045233, + "longitude": -85.930195, + "city": "Sherwood", + "state": "TN", + "county": "Franklin" + }, + { + "zip_code": 37377, + "latitude": 35.175117, + "longitude": -85.319805, + "city": "Signal Mountain", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37378, + "latitude": 35.678368, + "longitude": -85.777633, + "city": "Smartt", + "state": "TN", + "county": "Warren" + }, + { + "zip_code": 37379, + "latitude": 35.211052, + "longitude": -85.198979, + "city": "Soddy Daisy", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37380, + "latitude": 35.109722, + "longitude": -85.655679, + "city": "South Pittsburg", + "state": "TN", + "county": "Marion" + }, + { + "zip_code": 37381, + "latitude": 35.693499, + "longitude": -84.819767, + "city": "Spring City", + "state": "TN", + "county": "Rhea" + }, + { + "zip_code": 37382, + "latitude": 35.497637, + "longitude": -86.07482, + "city": "Summitville", + "state": "TN", + "county": "Coffee" + }, + { + "zip_code": 37383, + "latitude": 35.180503, + "longitude": -85.903522, + "city": "Sewanee", + "state": "TN", + "county": "Franklin" + }, + { + "zip_code": 37384, + "latitude": 35.221092, + "longitude": -85.209082, + "city": "Soddy Daisy", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37385, + "latitude": 35.376907, + "longitude": -84.272243, + "city": "Tellico Plains", + "state": "TN", + "county": "Monroe" + }, + { + "zip_code": 37387, + "latitude": 35.273159, + "longitude": -85.761237, + "city": "Tracy City", + "state": "TN", + "county": "Grundy" + }, + { + "zip_code": 37388, + "latitude": 35.497968, + "longitude": -86.197898, + "city": "Tullahoma", + "state": "TN", + "county": "Coffee" + }, + { + "zip_code": 37389, + "latitude": 35.497637, + "longitude": -86.07482, + "city": "Arnold Afb", + "state": "TN", + "county": "Coffee" + }, + { + "zip_code": 37391, + "latitude": 35.089723, + "longitude": -84.376621, + "city": "Turtletown", + "state": "TN", + "county": "Polk" + }, + { + "zip_code": 37394, + "latitude": 35.527616, + "longitude": -85.842163, + "city": "Viola", + "state": "TN", + "county": "Warren" + }, + { + "zip_code": 37395, + "latitude": 35.61722, + "longitude": -84.928921, + "city": "Watts Bar Dam", + "state": "TN", + "county": "Rhea" + }, + { + "zip_code": 37396, + "latitude": 35.020638, + "longitude": -85.529023, + "city": "Whiteside", + "state": "TN", + "county": "Marion" + }, + { + "zip_code": 37397, + "latitude": 35.171226, + "longitude": -85.530468, + "city": "Whitwell", + "state": "TN", + "county": "Sequatchie" + }, + { + "zip_code": 37398, + "latitude": 35.146602, + "longitude": -86.102966, + "city": "Winchester", + "state": "TN", + "county": "Franklin" + }, + { + "zip_code": 37401, + "latitude": 35.017818, + "longitude": -85.206426, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37402, + "latitude": 35.046323, + "longitude": -85.312907, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37403, + "latitude": 35.047273, + "longitude": -85.292207, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37404, + "latitude": 35.024174, + "longitude": -85.271756, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37405, + "latitude": 35.089664, + "longitude": -85.335675, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37406, + "latitude": 35.067272, + "longitude": -85.250058, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37407, + "latitude": 35.002474, + "longitude": -85.289806, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37408, + "latitude": 35.029154, + "longitude": -85.30685, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37409, + "latitude": 35.003374, + "longitude": -85.331395, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37410, + "latitude": 35.00307, + "longitude": -85.308956, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37411, + "latitude": 35.035273, + "longitude": -85.245455, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37412, + "latitude": 35.001524, + "longitude": -85.238392, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37414, + "latitude": 35.221092, + "longitude": -85.209082, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37415, + "latitude": 35.129075, + "longitude": -85.265017, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37416, + "latitude": 35.102747, + "longitude": -85.182663, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37419, + "latitude": 35.050162, + "longitude": -85.340522, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37421, + "latitude": 35.040495, + "longitude": -85.153781, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37422, + "latitude": 35.221092, + "longitude": -85.209082, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37424, + "latitude": 35.221092, + "longitude": -85.209082, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37450, + "latitude": 35.221092, + "longitude": -85.209082, + "city": "Chattanooga", + "state": "TN", + "county": "Hamilton" + }, + { + "zip_code": 37501, + "latitude": 35.169255, + "longitude": -89.990415, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 37601, + "latitude": 36.3417, + "longitude": -82.387716, + "city": "Johnson City", + "state": "TN", + "county": "Washington" + }, + { + "zip_code": 37602, + "latitude": 36.271729, + "longitude": -82.501212, + "city": "Johnson City", + "state": "TN", + "county": "Washington" + }, + { + "zip_code": 37604, + "latitude": 36.308229, + "longitude": -82.387422, + "city": "Johnson City", + "state": "TN", + "county": "Washington" + }, + { + "zip_code": 37605, + "latitude": 36.315795, + "longitude": -82.383792, + "city": "Johnson City", + "state": "TN", + "county": "Washington" + }, + { + "zip_code": 37614, + "latitude": 36.157086, + "longitude": -82.562649, + "city": "Johnson City", + "state": "TN", + "county": "Washington" + }, + { + "zip_code": 37615, + "latitude": 36.352451, + "longitude": -82.492958, + "city": "Johnson City", + "state": "TN", + "county": "Washington" + }, + { + "zip_code": 37616, + "latitude": 36.227409, + "longitude": -82.734005, + "city": "Afton", + "state": "TN", + "county": "Greene" + }, + { + "zip_code": 37617, + "latitude": 36.525039, + "longitude": -82.369895, + "city": "Blountville", + "state": "TN", + "county": "Sullivan" + }, + { + "zip_code": 37618, + "latitude": 36.479403, + "longitude": -82.261059, + "city": "Bluff City", + "state": "TN", + "county": "Sullivan" + }, + { + "zip_code": 37620, + "latitude": 36.531703, + "longitude": -82.192545, + "city": "Bristol", + "state": "TN", + "county": "Sullivan" + }, + { + "zip_code": 37621, + "latitude": 36.504158, + "longitude": -82.26446, + "city": "Bristol", + "state": "TN", + "county": "Sullivan" + }, + { + "zip_code": 37625, + "latitude": 36.504158, + "longitude": -82.26446, + "city": "Bristol", + "state": "TN", + "county": "Sullivan" + }, + { + "zip_code": 37640, + "latitude": 36.362685, + "longitude": -81.919401, + "city": "Butler", + "state": "TN", + "county": "Johnson" + }, + { + "zip_code": 37641, + "latitude": 36.256939, + "longitude": -82.690504, + "city": "Chuckey", + "state": "TN", + "county": "Greene" + }, + { + "zip_code": 37642, + "latitude": 36.495148, + "longitude": -82.732009, + "city": "Church Hill", + "state": "TN", + "county": "Hawkins" + }, + { + "zip_code": 37643, + "latitude": 36.330784, + "longitude": -82.122892, + "city": "Elizabethton", + "state": "TN", + "county": "Carter" + }, + { + "zip_code": 37644, + "latitude": 36.436637, + "longitude": -82.051765, + "city": "Elizabethton", + "state": "TN", + "county": "Carter" + }, + { + "zip_code": 37645, + "latitude": 36.564092, + "longitude": -82.683281, + "city": "Mount Carmel", + "state": "TN", + "county": "Hawkins" + }, + { + "zip_code": 37650, + "latitude": 36.06833, + "longitude": -82.399677, + "city": "Erwin", + "state": "TN", + "county": "Unicoi" + }, + { + "zip_code": 37656, + "latitude": 36.307671, + "longitude": -82.558738, + "city": "Fall Branch", + "state": "TN", + "county": "Washington" + }, + { + "zip_code": 37657, + "latitude": 36.027038, + "longitude": -82.545757, + "city": "Flag Pond", + "state": "TN", + "county": "Unicoi" + }, + { + "zip_code": 37658, + "latitude": 36.25366, + "longitude": -82.149749, + "city": "Hampton", + "state": "TN", + "county": "Carter" + }, + { + "zip_code": 37659, + "latitude": 36.289189, + "longitude": -82.489065, + "city": "Jonesborough", + "state": "TN", + "county": "Washington" + }, + { + "zip_code": 37660, + "latitude": 36.514384, + "longitude": -82.547615, + "city": "Kingsport", + "state": "TN", + "county": "Sullivan" + }, + { + "zip_code": 37662, + "latitude": 36.530517, + "longitude": -82.529816, + "city": "Kingsport", + "state": "TN", + "county": "Sullivan" + }, + { + "zip_code": 37663, + "latitude": 36.47152, + "longitude": -82.4834, + "city": "Kingsport", + "state": "TN", + "county": "Sullivan" + }, + { + "zip_code": 37664, + "latitude": 36.503789, + "longitude": -82.496969, + "city": "Kingsport", + "state": "TN", + "county": "Sullivan" + }, + { + "zip_code": 37665, + "latitude": 36.579851, + "longitude": -82.573274, + "city": "Kingsport", + "state": "TN", + "county": "Sullivan" + }, + { + "zip_code": 37669, + "latitude": 36.504158, + "longitude": -82.26446, + "city": "Kingsport", + "state": "TN", + "county": "Sullivan" + }, + { + "zip_code": 37680, + "latitude": 36.526206, + "longitude": -81.796303, + "city": "Laurel Bloomery", + "state": "TN", + "county": "Johnson" + }, + { + "zip_code": 37681, + "latitude": 36.251851, + "longitude": -82.582954, + "city": "Limestone", + "state": "TN", + "county": "Washington" + }, + { + "zip_code": 37682, + "latitude": 36.296007, + "longitude": -82.305359, + "city": "Milligan College", + "state": "TN", + "county": "Carter" + }, + { + "zip_code": 37683, + "latitude": 36.451666, + "longitude": -81.823043, + "city": "Mountain City", + "state": "TN", + "county": "Johnson" + }, + { + "zip_code": 37684, + "latitude": 36.271729, + "longitude": -82.501212, + "city": "Mountain Home", + "state": "TN", + "county": "Washington" + }, + { + "zip_code": 37686, + "latitude": 36.449142, + "longitude": -82.340731, + "city": "Piney Flats", + "state": "TN", + "county": "Sullivan" + }, + { + "zip_code": 37687, + "latitude": 36.21957, + "longitude": -82.097785, + "city": "Roan Mountain", + "state": "TN", + "county": "Carter" + }, + { + "zip_code": 37688, + "latitude": 36.5407, + "longitude": -81.879863, + "city": "Shady Valley", + "state": "TN", + "county": "Johnson" + }, + { + "zip_code": 37690, + "latitude": 36.244143, + "longitude": -82.56404, + "city": "Telford", + "state": "TN", + "county": "Washington" + }, + { + "zip_code": 37691, + "latitude": 36.375484, + "longitude": -81.75824, + "city": "Trade", + "state": "TN", + "county": "Johnson" + }, + { + "zip_code": 37692, + "latitude": 36.201952, + "longitude": -82.316667, + "city": "Unicoi", + "state": "TN", + "county": "Unicoi" + }, + { + "zip_code": 37694, + "latitude": 36.384473, + "longitude": -82.266921, + "city": "Watauga", + "state": "TN", + "county": "Carter" + }, + { + "zip_code": 37699, + "latitude": 36.504158, + "longitude": -82.26446, + "city": "Piney Flats", + "state": "TN", + "county": "Sullivan" + }, + { + "zip_code": 37701, + "latitude": 35.815758, + "longitude": -83.987698, + "city": "Alcoa", + "state": "TN", + "county": "Blount" + }, + { + "zip_code": 37705, + "latitude": 36.202528, + "longitude": -84.068808, + "city": "Andersonville", + "state": "TN", + "county": "Anderson" + }, + { + "zip_code": 37707, + "latitude": 36.566257, + "longitude": -83.636479, + "city": "Arthur", + "state": "TN", + "county": "Claiborne" + }, + { + "zip_code": 37708, + "latitude": 36.250636, + "longitude": -83.493998, + "city": "Bean Station", + "state": "TN", + "county": "Grainger" + }, + { + "zip_code": 37709, + "latitude": 36.161793, + "longitude": -83.68192, + "city": "Blaine", + "state": "TN", + "county": "Grainger" + }, + { + "zip_code": 37710, + "latitude": 36.162585, + "longitude": -84.299217, + "city": "Briceville", + "state": "TN", + "county": "Anderson" + }, + { + "zip_code": 37711, + "latitude": 36.314262, + "longitude": -83.12129, + "city": "Bulls Gap", + "state": "TN", + "county": "Hawkins" + }, + { + "zip_code": 37713, + "latitude": 36.104208, + "longitude": -83.121619, + "city": "Bybee", + "state": "TN", + "county": "Cocke" + }, + { + "zip_code": 37714, + "latitude": 36.302779, + "longitude": -84.20298, + "city": "Caryville", + "state": "TN", + "county": "Campbell" + }, + { + "zip_code": 37715, + "latitude": 36.560275, + "longitude": -83.947827, + "city": "Clairfield", + "state": "TN", + "county": "Claiborne" + }, + { + "zip_code": 37716, + "latitude": 36.105314, + "longitude": -84.17446, + "city": "Clinton", + "state": "TN", + "county": "Anderson" + }, + { + "zip_code": 37717, + "latitude": 36.110028, + "longitude": -84.167208, + "city": "Clinton", + "state": "TN", + "county": "Anderson" + }, + { + "zip_code": 37719, + "latitude": 36.035211, + "longitude": -84.390727, + "city": "Coalfield", + "state": "TN", + "county": "Morgan" + }, + { + "zip_code": 37721, + "latitude": 36.029286, + "longitude": -83.817508, + "city": "Corryton", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37722, + "latitude": 35.839769, + "longitude": -83.203929, + "city": "Cosby", + "state": "TN", + "county": "Cocke" + }, + { + "zip_code": 37723, + "latitude": 35.951478, + "longitude": -84.812093, + "city": "Crab Orchard", + "state": "TN", + "county": "Cumberland" + }, + { + "zip_code": 37724, + "latitude": 36.556666, + "longitude": -83.690318, + "city": "Cumberland Gap", + "state": "TN", + "county": "Claiborne" + }, + { + "zip_code": 37725, + "latitude": 36.000789, + "longitude": -83.423276, + "city": "Dandridge", + "state": "TN", + "county": "Jefferson" + }, + { + "zip_code": 37726, + "latitude": 36.202427, + "longitude": -84.79351, + "city": "Deer Lodge", + "state": "TN", + "county": "Morgan" + }, + { + "zip_code": 37727, + "latitude": 35.909233, + "longitude": -83.006316, + "city": "Del Rio", + "state": "TN", + "county": "Cocke" + }, + { + "zip_code": 37729, + "latitude": 36.508642, + "longitude": -84.045356, + "city": "Duff", + "state": "TN", + "county": "Campbell" + }, + { + "zip_code": 37730, + "latitude": 36.550453, + "longitude": -83.964644, + "city": "Eagan", + "state": "TN", + "county": "Claiborne" + }, + { + "zip_code": 37731, + "latitude": 36.510756, + "longitude": -83.057056, + "city": "Eidson", + "state": "TN", + "county": "Hawkins" + }, + { + "zip_code": 37732, + "latitude": 36.387879, + "longitude": -84.616597, + "city": "Elgin", + "state": "TN", + "county": "Scott" + }, + { + "zip_code": 37733, + "latitude": 36.351914, + "longitude": -84.713666, + "city": "Rugby", + "state": "TN", + "county": "Morgan" + }, + { + "zip_code": 37737, + "latitude": 35.758228, + "longitude": -84.101182, + "city": "Friendsville", + "state": "TN", + "county": "Blount" + }, + { + "zip_code": 37738, + "latitude": 35.727782, + "longitude": -83.436982, + "city": "Gatlinburg", + "state": "TN", + "county": "Sevier" + }, + { + "zip_code": 37742, + "latitude": 35.674723, + "longitude": -84.189652, + "city": "Greenback", + "state": "TN", + "county": "Loudon" + }, + { + "zip_code": 37743, + "latitude": 36.131582, + "longitude": -82.869219, + "city": "Greeneville", + "state": "TN", + "county": "Greene" + }, + { + "zip_code": 37744, + "latitude": 36.168271, + "longitude": -82.854836, + "city": "Greeneville", + "state": "TN", + "county": "Greene" + }, + { + "zip_code": 37745, + "latitude": 36.245521, + "longitude": -82.82378, + "city": "Greeneville", + "state": "TN", + "county": "Greene" + }, + { + "zip_code": 37748, + "latitude": 35.919953, + "longitude": -84.516642, + "city": "Harriman", + "state": "TN", + "county": "Roane" + }, + { + "zip_code": 37752, + "latitude": 36.532527, + "longitude": -83.573282, + "city": "Harrogate", + "state": "TN", + "county": "Claiborne" + }, + { + "zip_code": 37753, + "latitude": 35.82414, + "longitude": -83.098214, + "city": "Hartford", + "state": "TN", + "county": "Cocke" + }, + { + "zip_code": 37754, + "latitude": 36.087461, + "longitude": -84.041266, + "city": "Heiskell", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37755, + "latitude": 36.425232, + "longitude": -84.543615, + "city": "Helenwood", + "state": "TN", + "county": "Scott" + }, + { + "zip_code": 37756, + "latitude": 36.354403, + "longitude": -84.449208, + "city": "Huntsville", + "state": "TN", + "county": "Scott" + }, + { + "zip_code": 37757, + "latitude": 36.307449, + "longitude": -84.15575, + "city": "Jacksboro", + "state": "TN", + "county": "Campbell" + }, + { + "zip_code": 37760, + "latitude": 36.09903, + "longitude": -83.457262, + "city": "Jefferson City", + "state": "TN", + "county": "Jefferson" + }, + { + "zip_code": 37762, + "latitude": 36.446193, + "longitude": -84.148034, + "city": "Jellico", + "state": "TN", + "county": "Campbell" + }, + { + "zip_code": 37763, + "latitude": 35.816595, + "longitude": -84.521104, + "city": "Kingston", + "state": "TN", + "county": "Roane" + }, + { + "zip_code": 37764, + "latitude": 35.974032, + "longitude": -83.602564, + "city": "Kodak", + "state": "TN", + "county": "Sevier" + }, + { + "zip_code": 37765, + "latitude": 36.493188, + "longitude": -83.15127, + "city": "Kyles Ford", + "state": "TN", + "county": "Hancock" + }, + { + "zip_code": 37766, + "latitude": 36.424766, + "longitude": -84.090654, + "city": "La Follette", + "state": "TN", + "county": "Campbell" + }, + { + "zip_code": 37769, + "latitude": 36.198793, + "longitude": -84.118107, + "city": "Lake City", + "state": "TN", + "county": "Anderson" + }, + { + "zip_code": 37770, + "latitude": 36.146631, + "longitude": -84.695508, + "city": "Lancing", + "state": "TN", + "county": "Morgan" + }, + { + "zip_code": 37771, + "latitude": 35.826473, + "longitude": -84.28365, + "city": "Lenoir City", + "state": "TN", + "county": "Loudon" + }, + { + "zip_code": 37772, + "latitude": 35.787243, + "longitude": -84.256679, + "city": "Lenoir City", + "state": "TN", + "county": "Loudon" + }, + { + "zip_code": 37773, + "latitude": 36.466398, + "longitude": -83.678621, + "city": "Lone Mountain", + "state": "TN", + "county": "Claiborne" + }, + { + "zip_code": 37774, + "latitude": 35.738092, + "longitude": -84.344062, + "city": "Loudon", + "state": "TN", + "county": "Loudon" + }, + { + "zip_code": 37777, + "latitude": 35.827859, + "longitude": -84.04546, + "city": "Louisville", + "state": "TN", + "county": "Blount" + }, + { + "zip_code": 37778, + "latitude": 36.213293, + "longitude": -83.275211, + "city": "Lowland", + "state": "TN", + "county": "Hamblen" + }, + { + "zip_code": 37779, + "latitude": 36.218058, + "longitude": -83.771137, + "city": "Luttrell", + "state": "TN", + "county": "Union" + }, + { + "zip_code": 37801, + "latitude": 35.688378, + "longitude": -84.076895, + "city": "Maryville", + "state": "TN", + "county": "Blount" + }, + { + "zip_code": 37802, + "latitude": 35.728283, + "longitude": -83.933815, + "city": "Maryville", + "state": "TN", + "county": "Blount" + }, + { + "zip_code": 37803, + "latitude": 35.653917, + "longitude": -83.995621, + "city": "Maryville", + "state": "TN", + "county": "Blount" + }, + { + "zip_code": 37804, + "latitude": 35.799053, + "longitude": -83.885212, + "city": "Maryville", + "state": "TN", + "county": "Blount" + }, + { + "zip_code": 37806, + "latitude": 36.085904, + "longitude": -83.737262, + "city": "Mascot", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37807, + "latitude": 36.294236, + "longitude": -83.806991, + "city": "Maynardville", + "state": "TN", + "county": "Union" + }, + { + "zip_code": 37809, + "latitude": 36.154227, + "longitude": -82.994077, + "city": "Midway", + "state": "TN", + "county": "Greene" + }, + { + "zip_code": 37810, + "latitude": 36.179069, + "longitude": -83.083417, + "city": "Mohawk", + "state": "TN", + "county": "Greene" + }, + { + "zip_code": 37811, + "latitude": 36.356017, + "longitude": -83.184274, + "city": "Mooresburg", + "state": "TN", + "county": "Hawkins" + }, + { + "zip_code": 37813, + "latitude": 36.188826, + "longitude": -83.261343, + "city": "Morristown", + "state": "TN", + "county": "Hamblen" + }, + { + "zip_code": 37814, + "latitude": 36.224258, + "longitude": -83.30984, + "city": "Morristown", + "state": "TN", + "county": "Hamblen" + }, + { + "zip_code": 37815, + "latitude": 36.213293, + "longitude": -83.275211, + "city": "Morristown", + "state": "TN", + "county": "Hamblen" + }, + { + "zip_code": 37816, + "latitude": 36.213293, + "longitude": -83.275211, + "city": "Morristown", + "state": "TN", + "county": "Hamblen" + }, + { + "zip_code": 37818, + "latitude": 36.173296, + "longitude": -82.976161, + "city": "Mosheim", + "state": "TN", + "county": "Greene" + }, + { + "zip_code": 37819, + "latitude": 36.556524, + "longitude": -84.192358, + "city": "Newcomb", + "state": "TN", + "county": "Campbell" + }, + { + "zip_code": 37820, + "latitude": 36.086723, + "longitude": -83.559174, + "city": "New Market", + "state": "TN", + "county": "Jefferson" + }, + { + "zip_code": 37821, + "latitude": 36.00244, + "longitude": -83.159605, + "city": "Newport", + "state": "TN", + "county": "Cocke" + }, + { + "zip_code": 37822, + "latitude": 35.947688, + "longitude": -83.106554, + "city": "Newport", + "state": "TN", + "county": "Cocke" + }, + { + "zip_code": 37824, + "latitude": 36.449963, + "longitude": -83.591129, + "city": "New Tazewell", + "state": "TN", + "county": "Claiborne" + }, + { + "zip_code": 37825, + "latitude": 36.454861, + "longitude": -83.583199, + "city": "New Tazewell", + "state": "TN", + "county": "Claiborne" + }, + { + "zip_code": 37826, + "latitude": 35.542073, + "longitude": -84.582782, + "city": "Niota", + "state": "TN", + "county": "Mcminn" + }, + { + "zip_code": 37828, + "latitude": 36.200476, + "longitude": -84.085785, + "city": "Norris", + "state": "TN", + "county": "Anderson" + }, + { + "zip_code": 37829, + "latitude": 35.984852, + "longitude": -84.595764, + "city": "Oakdale", + "state": "TN", + "county": "Morgan" + }, + { + "zip_code": 37830, + "latitude": 36.019381, + "longitude": -84.243175, + "city": "Oak Ridge", + "state": "TN", + "county": "Anderson" + }, + { + "zip_code": 37831, + "latitude": 36.105971, + "longitude": -84.195796, + "city": "Oak Ridge", + "state": "TN", + "county": "Anderson" + }, + { + "zip_code": 37840, + "latitude": 36.049427, + "longitude": -84.440586, + "city": "Oliver Springs", + "state": "TN", + "county": "Roane" + }, + { + "zip_code": 37841, + "latitude": 36.509395, + "longitude": -84.517984, + "city": "Oneida", + "state": "TN", + "county": "Scott" + }, + { + "zip_code": 37842, + "latitude": 35.87543, + "longitude": -84.792927, + "city": "Ozone", + "state": "TN", + "county": "Cumberland" + }, + { + "zip_code": 37843, + "latitude": 36.023406, + "longitude": -83.054705, + "city": "Parrottsville", + "state": "TN", + "county": "Cocke" + }, + { + "zip_code": 37845, + "latitude": 36.081406, + "longitude": -84.442969, + "city": "Petros", + "state": "TN", + "county": "Morgan" + }, + { + "zip_code": 37846, + "latitude": 35.678118, + "longitude": -84.431236, + "city": "Philadelphia", + "state": "TN", + "county": "Loudon" + }, + { + "zip_code": 37847, + "latitude": 36.418966, + "longitude": -84.201074, + "city": "Pioneer", + "state": "TN", + "county": "Campbell" + }, + { + "zip_code": 37848, + "latitude": 36.250636, + "longitude": -83.493998, + "city": "Powder Springs", + "state": "TN", + "county": "Grainger" + }, + { + "zip_code": 37849, + "latitude": 36.071877, + "longitude": -84.021456, + "city": "Powell", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37851, + "latitude": 36.557884, + "longitude": -83.81392, + "city": "Pruden", + "state": "TN", + "county": "Claiborne" + }, + { + "zip_code": 37852, + "latitude": 36.377044, + "longitude": -84.581147, + "city": "Robbins", + "state": "TN", + "county": "Scott" + }, + { + "zip_code": 37853, + "latitude": 35.837548, + "longitude": -83.906157, + "city": "Rockford", + "state": "TN", + "county": "Blount" + }, + { + "zip_code": 37854, + "latitude": 35.843277, + "longitude": -84.656532, + "city": "Rockwood", + "state": "TN", + "county": "Roane" + }, + { + "zip_code": 37857, + "latitude": 36.415976, + "longitude": -82.949145, + "city": "Rogersville", + "state": "TN", + "county": "Hawkins" + }, + { + "zip_code": 37860, + "latitude": 36.244307, + "longitude": -83.185535, + "city": "Russellville", + "state": "TN", + "county": "Hamblen" + }, + { + "zip_code": 37861, + "latitude": 36.230696, + "longitude": -83.554826, + "city": "Rutledge", + "state": "TN", + "county": "Grainger" + }, + { + "zip_code": 37862, + "latitude": 35.833278, + "longitude": -83.572214, + "city": "Sevierville", + "state": "TN", + "county": "Sevier" + }, + { + "zip_code": 37863, + "latitude": 35.83391, + "longitude": -83.568939, + "city": "Pigeon Forge", + "state": "TN", + "county": "Sevier" + }, + { + "zip_code": 37864, + "latitude": 35.854211, + "longitude": -83.613849, + "city": "Sevierville", + "state": "TN", + "county": "Sevier" + }, + { + "zip_code": 37865, + "latitude": 35.86053, + "longitude": -83.711272, + "city": "Seymour", + "state": "TN", + "county": "Sevier" + }, + { + "zip_code": 37866, + "latitude": 36.342768, + "longitude": -83.82039, + "city": "Sharps Chapel", + "state": "TN", + "county": "Union" + }, + { + "zip_code": 37867, + "latitude": 36.580283, + "longitude": -83.647254, + "city": "Shawanee", + "state": "TN", + "county": "Claiborne" + }, + { + "zip_code": 37868, + "latitude": 35.880902, + "longitude": -83.556134, + "city": "Pigeon Forge", + "state": "TN", + "county": "Sevier" + }, + { + "zip_code": 37869, + "latitude": 36.509867, + "longitude": -83.185624, + "city": "Sneedville", + "state": "TN", + "county": "Hancock" + }, + { + "zip_code": 37870, + "latitude": 36.48404, + "longitude": -83.823282, + "city": "Speedwell", + "state": "TN", + "county": "Claiborne" + }, + { + "zip_code": 37871, + "latitude": 36.068694, + "longitude": -83.656829, + "city": "Strawberry Plains", + "state": "TN", + "county": "Jefferson" + }, + { + "zip_code": 37872, + "latitude": 36.182465, + "longitude": -84.599987, + "city": "Sunbright", + "state": "TN", + "county": "Morgan" + }, + { + "zip_code": 37873, + "latitude": 36.520167, + "longitude": -82.857862, + "city": "Surgoinsville", + "state": "TN", + "county": "Hawkins" + }, + { + "zip_code": 37874, + "latitude": 35.571343, + "longitude": -84.410561, + "city": "Sweetwater", + "state": "TN", + "county": "Monroe" + }, + { + "zip_code": 37876, + "latitude": 35.849046, + "longitude": -83.51432, + "city": "Sevierville", + "state": "TN", + "county": "Sevier" + }, + { + "zip_code": 37877, + "latitude": 36.177707, + "longitude": -83.407043, + "city": "Talbott", + "state": "TN", + "county": "Hamblen" + }, + { + "zip_code": 37878, + "latitude": 35.584404, + "longitude": -83.992315, + "city": "Tallassee", + "state": "TN", + "county": "Blount" + }, + { + "zip_code": 37879, + "latitude": 36.471886, + "longitude": -83.52214, + "city": "Tazewell", + "state": "TN", + "county": "Claiborne" + }, + { + "zip_code": 37880, + "latitude": 35.520244, + "longitude": -84.825054, + "city": "Ten Mile", + "state": "TN", + "county": "Meigs" + }, + { + "zip_code": 37881, + "latitude": 36.250636, + "longitude": -83.493998, + "city": "Thorn Hill", + "state": "TN", + "county": "Grainger" + }, + { + "zip_code": 37882, + "latitude": 35.682298, + "longitude": -83.751242, + "city": "Townsend", + "state": "TN", + "county": "Blount" + }, + { + "zip_code": 37885, + "latitude": 35.531891, + "longitude": -84.225767, + "city": "Vonore", + "state": "TN", + "county": "Monroe" + }, + { + "zip_code": 37886, + "latitude": 35.754464, + "longitude": -83.804833, + "city": "Walland", + "state": "TN", + "county": "Blount" + }, + { + "zip_code": 37887, + "latitude": 36.031584, + "longitude": -84.560491, + "city": "Wartburg", + "state": "TN", + "county": "Morgan" + }, + { + "zip_code": 37888, + "latitude": 36.250636, + "longitude": -83.493998, + "city": "Washburn", + "state": "TN", + "county": "Grainger" + }, + { + "zip_code": 37890, + "latitude": 36.077612, + "longitude": -83.299826, + "city": "White Pine", + "state": "TN", + "county": "Jefferson" + }, + { + "zip_code": 37891, + "latitude": 36.256858, + "longitude": -83.146114, + "city": "Whitesburg", + "state": "TN", + "county": "Hamblen" + }, + { + "zip_code": 37892, + "latitude": 36.5482, + "longitude": -84.414551, + "city": "Winfield", + "state": "TN", + "county": "Scott" + }, + { + "zip_code": 37901, + "latitude": 36.032334, + "longitude": -83.884804, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37902, + "latitude": 35.944976, + "longitude": -83.875822, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37909, + "latitude": 35.944822, + "longitude": -84.010109, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37912, + "latitude": 35.981701, + "longitude": -84.015635, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37914, + "latitude": 35.983366, + "longitude": -83.784109, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37915, + "latitude": 35.990369, + "longitude": -83.905415, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37916, + "latitude": 35.933783, + "longitude": -83.973635, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37917, + "latitude": 35.998447, + "longitude": -83.910527, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37918, + "latitude": 36.065908, + "longitude": -83.909603, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37919, + "latitude": 35.937391, + "longitude": -84.04224, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37920, + "latitude": 35.89292, + "longitude": -83.938689, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37921, + "latitude": 36.021873, + "longitude": -83.932092, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37922, + "latitude": 35.858018, + "longitude": -84.119383, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37923, + "latitude": 35.924795, + "longitude": -84.082405, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37924, + "latitude": 35.985081, + "longitude": -83.975603, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37927, + "latitude": 35.990142, + "longitude": -83.96218, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37928, + "latitude": 35.990142, + "longitude": -83.96218, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37929, + "latitude": 35.922421, + "longitude": -83.795492, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37930, + "latitude": 35.9029, + "longitude": -83.953554, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37931, + "latitude": 35.976167, + "longitude": -84.125653, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37932, + "latitude": 35.933487, + "longitude": -84.148074, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37933, + "latitude": 35.990142, + "longitude": -83.96218, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37938, + "latitude": 36.116665, + "longitude": -83.935206, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37939, + "latitude": 35.990142, + "longitude": -83.96218, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37940, + "latitude": 35.990142, + "longitude": -83.96218, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37950, + "latitude": 35.990142, + "longitude": -83.96218, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37990, + "latitude": 35.990142, + "longitude": -83.96218, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37995, + "latitude": 35.990142, + "longitude": -83.96218, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37996, + "latitude": 35.990142, + "longitude": -83.96218, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37997, + "latitude": 35.990142, + "longitude": -83.96218, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 37998, + "latitude": 35.935134, + "longitude": -83.750258, + "city": "Knoxville", + "state": "TN", + "county": "Knox" + }, + { + "zip_code": 38001, + "latitude": 35.806106, + "longitude": -89.086594, + "city": "Alamo", + "state": "TN", + "county": "Crockett" + }, + { + "zip_code": 38002, + "latitude": 35.292102, + "longitude": -89.752615, + "city": "Arlington", + "state": "TN", + "county": "Fayette" + }, + { + "zip_code": 38004, + "latitude": 35.454301, + "longitude": -89.809562, + "city": "Atoka", + "state": "TN", + "county": "Tipton" + }, + { + "zip_code": 38006, + "latitude": 35.75357, + "longitude": -89.104516, + "city": "Bells", + "state": "TN", + "county": "Crockett" + }, + { + "zip_code": 38007, + "latitude": 36.158668, + "longitude": -89.437684, + "city": "Bogota", + "state": "TN", + "county": "Dyer" + }, + { + "zip_code": 38008, + "latitude": 35.197635, + "longitude": -88.986448, + "city": "Bolivar", + "state": "TN", + "county": "Hardeman" + }, + { + "zip_code": 38010, + "latitude": 35.288624, + "longitude": -89.48802, + "city": "Braden", + "state": "TN", + "county": "Fayette" + }, + { + "zip_code": 38011, + "latitude": 35.473412, + "longitude": -89.745307, + "city": "Brighton", + "state": "TN", + "county": "Tipton" + }, + { + "zip_code": 38012, + "latitude": 35.633418, + "longitude": -89.276381, + "city": "Brownsville", + "state": "TN", + "county": "Haywood" + }, + { + "zip_code": 38014, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Brunswick", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38015, + "latitude": 35.551009, + "longitude": -89.738952, + "city": "Burlison", + "state": "TN", + "county": "Tipton" + }, + { + "zip_code": 38016, + "latitude": "", + "longitude": "", + "city": "Cordova", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38017, + "latitude": 35.080992, + "longitude": -89.699083, + "city": "Collierville", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38018, + "latitude": 35.104589, + "longitude": -89.900314, + "city": "Cordova", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38019, + "latitude": 35.541624, + "longitude": -89.63552, + "city": "Covington", + "state": "TN", + "county": "Tipton" + }, + { + "zip_code": 38021, + "latitude": 35.871014, + "longitude": -89.175275, + "city": "Crockett Mills", + "state": "TN", + "county": "Crockett" + }, + { + "zip_code": 38023, + "latitude": 35.460696, + "longitude": -89.93429, + "city": "Drummonds", + "state": "TN", + "county": "Tipton" + }, + { + "zip_code": 38024, + "latitude": 36.036069, + "longitude": -89.438461, + "city": "Dyersburg", + "state": "TN", + "county": "Dyer" + }, + { + "zip_code": 38025, + "latitude": 36.046851, + "longitude": -89.443779, + "city": "Dyersburg", + "state": "TN", + "county": "Dyer" + }, + { + "zip_code": 38027, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Collierville", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38028, + "latitude": 35.175796, + "longitude": -89.684982, + "city": "Eads", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38029, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Ellendale", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38030, + "latitude": 36.068517, + "longitude": -89.561464, + "city": "Finley", + "state": "TN", + "county": "Dyer" + }, + { + "zip_code": 38034, + "latitude": 35.843638, + "longitude": -89.207168, + "city": "Friendship", + "state": "TN", + "county": "Crockett" + }, + { + "zip_code": 38036, + "latitude": 35.327428, + "longitude": -89.619816, + "city": "Gallaway", + "state": "TN", + "county": "Fayette" + }, + { + "zip_code": 38037, + "latitude": 35.792984, + "longitude": -89.646955, + "city": "Gates", + "state": "TN", + "county": "Lauderdale" + }, + { + "zip_code": 38039, + "latitude": 35.055153, + "longitude": -89.140622, + "city": "Grand Junction", + "state": "TN", + "county": "Hardeman" + }, + { + "zip_code": 38040, + "latitude": 35.840794, + "longitude": -89.531217, + "city": "Halls", + "state": "TN", + "county": "Lauderdale" + }, + { + "zip_code": 38041, + "latitude": 35.659259, + "longitude": -89.696162, + "city": "Henning", + "state": "TN", + "county": "Lauderdale" + }, + { + "zip_code": 38042, + "latitude": 35.124195, + "longitude": -89.075852, + "city": "Hickory Valley", + "state": "TN", + "county": "Hardeman" + }, + { + "zip_code": 38044, + "latitude": 35.189276, + "longitude": -88.955968, + "city": "Hornsby", + "state": "TN", + "county": "Hardeman" + }, + { + "zip_code": 38045, + "latitude": 35.290428, + "longitude": -89.232185, + "city": "Laconia", + "state": "TN", + "county": "Fayette" + }, + { + "zip_code": 38046, + "latitude": 35.10486, + "longitude": -89.350387, + "city": "La Grange", + "state": "TN", + "county": "Fayette" + }, + { + "zip_code": 38047, + "latitude": 36.063765, + "longitude": -89.560879, + "city": "Lenox", + "state": "TN", + "county": "Dyer" + }, + { + "zip_code": 38048, + "latitude": 35.15066, + "longitude": -89.481362, + "city": "Macon", + "state": "TN", + "county": "Fayette" + }, + { + "zip_code": 38049, + "latitude": 35.443164, + "longitude": -89.563798, + "city": "Mason", + "state": "TN", + "county": "Tipton" + }, + { + "zip_code": 38050, + "latitude": 35.837913, + "longitude": -89.227284, + "city": "Maury City", + "state": "TN", + "county": "Crockett" + }, + { + "zip_code": 38052, + "latitude": 35.086247, + "longitude": -88.912495, + "city": "Middleton", + "state": "TN", + "county": "Hardeman" + }, + { + "zip_code": 38053, + "latitude": 35.320197, + "longitude": -89.892286, + "city": "Millington", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38054, + "latitude": 35.334132, + "longitude": -89.870636, + "city": "Millington", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38055, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Millington", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38056, + "latitude": 36.046851, + "longitude": -89.443779, + "city": "Miston", + "state": "TN", + "county": "Dyer" + }, + { + "zip_code": 38057, + "latitude": 35.077518, + "longitude": -89.33787, + "city": "Moscow", + "state": "TN", + "county": "Fayette" + }, + { + "zip_code": 38058, + "latitude": 35.463075, + "longitude": -89.711843, + "city": "Munford", + "state": "TN", + "county": "Tipton" + }, + { + "zip_code": 38059, + "latitude": 36.113717, + "longitude": -89.272827, + "city": "Newbern", + "state": "TN", + "county": "Dyer" + }, + { + "zip_code": 38060, + "latitude": 35.234809, + "longitude": -89.489977, + "city": "Oakland", + "state": "TN", + "county": "Fayette" + }, + { + "zip_code": 38061, + "latitude": 35.075589, + "longitude": -88.957929, + "city": "Pocahontas", + "state": "TN", + "county": "Hardeman" + }, + { + "zip_code": 38063, + "latitude": 35.754505, + "longitude": -89.66112, + "city": "Ripley", + "state": "TN", + "county": "Lauderdale" + }, + { + "zip_code": 38066, + "latitude": 35.084994, + "longitude": -89.421234, + "city": "Rossville", + "state": "TN", + "county": "Fayette" + }, + { + "zip_code": 38067, + "latitude": 35.084166, + "longitude": -89.005719, + "city": "Saulsbury", + "state": "TN", + "county": "Hardeman" + }, + { + "zip_code": 38068, + "latitude": 35.259373, + "longitude": -89.409857, + "city": "Somerville", + "state": "TN", + "county": "Fayette" + }, + { + "zip_code": 38069, + "latitude": 35.456111, + "longitude": -89.339146, + "city": "Stanton", + "state": "TN", + "county": "Haywood" + }, + { + "zip_code": 38070, + "latitude": 35.942019, + "longitude": -89.243405, + "city": "Tigrett", + "state": "TN", + "county": "Dyer" + }, + { + "zip_code": 38071, + "latitude": 35.414319, + "longitude": -89.818781, + "city": "Tipton", + "state": "TN", + "county": "Tipton" + }, + { + "zip_code": 38074, + "latitude": 35.213371, + "longitude": -88.990028, + "city": "Bolivar", + "state": "TN", + "county": "Hardeman" + }, + { + "zip_code": 38075, + "latitude": 35.314672, + "longitude": -89.126324, + "city": "Whiteville", + "state": "TN", + "county": "Hardeman" + }, + { + "zip_code": 38076, + "latitude": 35.141626, + "longitude": -89.422466, + "city": "Williston", + "state": "TN", + "county": "Fayette" + }, + { + "zip_code": 38077, + "latitude": 36.344296, + "longitude": -89.522851, + "city": "Wynnburg", + "state": "TN", + "county": "Lake" + }, + { + "zip_code": 38079, + "latitude": 36.35529, + "longitude": -89.472468, + "city": "Tiptonville", + "state": "TN", + "county": "Lake" + }, + { + "zip_code": 38080, + "latitude": 36.25973, + "longitude": -89.465379, + "city": "Ridgely", + "state": "TN", + "county": "Lake" + }, + { + "zip_code": 38083, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Millington", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38088, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Cordova", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38101, + "latitude": 35.050667, + "longitude": -89.847782, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38103, + "latitude": 35.154875, + "longitude": -90.049631, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38104, + "latitude": 35.13573, + "longitude": -90.002079, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38105, + "latitude": 35.15182, + "longitude": -90.033959, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38106, + "latitude": 35.096351, + "longitude": -90.042984, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38107, + "latitude": 35.170953, + "longitude": -90.017716, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38108, + "latitude": 35.175239, + "longitude": -89.97306, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38109, + "latitude": 35.053795, + "longitude": -90.094757, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38110, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38111, + "latitude": 35.10956, + "longitude": -89.948119, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38112, + "latitude": 35.146285, + "longitude": -89.981523, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38113, + "latitude": 35.12738, + "longitude": -89.984484, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38114, + "latitude": 35.099348, + "longitude": -89.985187, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38115, + "latitude": 35.057906, + "longitude": -89.864023, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38116, + "latitude": 35.032879, + "longitude": -90.01109, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38117, + "latitude": 35.113588, + "longitude": -89.906749, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38118, + "latitude": 35.037585, + "longitude": -89.930187, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38119, + "latitude": 35.078775, + "longitude": -89.841963, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38120, + "latitude": 35.123644, + "longitude": -89.842541, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38122, + "latitude": 35.157958, + "longitude": -89.918514, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38124, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38125, + "latitude": 35.028829, + "longitude": -89.782647, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38126, + "latitude": 35.127163, + "longitude": -90.044782, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38127, + "latitude": 35.24346, + "longitude": -90.011979, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38128, + "latitude": 35.223442, + "longitude": -89.920266, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38130, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38131, + "latitude": 35.064837, + "longitude": -89.992905, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38132, + "latitude": 35.068014, + "longitude": -90.003349, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38133, + "latitude": 35.208941, + "longitude": -89.791656, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38134, + "latitude": 35.184469, + "longitude": -89.857389, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38135, + "latitude": 35.234976, + "longitude": -89.843594, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38136, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38137, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38138, + "latitude": 35.08753, + "longitude": -89.792638, + "city": "Germantown", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38139, + "latitude": 35.077091, + "longitude": -89.759979, + "city": "Germantown", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38140, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38141, + "latitude": 35.014466, + "longitude": -89.853346, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38142, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38143, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38145, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38146, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38147, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38148, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38150, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38151, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38152, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38157, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38159, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38161, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38163, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38165, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38166, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38167, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38168, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38173, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38174, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38175, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38177, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38181, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38182, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38183, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Germantown", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38184, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38186, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38187, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38188, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38190, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38193, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38194, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38195, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38197, + "latitude": 35.201738, + "longitude": -89.971538, + "city": "Memphis", + "state": "TN", + "county": "Shelby" + }, + { + "zip_code": 38201, + "latitude": 36.077501, + "longitude": -88.495094, + "city": "Mc Kenzie", + "state": "TN", + "county": "Carroll" + }, + { + "zip_code": 38220, + "latitude": 35.98991, + "longitude": -88.635869, + "city": "Atwood", + "state": "TN", + "county": "Carroll" + }, + { + "zip_code": 38221, + "latitude": 36.246599, + "longitude": -88.046704, + "city": "Big Sandy", + "state": "TN", + "county": "Benton" + }, + { + "zip_code": 38222, + "latitude": 36.428005, + "longitude": -88.179868, + "city": "Buchanan", + "state": "TN", + "county": "Henry" + }, + { + "zip_code": 38223, + "latitude": 36.310995, + "longitude": -88.260367, + "city": "Como", + "state": "TN", + "county": "Henry" + }, + { + "zip_code": 38224, + "latitude": 36.401598, + "longitude": -88.466035, + "city": "Cottage Grove", + "state": "TN", + "county": "Henry" + }, + { + "zip_code": 38225, + "latitude": 36.313605, + "longitude": -88.742473, + "city": "Dresden", + "state": "TN", + "county": "Weakley" + }, + { + "zip_code": 38226, + "latitude": 36.347497, + "longitude": -88.677715, + "city": "Dukedom", + "state": "TN", + "county": "Weakley" + }, + { + "zip_code": 38229, + "latitude": 36.224842, + "longitude": -88.616346, + "city": "Gleason", + "state": "TN", + "county": "Weakley" + }, + { + "zip_code": 38230, + "latitude": 36.213708, + "longitude": -88.781253, + "city": "Greenfield", + "state": "TN", + "county": "Weakley" + }, + { + "zip_code": 38231, + "latitude": 36.221214, + "longitude": -88.421701, + "city": "Henry", + "state": "TN", + "county": "Henry" + }, + { + "zip_code": 38232, + "latitude": 36.35288, + "longitude": -89.333345, + "city": "Hornbeak", + "state": "TN", + "county": "Obion" + }, + { + "zip_code": 38233, + "latitude": 36.134323, + "longitude": -89.028993, + "city": "Kenton", + "state": "TN", + "county": "Gibson" + }, + { + "zip_code": 38235, + "latitude": 35.977824, + "longitude": -88.574447, + "city": "Mc Lemoresville", + "state": "TN", + "county": "Carroll" + }, + { + "zip_code": 38236, + "latitude": 36.176184, + "longitude": -88.277355, + "city": "Mansfield", + "state": "TN", + "county": "Henry" + }, + { + "zip_code": 38237, + "latitude": 36.324103, + "longitude": -88.782561, + "city": "Martin", + "state": "TN", + "county": "Weakley" + }, + { + "zip_code": 38238, + "latitude": 36.282357, + "longitude": -88.738132, + "city": "Martin", + "state": "TN", + "county": "Weakley" + }, + { + "zip_code": 38240, + "latitude": 36.271215, + "longitude": -89.292228, + "city": "Obion", + "state": "TN", + "county": "Obion" + }, + { + "zip_code": 38241, + "latitude": 36.391905, + "longitude": -88.611055, + "city": "Palmersville", + "state": "TN", + "county": "Weakley" + }, + { + "zip_code": 38242, + "latitude": 36.31586, + "longitude": -88.315916, + "city": "Paris", + "state": "TN", + "county": "Henry" + }, + { + "zip_code": 38251, + "latitude": 36.333902, + "longitude": -88.304762, + "city": "Puryear", + "state": "TN", + "county": "Henry" + }, + { + "zip_code": 38253, + "latitude": 36.310755, + "longitude": -89.073128, + "city": "Rives", + "state": "TN", + "county": "Obion" + }, + { + "zip_code": 38254, + "latitude": 36.379051, + "longitude": -89.353821, + "city": "Samburg", + "state": "TN", + "county": "Obion" + }, + { + "zip_code": 38255, + "latitude": 36.241614, + "longitude": -88.860371, + "city": "Sharon", + "state": "TN", + "county": "Weakley" + }, + { + "zip_code": 38256, + "latitude": 36.295353, + "longitude": -88.157201, + "city": "Springville", + "state": "TN", + "county": "Henry" + }, + { + "zip_code": 38257, + "latitude": 36.381482, + "longitude": -89.08396, + "city": "South Fulton", + "state": "TN", + "county": "Obion" + }, + { + "zip_code": 38258, + "latitude": 36.040631, + "longitude": -88.606605, + "city": "Trezevant", + "state": "TN", + "county": "Carroll" + }, + { + "zip_code": 38259, + "latitude": 36.168626, + "longitude": -89.198503, + "city": "Trimble", + "state": "TN", + "county": "Dyer" + }, + { + "zip_code": 38260, + "latitude": 36.358606, + "longitude": -89.210108, + "city": "Troy", + "state": "TN", + "county": "Obion" + }, + { + "zip_code": 38261, + "latitude": 36.354638, + "longitude": -89.122231, + "city": "Union City", + "state": "TN", + "county": "Obion" + }, + { + "zip_code": 38271, + "latitude": 36.458295, + "longitude": -89.233227, + "city": "Woodland Mills", + "state": "TN", + "county": "Obion" + }, + { + "zip_code": 38281, + "latitude": 36.354384, + "longitude": -89.149881, + "city": "Union City", + "state": "TN", + "county": "Obion" + }, + { + "zip_code": 38301, + "latitude": 35.570424, + "longitude": -88.862742, + "city": "Jackson", + "state": "TN", + "county": "Madison" + }, + { + "zip_code": 38302, + "latitude": 35.612405, + "longitude": -88.841225, + "city": "Jackson", + "state": "TN", + "county": "Madison" + }, + { + "zip_code": 38303, + "latitude": 35.612405, + "longitude": -88.841225, + "city": "Jackson", + "state": "TN", + "county": "Madison" + }, + { + "zip_code": 38305, + "latitude": 35.652446, + "longitude": -88.835682, + "city": "Jackson", + "state": "TN", + "county": "Madison" + }, + { + "zip_code": 38308, + "latitude": 35.612405, + "longitude": -88.841225, + "city": "Jackson", + "state": "TN", + "county": "Madison" + }, + { + "zip_code": 38310, + "latitude": 35.271057, + "longitude": -88.447528, + "city": "Adamsville", + "state": "TN", + "county": "Mcnairy" + }, + { + "zip_code": 38311, + "latitude": 35.448494, + "longitude": -88.121113, + "city": "Bath Springs", + "state": "TN", + "county": "Decatur" + }, + { + "zip_code": 38313, + "latitude": 35.613916, + "longitude": -88.660454, + "city": "Beech Bluff", + "state": "TN", + "county": "Madison" + }, + { + "zip_code": 38314, + "latitude": 35.612405, + "longitude": -88.841225, + "city": "Jackson", + "state": "TN", + "county": "Madison" + }, + { + "zip_code": 38315, + "latitude": 35.272195, + "longitude": -88.626639, + "city": "Bethel Springs", + "state": "TN", + "county": "Mcnairy" + }, + { + "zip_code": 38316, + "latitude": 36.057402, + "longitude": -88.804199, + "city": "Bradford", + "state": "TN", + "county": "Gibson" + }, + { + "zip_code": 38317, + "latitude": 36.056026, + "longitude": -88.282103, + "city": "Bruceton", + "state": "TN", + "county": "Carroll" + }, + { + "zip_code": 38318, + "latitude": 35.961327, + "longitude": -88.270214, + "city": "Buena Vista", + "state": "TN", + "county": "Carroll" + }, + { + "zip_code": 38320, + "latitude": 36.082972, + "longitude": -88.101856, + "city": "Camden", + "state": "TN", + "county": "Benton" + }, + { + "zip_code": 38321, + "latitude": 35.87179, + "longitude": -88.529538, + "city": "Cedar Grove", + "state": "TN", + "county": "Carroll" + }, + { + "zip_code": 38324, + "latitude": 35.867454, + "longitude": -88.39343, + "city": "Clarksburg", + "state": "TN", + "county": "Carroll" + }, + { + "zip_code": 38326, + "latitude": 35.110079, + "longitude": -88.292167, + "city": "Counce", + "state": "TN", + "county": "Hardin" + }, + { + "zip_code": 38327, + "latitude": 35.219095, + "longitude": -88.319171, + "city": "Crump", + "state": "TN", + "county": "Hardin" + }, + { + "zip_code": 38328, + "latitude": 35.666113, + "longitude": -88.215928, + "city": "Darden", + "state": "TN", + "county": "Henderson" + }, + { + "zip_code": 38329, + "latitude": 35.536264, + "longitude": -88.114375, + "city": "Decaturville", + "state": "TN", + "county": "Decatur" + }, + { + "zip_code": 38330, + "latitude": 36.080961, + "longitude": -89.036758, + "city": "Dyer", + "state": "TN", + "county": "Gibson" + }, + { + "zip_code": 38331, + "latitude": 35.969336, + "longitude": -89.131915, + "city": "Eaton", + "state": "TN", + "county": "Gibson" + }, + { + "zip_code": 38332, + "latitude": 35.428488, + "longitude": -88.429204, + "city": "Enville", + "state": "TN", + "county": "Chester" + }, + { + "zip_code": 38333, + "latitude": 36.114158, + "longitude": -87.98197, + "city": "Eva", + "state": "TN", + "county": "Benton" + }, + { + "zip_code": 38334, + "latitude": 35.268959, + "longitude": -88.567203, + "city": "Finger", + "state": "TN", + "county": "Mcnairy" + }, + { + "zip_code": 38336, + "latitude": 35.748414, + "longitude": -89.032672, + "city": "Fruitvale", + "state": "TN", + "county": "Crockett" + }, + { + "zip_code": 38337, + "latitude": 35.780292, + "longitude": -89.026456, + "city": "Gadsden", + "state": "TN", + "county": "Crockett" + }, + { + "zip_code": 38338, + "latitude": 35.870849, + "longitude": -88.846372, + "city": "Gibson", + "state": "TN", + "county": "Gibson" + }, + { + "zip_code": 38339, + "latitude": 35.056023, + "longitude": -88.504368, + "city": "Guys", + "state": "TN", + "county": "Mcnairy" + }, + { + "zip_code": 38340, + "latitude": 35.407562, + "longitude": -88.642991, + "city": "Henderson", + "state": "TN", + "county": "Chester" + }, + { + "zip_code": 38341, + "latitude": 35.905992, + "longitude": -88.078052, + "city": "Holladay", + "state": "TN", + "county": "Benton" + }, + { + "zip_code": 38342, + "latitude": 36.05038, + "longitude": -88.291871, + "city": "Hollow Rock", + "state": "TN", + "county": "Carroll" + }, + { + "zip_code": 38343, + "latitude": 35.880408, + "longitude": -88.93101, + "city": "Humboldt", + "state": "TN", + "county": "Gibson" + }, + { + "zip_code": 38344, + "latitude": 35.985967, + "longitude": -88.433709, + "city": "Huntingdon", + "state": "TN", + "county": "Carroll" + }, + { + "zip_code": 38345, + "latitude": 35.621106, + "longitude": -88.496219, + "city": "Huron", + "state": "TN", + "county": "Henderson" + }, + { + "zip_code": 38346, + "latitude": 36.030588, + "longitude": -88.805599, + "city": "Idlewild", + "state": "TN", + "county": "Gibson" + }, + { + "zip_code": 38347, + "latitude": 35.471954, + "longitude": -88.491318, + "city": "Jacks Creek", + "state": "TN", + "county": "Chester" + }, + { + "zip_code": 38348, + "latitude": 35.860641, + "longitude": -88.640325, + "city": "Lavinia", + "state": "TN", + "county": "Carroll" + }, + { + "zip_code": 38351, + "latitude": 35.675767, + "longitude": -88.412139, + "city": "Lexington", + "state": "TN", + "county": "Henderson" + }, + { + "zip_code": 38352, + "latitude": 35.535462, + "longitude": -88.537854, + "city": "Luray", + "state": "TN", + "county": "Chester" + }, + { + "zip_code": 38355, + "latitude": 35.813893, + "longitude": -88.753157, + "city": "Medina", + "state": "TN", + "county": "Gibson" + }, + { + "zip_code": 38356, + "latitude": 35.482255, + "longitude": -88.911302, + "city": "Medon", + "state": "TN", + "county": "Madison" + }, + { + "zip_code": 38357, + "latitude": 35.139103, + "longitude": -88.565035, + "city": "Michie", + "state": "TN", + "county": "Mcnairy" + }, + { + "zip_code": 38358, + "latitude": 35.920312, + "longitude": -88.813982, + "city": "Milan", + "state": "TN", + "county": "Gibson" + }, + { + "zip_code": 38359, + "latitude": 35.367207, + "longitude": -88.388143, + "city": "Milledgeville", + "state": "TN", + "county": "Mcnairy" + }, + { + "zip_code": 38361, + "latitude": 35.300156, + "longitude": -88.274636, + "city": "Morris Chapel", + "state": "TN", + "county": "Hardin" + }, + { + "zip_code": 38362, + "latitude": 35.724238, + "longitude": -88.780118, + "city": "Oakfield", + "state": "TN", + "county": "Madison" + }, + { + "zip_code": 38363, + "latitude": 35.697465, + "longitude": -88.111755, + "city": "Parsons", + "state": "TN", + "county": "Decatur" + }, + { + "zip_code": 38365, + "latitude": 35.038284, + "longitude": -88.225601, + "city": "Pickwick Dam", + "state": "TN", + "county": "Hardin" + }, + { + "zip_code": 38366, + "latitude": 35.485, + "longitude": -88.747695, + "city": "Pinson", + "state": "TN", + "county": "Madison" + }, + { + "zip_code": 38367, + "latitude": 35.065178, + "longitude": -88.641833, + "city": "Ramer", + "state": "TN", + "county": "Mcnairy" + }, + { + "zip_code": 38368, + "latitude": 35.501858, + "longitude": -88.368317, + "city": "Reagan", + "state": "TN", + "county": "Henderson" + }, + { + "zip_code": 38369, + "latitude": 36.127152, + "longitude": -88.959639, + "city": "Rutherford", + "state": "TN", + "county": "Gibson" + }, + { + "zip_code": 38370, + "latitude": 35.322354, + "longitude": -88.24275, + "city": "Saltillo", + "state": "TN", + "county": "Hardin" + }, + { + "zip_code": 38371, + "latitude": 35.467143, + "longitude": -88.298898, + "city": "Sardis", + "state": "TN", + "county": "Henderson" + }, + { + "zip_code": 38372, + "latitude": 35.210571, + "longitude": -88.179203, + "city": "Savannah", + "state": "TN", + "county": "Hardin" + }, + { + "zip_code": 38374, + "latitude": 35.466358, + "longitude": -88.2138, + "city": "Scotts Hill", + "state": "TN", + "county": "Decatur" + }, + { + "zip_code": 38375, + "latitude": 35.214443, + "longitude": -88.580145, + "city": "Selmer", + "state": "TN", + "county": "Mcnairy" + }, + { + "zip_code": 38376, + "latitude": 35.126018, + "longitude": -88.346807, + "city": "Shiloh", + "state": "TN", + "county": "Hardin" + }, + { + "zip_code": 38377, + "latitude": 35.35604, + "longitude": -88.826923, + "city": "Silerton", + "state": "TN", + "county": "Hardeman" + }, + { + "zip_code": 38378, + "latitude": 35.766822, + "longitude": -88.683882, + "city": "Spring Creek", + "state": "TN", + "county": "Madison" + }, + { + "zip_code": 38379, + "latitude": 35.164604, + "longitude": -88.443952, + "city": "Stantonville", + "state": "TN", + "county": "Mcnairy" + }, + { + "zip_code": 38380, + "latitude": 35.785097, + "longitude": -88.041426, + "city": "Sugar Tree", + "state": "TN", + "county": "Decatur" + }, + { + "zip_code": 38381, + "latitude": 35.343473, + "longitude": -88.942458, + "city": "Toone", + "state": "TN", + "county": "Hardeman" + }, + { + "zip_code": 38382, + "latitude": 35.96713, + "longitude": -88.9815, + "city": "Trenton", + "state": "TN", + "county": "Gibson" + }, + { + "zip_code": 38387, + "latitude": 35.884516, + "longitude": -88.289175, + "city": "Westport", + "state": "TN", + "county": "Carroll" + }, + { + "zip_code": 38388, + "latitude": 35.768119, + "longitude": -88.348263, + "city": "Wildersville", + "state": "TN", + "county": "Henderson" + }, + { + "zip_code": 38389, + "latitude": 36.135364, + "longitude": -89.111653, + "city": "Yorkville", + "state": "TN", + "county": "Gibson" + }, + { + "zip_code": 38390, + "latitude": 35.8458, + "longitude": -88.357504, + "city": "Yuma", + "state": "TN", + "county": "Carroll" + }, + { + "zip_code": 38391, + "latitude": 35.540108, + "longitude": -88.988401, + "city": "Denmark", + "state": "TN", + "county": "Madison" + }, + { + "zip_code": 38392, + "latitude": 35.481628, + "longitude": -89.027133, + "city": "Mercer", + "state": "TN", + "county": "Madison" + }, + { + "zip_code": 38393, + "latitude": 34.99687, + "longitude": -88.645577, + "city": "Chewalla", + "state": "TN", + "county": "Mcnairy" + }, + { + "zip_code": 38401, + "latitude": 35.623997, + "longitude": -87.00404, + "city": "Columbia", + "state": "TN", + "county": "Maury" + }, + { + "zip_code": 38402, + "latitude": 35.629413, + "longitude": -87.068172, + "city": "Columbia", + "state": "TN", + "county": "Maury" + }, + { + "zip_code": 38425, + "latitude": 35.388038, + "longitude": -87.930163, + "city": "Clifton", + "state": "TN", + "county": "Wayne" + }, + { + "zip_code": 38449, + "latitude": 35.055109, + "longitude": -86.883959, + "city": "Ardmore", + "state": "TN", + "county": "Giles" + }, + { + "zip_code": 38450, + "latitude": 35.180623, + "longitude": -87.786778, + "city": "Collinwood", + "state": "TN", + "county": "Wayne" + }, + { + "zip_code": 38451, + "latitude": 35.493211, + "longitude": -87.093094, + "city": "Culleoka", + "state": "TN", + "county": "Maury" + }, + { + "zip_code": 38452, + "latitude": 35.195385, + "longitude": -87.827937, + "city": "Cypress Inn", + "state": "TN", + "county": "Wayne" + }, + { + "zip_code": 38453, + "latitude": 35.092452, + "longitude": -86.716719, + "city": "Dellrose", + "state": "TN", + "county": "Lincoln" + }, + { + "zip_code": 38454, + "latitude": 35.74803, + "longitude": -87.357729, + "city": "Duck River", + "state": "TN", + "county": "Hickman" + }, + { + "zip_code": 38455, + "latitude": 35.05392, + "longitude": -86.895305, + "city": "Elkton", + "state": "TN", + "county": "Giles" + }, + { + "zip_code": 38456, + "latitude": 35.339549, + "longitude": -87.307286, + "city": "Ethridge", + "state": "TN", + "county": "Lawrence" + }, + { + "zip_code": 38457, + "latitude": 35.035472, + "longitude": -87.291424, + "city": "Five Points", + "state": "TN", + "county": "Lawrence" + }, + { + "zip_code": 38459, + "latitude": 35.183444, + "longitude": -86.850038, + "city": "Frankewing", + "state": "TN", + "county": "Giles" + }, + { + "zip_code": 38460, + "latitude": 35.077182, + "longitude": -87.143713, + "city": "Goodspring", + "state": "TN", + "county": "Giles" + }, + { + "zip_code": 38461, + "latitude": 35.627022, + "longitude": -87.29402, + "city": "Hampshire", + "state": "TN", + "county": "Maury" + }, + { + "zip_code": 38462, + "latitude": 35.526554, + "longitude": -87.489057, + "city": "Hohenwald", + "state": "TN", + "county": "Lewis" + }, + { + "zip_code": 38463, + "latitude": 35.07132, + "longitude": -87.549745, + "city": "Iron City", + "state": "TN", + "county": "Lawrence" + }, + { + "zip_code": 38464, + "latitude": 35.235493, + "longitude": -87.397143, + "city": "Lawrenceburg", + "state": "TN", + "county": "Lawrence" + }, + { + "zip_code": 38468, + "latitude": 35.149182, + "longitude": -87.295169, + "city": "Leoma", + "state": "TN", + "county": "Lawrence" + }, + { + "zip_code": 38469, + "latitude": 35.078858, + "longitude": -87.433561, + "city": "Loretto", + "state": "TN", + "county": "Lawrence" + }, + { + "zip_code": 38471, + "latitude": 35.083472, + "longitude": -87.901086, + "city": "Lutts", + "state": "TN", + "county": "Wayne" + }, + { + "zip_code": 38472, + "latitude": 35.254073, + "longitude": -87.023994, + "city": "Lynnville", + "state": "TN", + "county": "Giles" + }, + { + "zip_code": 38473, + "latitude": 35.036274, + "longitude": -87.150744, + "city": "Minor Hill", + "state": "TN", + "county": "Giles" + }, + { + "zip_code": 38474, + "latitude": 35.541801, + "longitude": -87.209525, + "city": "Mount Pleasant", + "state": "TN", + "county": "Maury" + }, + { + "zip_code": 38475, + "latitude": 35.264369, + "longitude": -88.053366, + "city": "Olivehill", + "state": "TN", + "county": "Hardin" + }, + { + "zip_code": 38476, + "latitude": 35.803869, + "longitude": -87.25914, + "city": "Primm Springs", + "state": "TN", + "county": "Hickman" + }, + { + "zip_code": 38477, + "latitude": 35.093795, + "longitude": -87.000953, + "city": "Prospect", + "state": "TN", + "county": "Giles" + }, + { + "zip_code": 38478, + "latitude": 35.217373, + "longitude": -87.015664, + "city": "Pulaski", + "state": "TN", + "county": "Giles" + }, + { + "zip_code": 38481, + "latitude": 35.034741, + "longitude": -87.49336, + "city": "Saint Joseph", + "state": "TN", + "county": "Lawrence" + }, + { + "zip_code": 38482, + "latitude": 35.772652, + "longitude": -87.146428, + "city": "Santa Fe", + "state": "TN", + "county": "Maury" + }, + { + "zip_code": 38483, + "latitude": 35.239335, + "longitude": -87.399717, + "city": "Summertown", + "state": "TN", + "county": "Lawrence" + }, + { + "zip_code": 38485, + "latitude": 35.345882, + "longitude": -87.775459, + "city": "Waynesboro", + "state": "TN", + "county": "Wayne" + }, + { + "zip_code": 38486, + "latitude": 35.170415, + "longitude": -87.402375, + "city": "Westpoint", + "state": "TN", + "county": "Lawrence" + }, + { + "zip_code": 38487, + "latitude": 35.722628, + "longitude": -87.212698, + "city": "Williamsport", + "state": "TN", + "county": "Maury" + }, + { + "zip_code": 38488, + "latitude": 35.052581, + "longitude": -86.717885, + "city": "Taft", + "state": "TN", + "county": "Lincoln" + }, + { + "zip_code": 38501, + "latitude": 36.217846, + "longitude": -85.542327, + "city": "Cookeville", + "state": "TN", + "county": "Putnam" + }, + { + "zip_code": 38502, + "latitude": 36.141824, + "longitude": -85.454779, + "city": "Cookeville", + "state": "TN", + "county": "Putnam" + }, + { + "zip_code": 38503, + "latitude": 36.141824, + "longitude": -85.454779, + "city": "Cookeville", + "state": "TN", + "county": "Putnam" + }, + { + "zip_code": 38504, + "latitude": 36.381838, + "longitude": -84.775579, + "city": "Allardt", + "state": "TN", + "county": "Fentress" + }, + { + "zip_code": 38505, + "latitude": 36.141824, + "longitude": -85.454779, + "city": "Cookeville", + "state": "TN", + "county": "Putnam" + }, + { + "zip_code": 38506, + "latitude": 36.182723, + "longitude": -85.469451, + "city": "Cookeville", + "state": "TN", + "county": "Putnam" + }, + { + "zip_code": 38541, + "latitude": 36.481086, + "longitude": -85.346687, + "city": "Allons", + "state": "TN", + "county": "Overton" + }, + { + "zip_code": 38542, + "latitude": 36.323952, + "longitude": -85.203098, + "city": "Allred", + "state": "TN", + "county": "Overton" + }, + { + "zip_code": 38543, + "latitude": 36.364735, + "longitude": -85.189932, + "city": "Alpine", + "state": "TN", + "county": "Overton" + }, + { + "zip_code": 38544, + "latitude": 36.118922, + "longitude": -85.663021, + "city": "Baxter", + "state": "TN", + "county": "Putnam" + }, + { + "zip_code": 38545, + "latitude": 36.207497, + "longitude": -85.664611, + "city": "Bloomington Springs", + "state": "TN", + "county": "Putnam" + }, + { + "zip_code": 38547, + "latitude": 36.166413, + "longitude": -86.00636, + "city": "Brush Creek", + "state": "TN", + "county": "Smith" + }, + { + "zip_code": 38548, + "latitude": 36.163921, + "longitude": -85.533995, + "city": "Buffalo Valley", + "state": "TN", + "county": "Putnam" + }, + { + "zip_code": 38549, + "latitude": 36.552982, + "longitude": -85.162523, + "city": "Byrdstown", + "state": "TN", + "county": "Pickett" + }, + { + "zip_code": 38550, + "latitude": 35.773417, + "longitude": -85.619169, + "city": "Campaign", + "state": "TN", + "county": "Warren" + }, + { + "zip_code": 38551, + "latitude": 36.547777, + "longitude": -85.512924, + "city": "Celina", + "state": "TN", + "county": "Clay" + }, + { + "zip_code": 38552, + "latitude": 36.212422, + "longitude": -85.825952, + "city": "Chestnut Mound", + "state": "TN", + "county": "Smith" + }, + { + "zip_code": 38553, + "latitude": 36.197616, + "longitude": -85.011311, + "city": "Clarkrange", + "state": "TN", + "county": "Fentress" + }, + { + "zip_code": 38554, + "latitude": 36.244711, + "longitude": -85.160197, + "city": "Crawford", + "state": "TN", + "county": "Overton" + }, + { + "zip_code": 38555, + "latitude": 35.962348, + "longitude": -85.051431, + "city": "Crossville", + "state": "TN", + "county": "Cumberland" + }, + { + "zip_code": 38556, + "latitude": 36.384844, + "longitude": -84.935655, + "city": "Jamestown", + "state": "TN", + "county": "Fentress" + }, + { + "zip_code": 38557, + "latitude": 35.988457, + "longitude": -85.012389, + "city": "Crossville", + "state": "TN", + "county": "Cumberland" + }, + { + "zip_code": 38558, + "latitude": 35.960491, + "longitude": -85.014224, + "city": "Crossville", + "state": "TN", + "county": "Cumberland" + }, + { + "zip_code": 38559, + "latitude": 35.835572, + "longitude": -85.519057, + "city": "Doyle", + "state": "TN", + "county": "White" + }, + { + "zip_code": 38560, + "latitude": 36.218759, + "longitude": -85.862182, + "city": "Elmwood", + "state": "TN", + "county": "Smith" + }, + { + "zip_code": 38562, + "latitude": 36.369292, + "longitude": -85.681124, + "city": "Gainesboro", + "state": "TN", + "county": "Jackson" + }, + { + "zip_code": 38563, + "latitude": 36.209988, + "longitude": -85.982033, + "city": "Gordonsville", + "state": "TN", + "county": "Smith" + }, + { + "zip_code": 38564, + "latitude": 36.278335, + "longitude": -85.748452, + "city": "Granville", + "state": "TN", + "county": "Jackson" + }, + { + "zip_code": 38565, + "latitude": 36.259849, + "longitude": -85.00154, + "city": "Grimsley", + "state": "TN", + "county": "Fentress" + }, + { + "zip_code": 38567, + "latitude": 36.138347, + "longitude": -85.914313, + "city": "Hickman", + "state": "TN", + "county": "Smith" + }, + { + "zip_code": 38568, + "latitude": 36.422652, + "longitude": -85.446431, + "city": "Hilham", + "state": "TN", + "county": "Overton" + }, + { + "zip_code": 38569, + "latitude": 36.124389, + "longitude": -85.859146, + "city": "Lancaster", + "state": "TN", + "county": "Smith" + }, + { + "zip_code": 38570, + "latitude": 36.38519, + "longitude": -85.329392, + "city": "Livingston", + "state": "TN", + "county": "Overton" + }, + { + "zip_code": 38571, + "latitude": "", + "longitude": "", + "city": "Crossville", + "state": "TN", + "county": "Cumberland" + }, + { + "zip_code": 38572, + "latitude": "", + "longitude": "", + "city": "Crossville", + "state": "TN", + "county": "Cumberland" + }, + { + "zip_code": 38573, + "latitude": 36.452484, + "longitude": -85.229094, + "city": "Monroe", + "state": "TN", + "county": "Overton" + }, + { + "zip_code": 38574, + "latitude": 36.117716, + "longitude": -85.234938, + "city": "Monterey", + "state": "TN", + "county": "Putnam" + }, + { + "zip_code": 38575, + "latitude": 36.552546, + "longitude": -85.631181, + "city": "Moss", + "state": "TN", + "county": "Clay" + }, + { + "zip_code": 38577, + "latitude": 36.532956, + "longitude": -84.951245, + "city": "Pall Mall", + "state": "TN", + "county": "Fentress" + }, + { + "zip_code": 38578, + "latitude": 36.007405, + "longitude": -85.162272, + "city": "Pleasant Hill", + "state": "TN", + "county": "Cumberland" + }, + { + "zip_code": 38579, + "latitude": 35.836776, + "longitude": -85.546347, + "city": "Quebeck", + "state": "TN", + "county": "White" + }, + { + "zip_code": 38580, + "latitude": 36.281225, + "longitude": -85.304796, + "city": "Rickman", + "state": "TN", + "county": "Overton" + }, + { + "zip_code": 38581, + "latitude": 35.766758, + "longitude": -85.678847, + "city": "Rock Island", + "state": "TN", + "county": "Warren" + }, + { + "zip_code": 38582, + "latitude": 36.107377, + "longitude": -85.729463, + "city": "Silver Point", + "state": "TN", + "county": "Putnam" + }, + { + "zip_code": 38583, + "latitude": 35.943857, + "longitude": -85.439246, + "city": "Sparta", + "state": "TN", + "county": "White" + }, + { + "zip_code": 38585, + "latitude": 35.677816, + "longitude": -85.434355, + "city": "Spencer", + "state": "TN", + "county": "Van Buren" + }, + { + "zip_code": 38587, + "latitude": 35.866476, + "longitude": -85.609235, + "city": "Walling", + "state": "TN", + "county": "White" + }, + { + "zip_code": 38588, + "latitude": 36.433214, + "longitude": -85.707955, + "city": "Whitleyville", + "state": "TN", + "county": "Jackson" + }, + { + "zip_code": 38589, + "latitude": 36.282181, + "longitude": -85.091312, + "city": "Wilder", + "state": "TN", + "county": "Fentress" + }, + { + "zip_code": 38601, + "latitude": 34.471941, + "longitude": -89.447507, + "city": "Abbeville", + "state": "MS", + "county": "Lafayette" + }, + { + "zip_code": 38602, + "latitude": 34.686272, + "longitude": -90.106756, + "city": "Arkabutla", + "state": "MS", + "county": "Tate" + }, + { + "zip_code": 38603, + "latitude": 34.741457, + "longitude": -89.163282, + "city": "Ashland", + "state": "MS", + "county": "Benton" + }, + { + "zip_code": 38606, + "latitude": 34.343102, + "longitude": -89.956497, + "city": "Batesville", + "state": "MS", + "county": "Panola" + }, + { + "zip_code": 38609, + "latitude": 34.235111, + "longitude": -90.29272, + "city": "Belen", + "state": "MS", + "county": "Quitman" + }, + { + "zip_code": 38610, + "latitude": 34.667999, + "longitude": -88.99877, + "city": "Blue Mountain", + "state": "MS", + "county": "Tippah" + }, + { + "zip_code": 38611, + "latitude": 34.848108, + "longitude": -89.617691, + "city": "Byhalia", + "state": "MS", + "county": "Marshall" + }, + { + "zip_code": 38614, + "latitude": 34.256003, + "longitude": -90.634809, + "city": "Clarksdale", + "state": "MS", + "county": "Coahoma" + }, + { + "zip_code": 38617, + "latitude": 34.308025, + "longitude": -90.519949, + "city": "Coahoma", + "state": "MS", + "county": "Coahoma" + }, + { + "zip_code": 38618, + "latitude": 34.69018, + "longitude": -89.962513, + "city": "Coldwater", + "state": "MS", + "county": "Tate" + }, + { + "zip_code": 38619, + "latitude": 34.474028, + "longitude": -89.954427, + "city": "Como", + "state": "MS", + "county": "Panola" + }, + { + "zip_code": 38620, + "latitude": 34.25082, + "longitude": -89.962994, + "city": "Courtland", + "state": "MS", + "county": "Panola" + }, + { + "zip_code": 38621, + "latitude": 34.447051, + "longitude": -90.101204, + "city": "Crenshaw", + "state": "MS", + "county": "Panola" + }, + { + "zip_code": 38622, + "latitude": 34.173057, + "longitude": -90.136429, + "city": "Crowder", + "state": "MS", + "county": "Quitman" + }, + { + "zip_code": 38623, + "latitude": 34.291611, + "longitude": -90.292717, + "city": "Darling", + "state": "MS", + "county": "Quitman" + }, + { + "zip_code": 38625, + "latitude": 34.641739, + "longitude": -88.827123, + "city": "Dumas", + "state": "MS", + "county": "Tippah" + }, + { + "zip_code": 38626, + "latitude": 34.535704, + "longitude": -90.369304, + "city": "Dundee", + "state": "MS", + "county": "Tunica" + }, + { + "zip_code": 38627, + "latitude": 34.432943, + "longitude": -89.05727, + "city": "Etta", + "state": "MS", + "county": "Union" + }, + { + "zip_code": 38628, + "latitude": 34.291611, + "longitude": -90.292717, + "city": "Falcon", + "state": "MS", + "county": "Quitman" + }, + { + "zip_code": 38629, + "latitude": 34.850879, + "longitude": -88.933747, + "city": "Falkner", + "state": "MS", + "county": "Tippah" + }, + { + "zip_code": 38630, + "latitude": 34.242356, + "longitude": -90.648864, + "city": "Farrell", + "state": "MS", + "county": "Coahoma" + }, + { + "zip_code": 38631, + "latitude": 34.37406, + "longitude": -90.606054, + "city": "Friars Point", + "state": "MS", + "county": "Coahoma" + }, + { + "zip_code": 38632, + "latitude": 34.80684, + "longitude": -89.994591, + "city": "Hernando", + "state": "MS", + "county": "De Soto" + }, + { + "zip_code": 38633, + "latitude": 34.623448, + "longitude": -89.180301, + "city": "Hickory Flat", + "state": "MS", + "county": "Benton" + }, + { + "zip_code": 38634, + "latitude": 34.74504, + "longitude": -89.484963, + "city": "Holly Springs", + "state": "MS", + "county": "Marshall" + }, + { + "zip_code": 38635, + "latitude": 34.774733, + "longitude": -89.513878, + "city": "Holly Springs", + "state": "MS", + "county": "Marshall" + }, + { + "zip_code": 38637, + "latitude": 34.950609, + "longitude": -90.03355, + "city": "Horn Lake", + "state": "MS", + "county": "De Soto" + }, + { + "zip_code": 38638, + "latitude": 34.695853, + "longitude": -89.828798, + "city": "Independence", + "state": "MS", + "county": "Tate" + }, + { + "zip_code": 38639, + "latitude": 34.30373, + "longitude": -90.429351, + "city": "Jonestown", + "state": "MS", + "county": "Coahoma" + }, + { + "zip_code": 38641, + "latitude": 34.911835, + "longitude": -90.14603, + "city": "Lake Cormorant", + "state": "MS", + "county": "De Soto" + }, + { + "zip_code": 38642, + "latitude": 34.930329, + "longitude": -89.399923, + "city": "Lamar", + "state": "MS", + "county": "Marshall" + }, + { + "zip_code": 38643, + "latitude": 34.189235, + "longitude": -90.215916, + "city": "Lambert", + "state": "MS", + "county": "Quitman" + }, + { + "zip_code": 38644, + "latitude": 34.461795, + "longitude": -90.498088, + "city": "Lula", + "state": "MS", + "county": "Coahoma" + }, + { + "zip_code": 38645, + "latitude": 34.236389, + "longitude": -90.47941, + "city": "Lyon", + "state": "MS", + "county": "Coahoma" + }, + { + "zip_code": 38646, + "latitude": 34.314968, + "longitude": -90.214465, + "city": "Marks", + "state": "MS", + "county": "Quitman" + }, + { + "zip_code": 38647, + "latitude": 34.788948, + "longitude": -89.185048, + "city": "Michigan City", + "state": "MS", + "county": "Benton" + }, + { + "zip_code": 38649, + "latitude": 34.953584, + "longitude": -89.523027, + "city": "Mount Pleasant", + "state": "MS", + "county": "Marshall" + }, + { + "zip_code": 38650, + "latitude": 34.512992, + "longitude": -89.133523, + "city": "Myrtle", + "state": "MS", + "county": "Union" + }, + { + "zip_code": 38651, + "latitude": 34.875133, + "longitude": -89.985853, + "city": "Nesbit", + "state": "MS", + "county": "De Soto" + }, + { + "zip_code": 38652, + "latitude": 34.488692, + "longitude": -88.963649, + "city": "New Albany", + "state": "MS", + "county": "Union" + }, + { + "zip_code": 38654, + "latitude": 34.921172, + "longitude": -89.869062, + "city": "Olive Branch", + "state": "MS", + "county": "De Soto" + }, + { + "zip_code": 38655, + "latitude": 34.330814, + "longitude": -89.483519, + "city": "Oxford", + "state": "MS", + "county": "Lafayette" + }, + { + "zip_code": 38658, + "latitude": 34.196241, + "longitude": -89.888559, + "city": "Pope", + "state": "MS", + "county": "Panola" + }, + { + "zip_code": 38659, + "latitude": 34.62921, + "longitude": -89.366355, + "city": "Potts Camp", + "state": "MS", + "county": "Marshall" + }, + { + "zip_code": 38661, + "latitude": 34.893744, + "longitude": -89.564928, + "city": "Red Banks", + "state": "MS", + "county": "Marshall" + }, + { + "zip_code": 38663, + "latitude": 34.722961, + "longitude": -88.903624, + "city": "Ripley", + "state": "MS", + "county": "Tippah" + }, + { + "zip_code": 38664, + "latitude": 34.780008, + "longitude": -90.332582, + "city": "Robinsonville", + "state": "MS", + "county": "Tunica" + }, + { + "zip_code": 38665, + "latitude": 34.414146, + "longitude": -90.039377, + "city": "Sarah", + "state": "MS", + "county": "Panola" + }, + { + "zip_code": 38666, + "latitude": 34.358883, + "longitude": -89.930441, + "city": "Sardis", + "state": "MS", + "county": "Panola" + }, + { + "zip_code": 38668, + "latitude": 34.621336, + "longitude": -89.930083, + "city": "Senatobia", + "state": "MS", + "county": "Tate" + }, + { + "zip_code": 38669, + "latitude": 34.195345, + "longitude": -90.733538, + "city": "Sherard", + "state": "MS", + "county": "Coahoma" + }, + { + "zip_code": 38670, + "latitude": 34.561069, + "longitude": -90.330278, + "city": "Sledge", + "state": "MS", + "county": "Tunica" + }, + { + "zip_code": 38671, + "latitude": 34.956633, + "longitude": -89.99624, + "city": "Southaven", + "state": "MS", + "county": "De Soto" + }, + { + "zip_code": 38672, + "latitude": 34.947407, + "longitude": -89.925792, + "city": "Southaven", + "state": "MS", + "county": "De Soto" + }, + { + "zip_code": 38673, + "latitude": 34.291869, + "longitude": -89.611016, + "city": "Taylor", + "state": "MS", + "county": "Lafayette" + }, + { + "zip_code": 38674, + "latitude": 34.877104, + "longitude": -88.900175, + "city": "Tiplersville", + "state": "MS", + "county": "Tippah" + }, + { + "zip_code": 38675, + "latitude": 34.358201, + "longitude": -89.483865, + "city": "Tula", + "state": "MS", + "county": "Lafayette" + }, + { + "zip_code": 38676, + "latitude": 34.692892, + "longitude": -90.338981, + "city": "Tunica", + "state": "MS", + "county": "Tunica" + }, + { + "zip_code": 38677, + "latitude": 34.33962, + "longitude": -89.573605, + "city": "University", + "state": "MS", + "county": "Lafayette" + }, + { + "zip_code": 38679, + "latitude": 34.870804, + "longitude": -89.64082, + "city": "Victoria", + "state": "MS", + "county": "Marshall" + }, + { + "zip_code": 38680, + "latitude": 34.960712, + "longitude": -90.113913, + "city": "Walls", + "state": "MS", + "county": "De Soto" + }, + { + "zip_code": 38683, + "latitude": 34.89462, + "longitude": -88.885227, + "city": "Walnut", + "state": "MS", + "county": "Tippah" + }, + { + "zip_code": 38685, + "latitude": 34.547621, + "longitude": -89.612918, + "city": "Waterford", + "state": "MS", + "county": "Lafayette" + }, + { + "zip_code": 38686, + "latitude": 34.875277, + "longitude": -89.991991, + "city": "Walls", + "state": "MS", + "county": "De Soto" + }, + { + "zip_code": 38701, + "latitude": 33.314539, + "longitude": -91.02297, + "city": "Greenville", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38702, + "latitude": 33.425792, + "longitude": -90.994597, + "city": "Greenville", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38703, + "latitude": 33.414186, + "longitude": -91.009518, + "city": "Greenville", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38704, + "latitude": 33.253401, + "longitude": -90.918503, + "city": "Greenville", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38720, + "latitude": 34.074216, + "longitude": -90.75974, + "city": "Alligator", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38721, + "latitude": 32.973917, + "longitude": -90.831601, + "city": "Anguilla", + "state": "MS", + "county": "Sharkey" + }, + { + "zip_code": 38722, + "latitude": 33.26597, + "longitude": -90.844813, + "city": "Arcola", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38723, + "latitude": 33.218997, + "longitude": -91.047905, + "city": "Avon", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38725, + "latitude": 33.627816, + "longitude": -90.994878, + "city": "Benoit", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38726, + "latitude": 33.75291, + "longitude": -90.958277, + "city": "Beulah", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38730, + "latitude": 33.741709, + "longitude": -90.773978, + "city": "Boyle", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38731, + "latitude": 33.085379, + "longitude": -91.088255, + "city": "Chatham", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38732, + "latitude": 33.847591, + "longitude": -90.84313, + "city": "Cleveland", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38733, + "latitude": 33.624024, + "longitude": -90.819547, + "city": "Cleveland", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38736, + "latitude": 33.690173, + "longitude": -90.549626, + "city": "Doddsville", + "state": "MS", + "county": "Sunflower" + }, + { + "zip_code": 38737, + "latitude": 33.685766, + "longitude": -90.607299, + "city": "Drew", + "state": "MS", + "county": "Sunflower" + }, + { + "zip_code": 38738, + "latitude": 33.628715, + "longitude": -90.607457, + "city": "Parchman", + "state": "MS", + "county": "Sunflower" + }, + { + "zip_code": 38739, + "latitude": 34.060359, + "longitude": -90.501063, + "city": "Dublin", + "state": "MS", + "county": "Coahoma" + }, + { + "zip_code": 38740, + "latitude": 33.94809, + "longitude": -90.770386, + "city": "Duncan", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38744, + "latitude": 33.045837, + "longitude": -91.019421, + "city": "Glen Allan", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38745, + "latitude": 32.711257, + "longitude": -90.952716, + "city": "Grace", + "state": "MS", + "county": "Issaquena" + }, + { + "zip_code": 38746, + "latitude": 34.000588, + "longitude": -90.919616, + "city": "Gunnison", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38748, + "latitude": 33.230409, + "longitude": -90.910451, + "city": "Hollandale", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38749, + "latitude": 33.628715, + "longitude": -90.607457, + "city": "Holly Ridge", + "state": "MS", + "county": "Sunflower" + }, + { + "zip_code": 38751, + "latitude": 33.443446, + "longitude": -90.608662, + "city": "Indianola", + "state": "MS", + "county": "Sunflower" + }, + { + "zip_code": 38753, + "latitude": 33.350655, + "longitude": -90.583441, + "city": "Inverness", + "state": "MS", + "county": "Sunflower" + }, + { + "zip_code": 38754, + "latitude": 33.263048, + "longitude": -90.59677, + "city": "Isola", + "state": "MS", + "county": "Humphreys" + }, + { + "zip_code": 38756, + "latitude": 33.398505, + "longitude": -90.88387, + "city": "Leland", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38758, + "latitude": 34.076795, + "longitude": -90.507012, + "city": "Mattson", + "state": "MS", + "county": "Coahoma" + }, + { + "zip_code": 38759, + "latitude": 33.818742, + "longitude": -90.840631, + "city": "Merigold", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38760, + "latitude": 33.454614, + "longitude": -90.994264, + "city": "Metcalfe", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38761, + "latitude": 33.443386, + "longitude": -90.506817, + "city": "Moorhead", + "state": "MS", + "county": "Sunflower" + }, + { + "zip_code": 38762, + "latitude": 33.767126, + "longitude": -90.846978, + "city": "Mound Bayou", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38763, + "latitude": 32.879795, + "longitude": -90.81096, + "city": "Nitta Yuma", + "state": "MS", + "county": "Sharkey" + }, + { + "zip_code": 38764, + "latitude": 33.725717, + "longitude": -90.92728, + "city": "Pace", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38765, + "latitude": 32.879795, + "longitude": -90.81096, + "city": "Panther Burn", + "state": "MS", + "county": "Sharkey" + }, + { + "zip_code": 38767, + "latitude": 34.1412, + "longitude": -90.7865, + "city": "Rena Lara", + "state": "MS", + "county": "Coahoma" + }, + { + "zip_code": 38768, + "latitude": 33.958959, + "longitude": -90.477605, + "city": "Rome", + "state": "MS", + "county": "Sunflower" + }, + { + "zip_code": 38769, + "latitude": 33.841892, + "longitude": -90.882598, + "city": "Rosedale", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38771, + "latitude": 33.66479, + "longitude": -90.555537, + "city": "Ruleville", + "state": "MS", + "county": "Sunflower" + }, + { + "zip_code": 38772, + "latitude": 33.562871, + "longitude": -91.039093, + "city": "Scott", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38773, + "latitude": 33.608538, + "longitude": -90.794341, + "city": "Shaw", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38774, + "latitude": 33.957757, + "longitude": -90.74504, + "city": "Shelby", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38776, + "latitude": 33.409614, + "longitude": -90.910404, + "city": "Stoneville", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38778, + "latitude": 33.556746, + "longitude": -90.545111, + "city": "Sunflower", + "state": "MS", + "county": "Sunflower" + }, + { + "zip_code": 38780, + "latitude": 33.272695, + "longitude": -90.995399, + "city": "Wayside", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38781, + "latitude": 33.887774, + "longitude": -90.737149, + "city": "Winstonville", + "state": "MS", + "county": "Bolivar" + }, + { + "zip_code": 38782, + "latitude": 33.269118, + "longitude": -90.957291, + "city": "Winterville", + "state": "MS", + "county": "Washington" + }, + { + "zip_code": 38801, + "latitude": 34.291889, + "longitude": -88.683828, + "city": "Tupelo", + "state": "MS", + "county": "Lee" + }, + { + "zip_code": 38802, + "latitude": 34.234527, + "longitude": -88.767127, + "city": "Tupelo", + "state": "MS", + "county": "Lee" + }, + { + "zip_code": 38803, + "latitude": 34.187638, + "longitude": -88.77852, + "city": "Tupelo", + "state": "MS", + "county": "Lee" + }, + { + "zip_code": 38804, + "latitude": 34.3371, + "longitude": -88.684672, + "city": "Tupelo", + "state": "MS", + "county": "Lee" + }, + { + "zip_code": 38820, + "latitude": 34.171543, + "longitude": -89.032791, + "city": "Algoma", + "state": "MS", + "county": "Pontotoc" + }, + { + "zip_code": 38821, + "latitude": 33.942639, + "longitude": -88.411284, + "city": "Amory", + "state": "MS", + "county": "Monroe" + }, + { + "zip_code": 38824, + "latitude": 34.314813, + "longitude": -88.63922, + "city": "Baldwyn", + "state": "MS", + "county": "Lee" + }, + { + "zip_code": 38825, + "latitude": 33.869763, + "longitude": -88.462173, + "city": "Becker", + "state": "MS", + "county": "Monroe" + }, + { + "zip_code": 38826, + "latitude": 34.269844, + "longitude": -88.745933, + "city": "Belden", + "state": "MS", + "county": "Lee" + }, + { + "zip_code": 38827, + "latitude": 34.550663, + "longitude": -88.22674, + "city": "Belmont", + "state": "MS", + "county": "Tishomingo" + }, + { + "zip_code": 38828, + "latitude": 34.464253, + "longitude": -88.958608, + "city": "Blue Springs", + "state": "MS", + "county": "Union" + }, + { + "zip_code": 38829, + "latitude": 34.632922, + "longitude": -88.533107, + "city": "Booneville", + "state": "MS", + "county": "Prentiss" + }, + { + "zip_code": 38833, + "latitude": 34.855985, + "longitude": -88.286923, + "city": "Burnsville", + "state": "MS", + "county": "Tishomingo" + }, + { + "zip_code": 38834, + "latitude": 34.87589, + "longitude": -88.591575, + "city": "Corinth", + "state": "MS", + "county": "Alcorn" + }, + { + "zip_code": 38835, + "latitude": 34.920451, + "longitude": -88.521772, + "city": "Corinth", + "state": "MS", + "county": "Alcorn" + }, + { + "zip_code": 38838, + "latitude": 34.584628, + "longitude": -88.248391, + "city": "Dennis", + "state": "MS", + "county": "Tishomingo" + }, + { + "zip_code": 38839, + "latitude": 33.856165, + "longitude": -89.303214, + "city": "Derma", + "state": "MS", + "county": "Calhoun" + }, + { + "zip_code": 38841, + "latitude": 34.336606, + "longitude": -89.010873, + "city": "Ecru", + "state": "MS", + "county": "Pontotoc" + }, + { + "zip_code": 38843, + "latitude": 34.276489, + "longitude": -88.355013, + "city": "Fulton", + "state": "MS", + "county": "Itawamba" + }, + { + "zip_code": 38844, + "latitude": 33.84026, + "longitude": -88.2635, + "city": "Gattman", + "state": "MS", + "county": "Monroe" + }, + { + "zip_code": 38846, + "latitude": 34.868523, + "longitude": -88.41982, + "city": "Glen", + "state": "MS", + "county": "Alcorn" + }, + { + "zip_code": 38847, + "latitude": 34.346321, + "longitude": -88.246027, + "city": "Golden", + "state": "MS", + "county": "Itawamba" + }, + { + "zip_code": 38848, + "latitude": 33.940078, + "longitude": -88.320711, + "city": "Greenwood Springs", + "state": "MS", + "county": "Monroe" + }, + { + "zip_code": 38849, + "latitude": 34.421084, + "longitude": -88.665975, + "city": "Guntown", + "state": "MS", + "county": "Lee" + }, + { + "zip_code": 38850, + "latitude": 34.013571, + "longitude": -88.996107, + "city": "Houlka", + "state": "MS", + "county": "Chickasaw" + }, + { + "zip_code": 38851, + "latitude": 33.911901, + "longitude": -88.931148, + "city": "Houston", + "state": "MS", + "county": "Chickasaw" + }, + { + "zip_code": 38852, + "latitude": 34.81583, + "longitude": -88.2318, + "city": "Iuka", + "state": "MS", + "county": "Tishomingo" + }, + { + "zip_code": 38854, + "latitude": 33.906827, + "longitude": -88.955351, + "city": "Mc Condy", + "state": "MS", + "county": "Chickasaw" + }, + { + "zip_code": 38855, + "latitude": 34.324376, + "longitude": -88.393184, + "city": "Mantachie", + "state": "MS", + "county": "Itawamba" + }, + { + "zip_code": 38856, + "latitude": 34.592786, + "longitude": -88.510356, + "city": "Marietta", + "state": "MS", + "county": "Prentiss" + }, + { + "zip_code": 38857, + "latitude": 34.275006, + "longitude": -88.592851, + "city": "Mooreville", + "state": "MS", + "county": "Lee" + }, + { + "zip_code": 38858, + "latitude": 34.161842, + "longitude": -88.472146, + "city": "Nettleton", + "state": "MS", + "county": "Itawamba" + }, + { + "zip_code": 38859, + "latitude": 34.531462, + "longitude": -88.387511, + "city": "New Site", + "state": "MS", + "county": "Prentiss" + }, + { + "zip_code": 38860, + "latitude": 33.94295, + "longitude": -88.868022, + "city": "Okolona", + "state": "MS", + "county": "Chickasaw" + }, + { + "zip_code": 38862, + "latitude": 34.239541, + "longitude": -88.617454, + "city": "Plantersville", + "state": "MS", + "county": "Lee" + }, + { + "zip_code": 38863, + "latitude": 34.227246, + "longitude": -89.040537, + "city": "Pontotoc", + "state": "MS", + "county": "Pontotoc" + }, + { + "zip_code": 38864, + "latitude": 34.161748, + "longitude": -89.179467, + "city": "Randolph", + "state": "MS", + "county": "Pontotoc" + }, + { + "zip_code": 38865, + "latitude": 34.818882, + "longitude": -88.56325, + "city": "Rienzi", + "state": "MS", + "county": "Alcorn" + }, + { + "zip_code": 38866, + "latitude": 34.304376, + "longitude": -88.667209, + "city": "Saltillo", + "state": "MS", + "county": "Lee" + }, + { + "zip_code": 38868, + "latitude": 34.144146, + "longitude": -88.68396, + "city": "Shannon", + "state": "MS", + "county": "Lee" + }, + { + "zip_code": 38869, + "latitude": 34.349542, + "longitude": -88.836268, + "city": "Sherman", + "state": "MS", + "county": "Pontotoc" + }, + { + "zip_code": 38870, + "latitude": 34.045269, + "longitude": -88.365609, + "city": "Smithville", + "state": "MS", + "county": "Monroe" + }, + { + "zip_code": 38871, + "latitude": 34.317365, + "longitude": -89.159059, + "city": "Thaxton", + "state": "MS", + "county": "Pontotoc" + }, + { + "zip_code": 38873, + "latitude": 34.671205, + "longitude": -88.238068, + "city": "Tishomingo", + "state": "MS", + "county": "Tishomingo" + }, + { + "zip_code": 38874, + "latitude": 34.226527, + "longitude": -89.251922, + "city": "Toccopola", + "state": "MS", + "county": "Lafayette" + }, + { + "zip_code": 38875, + "latitude": 33.906827, + "longitude": -88.955351, + "city": "Trebloc", + "state": "MS", + "county": "Chickasaw" + }, + { + "zip_code": 38876, + "latitude": 34.235149, + "longitude": -88.333454, + "city": "Tremont", + "state": "MS", + "county": "Itawamba" + }, + { + "zip_code": 38877, + "latitude": 33.987089, + "longitude": -88.898807, + "city": "Van Vleet", + "state": "MS", + "county": "Chickasaw" + }, + { + "zip_code": 38878, + "latitude": 33.896961, + "longitude": -89.221899, + "city": "Vardaman", + "state": "MS", + "county": "Calhoun" + }, + { + "zip_code": 38879, + "latitude": 34.170691, + "longitude": -88.759077, + "city": "Verona", + "state": "MS", + "county": "Lee" + }, + { + "zip_code": 38880, + "latitude": 34.612636, + "longitude": -88.582231, + "city": "Wheeler", + "state": "MS", + "county": "Prentiss" + }, + { + "zip_code": 38901, + "latitude": 33.786016, + "longitude": -89.845462, + "city": "Grenada", + "state": "MS", + "county": "Grenada" + }, + { + "zip_code": 38902, + "latitude": 33.824113, + "longitude": -89.794687, + "city": "Grenada", + "state": "MS", + "county": "Grenada" + }, + { + "zip_code": 38912, + "latitude": 33.65497, + "longitude": -90.053958, + "city": "Avalon", + "state": "MS", + "county": "Carroll" + }, + { + "zip_code": 38913, + "latitude": 34.12266, + "longitude": -89.395779, + "city": "Banner", + "state": "MS", + "county": "Calhoun" + }, + { + "zip_code": 38914, + "latitude": 33.898213, + "longitude": -89.431864, + "city": "Big Creek", + "state": "MS", + "county": "Calhoun" + }, + { + "zip_code": 38915, + "latitude": 34.034636, + "longitude": -89.342661, + "city": "Bruce", + "state": "MS", + "county": "Calhoun" + }, + { + "zip_code": 38916, + "latitude": 33.857172, + "longitude": -89.352482, + "city": "Calhoun City", + "state": "MS", + "county": "Calhoun" + }, + { + "zip_code": 38917, + "latitude": 33.518425, + "longitude": -89.995978, + "city": "Carrollton", + "state": "MS", + "county": "Carroll" + }, + { + "zip_code": 38920, + "latitude": 33.929206, + "longitude": -90.188462, + "city": "Cascilla", + "state": "MS", + "county": "Tallahatchie" + }, + { + "zip_code": 38921, + "latitude": 34.007428, + "longitude": -90.115364, + "city": "Charleston", + "state": "MS", + "county": "Tallahatchie" + }, + { + "zip_code": 38922, + "latitude": 33.961287, + "longitude": -89.64824, + "city": "Coffeeville", + "state": "MS", + "county": "Yalobusha" + }, + { + "zip_code": 38923, + "latitude": 33.445684, + "longitude": -89.910076, + "city": "Coila", + "state": "MS", + "county": "Carroll" + }, + { + "zip_code": 38924, + "latitude": 33.255582, + "longitude": -90.183344, + "city": "Cruger", + "state": "MS", + "county": "Holmes" + }, + { + "zip_code": 38925, + "latitude": 33.563223, + "longitude": -89.641871, + "city": "Duck Hill", + "state": "MS", + "county": "Montgomery" + }, + { + "zip_code": 38926, + "latitude": 33.689476, + "longitude": -89.758302, + "city": "Elliott", + "state": "MS", + "county": "Grenada" + }, + { + "zip_code": 38927, + "latitude": 34.125054, + "longitude": -90.013183, + "city": "Enid", + "state": "MS", + "county": "Tallahatchie" + }, + { + "zip_code": 38928, + "latitude": 33.929206, + "longitude": -90.188462, + "city": "Glendora", + "state": "MS", + "county": "Tallahatchie" + }, + { + "zip_code": 38929, + "latitude": 33.78764, + "longitude": -89.647197, + "city": "Gore Springs", + "state": "MS", + "county": "Grenada" + }, + { + "zip_code": 38930, + "latitude": 33.550408, + "longitude": -90.224856, + "city": "Greenwood", + "state": "MS", + "county": "Leflore" + }, + { + "zip_code": 38935, + "latitude": 33.523355, + "longitude": -90.27757, + "city": "Greenwood", + "state": "MS", + "county": "Leflore" + }, + { + "zip_code": 38940, + "latitude": 33.742966, + "longitude": -90.000461, + "city": "Holcomb", + "state": "MS", + "county": "Grenada" + }, + { + "zip_code": 38941, + "latitude": 33.467852, + "longitude": -90.294639, + "city": "Itta Bena", + "state": "MS", + "county": "Leflore" + }, + { + "zip_code": 38943, + "latitude": 33.489564, + "longitude": -89.834467, + "city": "Mc Carley", + "state": "MS", + "county": "Carroll" + }, + { + "zip_code": 38944, + "latitude": 33.752133, + "longitude": -90.374127, + "city": "Minter City", + "state": "MS", + "county": "Leflore" + }, + { + "zip_code": 38945, + "latitude": 33.650681, + "longitude": -90.196909, + "city": "Money", + "state": "MS", + "county": "Leflore" + }, + { + "zip_code": 38946, + "latitude": 33.404573, + "longitude": -90.371993, + "city": "Morgan City", + "state": "MS", + "county": "Leflore" + }, + { + "zip_code": 38947, + "latitude": 33.512759, + "longitude": -89.920125, + "city": "North Carrollton", + "state": "MS", + "county": "Carroll" + }, + { + "zip_code": 38948, + "latitude": 34.102656, + "longitude": -89.855317, + "city": "Oakland", + "state": "MS", + "county": "Yalobusha" + }, + { + "zip_code": 38949, + "latitude": 34.199242, + "longitude": -89.381994, + "city": "Paris", + "state": "MS", + "county": "Lafayette" + }, + { + "zip_code": 38950, + "latitude": 33.733437, + "longitude": -90.237053, + "city": "Philipp", + "state": "MS", + "county": "Tallahatchie" + }, + { + "zip_code": 38951, + "latitude": 33.942942, + "longitude": -89.283006, + "city": "Pittsboro", + "state": "MS", + "county": "Calhoun" + }, + { + "zip_code": 38952, + "latitude": 33.627351, + "longitude": -90.301026, + "city": "Schlater", + "state": "MS", + "county": "Leflore" + }, + { + "zip_code": 38953, + "latitude": 34.029737, + "longitude": -89.719526, + "city": "Scobey", + "state": "MS", + "county": "Yalobusha" + }, + { + "zip_code": 38954, + "latitude": 33.445684, + "longitude": -89.910076, + "city": "Sidon", + "state": "MS", + "county": "Carroll" + }, + { + "zip_code": 38955, + "latitude": 33.743871, + "longitude": -89.375281, + "city": "Slate Spring", + "state": "MS", + "county": "Calhoun" + }, + { + "zip_code": 38957, + "latitude": 33.983323, + "longitude": -90.389521, + "city": "Sumner", + "state": "MS", + "county": "Tallahatchie" + }, + { + "zip_code": 38958, + "latitude": 33.929206, + "longitude": -90.188462, + "city": "Swan Lake", + "state": "MS", + "county": "Tallahatchie" + }, + { + "zip_code": 38959, + "latitude": 33.380913, + "longitude": -90.349601, + "city": "Swiftown", + "state": "MS", + "county": "Leflore" + }, + { + "zip_code": 38960, + "latitude": 33.787157, + "longitude": -89.821941, + "city": "Tie Plant", + "state": "MS", + "county": "Grenada" + }, + { + "zip_code": 38961, + "latitude": 34.029737, + "longitude": -89.719526, + "city": "Tillatoba", + "state": "MS", + "county": "Yalobusha" + }, + { + "zip_code": 38962, + "latitude": 33.929206, + "longitude": -90.188462, + "city": "Tippo", + "state": "MS", + "county": "Tallahatchie" + }, + { + "zip_code": 38963, + "latitude": 34.022051, + "longitude": -90.349894, + "city": "Tutwiler", + "state": "MS", + "county": "Tallahatchie" + }, + { + "zip_code": 38964, + "latitude": 34.09953, + "longitude": -90.443027, + "city": "Vance", + "state": "MS", + "county": "Quitman" + }, + { + "zip_code": 38965, + "latitude": 34.101631, + "longitude": -89.633458, + "city": "Water Valley", + "state": "MS", + "county": "Yalobusha" + }, + { + "zip_code": 38966, + "latitude": 33.898064, + "longitude": -90.335055, + "city": "Webb", + "state": "MS", + "county": "Tallahatchie" + }, + { + "zip_code": 38967, + "latitude": 33.514926, + "longitude": -89.628584, + "city": "Winona", + "state": "MS", + "county": "Montgomery" + }, + { + "zip_code": 39038, + "latitude": 33.170596, + "longitude": -90.475786, + "city": "Belzoni", + "state": "MS", + "county": "Humphreys" + }, + { + "zip_code": 39039, + "latitude": 32.845368, + "longitude": -90.241776, + "city": "Benton", + "state": "MS", + "county": "Yazoo" + }, + { + "zip_code": 39040, + "latitude": 32.645794, + "longitude": -90.423646, + "city": "Bentonia", + "state": "MS", + "county": "Yazoo" + }, + { + "zip_code": 39041, + "latitude": 32.406956, + "longitude": -90.46141, + "city": "Bolton", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39042, + "latitude": 32.300019, + "longitude": -89.938693, + "city": "Brandon", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39043, + "latitude": 32.269041, + "longitude": -89.987491, + "city": "Brandon", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39044, + "latitude": 31.96499, + "longitude": -89.981393, + "city": "Braxton", + "state": "MS", + "county": "Simpson" + }, + { + "zip_code": 39045, + "latitude": 32.785348, + "longitude": -89.869807, + "city": "Camden", + "state": "MS", + "county": "Madison" + }, + { + "zip_code": 39046, + "latitude": 32.625298, + "longitude": -90.008601, + "city": "Canton", + "state": "MS", + "county": "Madison" + }, + { + "zip_code": 39047, + "latitude": 32.388633, + "longitude": -89.958406, + "city": "Brandon", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39051, + "latitude": 32.785217, + "longitude": -89.524057, + "city": "Carthage", + "state": "MS", + "county": "Leake" + }, + { + "zip_code": 39054, + "latitude": 32.812875, + "longitude": -90.927522, + "city": "Cary", + "state": "MS", + "county": "Sharkey" + }, + { + "zip_code": 39056, + "latitude": 32.370736, + "longitude": -90.312371, + "city": "Clinton", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39057, + "latitude": 32.477116, + "longitude": -89.26359, + "city": "Conehatta", + "state": "MS", + "county": "Newton" + }, + { + "zip_code": 39058, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Clinton", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39059, + "latitude": 31.965088, + "longitude": -90.375733, + "city": "Crystal Springs", + "state": "MS", + "county": "Copiah" + }, + { + "zip_code": 39060, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Clinton", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39061, + "latitude": 32.879795, + "longitude": -90.81096, + "city": "Delta City", + "state": "MS", + "county": "Sharkey" + }, + { + "zip_code": 39062, + "latitude": 31.986101, + "longitude": -89.919219, + "city": "D Lo", + "state": "MS", + "county": "Simpson" + }, + { + "zip_code": 39063, + "latitude": 33.071531, + "longitude": -89.899593, + "city": "Durant", + "state": "MS", + "county": "Holmes" + }, + { + "zip_code": 39066, + "latitude": 32.27307, + "longitude": -90.50985, + "city": "Edwards", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39067, + "latitude": 33.08167, + "longitude": -89.541348, + "city": "Ethel", + "state": "MS", + "county": "Attala" + }, + { + "zip_code": 39069, + "latitude": 31.731988, + "longitude": -91.056503, + "city": "Fayette", + "state": "MS", + "county": "Jefferson" + }, + { + "zip_code": 39071, + "latitude": 32.553269, + "longitude": -90.326653, + "city": "Flora", + "state": "MS", + "county": "Madison" + }, + { + "zip_code": 39072, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Pocahontas", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39073, + "latitude": 32.280972, + "longitude": -90.003854, + "city": "Florence", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39074, + "latitude": 32.399853, + "longitude": -89.505298, + "city": "Forest", + "state": "MS", + "county": "Scott" + }, + { + "zip_code": 39077, + "latitude": 31.928751, + "longitude": -90.392603, + "city": "Gallman", + "state": "MS", + "county": "Copiah" + }, + { + "zip_code": 39078, + "latitude": 31.87408, + "longitude": -90.206289, + "city": "Georgetown", + "state": "MS", + "county": "Copiah" + }, + { + "zip_code": 39079, + "latitude": 32.989226, + "longitude": -89.943323, + "city": "Goodman", + "state": "MS", + "county": "Holmes" + }, + { + "zip_code": 39080, + "latitude": 32.492533, + "longitude": -89.494585, + "city": "Harperville", + "state": "MS", + "county": "Scott" + }, + { + "zip_code": 39081, + "latitude": 31.739958, + "longitude": -91.050948, + "city": "Harriston", + "state": "MS", + "county": "Jefferson" + }, + { + "zip_code": 39082, + "latitude": 31.94173, + "longitude": -90.133459, + "city": "Harrisville", + "state": "MS", + "county": "Simpson" + }, + { + "zip_code": 39083, + "latitude": 31.868475, + "longitude": -90.429426, + "city": "Hazlehurst", + "state": "MS", + "county": "Copiah" + }, + { + "zip_code": 39086, + "latitude": 31.997408, + "longitude": -90.716602, + "city": "Hermanville", + "state": "MS", + "county": "Claiborne" + }, + { + "zip_code": 39087, + "latitude": 32.470606, + "longitude": -89.517069, + "city": "Hillsboro", + "state": "MS", + "county": "Scott" + }, + { + "zip_code": 39088, + "latitude": 32.841523, + "longitude": -90.723119, + "city": "Holly Bluff", + "state": "MS", + "county": "Yazoo" + }, + { + "zip_code": 39090, + "latitude": 33.055142, + "longitude": -89.5913, + "city": "Kosciusko", + "state": "MS", + "county": "Attala" + }, + { + "zip_code": 39092, + "latitude": 32.384482, + "longitude": -89.415089, + "city": "Lake", + "state": "MS", + "county": "Scott" + }, + { + "zip_code": 39094, + "latitude": 32.620305, + "longitude": -89.614259, + "city": "Lena", + "state": "MS", + "county": "Leake" + }, + { + "zip_code": 39095, + "latitude": 33.126082, + "longitude": -90.057116, + "city": "Lexington", + "state": "MS", + "county": "Holmes" + }, + { + "zip_code": 39096, + "latitude": 31.739958, + "longitude": -91.050948, + "city": "Lorman", + "state": "MS", + "county": "Jefferson" + }, + { + "zip_code": 39097, + "latitude": 32.980758, + "longitude": -90.592812, + "city": "Louise", + "state": "MS", + "county": "Humphreys" + }, + { + "zip_code": 39098, + "latitude": 32.566039, + "longitude": -89.713545, + "city": "Ludlow", + "state": "MS", + "county": "Scott" + }, + { + "zip_code": 39107, + "latitude": 33.082754, + "longitude": -89.641184, + "city": "Mc Adams", + "state": "MS", + "county": "Attala" + }, + { + "zip_code": 39108, + "latitude": 33.082754, + "longitude": -89.641184, + "city": "Mc Cool", + "state": "MS", + "county": "Attala" + }, + { + "zip_code": 39109, + "latitude": 32.690864, + "longitude": -89.355388, + "city": "Madden", + "state": "MS", + "county": "Leake" + }, + { + "zip_code": 39110, + "latitude": 32.553769, + "longitude": -90.138906, + "city": "Madison", + "state": "MS", + "county": "Madison" + }, + { + "zip_code": 39111, + "latitude": 31.910321, + "longitude": -89.775032, + "city": "Magee", + "state": "MS", + "county": "Simpson" + }, + { + "zip_code": 39112, + "latitude": 31.896236, + "longitude": -89.780694, + "city": "Sanatorium", + "state": "MS", + "county": "Simpson" + }, + { + "zip_code": 39113, + "latitude": 32.711257, + "longitude": -90.952716, + "city": "Mayersville", + "state": "MS", + "county": "Issaquena" + }, + { + "zip_code": 39114, + "latitude": 31.907972, + "longitude": -89.813907, + "city": "Mendenhall", + "state": "MS", + "county": "Simpson" + }, + { + "zip_code": 39115, + "latitude": 33.125998, + "longitude": -90.531759, + "city": "Midnight", + "state": "MS", + "county": "Humphreys" + }, + { + "zip_code": 39116, + "latitude": 31.852342, + "longitude": -89.50805, + "city": "Mize", + "state": "MS", + "county": "Smith" + }, + { + "zip_code": 39117, + "latitude": 32.402897, + "longitude": -89.594886, + "city": "Morton", + "state": "MS", + "county": "Scott" + }, + { + "zip_code": 39119, + "latitude": 31.717905, + "longitude": -89.623543, + "city": "Mount Olive", + "state": "MS", + "county": "Covington" + }, + { + "zip_code": 39120, + "latitude": 31.527752, + "longitude": -91.307025, + "city": "Natchez", + "state": "MS", + "county": "Adams" + }, + { + "zip_code": 39121, + "latitude": 31.470602, + "longitude": -91.404404, + "city": "Natchez", + "state": "MS", + "county": "Adams" + }, + { + "zip_code": 39122, + "latitude": 31.470602, + "longitude": -91.404404, + "city": "Natchez", + "state": "MS", + "county": "Adams" + }, + { + "zip_code": 39130, + "latitude": 32.642448, + "longitude": -90.090683, + "city": "Madison", + "state": "MS", + "county": "Madison" + }, + { + "zip_code": 39140, + "latitude": 31.71093, + "longitude": -90.038237, + "city": "Newhebron", + "state": "MS", + "county": "Lawrence" + }, + { + "zip_code": 39144, + "latitude": 32.005479, + "longitude": -90.981274, + "city": "Pattison", + "state": "MS", + "county": "Claiborne" + }, + { + "zip_code": 39145, + "latitude": 32.33857, + "longitude": -89.833228, + "city": "Pelahatchie", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39146, + "latitude": 32.950379, + "longitude": -90.02631, + "city": "Pickens", + "state": "MS", + "county": "Holmes" + }, + { + "zip_code": 39148, + "latitude": 32.319905, + "longitude": -89.992257, + "city": "Piney Woods", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39149, + "latitude": 31.837604, + "longitude": -90.016517, + "city": "Pinola", + "state": "MS", + "county": "Simpson" + }, + { + "zip_code": 39150, + "latitude": 31.916949, + "longitude": -90.975632, + "city": "Port Gibson", + "state": "MS", + "county": "Claiborne" + }, + { + "zip_code": 39151, + "latitude": 32.106173, + "longitude": -89.783633, + "city": "Puckett", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39152, + "latitude": 32.274536, + "longitude": -89.562728, + "city": "Pulaski", + "state": "MS", + "county": "Scott" + }, + { + "zip_code": 39153, + "latitude": 32.033656, + "longitude": -89.524458, + "city": "Raleigh", + "state": "MS", + "county": "Smith" + }, + { + "zip_code": 39154, + "latitude": 32.196072, + "longitude": -90.47528, + "city": "Raymond", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39156, + "latitude": 32.52792, + "longitude": -90.754175, + "city": "Redwood", + "state": "MS", + "county": "Warren" + }, + { + "zip_code": 39157, + "latitude": 32.436064, + "longitude": -90.13731, + "city": "Ridgeland", + "state": "MS", + "county": "Madison" + }, + { + "zip_code": 39158, + "latitude": 32.642448, + "longitude": -90.090683, + "city": "Ridgeland", + "state": "MS", + "county": "Madison" + }, + { + "zip_code": 39159, + "latitude": 32.859106, + "longitude": -90.897658, + "city": "Rolling Fork", + "state": "MS", + "county": "Sharkey" + }, + { + "zip_code": 39160, + "latitude": 33.082754, + "longitude": -89.641184, + "city": "Sallis", + "state": "MS", + "county": "Attala" + }, + { + "zip_code": 39161, + "latitude": 32.498294, + "longitude": -89.868563, + "city": "Sandhill", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39162, + "latitude": 32.640397, + "longitude": -90.595701, + "city": "Satartia", + "state": "MS", + "county": "Yazoo" + }, + { + "zip_code": 39163, + "latitude": 32.642448, + "longitude": -90.090683, + "city": "Sharon", + "state": "MS", + "county": "Madison" + }, + { + "zip_code": 39165, + "latitude": 31.470602, + "longitude": -91.404404, + "city": "Sibley", + "state": "MS", + "county": "Adams" + }, + { + "zip_code": 39166, + "latitude": 33.094729, + "longitude": -90.490483, + "city": "Silver City", + "state": "MS", + "county": "Humphreys" + }, + { + "zip_code": 39167, + "latitude": 32.096124, + "longitude": -90.061508, + "city": "Star", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39168, + "latitude": 31.82958, + "longitude": -89.403302, + "city": "Taylorsville", + "state": "MS", + "county": "Smith" + }, + { + "zip_code": 39169, + "latitude": 33.134414, + "longitude": -90.237888, + "city": "Tchula", + "state": "MS", + "county": "Holmes" + }, + { + "zip_code": 39170, + "latitude": 32.189393, + "longitude": -90.422369, + "city": "Terry", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39171, + "latitude": 32.753923, + "longitude": -89.52414, + "city": "Thomastown", + "state": "MS", + "county": "Leake" + }, + { + "zip_code": 39173, + "latitude": 32.762751, + "longitude": -90.36285, + "city": "Tinsley", + "state": "MS", + "county": "Yazoo" + }, + { + "zip_code": 39174, + "latitude": 32.395343, + "longitude": -90.154436, + "city": "Tougaloo", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39175, + "latitude": 32.22149, + "longitude": -90.4372, + "city": "Utica", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39176, + "latitude": 33.329023, + "longitude": -89.751563, + "city": "Vaiden", + "state": "MS", + "county": "Carroll" + }, + { + "zip_code": 39177, + "latitude": 32.711257, + "longitude": -90.952716, + "city": "Valley Park", + "state": "MS", + "county": "Issaquena" + }, + { + "zip_code": 39179, + "latitude": 32.801526, + "longitude": -90.098134, + "city": "Vaughan", + "state": "MS", + "county": "Yazoo" + }, + { + "zip_code": 39180, + "latitude": 32.339533, + "longitude": -90.834407, + "city": "Vicksburg", + "state": "MS", + "county": "Warren" + }, + { + "zip_code": 39181, + "latitude": 32.348565, + "longitude": -90.864199, + "city": "Vicksburg", + "state": "MS", + "county": "Warren" + }, + { + "zip_code": 39182, + "latitude": 32.348565, + "longitude": -90.864199, + "city": "Vicksburg", + "state": "MS", + "county": "Warren" + }, + { + "zip_code": 39183, + "latitude": 32.386006, + "longitude": -90.840021, + "city": "Vicksburg", + "state": "MS", + "county": "Warren" + }, + { + "zip_code": 39189, + "latitude": 32.62897, + "longitude": -89.406315, + "city": "Walnut Grove", + "state": "MS", + "county": "Leake" + }, + { + "zip_code": 39190, + "latitude": 31.470602, + "longitude": -91.404404, + "city": "Washington", + "state": "MS", + "county": "Adams" + }, + { + "zip_code": 39191, + "latitude": 31.847453, + "longitude": -90.377153, + "city": "Wesson", + "state": "MS", + "county": "Copiah" + }, + { + "zip_code": 39192, + "latitude": 33.198544, + "longitude": -89.853487, + "city": "West", + "state": "MS", + "county": "Holmes" + }, + { + "zip_code": 39193, + "latitude": 32.234775, + "longitude": -90.07263, + "city": "Whitfield", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39194, + "latitude": 32.815898, + "longitude": -90.475849, + "city": "Yazoo City", + "state": "MS", + "county": "Yazoo" + }, + { + "zip_code": 39201, + "latitude": 32.291095, + "longitude": -90.192687, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39202, + "latitude": 32.305395, + "longitude": -90.176737, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39203, + "latitude": 32.308595, + "longitude": -90.210438, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39204, + "latitude": 32.30148, + "longitude": -90.290313, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39205, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39206, + "latitude": 32.370044, + "longitude": -90.169987, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39207, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39208, + "latitude": 32.267238, + "longitude": -89.958708, + "city": "Pearl", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39209, + "latitude": 32.374632, + "longitude": -90.362921, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39210, + "latitude": 32.321845, + "longitude": -90.177137, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39211, + "latitude": 32.366844, + "longitude": -90.123786, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39212, + "latitude": 32.238808, + "longitude": -90.28773, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39213, + "latitude": 32.306096, + "longitude": -90.216282, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39215, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39216, + "latitude": 32.336744, + "longitude": -90.216096, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39217, + "latitude": 32.297396, + "longitude": -90.208088, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39218, + "latitude": 32.215304, + "longitude": -90.126353, + "city": "Richland", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39225, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39232, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Flowood", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39235, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39236, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39250, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39269, + "latitude": 32.300296, + "longitude": -90.188638, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39271, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39272, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Byram", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39282, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39283, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39284, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39286, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39288, + "latitude": 32.313127, + "longitude": -89.799625, + "city": "Pearl", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39289, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39296, + "latitude": 32.311287, + "longitude": -90.397157, + "city": "Jackson", + "state": "MS", + "county": "Hinds" + }, + { + "zip_code": 39298, + "latitude": 32.319905, + "longitude": -89.992257, + "city": "Jackson", + "state": "MS", + "county": "Rankin" + }, + { + "zip_code": 39301, + "latitude": 32.381605, + "longitude": -88.663489, + "city": "Meridian", + "state": "MS", + "county": "Lauderdale" + }, + { + "zip_code": 39302, + "latitude": 32.431958, + "longitude": -88.641888, + "city": "Meridian", + "state": "MS", + "county": "Lauderdale" + }, + { + "zip_code": 39303, + "latitude": 32.401233, + "longitude": -88.652279, + "city": "Meridian", + "state": "MS", + "county": "Lauderdale" + }, + { + "zip_code": 39304, + "latitude": 32.420847, + "longitude": -88.646016, + "city": "Meridian", + "state": "MS", + "county": "Lauderdale" + }, + { + "zip_code": 39305, + "latitude": 32.403111, + "longitude": -88.658234, + "city": "Meridian", + "state": "MS", + "county": "Lauderdale" + }, + { + "zip_code": 39307, + "latitude": 32.386718, + "longitude": -88.676575, + "city": "Meridian", + "state": "MS", + "county": "Lauderdale" + }, + { + "zip_code": 39309, + "latitude": 32.337389, + "longitude": -88.726474, + "city": "Meridian", + "state": "MS", + "county": "Lauderdale" + }, + { + "zip_code": 39320, + "latitude": 32.52258, + "longitude": -88.745613, + "city": "Bailey", + "state": "MS", + "county": "Lauderdale" + }, + { + "zip_code": 39322, + "latitude": 31.582003, + "longitude": -88.548006, + "city": "Buckatunna", + "state": "MS", + "county": "Wayne" + }, + { + "zip_code": 39323, + "latitude": 32.35048, + "longitude": -88.955099, + "city": "Chunky", + "state": "MS", + "county": "Newton" + }, + { + "zip_code": 39324, + "latitude": 31.593682, + "longitude": -88.704829, + "city": "Clara", + "state": "MS", + "county": "Wayne" + }, + { + "zip_code": 39325, + "latitude": 32.434473, + "longitude": -88.78778, + "city": "Collinsville", + "state": "MS", + "county": "Lauderdale" + }, + { + "zip_code": 39326, + "latitude": 32.556534, + "longitude": -88.679062, + "city": "Daleville", + "state": "MS", + "county": "Lauderdale" + }, + { + "zip_code": 39327, + "latitude": 32.427135, + "longitude": -89.092952, + "city": "Decatur", + "state": "MS", + "county": "Newton" + }, + { + "zip_code": 39328, + "latitude": 32.799065, + "longitude": -88.698657, + "city": "De Kalb", + "state": "MS", + "county": "Kemper" + }, + { + "zip_code": 39330, + "latitude": 32.14342, + "longitude": -88.819543, + "city": "Enterprise", + "state": "MS", + "county": "Clarke" + }, + { + "zip_code": 39332, + "latitude": 32.323107, + "longitude": -89.083928, + "city": "Hickory", + "state": "MS", + "county": "Newton" + }, + { + "zip_code": 39335, + "latitude": 32.498068, + "longitude": -88.534433, + "city": "Lauderdale", + "state": "MS", + "county": "Lauderdale" + }, + { + "zip_code": 39336, + "latitude": 32.319198, + "longitude": -89.258254, + "city": "Lawrence", + "state": "MS", + "county": "Newton" + }, + { + "zip_code": 39337, + "latitude": 32.5049, + "longitude": -88.995468, + "city": "Little Rock", + "state": "MS", + "county": "Newton" + }, + { + "zip_code": 39338, + "latitude": 32.109313, + "longitude": -89.187423, + "city": "Louin", + "state": "MS", + "county": "Jasper" + }, + { + "zip_code": 39339, + "latitude": 33.101687, + "longitude": -89.068098, + "city": "Louisville", + "state": "MS", + "county": "Winston" + }, + { + "zip_code": 39341, + "latitude": 33.125769, + "longitude": -88.54474, + "city": "Macon", + "state": "MS", + "county": "Noxubee" + }, + { + "zip_code": 39342, + "latitude": 32.336743, + "longitude": -88.616297, + "city": "Marion", + "state": "MS", + "county": "Lauderdale" + }, + { + "zip_code": 39345, + "latitude": 32.39983, + "longitude": -89.08313, + "city": "Newton", + "state": "MS", + "county": "Newton" + }, + { + "zip_code": 39346, + "latitude": 32.980751, + "longitude": -89.108325, + "city": "Noxapater", + "state": "MS", + "county": "Winston" + }, + { + "zip_code": 39347, + "latitude": 32.021692, + "longitude": -88.885093, + "city": "Pachuta", + "state": "MS", + "county": "Clarke" + }, + { + "zip_code": 39348, + "latitude": 32.069413, + "longitude": -89.027181, + "city": "Paulding", + "state": "MS", + "county": "Jasper" + }, + { + "zip_code": 39350, + "latitude": 32.754387, + "longitude": -89.116797, + "city": "Philadelphia", + "state": "MS", + "county": "Neshoba" + }, + { + "zip_code": 39352, + "latitude": 32.797547, + "longitude": -88.523668, + "city": "Porterville", + "state": "MS", + "county": "Kemper" + }, + { + "zip_code": 39354, + "latitude": 32.855983, + "longitude": -88.827847, + "city": "Preston", + "state": "MS", + "county": "Kemper" + }, + { + "zip_code": 39355, + "latitude": 32.013802, + "longitude": -88.663429, + "city": "Quitman", + "state": "MS", + "county": "Clarke" + }, + { + "zip_code": 39356, + "latitude": 32.13603, + "longitude": -88.998801, + "city": "Rose Hill", + "state": "MS", + "county": "Jasper" + }, + { + "zip_code": 39358, + "latitude": 32.822624, + "longitude": -88.478138, + "city": "Scooba", + "state": "MS", + "county": "Kemper" + }, + { + "zip_code": 39359, + "latitude": 32.551832, + "longitude": -89.357384, + "city": "Sebastopol", + "state": "MS", + "county": "Scott" + }, + { + "zip_code": 39360, + "latitude": 31.960687, + "longitude": -88.716818, + "city": "Shubuta", + "state": "MS", + "county": "Clarke" + }, + { + "zip_code": 39361, + "latitude": 33.082645, + "longitude": -88.659645, + "city": "Shuqualak", + "state": "MS", + "county": "Noxubee" + }, + { + "zip_code": 39362, + "latitude": 31.360647, + "longitude": -88.606456, + "city": "State Line", + "state": "MS", + "county": "Greene" + }, + { + "zip_code": 39363, + "latitude": 32.140683, + "longitude": -88.770572, + "city": "Stonewall", + "state": "MS", + "county": "Clarke" + }, + { + "zip_code": 39364, + "latitude": 32.424306, + "longitude": -88.660633, + "city": "Toomsuba", + "state": "MS", + "county": "Lauderdale" + }, + { + "zip_code": 39365, + "latitude": 32.643921, + "longitude": -89.111993, + "city": "Union", + "state": "MS", + "county": "Neshoba" + }, + { + "zip_code": 39366, + "latitude": 31.950645, + "longitude": -88.970738, + "city": "Vossburg", + "state": "MS", + "county": "Jasper" + }, + { + "zip_code": 39367, + "latitude": 31.659327, + "longitude": -88.704113, + "city": "Waynesboro", + "state": "MS", + "county": "Wayne" + }, + { + "zip_code": 39401, + "latitude": 31.245138, + "longitude": -89.28071, + "city": "Hattiesburg", + "state": "MS", + "county": "Forrest" + }, + { + "zip_code": 39402, + "latitude": 31.335865, + "longitude": -89.379246, + "city": "Hattiesburg", + "state": "MS", + "county": "Forrest" + }, + { + "zip_code": 39403, + "latitude": 31.356642, + "longitude": -89.382415, + "city": "Hattiesburg", + "state": "MS", + "county": "Forrest" + }, + { + "zip_code": 39404, + "latitude": 31.172142, + "longitude": -89.294772, + "city": "Hattiesburg", + "state": "MS", + "county": "Forrest" + }, + { + "zip_code": 39406, + "latitude": 31.172142, + "longitude": -89.294772, + "city": "Hattiesburg", + "state": "MS", + "county": "Forrest" + }, + { + "zip_code": 39407, + "latitude": 31.172142, + "longitude": -89.294772, + "city": "Hattiesburg", + "state": "MS", + "county": "Forrest" + }, + { + "zip_code": 39421, + "latitude": 31.582332, + "longitude": -89.781429, + "city": "Bassfield", + "state": "MS", + "county": "Jefferson Davis" + }, + { + "zip_code": 39422, + "latitude": 31.989146, + "longitude": -89.209877, + "city": "Bay Springs", + "state": "MS", + "county": "Jasper" + }, + { + "zip_code": 39423, + "latitude": 31.185365, + "longitude": -88.920132, + "city": "Beaumont", + "state": "MS", + "county": "Perry" + }, + { + "zip_code": 39425, + "latitude": 31.181756, + "longitude": -89.266547, + "city": "Brooklyn", + "state": "MS", + "county": "Forrest" + }, + { + "zip_code": 39426, + "latitude": 30.661121, + "longitude": -89.646536, + "city": "Carriere", + "state": "MS", + "county": "Pearl River" + }, + { + "zip_code": 39427, + "latitude": 31.601319, + "longitude": -89.865962, + "city": "Carson", + "state": "MS", + "county": "Jefferson Davis" + }, + { + "zip_code": 39428, + "latitude": 31.652811, + "longitude": -89.578002, + "city": "Collins", + "state": "MS", + "county": "Covington" + }, + { + "zip_code": 39429, + "latitude": 31.218188, + "longitude": -89.801872, + "city": "Columbia", + "state": "MS", + "county": "Marion" + }, + { + "zip_code": 39436, + "latitude": 31.455471, + "longitude": -89.302042, + "city": "Eastabuchie", + "state": "MS", + "county": "Jones" + }, + { + "zip_code": 39437, + "latitude": 31.611088, + "longitude": -89.171825, + "city": "Ellisville", + "state": "MS", + "county": "Jones" + }, + { + "zip_code": 39439, + "latitude": 31.892668, + "longitude": -89.077368, + "city": "Heidelberg", + "state": "MS", + "county": "Jasper" + }, + { + "zip_code": 39440, + "latitude": 31.711733, + "longitude": -89.114317, + "city": "Laurel", + "state": "MS", + "county": "Jones" + }, + { + "zip_code": 39441, + "latitude": 31.727664, + "longitude": -89.075482, + "city": "Laurel", + "state": "MS", + "county": "Jones" + }, + { + "zip_code": 39442, + "latitude": 31.682254, + "longitude": -89.040622, + "city": "Laurel", + "state": "MS", + "county": "Jones" + }, + { + "zip_code": 39443, + "latitude": 31.686952, + "longitude": -89.121296, + "city": "Laurel", + "state": "MS", + "county": "Jones" + }, + { + "zip_code": 39451, + "latitude": 31.167734, + "longitude": -88.637767, + "city": "Leakesville", + "state": "MS", + "county": "Greene" + }, + { + "zip_code": 39452, + "latitude": 30.866791, + "longitude": -88.649035, + "city": "Lucedale", + "state": "MS", + "county": "George" + }, + { + "zip_code": 39455, + "latitude": 31.100426, + "longitude": -89.503417, + "city": "Lumberton", + "state": "MS", + "county": "Lamar" + }, + { + "zip_code": 39456, + "latitude": 31.086666, + "longitude": -88.797692, + "city": "Mc Lain", + "state": "MS", + "county": "Greene" + }, + { + "zip_code": 39457, + "latitude": 30.666936, + "longitude": -89.673392, + "city": "Mc Neill", + "state": "MS", + "county": "Pearl River" + }, + { + "zip_code": 39459, + "latitude": 31.500214, + "longitude": -89.296883, + "city": "Moselle", + "state": "MS", + "county": "Jones" + }, + { + "zip_code": 39460, + "latitude": 32.013235, + "longitude": -89.11656, + "city": "Moss", + "state": "MS", + "county": "Jasper" + }, + { + "zip_code": 39461, + "latitude": 31.210172, + "longitude": -88.754841, + "city": "Neely", + "state": "MS", + "county": "Greene" + }, + { + "zip_code": 39462, + "latitude": 31.171903, + "longitude": -88.991561, + "city": "New Augusta", + "state": "MS", + "county": "Perry" + }, + { + "zip_code": 39463, + "latitude": 30.563724, + "longitude": -89.557751, + "city": "Nicholson", + "state": "MS", + "county": "Pearl River" + }, + { + "zip_code": 39464, + "latitude": 31.311643, + "longitude": -88.999044, + "city": "Ovett", + "state": "MS", + "county": "Perry" + }, + { + "zip_code": 39465, + "latitude": 31.331528, + "longitude": -89.215061, + "city": "Petal", + "state": "MS", + "county": "Forrest" + }, + { + "zip_code": 39466, + "latitude": 30.627655, + "longitude": -89.63128, + "city": "Picayune", + "state": "MS", + "county": "Pearl River" + }, + { + "zip_code": 39470, + "latitude": 30.756774, + "longitude": -89.58072, + "city": "Poplarville", + "state": "MS", + "county": "Pearl River" + }, + { + "zip_code": 39474, + "latitude": 31.59763, + "longitude": -89.886038, + "city": "Prentiss", + "state": "MS", + "county": "Jefferson Davis" + }, + { + "zip_code": 39475, + "latitude": 31.228126, + "longitude": -89.501513, + "city": "Purvis", + "state": "MS", + "county": "Lamar" + }, + { + "zip_code": 39476, + "latitude": 31.318239, + "longitude": -88.993126, + "city": "Richton", + "state": "MS", + "county": "Perry" + }, + { + "zip_code": 39477, + "latitude": 31.790929, + "longitude": -89.041363, + "city": "Sandersville", + "state": "MS", + "county": "Jones" + }, + { + "zip_code": 39478, + "latitude": 31.078868, + "longitude": -89.847732, + "city": "Sandy Hook", + "state": "MS", + "county": "Marion" + }, + { + "zip_code": 39479, + "latitude": 31.5378, + "longitude": -89.502846, + "city": "Seminary", + "state": "MS", + "county": "Covington" + }, + { + "zip_code": 39480, + "latitude": 31.713226, + "longitude": -89.297336, + "city": "Soso", + "state": "MS", + "county": "Jones" + }, + { + "zip_code": 39481, + "latitude": 31.870465, + "longitude": -89.229337, + "city": "Stringer", + "state": "MS", + "county": "Jasper" + }, + { + "zip_code": 39482, + "latitude": 31.216581, + "longitude": -89.531088, + "city": "Sumrall", + "state": "MS", + "county": "Lamar" + }, + { + "zip_code": 39483, + "latitude": 31.247873, + "longitude": -89.92857, + "city": "Foxworth", + "state": "MS", + "county": "Marion" + }, + { + "zip_code": 39501, + "latitude": 30.396277, + "longitude": -89.064103, + "city": "Gulfport", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39502, + "latitude": 30.415795, + "longitude": -89.068448, + "city": "Gulfport", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39503, + "latitude": 30.467067, + "longitude": -89.151485, + "city": "Gulfport", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39505, + "latitude": 30.415795, + "longitude": -89.068448, + "city": "Gulfport", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39506, + "latitude": 30.415795, + "longitude": -89.068448, + "city": "Gulfport", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39507, + "latitude": 30.400079, + "longitude": -89.031635, + "city": "Gulfport", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39520, + "latitude": 30.295608, + "longitude": -89.463187, + "city": "Bay Saint Louis", + "state": "MS", + "county": "Hancock" + }, + { + "zip_code": 39521, + "latitude": 30.403156, + "longitude": -89.49821, + "city": "Bay Saint Louis", + "state": "MS", + "county": "Hancock" + }, + { + "zip_code": 39522, + "latitude": 30.403156, + "longitude": -89.49821, + "city": "Stennis Space Center", + "state": "MS", + "county": "Hancock" + }, + { + "zip_code": 39525, + "latitude": 30.372821, + "longitude": -89.377942, + "city": "Diamondhead", + "state": "MS", + "county": "Hancock" + }, + { + "zip_code": 39529, + "latitude": 30.403156, + "longitude": -89.49821, + "city": "Stennis Space Center", + "state": "MS", + "county": "Hancock" + }, + { + "zip_code": 39530, + "latitude": 30.432454, + "longitude": -88.978634, + "city": "Biloxi", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39531, + "latitude": 30.401498, + "longitude": -88.971229, + "city": "Biloxi", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39532, + "latitude": 30.510988, + "longitude": -88.96808, + "city": "Biloxi", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39533, + "latitude": 30.415795, + "longitude": -89.068448, + "city": "Biloxi", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39534, + "latitude": 30.415795, + "longitude": -89.068448, + "city": "Biloxi", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39535, + "latitude": 30.415795, + "longitude": -89.068448, + "city": "Biloxi", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39540, + "latitude": "", + "longitude": "", + "city": "Diberville", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39552, + "latitude": 30.441072, + "longitude": -88.634482, + "city": "Escatawpa", + "state": "MS", + "county": "Jackson" + }, + { + "zip_code": 39553, + "latitude": 30.421676, + "longitude": -88.66487, + "city": "Gautier", + "state": "MS", + "county": "Jackson" + }, + { + "zip_code": 39555, + "latitude": 30.71325, + "longitude": -88.519743, + "city": "Hurley", + "state": "MS", + "county": "Jackson" + }, + { + "zip_code": 39556, + "latitude": 30.487498, + "longitude": -89.418722, + "city": "Kiln", + "state": "MS", + "county": "Hancock" + }, + { + "zip_code": 39558, + "latitude": 30.239124, + "longitude": -89.459526, + "city": "Lakeshore", + "state": "MS", + "county": "Hancock" + }, + { + "zip_code": 39560, + "latitude": 30.374646, + "longitude": -89.177143, + "city": "Long Beach", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39561, + "latitude": 30.721036, + "longitude": -89.172285, + "city": "Mc Henry", + "state": "MS", + "county": "Stone" + }, + { + "zip_code": 39562, + "latitude": 30.544726, + "longitude": -88.604298, + "city": "Moss Point", + "state": "MS", + "county": "Jackson" + }, + { + "zip_code": 39563, + "latitude": 30.539088, + "longitude": -88.621049, + "city": "Moss Point", + "state": "MS", + "county": "Jackson" + }, + { + "zip_code": 39564, + "latitude": 30.50028, + "longitude": -88.655024, + "city": "Ocean Springs", + "state": "MS", + "county": "Jackson" + }, + { + "zip_code": 39565, + "latitude": 30.547365, + "longitude": -88.708582, + "city": "Ocean Springs", + "state": "MS", + "county": "Jackson" + }, + { + "zip_code": 39566, + "latitude": 30.441072, + "longitude": -88.634482, + "city": "Ocean Springs", + "state": "MS", + "county": "Jackson" + }, + { + "zip_code": 39567, + "latitude": 30.534162, + "longitude": -88.489379, + "city": "Pascagoula", + "state": "MS", + "county": "Jackson" + }, + { + "zip_code": 39568, + "latitude": 30.441072, + "longitude": -88.634482, + "city": "Pascagoula", + "state": "MS", + "county": "Jackson" + }, + { + "zip_code": 39569, + "latitude": 30.441072, + "longitude": -88.634482, + "city": "Pascagoula", + "state": "MS", + "county": "Jackson" + }, + { + "zip_code": 39571, + "latitude": 30.426162, + "longitude": -89.264327, + "city": "Pass Christian", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39572, + "latitude": 30.249299, + "longitude": -89.520472, + "city": "Pearlington", + "state": "MS", + "county": "Hancock" + }, + { + "zip_code": 39573, + "latitude": 30.773109, + "longitude": -89.112944, + "city": "Perkinston", + "state": "MS", + "county": "Stone" + }, + { + "zip_code": 39574, + "latitude": 30.599773, + "longitude": -89.112683, + "city": "Saucier", + "state": "MS", + "county": "Harrison" + }, + { + "zip_code": 39576, + "latitude": 30.285046, + "longitude": -89.371231, + "city": "Waveland", + "state": "MS", + "county": "Hancock" + }, + { + "zip_code": 39577, + "latitude": 30.847778, + "longitude": -89.086992, + "city": "Wiggins", + "state": "MS", + "county": "Stone" + }, + { + "zip_code": 39581, + "latitude": 30.539159, + "longitude": -88.621046, + "city": "Pascagoula", + "state": "MS", + "county": "Jackson" + }, + { + "zip_code": 39595, + "latitude": 30.441072, + "longitude": -88.634482, + "city": "Pascagoula", + "state": "MS", + "county": "Jackson" + }, + { + "zip_code": 39601, + "latitude": 31.521489, + "longitude": -90.460786, + "city": "Brookhaven", + "state": "MS", + "county": "Lincoln" + }, + { + "zip_code": 39602, + "latitude": 31.533354, + "longitude": -90.490661, + "city": "Brookhaven", + "state": "MS", + "county": "Lincoln" + }, + { + "zip_code": 39603, + "latitude": 31.612287, + "longitude": -90.446702, + "city": "Brookhaven", + "state": "MS", + "county": "Lincoln" + }, + { + "zip_code": 39629, + "latitude": 31.447124, + "longitude": -90.45787, + "city": "Bogue Chitto", + "state": "MS", + "county": "Lincoln" + }, + { + "zip_code": 39630, + "latitude": 31.465718, + "longitude": -90.895386, + "city": "Bude", + "state": "MS", + "county": "Franklin" + }, + { + "zip_code": 39631, + "latitude": 31.134359, + "longitude": -91.175079, + "city": "Centreville", + "state": "MS", + "county": "Wilkinson" + }, + { + "zip_code": 39632, + "latitude": 31.114483, + "longitude": -90.487486, + "city": "Chatawa", + "state": "MS", + "county": "Pike" + }, + { + "zip_code": 39633, + "latitude": 31.247847, + "longitude": -90.885075, + "city": "Crosby", + "state": "MS", + "county": "Amite" + }, + { + "zip_code": 39635, + "latitude": 31.18537, + "longitude": -90.427966, + "city": "Fernwood", + "state": "MS", + "county": "Pike" + }, + { + "zip_code": 39638, + "latitude": 31.199644, + "longitude": -90.916006, + "city": "Gloster", + "state": "MS", + "county": "Amite" + }, + { + "zip_code": 39641, + "latitude": 31.409296, + "longitude": -90.142429, + "city": "Jayess", + "state": "MS", + "county": "Lawrence" + }, + { + "zip_code": 39643, + "latitude": 31.243549, + "longitude": -89.978849, + "city": "Kokomo", + "state": "MS", + "county": "Marion" + }, + { + "zip_code": 39645, + "latitude": 31.17427, + "longitude": -90.803528, + "city": "Liberty", + "state": "MS", + "county": "Amite" + }, + { + "zip_code": 39647, + "latitude": 31.465718, + "longitude": -90.895386, + "city": "Mc Call Creek", + "state": "MS", + "county": "Franklin" + }, + { + "zip_code": 39648, + "latitude": 31.1769, + "longitude": -90.40156, + "city": "Mccomb", + "state": "MS", + "county": "Pike" + }, + { + "zip_code": 39649, + "latitude": 31.17494, + "longitude": -90.403987, + "city": "Mccomb", + "state": "MS", + "county": "Pike" + }, + { + "zip_code": 39652, + "latitude": 31.143395, + "longitude": -90.403989, + "city": "Magnolia", + "state": "MS", + "county": "Pike" + }, + { + "zip_code": 39653, + "latitude": 31.469888, + "longitude": -90.891482, + "city": "Meadville", + "state": "MS", + "county": "Franklin" + }, + { + "zip_code": 39654, + "latitude": 31.540111, + "longitude": -90.161012, + "city": "Monticello", + "state": "MS", + "county": "Lawrence" + }, + { + "zip_code": 39656, + "latitude": 31.48225, + "longitude": -90.036767, + "city": "Oak Vale", + "state": "MS", + "county": "Lawrence" + }, + { + "zip_code": 39657, + "latitude": 31.043653, + "longitude": -90.403651, + "city": "Osyka", + "state": "MS", + "county": "Pike" + }, + { + "zip_code": 39661, + "latitude": 31.50115, + "longitude": -91.069486, + "city": "Roxie", + "state": "MS", + "county": "Franklin" + }, + { + "zip_code": 39662, + "latitude": 31.409907, + "longitude": -90.291051, + "city": "Ruth", + "state": "MS", + "county": "Lincoln" + }, + { + "zip_code": 39663, + "latitude": 31.594604, + "longitude": -90.044711, + "city": "Silver Creek", + "state": "MS", + "county": "Lawrence" + }, + { + "zip_code": 39664, + "latitude": 31.268945, + "longitude": -90.670185, + "city": "Smithdale", + "state": "MS", + "county": "Amite" + }, + { + "zip_code": 39665, + "latitude": 31.640256, + "longitude": -90.189547, + "city": "Sontag", + "state": "MS", + "county": "Lawrence" + }, + { + "zip_code": 39666, + "latitude": 31.258892, + "longitude": -90.404555, + "city": "Summit", + "state": "MS", + "county": "Pike" + }, + { + "zip_code": 39667, + "latitude": 31.175558, + "longitude": -90.090824, + "city": "Tylertown", + "state": "MS", + "county": "Walthall" + }, + { + "zip_code": 39668, + "latitude": 31.714577, + "longitude": -90.746168, + "city": "Union Church", + "state": "MS", + "county": "Jefferson" + }, + { + "zip_code": 39669, + "latitude": 31.175443, + "longitude": -91.324666, + "city": "Woodville", + "state": "MS", + "county": "Wilkinson" + }, + { + "zip_code": 39701, + "latitude": 33.516258, + "longitude": -88.461318, + "city": "Columbus", + "state": "MS", + "county": "Lowndes" + }, + { + "zip_code": 39702, + "latitude": 33.429569, + "longitude": -88.460218, + "city": "Columbus", + "state": "MS", + "county": "Lowndes" + }, + { + "zip_code": 39703, + "latitude": 33.484147, + "longitude": -88.283998, + "city": "Columbus", + "state": "MS", + "county": "Lowndes" + }, + { + "zip_code": 39704, + "latitude": 33.548523, + "longitude": -88.379614, + "city": "Columbus", + "state": "MS", + "county": "Lowndes" + }, + { + "zip_code": 39705, + "latitude": 33.550752, + "longitude": -88.486521, + "city": "Columbus", + "state": "MS", + "county": "Lowndes" + }, + { + "zip_code": 39710, + "latitude": 33.51633, + "longitude": -88.460083, + "city": "Columbus", + "state": "MS", + "county": "Lowndes" + }, + { + "zip_code": 39730, + "latitude": 33.847638, + "longitude": -88.514694, + "city": "Aberdeen", + "state": "MS", + "county": "Monroe" + }, + { + "zip_code": 39735, + "latitude": 33.278252, + "longitude": -89.191298, + "city": "Ackerman", + "state": "MS", + "county": "Choctaw" + }, + { + "zip_code": 39736, + "latitude": 33.411531, + "longitude": -88.644261, + "city": "Artesia", + "state": "MS", + "county": "Lowndes" + }, + { + "zip_code": 39737, + "latitude": 33.648956, + "longitude": -89.334234, + "city": "Bellefontaine", + "state": "MS", + "county": "Webster" + }, + { + "zip_code": 39739, + "latitude": 33.220204, + "longitude": -88.482218, + "city": "Brooksville", + "state": "MS", + "county": "Noxubee" + }, + { + "zip_code": 39740, + "latitude": 33.81523, + "longitude": -88.271904, + "city": "Caledonia", + "state": "MS", + "county": "Monroe" + }, + { + "zip_code": 39741, + "latitude": 33.659271, + "longitude": -88.753976, + "city": "Cedarbluff", + "state": "MS", + "county": "Clay" + }, + { + "zip_code": 39743, + "latitude": 33.334688, + "longitude": -88.556056, + "city": "Crawford", + "state": "MS", + "county": "Lowndes" + }, + { + "zip_code": 39744, + "latitude": 33.549384, + "longitude": -89.290417, + "city": "Eupora", + "state": "MS", + "county": "Webster" + }, + { + "zip_code": 39745, + "latitude": 33.289753, + "longitude": -89.399875, + "city": "French Camp", + "state": "MS", + "county": "Choctaw" + }, + { + "zip_code": 39746, + "latitude": 33.778926, + "longitude": -88.358784, + "city": "Hamilton", + "state": "MS", + "county": "Monroe" + }, + { + "zip_code": 39747, + "latitude": 33.4346, + "longitude": -89.585663, + "city": "Kilmichael", + "state": "MS", + "county": "Montgomery" + }, + { + "zip_code": 39750, + "latitude": 33.599618, + "longitude": -89.262792, + "city": "Maben", + "state": "MS", + "county": "Webster" + }, + { + "zip_code": 39751, + "latitude": 33.94185, + "longitude": -89.323857, + "city": "Mantee", + "state": "MS", + "county": "Calhoun" + }, + { + "zip_code": 39752, + "latitude": 33.540161, + "longitude": -89.130294, + "city": "Mathiston", + "state": "MS", + "county": "Webster" + }, + { + "zip_code": 39753, + "latitude": 33.483814, + "longitude": -88.640881, + "city": "Mayhew", + "state": "MS", + "county": "Lowndes" + }, + { + "zip_code": 39754, + "latitude": 33.659271, + "longitude": -88.753976, + "city": "Montpelier", + "state": "MS", + "county": "Clay" + }, + { + "zip_code": 39755, + "latitude": 33.659271, + "longitude": -88.753976, + "city": "Pheba", + "state": "MS", + "county": "Clay" + }, + { + "zip_code": 39756, + "latitude": 33.783578, + "longitude": -88.664183, + "city": "Prairie", + "state": "MS", + "county": "Monroe" + }, + { + "zip_code": 39759, + "latitude": 33.42554, + "longitude": -88.879117, + "city": "Starkville", + "state": "MS", + "county": "Oktibbeha" + }, + { + "zip_code": 39760, + "latitude": 33.459924, + "longitude": -88.832163, + "city": "Starkville", + "state": "MS", + "county": "Oktibbeha" + }, + { + "zip_code": 39762, + "latitude": 33.415601, + "longitude": -88.743329, + "city": "Mississippi State", + "state": "MS", + "county": "Oktibbeha" + }, + { + "zip_code": 39766, + "latitude": 33.603342, + "longitude": -88.321007, + "city": "Steens", + "state": "MS", + "county": "Lowndes" + }, + { + "zip_code": 39767, + "latitude": 33.518048, + "longitude": -89.467862, + "city": "Stewart", + "state": "MS", + "county": "Montgomery" + }, + { + "zip_code": 39769, + "latitude": 33.405675, + "longitude": -88.993677, + "city": "Sturgis", + "state": "MS", + "county": "Oktibbeha" + }, + { + "zip_code": 39771, + "latitude": 33.595758, + "longitude": -89.298621, + "city": "Walthall", + "state": "MS", + "county": "Webster" + }, + { + "zip_code": 39772, + "latitude": 33.321036, + "longitude": -89.271149, + "city": "Weir", + "state": "MS", + "county": "Choctaw" + }, + { + "zip_code": 39773, + "latitude": 33.621135, + "longitude": -88.609136, + "city": "West Point", + "state": "MS", + "county": "Clay" + }, + { + "zip_code": 39776, + "latitude": 33.804808, + "longitude": -89.060746, + "city": "Woodland", + "state": "MS", + "county": "Chickasaw" + }, + { + "zip_code": 39901, + "latitude": 33.891251, + "longitude": -84.07456, + "city": "Atlanta", + "state": "GA", + "county": "Dekalb" + }, + { + "zip_code": 40003, + "latitude": 38.274456, + "longitude": -85.090374, + "city": "Bagdad", + "state": "KY", + "county": "Shelby" + }, + { + "zip_code": 40004, + "latitude": 37.822585, + "longitude": -85.466944, + "city": "Bardstown", + "state": "KY", + "county": "Nelson" + }, + { + "zip_code": 40006, + "latitude": 38.603011, + "longitude": -85.329441, + "city": "Bedford", + "state": "KY", + "county": "Trimble" + }, + { + "zip_code": 40007, + "latitude": 38.452892, + "longitude": -85.016907, + "city": "Bethlehem", + "state": "KY", + "county": "Henry" + }, + { + "zip_code": 40008, + "latitude": 37.826549, + "longitude": -85.327083, + "city": "Bloomfield", + "state": "KY", + "county": "Nelson" + }, + { + "zip_code": 40009, + "latitude": 37.504057, + "longitude": -85.107213, + "city": "Bradfordsville", + "state": "KY", + "county": "Marion" + }, + { + "zip_code": 40010, + "latitude": 38.389195, + "longitude": -85.44584, + "city": "Buckner", + "state": "KY", + "county": "Oldham" + }, + { + "zip_code": 40011, + "latitude": 38.45807, + "longitude": -85.132315, + "city": "Campbellsburg", + "state": "KY", + "county": "Henry" + }, + { + "zip_code": 40012, + "latitude": 37.903151, + "longitude": -85.191533, + "city": "Chaplin", + "state": "KY", + "county": "Nelson" + }, + { + "zip_code": 40013, + "latitude": 37.912465, + "longitude": -85.465785, + "city": "Coxs Creek", + "state": "KY", + "county": "Nelson" + }, + { + "zip_code": 40014, + "latitude": 38.358083, + "longitude": -85.446974, + "city": "Crestwood", + "state": "KY", + "county": "Oldham" + }, + { + "zip_code": 40018, + "latitude": 38.22977, + "longitude": -85.66304, + "city": "Eastwood", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40019, + "latitude": 38.416293, + "longitude": -85.171224, + "city": "Eminence", + "state": "KY", + "county": "Henry" + }, + { + "zip_code": 40020, + "latitude": 37.933981, + "longitude": -85.386242, + "city": "Fairfield", + "state": "KY", + "county": "Nelson" + }, + { + "zip_code": 40022, + "latitude": 38.15483, + "longitude": -85.340174, + "city": "Finchville", + "state": "KY", + "county": "Shelby" + }, + { + "zip_code": 40023, + "latitude": 38.188936, + "longitude": -85.446269, + "city": "Fisherville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40025, + "latitude": 38.309597, + "longitude": -85.643359, + "city": "Glenview", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40026, + "latitude": 38.412346, + "longitude": -85.527464, + "city": "Goshen", + "state": "KY", + "county": "Oldham" + }, + { + "zip_code": 40027, + "latitude": 38.329718, + "longitude": -85.63299, + "city": "Harrods Creek", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40031, + "latitude": 38.423186, + "longitude": -85.454359, + "city": "La Grange", + "state": "KY", + "county": "Oldham" + }, + { + "zip_code": 40032, + "latitude": 38.40464, + "longitude": -85.460504, + "city": "La Grange", + "state": "KY", + "county": "Oldham" + }, + { + "zip_code": 40033, + "latitude": 37.541558, + "longitude": -85.256025, + "city": "Lebanon", + "state": "KY", + "county": "Marion" + }, + { + "zip_code": 40036, + "latitude": 38.455714, + "longitude": -84.988603, + "city": "Lockport", + "state": "KY", + "county": "Henry" + }, + { + "zip_code": 40037, + "latitude": 37.647483, + "longitude": -85.417876, + "city": "Loretto", + "state": "KY", + "county": "Marion" + }, + { + "zip_code": 40040, + "latitude": 37.756812, + "longitude": -85.059008, + "city": "Mackville", + "state": "KY", + "county": "Washington" + }, + { + "zip_code": 40041, + "latitude": 38.25361, + "longitude": -85.662215, + "city": "Masonic Home", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40045, + "latitude": 38.687402, + "longitude": -85.378762, + "city": "Milton", + "state": "KY", + "county": "Trimble" + }, + { + "zip_code": 40046, + "latitude": 38.019718, + "longitude": -85.181188, + "city": "Mount Eden", + "state": "KY", + "county": "Spencer" + }, + { + "zip_code": 40047, + "latitude": 38.04141, + "longitude": -85.581303, + "city": "Mount Washington", + "state": "KY", + "county": "Bullitt" + }, + { + "zip_code": 40048, + "latitude": 37.756941, + "longitude": -85.44671, + "city": "Nazareth", + "state": "KY", + "county": "Nelson" + }, + { + "zip_code": 40049, + "latitude": 37.660251, + "longitude": -85.393204, + "city": "Nerinx", + "state": "KY", + "county": "Marion" + }, + { + "zip_code": 40050, + "latitude": 38.427404, + "longitude": -85.18706, + "city": "New Castle", + "state": "KY", + "county": "Henry" + }, + { + "zip_code": 40051, + "latitude": 37.643761, + "longitude": -85.547037, + "city": "New Haven", + "state": "KY", + "county": "Nelson" + }, + { + "zip_code": 40052, + "latitude": 37.602081, + "longitude": -85.516424, + "city": "New Hope", + "state": "KY", + "county": "Nelson" + }, + { + "zip_code": 40055, + "latitude": 38.473652, + "longitude": -85.300936, + "city": "Pendleton", + "state": "KY", + "county": "Henry" + }, + { + "zip_code": 40056, + "latitude": 38.303255, + "longitude": -85.485175, + "city": "Pewee Valley", + "state": "KY", + "county": "Oldham" + }, + { + "zip_code": 40057, + "latitude": 38.431413, + "longitude": -85.032581, + "city": "Pleasureville", + "state": "KY", + "county": "Henry" + }, + { + "zip_code": 40058, + "latitude": 38.494055, + "longitude": -85.124192, + "city": "Port Royal", + "state": "KY", + "county": "Henry" + }, + { + "zip_code": 40059, + "latitude": 38.341558, + "longitude": -85.598451, + "city": "Prospect", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40060, + "latitude": 37.533664, + "longitude": -85.429061, + "city": "Raywick", + "state": "KY", + "county": "Marion" + }, + { + "zip_code": 40061, + "latitude": 37.773962, + "longitude": -85.201068, + "city": "Saint Catharine", + "state": "KY", + "county": "Washington" + }, + { + "zip_code": 40062, + "latitude": 37.604695, + "longitude": -85.425149, + "city": "Saint Francis", + "state": "KY", + "county": "Marion" + }, + { + "zip_code": 40063, + "latitude": 37.579519, + "longitude": -85.355132, + "city": "Saint Mary", + "state": "KY", + "county": "Marion" + }, + { + "zip_code": 40065, + "latitude": 38.222445, + "longitude": -85.172072, + "city": "Shelbyville", + "state": "KY", + "county": "Shelby" + }, + { + "zip_code": 40066, + "latitude": 38.197268, + "longitude": -85.212156, + "city": "Shelbyville", + "state": "KY", + "county": "Shelby" + }, + { + "zip_code": 40067, + "latitude": 38.223861, + "longitude": -85.360625, + "city": "Simpsonville", + "state": "KY", + "county": "Shelby" + }, + { + "zip_code": 40068, + "latitude": 38.408032, + "longitude": -85.267223, + "city": "Smithfield", + "state": "KY", + "county": "Henry" + }, + { + "zip_code": 40069, + "latitude": 37.734249, + "longitude": -85.21065, + "city": "Springfield", + "state": "KY", + "county": "Washington" + }, + { + "zip_code": 40070, + "latitude": 38.476096, + "longitude": -85.248914, + "city": "Sulphur", + "state": "KY", + "county": "Henry" + }, + { + "zip_code": 40071, + "latitude": 38.032735, + "longitude": -85.366055, + "city": "Taylorsville", + "state": "KY", + "county": "Spencer" + }, + { + "zip_code": 40075, + "latitude": 38.552133, + "longitude": -85.101879, + "city": "Turners Station", + "state": "KY", + "county": "Henry" + }, + { + "zip_code": 40076, + "latitude": 38.122662, + "longitude": -85.103096, + "city": "Waddy", + "state": "KY", + "county": "Shelby" + }, + { + "zip_code": 40077, + "latitude": 38.491635, + "longitude": -85.424726, + "city": "Westport", + "state": "KY", + "county": "Oldham" + }, + { + "zip_code": 40078, + "latitude": 37.843697, + "longitude": -85.128804, + "city": "Willisburg", + "state": "KY", + "county": "Washington" + }, + { + "zip_code": 40104, + "latitude": 38.093864, + "longitude": -86.345301, + "city": "Battletown", + "state": "KY", + "county": "Meade" + }, + { + "zip_code": 40107, + "latitude": 37.740827, + "longitude": -85.59479, + "city": "Boston", + "state": "KY", + "county": "Nelson" + }, + { + "zip_code": 40108, + "latitude": 37.97552, + "longitude": -86.179546, + "city": "Brandenburg", + "state": "KY", + "county": "Meade" + }, + { + "zip_code": 40109, + "latitude": 38.051236, + "longitude": -85.755592, + "city": "Brooks", + "state": "KY", + "county": "Bullitt" + }, + { + "zip_code": 40110, + "latitude": 37.93462, + "longitude": -85.65545, + "city": "Clermont", + "state": "KY", + "county": "Bullitt" + }, + { + "zip_code": 40111, + "latitude": 37.847839, + "longitude": -86.463591, + "city": "Cloverport", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40115, + "latitude": 37.735817, + "longitude": -86.237827, + "city": "Custer", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40117, + "latitude": 37.884962, + "longitude": -86.115209, + "city": "Ekron", + "state": "KY", + "county": "Meade" + }, + { + "zip_code": 40118, + "latitude": 38.096526, + "longitude": -85.758416, + "city": "Fairdale", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40119, + "latitude": 37.552184, + "longitude": -86.483592, + "city": "Falls Of Rough", + "state": "KY", + "county": "Grayson" + }, + { + "zip_code": 40121, + "latitude": 37.899466, + "longitude": -85.952833, + "city": "Fort Knox", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 40129, + "latitude": "", + "longitude": "", + "city": "Hillview", + "state": "KY", + "county": "Bullitt" + }, + { + "zip_code": 40140, + "latitude": 37.802295, + "longitude": -86.414768, + "city": "Garfield", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40142, + "latitude": 37.889946, + "longitude": -86.199842, + "city": "Guston", + "state": "KY", + "county": "Meade" + }, + { + "zip_code": 40143, + "latitude": 37.751214, + "longitude": -86.45371, + "city": "Hardinsburg", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40144, + "latitude": 37.802295, + "longitude": -86.414768, + "city": "Harned", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40145, + "latitude": 37.606992, + "longitude": -86.321158, + "city": "Hudson", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40146, + "latitude": 37.828452, + "longitude": -86.28417, + "city": "Irvington", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40150, + "latitude": 37.90878, + "longitude": -85.688029, + "city": "Lebanon Junction", + "state": "KY", + "county": "Bullitt" + }, + { + "zip_code": 40152, + "latitude": 37.619425, + "longitude": -86.449076, + "city": "Mc Daniels", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40153, + "latitude": 37.802295, + "longitude": -86.414768, + "city": "Mc Quady", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40155, + "latitude": 37.934131, + "longitude": -86.081991, + "city": "Muldraugh", + "state": "KY", + "county": "Meade" + }, + { + "zip_code": 40157, + "latitude": 38.022328, + "longitude": -86.355493, + "city": "Payneville", + "state": "KY", + "county": "Meade" + }, + { + "zip_code": 40159, + "latitude": 37.723474, + "longitude": -85.976854, + "city": "Radcliff", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 40160, + "latitude": 37.826634, + "longitude": -85.849432, + "city": "Radcliff", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 40161, + "latitude": 38.005963, + "longitude": -86.398391, + "city": "Rhodelia", + "state": "KY", + "county": "Meade" + }, + { + "zip_code": 40162, + "latitude": 37.755939, + "longitude": -86.032496, + "city": "Rineyville", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 40164, + "latitude": 37.802295, + "longitude": -86.414768, + "city": "Se Ree", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40165, + "latitude": 37.959505, + "longitude": -85.704609, + "city": "Shepherdsville", + "state": "KY", + "county": "Bullitt" + }, + { + "zip_code": 40170, + "latitude": 37.913755, + "longitude": -86.52421, + "city": "Stephensport", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40171, + "latitude": 37.802295, + "longitude": -86.414768, + "city": "Union Star", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40175, + "latitude": 37.803725, + "longitude": -86.050646, + "city": "Vine Grove", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 40176, + "latitude": 37.881048, + "longitude": -86.287044, + "city": "Webster", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40177, + "latitude": 37.980384, + "longitude": -85.966061, + "city": "West Point", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 40178, + "latitude": 37.645844, + "longitude": -86.405203, + "city": "Westview", + "state": "KY", + "county": "Breckinridge" + }, + { + "zip_code": 40201, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40202, + "latitude": 38.25247, + "longitude": -85.753812, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40203, + "latitude": 38.249273, + "longitude": -85.769412, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40204, + "latitude": 38.23942, + "longitude": -85.722711, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40205, + "latitude": 38.224181, + "longitude": -85.60026, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40206, + "latitude": 38.25032, + "longitude": -85.703411, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40207, + "latitude": 38.262769, + "longitude": -85.666284, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40208, + "latitude": 38.21782, + "longitude": -85.763912, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40209, + "latitude": 38.214391, + "longitude": -85.769189, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40210, + "latitude": 38.23207, + "longitude": -85.788702, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40211, + "latitude": 38.232811, + "longitude": -85.815363, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40212, + "latitude": 38.234969, + "longitude": -85.794213, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40213, + "latitude": 38.182609, + "longitude": -85.707133, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40214, + "latitude": 38.163269, + "longitude": -85.788862, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40215, + "latitude": 38.19188, + "longitude": -85.785512, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40216, + "latitude": 38.186519, + "longitude": -85.833463, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40217, + "latitude": 38.21787, + "longitude": -85.739861, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40218, + "latitude": 38.171856, + "longitude": -85.67806, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40219, + "latitude": 38.138118, + "longitude": -85.69526, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40220, + "latitude": 38.214603, + "longitude": -85.620304, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40221, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40222, + "latitude": 38.267429, + "longitude": -85.623671, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40223, + "latitude": 38.265072, + "longitude": -85.558228, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40224, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40225, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40228, + "latitude": 38.144155, + "longitude": -85.626526, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40229, + "latitude": 38.135961, + "longitude": -85.649393, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40231, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40232, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40233, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40241, + "latitude": 38.304531, + "longitude": -85.581536, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40242, + "latitude": 38.278469, + "longitude": -85.59396, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40243, + "latitude": 38.242201, + "longitude": -85.535309, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40245, + "latitude": 38.258384, + "longitude": -85.475021, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40250, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40251, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40252, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40253, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40255, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40256, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40257, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40258, + "latitude": 38.145719, + "longitude": -85.864063, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40259, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40261, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40266, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40268, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40269, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40270, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40272, + "latitude": 38.084554, + "longitude": -85.851022, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40280, + "latitude": 38.246721, + "longitude": -85.685261, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40281, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40282, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40283, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40285, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40287, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40289, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40290, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40291, + "latitude": 38.13132, + "longitude": -85.575352, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40292, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40293, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40294, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40295, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40296, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40297, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40298, + "latitude": 38.188962, + "longitude": -85.676819, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40299, + "latitude": 38.176762, + "longitude": -85.521751, + "city": "Louisville", + "state": "KY", + "county": "Jefferson" + }, + { + "zip_code": 40310, + "latitude": 37.754839, + "longitude": -84.74994, + "city": "Burgin", + "state": "KY", + "county": "Mercer" + }, + { + "zip_code": 40311, + "latitude": 38.334059, + "longitude": -83.994865, + "city": "Carlisle", + "state": "KY", + "county": "Nicholas" + }, + { + "zip_code": 40312, + "latitude": 37.847517, + "longitude": -83.859331, + "city": "Clay City", + "state": "KY", + "county": "Powell" + }, + { + "zip_code": 40313, + "latitude": 38.128726, + "longitude": -83.442495, + "city": "Clearfield", + "state": "KY", + "county": "Rowan" + }, + { + "zip_code": 40316, + "latitude": 37.938651, + "longitude": -83.605538, + "city": "Denniston", + "state": "KY", + "county": "Menifee" + }, + { + "zip_code": 40317, + "latitude": 38.176471, + "longitude": -83.268234, + "city": "Elliottville", + "state": "KY", + "county": "Rowan" + }, + { + "zip_code": 40319, + "latitude": 38.140258, + "longitude": -83.533691, + "city": "Farmers", + "state": "KY", + "county": "Rowan" + }, + { + "zip_code": 40320, + "latitude": 37.968496, + "longitude": -84.157766, + "city": "Ford", + "state": "KY", + "county": "Clark" + }, + { + "zip_code": 40322, + "latitude": 37.947025, + "longitude": -83.608449, + "city": "Frenchburg", + "state": "KY", + "county": "Menifee" + }, + { + "zip_code": 40324, + "latitude": 38.239718, + "longitude": -84.574498, + "city": "Georgetown", + "state": "KY", + "county": "Scott" + }, + { + "zip_code": 40328, + "latitude": 37.585972, + "longitude": -85.08651, + "city": "Gravel Switch", + "state": "KY", + "county": "Marion" + }, + { + "zip_code": 40329, + "latitude": 38.206706, + "longitude": -83.41725, + "city": "Haldeman", + "state": "KY", + "county": "Rowan" + }, + { + "zip_code": 40330, + "latitude": 37.803283, + "longitude": -84.860707, + "city": "Harrodsburg", + "state": "KY", + "county": "Mercer" + }, + { + "zip_code": 40334, + "latitude": 38.016064, + "longitude": -83.771261, + "city": "Hope", + "state": "KY", + "county": "Montgomery" + }, + { + "zip_code": 40336, + "latitude": 37.70424, + "longitude": -83.944815, + "city": "Irvine", + "state": "KY", + "county": "Estill" + }, + { + "zip_code": 40337, + "latitude": 37.964096, + "longitude": -83.870275, + "city": "Jeffersonville", + "state": "KY", + "county": "Montgomery" + }, + { + "zip_code": 40339, + "latitude": 37.950381, + "longitude": -84.656887, + "city": "Keene", + "state": "KY", + "county": "Jessamine" + }, + { + "zip_code": 40340, + "latitude": 37.866238, + "longitude": -84.579491, + "city": "Nicholasville", + "state": "KY", + "county": "Jessamine" + }, + { + "zip_code": 40342, + "latitude": 38.006484, + "longitude": -84.979923, + "city": "Lawrenceburg", + "state": "KY", + "county": "Anderson" + }, + { + "zip_code": 40346, + "latitude": 37.973921, + "longitude": -83.743488, + "city": "Means", + "state": "KY", + "county": "Menifee" + }, + { + "zip_code": 40347, + "latitude": 38.145835, + "longitude": -84.718028, + "city": "Midway", + "state": "KY", + "county": "Woodford" + }, + { + "zip_code": 40348, + "latitude": 38.296337, + "longitude": -84.151319, + "city": "Millersburg", + "state": "KY", + "county": "Bourbon" + }, + { + "zip_code": 40350, + "latitude": 38.303859, + "longitude": -83.886328, + "city": "Moorefield", + "state": "KY", + "county": "Nicholas" + }, + { + "zip_code": 40351, + "latitude": 38.210471, + "longitude": -83.42039, + "city": "Morehead", + "state": "KY", + "county": "Rowan" + }, + { + "zip_code": 40353, + "latitude": 38.052103, + "longitude": -83.924711, + "city": "Mount Sterling", + "state": "KY", + "county": "Montgomery" + }, + { + "zip_code": 40355, + "latitude": 38.627652, + "longitude": -84.87562, + "city": "New Liberty", + "state": "KY", + "county": "Owen" + }, + { + "zip_code": 40356, + "latitude": 37.863751, + "longitude": -84.565075, + "city": "Nicholasville", + "state": "KY", + "county": "Jessamine" + }, + { + "zip_code": 40357, + "latitude": 38.146395, + "longitude": -84.107655, + "city": "North Middletown", + "state": "KY", + "county": "Bourbon" + }, + { + "zip_code": 40358, + "latitude": 38.084908, + "longitude": -83.700824, + "city": "Olympia", + "state": "KY", + "county": "Bath" + }, + { + "zip_code": 40359, + "latitude": 38.493552, + "longitude": -84.843115, + "city": "Owenton", + "state": "KY", + "county": "Owen" + }, + { + "zip_code": 40360, + "latitude": 38.146022, + "longitude": -83.78456, + "city": "Owingsville", + "state": "KY", + "county": "Bath" + }, + { + "zip_code": 40361, + "latitude": 38.217248, + "longitude": -84.213426, + "city": "Paris", + "state": "KY", + "county": "Bourbon" + }, + { + "zip_code": 40362, + "latitude": 38.219407, + "longitude": -84.205944, + "city": "Paris", + "state": "KY", + "county": "Bourbon" + }, + { + "zip_code": 40363, + "latitude": 38.5218, + "longitude": -85.013882, + "city": "Perry Park", + "state": "KY", + "county": "Owen" + }, + { + "zip_code": 40366, + "latitude": 38.086673, + "longitude": -83.757123, + "city": "Preston", + "state": "KY", + "county": "Bath" + }, + { + "zip_code": 40370, + "latitude": 38.383618, + "longitude": -84.553016, + "city": "Sadieville", + "state": "KY", + "county": "Scott" + }, + { + "zip_code": 40371, + "latitude": 38.10437, + "longitude": -83.621715, + "city": "Salt Lick", + "state": "KY", + "county": "Bath" + }, + { + "zip_code": 40372, + "latitude": 37.866351, + "longitude": -84.884036, + "city": "Salvisa", + "state": "KY", + "county": "Mercer" + }, + { + "zip_code": 40374, + "latitude": 38.228942, + "longitude": -83.88438, + "city": "Sharpsburg", + "state": "KY", + "county": "Bath" + }, + { + "zip_code": 40376, + "latitude": 37.816074, + "longitude": -83.693949, + "city": "Slade", + "state": "KY", + "county": "Powell" + }, + { + "zip_code": 40379, + "latitude": 38.306329, + "longitude": -84.676123, + "city": "Stamping Ground", + "state": "KY", + "county": "Scott" + }, + { + "zip_code": 40380, + "latitude": 37.822307, + "longitude": -83.785309, + "city": "Stanton", + "state": "KY", + "county": "Powell" + }, + { + "zip_code": 40383, + "latitude": 37.998762, + "longitude": -84.737666, + "city": "Versailles", + "state": "KY", + "county": "Woodford" + }, + { + "zip_code": 40384, + "latitude": 38.021292, + "longitude": -84.745488, + "city": "Versailles", + "state": "KY", + "county": "Woodford" + }, + { + "zip_code": 40385, + "latitude": 37.717603, + "longitude": -84.14483, + "city": "Waco", + "state": "KY", + "county": "Madison" + }, + { + "zip_code": 40386, + "latitude": 38.021292, + "longitude": -84.745488, + "city": "Versailles", + "state": "KY", + "county": "Woodford" + }, + { + "zip_code": 40387, + "latitude": 37.978036, + "longitude": -83.467497, + "city": "Wellington", + "state": "KY", + "county": "Menifee" + }, + { + "zip_code": 40390, + "latitude": 37.860199, + "longitude": -84.671365, + "city": "Wilmore", + "state": "KY", + "county": "Jessamine" + }, + { + "zip_code": 40391, + "latitude": 37.964922, + "longitude": -84.160724, + "city": "Winchester", + "state": "KY", + "county": "Clark" + }, + { + "zip_code": 40392, + "latitude": 37.968496, + "longitude": -84.157766, + "city": "Winchester", + "state": "KY", + "county": "Clark" + }, + { + "zip_code": 40402, + "latitude": 37.305202, + "longitude": -83.971127, + "city": "Annville", + "state": "KY", + "county": "Jackson" + }, + { + "zip_code": 40403, + "latitude": 37.592589, + "longitude": -84.235247, + "city": "Berea", + "state": "KY", + "county": "Madison" + }, + { + "zip_code": 40404, + "latitude": 37.716443, + "longitude": -84.299699, + "city": "Berea", + "state": "KY", + "county": "Madison" + }, + { + "zip_code": 40405, + "latitude": 37.716443, + "longitude": -84.299699, + "city": "Bighill", + "state": "KY", + "county": "Madison" + }, + { + "zip_code": 40409, + "latitude": 37.373811, + "longitude": -84.412242, + "city": "Brodhead", + "state": "KY", + "county": "Rockcastle" + }, + { + "zip_code": 40410, + "latitude": 37.651397, + "longitude": -84.546693, + "city": "Bryantsville", + "state": "KY", + "county": "Garrard" + }, + { + "zip_code": 40419, + "latitude": 37.43221, + "longitude": -84.517065, + "city": "Crab Orchard", + "state": "KY", + "county": "Lincoln" + }, + { + "zip_code": 40421, + "latitude": 37.416008, + "longitude": -83.993588, + "city": "Dabolt", + "state": "KY", + "county": "Jackson" + }, + { + "zip_code": 40422, + "latitude": 37.636006, + "longitude": -84.849682, + "city": "Danville", + "state": "KY", + "county": "Boyle" + }, + { + "zip_code": 40423, + "latitude": 37.624659, + "longitude": -84.845767, + "city": "Danville", + "state": "KY", + "county": "Boyle" + }, + { + "zip_code": 40434, + "latitude": 37.395468, + "longitude": -83.908492, + "city": "Gray Hawk", + "state": "KY", + "county": "Jackson" + }, + { + "zip_code": 40437, + "latitude": 37.443361, + "longitude": -84.767288, + "city": "Hustonville", + "state": "KY", + "county": "Lincoln" + }, + { + "zip_code": 40440, + "latitude": 37.581754, + "longitude": -84.846678, + "city": "Junction City", + "state": "KY", + "county": "Boyle" + }, + { + "zip_code": 40442, + "latitude": 37.362372, + "longitude": -84.695425, + "city": "Kings Mountain", + "state": "KY", + "county": "Lincoln" + }, + { + "zip_code": 40444, + "latitude": 37.683184, + "longitude": -84.583605, + "city": "Lancaster", + "state": "KY", + "county": "Garrard" + }, + { + "zip_code": 40445, + "latitude": 37.290742, + "longitude": -84.213618, + "city": "Livingston", + "state": "KY", + "county": "Rockcastle" + }, + { + "zip_code": 40446, + "latitude": 37.651397, + "longitude": -84.546693, + "city": "Lancaster", + "state": "KY", + "county": "Garrard" + }, + { + "zip_code": 40447, + "latitude": 37.433778, + "longitude": -84.025131, + "city": "Mc Kee", + "state": "KY", + "county": "Jackson" + }, + { + "zip_code": 40448, + "latitude": 37.445989, + "longitude": -84.699802, + "city": "Mc Kinney", + "state": "KY", + "county": "Lincoln" + }, + { + "zip_code": 40452, + "latitude": 37.603345, + "longitude": -84.94918, + "city": "Mitchellsburg", + "state": "KY", + "county": "Boyle" + }, + { + "zip_code": 40456, + "latitude": 37.398303, + "longitude": -84.337882, + "city": "Mount Vernon", + "state": "KY", + "county": "Rockcastle" + }, + { + "zip_code": 40460, + "latitude": 37.345751, + "longitude": -84.31614, + "city": "Orlando", + "state": "KY", + "county": "Rockcastle" + }, + { + "zip_code": 40461, + "latitude": 37.593625, + "longitude": -84.426456, + "city": "Paint Lick", + "state": "KY", + "county": "Garrard" + }, + { + "zip_code": 40464, + "latitude": 37.571105, + "longitude": -84.924963, + "city": "Parksville", + "state": "KY", + "county": "Boyle" + }, + { + "zip_code": 40467, + "latitude": 37.416008, + "longitude": -83.993588, + "city": "Peoples", + "state": "KY", + "county": "Jackson" + }, + { + "zip_code": 40468, + "latitude": 37.637433, + "longitude": -84.97602, + "city": "Perryville", + "state": "KY", + "county": "Boyle" + }, + { + "zip_code": 40472, + "latitude": 37.713915, + "longitude": -83.856874, + "city": "Ravenna", + "state": "KY", + "county": "Estill" + }, + { + "zip_code": 40473, + "latitude": 37.345751, + "longitude": -84.31614, + "city": "Renfro Valley", + "state": "KY", + "county": "Rockcastle" + }, + { + "zip_code": 40475, + "latitude": 37.764867, + "longitude": -84.296913, + "city": "Richmond", + "state": "KY", + "county": "Madison" + }, + { + "zip_code": 40476, + "latitude": 37.716443, + "longitude": -84.299699, + "city": "Richmond", + "state": "KY", + "county": "Madison" + }, + { + "zip_code": 40481, + "latitude": 37.46592, + "longitude": -84.059717, + "city": "Sandgap", + "state": "KY", + "county": "Jackson" + }, + { + "zip_code": 40484, + "latitude": 37.522046, + "longitude": -84.684467, + "city": "Stanford", + "state": "KY", + "county": "Lincoln" + }, + { + "zip_code": 40486, + "latitude": 37.357587, + "longitude": -83.930007, + "city": "Tyner", + "state": "KY", + "county": "Jackson" + }, + { + "zip_code": 40488, + "latitude": 37.47477, + "longitude": -84.042748, + "city": "Waneta", + "state": "KY", + "county": "Jackson" + }, + { + "zip_code": 40489, + "latitude": 37.377689, + "longitude": -84.620613, + "city": "Waynesburg", + "state": "KY", + "county": "Lincoln" + }, + { + "zip_code": 40492, + "latitude": 37.345751, + "longitude": -84.31614, + "city": "Wildie", + "state": "KY", + "county": "Rockcastle" + }, + { + "zip_code": 40495, + "latitude": 37.709721, + "longitude": -84.082894, + "city": "Winston", + "state": "KY", + "county": "Estill" + }, + { + "zip_code": 40502, + "latitude": 38.016674, + "longitude": -84.486043, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40503, + "latitude": 38.002578, + "longitude": -84.539437, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40504, + "latitude": 38.038613, + "longitude": -84.539422, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40505, + "latitude": 38.060845, + "longitude": -84.462937, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40506, + "latitude": 38.028712, + "longitude": -84.507471, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40507, + "latitude": 38.045571, + "longitude": -84.495969, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40508, + "latitude": 38.051285, + "longitude": -84.498954, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40509, + "latitude": 37.986629, + "longitude": -84.372883, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40510, + "latitude": 38.06146, + "longitude": -84.594901, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40511, + "latitude": 38.132747, + "longitude": -84.492226, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40512, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40513, + "latitude": 38.01513, + "longitude": -84.605827, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40514, + "latitude": 37.982677, + "longitude": -84.560827, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40515, + "latitude": 37.924774, + "longitude": -84.437207, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40516, + "latitude": 38.064867, + "longitude": -84.430752, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40517, + "latitude": 37.986751, + "longitude": -84.487251, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40522, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40523, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40524, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40526, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40533, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40536, + "latitude": 38.032075, + "longitude": -84.508361, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40544, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40546, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40550, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40555, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40574, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40575, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40576, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40577, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40578, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40579, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40580, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40581, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40582, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40583, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40584, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40585, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40586, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40587, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40588, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40589, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40590, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40591, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40592, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40593, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40594, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40595, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40596, + "latitude": 38.028269, + "longitude": -84.471505, + "city": "Lexington", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 40601, + "latitude": 38.228115, + "longitude": -84.869708, + "city": "Frankfort", + "state": "KY", + "county": "Franklin" + }, + { + "zip_code": 40602, + "latitude": 38.234133, + "longitude": -84.874809, + "city": "Frankfort", + "state": "KY", + "county": "Franklin" + }, + { + "zip_code": 40603, + "latitude": 38.234133, + "longitude": -84.874809, + "city": "Frankfort", + "state": "KY", + "county": "Franklin" + }, + { + "zip_code": 40604, + "latitude": 38.234133, + "longitude": -84.874809, + "city": "Frankfort", + "state": "KY", + "county": "Franklin" + }, + { + "zip_code": 40618, + "latitude": 38.234133, + "longitude": -84.874809, + "city": "Frankfort", + "state": "KY", + "county": "Franklin" + }, + { + "zip_code": 40619, + "latitude": 38.234133, + "longitude": -84.874809, + "city": "Frankfort", + "state": "KY", + "county": "Franklin" + }, + { + "zip_code": 40620, + "latitude": 38.234133, + "longitude": -84.874809, + "city": "Frankfort", + "state": "KY", + "county": "Franklin" + }, + { + "zip_code": 40621, + "latitude": 38.234133, + "longitude": -84.874809, + "city": "Frankfort", + "state": "KY", + "county": "Franklin" + }, + { + "zip_code": 40622, + "latitude": 38.234133, + "longitude": -84.874809, + "city": "Frankfort", + "state": "KY", + "county": "Franklin" + }, + { + "zip_code": 40701, + "latitude": 36.854371, + "longitude": -84.184688, + "city": "Corbin", + "state": "KY", + "county": "Whitley" + }, + { + "zip_code": 40702, + "latitude": 36.937426, + "longitude": -84.1031, + "city": "Corbin", + "state": "KY", + "county": "Whitley" + }, + { + "zip_code": 40724, + "latitude": 37.152074, + "longitude": -84.140847, + "city": "Bush", + "state": "KY", + "county": "Laurel" + }, + { + "zip_code": 40729, + "latitude": 37.248761, + "longitude": -84.13796, + "city": "East Bernstadt", + "state": "KY", + "county": "Laurel" + }, + { + "zip_code": 40730, + "latitude": 36.703868, + "longitude": -84.141486, + "city": "Emlyn", + "state": "KY", + "county": "Whitley" + }, + { + "zip_code": 40734, + "latitude": 36.936999, + "longitude": -83.933848, + "city": "Gray", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40737, + "latitude": 36.997587, + "longitude": -84.129021, + "city": "Keavy", + "state": "KY", + "county": "Laurel" + }, + { + "zip_code": 40740, + "latitude": 37.025647, + "longitude": -84.028217, + "city": "Lily", + "state": "KY", + "county": "Laurel" + }, + { + "zip_code": 40741, + "latitude": 37.154931, + "longitude": -84.096062, + "city": "London", + "state": "KY", + "county": "Laurel" + }, + { + "zip_code": 40742, + "latitude": 37.137615, + "longitude": -84.115617, + "city": "London", + "state": "KY", + "county": "Laurel" + }, + { + "zip_code": 40743, + "latitude": 37.134455, + "longitude": -84.045746, + "city": "London", + "state": "KY", + "county": "Laurel" + }, + { + "zip_code": 40744, + "latitude": 37.09949, + "longitude": -84.113057, + "city": "London", + "state": "KY", + "county": "Laurel" + }, + { + "zip_code": 40745, + "latitude": 37.137615, + "longitude": -84.115617, + "city": "London", + "state": "KY", + "county": "Laurel" + }, + { + "zip_code": 40751, + "latitude": 37.137615, + "longitude": -84.115617, + "city": "Marydell", + "state": "KY", + "county": "Laurel" + }, + { + "zip_code": 40754, + "latitude": 36.780333, + "longitude": -84.11678, + "city": "Nevisdale", + "state": "KY", + "county": "Whitley" + }, + { + "zip_code": 40755, + "latitude": 37.167752, + "longitude": -84.116614, + "city": "Pittsburg", + "state": "KY", + "county": "Laurel" + }, + { + "zip_code": 40759, + "latitude": 36.832568, + "longitude": -84.070522, + "city": "Rockholds", + "state": "KY", + "county": "Whitley" + }, + { + "zip_code": 40763, + "latitude": 36.702504, + "longitude": -83.955033, + "city": "Siler", + "state": "KY", + "county": "Whitley" + }, + { + "zip_code": 40769, + "latitude": 36.747032, + "longitude": -84.139406, + "city": "Williamsburg", + "state": "KY", + "county": "Whitley" + }, + { + "zip_code": 40771, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Woodbine", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40801, + "latitude": 36.865351, + "longitude": -83.287927, + "city": "Ages Brookside", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40803, + "latitude": 37.011357, + "longitude": -83.4553, + "city": "Asher", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 40806, + "latitude": 36.879484, + "longitude": -83.304537, + "city": "Baxter", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40807, + "latitude": 36.971157, + "longitude": -82.955273, + "city": "Benham", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40808, + "latitude": 36.984102, + "longitude": -83.206701, + "city": "Big Laurel", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40810, + "latitude": 36.934041, + "longitude": -83.324159, + "city": "Bledsoe", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40813, + "latitude": 36.714629, + "longitude": -83.64046, + "city": "Calvin", + "state": "KY", + "county": "Bell" + }, + { + "zip_code": 40815, + "latitude": 36.781218, + "longitude": -83.291362, + "city": "Cawood", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40816, + "latitude": 37.009799, + "longitude": -83.349418, + "city": "Chappell", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 40818, + "latitude": 36.789038, + "longitude": -83.264806, + "city": "Coalgood", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40819, + "latitude": 36.820072, + "longitude": -83.470712, + "city": "Coldiron", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40820, + "latitude": 36.847188, + "longitude": -83.170137, + "city": "Cranks", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40823, + "latitude": 36.912209, + "longitude": -83.163759, + "city": "Cumberland", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40824, + "latitude": 36.835555, + "longitude": -83.375307, + "city": "Dayhoit", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40826, + "latitude": 37.043638, + "longitude": -82.809267, + "city": "Eolia", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 40827, + "latitude": 37.054676, + "longitude": -83.456094, + "city": "Essie", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 40828, + "latitude": 36.839806, + "longitude": -83.223251, + "city": "Evarts", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40829, + "latitude": 36.797447, + "longitude": -83.264497, + "city": "Grays Knob", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40830, + "latitude": 36.77011, + "longitude": -83.330675, + "city": "Gulston", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40831, + "latitude": 36.861519, + "longitude": -83.203025, + "city": "Harlan", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40840, + "latitude": 36.954292, + "longitude": -83.431346, + "city": "Helton", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 40843, + "latitude": 36.876106, + "longitude": -82.988157, + "city": "Holmes Mill", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40844, + "latitude": 37.070198, + "longitude": -83.424395, + "city": "Hoskinston", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 40845, + "latitude": 36.769184, + "longitude": -83.708181, + "city": "Hulen", + "state": "KY", + "county": "Bell" + }, + { + "zip_code": 40847, + "latitude": 36.87338, + "longitude": -83.145061, + "city": "Kenvir", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40849, + "latitude": 36.889879, + "longitude": -83.14331, + "city": "Lejunior", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40854, + "latitude": 36.848097, + "longitude": -83.353034, + "city": "Loyall", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40855, + "latitude": 36.960303, + "longitude": -82.919767, + "city": "Lynch", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40856, + "latitude": 36.769184, + "longitude": -83.708181, + "city": "Miracle", + "state": "KY", + "county": "Bell" + }, + { + "zip_code": 40858, + "latitude": 36.998854, + "longitude": -83.394253, + "city": "Mozelle", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 40862, + "latitude": 37.012888, + "longitude": -82.879541, + "city": "Partridge", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 40863, + "latitude": 36.74962, + "longitude": -83.45935, + "city": "Pathfork", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40865, + "latitude": 36.903881, + "longitude": -83.238139, + "city": "Putney", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40868, + "latitude": 37.08308, + "longitude": -83.419745, + "city": "Stinnett", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 40870, + "latitude": 36.932991, + "longitude": -83.161655, + "city": "Totz", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40873, + "latitude": 36.817164, + "longitude": -83.419056, + "city": "Wallins Creek", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40874, + "latitude": 36.98397, + "longitude": -83.466672, + "city": "Warbranch", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 40902, + "latitude": 36.769184, + "longitude": -83.708181, + "city": "Arjay", + "state": "KY", + "county": "Bell" + }, + { + "zip_code": 40903, + "latitude": 36.839539, + "longitude": -83.850573, + "city": "Artemus", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40906, + "latitude": 36.810109, + "longitude": -83.894888, + "city": "Barbourville", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40913, + "latitude": 36.769184, + "longitude": -83.708181, + "city": "Beverly", + "state": "KY", + "county": "Bell" + }, + { + "zip_code": 40914, + "latitude": 37.147687, + "longitude": -83.737014, + "city": "Big Creek", + "state": "KY", + "county": "Clay" + }, + { + "zip_code": 40915, + "latitude": 36.908172, + "longitude": -83.789161, + "city": "Bimble", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40921, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Bryants Store", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40923, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Cannon", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40927, + "latitude": 36.88452, + "longitude": -83.030287, + "city": "Closplint", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40930, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Dewitt", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40931, + "latitude": 37.147687, + "longitude": -83.737014, + "city": "Eriline", + "state": "KY", + "county": "Clay" + }, + { + "zip_code": 40932, + "latitude": 37.147687, + "longitude": -83.737014, + "city": "Fall Rock", + "state": "KY", + "county": "Clay" + }, + { + "zip_code": 40935, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Flat Lick", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40939, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Fourmile", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40940, + "latitude": 36.769184, + "longitude": -83.708181, + "city": "Frakes", + "state": "KY", + "county": "Bell" + }, + { + "zip_code": 40941, + "latitude": 37.147687, + "longitude": -83.737014, + "city": "Garrard", + "state": "KY", + "county": "Clay" + }, + { + "zip_code": 40943, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Girdler", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40944, + "latitude": 37.147687, + "longitude": -83.737014, + "city": "Goose Rock", + "state": "KY", + "county": "Clay" + }, + { + "zip_code": 40946, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Green Road", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40949, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Heidrick", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40951, + "latitude": 37.147687, + "longitude": -83.737014, + "city": "Hima", + "state": "KY", + "county": "Clay" + }, + { + "zip_code": 40953, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Hinkle", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40955, + "latitude": 36.769184, + "longitude": -83.708181, + "city": "Ingram", + "state": "KY", + "county": "Bell" + }, + { + "zip_code": 40958, + "latitude": 36.769184, + "longitude": -83.708181, + "city": "Kettle Island", + "state": "KY", + "county": "Bell" + }, + { + "zip_code": 40962, + "latitude": 37.151101, + "longitude": -83.779273, + "city": "Manchester", + "state": "KY", + "county": "Clay" + }, + { + "zip_code": 40964, + "latitude": 36.842977, + "longitude": -83.183446, + "city": "Mary Alice", + "state": "KY", + "county": "Harlan" + }, + { + "zip_code": 40965, + "latitude": 36.669566, + "longitude": -83.693159, + "city": "Middlesboro", + "state": "KY", + "county": "Bell" + }, + { + "zip_code": 40972, + "latitude": 37.147687, + "longitude": -83.737014, + "city": "Oneida", + "state": "KY", + "county": "Clay" + }, + { + "zip_code": 40977, + "latitude": 36.715863, + "longitude": -83.766776, + "city": "Pineville", + "state": "KY", + "county": "Bell" + }, + { + "zip_code": 40979, + "latitude": 37.043772, + "longitude": -83.494862, + "city": "Roark", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 40981, + "latitude": 37.331259, + "longitude": -83.386991, + "city": "Saul", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 40982, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Scalf", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40983, + "latitude": 37.147687, + "longitude": -83.737014, + "city": "Sextons Creek", + "state": "KY", + "county": "Clay" + }, + { + "zip_code": 40988, + "latitude": 36.769184, + "longitude": -83.708181, + "city": "Stoney Fork", + "state": "KY", + "county": "Bell" + }, + { + "zip_code": 40995, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Trosper", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40997, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Walker", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 40999, + "latitude": 36.871254, + "longitude": -83.829985, + "city": "Woollum", + "state": "KY", + "county": "Knox" + }, + { + "zip_code": 41001, + "latitude": 38.921584, + "longitude": -84.374584, + "city": "Alexandria", + "state": "KY", + "county": "Campbell" + }, + { + "zip_code": 41002, + "latitude": 38.72342, + "longitude": -83.982911, + "city": "Augusta", + "state": "KY", + "county": "Bracken" + }, + { + "zip_code": 41003, + "latitude": 38.442076, + "longitude": -84.347201, + "city": "Berry", + "state": "KY", + "county": "Harrison" + }, + { + "zip_code": 41004, + "latitude": 38.638654, + "longitude": -84.093504, + "city": "Brooksville", + "state": "KY", + "county": "Bracken" + }, + { + "zip_code": 41005, + "latitude": 39.015027, + "longitude": -84.773564, + "city": "Burlington", + "state": "KY", + "county": "Boone" + }, + { + "zip_code": 41006, + "latitude": 38.739446, + "longitude": -84.392841, + "city": "Butler", + "state": "KY", + "county": "Pendleton" + }, + { + "zip_code": 41007, + "latitude": 38.905563, + "longitude": -84.317079, + "city": "California", + "state": "KY", + "county": "Campbell" + }, + { + "zip_code": 41008, + "latitude": 38.663866, + "longitude": -85.098906, + "city": "Carrollton", + "state": "KY", + "county": "Carroll" + }, + { + "zip_code": 41010, + "latitude": 38.552305, + "longitude": -84.611567, + "city": "Corinth", + "state": "KY", + "county": "Grant" + }, + { + "zip_code": 41011, + "latitude": 39.05906, + "longitude": -84.542748, + "city": "Covington", + "state": "KY", + "county": "Kenton" + }, + { + "zip_code": 41012, + "latitude": 38.944663, + "longitude": -84.520501, + "city": "Covington", + "state": "KY", + "county": "Kenton" + }, + { + "zip_code": 41014, + "latitude": 39.064211, + "longitude": -84.511793, + "city": "Covington", + "state": "KY", + "county": "Kenton" + }, + { + "zip_code": 41015, + "latitude": 38.94711, + "longitude": -84.490048, + "city": "Latonia", + "state": "KY", + "county": "Kenton" + }, + { + "zip_code": 41016, + "latitude": 39.082839, + "longitude": -84.574749, + "city": "Covington", + "state": "KY", + "county": "Kenton" + }, + { + "zip_code": 41017, + "latitude": 39.029983, + "longitude": -84.55902, + "city": "Ft Mitchell", + "state": "KY", + "county": "Kenton" + }, + { + "zip_code": 41018, + "latitude": 39.019684, + "longitude": -84.591389, + "city": "Erlanger", + "state": "KY", + "county": "Kenton" + }, + { + "zip_code": 41019, + "latitude": 38.944663, + "longitude": -84.520501, + "city": "Covington", + "state": "KY", + "county": "Kenton" + }, + { + "zip_code": 41022, + "latitude": 38.962372, + "longitude": -84.747789, + "city": "Florence", + "state": "KY", + "county": "Boone" + }, + { + "zip_code": 41030, + "latitude": 38.770542, + "longitude": -84.597256, + "city": "Crittenden", + "state": "KY", + "county": "Grant" + }, + { + "zip_code": 41031, + "latitude": 38.356954, + "longitude": -84.323033, + "city": "Cynthiana", + "state": "KY", + "county": "Harrison" + }, + { + "zip_code": 41033, + "latitude": 38.762312, + "longitude": -84.485907, + "city": "De Mossville", + "state": "KY", + "county": "Pendleton" + }, + { + "zip_code": 41034, + "latitude": 38.707093, + "longitude": -83.904101, + "city": "Dover", + "state": "KY", + "county": "Mason" + }, + { + "zip_code": 41035, + "latitude": 38.691789, + "longitude": -84.650966, + "city": "Dry Ridge", + "state": "KY", + "county": "Grant" + }, + { + "zip_code": 41037, + "latitude": 38.3481, + "longitude": -83.718626, + "city": "Elizaville", + "state": "KY", + "county": "Fleming" + }, + { + "zip_code": 41039, + "latitude": 38.3481, + "longitude": -83.718626, + "city": "Ewing", + "state": "KY", + "county": "Fleming" + }, + { + "zip_code": 41040, + "latitude": 38.637848, + "longitude": -84.318142, + "city": "Falmouth", + "state": "KY", + "county": "Pendleton" + }, + { + "zip_code": 41041, + "latitude": 38.438363, + "longitude": -83.732284, + "city": "Flemingsburg", + "state": "KY", + "county": "Fleming" + }, + { + "zip_code": 41042, + "latitude": 38.989548, + "longitude": -84.656711, + "city": "Florence", + "state": "KY", + "county": "Boone" + }, + { + "zip_code": 41043, + "latitude": 38.766691, + "longitude": -84.171226, + "city": "Foster", + "state": "KY", + "county": "Bracken" + }, + { + "zip_code": 41044, + "latitude": 38.635744, + "longitude": -83.989965, + "city": "Germantown", + "state": "KY", + "county": "Bracken" + }, + { + "zip_code": 41045, + "latitude": 38.715638, + "longitude": -85.047073, + "city": "Ghent", + "state": "KY", + "county": "Carroll" + }, + { + "zip_code": 41046, + "latitude": 38.732647, + "longitude": -84.805495, + "city": "Glencoe", + "state": "KY", + "county": "Gallatin" + }, + { + "zip_code": 41048, + "latitude": 39.086656, + "longitude": -84.712389, + "city": "Hebron", + "state": "KY", + "county": "Boone" + }, + { + "zip_code": 41049, + "latitude": 38.237176, + "longitude": -83.584351, + "city": "Hillsboro", + "state": "KY", + "county": "Fleming" + }, + { + "zip_code": 41051, + "latitude": 38.923041, + "longitude": -84.54745, + "city": "Independence", + "state": "KY", + "county": "Kenton" + }, + { + "zip_code": 41052, + "latitude": 38.658689, + "longitude": -84.750673, + "city": "Jonesville", + "state": "KY", + "county": "Grant" + }, + { + "zip_code": 41053, + "latitude": 38.944663, + "longitude": -84.520501, + "city": "Kenton", + "state": "KY", + "county": "Kenton" + }, + { + "zip_code": 41054, + "latitude": 38.593226, + "longitude": -84.578552, + "city": "Mason", + "state": "KY", + "county": "Grant" + }, + { + "zip_code": 41055, + "latitude": 38.522012, + "longitude": -83.860969, + "city": "Mayslick", + "state": "KY", + "county": "Mason" + }, + { + "zip_code": 41056, + "latitude": 38.620653, + "longitude": -83.806657, + "city": "Maysville", + "state": "KY", + "county": "Mason" + }, + { + "zip_code": 41059, + "latitude": 39.003401, + "longitude": -84.35698, + "city": "Melbourne", + "state": "KY", + "county": "Campbell" + }, + { + "zip_code": 41061, + "latitude": 38.688556, + "longitude": -84.070074, + "city": "Milford", + "state": "KY", + "county": "Bracken" + }, + { + "zip_code": 41062, + "latitude": 38.719573, + "longitude": -83.910276, + "city": "Minerva", + "state": "KY", + "county": "Mason" + }, + { + "zip_code": 41063, + "latitude": 38.866297, + "longitude": -84.517548, + "city": "Morning View", + "state": "KY", + "county": "Kenton" + }, + { + "zip_code": 41064, + "latitude": 38.531698, + "longitude": -84.035565, + "city": "Mount Olivet", + "state": "KY", + "county": "Robertson" + }, + { + "zip_code": 41065, + "latitude": 38.3481, + "longitude": -83.718626, + "city": "Muses Mills", + "state": "KY", + "county": "Fleming" + }, + { + "zip_code": 41071, + "latitude": 39.056261, + "longitude": -84.478742, + "city": "Newport", + "state": "KY", + "county": "Campbell" + }, + { + "zip_code": 41072, + "latitude": 38.963761, + "longitude": -84.368926, + "city": "Newport", + "state": "KY", + "county": "Campbell" + }, + { + "zip_code": 41073, + "latitude": 39.10441, + "longitude": -84.473642, + "city": "Bellevue", + "state": "KY", + "county": "Campbell" + }, + { + "zip_code": 41074, + "latitude": 39.057835, + "longitude": -84.396404, + "city": "Dayton", + "state": "KY", + "county": "Campbell" + }, + { + "zip_code": 41075, + "latitude": 39.080411, + "longitude": -84.453991, + "city": "Fort Thomas", + "state": "KY", + "county": "Campbell" + }, + { + "zip_code": 41076, + "latitude": 39.029015, + "longitude": -84.440757, + "city": "Newport", + "state": "KY", + "county": "Campbell" + }, + { + "zip_code": 41080, + "latitude": 39.039096, + "longitude": -84.837832, + "city": "Petersburg", + "state": "KY", + "county": "Boone" + }, + { + "zip_code": 41081, + "latitude": 38.3481, + "longitude": -83.718626, + "city": "Plummers Landing", + "state": "KY", + "county": "Fleming" + }, + { + "zip_code": 41083, + "latitude": 38.660372, + "longitude": -85.005783, + "city": "Sanders", + "state": "KY", + "county": "Carroll" + }, + { + "zip_code": 41085, + "latitude": 39.034045, + "longitude": -84.388143, + "city": "Silver Grove", + "state": "KY", + "county": "Campbell" + }, + { + "zip_code": 41086, + "latitude": 38.731246, + "longitude": -84.895823, + "city": "Sparta", + "state": "KY", + "county": "Gallatin" + }, + { + "zip_code": 41091, + "latitude": 38.921583, + "longitude": -84.746057, + "city": "Union", + "state": "KY", + "county": "Boone" + }, + { + "zip_code": 41092, + "latitude": 38.824585, + "longitude": -84.692136, + "city": "Verona", + "state": "KY", + "county": "Boone" + }, + { + "zip_code": 41093, + "latitude": 38.3481, + "longitude": -83.718626, + "city": "Wallingford", + "state": "KY", + "county": "Fleming" + }, + { + "zip_code": 41094, + "latitude": 38.88142, + "longitude": -84.665597, + "city": "Walton", + "state": "KY", + "county": "Boone" + }, + { + "zip_code": 41095, + "latitude": 38.762505, + "longitude": -84.877785, + "city": "Warsaw", + "state": "KY", + "county": "Gallatin" + }, + { + "zip_code": 41096, + "latitude": 38.61225, + "longitude": -83.808021, + "city": "Washington", + "state": "KY", + "county": "Mason" + }, + { + "zip_code": 41097, + "latitude": 38.654385, + "longitude": -84.603041, + "city": "Williamstown", + "state": "KY", + "county": "Grant" + }, + { + "zip_code": 41098, + "latitude": 38.637181, + "longitude": -85.047765, + "city": "Worthville", + "state": "KY", + "county": "Carroll" + }, + { + "zip_code": 41099, + "latitude": 38.963761, + "longitude": -84.368926, + "city": "Newport", + "state": "KY", + "county": "Campbell" + }, + { + "zip_code": 41101, + "latitude": 38.43296, + "longitude": -82.693914, + "city": "Ashland", + "state": "KY", + "county": "Boyd" + }, + { + "zip_code": 41102, + "latitude": 38.421818, + "longitude": -82.717284, + "city": "Ashland", + "state": "KY", + "county": "Boyd" + }, + { + "zip_code": 41105, + "latitude": 38.370285, + "longitude": -82.694757, + "city": "Ashland", + "state": "KY", + "county": "Boyd" + }, + { + "zip_code": 41114, + "latitude": 38.370285, + "longitude": -82.694757, + "city": "Ashland", + "state": "KY", + "county": "Boyd" + }, + { + "zip_code": 41121, + "latitude": 38.511714, + "longitude": -82.872362, + "city": "Argillite", + "state": "KY", + "county": "Greenup" + }, + { + "zip_code": 41124, + "latitude": 38.074113, + "longitude": -82.744663, + "city": "Blaine", + "state": "KY", + "county": "Lawrence" + }, + { + "zip_code": 41127, + "latitude": 38.602881, + "longitude": -83.361625, + "city": "Camp Dix", + "state": "KY", + "county": "Lewis" + }, + { + "zip_code": 41128, + "latitude": 38.433912, + "longitude": -83.133597, + "city": "Carter", + "state": "KY", + "county": "Carter" + }, + { + "zip_code": 41129, + "latitude": 38.349127, + "longitude": -82.649833, + "city": "Catlettsburg", + "state": "KY", + "county": "Boyd" + }, + { + "zip_code": 41132, + "latitude": 38.259701, + "longitude": -82.856231, + "city": "Denton", + "state": "KY", + "county": "Carter" + }, + { + "zip_code": 41135, + "latitude": 38.521926, + "longitude": -83.335329, + "city": "Emerson", + "state": "KY", + "county": "Lewis" + }, + { + "zip_code": 41137, + "latitude": 38.521926, + "longitude": -83.335329, + "city": "Firebrick", + "state": "KY", + "county": "Lewis" + }, + { + "zip_code": 41139, + "latitude": 38.50316, + "longitude": -82.728176, + "city": "Flatwoods", + "state": "KY", + "county": "Greenup" + }, + { + "zip_code": 41141, + "latitude": 38.521926, + "longitude": -83.335329, + "city": "Garrison", + "state": "KY", + "county": "Lewis" + }, + { + "zip_code": 41142, + "latitude": 38.28974, + "longitude": -83.081077, + "city": "Grahn", + "state": "KY", + "county": "Carter" + }, + { + "zip_code": 41143, + "latitude": 38.324893, + "longitude": -83.000742, + "city": "Grayson", + "state": "KY", + "county": "Carter" + }, + { + "zip_code": 41144, + "latitude": 38.617863, + "longitude": -82.839401, + "city": "Greenup", + "state": "KY", + "county": "Greenup" + }, + { + "zip_code": 41146, + "latitude": 38.271432, + "longitude": -83.061941, + "city": "Hitchins", + "state": "KY", + "county": "Carter" + }, + { + "zip_code": 41149, + "latitude": 38.131568, + "longitude": -83.079708, + "city": "Isonville", + "state": "KY", + "county": "Elliott" + }, + { + "zip_code": 41150, + "latitude": 38.225087, + "longitude": -83.242129, + "city": "Jacobs", + "state": "KY", + "county": "Carter" + }, + { + "zip_code": 41156, + "latitude": 38.565211, + "longitude": -82.916586, + "city": "Lloyd", + "state": "KY", + "county": "Greenup" + }, + { + "zip_code": 41159, + "latitude": 38.074113, + "longitude": -82.744663, + "city": "Martha", + "state": "KY", + "county": "Lawrence" + }, + { + "zip_code": 41160, + "latitude": 38.074113, + "longitude": -82.744663, + "city": "Mazie", + "state": "KY", + "county": "Lawrence" + }, + { + "zip_code": 41164, + "latitude": 38.349219, + "longitude": -83.177987, + "city": "Olive Hill", + "state": "KY", + "county": "Carter" + }, + { + "zip_code": 41166, + "latitude": 38.521926, + "longitude": -83.335329, + "city": "Quincy", + "state": "KY", + "county": "Lewis" + }, + { + "zip_code": 41168, + "latitude": 38.30911, + "longitude": -82.717666, + "city": "Rush", + "state": "KY", + "county": "Boyd" + }, + { + "zip_code": 41169, + "latitude": 38.607408, + "longitude": -82.827053, + "city": "Russell", + "state": "KY", + "county": "Greenup" + }, + { + "zip_code": 41170, + "latitude": 38.521926, + "longitude": -83.335329, + "city": "Saint Paul", + "state": "KY", + "county": "Lewis" + }, + { + "zip_code": 41171, + "latitude": 38.131568, + "longitude": -83.079708, + "city": "Sandy Hook", + "state": "KY", + "county": "Elliott" + }, + { + "zip_code": 41173, + "latitude": 38.262029, + "longitude": -83.28472, + "city": "Soldier", + "state": "KY", + "county": "Carter" + }, + { + "zip_code": 41174, + "latitude": 38.565211, + "longitude": -82.916586, + "city": "South Portsmouth", + "state": "KY", + "county": "Greenup" + }, + { + "zip_code": 41175, + "latitude": 38.714809, + "longitude": -82.936626, + "city": "South Shore", + "state": "KY", + "county": "Greenup" + }, + { + "zip_code": 41179, + "latitude": 38.469945, + "longitude": -83.270248, + "city": "Vanceburg", + "state": "KY", + "county": "Lewis" + }, + { + "zip_code": 41180, + "latitude": 38.190296, + "longitude": -82.882533, + "city": "Webbville", + "state": "KY", + "county": "Lawrence" + }, + { + "zip_code": 41181, + "latitude": 38.204459, + "longitude": -82.907615, + "city": "Willard", + "state": "KY", + "county": "Carter" + }, + { + "zip_code": 41183, + "latitude": 38.546615, + "longitude": -82.727678, + "city": "Worthington", + "state": "KY", + "county": "Greenup" + }, + { + "zip_code": 41189, + "latitude": 38.521926, + "longitude": -83.335329, + "city": "Tollesboro", + "state": "KY", + "county": "Lewis" + }, + { + "zip_code": 41201, + "latitude": 38.074113, + "longitude": -82.744663, + "city": "Adams", + "state": "KY", + "county": "Lawrence" + }, + { + "zip_code": 41203, + "latitude": 37.761149, + "longitude": -82.622288, + "city": "Beauty", + "state": "KY", + "county": "Martin" + }, + { + "zip_code": 41204, + "latitude": 37.822653, + "longitude": -82.694671, + "city": "Boons Camp", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41214, + "latitude": 37.800137, + "longitude": -82.559438, + "city": "Debord", + "state": "KY", + "county": "Martin" + }, + { + "zip_code": 41215, + "latitude": 37.771963, + "longitude": -82.865092, + "city": "Denver", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41216, + "latitude": 37.757935, + "longitude": -82.818187, + "city": "East Point", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41219, + "latitude": 37.923134, + "longitude": -82.922077, + "city": "Flatgap", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41222, + "latitude": 37.780451, + "longitude": -82.841565, + "city": "Hagerhill", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41224, + "latitude": 37.8754, + "longitude": -82.533718, + "city": "Inez", + "state": "KY", + "county": "Martin" + }, + { + "zip_code": 41226, + "latitude": 37.973831, + "longitude": -82.966183, + "city": "Keaton", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41228, + "latitude": 37.739663, + "longitude": -82.865598, + "city": "Leander", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41230, + "latitude": 38.104327, + "longitude": -82.605591, + "city": "Louisa", + "state": "KY", + "county": "Lawrence" + }, + { + "zip_code": 41231, + "latitude": 37.815648, + "longitude": -82.492731, + "city": "Lovely", + "state": "KY", + "county": "Martin" + }, + { + "zip_code": 41232, + "latitude": 38.074113, + "longitude": -82.744663, + "city": "Lowmansville", + "state": "KY", + "county": "Lawrence" + }, + { + "zip_code": 41234, + "latitude": 37.807776, + "longitude": -82.741549, + "city": "Meally", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41238, + "latitude": 37.812772, + "longitude": -82.939108, + "city": "Oil Springs", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41240, + "latitude": 37.824167, + "longitude": -82.794504, + "city": "Paintsville", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41250, + "latitude": 37.815648, + "longitude": -82.492731, + "city": "Pilgrim", + "state": "KY", + "county": "Martin" + }, + { + "zip_code": 41254, + "latitude": 37.879486, + "longitude": -82.725052, + "city": "River", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41255, + "latitude": 37.920063, + "longitude": -82.832532, + "city": "Sitka", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41256, + "latitude": 37.825284, + "longitude": -82.882251, + "city": "Staffordsville", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41257, + "latitude": 37.916598, + "longitude": -82.803427, + "city": "Stambaugh", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41260, + "latitude": 37.810703, + "longitude": -82.766705, + "city": "Thelma", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41262, + "latitude": 37.825114, + "longitude": -82.645668, + "city": "Tomahawk", + "state": "KY", + "county": "Martin" + }, + { + "zip_code": 41263, + "latitude": 37.850698, + "longitude": -82.760226, + "city": "Tutor Key", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41264, + "latitude": 38.074113, + "longitude": -82.744663, + "city": "Ulysses", + "state": "KY", + "county": "Lawrence" + }, + { + "zip_code": 41265, + "latitude": 37.784196, + "longitude": -82.740121, + "city": "Van Lear", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41267, + "latitude": 37.815648, + "longitude": -82.492731, + "city": "Warfield", + "state": "KY", + "county": "Martin" + }, + { + "zip_code": 41268, + "latitude": 37.797057, + "longitude": -82.791012, + "city": "West Van Lear", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41271, + "latitude": 37.831277, + "longitude": -82.726407, + "city": "Williamsport", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41274, + "latitude": 37.899527, + "longitude": -82.781153, + "city": "Wittensville", + "state": "KY", + "county": "Johnson" + }, + { + "zip_code": 41301, + "latitude": 37.728737, + "longitude": -83.494029, + "city": "Campton", + "state": "KY", + "county": "Wolfe" + }, + { + "zip_code": 41307, + "latitude": 37.515013, + "longitude": -83.26432, + "city": "Athol", + "state": "KY", + "county": "Breathitt" + }, + { + "zip_code": 41310, + "latitude": 37.640513, + "longitude": -83.244088, + "city": "Bays", + "state": "KY", + "county": "Breathitt" + }, + { + "zip_code": 41311, + "latitude": 37.599904, + "longitude": -83.714013, + "city": "Beattyville", + "state": "KY", + "county": "Lee" + }, + { + "zip_code": 41313, + "latitude": 37.740503, + "longitude": -83.475446, + "city": "Bethany", + "state": "KY", + "county": "Wolfe" + }, + { + "zip_code": 41314, + "latitude": 37.496523, + "longitude": -83.657351, + "city": "Booneville", + "state": "KY", + "county": "Owsley" + }, + { + "zip_code": 41317, + "latitude": 37.462104, + "longitude": -83.235959, + "city": "Clayhole", + "state": "KY", + "county": "Breathitt" + }, + { + "zip_code": 41332, + "latitude": 37.798052, + "longitude": -83.420976, + "city": "Hazel Green", + "state": "KY", + "county": "Wolfe" + }, + { + "zip_code": 41333, + "latitude": 37.556255, + "longitude": -83.776253, + "city": "Heidelberg", + "state": "KY", + "county": "Lee" + }, + { + "zip_code": 41338, + "latitude": 37.398617, + "longitude": -83.704908, + "city": "Island City", + "state": "KY", + "county": "Owsley" + }, + { + "zip_code": 41339, + "latitude": 37.486809, + "longitude": -83.291331, + "city": "Jackson", + "state": "KY", + "county": "Breathitt" + }, + { + "zip_code": 41342, + "latitude": 37.740503, + "longitude": -83.475446, + "city": "Lee City", + "state": "KY", + "county": "Wolfe" + }, + { + "zip_code": 41344, + "latitude": 37.398617, + "longitude": -83.704908, + "city": "Lerose", + "state": "KY", + "county": "Owsley" + }, + { + "zip_code": 41347, + "latitude": 37.54418, + "longitude": -83.600784, + "city": "Lone", + "state": "KY", + "county": "Lee" + }, + { + "zip_code": 41348, + "latitude": 37.441782, + "longitude": -83.297614, + "city": "Lost Creek", + "state": "KY", + "county": "Breathitt" + }, + { + "zip_code": 41351, + "latitude": 37.398617, + "longitude": -83.704908, + "city": "Mistletoe", + "state": "KY", + "county": "Owsley" + }, + { + "zip_code": 41352, + "latitude": 37.914002, + "longitude": -83.233761, + "city": "Mize", + "state": "KY", + "county": "Morgan" + }, + { + "zip_code": 41360, + "latitude": 37.772774, + "longitude": -83.631377, + "city": "Pine Ridge", + "state": "KY", + "county": "Wolfe" + }, + { + "zip_code": 41362, + "latitude": 37.60332, + "longitude": -83.713974, + "city": "Primrose", + "state": "KY", + "county": "Lee" + }, + { + "zip_code": 41364, + "latitude": 37.387127, + "longitude": -83.675179, + "city": "Ricetown", + "state": "KY", + "county": "Owsley" + }, + { + "zip_code": 41365, + "latitude": 37.715699, + "longitude": -83.636349, + "city": "Rogers", + "state": "KY", + "county": "Wolfe" + }, + { + "zip_code": 41366, + "latitude": 37.593059, + "longitude": -83.287774, + "city": "Rousseau", + "state": "KY", + "county": "Breathitt" + }, + { + "zip_code": 41367, + "latitude": 37.397017, + "longitude": -83.226964, + "city": "Rowdy", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41368, + "latitude": 37.611684, + "longitude": -83.64341, + "city": "Saint Helens", + "state": "KY", + "county": "Lee" + }, + { + "zip_code": 41377, + "latitude": 37.417538, + "longitude": -83.444462, + "city": "Talbert", + "state": "KY", + "county": "Breathitt" + }, + { + "zip_code": 41385, + "latitude": 37.628827, + "longitude": -83.360738, + "city": "Vancleve", + "state": "KY", + "county": "Breathitt" + }, + { + "zip_code": 41386, + "latitude": 37.398617, + "longitude": -83.704908, + "city": "Vincent", + "state": "KY", + "county": "Owsley" + }, + { + "zip_code": 41390, + "latitude": 37.421929, + "longitude": -83.377999, + "city": "Whick", + "state": "KY", + "county": "Breathitt" + }, + { + "zip_code": 41397, + "latitude": 37.672317, + "longitude": -83.687173, + "city": "Zoe", + "state": "KY", + "county": "Lee" + }, + { + "zip_code": 41408, + "latitude": 37.914002, + "longitude": -83.233761, + "city": "Cannel City", + "state": "KY", + "county": "Morgan" + }, + { + "zip_code": 41410, + "latitude": 37.690636, + "longitude": -83.074592, + "city": "Cisco", + "state": "KY", + "county": "Magoffin" + }, + { + "zip_code": 41413, + "latitude": 37.970507, + "longitude": -83.125202, + "city": "Crockett", + "state": "KY", + "county": "Morgan" + }, + { + "zip_code": 41419, + "latitude": 37.690636, + "longitude": -83.074592, + "city": "Edna", + "state": "KY", + "county": "Magoffin" + }, + { + "zip_code": 41421, + "latitude": 37.970781, + "longitude": -83.11931, + "city": "Elkfork", + "state": "KY", + "county": "Morgan" + }, + { + "zip_code": 41422, + "latitude": 37.690636, + "longitude": -83.074592, + "city": "Elsie", + "state": "KY", + "county": "Magoffin" + }, + { + "zip_code": 41425, + "latitude": 37.914002, + "longitude": -83.233761, + "city": "Ezel", + "state": "KY", + "county": "Morgan" + }, + { + "zip_code": 41426, + "latitude": 37.784255, + "longitude": -83.010863, + "city": "Falcon", + "state": "KY", + "county": "Magoffin" + }, + { + "zip_code": 41433, + "latitude": 37.690636, + "longitude": -83.074592, + "city": "Gapville", + "state": "KY", + "county": "Magoffin" + }, + { + "zip_code": 41444, + "latitude": 37.690636, + "longitude": -83.074592, + "city": "Ivyton", + "state": "KY", + "county": "Magoffin" + }, + { + "zip_code": 41451, + "latitude": 37.914002, + "longitude": -83.233761, + "city": "Malone", + "state": "KY", + "county": "Morgan" + }, + { + "zip_code": 41459, + "latitude": 37.914002, + "longitude": -83.233761, + "city": "Ophir", + "state": "KY", + "county": "Morgan" + }, + { + "zip_code": 41464, + "latitude": 37.676288, + "longitude": -83.0225, + "city": "Royalton", + "state": "KY", + "county": "Magoffin" + }, + { + "zip_code": 41465, + "latitude": 37.732536, + "longitude": -83.029761, + "city": "Salyersville", + "state": "KY", + "county": "Magoffin" + }, + { + "zip_code": 41472, + "latitude": 37.97621, + "longitude": -83.198234, + "city": "West Liberty", + "state": "KY", + "county": "Morgan" + }, + { + "zip_code": 41477, + "latitude": 37.914002, + "longitude": -83.233761, + "city": "Wrigley", + "state": "KY", + "county": "Morgan" + }, + { + "zip_code": 41501, + "latitude": 37.482901, + "longitude": -82.447075, + "city": "Pikeville", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41502, + "latitude": 37.481637, + "longitude": -82.550507, + "city": "Pikeville", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41503, + "latitude": 37.48871, + "longitude": -82.310048, + "city": "South Williamson", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41512, + "latitude": 37.462655, + "longitude": -82.448017, + "city": "Ashcamp", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41513, + "latitude": 37.34781, + "longitude": -82.340599, + "city": "Belcher", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41514, + "latitude": 37.640727, + "longitude": -82.313128, + "city": "Belfry", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41517, + "latitude": 37.184477, + "longitude": -82.61109, + "city": "Burdine", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41519, + "latitude": 37.589934, + "longitude": -82.330826, + "city": "Canada", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41520, + "latitude": 37.279027, + "longitude": -82.57732, + "city": "Dorton", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41522, + "latitude": 37.42367, + "longitude": -82.384689, + "city": "Elkhorn City", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41524, + "latitude": 37.426582, + "longitude": -82.256227, + "city": "Fedscreek", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41526, + "latitude": 37.437194, + "longitude": -82.518527, + "city": "Fords Branch", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41527, + "latitude": 37.630682, + "longitude": -82.279522, + "city": "Forest Hills", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41528, + "latitude": 37.551774, + "longitude": -82.129733, + "city": "Freeburn", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41531, + "latitude": 37.649157, + "longitude": -82.264495, + "city": "Hardy", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41534, + "latitude": 37.281894, + "longitude": -82.480755, + "city": "Hellier", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41535, + "latitude": 37.606484, + "longitude": -82.288195, + "city": "Huddy", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41537, + "latitude": 37.191103, + "longitude": -82.651342, + "city": "Jenkins", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41538, + "latitude": 37.470577, + "longitude": -82.348837, + "city": "Jonancy", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41539, + "latitude": 37.411318, + "longitude": -82.330705, + "city": "Kimper", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41540, + "latitude": 37.359184, + "longitude": -82.309224, + "city": "Lick Creek", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41542, + "latitude": 37.314848, + "longitude": -82.464979, + "city": "Lookout", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41543, + "latitude": 37.562421, + "longitude": -82.280348, + "city": "Mc Andrews", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41544, + "latitude": 37.628873, + "longitude": -82.226783, + "city": "Mc Carr", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41546, + "latitude": 37.519774, + "longitude": -82.301252, + "city": "Mc Veigh", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41547, + "latitude": 37.531145, + "longitude": -82.091605, + "city": "Majestic", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41548, + "latitude": 37.395235, + "longitude": -82.348728, + "city": "Mouthcard", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41549, + "latitude": 37.470577, + "longitude": -82.348837, + "city": "Myra", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41553, + "latitude": 37.541435, + "longitude": -82.229946, + "city": "Phelps", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41554, + "latitude": 37.408938, + "longitude": -82.424168, + "city": "Phyllis", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41555, + "latitude": 37.546621, + "longitude": -82.262124, + "city": "Pinsonfork", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41557, + "latitude": 37.493468, + "longitude": -82.422135, + "city": "Raccoon", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41558, + "latitude": 37.542575, + "longitude": -82.208487, + "city": "Ransom", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41559, + "latitude": 37.370376, + "longitude": -82.407751, + "city": "Regina", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41560, + "latitude": 37.379875, + "longitude": -82.561632, + "city": "Robinson Creek", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41561, + "latitude": 37.33162, + "longitude": -82.462574, + "city": "Rockhouse", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41562, + "latitude": 37.40628, + "longitude": -82.467345, + "city": "Shelbiana", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41563, + "latitude": 37.231149, + "longitude": -82.528583, + "city": "Shelby Gap", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41564, + "latitude": 37.557911, + "longitude": -82.411486, + "city": "Sidney", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41566, + "latitude": 37.399777, + "longitude": -82.197771, + "city": "Steele", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41567, + "latitude": 37.580715, + "longitude": -82.27437, + "city": "Stone", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41568, + "latitude": 37.509279, + "longitude": -82.078363, + "city": "Stopover", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41569, + "latitude": 37.608343, + "longitude": -82.286675, + "city": "Toler", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41571, + "latitude": 37.621659, + "longitude": -82.507019, + "city": "Varney", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41572, + "latitude": 37.319685, + "longitude": -82.611355, + "city": "Virgie", + "state": "KY", + "county": "Pike" + }, + { + "zip_code": 41601, + "latitude": 37.479896, + "longitude": -82.6769, + "city": "Allen", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41602, + "latitude": 37.715759, + "longitude": -82.695892, + "city": "Auxier", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41603, + "latitude": 37.570682, + "longitude": -82.680631, + "city": "Banner", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41604, + "latitude": 37.377377, + "longitude": -82.686866, + "city": "Beaver", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41605, + "latitude": 37.54042, + "longitude": -82.701035, + "city": "Betsy Layne", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41606, + "latitude": 37.346493, + "longitude": -82.740255, + "city": "Bevinsville", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41607, + "latitude": 37.633196, + "longitude": -82.740742, + "city": "Blue River", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41612, + "latitude": 37.346545, + "longitude": -82.716529, + "city": "Bypro", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41615, + "latitude": 37.561699, + "longitude": -82.684788, + "city": "Dana", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41616, + "latitude": 37.576668, + "longitude": -82.870801, + "city": "David", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41619, + "latitude": 37.493261, + "longitude": -82.75754, + "city": "Drift", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41621, + "latitude": 37.624553, + "longitude": -82.722679, + "city": "Dwale", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41622, + "latitude": 37.512564, + "longitude": -82.818388, + "city": "Eastern", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41630, + "latitude": 37.472094, + "longitude": -82.834287, + "city": "Garrett", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41631, + "latitude": 37.457565, + "longitude": -82.664491, + "city": "Grethel", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41632, + "latitude": 37.589246, + "longitude": -82.945214, + "city": "Gunlock", + "state": "KY", + "county": "Magoffin" + }, + { + "zip_code": 41635, + "latitude": 37.580715, + "longitude": -82.677387, + "city": "Harold", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41636, + "latitude": 37.428614, + "longitude": -82.714841, + "city": "Hi Hat", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41640, + "latitude": 37.508668, + "longitude": -82.851807, + "city": "Hueysville", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41642, + "latitude": 37.469203, + "longitude": -82.677517, + "city": "Ivel", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41643, + "latitude": 37.470999, + "longitude": -82.829405, + "city": "Lackey", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41645, + "latitude": 37.586933, + "longitude": -82.797386, + "city": "Langley", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41647, + "latitude": 37.560801, + "longitude": -82.713723, + "city": "Mc Dowell", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41649, + "latitude": 37.600698, + "longitude": -82.78595, + "city": "Martin", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41650, + "latitude": 37.353614, + "longitude": -82.676257, + "city": "Melvin", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41651, + "latitude": 37.454849, + "longitude": -82.76464, + "city": "Minnie", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41653, + "latitude": 37.536748, + "longitude": -82.771139, + "city": "Prestonsburg", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41655, + "latitude": 37.568892, + "longitude": -82.762194, + "city": "Printer", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41659, + "latitude": 37.45838, + "longitude": -82.673213, + "city": "Stanville", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41660, + "latitude": 37.413736, + "longitude": -82.648485, + "city": "Teaberry", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41663, + "latitude": 37.572499, + "longitude": -82.645206, + "city": "Tram", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41666, + "latitude": 37.514783, + "longitude": -82.729805, + "city": "Wayland", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41667, + "latitude": 37.316961, + "longitude": -82.704127, + "city": "Weeksbury", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41669, + "latitude": 37.331441, + "longitude": -82.715606, + "city": "Wheelwright", + "state": "KY", + "county": "Floyd" + }, + { + "zip_code": 41701, + "latitude": 37.299666, + "longitude": -83.239904, + "city": "Hazard", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41702, + "latitude": 37.320076, + "longitude": -83.206495, + "city": "Hazard", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41712, + "latitude": 37.363778, + "longitude": -83.154594, + "city": "Ary", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41713, + "latitude": 37.22539, + "longitude": -83.273609, + "city": "Avawam", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41714, + "latitude": 37.193912, + "longitude": -83.503508, + "city": "Bear Branch", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 41719, + "latitude": 37.310308, + "longitude": -83.309013, + "city": "Bonnyman", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41721, + "latitude": 37.302001, + "longitude": -83.47173, + "city": "Buckhorn", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41722, + "latitude": 37.315033, + "longitude": -83.156088, + "city": "Bulan", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41723, + "latitude": 37.277522, + "longitude": -83.238897, + "city": "Busy", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41725, + "latitude": 37.318236, + "longitude": -83.068963, + "city": "Carrie", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41727, + "latitude": 37.277764, + "longitude": -83.262663, + "city": "Chavies", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41729, + "latitude": 37.264854, + "longitude": -83.217443, + "city": "Combs", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41730, + "latitude": 37.258617, + "longitude": -83.395648, + "city": "Confluence", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 41731, + "latitude": 37.1408, + "longitude": -83.088916, + "city": "Cornettsville", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41735, + "latitude": 37.033615, + "longitude": -83.096311, + "city": "Delphia", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41736, + "latitude": 37.375823, + "longitude": -83.241868, + "city": "Dice", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41739, + "latitude": 37.339408, + "longitude": -83.130273, + "city": "Dwarf", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41740, + "latitude": 37.349857, + "longitude": -83.047116, + "city": "Emmalena", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41743, + "latitude": 37.30636, + "longitude": -83.090441, + "city": "Fisty", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41745, + "latitude": 37.349687, + "longitude": -83.436773, + "city": "Gays Creek", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41746, + "latitude": 37.210078, + "longitude": -83.091716, + "city": "Happy", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41747, + "latitude": 37.300202, + "longitude": -83.122477, + "city": "Hardburly", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41749, + "latitude": 37.187746, + "longitude": -83.416902, + "city": "Hyden", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 41751, + "latitude": 37.218395, + "longitude": -83.142655, + "city": "Jeff", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41754, + "latitude": 37.347409, + "longitude": -83.275015, + "city": "Krypton", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41759, + "latitude": 37.231962, + "longitude": -83.02461, + "city": "Sassafras", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41760, + "latitude": 37.197107, + "longitude": -83.081735, + "city": "Scuddy", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41762, + "latitude": 37.218801, + "longitude": -83.506407, + "city": "Sizerock", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 41763, + "latitude": 37.070492, + "longitude": -83.113638, + "city": "Slemp", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41764, + "latitude": 37.121424, + "longitude": -83.253867, + "city": "Smilax", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 41766, + "latitude": 37.158641, + "longitude": -83.384749, + "city": "Thousandsticks", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 41772, + "latitude": 37.407264, + "longitude": -83.01531, + "city": "Vest", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41773, + "latitude": 37.201968, + "longitude": -83.065816, + "city": "Vicco", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41774, + "latitude": 37.24369, + "longitude": -83.13639, + "city": "Viper", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41775, + "latitude": 37.107867, + "longitude": -83.356305, + "city": "Wendover", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 41776, + "latitude": 37.126066, + "longitude": -83.267303, + "city": "Wooton", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 41777, + "latitude": 37.056529, + "longitude": -83.236134, + "city": "Yeaddiss", + "state": "KY", + "county": "Leslie" + }, + { + "zip_code": 41778, + "latitude": 37.283017, + "longitude": -83.321215, + "city": "Yerkes", + "state": "KY", + "county": "Perry" + }, + { + "zip_code": 41804, + "latitude": 37.155055, + "longitude": -82.995605, + "city": "Blackey", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41810, + "latitude": 37.178814, + "longitude": -82.69498, + "city": "Cromona", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41812, + "latitude": 37.240912, + "longitude": -82.769564, + "city": "Deane", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41815, + "latitude": 37.140336, + "longitude": -82.814691, + "city": "Ermine", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41817, + "latitude": 37.367552, + "longitude": -82.910653, + "city": "Garner", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41819, + "latitude": 36.989061, + "longitude": -83.065458, + "city": "Gordon", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41821, + "latitude": 37.083683, + "longitude": -83.002662, + "city": "Hallie", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41822, + "latitude": 37.367278, + "longitude": -82.961977, + "city": "Hindman", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41824, + "latitude": 37.193211, + "longitude": -82.875397, + "city": "Isom", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41825, + "latitude": 37.224615, + "longitude": -82.722772, + "city": "Jackhorn", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41826, + "latitude": 37.135577, + "longitude": -82.837148, + "city": "Jeremiah", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41828, + "latitude": 37.313565, + "longitude": -82.797478, + "city": "Kite", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41831, + "latitude": 37.370519, + "longitude": -82.967672, + "city": "Leburn", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41832, + "latitude": 37.153075, + "longitude": -82.954758, + "city": "Letcher", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41833, + "latitude": 37.023328, + "longitude": -82.987812, + "city": "Linefork", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41834, + "latitude": 37.275003, + "longitude": -82.944607, + "city": "Littcarr", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41835, + "latitude": 37.213652, + "longitude": -82.673426, + "city": "Mc Roberts", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41836, + "latitude": 37.269218, + "longitude": -82.91613, + "city": "Mallie", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41837, + "latitude": 37.130234, + "longitude": -82.742726, + "city": "Mayking", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41838, + "latitude": 37.176559, + "longitude": -82.751669, + "city": "Millstone", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41839, + "latitude": 37.419099, + "longitude": -82.885808, + "city": "Mousie", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41840, + "latitude": 37.187588, + "longitude": -82.711046, + "city": "Neon", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41843, + "latitude": 37.28679, + "longitude": -82.874059, + "city": "Pine Top", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41844, + "latitude": 37.349054, + "longitude": -82.874239, + "city": "Pippa Passes", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41845, + "latitude": 37.125231, + "longitude": -82.903459, + "city": "Premium", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41847, + "latitude": 37.217206, + "longitude": -82.942357, + "city": "Redfox", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41848, + "latitude": 37.110216, + "longitude": -82.94073, + "city": "Roxana", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41849, + "latitude": 37.173926, + "longitude": -82.716166, + "city": "Seco", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41855, + "latitude": 37.178608, + "longitude": -82.795137, + "city": "Thornton", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41858, + "latitude": 37.13885, + "longitude": -82.855032, + "city": "Whitesburg", + "state": "KY", + "county": "Letcher" + }, + { + "zip_code": 41859, + "latitude": 37.397578, + "longitude": -82.783552, + "city": "Dema", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41861, + "latitude": 37.387621, + "longitude": -82.836144, + "city": "Raven", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41862, + "latitude": 37.348498, + "longitude": -82.792578, + "city": "Topmost", + "state": "KY", + "county": "Knott" + }, + { + "zip_code": 41901, + "latitude": "", + "longitude": "", + "city": "Migrate", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 41902, + "latitude": "", + "longitude": "", + "city": "Migrate", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 41903, + "latitude": "", + "longitude": "", + "city": "Migrate", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 41904, + "latitude": "", + "longitude": "", + "city": "Migrate", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 41905, + "latitude": "", + "longitude": "", + "city": "Migrate", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 41906, + "latitude": "", + "longitude": "", + "city": "Migrate", + "state": "KY", + "county": "Fayette" + }, + { + "zip_code": 42001, + "latitude": 37.031586, + "longitude": -88.713292, + "city": "Paducah", + "state": "KY", + "county": "Mccracken" + }, + { + "zip_code": 42002, + "latitude": 37.085511, + "longitude": -88.71247, + "city": "Paducah", + "state": "KY", + "county": "Mccracken" + }, + { + "zip_code": 42003, + "latitude": 37.015159, + "longitude": -88.581289, + "city": "Paducah", + "state": "KY", + "county": "Mccracken" + }, + { + "zip_code": 42020, + "latitude": 36.690186, + "longitude": -88.283872, + "city": "Almo", + "state": "KY", + "county": "Calloway" + }, + { + "zip_code": 42021, + "latitude": 36.789033, + "longitude": -89.009178, + "city": "Arlington", + "state": "KY", + "county": "Carlisle" + }, + { + "zip_code": 42022, + "latitude": 37.148007, + "longitude": -88.948562, + "city": "Bandana", + "state": "KY", + "county": "Ballard" + }, + { + "zip_code": 42023, + "latitude": 36.87522, + "longitude": -89.006956, + "city": "Bardwell", + "state": "KY", + "county": "Carlisle" + }, + { + "zip_code": 42024, + "latitude": 37.081273, + "longitude": -89.01148, + "city": "Barlow", + "state": "KY", + "county": "Ballard" + }, + { + "zip_code": 42025, + "latitude": 36.888765, + "longitude": -88.305502, + "city": "Benton", + "state": "KY", + "county": "Marshall" + }, + { + "zip_code": 42027, + "latitude": 36.900149, + "longitude": -88.637039, + "city": "Boaz", + "state": "KY", + "county": "Graves" + }, + { + "zip_code": 42028, + "latitude": 37.155977, + "longitude": -88.339599, + "city": "Burna", + "state": "KY", + "county": "Livingston" + }, + { + "zip_code": 42029, + "latitude": 36.986553, + "longitude": -88.373197, + "city": "Calvert City", + "state": "KY", + "county": "Marshall" + }, + { + "zip_code": 42031, + "latitude": 36.680798, + "longitude": -88.979474, + "city": "Clinton", + "state": "KY", + "county": "Hickman" + }, + { + "zip_code": 42032, + "latitude": 36.732689, + "longitude": -89.1019, + "city": "Columbus", + "state": "KY", + "county": "Hickman" + }, + { + "zip_code": 42033, + "latitude": 37.336533, + "longitude": -88.079607, + "city": "Crayne", + "state": "KY", + "county": "Crittenden" + }, + { + "zip_code": 42035, + "latitude": 36.863147, + "longitude": -88.995991, + "city": "Cunningham", + "state": "KY", + "county": "Carlisle" + }, + { + "zip_code": 42036, + "latitude": 36.715535, + "longitude": -88.235991, + "city": "Dexter", + "state": "KY", + "county": "Calloway" + }, + { + "zip_code": 42037, + "latitude": 37.157866, + "longitude": -88.183598, + "city": "Dycusburg", + "state": "KY", + "county": "Crittenden" + }, + { + "zip_code": 42038, + "latitude": 37.044697, + "longitude": -88.024871, + "city": "Eddyville", + "state": "KY", + "county": "Lyon" + }, + { + "zip_code": 42039, + "latitude": 36.780953, + "longitude": -88.78873, + "city": "Fancy Farm", + "state": "KY", + "county": "Graves" + }, + { + "zip_code": 42040, + "latitude": 36.600013, + "longitude": -88.51864, + "city": "Farmington", + "state": "KY", + "county": "Graves" + }, + { + "zip_code": 42041, + "latitude": 36.546939, + "longitude": -89.081143, + "city": "Fulton", + "state": "KY", + "county": "Fulton" + }, + { + "zip_code": 42044, + "latitude": 36.965547, + "longitude": -88.266684, + "city": "Gilbertsville", + "state": "KY", + "county": "Marshall" + }, + { + "zip_code": 42045, + "latitude": 37.076174, + "longitude": -88.264746, + "city": "Grand Rivers", + "state": "KY", + "county": "Livingston" + }, + { + "zip_code": 42046, + "latitude": 36.6033, + "longitude": -88.092285, + "city": "Hamlin", + "state": "KY", + "county": "Calloway" + }, + { + "zip_code": 42047, + "latitude": 37.302521, + "longitude": -88.393763, + "city": "Hampton", + "state": "KY", + "county": "Livingston" + }, + { + "zip_code": 42048, + "latitude": 36.817672, + "longitude": -88.30444, + "city": "Hardin", + "state": "KY", + "county": "Marshall" + }, + { + "zip_code": 42049, + "latitude": 36.578831, + "longitude": -88.322336, + "city": "Hazel", + "state": "KY", + "county": "Calloway" + }, + { + "zip_code": 42050, + "latitude": 36.548671, + "longitude": -89.208001, + "city": "Hickman", + "state": "KY", + "county": "Fulton" + }, + { + "zip_code": 42051, + "latitude": 36.852197, + "longitude": -88.640928, + "city": "Hickory", + "state": "KY", + "county": "Graves" + }, + { + "zip_code": 42053, + "latitude": 37.098119, + "longitude": -88.851344, + "city": "Kevil", + "state": "KY", + "county": "Ballard" + }, + { + "zip_code": 42054, + "latitude": 36.699095, + "longitude": -88.421888, + "city": "Kirksey", + "state": "KY", + "county": "Calloway" + }, + { + "zip_code": 42055, + "latitude": 37.073525, + "longitude": -88.144971, + "city": "Kuttawa", + "state": "KY", + "county": "Lyon" + }, + { + "zip_code": 42056, + "latitude": 37.080505, + "longitude": -88.986278, + "city": "La Center", + "state": "KY", + "county": "Ballard" + }, + { + "zip_code": 42058, + "latitude": 37.061146, + "longitude": -88.466549, + "city": "Ledbetter", + "state": "KY", + "county": "Livingston" + }, + { + "zip_code": 42060, + "latitude": 36.96365, + "longitude": -88.836371, + "city": "Lovelaceville", + "state": "KY", + "county": "Ballard" + }, + { + "zip_code": 42061, + "latitude": 36.886172, + "longitude": -88.772824, + "city": "Lowes", + "state": "KY", + "county": "Graves" + }, + { + "zip_code": 42063, + "latitude": 36.723872, + "longitude": -88.652009, + "city": "Lynnville", + "state": "KY", + "county": "Graves" + }, + { + "zip_code": 42064, + "latitude": 37.322088, + "longitude": -88.087479, + "city": "Marion", + "state": "KY", + "county": "Crittenden" + }, + { + "zip_code": 42066, + "latitude": 36.715599, + "longitude": -88.651839, + "city": "Mayfield", + "state": "KY", + "county": "Graves" + }, + { + "zip_code": 42069, + "latitude": 36.904548, + "longitude": -88.758968, + "city": "Melber", + "state": "KY", + "county": "Graves" + }, + { + "zip_code": 42070, + "latitude": 36.863147, + "longitude": -88.995991, + "city": "Milburn", + "state": "KY", + "county": "Carlisle" + }, + { + "zip_code": 42071, + "latitude": 36.625349, + "longitude": -88.279562, + "city": "Murray", + "state": "KY", + "county": "Calloway" + }, + { + "zip_code": 42076, + "latitude": 36.562065, + "longitude": -88.150463, + "city": "New Concord", + "state": "KY", + "county": "Calloway" + }, + { + "zip_code": 42078, + "latitude": 37.269417, + "longitude": -88.329698, + "city": "Salem", + "state": "KY", + "county": "Livingston" + }, + { + "zip_code": 42079, + "latitude": 36.574835, + "longitude": -88.581458, + "city": "Sedalia", + "state": "KY", + "county": "Graves" + }, + { + "zip_code": 42081, + "latitude": 37.238666, + "longitude": -88.375665, + "city": "Smithland", + "state": "KY", + "county": "Livingston" + }, + { + "zip_code": 42082, + "latitude": 36.904412, + "longitude": -88.515287, + "city": "Symsonia", + "state": "KY", + "county": "Graves" + }, + { + "zip_code": 42083, + "latitude": 37.145668, + "longitude": -88.285031, + "city": "Tiline", + "state": "KY", + "county": "Livingston" + }, + { + "zip_code": 42084, + "latitude": 37.434913, + "longitude": -88.246148, + "city": "Tolu", + "state": "KY", + "county": "Crittenden" + }, + { + "zip_code": 42085, + "latitude": 36.572137, + "longitude": -88.761466, + "city": "Water Valley", + "state": "KY", + "county": "Graves" + }, + { + "zip_code": 42086, + "latitude": 37.082918, + "longitude": -88.810261, + "city": "West Paducah", + "state": "KY", + "county": "Mccracken" + }, + { + "zip_code": 42087, + "latitude": 37.056862, + "longitude": -88.961579, + "city": "Wickliffe", + "state": "KY", + "county": "Ballard" + }, + { + "zip_code": 42088, + "latitude": 36.60784, + "longitude": -88.725226, + "city": "Wingo", + "state": "KY", + "county": "Graves" + }, + { + "zip_code": 42101, + "latitude": 37.017407, + "longitude": -86.451752, + "city": "Bowling Green", + "state": "KY", + "county": "Warren" + }, + { + "zip_code": 42102, + "latitude": 36.922292, + "longitude": -86.387046, + "city": "Bowling Green", + "state": "KY", + "county": "Warren" + }, + { + "zip_code": 42103, + "latitude": 36.950002, + "longitude": -86.358413, + "city": "Bowling Green", + "state": "KY", + "county": "Warren" + }, + { + "zip_code": 42104, + "latitude": 36.887214, + "longitude": -86.453985, + "city": "Bowling Green", + "state": "KY", + "county": "Warren" + }, + { + "zip_code": 42120, + "latitude": 36.67931, + "longitude": -86.17603, + "city": "Adolphus", + "state": "KY", + "county": "Allen" + }, + { + "zip_code": 42122, + "latitude": 36.866699, + "longitude": -86.348542, + "city": "Alvaton", + "state": "KY", + "county": "Warren" + }, + { + "zip_code": 42123, + "latitude": 36.815869, + "longitude": -85.992039, + "city": "Austin", + "state": "KY", + "county": "Barren" + }, + { + "zip_code": 42124, + "latitude": 36.857666, + "longitude": -85.649583, + "city": "Beaumont", + "state": "KY", + "county": "Metcalfe" + }, + { + "zip_code": 42127, + "latitude": 37.10279, + "longitude": -85.908887, + "city": "Cave City", + "state": "KY", + "county": "Barren" + }, + { + "zip_code": 42128, + "latitude": 36.983441, + "longitude": -86.394012, + "city": "Drake", + "state": "KY", + "county": "Warren" + }, + { + "zip_code": 42129, + "latitude": 37.000783, + "longitude": -85.609522, + "city": "Edmonton", + "state": "KY", + "county": "Metcalfe" + }, + { + "zip_code": 42130, + "latitude": 36.91297, + "longitude": -85.775282, + "city": "Eighty Eight", + "state": "KY", + "county": "Barren" + }, + { + "zip_code": 42131, + "latitude": 36.819311, + "longitude": -85.91168, + "city": "Etoile", + "state": "KY", + "county": "Barren" + }, + { + "zip_code": 42133, + "latitude": 36.726089, + "longitude": -85.846991, + "city": "Fountain Run", + "state": "KY", + "county": "Monroe" + }, + { + "zip_code": 42134, + "latitude": 36.740598, + "longitude": -86.583305, + "city": "Franklin", + "state": "KY", + "county": "Simpson" + }, + { + "zip_code": 42135, + "latitude": 36.758166, + "longitude": -86.581957, + "city": "Franklin", + "state": "KY", + "county": "Simpson" + }, + { + "zip_code": 42140, + "latitude": 36.669398, + "longitude": -85.856306, + "city": "Gamaliel", + "state": "KY", + "county": "Monroe" + }, + { + "zip_code": 42141, + "latitude": 36.942763, + "longitude": -85.941203, + "city": "Glasgow", + "state": "KY", + "county": "Barren" + }, + { + "zip_code": 42142, + "latitude": 36.946326, + "longitude": -85.957797, + "city": "Glasgow", + "state": "KY", + "county": "Barren" + }, + { + "zip_code": 42150, + "latitude": 36.782131, + "longitude": -86.184088, + "city": "Halfway", + "state": "KY", + "county": "Allen" + }, + { + "zip_code": 42151, + "latitude": 36.647144, + "longitude": -85.567555, + "city": "Hestand", + "state": "KY", + "county": "Monroe" + }, + { + "zip_code": 42152, + "latitude": 37.098753, + "longitude": -85.816472, + "city": "Hiseville", + "state": "KY", + "county": "Barren" + }, + { + "zip_code": 42153, + "latitude": 36.678703, + "longitude": -86.038273, + "city": "Holland", + "state": "KY", + "county": "Allen" + }, + { + "zip_code": 42154, + "latitude": 37.055613, + "longitude": -85.698474, + "city": "Knob Lick", + "state": "KY", + "county": "Metcalfe" + }, + { + "zip_code": 42156, + "latitude": 36.840503, + "longitude": -85.995572, + "city": "Lucas", + "state": "KY", + "county": "Barren" + }, + { + "zip_code": 42157, + "latitude": 36.772341, + "longitude": -85.819518, + "city": "Mount Hermon", + "state": "KY", + "county": "Monroe" + }, + { + "zip_code": 42159, + "latitude": 36.998452, + "longitude": -86.250131, + "city": "Oakland", + "state": "KY", + "county": "Warren" + }, + { + "zip_code": 42160, + "latitude": 36.965149, + "longitude": -86.013864, + "city": "Park City", + "state": "KY", + "county": "Barren" + }, + { + "zip_code": 42163, + "latitude": 37.09425, + "longitude": -86.143188, + "city": "Rocky Hill", + "state": "KY", + "county": "Edmonson" + }, + { + "zip_code": 42164, + "latitude": 36.783817, + "longitude": -86.188104, + "city": "Scottsville", + "state": "KY", + "county": "Allen" + }, + { + "zip_code": 42166, + "latitude": 36.956935, + "longitude": -85.660577, + "city": "Summer Shade", + "state": "KY", + "county": "Metcalfe" + }, + { + "zip_code": 42167, + "latitude": 36.723634, + "longitude": -85.700865, + "city": "Tompkinsville", + "state": "KY", + "county": "Monroe" + }, + { + "zip_code": 42170, + "latitude": 36.90641, + "longitude": -86.538, + "city": "Woodburn", + "state": "KY", + "county": "Warren" + }, + { + "zip_code": 42171, + "latitude": 37.01823, + "longitude": -86.187045, + "city": "Smiths Grove", + "state": "KY", + "county": "Warren" + }, + { + "zip_code": 42201, + "latitude": 37.279564, + "longitude": -86.670181, + "city": "Aberdeen", + "state": "KY", + "county": "Butler" + }, + { + "zip_code": 42202, + "latitude": 36.772851, + "longitude": -86.860422, + "city": "Adairville", + "state": "KY", + "county": "Logan" + }, + { + "zip_code": 42203, + "latitude": 36.929243, + "longitude": -87.219328, + "city": "Allegre", + "state": "KY", + "county": "Todd" + }, + { + "zip_code": 42204, + "latitude": 36.720672, + "longitude": -87.104104, + "city": "Allensville", + "state": "KY", + "county": "Todd" + }, + { + "zip_code": 42206, + "latitude": 36.835067, + "longitude": -86.797432, + "city": "Auburn", + "state": "KY", + "county": "Logan" + }, + { + "zip_code": 42207, + "latitude": 37.300469, + "longitude": -86.25426, + "city": "Bee Spring", + "state": "KY", + "county": "Edmonson" + }, + { + "zip_code": 42209, + "latitude": 37.197491, + "longitude": -86.67216, + "city": "Brooklyn", + "state": "KY", + "county": "Butler" + }, + { + "zip_code": 42210, + "latitude": 37.222931, + "longitude": -86.292256, + "city": "Brownsville", + "state": "KY", + "county": "Edmonson" + }, + { + "zip_code": 42211, + "latitude": 36.80201, + "longitude": -87.828578, + "city": "Cadiz", + "state": "KY", + "county": "Trigg" + }, + { + "zip_code": 42214, + "latitude": 37.11767, + "longitude": -85.703791, + "city": "Center", + "state": "KY", + "county": "Metcalfe" + }, + { + "zip_code": 42215, + "latitude": 36.953435, + "longitude": -87.718377, + "city": "Cerulean", + "state": "KY", + "county": "Trigg" + }, + { + "zip_code": 42216, + "latitude": 37.004492, + "longitude": -87.152148, + "city": "Clifty", + "state": "KY", + "county": "Todd" + }, + { + "zip_code": 42217, + "latitude": 37.043116, + "longitude": -87.487724, + "city": "Crofton", + "state": "KY", + "county": "Christian" + }, + { + "zip_code": 42219, + "latitude": 37.170909, + "longitude": -86.767822, + "city": "Dunbar", + "state": "KY", + "county": "Butler" + }, + { + "zip_code": 42220, + "latitude": 36.862405, + "longitude": -87.177881, + "city": "Elkton", + "state": "KY", + "county": "Todd" + }, + { + "zip_code": 42221, + "latitude": 36.898071, + "longitude": -87.496529, + "city": "Fairview", + "state": "KY", + "county": "Christian" + }, + { + "zip_code": 42223, + "latitude": 36.657253, + "longitude": -87.458858, + "city": "Fort Campbell", + "state": "KY", + "county": "Christian" + }, + { + "zip_code": 42232, + "latitude": 36.918213, + "longitude": -87.580011, + "city": "Gracey", + "state": "KY", + "county": "Christian" + }, + { + "zip_code": 42234, + "latitude": 36.714895, + "longitude": -87.150248, + "city": "Guthrie", + "state": "KY", + "county": "Todd" + }, + { + "zip_code": 42235, + "latitude": 36.983441, + "longitude": -86.394012, + "city": "Hadley", + "state": "KY", + "county": "Warren" + }, + { + "zip_code": 42236, + "latitude": 36.719274, + "longitude": -87.604569, + "city": "Herndon", + "state": "KY", + "county": "Christian" + }, + { + "zip_code": 42240, + "latitude": 36.876568, + "longitude": -87.471106, + "city": "Hopkinsville", + "state": "KY", + "county": "Christian" + }, + { + "zip_code": 42241, + "latitude": 36.898071, + "longitude": -87.496529, + "city": "Hopkinsville", + "state": "KY", + "county": "Christian" + }, + { + "zip_code": 42251, + "latitude": 37.157967, + "longitude": -86.885846, + "city": "Huntsville", + "state": "KY", + "county": "Butler" + }, + { + "zip_code": 42252, + "latitude": 37.248326, + "longitude": -86.509271, + "city": "Jetson", + "state": "KY", + "county": "Butler" + }, + { + "zip_code": 42254, + "latitude": 36.677547, + "longitude": -87.645839, + "city": "La Fayette", + "state": "KY", + "county": "Christian" + }, + { + "zip_code": 42256, + "latitude": 36.907058, + "longitude": -86.918045, + "city": "Lewisburg", + "state": "KY", + "county": "Logan" + }, + { + "zip_code": 42257, + "latitude": 37.237211, + "longitude": -86.299361, + "city": "Lindseyville", + "state": "KY", + "county": "Edmonson" + }, + { + "zip_code": 42259, + "latitude": 37.280199, + "longitude": -86.168796, + "city": "Mammoth Cave", + "state": "KY", + "county": "Edmonson" + }, + { + "zip_code": 42261, + "latitude": 37.20017, + "longitude": -86.685898, + "city": "Morgantown", + "state": "KY", + "county": "Butler" + }, + { + "zip_code": 42262, + "latitude": 36.738092, + "longitude": -87.429302, + "city": "Oak Grove", + "state": "KY", + "county": "Christian" + }, + { + "zip_code": 42265, + "latitude": 36.759526, + "longitude": -86.980398, + "city": "Olmstead", + "state": "KY", + "county": "Logan" + }, + { + "zip_code": 42266, + "latitude": 36.864233, + "longitude": -87.409139, + "city": "Pembroke", + "state": "KY", + "county": "Christian" + }, + { + "zip_code": 42267, + "latitude": 37.229645, + "longitude": -86.804803, + "city": "Provo", + "state": "KY", + "county": "Butler" + }, + { + "zip_code": 42270, + "latitude": 36.983441, + "longitude": -86.394012, + "city": "Richardsville", + "state": "KY", + "county": "Warren" + }, + { + "zip_code": 42273, + "latitude": 37.207489, + "longitude": -86.859847, + "city": "Rochester", + "state": "KY", + "county": "Butler" + }, + { + "zip_code": 42274, + "latitude": 36.924137, + "longitude": -86.597869, + "city": "Rockfield", + "state": "KY", + "county": "Warren" + }, + { + "zip_code": 42275, + "latitude": 37.242474, + "longitude": -86.411435, + "city": "Roundhill", + "state": "KY", + "county": "Edmonson" + }, + { + "zip_code": 42276, + "latitude": 36.845273, + "longitude": -86.882321, + "city": "Russellville", + "state": "KY", + "county": "Logan" + }, + { + "zip_code": 42280, + "latitude": 36.948365, + "longitude": -87.1095, + "city": "Sharon Grove", + "state": "KY", + "county": "Todd" + }, + { + "zip_code": 42283, + "latitude": 36.869206, + "longitude": -86.663225, + "city": "South Union", + "state": "KY", + "county": "Logan" + }, + { + "zip_code": 42285, + "latitude": 37.236073, + "longitude": -86.27074, + "city": "Sweeden", + "state": "KY", + "county": "Edmonson" + }, + { + "zip_code": 42286, + "latitude": 36.74195, + "longitude": -87.24589, + "city": "Trenton", + "state": "KY", + "county": "Todd" + }, + { + "zip_code": 42287, + "latitude": 37.318319, + "longitude": -86.522996, + "city": "Welchs Creek", + "state": "KY", + "county": "Butler" + }, + { + "zip_code": 42288, + "latitude": 37.197491, + "longitude": -86.67216, + "city": "Woodbury", + "state": "KY", + "county": "Butler" + }, + { + "zip_code": 42301, + "latitude": 37.751818, + "longitude": -87.257303, + "city": "Owensboro", + "state": "KY", + "county": "Daviess" + }, + { + "zip_code": 42302, + "latitude": 37.745491, + "longitude": -87.112823, + "city": "Owensboro", + "state": "KY", + "county": "Daviess" + }, + { + "zip_code": 42303, + "latitude": 37.779387, + "longitude": -87.042939, + "city": "Owensboro", + "state": "KY", + "county": "Daviess" + }, + { + "zip_code": 42304, + "latitude": 37.745491, + "longitude": -87.112823, + "city": "Owensboro", + "state": "KY", + "county": "Daviess" + }, + { + "zip_code": 42320, + "latitude": 37.355569, + "longitude": -86.864676, + "city": "Beaver Dam", + "state": "KY", + "county": "Ohio" + }, + { + "zip_code": 42321, + "latitude": 37.153324, + "longitude": -87.024457, + "city": "Beech Creek", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42322, + "latitude": 37.615062, + "longitude": -87.406866, + "city": "Beech Grove", + "state": "KY", + "county": "Mclean" + }, + { + "zip_code": 42323, + "latitude": 37.233477, + "longitude": -87.076198, + "city": "Beechmont", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42324, + "latitude": 37.137789, + "longitude": -87.004852, + "city": "Belton", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42325, + "latitude": 37.337159, + "longitude": -87.271176, + "city": "Bremen", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42326, + "latitude": 37.199946, + "longitude": -87.00006, + "city": "Browder", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42327, + "latitude": 37.58095, + "longitude": -87.287491, + "city": "Calhoun", + "state": "KY", + "county": "Mclean" + }, + { + "zip_code": 42328, + "latitude": 37.394873, + "longitude": -87.026469, + "city": "Centertown", + "state": "KY", + "county": "Ohio" + }, + { + "zip_code": 42330, + "latitude": 37.243098, + "longitude": -87.111579, + "city": "Central City", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42332, + "latitude": 37.253342, + "longitude": -87.089689, + "city": "Cleaton", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42333, + "latitude": 37.373832, + "longitude": -86.764417, + "city": "Cromwell", + "state": "KY", + "county": "Ohio" + }, + { + "zip_code": 42334, + "latitude": 37.745491, + "longitude": -87.112823, + "city": "Curdsville", + "state": "KY", + "county": "Daviess" + }, + { + "zip_code": 42337, + "latitude": 37.211475, + "longitude": -87.008634, + "city": "Drakesboro", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42338, + "latitude": 37.552013, + "longitude": -86.77762, + "city": "Dundee", + "state": "KY", + "county": "Ohio" + }, + { + "zip_code": 42339, + "latitude": 37.194268, + "longitude": -87.018401, + "city": "Dunmor", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42343, + "latitude": 37.614496, + "longitude": -86.729497, + "city": "Fordsville", + "state": "KY", + "county": "Ohio" + }, + { + "zip_code": 42344, + "latitude": 37.246726, + "longitude": -87.297584, + "city": "Graham", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42345, + "latitude": 37.20083, + "longitude": -87.164385, + "city": "Greenville", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42347, + "latitude": 37.472545, + "longitude": -86.869715, + "city": "Hartford", + "state": "KY", + "county": "Ohio" + }, + { + "zip_code": 42348, + "latitude": 37.832151, + "longitude": -86.782723, + "city": "Hawesville", + "state": "KY", + "county": "Hancock" + }, + { + "zip_code": 42349, + "latitude": 37.415242, + "longitude": -86.689904, + "city": "Horse Branch", + "state": "KY", + "county": "Ohio" + }, + { + "zip_code": 42350, + "latitude": 37.459336, + "longitude": -87.206541, + "city": "Island", + "state": "KY", + "county": "Mclean" + }, + { + "zip_code": 42351, + "latitude": 37.911077, + "longitude": -86.882034, + "city": "Lewisport", + "state": "KY", + "county": "Hancock" + }, + { + "zip_code": 42352, + "latitude": 37.513281, + "longitude": -87.112413, + "city": "Livermore", + "state": "KY", + "county": "Mclean" + }, + { + "zip_code": 42354, + "latitude": 37.363601, + "longitude": -86.924358, + "city": "Mc Henry", + "state": "KY", + "county": "Ohio" + }, + { + "zip_code": 42355, + "latitude": 37.859021, + "longitude": -86.977249, + "city": "Maceo", + "state": "KY", + "county": "Daviess" + }, + { + "zip_code": 42356, + "latitude": 37.693229, + "longitude": -87.323841, + "city": "Maple Mount", + "state": "KY", + "county": "Daviess" + }, + { + "zip_code": 42361, + "latitude": 37.518118, + "longitude": -86.718192, + "city": "Olaton", + "state": "KY", + "county": "Ohio" + }, + { + "zip_code": 42364, + "latitude": 37.827235, + "longitude": -86.804814, + "city": "Pellville", + "state": "KY", + "county": "Hancock" + }, + { + "zip_code": 42365, + "latitude": 37.112633, + "longitude": -86.994053, + "city": "Penrod", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42366, + "latitude": 37.719598, + "longitude": -86.929674, + "city": "Philpot", + "state": "KY", + "county": "Daviess" + }, + { + "zip_code": 42367, + "latitude": 37.242948, + "longitude": -87.154898, + "city": "Powderly", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42368, + "latitude": 37.740277, + "longitude": -86.741434, + "city": "Reynolds Station", + "state": "KY", + "county": "Hancock" + }, + { + "zip_code": 42369, + "latitude": 37.389897, + "longitude": -86.88526, + "city": "Rockport", + "state": "KY", + "county": "Ohio" + }, + { + "zip_code": 42370, + "latitude": 37.545044, + "longitude": -86.778272, + "city": "Rosine", + "state": "KY", + "county": "Ohio" + }, + { + "zip_code": 42371, + "latitude": 37.470441, + "longitude": -87.246152, + "city": "Rumsey", + "state": "KY", + "county": "Mclean" + }, + { + "zip_code": 42372, + "latitude": 37.488059, + "longitude": -87.258644, + "city": "Sacramento", + "state": "KY", + "county": "Mclean" + }, + { + "zip_code": 42374, + "latitude": 37.353575, + "longitude": -87.165762, + "city": "South Carrollton", + "state": "KY", + "county": "Muhlenberg" + }, + { + "zip_code": 42375, + "latitude": 37.745491, + "longitude": -87.112823, + "city": "Stanley", + "state": "KY", + "county": "Daviess" + }, + { + "zip_code": 42376, + "latitude": 37.633807, + "longitude": -87.12177, + "city": "Utica", + "state": "KY", + "county": "Daviess" + }, + { + "zip_code": 42377, + "latitude": 37.745491, + "longitude": -87.112823, + "city": "West Louisville", + "state": "KY", + "county": "Daviess" + }, + { + "zip_code": 42378, + "latitude": 37.682485, + "longitude": -86.883013, + "city": "Whitesville", + "state": "KY", + "county": "Daviess" + }, + { + "zip_code": 42402, + "latitude": 37.778911, + "longitude": -87.60124, + "city": "Baskett", + "state": "KY", + "county": "Henderson" + }, + { + "zip_code": 42403, + "latitude": 37.446023, + "longitude": -87.933437, + "city": "Blackford", + "state": "KY", + "county": "Webster" + }, + { + "zip_code": 42404, + "latitude": 37.486077, + "longitude": -87.812941, + "city": "Clay", + "state": "KY", + "county": "Webster" + }, + { + "zip_code": 42406, + "latitude": 37.754734, + "longitude": -87.689478, + "city": "Corydon", + "state": "KY", + "county": "Henderson" + }, + { + "zip_code": 42408, + "latitude": 37.220571, + "longitude": -87.624098, + "city": "Dawson Springs", + "state": "KY", + "county": "Hopkins" + }, + { + "zip_code": 42409, + "latitude": 37.519247, + "longitude": -87.67168, + "city": "Dixon", + "state": "KY", + "county": "Webster" + }, + { + "zip_code": 42410, + "latitude": 37.27427, + "longitude": -87.513052, + "city": "Earlington", + "state": "KY", + "county": "Hopkins" + }, + { + "zip_code": 42411, + "latitude": 37.201173, + "longitude": -87.988003, + "city": "Fredonia", + "state": "KY", + "county": "Caldwell" + }, + { + "zip_code": 42413, + "latitude": 37.335312, + "longitude": -87.469567, + "city": "Hanson", + "state": "KY", + "county": "Hopkins" + }, + { + "zip_code": 42419, + "latitude": 37.807173, + "longitude": -87.599052, + "city": "Henderson", + "state": "KY", + "county": "Henderson" + }, + { + "zip_code": 42420, + "latitude": 37.785068, + "longitude": -87.527383, + "city": "Henderson", + "state": "KY", + "county": "Henderson" + }, + { + "zip_code": 42431, + "latitude": 37.299458, + "longitude": -87.532576, + "city": "Madisonville", + "state": "KY", + "county": "Hopkins" + }, + { + "zip_code": 42436, + "latitude": 37.406689, + "longitude": -87.563868, + "city": "Manitou", + "state": "KY", + "county": "Hopkins" + }, + { + "zip_code": 42437, + "latitude": 37.686939, + "longitude": -87.943938, + "city": "Morganfield", + "state": "KY", + "county": "Union" + }, + { + "zip_code": 42440, + "latitude": 37.249018, + "longitude": -87.461536, + "city": "Mortons Gap", + "state": "KY", + "county": "Hopkins" + }, + { + "zip_code": 42441, + "latitude": 37.364469, + "longitude": -87.651863, + "city": "Nebo", + "state": "KY", + "county": "Hopkins" + }, + { + "zip_code": 42442, + "latitude": 37.257874, + "longitude": -87.506773, + "city": "Nortonville", + "state": "KY", + "county": "Hopkins" + }, + { + "zip_code": 42444, + "latitude": 37.641002, + "longitude": -87.643862, + "city": "Poole", + "state": "KY", + "county": "Webster" + }, + { + "zip_code": 42445, + "latitude": 37.140606, + "longitude": -87.865635, + "city": "Princeton", + "state": "KY", + "county": "Caldwell" + }, + { + "zip_code": 42450, + "latitude": 37.484437, + "longitude": -87.734014, + "city": "Providence", + "state": "KY", + "county": "Webster" + }, + { + "zip_code": 42451, + "latitude": 37.8497, + "longitude": -87.378292, + "city": "Reed", + "state": "KY", + "county": "Henderson" + }, + { + "zip_code": 42452, + "latitude": 37.700857, + "longitude": -87.551576, + "city": "Robards", + "state": "KY", + "county": "Henderson" + }, + { + "zip_code": 42453, + "latitude": 37.160353, + "longitude": -87.569718, + "city": "Saint Charles", + "state": "KY", + "county": "Hopkins" + }, + { + "zip_code": 42455, + "latitude": 37.570081, + "longitude": -87.636436, + "city": "Sebree", + "state": "KY", + "county": "Webster" + }, + { + "zip_code": 42456, + "latitude": 37.505442, + "longitude": -87.534622, + "city": "Slaughters", + "state": "KY", + "county": "Webster" + }, + { + "zip_code": 42457, + "latitude": 37.83233, + "longitude": -87.788906, + "city": "Smith Mills", + "state": "KY", + "county": "Henderson" + }, + { + "zip_code": 42458, + "latitude": 37.840368, + "longitude": -87.547026, + "city": "Spottsville", + "state": "KY", + "county": "Henderson" + }, + { + "zip_code": 42459, + "latitude": 37.628913, + "longitude": -87.989378, + "city": "Sturgis", + "state": "KY", + "county": "Union" + }, + { + "zip_code": 42460, + "latitude": 37.493997, + "longitude": -87.932773, + "city": "Sullivan", + "state": "KY", + "county": "Union" + }, + { + "zip_code": 42461, + "latitude": 37.717433, + "longitude": -87.914375, + "city": "Uniontown", + "state": "KY", + "county": "Union" + }, + { + "zip_code": 42462, + "latitude": 37.631341, + "longitude": -87.866487, + "city": "Waverly", + "state": "KY", + "county": "Union" + }, + { + "zip_code": 42463, + "latitude": 37.487972, + "longitude": -87.866125, + "city": "Wheatcroft", + "state": "KY", + "county": "Webster" + }, + { + "zip_code": 42464, + "latitude": 37.20031, + "longitude": -87.400477, + "city": "White Plains", + "state": "KY", + "county": "Hopkins" + }, + { + "zip_code": 42501, + "latitude": 37.10288, + "longitude": -84.544294, + "city": "Somerset", + "state": "KY", + "county": "Pulaski" + }, + { + "zip_code": 42502, + "latitude": 37.09325, + "longitude": -84.427729, + "city": "Somerset", + "state": "KY", + "county": "Pulaski" + }, + { + "zip_code": 42503, + "latitude": 37.131938, + "longitude": -84.518445, + "city": "Somerset", + "state": "KY", + "county": "Pulaski" + }, + { + "zip_code": 42516, + "latitude": 37.242524, + "longitude": -84.89986, + "city": "Bethelridge", + "state": "KY", + "county": "Casey" + }, + { + "zip_code": 42518, + "latitude": 36.952751, + "longitude": -84.624731, + "city": "Bronston", + "state": "KY", + "county": "Pulaski" + }, + { + "zip_code": 42519, + "latitude": 37.029301, + "longitude": -84.537413, + "city": "Burnside", + "state": "KY", + "county": "Pulaski" + }, + { + "zip_code": 42528, + "latitude": 37.190615, + "longitude": -84.983484, + "city": "Dunnville", + "state": "KY", + "county": "Casey" + }, + { + "zip_code": 42533, + "latitude": 37.114754, + "longitude": -84.69969, + "city": "Ferguson", + "state": "KY", + "county": "Pulaski" + }, + { + "zip_code": 42539, + "latitude": 37.302162, + "longitude": -84.957722, + "city": "Liberty", + "state": "KY", + "county": "Casey" + }, + { + "zip_code": 42541, + "latitude": 37.36719, + "longitude": -84.798875, + "city": "Middleburg", + "state": "KY", + "county": "Casey" + }, + { + "zip_code": 42544, + "latitude": 37.063143, + "longitude": -84.719207, + "city": "Nancy", + "state": "KY", + "county": "Pulaski" + }, + { + "zip_code": 42553, + "latitude": 37.110682, + "longitude": -84.686815, + "city": "Science Hill", + "state": "KY", + "county": "Pulaski" + }, + { + "zip_code": 42558, + "latitude": 36.94919, + "longitude": -84.581482, + "city": "Tateville", + "state": "KY", + "county": "Pulaski" + }, + { + "zip_code": 42564, + "latitude": 37.111433, + "longitude": -84.592898, + "city": "West Somerset", + "state": "KY", + "county": "Pulaski" + }, + { + "zip_code": 42565, + "latitude": 37.15679, + "longitude": -84.879909, + "city": "Windsor", + "state": "KY", + "county": "Casey" + }, + { + "zip_code": 42566, + "latitude": 37.291935, + "longitude": -84.82628, + "city": "Yosemite", + "state": "KY", + "county": "Casey" + }, + { + "zip_code": 42567, + "latitude": 37.128053, + "longitude": -84.59699, + "city": "Eubank", + "state": "KY", + "county": "Pulaski" + }, + { + "zip_code": 42602, + "latitude": 36.745738, + "longitude": -85.181967, + "city": "Albany", + "state": "KY", + "county": "Clinton" + }, + { + "zip_code": 42603, + "latitude": 36.751732, + "longitude": -85.135354, + "city": "Alpha", + "state": "KY", + "county": "Clinton" + }, + { + "zip_code": 42629, + "latitude": 36.945046, + "longitude": -85.124561, + "city": "Jamestown", + "state": "KY", + "county": "Russell" + }, + { + "zip_code": 42631, + "latitude": 36.777331, + "longitude": -84.502512, + "city": "Marshes Siding", + "state": "KY", + "county": "Mccreary" + }, + { + "zip_code": 42632, + "latitude": 36.800363, + "longitude": -84.818345, + "city": "Mill Springs", + "state": "KY", + "county": "Wayne" + }, + { + "zip_code": 42633, + "latitude": 36.8674, + "longitude": -84.8254, + "city": "Monticello", + "state": "KY", + "county": "Wayne" + }, + { + "zip_code": 42634, + "latitude": 36.777331, + "longitude": -84.502512, + "city": "Parkers Lake", + "state": "KY", + "county": "Mccreary" + }, + { + "zip_code": 42635, + "latitude": 36.777331, + "longitude": -84.502512, + "city": "Pine Knot", + "state": "KY", + "county": "Mccreary" + }, + { + "zip_code": 42638, + "latitude": 36.777331, + "longitude": -84.502512, + "city": "Revelo", + "state": "KY", + "county": "Mccreary" + }, + { + "zip_code": 42642, + "latitude": 37.019307, + "longitude": -85.069717, + "city": "Russell Springs", + "state": "KY", + "county": "Russell" + }, + { + "zip_code": 42647, + "latitude": 36.777331, + "longitude": -84.502512, + "city": "Stearns", + "state": "KY", + "county": "Mccreary" + }, + { + "zip_code": 42649, + "latitude": 36.777331, + "longitude": -84.502512, + "city": "Strunk", + "state": "KY", + "county": "Mccreary" + }, + { + "zip_code": 42653, + "latitude": 36.721677, + "longitude": -84.467609, + "city": "Whitley City", + "state": "KY", + "county": "Mccreary" + }, + { + "zip_code": 42701, + "latitude": 37.684807, + "longitude": -85.878391, + "city": "Elizabethtown", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 42702, + "latitude": 37.723474, + "longitude": -85.976854, + "city": "Elizabethtown", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 42711, + "latitude": 36.879564, + "longitude": -85.317785, + "city": "Bakerton", + "state": "KY", + "county": "Cumberland" + }, + { + "zip_code": 42712, + "latitude": 37.493818, + "longitude": -86.286363, + "city": "Big Clifty", + "state": "KY", + "county": "Grayson" + }, + { + "zip_code": 42713, + "latitude": 37.370142, + "longitude": -85.913432, + "city": "Bonnieville", + "state": "KY", + "county": "Hart" + }, + { + "zip_code": 42715, + "latitude": 36.955287, + "longitude": -85.403561, + "city": "Breeding", + "state": "KY", + "county": "Adair" + }, + { + "zip_code": 42716, + "latitude": 37.485493, + "longitude": -85.626798, + "city": "Buffalo", + "state": "KY", + "county": "Larue" + }, + { + "zip_code": 42717, + "latitude": 36.769106, + "longitude": -85.408741, + "city": "Burkesville", + "state": "KY", + "county": "Cumberland" + }, + { + "zip_code": 42718, + "latitude": 37.337416, + "longitude": -85.357952, + "city": "Campbellsville", + "state": "KY", + "county": "Taylor" + }, + { + "zip_code": 42719, + "latitude": 37.337936, + "longitude": -85.330374, + "city": "Campbellsville", + "state": "KY", + "county": "Taylor" + }, + { + "zip_code": 42720, + "latitude": 37.121145, + "longitude": -85.370926, + "city": "Cane Valley", + "state": "KY", + "county": "Adair" + }, + { + "zip_code": 42721, + "latitude": 37.430259, + "longitude": -86.370024, + "city": "Caneyville", + "state": "KY", + "county": "Grayson" + }, + { + "zip_code": 42722, + "latitude": 37.277025, + "longitude": -85.727548, + "city": "Canmer", + "state": "KY", + "county": "Hart" + }, + { + "zip_code": 42724, + "latitude": 37.669044, + "longitude": -86.054481, + "city": "Cecilia", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 42726, + "latitude": 37.433583, + "longitude": -86.208318, + "city": "Clarkson", + "state": "KY", + "county": "Grayson" + }, + { + "zip_code": 42728, + "latitude": 37.116131, + "longitude": -85.265586, + "city": "Columbia", + "state": "KY", + "county": "Adair" + }, + { + "zip_code": 42729, + "latitude": 37.260115, + "longitude": -85.982964, + "city": "Cub Run", + "state": "KY", + "county": "Hart" + }, + { + "zip_code": 42731, + "latitude": 36.842115, + "longitude": -85.539565, + "city": "Dubre", + "state": "KY", + "county": "Cumberland" + }, + { + "zip_code": 42732, + "latitude": 37.606115, + "longitude": -86.090565, + "city": "Eastview", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 42733, + "latitude": 37.340494, + "longitude": -85.218987, + "city": "Elk Horn", + "state": "KY", + "county": "Taylor" + }, + { + "zip_code": 42735, + "latitude": 37.045089, + "longitude": -85.29683, + "city": "Fairplay", + "state": "KY", + "county": "Adair" + }, + { + "zip_code": 42740, + "latitude": 37.602581, + "longitude": -86.007199, + "city": "Glendale", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 42741, + "latitude": 37.006969, + "longitude": -85.248697, + "city": "Glens Fork", + "state": "KY", + "county": "Adair" + }, + { + "zip_code": 42742, + "latitude": 37.091158, + "longitude": -85.465005, + "city": "Gradyville", + "state": "KY", + "county": "Adair" + }, + { + "zip_code": 42743, + "latitude": 37.27586, + "longitude": -85.519334, + "city": "Greensburg", + "state": "KY", + "county": "Green" + }, + { + "zip_code": 42746, + "latitude": 37.216477, + "longitude": -85.772032, + "city": "Hardyville", + "state": "KY", + "county": "Hart" + }, + { + "zip_code": 42748, + "latitude": 37.559321, + "longitude": -85.707267, + "city": "Hodgenville", + "state": "KY", + "county": "Larue" + }, + { + "zip_code": 42749, + "latitude": 37.202266, + "longitude": -85.89552, + "city": "Horse Cave", + "state": "KY", + "county": "Hart" + }, + { + "zip_code": 42753, + "latitude": 37.231312, + "longitude": -85.17202, + "city": "Knifley", + "state": "KY", + "county": "Adair" + }, + { + "zip_code": 42754, + "latitude": 37.460336, + "longitude": -86.324894, + "city": "Leitchfield", + "state": "KY", + "county": "Grayson" + }, + { + "zip_code": 42755, + "latitude": 37.471943, + "longitude": -86.343941, + "city": "Leitchfield", + "state": "KY", + "county": "Grayson" + }, + { + "zip_code": 42757, + "latitude": 37.469063, + "longitude": -85.723511, + "city": "Magnolia", + "state": "KY", + "county": "Larue" + }, + { + "zip_code": 42758, + "latitude": 37.360392, + "longitude": -85.198031, + "city": "Mannsville", + "state": "KY", + "county": "Taylor" + }, + { + "zip_code": 42759, + "latitude": 36.830573, + "longitude": -85.50154, + "city": "Marrowbone", + "state": "KY", + "county": "Cumberland" + }, + { + "zip_code": 42761, + "latitude": 37.107146, + "longitude": -85.459565, + "city": "Milltown", + "state": "KY", + "county": "Adair" + }, + { + "zip_code": 42762, + "latitude": 37.444623, + "longitude": -86.400828, + "city": "Millwood", + "state": "KY", + "county": "Grayson" + }, + { + "zip_code": 42764, + "latitude": 37.463961, + "longitude": -85.639231, + "city": "Mount Sherman", + "state": "KY", + "county": "Larue" + }, + { + "zip_code": 42765, + "latitude": 37.29204, + "longitude": -85.914004, + "city": "Munfordville", + "state": "KY", + "county": "Hart" + }, + { + "zip_code": 42776, + "latitude": 37.515024, + "longitude": -85.950238, + "city": "Sonora", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 42782, + "latitude": 37.354827, + "longitude": -85.614043, + "city": "Summersville", + "state": "KY", + "county": "Green" + }, + { + "zip_code": 42783, + "latitude": 37.567134, + "longitude": -86.085259, + "city": "Summit", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 42784, + "latitude": 37.478353, + "longitude": -85.963435, + "city": "Upton", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 42786, + "latitude": 36.819839, + "longitude": -85.462435, + "city": "Waterview", + "state": "KY", + "county": "Cumberland" + }, + { + "zip_code": 42788, + "latitude": 37.534951, + "longitude": -86.033456, + "city": "White Mills", + "state": "KY", + "county": "Hardin" + }, + { + "zip_code": 43001, + "latitude": 40.100513, + "longitude": -82.612389, + "city": "Alexandria", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43002, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Amlin", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43003, + "latitude": 40.389346, + "longitude": -82.98071, + "city": "Ashley", + "state": "OH", + "county": "Delaware" + }, + { + "zip_code": 43004, + "latitude": 40.016713, + "longitude": -82.839198, + "city": "Blacklick", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43005, + "latitude": 40.29623, + "longitude": -82.27362, + "city": "Bladensburg", + "state": "OH", + "county": "Knox" + }, + { + "zip_code": 43006, + "latitude": 40.477294, + "longitude": -82.191485, + "city": "Brinkhaven", + "state": "OH", + "county": "Knox" + }, + { + "zip_code": 43007, + "latitude": 40.340633, + "longitude": -83.416306, + "city": "Broadway", + "state": "OH", + "county": "Union" + }, + { + "zip_code": 43008, + "latitude": 39.944674, + "longitude": -82.47972, + "city": "Buckeye Lake", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43009, + "latitude": 40.161025, + "longitude": -83.648461, + "city": "Cable", + "state": "OH", + "county": "Champaign" + }, + { + "zip_code": 43010, + "latitude": 39.99914, + "longitude": -83.622204, + "city": "Catawba", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 43011, + "latitude": 40.313394, + "longitude": -82.665177, + "city": "Centerburg", + "state": "OH", + "county": "Knox" + }, + { + "zip_code": 43013, + "latitude": 40.115251, + "longitude": -82.690898, + "city": "Croton", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43014, + "latitude": 40.417167, + "longitude": -82.270253, + "city": "Danville", + "state": "OH", + "county": "Knox" + }, + { + "zip_code": 43015, + "latitude": 40.289886, + "longitude": -82.981095, + "city": "Delaware", + "state": "OH", + "county": "Delaware" + }, + { + "zip_code": 43016, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Dublin", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43017, + "latitude": 40.076041, + "longitude": -82.814456, + "city": "Dublin", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43018, + "latitude": 39.957167, + "longitude": -82.683686, + "city": "Etna", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43019, + "latitude": 40.487135, + "longitude": -82.512463, + "city": "Fredericktown", + "state": "OH", + "county": "Knox" + }, + { + "zip_code": 43021, + "latitude": 40.201142, + "longitude": -82.874886, + "city": "Galena", + "state": "OH", + "county": "Delaware" + }, + { + "zip_code": 43022, + "latitude": 40.338527, + "longitude": -82.348673, + "city": "Gambier", + "state": "OH", + "county": "Knox" + }, + { + "zip_code": 43023, + "latitude": 40.048971, + "longitude": -82.539941, + "city": "Granville", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43025, + "latitude": 39.974804, + "longitude": -82.511108, + "city": "Hebron", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43026, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Hilliard", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43027, + "latitude": 40.132821, + "longitude": -82.561556, + "city": "Homer", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43028, + "latitude": 40.418367, + "longitude": -82.283974, + "city": "Howard", + "state": "OH", + "county": "Knox" + }, + { + "zip_code": 43029, + "latitude": 40.128208, + "longitude": -83.442548, + "city": "Irwin", + "state": "OH", + "county": "Union" + }, + { + "zip_code": 43030, + "latitude": 39.968846, + "longitude": -82.430017, + "city": "Jacksontown", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43031, + "latitude": 40.16145, + "longitude": -82.60439, + "city": "Johnstown", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43032, + "latitude": 40.313445, + "longitude": -82.961585, + "city": "Kilbourne", + "state": "OH", + "county": "Delaware" + }, + { + "zip_code": 43033, + "latitude": 39.953532, + "longitude": -82.593998, + "city": "Kirkersville", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43035, + "latitude": 40.187886, + "longitude": -82.987804, + "city": "Lewis Center", + "state": "OH", + "county": "Delaware" + }, + { + "zip_code": 43036, + "latitude": 40.352835, + "longitude": -83.263418, + "city": "Magnetic Springs", + "state": "OH", + "county": "Union" + }, + { + "zip_code": 43037, + "latitude": 40.29519, + "longitude": -82.322187, + "city": "Martinsburg", + "state": "OH", + "county": "Knox" + }, + { + "zip_code": 43040, + "latitude": 40.267651, + "longitude": -83.376632, + "city": "Marysville", + "state": "OH", + "county": "Union" + }, + { + "zip_code": 43041, + "latitude": 40.306924, + "longitude": -83.360645, + "city": "Marysville", + "state": "OH", + "county": "Union" + }, + { + "zip_code": 43044, + "latitude": 40.117805, + "longitude": -83.587808, + "city": "Mechanicsburg", + "state": "OH", + "county": "Champaign" + }, + { + "zip_code": 43045, + "latitude": 40.170089, + "longitude": -83.441008, + "city": "Milford Center", + "state": "OH", + "county": "Union" + }, + { + "zip_code": 43046, + "latitude": 39.884758, + "longitude": -82.539214, + "city": "Millersport", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43047, + "latitude": 40.204914, + "longitude": -83.646581, + "city": "Mingo", + "state": "OH", + "county": "Champaign" + }, + { + "zip_code": 43048, + "latitude": 40.406113, + "longitude": -82.465777, + "city": "Mount Liberty", + "state": "OH", + "county": "Knox" + }, + { + "zip_code": 43050, + "latitude": 40.37066, + "longitude": -82.481346, + "city": "Mount Vernon", + "state": "OH", + "county": "Knox" + }, + { + "zip_code": 43054, + "latitude": 40.085113, + "longitude": -82.814347, + "city": "New Albany", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43055, + "latitude": 40.085963, + "longitude": -82.485985, + "city": "Newark", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43056, + "latitude": 40.004407, + "longitude": -82.467105, + "city": "Heath", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43058, + "latitude": 40.095148, + "longitude": -82.482659, + "city": "Newark", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43060, + "latitude": 40.204788, + "longitude": -83.568531, + "city": "North Lewisburg", + "state": "OH", + "county": "Champaign" + }, + { + "zip_code": 43061, + "latitude": 40.295612, + "longitude": -83.199506, + "city": "Ostrander", + "state": "OH", + "county": "Delaware" + }, + { + "zip_code": 43062, + "latitude": 40.014869, + "longitude": -82.624424, + "city": "Pataskala", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43064, + "latitude": 40.057901, + "longitude": -83.307323, + "city": "Plain City", + "state": "OH", + "county": "Madison" + }, + { + "zip_code": 43065, + "latitude": 40.183405, + "longitude": -83.091235, + "city": "Powell", + "state": "OH", + "county": "Delaware" + }, + { + "zip_code": 43066, + "latitude": 40.380541, + "longitude": -83.172985, + "city": "Radnor", + "state": "OH", + "county": "Delaware" + }, + { + "zip_code": 43067, + "latitude": 40.337997, + "longitude": -83.465462, + "city": "Raymond", + "state": "OH", + "county": "Union" + }, + { + "zip_code": 43068, + "latitude": 39.951513, + "longitude": -82.802896, + "city": "Reynoldsburg", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43070, + "latitude": 40.172288, + "longitude": -83.962411, + "city": "Rosewood", + "state": "OH", + "county": "Champaign" + }, + { + "zip_code": 43071, + "latitude": 40.189158, + "longitude": -82.353301, + "city": "Saint Louisville", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43072, + "latitude": 40.121683, + "longitude": -83.947262, + "city": "Saint Paris", + "state": "OH", + "county": "Champaign" + }, + { + "zip_code": 43073, + "latitude": 39.996516, + "longitude": -82.754034, + "city": "Summit Station", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43074, + "latitude": 40.266029, + "longitude": -82.854334, + "city": "Sunbury", + "state": "OH", + "county": "Delaware" + }, + { + "zip_code": 43076, + "latitude": 39.851267, + "longitude": -82.385238, + "city": "Thornville", + "state": "OH", + "county": "Perry" + }, + { + "zip_code": 43077, + "latitude": 40.124392, + "longitude": -83.30822, + "city": "Unionville Center", + "state": "OH", + "county": "Union" + }, + { + "zip_code": 43078, + "latitude": 40.121722, + "longitude": -83.797312, + "city": "Urbana", + "state": "OH", + "county": "Champaign" + }, + { + "zip_code": 43080, + "latitude": 40.17595, + "longitude": -82.444279, + "city": "Utica", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43081, + "latitude": 40.10447, + "longitude": -82.896457, + "city": "Westerville", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43082, + "latitude": 40.167712, + "longitude": -82.869636, + "city": "Westerville", + "state": "OH", + "county": "Delaware" + }, + { + "zip_code": 43083, + "latitude": 40.102185, + "longitude": -83.83786, + "city": "Westville", + "state": "OH", + "county": "Champaign" + }, + { + "zip_code": 43084, + "latitude": 40.1511, + "longitude": -83.545445, + "city": "Woodstock", + "state": "OH", + "county": "Champaign" + }, + { + "zip_code": 43085, + "latitude": 40.040113, + "longitude": -82.897222, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43086, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Westerville", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43093, + "latitude": 40.095148, + "longitude": -82.482659, + "city": "Newark", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43098, + "latitude": 40.095148, + "longitude": -82.482659, + "city": "Hebron", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43101, + "latitude": 39.466524, + "longitude": -82.754731, + "city": "Adelphi", + "state": "OH", + "county": "Ross" + }, + { + "zip_code": 43102, + "latitude": 39.698161, + "longitude": -82.688692, + "city": "Amanda", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43103, + "latitude": 39.67194, + "longitude": -83.015457, + "city": "Ashville", + "state": "OH", + "county": "Pickaway" + }, + { + "zip_code": 43105, + "latitude": 39.77796, + "longitude": -82.665141, + "city": "Baltimore", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43106, + "latitude": 39.64064, + "longitude": -83.419366, + "city": "Bloomingburg", + "state": "OH", + "county": "Fayette" + }, + { + "zip_code": 43107, + "latitude": 39.697655, + "longitude": -82.554876, + "city": "Bremen", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43109, + "latitude": 39.924238, + "longitude": -82.846098, + "city": "Brice", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43110, + "latitude": 39.821343, + "longitude": -82.764939, + "city": "Canal Winchester", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43111, + "latitude": 39.504455, + "longitude": -82.242899, + "city": "Carbon Hill", + "state": "OH", + "county": "Hocking" + }, + { + "zip_code": 43112, + "latitude": 39.80114, + "longitude": -82.706291, + "city": "Carroll", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43113, + "latitude": 39.597084, + "longitude": -82.945899, + "city": "Circleville", + "state": "OH", + "county": "Pickaway" + }, + { + "zip_code": 43115, + "latitude": 39.479662, + "longitude": -83.099899, + "city": "Clarksburg", + "state": "OH", + "county": "Ross" + }, + { + "zip_code": 43116, + "latitude": 39.769857, + "longitude": -83.060153, + "city": "Commercial Point", + "state": "OH", + "county": "Pickaway" + }, + { + "zip_code": 43117, + "latitude": 39.773025, + "longitude": -83.199472, + "city": "Derby", + "state": "OH", + "county": "Pickaway" + }, + { + "zip_code": 43119, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Galloway", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43123, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Grove City", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43125, + "latitude": 39.84692, + "longitude": -82.88487, + "city": "Groveport", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43126, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Harrisburg", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43127, + "latitude": 39.476564, + "longitude": -82.328099, + "city": "Haydenville", + "state": "OH", + "county": "Hocking" + }, + { + "zip_code": 43128, + "latitude": 39.654055, + "longitude": -83.572613, + "city": "Jeffersonville", + "state": "OH", + "county": "Fayette" + }, + { + "zip_code": 43130, + "latitude": 39.68965, + "longitude": -82.609282, + "city": "Lancaster", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43135, + "latitude": 39.462546, + "longitude": -82.666506, + "city": "Laurelville", + "state": "OH", + "county": "Hocking" + }, + { + "zip_code": 43136, + "latitude": 39.76155, + "longitude": -82.7219, + "city": "Lithopolis", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43137, + "latitude": 39.761894, + "longitude": -82.98932, + "city": "Lockbourne", + "state": "OH", + "county": "Pickaway" + }, + { + "zip_code": 43138, + "latitude": 39.52535, + "longitude": -82.437424, + "city": "Logan", + "state": "OH", + "county": "Hocking" + }, + { + "zip_code": 43140, + "latitude": 39.886277, + "longitude": -83.407733, + "city": "London", + "state": "OH", + "county": "Madison" + }, + { + "zip_code": 43142, + "latitude": 39.588319, + "longitude": -83.583292, + "city": "Milledgeville", + "state": "OH", + "county": "Fayette" + }, + { + "zip_code": 43143, + "latitude": 39.765249, + "longitude": -83.344831, + "city": "Mount Sterling", + "state": "OH", + "county": "Madison" + }, + { + "zip_code": 43144, + "latitude": 39.505508, + "longitude": -82.171089, + "city": "Murray City", + "state": "OH", + "county": "Hocking" + }, + { + "zip_code": 43145, + "latitude": 39.56981, + "longitude": -83.21419, + "city": "New Holland", + "state": "OH", + "county": "Pickaway" + }, + { + "zip_code": 43146, + "latitude": 39.682607, + "longitude": -83.14155, + "city": "Orient", + "state": "OH", + "county": "Pickaway" + }, + { + "zip_code": 43147, + "latitude": 39.781747, + "longitude": -82.664536, + "city": "Pickerington", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43148, + "latitude": 39.82724, + "longitude": -82.500765, + "city": "Pleasantville", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43149, + "latitude": 39.525792, + "longitude": -82.606994, + "city": "Rockbridge", + "state": "OH", + "county": "Hocking" + }, + { + "zip_code": 43150, + "latitude": 39.77882, + "longitude": -82.438446, + "city": "Rushville", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43151, + "latitude": 39.727083, + "longitude": -83.452833, + "city": "Sedalia", + "state": "OH", + "county": "Madison" + }, + { + "zip_code": 43152, + "latitude": 39.417379, + "longitude": -82.592291, + "city": "South Bloomingville", + "state": "OH", + "county": "Hocking" + }, + { + "zip_code": 43153, + "latitude": 39.748496, + "longitude": -83.531355, + "city": "South Solon", + "state": "OH", + "county": "Madison" + }, + { + "zip_code": 43154, + "latitude": 39.616, + "longitude": -82.80858, + "city": "Stoutsville", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43155, + "latitude": 39.63769, + "longitude": -82.532092, + "city": "Sugar Grove", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43156, + "latitude": 39.555583, + "longitude": -82.782171, + "city": "Tarlton", + "state": "OH", + "county": "Pickaway" + }, + { + "zip_code": 43157, + "latitude": 39.842263, + "longitude": -82.560131, + "city": "Thurston", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43158, + "latitude": 39.433804, + "longitude": -82.366742, + "city": "Union Furnace", + "state": "OH", + "county": "Hocking" + }, + { + "zip_code": 43160, + "latitude": 39.536986, + "longitude": -83.455012, + "city": "Washington Court House", + "state": "OH", + "county": "Fayette" + }, + { + "zip_code": 43162, + "latitude": 39.94886, + "longitude": -83.309892, + "city": "West Jefferson", + "state": "OH", + "county": "Madison" + }, + { + "zip_code": 43163, + "latitude": 39.7631, + "longitude": -82.447024, + "city": "West Rushville", + "state": "OH", + "county": "Fairfield" + }, + { + "zip_code": 43164, + "latitude": 39.604282, + "longitude": -83.126646, + "city": "Williamsport", + "state": "OH", + "county": "Pickaway" + }, + { + "zip_code": 43196, + "latitude": "", + "longitude": "", + "city": "Groveport", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43198, + "latitude": "", + "longitude": "", + "city": "Groveport", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43199, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Groveport", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43201, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43202, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43203, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43204, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43205, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43206, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43207, + "latitude": 39.86905, + "longitude": -82.958539, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43209, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43210, + "latitude": 39.914038, + "longitude": -82.832558, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43211, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43212, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43213, + "latitude": 39.972734, + "longitude": -82.832887, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43214, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43215, + "latitude": 39.891745, + "longitude": -82.877131, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43216, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43217, + "latitude": 39.827675, + "longitude": -82.934198, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43218, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43219, + "latitude": 40.032615, + "longitude": -82.910251, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43220, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43221, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43222, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43223, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43224, + "latitude": 40.080339, + "longitude": -82.928604, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43226, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43227, + "latitude": 39.922863, + "longitude": -82.858048, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43228, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43229, + "latitude": 40.095713, + "longitude": -82.962671, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43230, + "latitude": 40.034713, + "longitude": -82.872611, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43231, + "latitude": 40.084463, + "longitude": -82.933811, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43232, + "latitude": 39.922663, + "longitude": -82.85664, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43234, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43235, + "latitude": 40.108836, + "longitude": -82.974204, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43236, + "latitude": 40.135711, + "longitude": -83.007626, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43240, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43251, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43260, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43265, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43266, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43268, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43270, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43271, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43272, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43279, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43287, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43291, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43299, + "latitude": 39.969036, + "longitude": -83.011389, + "city": "Columbus", + "state": "OH", + "county": "Franklin" + }, + { + "zip_code": 43301, + "latitude": 40.616604, + "longitude": -83.069296, + "city": "Marion", + "state": "OH", + "county": "Marion" + }, + { + "zip_code": 43302, + "latitude": 40.584028, + "longitude": -83.101687, + "city": "Marion", + "state": "OH", + "county": "Marion" + }, + { + "zip_code": 43306, + "latitude": 40.56941, + "longitude": -83.139341, + "city": "Marion", + "state": "OH", + "county": "Marion" + }, + { + "zip_code": 43307, + "latitude": 40.56941, + "longitude": -83.139341, + "city": "Marion", + "state": "OH", + "county": "Marion" + }, + { + "zip_code": 43310, + "latitude": 40.491005, + "longitude": -83.752068, + "city": "Belle Center", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43311, + "latitude": 40.378783, + "longitude": -83.787784, + "city": "Bellefontaine", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43314, + "latitude": 40.631257, + "longitude": -82.958179, + "city": "Caledonia", + "state": "OH", + "county": "Marion" + }, + { + "zip_code": 43315, + "latitude": 40.479648, + "longitude": -82.852969, + "city": "Cardington", + "state": "OH", + "county": "Morrow" + }, + { + "zip_code": 43316, + "latitude": 40.927265, + "longitude": -83.387038, + "city": "Carey", + "state": "OH", + "county": "Wyandot" + }, + { + "zip_code": 43317, + "latitude": 40.478905, + "longitude": -82.682805, + "city": "Chesterville", + "state": "OH", + "county": "Morrow" + }, + { + "zip_code": 43318, + "latitude": 40.374272, + "longitude": -83.784554, + "city": "De Graff", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43319, + "latitude": 40.303893, + "longitude": -83.728511, + "city": "East Liberty", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43320, + "latitude": 40.588234, + "longitude": -82.890436, + "city": "Edison", + "state": "OH", + "county": "Morrow" + }, + { + "zip_code": 43321, + "latitude": 40.49712, + "longitude": -82.834207, + "city": "Fulton", + "state": "OH", + "county": "Morrow" + }, + { + "zip_code": 43322, + "latitude": 40.541659, + "longitude": -83.230407, + "city": "Green Camp", + "state": "OH", + "county": "Marion" + }, + { + "zip_code": 43323, + "latitude": 40.7346, + "longitude": -83.253668, + "city": "Harpster", + "state": "OH", + "county": "Wyandot" + }, + { + "zip_code": 43324, + "latitude": 40.43991, + "longitude": -83.809604, + "city": "Huntsville", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43325, + "latitude": 40.60796, + "longitude": -82.872954, + "city": "Iberia", + "state": "OH", + "county": "Morrow" + }, + { + "zip_code": 43326, + "latitude": 40.6401, + "longitude": -83.616923, + "city": "Kenton", + "state": "OH", + "county": "Hardin" + }, + { + "zip_code": 43330, + "latitude": 40.813023, + "longitude": -83.419606, + "city": "Kirby", + "state": "OH", + "county": "Wyandot" + }, + { + "zip_code": 43331, + "latitude": 40.501851, + "longitude": -83.92023, + "city": "Lakeview", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43332, + "latitude": 40.596476, + "longitude": -83.344599, + "city": "La Rue", + "state": "OH", + "county": "Marion" + }, + { + "zip_code": 43333, + "latitude": 40.436912, + "longitude": -83.926452, + "city": "Lewistown", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43334, + "latitude": 40.406317, + "longitude": -82.782091, + "city": "Marengo", + "state": "OH", + "county": "Morrow" + }, + { + "zip_code": 43335, + "latitude": 40.668497, + "longitude": -82.909984, + "city": "Martel", + "state": "OH", + "county": "Marion" + }, + { + "zip_code": 43336, + "latitude": 40.294825, + "longitude": -83.57726, + "city": "Middleburg", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43337, + "latitude": 40.667978, + "longitude": -83.26335, + "city": "Morral", + "state": "OH", + "county": "Marion" + }, + { + "zip_code": 43338, + "latitude": 40.525904, + "longitude": -82.752848, + "city": "Mount Gilead", + "state": "OH", + "county": "Morrow" + }, + { + "zip_code": 43340, + "latitude": 40.561493, + "longitude": -83.495423, + "city": "Mount Victory", + "state": "OH", + "county": "Hardin" + }, + { + "zip_code": 43341, + "latitude": 40.599228, + "longitude": -83.308663, + "city": "New Bloomington", + "state": "OH", + "county": "Marion" + }, + { + "zip_code": 43342, + "latitude": 40.492106, + "longitude": -83.178414, + "city": "Prospect", + "state": "OH", + "county": "Marion" + }, + { + "zip_code": 43343, + "latitude": 40.391089, + "longitude": -83.792897, + "city": "Quincy", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43344, + "latitude": 40.427182, + "longitude": -83.352079, + "city": "Richwood", + "state": "OH", + "county": "Union" + }, + { + "zip_code": 43345, + "latitude": 40.532668, + "longitude": -83.58265, + "city": "Ridgeway", + "state": "OH", + "county": "Hardin" + }, + { + "zip_code": 43346, + "latitude": 40.573227, + "longitude": -83.846199, + "city": "Roundhead", + "state": "OH", + "county": "Hardin" + }, + { + "zip_code": 43347, + "latitude": 40.474334, + "longitude": -83.650983, + "city": "Rushsylvania", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43348, + "latitude": 40.402746, + "longitude": -83.890243, + "city": "Russells Point", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43349, + "latitude": 40.614239, + "longitude": -82.661938, + "city": "Shauck", + "state": "OH", + "county": "Morrow" + }, + { + "zip_code": 43350, + "latitude": 40.528862, + "longitude": -82.82292, + "city": "Sparta", + "state": "OH", + "county": "Morrow" + }, + { + "zip_code": 43351, + "latitude": 40.828153, + "longitude": -83.313786, + "city": "Upper Sandusky", + "state": "OH", + "county": "Wyandot" + }, + { + "zip_code": 43356, + "latitude": 40.475651, + "longitude": -83.048607, + "city": "Waldo", + "state": "OH", + "county": "Marion" + }, + { + "zip_code": 43357, + "latitude": 40.278247, + "longitude": -83.713148, + "city": "West Liberty", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43358, + "latitude": 40.36691, + "longitude": -83.625912, + "city": "West Mansfield", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43359, + "latitude": 40.875991, + "longitude": -83.448021, + "city": "Wharton", + "state": "OH", + "county": "Wyandot" + }, + { + "zip_code": 43360, + "latitude": 40.321114, + "longitude": -83.640462, + "city": "Zanesfield", + "state": "OH", + "county": "Logan" + }, + { + "zip_code": 43402, + "latitude": 41.376449, + "longitude": -83.613714, + "city": "Bowling Green", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43403, + "latitude": 41.39235, + "longitude": -83.648996, + "city": "Bowling Green", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43406, + "latitude": 41.334031, + "longitude": -83.542092, + "city": "Bradner", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43407, + "latitude": 41.278621, + "longitude": -83.244604, + "city": "Burgoon", + "state": "OH", + "county": "Sandusky" + }, + { + "zip_code": 43408, + "latitude": 41.568599, + "longitude": -83.363224, + "city": "Clay Center", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43410, + "latitude": 41.321281, + "longitude": -82.948337, + "city": "Clyde", + "state": "OH", + "county": "Sandusky" + }, + { + "zip_code": 43412, + "latitude": 41.597798, + "longitude": -83.357328, + "city": "Curtice", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43413, + "latitude": 41.226545, + "longitude": -83.664525, + "city": "Cygnet", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43414, + "latitude": 41.39235, + "longitude": -83.648996, + "city": "Dunbridge", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43416, + "latitude": 41.57267, + "longitude": -83.078075, + "city": "Elmore", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43420, + "latitude": 41.35622, + "longitude": -83.133981, + "city": "Fremont", + "state": "OH", + "county": "Sandusky" + }, + { + "zip_code": 43430, + "latitude": 41.524657, + "longitude": -83.352477, + "city": "Genoa", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43431, + "latitude": 41.392094, + "longitude": -83.317648, + "city": "Gibsonburg", + "state": "OH", + "county": "Sandusky" + }, + { + "zip_code": 43432, + "latitude": 41.564723, + "longitude": -83.26128, + "city": "Graytown", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43433, + "latitude": 41.503759, + "longitude": -82.87084, + "city": "Gypsum", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43434, + "latitude": 41.645699, + "longitude": -83.620233, + "city": "Harbor View", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43435, + "latitude": 41.325996, + "longitude": -83.318648, + "city": "Helena", + "state": "OH", + "county": "Sandusky" + }, + { + "zip_code": 43436, + "latitude": 41.715332, + "longitude": -82.822697, + "city": "Isle Saint George", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43437, + "latitude": 41.255902, + "longitude": -83.602198, + "city": "Jerry City", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43438, + "latitude": 41.59593, + "longitude": -82.706816, + "city": "Kelleys Island", + "state": "OH", + "county": "Erie" + }, + { + "zip_code": 43439, + "latitude": 41.518115, + "longitude": -83.041312, + "city": "Lacarne", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43440, + "latitude": 41.524698, + "longitude": -82.776567, + "city": "Lakeside Marblehead", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43441, + "latitude": 41.536132, + "longitude": -83.45938, + "city": "Lemoyne", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43442, + "latitude": 41.422628, + "longitude": -83.231171, + "city": "Lindsey", + "state": "OH", + "county": "Sandusky" + }, + { + "zip_code": 43443, + "latitude": 41.457596, + "longitude": -83.473648, + "city": "Luckey", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43445, + "latitude": 41.569398, + "longitude": -83.311577, + "city": "Martin", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43446, + "latitude": 41.683477, + "longitude": -82.804677, + "city": "Middle Bass", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43447, + "latitude": 41.426265, + "longitude": -83.512454, + "city": "Millbury", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43449, + "latitude": 41.53653, + "longitude": -83.144869, + "city": "Oak Harbor", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43450, + "latitude": 41.398798, + "longitude": -83.484086, + "city": "Pemberville", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43451, + "latitude": 41.315346, + "longitude": -83.621091, + "city": "Portage", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43452, + "latitude": 41.558318, + "longitude": -83.050219, + "city": "Port Clinton", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43456, + "latitude": 41.647236, + "longitude": -82.819009, + "city": "Put In Bay", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43457, + "latitude": 41.336722, + "longitude": -83.466992, + "city": "Risingsun", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43458, + "latitude": 41.530157, + "longitude": -83.21276, + "city": "Rocky Ridge", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43460, + "latitude": 41.458371, + "longitude": -83.529646, + "city": "Rossford", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43462, + "latitude": 41.283902, + "longitude": -83.72564, + "city": "Rudolph", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43463, + "latitude": 41.509051, + "longitude": -83.508531, + "city": "Stony Ridge", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43464, + "latitude": 41.396673, + "longitude": -82.921319, + "city": "Vickery", + "state": "OH", + "county": "Sandusky" + }, + { + "zip_code": 43465, + "latitude": 41.462958, + "longitude": -83.49109, + "city": "Walbridge", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43466, + "latitude": 41.296984, + "longitude": -83.524683, + "city": "Wayne", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43467, + "latitude": 41.24264, + "longitude": -83.489583, + "city": "West Millgrove", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43468, + "latitude": 41.605048, + "longitude": -83.338128, + "city": "Williston", + "state": "OH", + "county": "Ottawa" + }, + { + "zip_code": 43469, + "latitude": 41.42021, + "longitude": -83.31686, + "city": "Woodville", + "state": "OH", + "county": "Sandusky" + }, + { + "zip_code": 43501, + "latitude": 41.577786, + "longitude": -84.584125, + "city": "Alvordton", + "state": "OH", + "county": "Williams" + }, + { + "zip_code": 43502, + "latitude": 41.578355, + "longitude": -84.25106, + "city": "Archbold", + "state": "OH", + "county": "Fulton" + }, + { + "zip_code": 43504, + "latitude": 41.606301, + "longitude": -83.822288, + "city": "Berkey", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43505, + "latitude": 41.523945, + "longitude": -84.730275, + "city": "Blakeslee", + "state": "OH", + "county": "Williams" + }, + { + "zip_code": 43506, + "latitude": 41.553851, + "longitude": -84.585209, + "city": "Bryan", + "state": "OH", + "county": "Williams" + }, + { + "zip_code": 43510, + "latitude": 41.419878, + "longitude": -84.013674, + "city": "Colton", + "state": "OH", + "county": "Henry" + }, + { + "zip_code": 43511, + "latitude": 41.259285, + "longitude": -83.811421, + "city": "Custar", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43512, + "latitude": 41.296657, + "longitude": -84.390413, + "city": "Defiance", + "state": "OH", + "county": "Defiance" + }, + { + "zip_code": 43515, + "latitude": 41.58568, + "longitude": -84.124257, + "city": "Delta", + "state": "OH", + "county": "Fulton" + }, + { + "zip_code": 43516, + "latitude": 41.232641, + "longitude": -83.949391, + "city": "Deshler", + "state": "OH", + "county": "Henry" + }, + { + "zip_code": 43517, + "latitude": 41.554099, + "longitude": -84.620862, + "city": "Edgerton", + "state": "OH", + "county": "Williams" + }, + { + "zip_code": 43518, + "latitude": 41.58754, + "longitude": -84.738401, + "city": "Edon", + "state": "OH", + "county": "Williams" + }, + { + "zip_code": 43519, + "latitude": 41.422158, + "longitude": -84.396619, + "city": "Evansport", + "state": "OH", + "county": "Defiance" + }, + { + "zip_code": 43520, + "latitude": 41.39066, + "longitude": -84.631322, + "city": "Farmer", + "state": "OH", + "county": "Defiance" + }, + { + "zip_code": 43521, + "latitude": 41.649036, + "longitude": -84.28596, + "city": "Fayette", + "state": "OH", + "county": "Fulton" + }, + { + "zip_code": 43522, + "latitude": 41.394707, + "longitude": -83.834935, + "city": "Grand Rapids", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43523, + "latitude": 41.341081, + "longitude": -84.000532, + "city": "Grelton", + "state": "OH", + "county": "Henry" + }, + { + "zip_code": 43524, + "latitude": 41.230082, + "longitude": -84.035807, + "city": "Hamler", + "state": "OH", + "county": "Henry" + }, + { + "zip_code": 43525, + "latitude": 41.466702, + "longitude": -83.705486, + "city": "Haskins", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43526, + "latitude": 41.325013, + "longitude": -84.678021, + "city": "Hicksville", + "state": "OH", + "county": "Defiance" + }, + { + "zip_code": 43527, + "latitude": 41.23175, + "longitude": -84.129612, + "city": "Holgate", + "state": "OH", + "county": "Henry" + }, + { + "zip_code": 43528, + "latitude": 41.628501, + "longitude": -83.751138, + "city": "Holland", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43529, + "latitude": 41.187234, + "longitude": -83.784704, + "city": "Hoytville", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43530, + "latitude": 41.325764, + "longitude": -84.279306, + "city": "Jewell", + "state": "OH", + "county": "Defiance" + }, + { + "zip_code": 43531, + "latitude": 41.634007, + "longitude": -84.502598, + "city": "Kunkle", + "state": "OH", + "county": "Williams" + }, + { + "zip_code": 43532, + "latitude": 41.429356, + "longitude": -84.008448, + "city": "Liberty Center", + "state": "OH", + "county": "Henry" + }, + { + "zip_code": 43533, + "latitude": 41.68575, + "longitude": -84.161891, + "city": "Lyons", + "state": "OH", + "county": "Fulton" + }, + { + "zip_code": 43534, + "latitude": 41.356582, + "longitude": -83.941313, + "city": "Mc Clure", + "state": "OH", + "county": "Henry" + }, + { + "zip_code": 43535, + "latitude": 41.305439, + "longitude": -84.003632, + "city": "Malinta", + "state": "OH", + "county": "Henry" + }, + { + "zip_code": 43536, + "latitude": 41.31085, + "longitude": -84.640393, + "city": "Mark Center", + "state": "OH", + "county": "Defiance" + }, + { + "zip_code": 43537, + "latitude": 41.571251, + "longitude": -83.685036, + "city": "Maumee", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43540, + "latitude": 41.688656, + "longitude": -84.104541, + "city": "Metamora", + "state": "OH", + "county": "Fulton" + }, + { + "zip_code": 43541, + "latitude": 41.300891, + "longitude": -83.829596, + "city": "Milton Center", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43542, + "latitude": 41.577251, + "longitude": -83.772378, + "city": "Monclova", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43543, + "latitude": 41.606061, + "longitude": -84.588777, + "city": "Montpelier", + "state": "OH", + "county": "Williams" + }, + { + "zip_code": 43545, + "latitude": 41.355586, + "longitude": -84.123028, + "city": "Napoleon", + "state": "OH", + "county": "Henry" + }, + { + "zip_code": 43547, + "latitude": 41.491952, + "longitude": -83.870598, + "city": "Neapolis", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43548, + "latitude": 41.194308, + "longitude": -84.141421, + "city": "New Bavaria", + "state": "OH", + "county": "Henry" + }, + { + "zip_code": 43549, + "latitude": 41.361864, + "longitude": -84.51582, + "city": "Ney", + "state": "OH", + "county": "Defiance" + }, + { + "zip_code": 43550, + "latitude": 41.326664, + "longitude": -84.111701, + "city": "Okolona", + "state": "OH", + "county": "Henry" + }, + { + "zip_code": 43551, + "latitude": 41.535057, + "longitude": -83.577701, + "city": "Perrysburg", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43552, + "latitude": 41.39235, + "longitude": -83.648996, + "city": "Perrysburg", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43553, + "latitude": 41.531033, + "longitude": -84.225646, + "city": "Pettisville", + "state": "OH", + "county": "Fulton" + }, + { + "zip_code": 43554, + "latitude": 41.648218, + "longitude": -84.585241, + "city": "Pioneer", + "state": "OH", + "county": "Williams" + }, + { + "zip_code": 43555, + "latitude": 41.435059, + "longitude": -84.254414, + "city": "Ridgeville Corners", + "state": "OH", + "county": "Henry" + }, + { + "zip_code": 43556, + "latitude": 41.318045, + "longitude": -84.569545, + "city": "Sherwood", + "state": "OH", + "county": "Defiance" + }, + { + "zip_code": 43557, + "latitude": 41.488708, + "longitude": -84.409876, + "city": "Stryker", + "state": "OH", + "county": "Williams" + }, + { + "zip_code": 43558, + "latitude": 41.593787, + "longitude": -84.103035, + "city": "Swanton", + "state": "OH", + "county": "Fulton" + }, + { + "zip_code": 43560, + "latitude": 41.6929, + "longitude": -83.727737, + "city": "Sylvania", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43565, + "latitude": 41.423102, + "longitude": -83.747936, + "city": "Tontogany", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43566, + "latitude": 41.513751, + "longitude": -83.765287, + "city": "Waterville", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43567, + "latitude": 41.59151, + "longitude": -84.178148, + "city": "Wauseon", + "state": "OH", + "county": "Fulton" + }, + { + "zip_code": 43569, + "latitude": 41.35002, + "longitude": -83.796033, + "city": "Weston", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43570, + "latitude": 41.591453, + "longitude": -84.447033, + "city": "West Unity", + "state": "OH", + "county": "Williams" + }, + { + "zip_code": 43571, + "latitude": 41.509602, + "longitude": -83.801789, + "city": "Whitehouse", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43601, + "latitude": 41.720684, + "longitude": -83.569359, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43602, + "latitude": 41.647449, + "longitude": -83.548128, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43603, + "latitude": 41.686778, + "longitude": -83.43943, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43604, + "latitude": 41.655798, + "longitude": -83.536833, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43605, + "latitude": 41.652548, + "longitude": -83.508482, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43606, + "latitude": 41.674099, + "longitude": -83.604535, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43607, + "latitude": 41.647399, + "longitude": -83.606785, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43608, + "latitude": 41.681648, + "longitude": -83.531983, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43609, + "latitude": 41.624749, + "longitude": -83.584234, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43610, + "latitude": 41.673449, + "longitude": -83.556083, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43611, + "latitude": 41.698298, + "longitude": -83.486382, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43612, + "latitude": 41.695847, + "longitude": -83.460181, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43613, + "latitude": 41.703548, + "longitude": -83.606235, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43614, + "latitude": 41.609041, + "longitude": -83.633941, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43615, + "latitude": 41.6496, + "longitude": -83.678586, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43616, + "latitude": 41.656948, + "longitude": -83.44433, + "city": "Oregon", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43617, + "latitude": 41.66765, + "longitude": -83.722437, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43618, + "latitude": 41.656948, + "longitude": -83.399129, + "city": "Oregon", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43619, + "latitude": 41.596099, + "longitude": -83.485681, + "city": "Northwood", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 43620, + "latitude": 41.664849, + "longitude": -83.553933, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43623, + "latitude": 41.702949, + "longitude": -83.682686, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43624, + "latitude": 41.654599, + "longitude": -83.546233, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43635, + "latitude": 41.686778, + "longitude": -83.43943, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43652, + "latitude": 41.686778, + "longitude": -83.43943, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43653, + "latitude": 41.686778, + "longitude": -83.43943, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43654, + "latitude": 41.686778, + "longitude": -83.43943, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43655, + "latitude": 41.686778, + "longitude": -83.43943, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43656, + "latitude": 41.678167, + "longitude": -83.497155, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43657, + "latitude": 41.686778, + "longitude": -83.43943, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43659, + "latitude": 41.686778, + "longitude": -83.43943, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43660, + "latitude": 41.654649, + "longitude": -83.532883, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43661, + "latitude": 41.678167, + "longitude": -83.497155, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43666, + "latitude": 41.678167, + "longitude": -83.497155, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43667, + "latitude": 41.686778, + "longitude": -83.43943, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43681, + "latitude": 41.686778, + "longitude": -83.43943, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43682, + "latitude": 41.686778, + "longitude": -83.43943, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43697, + "latitude": 41.686778, + "longitude": -83.43943, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43699, + "latitude": 41.653788, + "longitude": -83.658937, + "city": "Toledo", + "state": "OH", + "county": "Lucas" + }, + { + "zip_code": 43701, + "latitude": 39.927415, + "longitude": -82.004058, + "city": "Zanesville", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43702, + "latitude": 39.961236, + "longitude": -81.962539, + "city": "Zanesville", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43711, + "latitude": 39.827556, + "longitude": -81.554854, + "city": "Ava", + "state": "OH", + "county": "Noble" + }, + { + "zip_code": 43713, + "latitude": 39.985318, + "longitude": -81.137495, + "city": "Barnesville", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43716, + "latitude": 39.780188, + "longitude": -80.991731, + "city": "Beallsville", + "state": "OH", + "county": "Monroe" + }, + { + "zip_code": 43717, + "latitude": 39.768475, + "longitude": -81.465752, + "city": "Belle Valley", + "state": "OH", + "county": "Noble" + }, + { + "zip_code": 43718, + "latitude": 40.004009, + "longitude": -80.988043, + "city": "Belmont", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43719, + "latitude": 39.996312, + "longitude": -81.065991, + "city": "Bethesda", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43720, + "latitude": 39.820021, + "longitude": -81.876343, + "city": "Blue Rock", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43721, + "latitude": 39.94518, + "longitude": -82.255984, + "city": "Brownsville", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43722, + "latitude": 39.91944, + "longitude": -81.53113, + "city": "Buffalo", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43723, + "latitude": 39.953185, + "longitude": -81.531919, + "city": "Byesville", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43724, + "latitude": 39.744446, + "longitude": -81.483049, + "city": "Caldwell", + "state": "OH", + "county": "Noble" + }, + { + "zip_code": 43725, + "latitude": 40.02701, + "longitude": -81.582025, + "city": "Cambridge", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43727, + "latitude": 39.865211, + "longitude": -81.799363, + "city": "Chandlersville", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43728, + "latitude": 39.497841, + "longitude": -81.898307, + "city": "Chesterhill", + "state": "OH", + "county": "Morgan" + }, + { + "zip_code": 43730, + "latitude": 39.636069, + "longitude": -82.110219, + "city": "Corning", + "state": "OH", + "county": "Perry" + }, + { + "zip_code": 43731, + "latitude": 39.704142, + "longitude": -82.165011, + "city": "Crooksville", + "state": "OH", + "county": "Perry" + }, + { + "zip_code": 43732, + "latitude": 39.88812, + "longitude": -81.617372, + "city": "Cumberland", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43733, + "latitude": 39.923616, + "longitude": -81.542965, + "city": "Derwent", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43734, + "latitude": 39.872071, + "longitude": -81.89422, + "city": "Duncan Falls", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43735, + "latitude": 39.853931, + "longitude": -82.121262, + "city": "East Fultonham", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43736, + "latitude": 40.064971, + "longitude": -81.255793, + "city": "Fairview", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43738, + "latitude": 39.855525, + "longitude": -82.137754, + "city": "Fultonham", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43739, + "latitude": 39.884312, + "longitude": -82.297706, + "city": "Glenford", + "state": "OH", + "county": "Perry" + }, + { + "zip_code": 43740, + "latitude": 39.953262, + "longitude": -82.211784, + "city": "Gratiot", + "state": "OH", + "county": "Licking" + }, + { + "zip_code": 43746, + "latitude": 39.970024, + "longitude": -82.174647, + "city": "Hopewell", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43747, + "latitude": 39.82588, + "longitude": -81.123561, + "city": "Jerusalem", + "state": "OH", + "county": "Monroe" + }, + { + "zip_code": 43748, + "latitude": 39.684697, + "longitude": -82.302787, + "city": "Junction City", + "state": "OH", + "county": "Perry" + }, + { + "zip_code": 43749, + "latitude": 40.158911, + "longitude": -81.548992, + "city": "Kimbolton", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43750, + "latitude": 39.994467, + "longitude": -81.500579, + "city": "Kipling", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43752, + "latitude": 39.717086, + "longitude": -81.009999, + "city": "Laings", + "state": "OH", + "county": "Monroe" + }, + { + "zip_code": 43754, + "latitude": 39.74607, + "longitude": -81.227706, + "city": "Lewisville", + "state": "OH", + "county": "Monroe" + }, + { + "zip_code": 43755, + "latitude": 40.052671, + "longitude": -81.435723, + "city": "Lore City", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43756, + "latitude": 39.676688, + "longitude": -81.81256, + "city": "Mc Connelsville", + "state": "OH", + "county": "Morgan" + }, + { + "zip_code": 43757, + "latitude": 39.859373, + "longitude": -81.151604, + "city": "Malaga", + "state": "OH", + "county": "Monroe" + }, + { + "zip_code": 43758, + "latitude": 39.632381, + "longitude": -81.908715, + "city": "Malta", + "state": "OH", + "county": "Morgan" + }, + { + "zip_code": 43759, + "latitude": 40.011338, + "longitude": -80.970135, + "city": "Morristown", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43760, + "latitude": 39.760789, + "longitude": -82.20775, + "city": "Mount Perry", + "state": "OH", + "county": "Perry" + }, + { + "zip_code": 43761, + "latitude": 39.740299, + "longitude": -82.248369, + "city": "Moxahala", + "state": "OH", + "county": "Perry" + }, + { + "zip_code": 43762, + "latitude": 40.024342, + "longitude": -81.767017, + "city": "New Concord", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43764, + "latitude": 39.706051, + "longitude": -82.20614, + "city": "New Lexington", + "state": "OH", + "county": "Perry" + }, + { + "zip_code": 43766, + "latitude": 39.619477, + "longitude": -82.252758, + "city": "New Straitsville", + "state": "OH", + "county": "Perry" + }, + { + "zip_code": 43767, + "latitude": 40.011106, + "longitude": -81.804302, + "city": "Norwich", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43768, + "latitude": 40.039201, + "longitude": -81.452164, + "city": "Old Washington", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43771, + "latitude": 39.822159, + "longitude": -81.954582, + "city": "Philo", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43772, + "latitude": 39.918285, + "longitude": -81.551647, + "city": "Pleasant City", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43773, + "latitude": 40.040755, + "longitude": -81.313561, + "city": "Quaker City", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43777, + "latitude": 39.821869, + "longitude": -82.039389, + "city": "Roseville", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43778, + "latitude": 40.015591, + "longitude": -81.373692, + "city": "Salesville", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43779, + "latitude": 39.816285, + "longitude": -81.428046, + "city": "Sarahsville", + "state": "OH", + "county": "Noble" + }, + { + "zip_code": 43780, + "latitude": 39.9427, + "longitude": -81.458577, + "city": "Senecaville", + "state": "OH", + "county": "Guernsey" + }, + { + "zip_code": 43782, + "latitude": 39.625239, + "longitude": -82.214886, + "city": "Shawnee", + "state": "OH", + "county": "Perry" + }, + { + "zip_code": 43783, + "latitude": 39.736529, + "longitude": -82.278894, + "city": "Somerset", + "state": "OH", + "county": "Perry" + }, + { + "zip_code": 43786, + "latitude": 39.711168, + "longitude": -81.275824, + "city": "Stafford", + "state": "OH", + "county": "Monroe" + }, + { + "zip_code": 43787, + "latitude": 39.548994, + "longitude": -81.826194, + "city": "Stockport", + "state": "OH", + "county": "Morgan" + }, + { + "zip_code": 43788, + "latitude": 39.795107, + "longitude": -81.370927, + "city": "Summerfield", + "state": "OH", + "county": "Noble" + }, + { + "zip_code": 43789, + "latitude": 39.654386, + "longitude": -81.240732, + "city": "Sycamore Valley", + "state": "OH", + "county": "Monroe" + }, + { + "zip_code": 43791, + "latitude": 39.87133, + "longitude": -82.098668, + "city": "White Cottage", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43793, + "latitude": 39.751516, + "longitude": -81.075921, + "city": "Woodsfield", + "state": "OH", + "county": "Monroe" + }, + { + "zip_code": 43802, + "latitude": 40.090767, + "longitude": -81.855203, + "city": "Adamsville", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43803, + "latitude": 40.357237, + "longitude": -81.643638, + "city": "Bakersville", + "state": "OH", + "county": "Coshocton" + }, + { + "zip_code": 43804, + "latitude": 40.426559, + "longitude": -81.67444, + "city": "Baltic", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 43805, + "latitude": 40.398274, + "longitude": -81.968787, + "city": "Blissfield", + "state": "OH", + "county": "Coshocton" + }, + { + "zip_code": 43811, + "latitude": 40.247685, + "longitude": -81.929225, + "city": "Conesville", + "state": "OH", + "county": "Coshocton" + }, + { + "zip_code": 43812, + "latitude": 40.300934, + "longitude": -81.864066, + "city": "Coshocton", + "state": "OH", + "county": "Coshocton" + }, + { + "zip_code": 43821, + "latitude": 40.106916, + "longitude": -81.999822, + "city": "Dresden", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43822, + "latitude": 40.108668, + "longitude": -82.103212, + "city": "Frazeysburg", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43824, + "latitude": 40.364667, + "longitude": -81.755507, + "city": "Fresno", + "state": "OH", + "county": "Coshocton" + }, + { + "zip_code": 43828, + "latitude": 40.351271, + "longitude": -81.873607, + "city": "Keene", + "state": "OH", + "county": "Coshocton" + }, + { + "zip_code": 43830, + "latitude": 40.063883, + "longitude": -82.099574, + "city": "Nashport", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43832, + "latitude": 40.33031, + "longitude": -81.571033, + "city": "Newcomerstown", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 43836, + "latitude": 40.200382, + "longitude": -81.720675, + "city": "Plainfield", + "state": "OH", + "county": "Coshocton" + }, + { + "zip_code": 43837, + "latitude": 40.306936, + "longitude": -81.467895, + "city": "Port Washington", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 43840, + "latitude": 40.404888, + "longitude": -81.602889, + "city": "Stone Creek", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 43842, + "latitude": 40.143323, + "longitude": -81.995016, + "city": "Trinway", + "state": "OH", + "county": "Muskingum" + }, + { + "zip_code": 43843, + "latitude": 40.340702, + "longitude": -82.155887, + "city": "Walhonding", + "state": "OH", + "county": "Coshocton" + }, + { + "zip_code": 43844, + "latitude": 40.3198, + "longitude": -81.958266, + "city": "Warsaw", + "state": "OH", + "county": "Coshocton" + }, + { + "zip_code": 43845, + "latitude": 40.27446, + "longitude": -81.82464, + "city": "West Lafayette", + "state": "OH", + "county": "Coshocton" + }, + { + "zip_code": 43901, + "latitude": 40.260579, + "longitude": -80.789377, + "city": "Adena", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43902, + "latitude": 39.894917, + "longitude": -80.980056, + "city": "Alledonia", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43903, + "latitude": 40.486354, + "longitude": -80.84505, + "city": "Amsterdam", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43905, + "latitude": 40.107367, + "longitude": -80.84441, + "city": "Barton", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43906, + "latitude": 39.991864, + "longitude": -80.805716, + "city": "Bellaire", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43907, + "latitude": 40.263163, + "longitude": -81.030687, + "city": "Cadiz", + "state": "OH", + "county": "Harrison" + }, + { + "zip_code": 43908, + "latitude": 40.50022, + "longitude": -80.856529, + "city": "Bergholz", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43909, + "latitude": 40.070102, + "longitude": -80.817605, + "city": "Blaine", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43910, + "latitude": 40.341244, + "longitude": -80.774815, + "city": "Bloomingdale", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43912, + "latitude": 40.092799, + "longitude": -80.788948, + "city": "Bridgeport", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43913, + "latitude": 40.323767, + "longitude": -80.768624, + "city": "Brilliant", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43914, + "latitude": 39.768729, + "longitude": -80.945431, + "city": "Cameron", + "state": "OH", + "county": "Monroe" + }, + { + "zip_code": 43915, + "latitude": 39.744008, + "longitude": -80.903818, + "city": "Clarington", + "state": "OH", + "county": "Monroe" + }, + { + "zip_code": 43916, + "latitude": 40.122351, + "longitude": -80.814948, + "city": "Colerain", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43917, + "latitude": 40.333811, + "longitude": -80.77266, + "city": "Dillonvale", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43920, + "latitude": 40.677372, + "longitude": -80.600629, + "city": "East Liverpool", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 43925, + "latitude": 40.415106, + "longitude": -80.756661, + "city": "East Springfield", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43926, + "latitude": 40.509225, + "longitude": -80.624051, + "city": "Empire", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43927, + "latitude": 40.12245, + "longitude": -80.938031, + "city": "Fairpoint", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43928, + "latitude": 40.010896, + "longitude": -80.899286, + "city": "Glencoe", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43930, + "latitude": 40.460885, + "longitude": -80.719014, + "city": "Hammondsville", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43931, + "latitude": 39.676317, + "longitude": -80.891369, + "city": "Hannibal", + "state": "OH", + "county": "Monroe" + }, + { + "zip_code": 43932, + "latitude": 40.525504, + "longitude": -80.763971, + "city": "Irondale", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43933, + "latitude": 39.937228, + "longitude": -80.888014, + "city": "Jacobsburg", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43934, + "latitude": 40.079975, + "longitude": -80.800316, + "city": "Lansing", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43935, + "latitude": 40.117231, + "longitude": -80.758087, + "city": "Martins Ferry", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43937, + "latitude": 40.130167, + "longitude": -80.877264, + "city": "Maynard", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43938, + "latitude": 40.358475, + "longitude": -80.762054, + "city": "Mingo Junction", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43939, + "latitude": 40.17699, + "longitude": -80.782734, + "city": "Mount Pleasant", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43940, + "latitude": 40.028448, + "longitude": -80.824454, + "city": "Neffs", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43941, + "latitude": 40.263948, + "longitude": -80.835767, + "city": "Piney Fork", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43942, + "latitude": 40.006175, + "longitude": -80.960745, + "city": "Powhatan Point", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43943, + "latitude": 40.337357, + "longitude": -80.771562, + "city": "Rayland", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43944, + "latitude": 40.441964, + "longitude": -80.791768, + "city": "Richmond", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43945, + "latitude": 40.649533, + "longitude": -80.822333, + "city": "Salineville", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 43946, + "latitude": 39.646018, + "longitude": -80.970678, + "city": "Sardis", + "state": "OH", + "county": "Monroe" + }, + { + "zip_code": 43947, + "latitude": 39.950713, + "longitude": -80.804364, + "city": "Shadyside", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43948, + "latitude": 40.28006, + "longitude": -80.784927, + "city": "Smithfield", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43950, + "latitude": 40.077792, + "longitude": -80.978797, + "city": "Saint Clairsville", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43951, + "latitude": 40.11098, + "longitude": -81.010169, + "city": "Lafferty", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43952, + "latitude": 40.349541, + "longitude": -80.746759, + "city": "Steubenville", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43953, + "latitude": 40.352418, + "longitude": -80.678099, + "city": "Steubenville", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43961, + "latitude": 40.518479, + "longitude": -80.628515, + "city": "Stratton", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43962, + "latitude": 40.679456, + "longitude": -80.881583, + "city": "Summitville", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 43963, + "latitude": 40.22676, + "longitude": -80.738107, + "city": "Tiltonsville", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43964, + "latitude": 40.477049, + "longitude": -80.670057, + "city": "Toronto", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43966, + "latitude": 40.360979, + "longitude": -80.839519, + "city": "Unionport", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43967, + "latitude": 40.020007, + "longitude": -80.916901, + "city": "Warnock", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43968, + "latitude": 40.650362, + "longitude": -80.692008, + "city": "Wellsville", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 43970, + "latitude": 40.46947, + "longitude": -80.889206, + "city": "Wolf Run", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43971, + "latitude": 40.338699, + "longitude": -80.810216, + "city": "Yorkville", + "state": "OH", + "county": "Jefferson" + }, + { + "zip_code": 43972, + "latitude": 40.103155, + "longitude": -80.975639, + "city": "Bannock", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43973, + "latitude": 40.230697, + "longitude": -81.223669, + "city": "Freeport", + "state": "OH", + "county": "Harrison" + }, + { + "zip_code": 43974, + "latitude": 40.181476, + "longitude": -80.888159, + "city": "Harrisville", + "state": "OH", + "county": "Harrison" + }, + { + "zip_code": 43976, + "latitude": 40.314449, + "longitude": -81.070506, + "city": "Hopedale", + "state": "OH", + "county": "Harrison" + }, + { + "zip_code": 43977, + "latitude": 40.115634, + "longitude": -81.090224, + "city": "Flushing", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43981, + "latitude": 40.183933, + "longitude": -80.995856, + "city": "New Athens", + "state": "OH", + "county": "Harrison" + }, + { + "zip_code": 43983, + "latitude": 40.134188, + "longitude": -81.194538, + "city": "Piedmont", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43984, + "latitude": 40.29649, + "longitude": -81.102502, + "city": "New Rumley", + "state": "OH", + "county": "Harrison" + }, + { + "zip_code": 43985, + "latitude": 40.011338, + "longitude": -80.970135, + "city": "Holloway", + "state": "OH", + "county": "Belmont" + }, + { + "zip_code": 43986, + "latitude": 40.370274, + "longitude": -80.996826, + "city": "Jewett", + "state": "OH", + "county": "Harrison" + }, + { + "zip_code": 43988, + "latitude": 40.307421, + "longitude": -81.104831, + "city": "Scio", + "state": "OH", + "county": "Harrison" + }, + { + "zip_code": 43989, + "latitude": 40.29649, + "longitude": -81.102502, + "city": "Short Creek", + "state": "OH", + "county": "Harrison" + }, + { + "zip_code": 44001, + "latitude": 41.361746, + "longitude": -82.253828, + "city": "Amherst", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44003, + "latitude": 41.740136, + "longitude": -80.602278, + "city": "Andover", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44004, + "latitude": 41.772583, + "longitude": -80.74349, + "city": "Ashtabula", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44005, + "latitude": 41.730146, + "longitude": -80.955313, + "city": "Ashtabula", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44010, + "latitude": 41.772459, + "longitude": -80.856463, + "city": "Austinburg", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44011, + "latitude": 41.448492, + "longitude": -82.019866, + "city": "Avon", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44012, + "latitude": 41.49674, + "longitude": -82.017527, + "city": "Avon Lake", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44017, + "latitude": 41.456905, + "longitude": -81.693019, + "city": "Berea", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44021, + "latitude": 41.447117, + "longitude": -81.152938, + "city": "Burton", + "state": "OH", + "county": "Geauga" + }, + { + "zip_code": 44022, + "latitude": 41.449353, + "longitude": -81.431436, + "city": "Chagrin Falls", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44023, + "latitude": 41.387203, + "longitude": -81.304222, + "city": "Chagrin Falls", + "state": "OH", + "county": "Geauga" + }, + { + "zip_code": 44024, + "latitude": 41.572432, + "longitude": -81.157142, + "city": "Chardon", + "state": "OH", + "county": "Geauga" + }, + { + "zip_code": 44026, + "latitude": 41.530351, + "longitude": -81.307472, + "city": "Chesterland", + "state": "OH", + "county": "Geauga" + }, + { + "zip_code": 44028, + "latitude": 41.3056, + "longitude": -81.949111, + "city": "Columbia Station", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44030, + "latitude": 41.756356, + "longitude": -80.616195, + "city": "Conneaut", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44032, + "latitude": 41.677076, + "longitude": -80.673288, + "city": "Dorset", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44033, + "latitude": 41.53335, + "longitude": -81.111175, + "city": "East Claridon", + "state": "OH", + "county": "Geauga" + }, + { + "zip_code": 44035, + "latitude": 41.371396, + "longitude": -82.105112, + "city": "Elyria", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44036, + "latitude": 41.401494, + "longitude": -82.077068, + "city": "Elyria", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44039, + "latitude": 41.377776, + "longitude": -82.019365, + "city": "North Ridgeville", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44040, + "latitude": 41.513251, + "longitude": -81.414597, + "city": "Gates Mills", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44041, + "latitude": 41.736396, + "longitude": -80.785627, + "city": "Geneva", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44044, + "latitude": 41.2745, + "longitude": -82.046168, + "city": "Grafton", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44045, + "latitude": 41.742693, + "longitude": -81.282125, + "city": "Grand River", + "state": "OH", + "county": "Lake" + }, + { + "zip_code": 44046, + "latitude": 41.538433, + "longitude": -81.073366, + "city": "Huntsburg", + "state": "OH", + "county": "Geauga" + }, + { + "zip_code": 44047, + "latitude": 41.700536, + "longitude": -80.693315, + "city": "Jefferson", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44048, + "latitude": 41.846175, + "longitude": -80.647299, + "city": "Kingsville", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44049, + "latitude": 41.26635, + "longitude": -82.306383, + "city": "Kipton", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44050, + "latitude": 41.258201, + "longitude": -82.119671, + "city": "Lagrange", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44052, + "latitude": 41.450991, + "longitude": -82.166534, + "city": "Lorain", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44053, + "latitude": 41.425292, + "longitude": -82.218185, + "city": "Lorain", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44054, + "latitude": 41.463541, + "longitude": -82.089769, + "city": "Sheffield Lake", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44055, + "latitude": 41.434492, + "longitude": -82.134021, + "city": "Lorain", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44056, + "latitude": 41.311288, + "longitude": -81.492511, + "city": "Macedonia", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44057, + "latitude": 41.781467, + "longitude": -81.073247, + "city": "Madison", + "state": "OH", + "county": "Lake" + }, + { + "zip_code": 44060, + "latitude": 41.679291, + "longitude": -81.328779, + "city": "Mentor", + "state": "OH", + "county": "Lake" + }, + { + "zip_code": 44061, + "latitude": 41.910676, + "longitude": -81.249027, + "city": "Mentor", + "state": "OH", + "county": "Lake" + }, + { + "zip_code": 44062, + "latitude": 41.453242, + "longitude": -81.068303, + "city": "Middlefield", + "state": "OH", + "county": "Geauga" + }, + { + "zip_code": 44064, + "latitude": 41.603114, + "longitude": -81.051767, + "city": "Montville", + "state": "OH", + "county": "Geauga" + }, + { + "zip_code": 44065, + "latitude": 41.456099, + "longitude": -81.273831, + "city": "Newbury", + "state": "OH", + "county": "Geauga" + }, + { + "zip_code": 44067, + "latitude": 41.306454, + "longitude": -81.54079, + "city": "Northfield", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44068, + "latitude": 41.904594, + "longitude": -80.685034, + "city": "North Kingsville", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44070, + "latitude": 41.417347, + "longitude": -81.922461, + "city": "North Olmsted", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44072, + "latitude": 41.468754, + "longitude": -81.328211, + "city": "Novelty", + "state": "OH", + "county": "Geauga" + }, + { + "zip_code": 44073, + "latitude": 41.837043, + "longitude": -80.955545, + "city": "Novelty", + "state": "OH", + "county": "Geauga" + }, + { + "zip_code": 44074, + "latitude": 41.294649, + "longitude": -82.227628, + "city": "Oberlin", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44076, + "latitude": 41.588584, + "longitude": -80.834349, + "city": "Orwell", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44077, + "latitude": 41.707918, + "longitude": -81.19903, + "city": "Painesville", + "state": "OH", + "county": "Lake" + }, + { + "zip_code": 44080, + "latitude": 41.364495, + "longitude": -81.053411, + "city": "Parkman", + "state": "OH", + "county": "Geauga" + }, + { + "zip_code": 44081, + "latitude": 41.768495, + "longitude": -81.14626, + "city": "Perry", + "state": "OH", + "county": "Lake" + }, + { + "zip_code": 44082, + "latitude": 41.769302, + "longitude": -80.573251, + "city": "Pierpont", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44084, + "latitude": 41.689765, + "longitude": -80.905118, + "city": "Rock Creek", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44085, + "latitude": 41.624828, + "longitude": -80.770777, + "city": "Rome", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44086, + "latitude": 41.673116, + "longitude": -81.052453, + "city": "Thompson", + "state": "OH", + "county": "Geauga" + }, + { + "zip_code": 44087, + "latitude": 41.313304, + "longitude": -81.440435, + "city": "Twinsburg", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44088, + "latitude": 41.783323, + "longitude": -81.003385, + "city": "Unionville", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44089, + "latitude": 41.380755, + "longitude": -82.401637, + "city": "Vermilion", + "state": "OH", + "county": "Erie" + }, + { + "zip_code": 44090, + "latitude": 41.160846, + "longitude": -82.211778, + "city": "Wellington", + "state": "OH", + "county": "Lorain" + }, + { + "zip_code": 44092, + "latitude": 41.597299, + "longitude": -81.458638, + "city": "Wickliffe", + "state": "OH", + "county": "Lake" + }, + { + "zip_code": 44093, + "latitude": 41.535263, + "longitude": -80.726693, + "city": "Williamsfield", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44094, + "latitude": 41.637997, + "longitude": -81.377383, + "city": "Willoughby", + "state": "OH", + "county": "Lake" + }, + { + "zip_code": 44095, + "latitude": 41.658653, + "longitude": -81.444531, + "city": "Eastlake", + "state": "OH", + "county": "Lake" + }, + { + "zip_code": 44096, + "latitude": 41.910676, + "longitude": -81.249027, + "city": "Willoughby", + "state": "OH", + "county": "Lake" + }, + { + "zip_code": 44097, + "latitude": 41.910676, + "longitude": -81.249027, + "city": "Eastlake", + "state": "OH", + "county": "Lake" + }, + { + "zip_code": 44099, + "latitude": 41.549414, + "longitude": -80.967673, + "city": "Windsor", + "state": "OH", + "county": "Ashtabula" + }, + { + "zip_code": 44101, + "latitude": 41.523401, + "longitude": -81.599648, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44102, + "latitude": 41.47225, + "longitude": -81.740305, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44103, + "latitude": 41.51805, + "longitude": -81.6425, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44104, + "latitude": 41.480502, + "longitude": -81.629599, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44105, + "latitude": 41.452502, + "longitude": -81.632912, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44106, + "latitude": 41.504751, + "longitude": -81.602799, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44107, + "latitude": 41.514849, + "longitude": -81.637249, + "city": "Lakewood", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44108, + "latitude": 41.54345, + "longitude": -81.608297, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44109, + "latitude": 41.445963, + "longitude": -81.698483, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44110, + "latitude": 41.5641, + "longitude": -81.57156, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44111, + "latitude": 41.4595, + "longitude": -81.787006, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44112, + "latitude": 41.528632, + "longitude": -81.545576, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44113, + "latitude": 41.473782, + "longitude": -81.64297, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44114, + "latitude": 41.5145, + "longitude": -81.677302, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44115, + "latitude": 41.490351, + "longitude": -81.675602, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44116, + "latitude": 41.469497, + "longitude": -81.849209, + "city": "Rocky River", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44117, + "latitude": 41.566834, + "longitude": -81.526142, + "city": "Euclid", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44118, + "latitude": 41.500752, + "longitude": -81.551645, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44119, + "latitude": 41.583849, + "longitude": -81.544409, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44120, + "latitude": 41.473102, + "longitude": -81.579746, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44121, + "latitude": 41.527651, + "longitude": -81.532344, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44122, + "latitude": 41.473248, + "longitude": -81.505389, + "city": "Beachwood", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44123, + "latitude": 41.602548, + "longitude": -81.525842, + "city": "Euclid", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44124, + "latitude": 41.501001, + "longitude": -81.469427, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44125, + "latitude": 41.43349, + "longitude": -81.632298, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44126, + "latitude": 41.442927, + "longitude": -81.852959, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44127, + "latitude": 41.472551, + "longitude": -81.64919, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44128, + "latitude": 41.439352, + "longitude": -81.533893, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44129, + "latitude": 41.437052, + "longitude": -81.626348, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44130, + "latitude": 41.3826, + "longitude": -81.796406, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44131, + "latitude": 41.395652, + "longitude": -81.64231, + "city": "Independence", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44132, + "latitude": 41.606049, + "longitude": -81.510858, + "city": "Euclid", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44133, + "latitude": 41.314603, + "longitude": -81.745102, + "city": "North Royalton", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44134, + "latitude": 41.381701, + "longitude": -81.726551, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44135, + "latitude": 41.4797, + "longitude": -81.653799, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44136, + "latitude": 41.313268, + "longitude": -81.831656, + "city": "Strongsville", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44137, + "latitude": 41.404703, + "longitude": -81.557493, + "city": "Maple Heights", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44138, + "latitude": 41.4656, + "longitude": -81.768304, + "city": "Olmsted Falls", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44139, + "latitude": 41.386753, + "longitude": -81.440322, + "city": "Solon", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44140, + "latitude": 41.490967, + "longitude": -81.921513, + "city": "Bay Village", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44141, + "latitude": 41.362052, + "longitude": -81.643247, + "city": "Brecksville", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44142, + "latitude": 41.401, + "longitude": -81.832107, + "city": "Brookpark", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44143, + "latitude": 41.55915, + "longitude": -81.48279, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44144, + "latitude": 41.438501, + "longitude": -81.739804, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44145, + "latitude": 41.445145, + "longitude": -81.921811, + "city": "Westlake", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44146, + "latitude": 41.389054, + "longitude": -81.536842, + "city": "Bedford", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44147, + "latitude": 41.314053, + "longitude": -81.673099, + "city": "Broadview Heights", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44149, + "latitude": "", + "longitude": "", + "city": "Strongsville", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44177, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44178, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44179, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44181, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44184, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44185, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44186, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44188, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44189, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44190, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44191, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44192, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44193, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44194, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44195, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44197, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44198, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44199, + "latitude": 41.685744, + "longitude": -81.672797, + "city": "Cleveland", + "state": "OH", + "county": "Cuyahoga" + }, + { + "zip_code": 44201, + "latitude": 41.040507, + "longitude": -81.194614, + "city": "Atwater", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44202, + "latitude": 41.311704, + "longitude": -81.292977, + "city": "Aurora", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44203, + "latitude": 41.019655, + "longitude": -81.621195, + "city": "Barberton", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44210, + "latitude": 41.128705, + "longitude": -81.53999, + "city": "Bath", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44211, + "latitude": 41.169816, + "longitude": -81.312416, + "city": "Brady Lake", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44212, + "latitude": 41.206132, + "longitude": -81.82281, + "city": "Brunswick", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44214, + "latitude": 40.927483, + "longitude": -81.996351, + "city": "Burbank", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44215, + "latitude": 41.065342, + "longitude": -81.901693, + "city": "Chippewa Lake", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44216, + "latitude": 40.948706, + "longitude": -81.571443, + "city": "Clinton", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44217, + "latitude": 40.945417, + "longitude": -81.912937, + "city": "Creston", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44221, + "latitude": 41.143906, + "longitude": -81.473585, + "city": "Cuyahoga Falls", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44222, + "latitude": 41.128705, + "longitude": -81.53999, + "city": "Cuyahoga Falls", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44223, + "latitude": 41.170605, + "longitude": -81.526738, + "city": "Cuyahoga Falls", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44224, + "latitude": 41.172402, + "longitude": -81.450184, + "city": "Stow", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44230, + "latitude": 40.958926, + "longitude": -81.770787, + "city": "Doylestown", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44231, + "latitude": 41.291405, + "longitude": -81.081534, + "city": "Garrettsville", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44232, + "latitude": 40.932506, + "longitude": -81.461987, + "city": "Green", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44233, + "latitude": 41.23648, + "longitude": -81.736072, + "city": "Hinckley", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44234, + "latitude": 41.310354, + "longitude": -81.1652, + "city": "Hiram", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44235, + "latitude": 41.038796, + "longitude": -82.113597, + "city": "Homerville", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44236, + "latitude": 41.244023, + "longitude": -81.476335, + "city": "Hudson", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44237, + "latitude": 41.128705, + "longitude": -81.53999, + "city": "Hudson", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44238, + "latitude": 41.128705, + "longitude": -81.53999, + "city": "Hudson", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44240, + "latitude": 41.205705, + "longitude": -81.313278, + "city": "Kent", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44241, + "latitude": 41.241655, + "longitude": -81.340528, + "city": "Streetsboro", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44242, + "latitude": 41.170006, + "longitude": -81.196615, + "city": "Kent", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44243, + "latitude": 41.147537, + "longitude": -81.341531, + "city": "Kent", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44250, + "latitude": 41.022156, + "longitude": -81.427942, + "city": "Lakemore", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44251, + "latitude": 41.028837, + "longitude": -81.928342, + "city": "Westfield Center", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44253, + "latitude": 41.162553, + "longitude": -82.020109, + "city": "Litchfield", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44254, + "latitude": 41.044913, + "longitude": -81.992065, + "city": "Lodi", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44255, + "latitude": 41.282355, + "longitude": -81.229924, + "city": "Mantua", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44256, + "latitude": 41.109975, + "longitude": -81.855048, + "city": "Medina", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44258, + "latitude": 41.127594, + "longitude": -81.841079, + "city": "Medina", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44260, + "latitude": 41.026954, + "longitude": -81.404982, + "city": "Mogadore", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44262, + "latitude": 41.138206, + "longitude": -81.431677, + "city": "Munroe Falls", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44264, + "latitude": 41.230355, + "longitude": -81.549261, + "city": "Peninsula", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44265, + "latitude": 41.010907, + "longitude": -81.297727, + "city": "Randolph", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44266, + "latitude": 41.163755, + "longitude": -81.172922, + "city": "Ravenna", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44270, + "latitude": 40.949448, + "longitude": -81.862397, + "city": "Rittman", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44272, + "latitude": 41.078728, + "longitude": -81.173572, + "city": "Rootstown", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44273, + "latitude": 41.044552, + "longitude": -81.960694, + "city": "Seville", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44274, + "latitude": 41.09924, + "longitude": -81.734329, + "city": "Sharon Center", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44275, + "latitude": 41.081789, + "longitude": -82.052299, + "city": "Spencer", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44276, + "latitude": 40.936853, + "longitude": -81.830515, + "city": "Sterling", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44278, + "latitude": 41.096656, + "longitude": -81.428883, + "city": "Tallmadge", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44280, + "latitude": 41.233736, + "longitude": -81.917187, + "city": "Valley City", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44281, + "latitude": 41.071841, + "longitude": -81.751008, + "city": "Wadsworth", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44282, + "latitude": 41.132725, + "longitude": -81.929185, + "city": "Wadsworth", + "state": "OH", + "county": "Medina" + }, + { + "zip_code": 44285, + "latitude": 41.159706, + "longitude": -81.070017, + "city": "Wayland", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44286, + "latitude": 41.235492, + "longitude": -81.621093, + "city": "Richfield", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44287, + "latitude": 40.925084, + "longitude": -82.070909, + "city": "West Salem", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44288, + "latitude": 41.239066, + "longitude": -81.096118, + "city": "Windham", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44301, + "latitude": 41.012239, + "longitude": -81.507831, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44302, + "latitude": 41.090605, + "longitude": -81.539039, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44303, + "latitude": 41.104355, + "longitude": -81.535089, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44304, + "latitude": 41.083293, + "longitude": -81.506187, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44305, + "latitude": 41.078706, + "longitude": -81.458435, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44306, + "latitude": 41.041805, + "longitude": -81.479986, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44307, + "latitude": 41.073207, + "longitude": -81.543889, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44308, + "latitude": 41.082455, + "longitude": -81.517438, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44309, + "latitude": 41.096205, + "longitude": -81.512338, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44310, + "latitude": 41.105505, + "longitude": -81.498182, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44311, + "latitude": 41.064955, + "longitude": -81.522838, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44312, + "latitude": 41.018961, + "longitude": -81.443312, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44313, + "latitude": 41.16112, + "longitude": -81.576591, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44314, + "latitude": 41.041555, + "longitude": -81.559791, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44315, + "latitude": 41.027977, + "longitude": -81.463238, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44316, + "latitude": 41.067506, + "longitude": -81.484686, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44317, + "latitude": 41.052455, + "longitude": -81.529139, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44319, + "latitude": 40.978755, + "longitude": -81.524376, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44320, + "latitude": 41.07739, + "longitude": -81.579391, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44321, + "latitude": 41.100154, + "longitude": -81.644346, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44322, + "latitude": 41.049143, + "longitude": -81.581032, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44325, + "latitude": 41.076425, + "longitude": -81.51026, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44326, + "latitude": 41.172713, + "longitude": -81.472701, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44328, + "latitude": 41.075955, + "longitude": -81.520588, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44333, + "latitude": 41.155154, + "longitude": -81.631394, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44334, + "latitude": 41.128705, + "longitude": -81.53999, + "city": "Fairlawn", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44372, + "latitude": 41.128705, + "longitude": -81.53999, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44393, + "latitude": 41.128705, + "longitude": -81.53999, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44396, + "latitude": 41.128705, + "longitude": -81.53999, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44397, + "latitude": 41.071603, + "longitude": -81.525556, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44398, + "latitude": 41.128705, + "longitude": -81.53999, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44399, + "latitude": 41.128705, + "longitude": -81.53999, + "city": "Akron", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44401, + "latitude": 41.034545, + "longitude": -80.928626, + "city": "Berlin Center", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44402, + "latitude": 41.376806, + "longitude": -80.866704, + "city": "Bristolville", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44403, + "latitude": 41.238176, + "longitude": -80.573511, + "city": "Brookfield", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44404, + "latitude": 41.329006, + "longitude": -80.559111, + "city": "Burghill", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44405, + "latitude": 41.077708, + "longitude": -80.591894, + "city": "Campbell", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44406, + "latitude": 41.008621, + "longitude": -80.822094, + "city": "Canfield", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44408, + "latitude": 40.857858, + "longitude": -80.730023, + "city": "Columbiana", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44410, + "latitude": 41.354945, + "longitude": -80.778301, + "city": "Cortland", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44411, + "latitude": 41.037807, + "longitude": -81.061016, + "city": "Deerfield", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44412, + "latitude": 41.102836, + "longitude": -81.049216, + "city": "Diamond", + "state": "OH", + "county": "Portage" + }, + { + "zip_code": 44413, + "latitude": 40.837509, + "longitude": -80.646556, + "city": "East Palestine", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44415, + "latitude": 40.76304, + "longitude": -80.704245, + "city": "Elkton", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44416, + "latitude": 41.017082, + "longitude": -80.802854, + "city": "Ellsworth", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44417, + "latitude": 41.416766, + "longitude": -80.667111, + "city": "Farmdale", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44418, + "latitude": 41.307463, + "longitude": -80.602868, + "city": "Fowler", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44420, + "latitude": 41.17133, + "longitude": -80.795028, + "city": "Girard", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44422, + "latitude": 41.017082, + "longitude": -80.802854, + "city": "Greenford", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44423, + "latitude": 40.760843, + "longitude": -80.887866, + "city": "Hanoverton", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44424, + "latitude": 41.309096, + "longitude": -80.584681, + "city": "Hartford", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44425, + "latitude": 41.236088, + "longitude": -80.736973, + "city": "Hubbard", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44427, + "latitude": 40.729298, + "longitude": -80.942791, + "city": "Kensington", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44428, + "latitude": 41.327247, + "longitude": -80.601336, + "city": "Kinsman", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44429, + "latitude": 41.097587, + "longitude": -80.973988, + "city": "Lake Milton", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44430, + "latitude": 41.24112, + "longitude": -80.886138, + "city": "Leavittsburg", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44431, + "latitude": 40.837984, + "longitude": -80.749844, + "city": "Leetonia", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44432, + "latitude": 40.743051, + "longitude": -80.745313, + "city": "Lisbon", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44436, + "latitude": 41.056428, + "longitude": -80.549561, + "city": "Lowellville", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44437, + "latitude": 41.151895, + "longitude": -80.751899, + "city": "Mc Donald", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44438, + "latitude": 41.263559, + "longitude": -80.54444, + "city": "Masury", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44439, + "latitude": 41.459359, + "longitude": -80.942716, + "city": "Mesopotamia", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44440, + "latitude": 41.168441, + "longitude": -80.78209, + "city": "Mineral Ridge", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44441, + "latitude": 40.763029, + "longitude": -80.572088, + "city": "Negley", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44442, + "latitude": 40.965525, + "longitude": -80.54902, + "city": "New Middletown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44443, + "latitude": 40.928876, + "longitude": -80.587833, + "city": "New Springfield", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44444, + "latitude": 41.197392, + "longitude": -80.952731, + "city": "Newton Falls", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44445, + "latitude": 40.843906, + "longitude": -80.614381, + "city": "New Waterford", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44446, + "latitude": 41.186106, + "longitude": -80.742459, + "city": "Niles", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44449, + "latitude": 40.967155, + "longitude": -81.021052, + "city": "North Benton", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44450, + "latitude": 41.443995, + "longitude": -80.818751, + "city": "North Bloomfield", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44451, + "latitude": 41.075435, + "longitude": -80.86694, + "city": "North Jackson", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44452, + "latitude": 40.951177, + "longitude": -80.662484, + "city": "North Lima", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44453, + "latitude": 41.32519, + "longitude": -80.533572, + "city": "Orangeville", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44454, + "latitude": 40.929, + "longitude": -80.54758, + "city": "Petersburg", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44455, + "latitude": 40.778137, + "longitude": -80.605674, + "city": "Rogers", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44460, + "latitude": 40.862743, + "longitude": -80.763459, + "city": "Salem", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44470, + "latitude": 41.283579, + "longitude": -80.952784, + "city": "Southington", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44471, + "latitude": 41.050058, + "longitude": -80.591298, + "city": "Struthers", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44473, + "latitude": 41.2656, + "longitude": -80.704184, + "city": "Vienna", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44481, + "latitude": 41.248912, + "longitude": -80.867431, + "city": "Warren", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44482, + "latitude": 41.317424, + "longitude": -80.761269, + "city": "Warren", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44483, + "latitude": 41.242576, + "longitude": -80.720029, + "city": "Warren", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44484, + "latitude": 41.241952, + "longitude": -80.760752, + "city": "Warren", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44485, + "latitude": 41.249104, + "longitude": -80.8439, + "city": "Warren", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44486, + "latitude": 41.317424, + "longitude": -80.761269, + "city": "Warren", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44487, + "latitude": 41.317424, + "longitude": -80.761269, + "city": "Warren", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44488, + "latitude": 41.317424, + "longitude": -80.761269, + "city": "Warren", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44490, + "latitude": 40.896699, + "longitude": -80.767064, + "city": "Washingtonville", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44491, + "latitude": 41.368863, + "longitude": -80.950285, + "city": "West Farmington", + "state": "OH", + "county": "Trumbull" + }, + { + "zip_code": 44492, + "latitude": 40.709282, + "longitude": -80.70141, + "city": "West Point", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44493, + "latitude": 40.828584, + "longitude": -80.896714, + "city": "Winona", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44501, + "latitude": 41.017082, + "longitude": -80.802854, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44502, + "latitude": 41.087352, + "longitude": -80.638546, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44503, + "latitude": 41.099258, + "longitude": -80.655146, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44504, + "latitude": 41.122607, + "longitude": -80.65525, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44505, + "latitude": 41.108057, + "longitude": -80.616596, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44506, + "latitude": 41.095258, + "longitude": -80.626295, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44507, + "latitude": 41.074413, + "longitude": -80.655046, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44509, + "latitude": 41.109533, + "longitude": -80.693098, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44510, + "latitude": 41.120407, + "longitude": -80.668447, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44511, + "latitude": 41.067608, + "longitude": -80.698121, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44512, + "latitude": 41.025158, + "longitude": -80.668667, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44513, + "latitude": 41.017082, + "longitude": -80.802854, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44514, + "latitude": 41.009287, + "longitude": -80.618344, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44515, + "latitude": 41.097937, + "longitude": -80.759813, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44555, + "latitude": 41.103858, + "longitude": -80.643646, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44598, + "latitude": 41.017082, + "longitude": -80.802854, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44599, + "latitude": 41.017082, + "longitude": -80.802854, + "city": "Youngstown", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44601, + "latitude": 40.820292, + "longitude": -81.335275, + "city": "Alliance", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44606, + "latitude": 40.733099, + "longitude": -81.763389, + "city": "Apple Creek", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44607, + "latitude": 40.686028, + "longitude": -81.02187, + "city": "Augusta", + "state": "OH", + "county": "Carroll" + }, + { + "zip_code": 44608, + "latitude": 40.665824, + "longitude": -81.592696, + "city": "Beach City", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44609, + "latitude": 40.941802, + "longitude": -80.969891, + "city": "Beloit", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44610, + "latitude": 40.547385, + "longitude": -81.876602, + "city": "Berlin", + "state": "OH", + "county": "Holmes" + }, + { + "zip_code": 44611, + "latitude": 40.598522, + "longitude": -82.086715, + "city": "Big Prairie", + "state": "OH", + "county": "Holmes" + }, + { + "zip_code": 44612, + "latitude": 40.618002, + "longitude": -81.449534, + "city": "Bolivar", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44613, + "latitude": 40.714208, + "longitude": -81.595746, + "city": "Brewster", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44614, + "latitude": 40.808555, + "longitude": -81.488163, + "city": "Canal Fulton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44615, + "latitude": 40.571861, + "longitude": -81.064859, + "city": "Carrollton", + "state": "OH", + "county": "Carroll" + }, + { + "zip_code": 44617, + "latitude": 40.507088, + "longitude": -81.782872, + "city": "Charm", + "state": "OH", + "county": "Holmes" + }, + { + "zip_code": 44618, + "latitude": 40.757197, + "longitude": -81.76092, + "city": "Dalton", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44619, + "latitude": 40.902146, + "longitude": -80.962843, + "city": "Damascus", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44620, + "latitude": 40.587709, + "longitude": -81.226442, + "city": "Dellroy", + "state": "OH", + "county": "Carroll" + }, + { + "zip_code": 44621, + "latitude": 40.416656, + "longitude": -81.352297, + "city": "Dennison", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44622, + "latitude": 40.492563, + "longitude": -81.47911, + "city": "Dover", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44624, + "latitude": 40.589023, + "longitude": -81.605824, + "city": "Dundee", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44625, + "latitude": 40.770542, + "longitude": -80.981107, + "city": "East Rochester", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44626, + "latitude": 40.695388, + "longitude": -81.381386, + "city": "East Sparta", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44627, + "latitude": 40.696545, + "longitude": -81.831036, + "city": "Fredericksburg", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44628, + "latitude": 40.53833, + "longitude": -82.128771, + "city": "Glenmont", + "state": "OH", + "county": "Holmes" + }, + { + "zip_code": 44629, + "latitude": 40.335928, + "longitude": -81.430921, + "city": "Gnadenhutten", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44630, + "latitude": 40.929507, + "longitude": -81.400134, + "city": "Greentown", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44631, + "latitude": 40.521924, + "longitude": -81.003619, + "city": "Harlem Springs", + "state": "OH", + "county": "Carroll" + }, + { + "zip_code": 44632, + "latitude": 40.822158, + "longitude": -81.442635, + "city": "Hartville", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44633, + "latitude": 40.624618, + "longitude": -81.937501, + "city": "Holmesville", + "state": "OH", + "county": "Holmes" + }, + { + "zip_code": 44634, + "latitude": 40.830059, + "longitude": -81.033298, + "city": "Homeworth", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44636, + "latitude": 40.738387, + "longitude": -81.742811, + "city": "Kidron", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44637, + "latitude": 40.501625, + "longitude": -82.041222, + "city": "Killbuck", + "state": "OH", + "county": "Holmes" + }, + { + "zip_code": 44638, + "latitude": 40.614615, + "longitude": -82.128493, + "city": "Lakeville", + "state": "OH", + "county": "Holmes" + }, + { + "zip_code": 44639, + "latitude": 40.547688, + "longitude": -81.243498, + "city": "Leesville", + "state": "OH", + "county": "Carroll" + }, + { + "zip_code": 44640, + "latitude": 40.983558, + "longitude": -81.149664, + "city": "Limaville", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44641, + "latitude": 40.802406, + "longitude": -81.390056, + "city": "Louisville", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44643, + "latitude": 40.679881, + "longitude": -81.312133, + "city": "Magnolia", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44644, + "latitude": 40.590393, + "longitude": -81.200395, + "city": "Malvern", + "state": "OH", + "county": "Carroll" + }, + { + "zip_code": 44645, + "latitude": 40.908987, + "longitude": -81.725668, + "city": "Marshallville", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44646, + "latitude": 40.850643, + "longitude": -81.43535, + "city": "Massillon", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44647, + "latitude": 40.801057, + "longitude": -81.575795, + "city": "Massillon", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44648, + "latitude": 40.811809, + "longitude": -81.368284, + "city": "Massillon", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44650, + "latitude": 40.874558, + "longitude": -81.173873, + "city": "Maximo", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44651, + "latitude": 40.629918, + "longitude": -80.959514, + "city": "Mechanicstown", + "state": "OH", + "county": "Carroll" + }, + { + "zip_code": 44652, + "latitude": 40.895057, + "longitude": -81.326195, + "city": "Middlebranch", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44653, + "latitude": 40.437981, + "longitude": -81.372875, + "city": "Midvale", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44654, + "latitude": 40.544738, + "longitude": -81.878772, + "city": "Millersburg", + "state": "OH", + "county": "Holmes" + }, + { + "zip_code": 44656, + "latitude": 40.570507, + "longitude": -81.343581, + "city": "Mineral City", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44657, + "latitude": 40.749759, + "longitude": -81.175266, + "city": "Minerva", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44659, + "latitude": 40.690225, + "longitude": -81.692787, + "city": "Mount Eaton", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44660, + "latitude": 40.622284, + "longitude": -81.782532, + "city": "Mount Hope", + "state": "OH", + "county": "Holmes" + }, + { + "zip_code": 44661, + "latitude": 40.593256, + "longitude": -82.11676, + "city": "Nashville", + "state": "OH", + "county": "Holmes" + }, + { + "zip_code": 44662, + "latitude": 40.708566, + "longitude": -81.535805, + "city": "Navarre", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44663, + "latitude": 40.511632, + "longitude": -81.458777, + "city": "New Philadelphia", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44665, + "latitude": 40.843563, + "longitude": -80.979435, + "city": "North Georgetown", + "state": "OH", + "county": "Columbiana" + }, + { + "zip_code": 44666, + "latitude": 40.824937, + "longitude": -81.613396, + "city": "North Lawrence", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44667, + "latitude": 40.788723, + "longitude": -81.850598, + "city": "Orrville", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44669, + "latitude": 40.797908, + "longitude": -81.145349, + "city": "Paris", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44670, + "latitude": 40.764741, + "longitude": -81.187875, + "city": "Robertsville", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44671, + "latitude": 40.644174, + "longitude": -81.365254, + "city": "Sandyville", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44672, + "latitude": 40.920492, + "longitude": -81.021736, + "city": "Sebring", + "state": "OH", + "county": "Mahoning" + }, + { + "zip_code": 44675, + "latitude": 40.49571, + "longitude": -81.216271, + "city": "Sherrodsville", + "state": "OH", + "county": "Carroll" + }, + { + "zip_code": 44676, + "latitude": 40.71617, + "longitude": -82.028231, + "city": "Shreve", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44677, + "latitude": 40.872545, + "longitude": -81.855266, + "city": "Smithville", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44678, + "latitude": 40.56488, + "longitude": -81.352352, + "city": "Somerdale", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44679, + "latitude": 40.440407, + "longitude": -81.488516, + "city": "Stillwater", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44680, + "latitude": 40.598698, + "longitude": -81.549884, + "city": "Strasburg", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44681, + "latitude": 40.473446, + "longitude": -81.553581, + "city": "Sugarcreek", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44682, + "latitude": 40.395881, + "longitude": -81.406883, + "city": "Tuscarawas", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44683, + "latitude": 40.451788, + "longitude": -81.356471, + "city": "Uhrichsville", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44685, + "latitude": 40.969521, + "longitude": -81.458185, + "city": "Uniontown", + "state": "OH", + "county": "Summit" + }, + { + "zip_code": 44687, + "latitude": 40.551575, + "longitude": -81.728416, + "city": "Walnut Creek", + "state": "OH", + "county": "Holmes" + }, + { + "zip_code": 44688, + "latitude": 40.692071, + "longitude": -81.274199, + "city": "Waynesburg", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44689, + "latitude": 40.657981, + "longitude": -81.638348, + "city": "Wilmot", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44690, + "latitude": 40.616536, + "longitude": -81.681707, + "city": "Winesburg", + "state": "OH", + "county": "Holmes" + }, + { + "zip_code": 44691, + "latitude": 40.830699, + "longitude": -81.895377, + "city": "Wooster", + "state": "OH", + "county": "Wayne" + }, + { + "zip_code": 44693, + "latitude": 40.294686, + "longitude": -81.183933, + "city": "Deersville", + "state": "OH", + "county": "Harrison" + }, + { + "zip_code": 44695, + "latitude": 40.398846, + "longitude": -81.175864, + "city": "Bowerston", + "state": "OH", + "county": "Harrison" + }, + { + "zip_code": 44697, + "latitude": 40.61829, + "longitude": -81.414245, + "city": "Zoar", + "state": "OH", + "county": "Tuscarawas" + }, + { + "zip_code": 44699, + "latitude": 40.277046, + "longitude": -81.262892, + "city": "Tippecanoe", + "state": "OH", + "county": "Harrison" + }, + { + "zip_code": 44701, + "latitude": 40.782408, + "longitude": -81.371185, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44702, + "latitude": 40.800108, + "longitude": -81.379535, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44703, + "latitude": 40.808808, + "longitude": -81.379886, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44704, + "latitude": 40.799158, + "longitude": -81.345934, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44705, + "latitude": 40.830092, + "longitude": -81.330583, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44706, + "latitude": 40.741553, + "longitude": -81.430161, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44707, + "latitude": 40.759808, + "longitude": -81.350034, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44708, + "latitude": 40.825707, + "longitude": -81.436938, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44709, + "latitude": 40.80488, + "longitude": -81.387905, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44710, + "latitude": 40.789508, + "longitude": -81.426988, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44711, + "latitude": 40.811809, + "longitude": -81.368284, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44712, + "latitude": 40.811809, + "longitude": -81.368284, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44714, + "latitude": 40.834457, + "longitude": -81.360834, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44718, + "latitude": 40.846532, + "longitude": -81.440791, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44720, + "latitude": 40.895607, + "longitude": -81.433036, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44721, + "latitude": 40.891608, + "longitude": -81.318381, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44730, + "latitude": 40.770507, + "longitude": -81.26598, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44735, + "latitude": 40.811809, + "longitude": -81.368284, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44750, + "latitude": 40.784646, + "longitude": -81.418943, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44760, + "latitude": 40.853958, + "longitude": -81.42778, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44767, + "latitude": 40.895721, + "longitude": -81.424552, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44798, + "latitude": 40.811809, + "longitude": -81.368284, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44799, + "latitude": 40.811809, + "longitude": -81.368284, + "city": "Canton", + "state": "OH", + "county": "Stark" + }, + { + "zip_code": 44801, + "latitude": 41.090712, + "longitude": -83.365404, + "city": "Adrian", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44802, + "latitude": 41.054782, + "longitude": -83.391792, + "city": "Alvada", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44803, + "latitude": 41.037511, + "longitude": -82.910552, + "city": "Amsden", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44804, + "latitude": 41.115906, + "longitude": -83.535416, + "city": "Arcadia", + "state": "OH", + "county": "Hancock" + }, + { + "zip_code": 44805, + "latitude": 40.826965, + "longitude": -82.296131, + "city": "Ashland", + "state": "OH", + "county": "Ashland" + }, + { + "zip_code": 44807, + "latitude": 41.077343, + "longitude": -82.903207, + "city": "Attica", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44809, + "latitude": 41.132816, + "longitude": -83.285361, + "city": "Bascom", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44811, + "latitude": 41.216488, + "longitude": -82.793687, + "city": "Bellevue", + "state": "OH", + "county": "Huron" + }, + { + "zip_code": 44813, + "latitude": 40.646184, + "longitude": -82.481491, + "city": "Bellville", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44814, + "latitude": 41.338364, + "longitude": -82.459915, + "city": "Berlin Heights", + "state": "OH", + "county": "Erie" + }, + { + "zip_code": 44815, + "latitude": 41.246929, + "longitude": -83.239806, + "city": "Bettsville", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44816, + "latitude": 41.334898, + "longitude": -82.355035, + "city": "Birmingham", + "state": "OH", + "county": "Erie" + }, + { + "zip_code": 44817, + "latitude": 41.217112, + "longitude": -83.535075, + "city": "Bloomdale", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 44818, + "latitude": 41.046546, + "longitude": -82.968764, + "city": "Bloomville", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44820, + "latitude": 40.832674, + "longitude": -82.973876, + "city": "Bucyrus", + "state": "OH", + "county": "Crawford" + }, + { + "zip_code": 44822, + "latitude": 40.587193, + "longitude": -82.406952, + "city": "Butler", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44824, + "latitude": 41.366624, + "longitude": -82.785818, + "city": "Castalia", + "state": "OH", + "county": "Erie" + }, + { + "zip_code": 44825, + "latitude": 40.965022, + "longitude": -82.936698, + "city": "Chatfield", + "state": "OH", + "county": "Crawford" + }, + { + "zip_code": 44826, + "latitude": 41.166039, + "longitude": -82.489, + "city": "Collins", + "state": "OH", + "county": "Huron" + }, + { + "zip_code": 44827, + "latitude": 40.824607, + "longitude": -82.909054, + "city": "Crestline", + "state": "OH", + "county": "Crawford" + }, + { + "zip_code": 44828, + "latitude": 41.23707, + "longitude": -82.859705, + "city": "Flat Rock", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44830, + "latitude": 41.159551, + "longitude": -83.152472, + "city": "Fostoria", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44833, + "latitude": 40.746972, + "longitude": -82.823, + "city": "Galion", + "state": "OH", + "county": "Crawford" + }, + { + "zip_code": 44836, + "latitude": 41.186418, + "longitude": -83.042327, + "city": "Green Springs", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44837, + "latitude": 41.119451, + "longitude": -82.564392, + "city": "Greenwich", + "state": "OH", + "county": "Huron" + }, + { + "zip_code": 44838, + "latitude": 40.768006, + "longitude": -82.249991, + "city": "Hayesville", + "state": "OH", + "county": "Ashland" + }, + { + "zip_code": 44839, + "latitude": 41.375658, + "longitude": -82.538619, + "city": "Huron", + "state": "OH", + "county": "Erie" + }, + { + "zip_code": 44840, + "latitude": 40.78933, + "longitude": -82.206323, + "city": "Jeromesville", + "state": "OH", + "county": "Ashland" + }, + { + "zip_code": 44841, + "latitude": 41.228968, + "longitude": -83.310194, + "city": "Kansas", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44842, + "latitude": 40.656997, + "longitude": -82.236734, + "city": "Loudonville", + "state": "OH", + "county": "Ashland" + }, + { + "zip_code": 44843, + "latitude": 40.653256, + "longitude": -82.454979, + "city": "Lucas", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44844, + "latitude": 40.958503, + "longitude": -83.247403, + "city": "Mc Cutchenville", + "state": "OH", + "county": "Wyandot" + }, + { + "zip_code": 44845, + "latitude": 41.024204, + "longitude": -83.109783, + "city": "Melmore", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44846, + "latitude": 41.320775, + "longitude": -82.610479, + "city": "Milan", + "state": "OH", + "county": "Erie" + }, + { + "zip_code": 44847, + "latitude": 41.192976, + "longitude": -82.696315, + "city": "Monroeville", + "state": "OH", + "county": "Huron" + }, + { + "zip_code": 44848, + "latitude": 40.920617, + "longitude": -82.281695, + "city": "Nankin", + "state": "OH", + "county": "Ashland" + }, + { + "zip_code": 44849, + "latitude": 40.837199, + "longitude": -83.150116, + "city": "Nevada", + "state": "OH", + "county": "Wyandot" + }, + { + "zip_code": 44850, + "latitude": 41.034952, + "longitude": -82.676973, + "city": "New Haven", + "state": "OH", + "county": "Huron" + }, + { + "zip_code": 44851, + "latitude": 41.124479, + "longitude": -82.437501, + "city": "New London", + "state": "OH", + "county": "Huron" + }, + { + "zip_code": 44853, + "latitude": 41.061468, + "longitude": -83.298986, + "city": "New Riegel", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44854, + "latitude": 40.942627, + "longitude": -82.841736, + "city": "New Washington", + "state": "OH", + "county": "Crawford" + }, + { + "zip_code": 44855, + "latitude": 41.109479, + "longitude": -82.58654, + "city": "North Fairfield", + "state": "OH", + "county": "Huron" + }, + { + "zip_code": 44856, + "latitude": 40.793372, + "longitude": -82.856557, + "city": "North Robinson", + "state": "OH", + "county": "Crawford" + }, + { + "zip_code": 44857, + "latitude": 41.204562, + "longitude": -82.573222, + "city": "Norwalk", + "state": "OH", + "county": "Huron" + }, + { + "zip_code": 44859, + "latitude": 41.011373, + "longitude": -82.329107, + "city": "Nova", + "state": "OH", + "county": "Ashland" + }, + { + "zip_code": 44860, + "latitude": 40.835677, + "longitude": -83.102857, + "city": "Oceola", + "state": "OH", + "county": "Crawford" + }, + { + "zip_code": 44861, + "latitude": 41.235206, + "longitude": -83.15236, + "city": "Old Fort", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44862, + "latitude": 40.772874, + "longitude": -82.532057, + "city": "Ontario", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44864, + "latitude": 40.674683, + "longitude": -82.308743, + "city": "Perrysville", + "state": "OH", + "county": "Ashland" + }, + { + "zip_code": 44865, + "latitude": 40.849371, + "longitude": -82.57178, + "city": "Plymouth", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44866, + "latitude": 40.922051, + "longitude": -82.192733, + "city": "Polk", + "state": "OH", + "county": "Ashland" + }, + { + "zip_code": 44867, + "latitude": 41.146881, + "longitude": -82.970007, + "city": "Republic", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44870, + "latitude": 41.399129, + "longitude": -82.724417, + "city": "Sandusky", + "state": "OH", + "county": "Erie" + }, + { + "zip_code": 44871, + "latitude": 41.49181, + "longitude": -82.647824, + "city": "Sandusky", + "state": "OH", + "county": "Erie" + }, + { + "zip_code": 44874, + "latitude": 40.964517, + "longitude": -82.388476, + "city": "Savannah", + "state": "OH", + "county": "Ashland" + }, + { + "zip_code": 44875, + "latitude": 40.848784, + "longitude": -82.571998, + "city": "Shelby", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44878, + "latitude": 40.926203, + "longitude": -82.528622, + "city": "Shiloh", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44880, + "latitude": 41.028371, + "longitude": -82.242915, + "city": "Sullivan", + "state": "OH", + "county": "Ashland" + }, + { + "zip_code": 44881, + "latitude": 40.868645, + "longitude": -82.875027, + "city": "Sulphur Springs", + "state": "OH", + "county": "Crawford" + }, + { + "zip_code": 44882, + "latitude": 40.94245, + "longitude": -83.192192, + "city": "Sycamore", + "state": "OH", + "county": "Wyandot" + }, + { + "zip_code": 44883, + "latitude": 41.12453, + "longitude": -83.144773, + "city": "Tiffin", + "state": "OH", + "county": "Seneca" + }, + { + "zip_code": 44887, + "latitude": 40.914732, + "longitude": -82.806099, + "city": "Tiro", + "state": "OH", + "county": "Crawford" + }, + { + "zip_code": 44888, + "latitude": 41.141541, + "longitude": -82.588928, + "city": "Willard", + "state": "OH", + "county": "Huron" + }, + { + "zip_code": 44889, + "latitude": 41.211052, + "longitude": -82.417989, + "city": "Wakeman", + "state": "OH", + "county": "Huron" + }, + { + "zip_code": 44890, + "latitude": 41.120678, + "longitude": -82.697369, + "city": "Willard", + "state": "OH", + "county": "Huron" + }, + { + "zip_code": 44901, + "latitude": 40.850833, + "longitude": -82.511369, + "city": "Mansfield", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44902, + "latitude": 40.762711, + "longitude": -82.51189, + "city": "Mansfield", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44903, + "latitude": 40.80142, + "longitude": -82.538356, + "city": "Mansfield", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44904, + "latitude": 40.682416, + "longitude": -82.528564, + "city": "Mansfield", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44905, + "latitude": 40.777896, + "longitude": -82.461347, + "city": "Mansfield", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44906, + "latitude": 40.756992, + "longitude": -82.588394, + "city": "Mansfield", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44907, + "latitude": 40.726256, + "longitude": -82.52284, + "city": "Mansfield", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 44999, + "latitude": 40.772874, + "longitude": -82.532057, + "city": "Mansfield", + "state": "OH", + "county": "Richland" + }, + { + "zip_code": 45001, + "latitude": 39.135158, + "longitude": -84.709797, + "city": "Addyston", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45002, + "latitude": 39.191546, + "longitude": -84.742376, + "city": "Cleves", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45003, + "latitude": 39.547254, + "longitude": -84.599698, + "city": "College Corner", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45004, + "latitude": 39.440956, + "longitude": -84.575746, + "city": "Collinsville", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45005, + "latitude": 39.526049, + "longitude": -84.186961, + "city": "Franklin", + "state": "OH", + "county": "Warren" + }, + { + "zip_code": 45011, + "latitude": 39.425137, + "longitude": -84.472925, + "city": "Hamilton", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45012, + "latitude": 39.440956, + "longitude": -84.575746, + "city": "Hamilton", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45013, + "latitude": 39.436146, + "longitude": -84.618498, + "city": "Hamilton", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45014, + "latitude": 39.387357, + "longitude": -84.499743, + "city": "Fairfield", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45015, + "latitude": 39.349361, + "longitude": -84.537563, + "city": "Hamilton", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45018, + "latitude": 39.440956, + "longitude": -84.575746, + "city": "Fairfield", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45020, + "latitude": 39.440956, + "longitude": -84.575746, + "city": "Hamilton", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45023, + "latitude": 39.440956, + "longitude": -84.575746, + "city": "Hamilton", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45025, + "latitude": 39.440956, + "longitude": -84.575746, + "city": "Hamilton", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45026, + "latitude": 39.440956, + "longitude": -84.575746, + "city": "Hamilton", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45030, + "latitude": 39.244275, + "longitude": -84.736254, + "city": "Harrison", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45032, + "latitude": 39.501283, + "longitude": -84.006729, + "city": "Harveysburg", + "state": "OH", + "county": "Warren" + }, + { + "zip_code": 45033, + "latitude": 39.177259, + "longitude": -84.762731, + "city": "Hooven", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45034, + "latitude": 39.357963, + "longitude": -84.247288, + "city": "Kings Mills", + "state": "OH", + "county": "Warren" + }, + { + "zip_code": 45036, + "latitude": 39.429284, + "longitude": -84.173507, + "city": "Lebanon", + "state": "OH", + "county": "Warren" + }, + { + "zip_code": 45039, + "latitude": 39.316973, + "longitude": -84.243763, + "city": "Maineville", + "state": "OH", + "county": "Warren" + }, + { + "zip_code": 45040, + "latitude": 39.397999, + "longitude": -84.180906, + "city": "Mason", + "state": "OH", + "county": "Warren" + }, + { + "zip_code": 45041, + "latitude": 39.176088, + "longitude": -84.708517, + "city": "Miamitown", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45042, + "latitude": 39.543446, + "longitude": -84.442394, + "city": "Middletown", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45043, + "latitude": 39.440956, + "longitude": -84.575746, + "city": "Middletown", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45044, + "latitude": 39.418175, + "longitude": -84.424549, + "city": "Middletown", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45050, + "latitude": 39.448492, + "longitude": -84.374549, + "city": "Monroe", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45051, + "latitude": 39.09646, + "longitude": -84.643096, + "city": "Mount Saint Joseph", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45052, + "latitude": 39.149862, + "longitude": -84.750268, + "city": "North Bend", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45053, + "latitude": 39.354854, + "longitude": -84.776769, + "city": "Okeana", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45054, + "latitude": 39.458117, + "longitude": -84.079543, + "city": "Oregonia", + "state": "OH", + "county": "Warren" + }, + { + "zip_code": 45055, + "latitude": 39.451806, + "longitude": -84.515245, + "city": "Overpeck", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45056, + "latitude": 39.479227, + "longitude": -84.68575, + "city": "Oxford", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45061, + "latitude": 39.31235, + "longitude": -84.64828, + "city": "Ross", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45062, + "latitude": 39.478956, + "longitude": -84.551196, + "city": "Seven Mile", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45063, + "latitude": 39.325805, + "longitude": -84.712099, + "city": "Shandon", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45064, + "latitude": 39.545634, + "longitude": -84.6275, + "city": "Somerville", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45065, + "latitude": 39.356027, + "longitude": -84.207204, + "city": "South Lebanon", + "state": "OH", + "county": "Warren" + }, + { + "zip_code": 45066, + "latitude": 39.465762, + "longitude": -84.14633, + "city": "Springboro", + "state": "OH", + "county": "Warren" + }, + { + "zip_code": 45067, + "latitude": 39.48332, + "longitude": -84.489895, + "city": "Trenton", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45068, + "latitude": 39.51812, + "longitude": -84.0806, + "city": "Waynesville", + "state": "OH", + "county": "Warren" + }, + { + "zip_code": 45069, + "latitude": 39.336058, + "longitude": -84.40536, + "city": "West Chester", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45070, + "latitude": 39.594686, + "longitude": -84.54682, + "city": "West Elkton", + "state": "OH", + "county": "Preble" + }, + { + "zip_code": 45071, + "latitude": 39.440956, + "longitude": -84.575746, + "city": "West Chester", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45073, + "latitude": 39.440956, + "longitude": -84.575746, + "city": "Monroe", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45099, + "latitude": 39.440956, + "longitude": -84.575746, + "city": "Monroe", + "state": "OH", + "county": "Butler" + }, + { + "zip_code": 45101, + "latitude": 38.693525, + "longitude": -83.740804, + "city": "Aberdeen", + "state": "OH", + "county": "Brown" + }, + { + "zip_code": 45102, + "latitude": 39.014823, + "longitude": -84.205859, + "city": "Amelia", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45103, + "latitude": 39.025905, + "longitude": -84.157048, + "city": "Batavia", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45105, + "latitude": 38.749779, + "longitude": -83.612574, + "city": "Bentonville", + "state": "OH", + "county": "Adams" + }, + { + "zip_code": 45106, + "latitude": 38.922008, + "longitude": -84.109327, + "city": "Bethel", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45107, + "latitude": 39.40252, + "longitude": -83.894217, + "city": "Blanchester", + "state": "OH", + "county": "Clinton" + }, + { + "zip_code": 45110, + "latitude": 39.074262, + "longitude": -83.848414, + "city": "Buford", + "state": "OH", + "county": "Highland" + }, + { + "zip_code": 45111, + "latitude": 39.19977, + "longitude": -84.303075, + "city": "Camp Dennison", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45112, + "latitude": 38.792553, + "longitude": -84.138221, + "city": "Chilo", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45113, + "latitude": 39.398125, + "longitude": -83.932644, + "city": "Clarksville", + "state": "OH", + "county": "Clinton" + }, + { + "zip_code": 45114, + "latitude": 39.356846, + "longitude": -83.857237, + "city": "Cuba", + "state": "OH", + "county": "Clinton" + }, + { + "zip_code": 45115, + "latitude": 38.823707, + "longitude": -83.699476, + "city": "Decatur", + "state": "OH", + "county": "Brown" + }, + { + "zip_code": 45118, + "latitude": 39.1748, + "longitude": -83.935821, + "city": "Fayetteville", + "state": "OH", + "county": "Brown" + }, + { + "zip_code": 45119, + "latitude": 38.880632, + "longitude": -84.00874, + "city": "Feesburg", + "state": "OH", + "county": "Brown" + }, + { + "zip_code": 45120, + "latitude": 38.820683, + "longitude": -84.126923, + "city": "Felicity", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45121, + "latitude": 38.981336, + "longitude": -83.903529, + "city": "Georgetown", + "state": "OH", + "county": "Brown" + }, + { + "zip_code": 45122, + "latitude": 39.21292, + "longitude": -84.10444, + "city": "Goshen", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45123, + "latitude": 39.288414, + "longitude": -83.583223, + "city": "Greenfield", + "state": "OH", + "county": "Highland" + }, + { + "zip_code": 45130, + "latitude": 38.902187, + "longitude": -83.982347, + "city": "Hamersville", + "state": "OH", + "county": "Brown" + }, + { + "zip_code": 45131, + "latitude": 38.790301, + "longitude": -83.966624, + "city": "Higginsport", + "state": "OH", + "county": "Brown" + }, + { + "zip_code": 45132, + "latitude": 39.352669, + "longitude": -83.602424, + "city": "Highland", + "state": "OH", + "county": "Highland" + }, + { + "zip_code": 45133, + "latitude": 39.169164, + "longitude": -83.59454, + "city": "Hillsboro", + "state": "OH", + "county": "Highland" + }, + { + "zip_code": 45135, + "latitude": 39.270862, + "longitude": -83.595228, + "city": "Leesburg", + "state": "OH", + "county": "Highland" + }, + { + "zip_code": 45138, + "latitude": 39.416747, + "longitude": -83.647583, + "city": "Lees Creek", + "state": "OH", + "county": "Clinton" + }, + { + "zip_code": 45140, + "latitude": 39.223187, + "longitude": -84.245103, + "city": "Loveland", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45142, + "latitude": 39.200697, + "longitude": -83.777545, + "city": "Lynchburg", + "state": "OH", + "county": "Highland" + }, + { + "zip_code": 45144, + "latitude": 38.698772, + "longitude": -83.574357, + "city": "Manchester", + "state": "OH", + "county": "Adams" + }, + { + "zip_code": 45145, + "latitude": 39.145698, + "longitude": -84.007023, + "city": "Marathon", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45146, + "latitude": 39.313796, + "longitude": -83.796942, + "city": "Martinsville", + "state": "OH", + "county": "Clinton" + }, + { + "zip_code": 45147, + "latitude": 39.213739, + "longitude": -84.300232, + "city": "Miamiville", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45148, + "latitude": 39.291345, + "longitude": -83.885714, + "city": "Midland", + "state": "OH", + "county": "Clinton" + }, + { + "zip_code": 45150, + "latitude": 39.016349, + "longitude": -84.197778, + "city": "Milford", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45152, + "latitude": 39.342034, + "longitude": -84.106916, + "city": "Morrow", + "state": "OH", + "county": "Warren" + }, + { + "zip_code": 45153, + "latitude": 38.867485, + "longitude": -84.192222, + "city": "Moscow", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45154, + "latitude": 39.057857, + "longitude": -83.913915, + "city": "Mount Orab", + "state": "OH", + "county": "Brown" + }, + { + "zip_code": 45155, + "latitude": 39.038774, + "longitude": -83.750522, + "city": "Mowrystown", + "state": "OH", + "county": "Highland" + }, + { + "zip_code": 45156, + "latitude": 38.815645, + "longitude": -84.204877, + "city": "Neville", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45157, + "latitude": 38.9124, + "longitude": -84.206745, + "city": "New Richmond", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45158, + "latitude": 39.18779, + "longitude": -84.078313, + "city": "Newtonsville", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45159, + "latitude": 39.349254, + "longitude": -83.702933, + "city": "New Vienna", + "state": "OH", + "county": "Clinton" + }, + { + "zip_code": 45160, + "latitude": 39.123187, + "longitude": -84.135023, + "city": "Owensville", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45162, + "latitude": 39.294913, + "longitude": -84.092498, + "city": "Pleasant Plain", + "state": "OH", + "county": "Warren" + }, + { + "zip_code": 45164, + "latitude": 39.551413, + "longitude": -83.788084, + "city": "Port William", + "state": "OH", + "county": "Clinton" + }, + { + "zip_code": 45165, + "latitude": 39.198813, + "longitude": -83.607858, + "city": "Greenfield", + "state": "OH", + "county": "Highland" + }, + { + "zip_code": 45166, + "latitude": 39.480543, + "longitude": -83.677197, + "city": "Reesville", + "state": "OH", + "county": "Clinton" + }, + { + "zip_code": 45167, + "latitude": 38.758164, + "longitude": -83.822146, + "city": "Ripley", + "state": "OH", + "county": "Brown" + }, + { + "zip_code": 45168, + "latitude": 38.84798, + "longitude": -83.767404, + "city": "Russellville", + "state": "OH", + "county": "Brown" + }, + { + "zip_code": 45169, + "latitude": 39.438429, + "longitude": -83.680807, + "city": "Sabina", + "state": "OH", + "county": "Clinton" + }, + { + "zip_code": 45171, + "latitude": 39.005468, + "longitude": -83.799563, + "city": "Sardinia", + "state": "OH", + "county": "Brown" + }, + { + "zip_code": 45172, + "latitude": 39.07382, + "longitude": -83.385303, + "city": "Sinking Spring", + "state": "OH", + "county": "Highland" + }, + { + "zip_code": 45174, + "latitude": 39.153831, + "longitude": -84.329171, + "city": "Terrace Park", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45176, + "latitude": 39.013595, + "longitude": -84.050406, + "city": "Williamsburg", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45177, + "latitude": 39.444985, + "longitude": -83.824424, + "city": "Wilmington", + "state": "OH", + "county": "Clinton" + }, + { + "zip_code": 45201, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45202, + "latitude": 39.11026, + "longitude": -84.486142, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45203, + "latitude": 39.10886, + "longitude": -84.531993, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45204, + "latitude": 39.10016, + "longitude": -84.589645, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45205, + "latitude": 39.11161, + "longitude": -84.577994, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45206, + "latitude": 39.12616, + "longitude": -84.482642, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45207, + "latitude": 39.14311, + "longitude": -84.468842, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45208, + "latitude": 39.13786, + "longitude": -84.434891, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45209, + "latitude": 39.15471, + "longitude": -84.450692, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45210, + "latitude": 39.11451, + "longitude": -84.511093, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45211, + "latitude": 39.158409, + "longitude": -84.602646, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45212, + "latitude": 39.187659, + "longitude": -84.454342, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45213, + "latitude": 39.180214, + "longitude": -84.420441, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45214, + "latitude": 39.12186, + "longitude": -84.550594, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45215, + "latitude": 39.214259, + "longitude": -84.464093, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45216, + "latitude": 39.200309, + "longitude": -84.485893, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45217, + "latitude": 39.166109, + "longitude": -84.495893, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45218, + "latitude": 39.2774, + "longitude": -84.520544, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45219, + "latitude": 39.12851, + "longitude": -84.515191, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45220, + "latitude": 39.145559, + "longitude": -84.520093, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45221, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45222, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45223, + "latitude": 39.160002, + "longitude": -84.593605, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45224, + "latitude": 39.199058, + "longitude": -84.525094, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45225, + "latitude": 39.144309, + "longitude": -84.548944, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45226, + "latitude": 39.110111, + "longitude": -84.43088, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45227, + "latitude": 39.15926, + "longitude": -84.37284, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45228, + "latitude": 39.070561, + "longitude": -84.417891, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45229, + "latitude": 39.153559, + "longitude": -84.490043, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45230, + "latitude": 39.071262, + "longitude": -84.37584, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45231, + "latitude": 39.259325, + "longitude": -84.532395, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45232, + "latitude": 39.181109, + "longitude": -84.51166, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45233, + "latitude": 39.110994, + "longitude": -84.659396, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45234, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45235, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45236, + "latitude": 39.210001, + "longitude": -84.395046, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45237, + "latitude": 39.19069, + "longitude": -84.447342, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45238, + "latitude": 39.109209, + "longitude": -84.610845, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45239, + "latitude": 39.201708, + "longitude": -84.621296, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45240, + "latitude": 39.284357, + "longitude": -84.439066, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45241, + "latitude": 39.263837, + "longitude": -84.409191, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45242, + "latitude": 39.244659, + "longitude": -84.345489, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45243, + "latitude": 39.18481, + "longitude": -84.344758, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45244, + "latitude": 39.119102, + "longitude": -84.350974, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45245, + "latitude": 39.068815, + "longitude": -84.280171, + "city": "Cincinnati", + "state": "OH", + "county": "Clermont" + }, + { + "zip_code": 45246, + "latitude": 39.283858, + "longitude": -84.474394, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45247, + "latitude": 39.220761, + "longitude": -84.641752, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45248, + "latitude": 39.165158, + "longitude": -84.662509, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45249, + "latitude": 39.269226, + "longitude": -84.330686, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45250, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45251, + "latitude": 39.267157, + "longitude": -84.599285, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45252, + "latitude": 39.272557, + "longitude": -84.632143, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45253, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45254, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45255, + "latitude": 39.058412, + "longitude": -84.339639, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45258, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45262, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45263, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45264, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45267, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45268, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45269, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45270, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45271, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45273, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45274, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45275, + "latitude": 38.946921, + "longitude": -83.862877, + "city": "Cincinnati", + "state": "OH", + "county": "Brown" + }, + { + "zip_code": 45277, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45280, + "latitude": "", + "longitude": "", + "city": "Cincinnati", + "state": "OH", + "county": "" + }, + { + "zip_code": 45296, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45298, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45299, + "latitude": 39.262158, + "longitude": -84.509268, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45301, + "latitude": 39.706459, + "longitude": -84.016233, + "city": "Alpha", + "state": "OH", + "county": "Greene" + }, + { + "zip_code": 45302, + "latitude": 40.407239, + "longitude": -84.203271, + "city": "Anna", + "state": "OH", + "county": "Shelby" + }, + { + "zip_code": 45303, + "latitude": 40.214675, + "longitude": -84.653188, + "city": "Ansonia", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45304, + "latitude": 40.126915, + "longitude": -84.539928, + "city": "Arcanum", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45305, + "latitude": 39.632829, + "longitude": -84.049985, + "city": "Bellbrook", + "state": "OH", + "county": "Greene" + }, + { + "zip_code": 45306, + "latitude": 40.439778, + "longitude": -84.189245, + "city": "Botkins", + "state": "OH", + "county": "Shelby" + }, + { + "zip_code": 45307, + "latitude": 39.575597, + "longitude": -83.715323, + "city": "Bowersville", + "state": "OH", + "county": "Greene" + }, + { + "zip_code": 45308, + "latitude": 40.115737, + "longitude": -84.279352, + "city": "Bradford", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45309, + "latitude": 39.836157, + "longitude": -84.330392, + "city": "Brookville", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45310, + "latitude": 40.354106, + "longitude": -84.643532, + "city": "Burkettsville", + "state": "OH", + "county": "Mercer" + }, + { + "zip_code": 45311, + "latitude": 39.640948, + "longitude": -84.647001, + "city": "Camden", + "state": "OH", + "county": "Preble" + }, + { + "zip_code": 45312, + "latitude": 40.066567, + "longitude": -84.08161, + "city": "Casstown", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45314, + "latitude": 39.747459, + "longitude": -83.759973, + "city": "Cedarville", + "state": "OH", + "county": "Greene" + }, + { + "zip_code": 45315, + "latitude": 39.854454, + "longitude": -84.340345, + "city": "Clayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45316, + "latitude": 39.795971, + "longitude": -83.819766, + "city": "Clifton", + "state": "OH", + "county": "Greene" + }, + { + "zip_code": 45317, + "latitude": 40.137029, + "longitude": -84.046873, + "city": "Conover", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45318, + "latitude": 40.124386, + "longitude": -84.281167, + "city": "Covington", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45319, + "latitude": 39.918936, + "longitude": -83.944909, + "city": "Donnelsville", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45320, + "latitude": 39.77485, + "longitude": -84.674889, + "city": "Eaton", + "state": "OH", + "county": "Preble" + }, + { + "zip_code": 45321, + "latitude": 39.872177, + "longitude": -84.681067, + "city": "Eldorado", + "state": "OH", + "county": "Preble" + }, + { + "zip_code": 45322, + "latitude": 39.877005, + "longitude": -84.331945, + "city": "Englewood", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45323, + "latitude": 39.857967, + "longitude": -83.933431, + "city": "Enon", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45324, + "latitude": 39.728549, + "longitude": -84.014834, + "city": "Fairborn", + "state": "OH", + "county": "Greene" + }, + { + "zip_code": 45325, + "latitude": 39.781301, + "longitude": -84.41397, + "city": "Farmersville", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45326, + "latitude": 40.144491, + "longitude": -84.100988, + "city": "Fletcher", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45327, + "latitude": 39.747497, + "longitude": -84.396912, + "city": "Germantown", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45328, + "latitude": 40.114729, + "longitude": -84.493439, + "city": "Gettysburg", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45330, + "latitude": 39.641558, + "longitude": -84.527613, + "city": "Gratis", + "state": "OH", + "county": "Preble" + }, + { + "zip_code": 45331, + "latitude": 40.156478, + "longitude": -84.649068, + "city": "Greenville", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45332, + "latitude": 39.993964, + "longitude": -84.783714, + "city": "Hollansburg", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45333, + "latitude": 40.248489, + "longitude": -84.345612, + "city": "Houston", + "state": "OH", + "county": "Shelby" + }, + { + "zip_code": 45334, + "latitude": 40.434921, + "longitude": -84.058495, + "city": "Jackson Center", + "state": "OH", + "county": "Shelby" + }, + { + "zip_code": 45335, + "latitude": 39.674084, + "longitude": -83.766709, + "city": "Jamestown", + "state": "OH", + "county": "Greene" + }, + { + "zip_code": 45336, + "latitude": 40.441325, + "longitude": -84.262602, + "city": "Kettlersville", + "state": "OH", + "county": "Shelby" + }, + { + "zip_code": 45337, + "latitude": 39.985177, + "longitude": -84.399364, + "city": "Laura", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45338, + "latitude": 39.780916, + "longitude": -84.567331, + "city": "Lewisburg", + "state": "OH", + "county": "Preble" + }, + { + "zip_code": 45339, + "latitude": 40.005764, + "longitude": -84.351781, + "city": "Ludlow Falls", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45340, + "latitude": 40.364305, + "longitude": -84.056464, + "city": "Maplewood", + "state": "OH", + "county": "Shelby" + }, + { + "zip_code": 45341, + "latitude": 39.878918, + "longitude": -84.021827, + "city": "Medway", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45342, + "latitude": 39.641658, + "longitude": -84.27464, + "city": "Miamisburg", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45343, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Miamisburg", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45344, + "latitude": 39.959249, + "longitude": -83.986855, + "city": "New Carlisle", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45345, + "latitude": 39.800056, + "longitude": -84.327, + "city": "New Lebanon", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45346, + "latitude": 39.982103, + "longitude": -84.705736, + "city": "New Madison", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45347, + "latitude": 39.783378, + "longitude": -84.668892, + "city": "New Paris", + "state": "OH", + "county": "Preble" + }, + { + "zip_code": 45348, + "latitude": 40.316833, + "longitude": -84.633911, + "city": "New Weston", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45349, + "latitude": 39.989309, + "longitude": -83.938933, + "city": "North Hampton", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45350, + "latitude": 40.135426, + "longitude": -84.619129, + "city": "North Star", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45351, + "latitude": 40.340616, + "longitude": -84.496342, + "city": "Osgood", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45352, + "latitude": 40.050323, + "longitude": -84.745706, + "city": "Palestine", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45353, + "latitude": 40.29522, + "longitude": -84.032272, + "city": "Pemberton", + "state": "OH", + "county": "Shelby" + }, + { + "zip_code": 45354, + "latitude": 39.905385, + "longitude": -84.402785, + "city": "Phillipsburg", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45356, + "latitude": 40.123618, + "longitude": -84.228811, + "city": "Piqua", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45358, + "latitude": 39.987043, + "longitude": -84.486582, + "city": "Pitsburg", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45359, + "latitude": 40.050483, + "longitude": -84.348699, + "city": "Pleasant Hill", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45360, + "latitude": 40.330713, + "longitude": -84.092589, + "city": "Port Jefferson", + "state": "OH", + "county": "Shelby" + }, + { + "zip_code": 45361, + "latitude": 39.963492, + "longitude": -84.414484, + "city": "Potsdam", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45362, + "latitude": 40.287621, + "longitude": -84.637078, + "city": "Rossburg", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45363, + "latitude": 40.263253, + "longitude": -84.263227, + "city": "Russia", + "state": "OH", + "county": "Shelby" + }, + { + "zip_code": 45365, + "latitude": 40.293558, + "longitude": -84.209198, + "city": "Sidney", + "state": "OH", + "county": "Shelby" + }, + { + "zip_code": 45367, + "latitude": 40.333611, + "longitude": -84.218308, + "city": "Sidney", + "state": "OH", + "county": "Shelby" + }, + { + "zip_code": 45368, + "latitude": 39.854349, + "longitude": -83.66528, + "city": "South Charleston", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45369, + "latitude": 39.957723, + "longitude": -83.614481, + "city": "South Vienna", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45370, + "latitude": 39.608285, + "longitude": -84.025972, + "city": "Spring Valley", + "state": "OH", + "county": "Greene" + }, + { + "zip_code": 45371, + "latitude": 39.941967, + "longitude": -84.16626, + "city": "Tipp City", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45372, + "latitude": 40.013871, + "longitude": -83.83325, + "city": "Tremont City", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45373, + "latitude": 40.062621, + "longitude": -84.226398, + "city": "Troy", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45374, + "latitude": 40.03997, + "longitude": -84.229799, + "city": "Troy", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45377, + "latitude": 39.889006, + "longitude": -84.242243, + "city": "Vandalia", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45378, + "latitude": 39.897035, + "longitude": -84.499044, + "city": "Verona", + "state": "OH", + "county": "Preble" + }, + { + "zip_code": 45380, + "latitude": 40.25304, + "longitude": -84.523891, + "city": "Versailles", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45381, + "latitude": 39.750097, + "longitude": -84.537597, + "city": "West Alexandria", + "state": "OH", + "county": "Preble" + }, + { + "zip_code": 45382, + "latitude": 39.88133, + "longitude": -84.621617, + "city": "West Manchester", + "state": "OH", + "county": "Preble" + }, + { + "zip_code": 45383, + "latitude": 39.98791, + "longitude": -84.350107, + "city": "West Milton", + "state": "OH", + "county": "Miami" + }, + { + "zip_code": 45384, + "latitude": 39.712811, + "longitude": -83.878088, + "city": "Wilberforce", + "state": "OH", + "county": "Greene" + }, + { + "zip_code": 45385, + "latitude": 39.684731, + "longitude": -83.90813, + "city": "Xenia", + "state": "OH", + "county": "Greene" + }, + { + "zip_code": 45387, + "latitude": 39.760531, + "longitude": -83.8836, + "city": "Yellow Springs", + "state": "OH", + "county": "Greene" + }, + { + "zip_code": 45388, + "latitude": 40.321853, + "longitude": -84.484466, + "city": "Yorkshire", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45389, + "latitude": 40.0564, + "longitude": -84.025444, + "city": "Christiansburg", + "state": "OH", + "county": "Champaign" + }, + { + "zip_code": 45390, + "latitude": 40.211787, + "longitude": -84.758818, + "city": "Union City", + "state": "OH", + "county": "Darke" + }, + { + "zip_code": 45401, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45402, + "latitude": 39.756658, + "longitude": -84.181639, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45403, + "latitude": 39.764658, + "longitude": -84.150738, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45404, + "latitude": 39.794958, + "longitude": -84.163589, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45405, + "latitude": 39.789857, + "longitude": -84.217391, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45406, + "latitude": 39.782457, + "longitude": -84.239391, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45407, + "latitude": 39.758658, + "longitude": -84.226041, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45408, + "latitude": 39.730258, + "longitude": -84.219846, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45409, + "latitude": 39.723809, + "longitude": -84.185439, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45410, + "latitude": 39.748008, + "longitude": -84.156938, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45412, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45413, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45414, + "latitude": 39.805957, + "longitude": -84.199737, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45415, + "latitude": 39.834756, + "longitude": -84.252292, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45416, + "latitude": 39.801057, + "longitude": -84.257792, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45417, + "latitude": 39.75344, + "longitude": -84.245841, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45418, + "latitude": 39.707057, + "longitude": -84.276891, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45419, + "latitude": 39.681909, + "longitude": -84.166388, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45420, + "latitude": 39.717059, + "longitude": -84.134172, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45422, + "latitude": 39.758058, + "longitude": -84.20009, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45423, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45424, + "latitude": 39.835257, + "longitude": -84.112288, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45426, + "latitude": 39.798187, + "longitude": -84.321119, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45427, + "latitude": 39.755506, + "longitude": -84.304893, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45428, + "latitude": 39.746656, + "longitude": -84.259292, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45429, + "latitude": 39.684059, + "longitude": -84.163337, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45430, + "latitude": 39.709159, + "longitude": -84.104836, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45431, + "latitude": 39.757377, + "longitude": -84.056934, + "city": "Dayton", + "state": "OH", + "county": "Greene" + }, + { + "zip_code": 45432, + "latitude": 39.732309, + "longitude": -84.160422, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45433, + "latitude": 39.798503, + "longitude": -84.052053, + "city": "Dayton", + "state": "OH", + "county": "Greene" + }, + { + "zip_code": 45434, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45435, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45437, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45439, + "latitude": 39.749308, + "longitude": -84.19954, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45440, + "latitude": 39.675548, + "longitude": -84.121086, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45441, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45448, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45449, + "latitude": 39.665109, + "longitude": -84.24009, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45454, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45458, + "latitude": 39.606209, + "longitude": -84.169519, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45459, + "latitude": 39.646371, + "longitude": -84.171733, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45463, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45469, + "latitude": 39.740509, + "longitude": -84.178939, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45470, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45475, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45479, + "latitude": 39.734409, + "longitude": -84.194389, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45481, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45482, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45490, + "latitude": 39.750471, + "longitude": -84.268593, + "city": "Dayton", + "state": "OH", + "county": "Montgomery" + }, + { + "zip_code": 45501, + "latitude": 39.927059, + "longitude": -83.813228, + "city": "Springfield", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45502, + "latitude": 39.917208, + "longitude": -83.854642, + "city": "Springfield", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45503, + "latitude": 39.963784, + "longitude": -83.77139, + "city": "Springfield", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45504, + "latitude": 39.950457, + "longitude": -83.890862, + "city": "Springfield", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45505, + "latitude": 39.906009, + "longitude": -83.7482, + "city": "Springfield", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45506, + "latitude": 39.883209, + "longitude": -83.86983, + "city": "Springfield", + "state": "OH", + "county": "Clark" + }, + { + "zip_code": 45601, + "latitude": 39.337384, + "longitude": -82.991332, + "city": "Chillicothe", + "state": "OH", + "county": "Ross" + }, + { + "zip_code": 45612, + "latitude": 39.244298, + "longitude": -83.219712, + "city": "Bainbridge", + "state": "OH", + "county": "Ross" + }, + { + "zip_code": 45613, + "latitude": 39.040682, + "longitude": -82.887103, + "city": "Beaver", + "state": "OH", + "county": "Pike" + }, + { + "zip_code": 45614, + "latitude": 38.92307, + "longitude": -82.276201, + "city": "Bidwell", + "state": "OH", + "county": "Gallia" + }, + { + "zip_code": 45616, + "latitude": 38.756374, + "longitude": -83.340308, + "city": "Blue Creek", + "state": "OH", + "county": "Adams" + }, + { + "zip_code": 45617, + "latitude": 39.280388, + "longitude": -83.158991, + "city": "Bourneville", + "state": "OH", + "county": "Ross" + }, + { + "zip_code": 45618, + "latitude": 38.892198, + "longitude": -83.621787, + "city": "Cherry Fork", + "state": "OH", + "county": "Adams" + }, + { + "zip_code": 45619, + "latitude": 38.482955, + "longitude": -82.450548, + "city": "Chesapeake", + "state": "OH", + "county": "Lawrence" + }, + { + "zip_code": 45620, + "latitude": 38.798525, + "longitude": -82.189958, + "city": "Cheshire", + "state": "OH", + "county": "Gallia" + }, + { + "zip_code": 45621, + "latitude": 39.110614, + "longitude": -82.613028, + "city": "Coalton", + "state": "OH", + "county": "Jackson" + }, + { + "zip_code": 45622, + "latitude": 39.354339, + "longitude": -82.503012, + "city": "Creola", + "state": "OH", + "county": "Vinton" + }, + { + "zip_code": 45623, + "latitude": 38.796783, + "longitude": -82.271583, + "city": "Crown City", + "state": "OH", + "county": "Gallia" + }, + { + "zip_code": 45624, + "latitude": 39.16378, + "longitude": -83.342941, + "city": "Cynthiana", + "state": "OH", + "county": "Pike" + }, + { + "zip_code": 45628, + "latitude": 39.387165, + "longitude": -83.182591, + "city": "Frankfort", + "state": "OH", + "county": "Ross" + }, + { + "zip_code": 45629, + "latitude": 38.650439, + "longitude": -82.802128, + "city": "Franklin Furnace", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45630, + "latitude": 38.793335, + "longitude": -82.96046, + "city": "Friendship", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45631, + "latitude": 38.793762, + "longitude": -82.2692, + "city": "Gallipolis", + "state": "OH", + "county": "Gallia" + }, + { + "zip_code": 45633, + "latitude": 39.46557, + "longitude": -82.747853, + "city": "Hallsville", + "state": "OH", + "county": "Ross" + }, + { + "zip_code": 45634, + "latitude": 39.178317, + "longitude": -82.503194, + "city": "Hamden", + "state": "OH", + "county": "Vinton" + }, + { + "zip_code": 45636, + "latitude": 38.592446, + "longitude": -82.828817, + "city": "Haverhill", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45638, + "latitude": 38.544457, + "longitude": -82.596777, + "city": "Ironton", + "state": "OH", + "county": "Lawrence" + }, + { + "zip_code": 45640, + "latitude": 39.03738, + "longitude": -82.628954, + "city": "Jackson", + "state": "OH", + "county": "Jackson" + }, + { + "zip_code": 45642, + "latitude": 39.052267, + "longitude": -83.050031, + "city": "Jasper", + "state": "OH", + "county": "Pike" + }, + { + "zip_code": 45643, + "latitude": 38.86833, + "longitude": -82.256185, + "city": "Kerr", + "state": "OH", + "county": "Gallia" + }, + { + "zip_code": 45644, + "latitude": 39.424824, + "longitude": -82.862234, + "city": "Kingston", + "state": "OH", + "county": "Ross" + }, + { + "zip_code": 45645, + "latitude": 38.562503, + "longitude": -82.545723, + "city": "Kitts Hill", + "state": "OH", + "county": "Lawrence" + }, + { + "zip_code": 45646, + "latitude": 39.081031, + "longitude": -83.312422, + "city": "Latham", + "state": "OH", + "county": "Pike" + }, + { + "zip_code": 45647, + "latitude": 39.292098, + "longitude": -82.795487, + "city": "Londonderry", + "state": "OH", + "county": "Ross" + }, + { + "zip_code": 45648, + "latitude": 38.888422, + "longitude": -82.98132, + "city": "Lucasville", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45650, + "latitude": 38.73906, + "longitude": -83.42617, + "city": "Lynx", + "state": "OH", + "county": "Adams" + }, + { + "zip_code": 45651, + "latitude": 39.280013, + "longitude": -82.47532, + "city": "Mc Arthur", + "state": "OH", + "county": "Vinton" + }, + { + "zip_code": 45652, + "latitude": 38.852654, + "longitude": -83.135398, + "city": "Mc Dermott", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45653, + "latitude": 38.889049, + "longitude": -82.911143, + "city": "Minford", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45654, + "latitude": 39.332256, + "longitude": -82.379663, + "city": "New Plymouth", + "state": "OH", + "county": "Vinton" + }, + { + "zip_code": 45656, + "latitude": 38.976464, + "longitude": -82.603687, + "city": "Oak Hill", + "state": "OH", + "county": "Jackson" + }, + { + "zip_code": 45657, + "latitude": 38.875128, + "longitude": -83.159778, + "city": "Otway", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45658, + "latitude": 38.765791, + "longitude": -82.390542, + "city": "Patriot", + "state": "OH", + "county": "Gallia" + }, + { + "zip_code": 45659, + "latitude": 38.674554, + "longitude": -82.614563, + "city": "Pedro", + "state": "OH", + "county": "Lawrence" + }, + { + "zip_code": 45660, + "latitude": 38.858792, + "longitude": -83.461114, + "city": "Peebles", + "state": "OH", + "county": "Adams" + }, + { + "zip_code": 45661, + "latitude": 39.043707, + "longitude": -83.12101, + "city": "Piketon", + "state": "OH", + "county": "Pike" + }, + { + "zip_code": 45662, + "latitude": 38.793214, + "longitude": -82.930576, + "city": "Portsmouth", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45663, + "latitude": 38.749539, + "longitude": -83.133477, + "city": "West Portsmouth", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45669, + "latitude": 38.49585, + "longitude": -82.364902, + "city": "Proctorville", + "state": "OH", + "county": "Lawrence" + }, + { + "zip_code": 45671, + "latitude": 38.957722, + "longitude": -83.236465, + "city": "Rarden", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45672, + "latitude": 39.230553, + "longitude": -82.66956, + "city": "Ray", + "state": "OH", + "county": "Vinton" + }, + { + "zip_code": 45673, + "latitude": 39.203167, + "longitude": -82.854167, + "city": "Richmond Dale", + "state": "OH", + "county": "Ross" + }, + { + "zip_code": 45674, + "latitude": 38.881447, + "longitude": -82.378213, + "city": "Rio Grande", + "state": "OH", + "county": "Gallia" + }, + { + "zip_code": 45675, + "latitude": 38.536685, + "longitude": -82.532715, + "city": "Rock Camp", + "state": "OH", + "county": "Lawrence" + }, + { + "zip_code": 45677, + "latitude": 38.794115, + "longitude": -82.755455, + "city": "Scioto Furnace", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45678, + "latitude": 38.598567, + "longitude": -82.385511, + "city": "Scottown", + "state": "OH", + "county": "Lawrence" + }, + { + "zip_code": 45679, + "latitude": 38.957941, + "longitude": -83.535617, + "city": "Seaman", + "state": "OH", + "county": "Adams" + }, + { + "zip_code": 45680, + "latitude": 38.465171, + "longitude": -82.501206, + "city": "South Point", + "state": "OH", + "county": "Lawrence" + }, + { + "zip_code": 45681, + "latitude": 39.328523, + "longitude": -83.242873, + "city": "South Salem", + "state": "OH", + "county": "Ross" + }, + { + "zip_code": 45682, + "latitude": 38.819687, + "longitude": -82.727978, + "city": "South Webster", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45683, + "latitude": 38.955485, + "longitude": -82.858402, + "city": "Stockdale", + "state": "OH", + "county": "Pike" + }, + { + "zip_code": 45684, + "latitude": 38.783492, + "longitude": -83.102804, + "city": "Stout", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45685, + "latitude": 38.870525, + "longitude": -82.406298, + "city": "Thurman", + "state": "OH", + "county": "Gallia" + }, + { + "zip_code": 45686, + "latitude": 38.961601, + "longitude": -82.345709, + "city": "Vinton", + "state": "OH", + "county": "Gallia" + }, + { + "zip_code": 45687, + "latitude": 39.072829, + "longitude": -83.085764, + "city": "Wakefield", + "state": "OH", + "county": "Pike" + }, + { + "zip_code": 45688, + "latitude": 38.719009, + "longitude": -82.535141, + "city": "Waterloo", + "state": "OH", + "county": "Lawrence" + }, + { + "zip_code": 45690, + "latitude": 39.072309, + "longitude": -83.024014, + "city": "Waverly", + "state": "OH", + "county": "Pike" + }, + { + "zip_code": 45692, + "latitude": 39.116467, + "longitude": -82.553489, + "city": "Wellston", + "state": "OH", + "county": "Jackson" + }, + { + "zip_code": 45693, + "latitude": 38.82346, + "longitude": -83.504048, + "city": "West Union", + "state": "OH", + "county": "Adams" + }, + { + "zip_code": 45694, + "latitude": 38.745832, + "longitude": -82.847351, + "city": "Wheelersburg", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45695, + "latitude": 39.141589, + "longitude": -82.36824, + "city": "Wilkesville", + "state": "OH", + "county": "Vinton" + }, + { + "zip_code": 45696, + "latitude": 38.590602, + "longitude": -82.456062, + "city": "Willow Wood", + "state": "OH", + "county": "Lawrence" + }, + { + "zip_code": 45697, + "latitude": 38.9163, + "longitude": -83.580733, + "city": "Winchester", + "state": "OH", + "county": "Adams" + }, + { + "zip_code": 45698, + "latitude": 39.283031, + "longitude": -82.397708, + "city": "Zaleski", + "state": "OH", + "county": "Vinton" + }, + { + "zip_code": 45699, + "latitude": 38.793335, + "longitude": -82.96046, + "city": "Lucasville", + "state": "OH", + "county": "Scioto" + }, + { + "zip_code": 45701, + "latitude": 39.339279, + "longitude": -82.013803, + "city": "Athens", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45710, + "latitude": 39.240816, + "longitude": -82.177096, + "city": "Albany", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45711, + "latitude": 39.410743, + "longitude": -81.936397, + "city": "Amesville", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45712, + "latitude": 39.386825, + "longitude": -81.395219, + "city": "Barlow", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45713, + "latitude": 39.430738, + "longitude": -81.44512, + "city": "Bartlett", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45714, + "latitude": 39.449988, + "longitude": -81.559698, + "city": "Belpre", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45715, + "latitude": 39.541791, + "longitude": -81.606295, + "city": "Beverly", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45716, + "latitude": 39.452247, + "longitude": -82.179423, + "city": "Buchtel", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45717, + "latitude": 39.368235, + "longitude": -82.010132, + "city": "Carbondale", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45719, + "latitude": 39.400154, + "longitude": -82.130241, + "city": "Chauncey", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45720, + "latitude": 39.085629, + "longitude": -81.921443, + "city": "Chester", + "state": "OH", + "county": "Meigs" + }, + { + "zip_code": 45721, + "latitude": 39.430738, + "longitude": -81.44512, + "city": "Coal Run", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45723, + "latitude": 39.246862, + "longitude": -81.830623, + "city": "Coolville", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45724, + "latitude": 39.430738, + "longitude": -81.44512, + "city": "Cutler", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45727, + "latitude": 39.67387, + "longitude": -81.485687, + "city": "Dexter City", + "state": "OH", + "county": "Noble" + }, + { + "zip_code": 45729, + "latitude": 39.430738, + "longitude": -81.44512, + "city": "Fleming", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45732, + "latitude": 39.475277, + "longitude": -82.063319, + "city": "Glouster", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45734, + "latitude": 39.663015, + "longitude": -81.182232, + "city": "Graysville", + "state": "OH", + "county": "Monroe" + }, + { + "zip_code": 45735, + "latitude": 39.249339, + "longitude": -81.922005, + "city": "Guysville", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45739, + "latitude": 39.197888, + "longitude": -81.744573, + "city": "Hockingport", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45740, + "latitude": 39.461905, + "longitude": -82.073188, + "city": "Jacksonville", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45741, + "latitude": 39.069673, + "longitude": -82.24991, + "city": "Langsville", + "state": "OH", + "county": "Meigs" + }, + { + "zip_code": 45742, + "latitude": 39.274635, + "longitude": -81.655976, + "city": "Little Hocking", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45743, + "latitude": 39.071167, + "longitude": -81.839685, + "city": "Long Bottom", + "state": "OH", + "county": "Meigs" + }, + { + "zip_code": 45744, + "latitude": 39.538823, + "longitude": -81.47884, + "city": "Lowell", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45745, + "latitude": 39.561107, + "longitude": -81.39676, + "city": "Lower Salem", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45746, + "latitude": 39.580501, + "longitude": -81.479272, + "city": "Macksburg", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45750, + "latitude": 39.413446, + "longitude": -81.351051, + "city": "Marietta", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45760, + "latitude": 39.069059, + "longitude": -82.021994, + "city": "Middleport", + "state": "OH", + "county": "Meigs" + }, + { + "zip_code": 45761, + "latitude": 39.379936, + "longitude": -82.088793, + "city": "Millfield", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45764, + "latitude": 39.357211, + "longitude": -82.045466, + "city": "Nelsonville", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45766, + "latitude": 39.307332, + "longitude": -82.167867, + "city": "New Marshfield", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45767, + "latitude": 39.523303, + "longitude": -81.064116, + "city": "New Matamoras", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45768, + "latitude": 39.393315, + "longitude": -81.225093, + "city": "Newport", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45769, + "latitude": 39.07866, + "longitude": -82.069422, + "city": "Pomeroy", + "state": "OH", + "county": "Meigs" + }, + { + "zip_code": 45770, + "latitude": 38.981015, + "longitude": -81.812092, + "city": "Portland", + "state": "OH", + "county": "Meigs" + }, + { + "zip_code": 45771, + "latitude": 38.984835, + "longitude": -81.892503, + "city": "Racine", + "state": "OH", + "county": "Meigs" + }, + { + "zip_code": 45772, + "latitude": 39.13447, + "longitude": -81.835405, + "city": "Reedsville", + "state": "OH", + "county": "Meigs" + }, + { + "zip_code": 45773, + "latitude": 39.430738, + "longitude": -81.44512, + "city": "Reno", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45775, + "latitude": 39.090877, + "longitude": -82.148554, + "city": "Rutland", + "state": "OH", + "county": "Meigs" + }, + { + "zip_code": 45776, + "latitude": 39.214673, + "longitude": -82.018739, + "city": "Shade", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45777, + "latitude": 39.368235, + "longitude": -82.010132, + "city": "Sharpsburg", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45778, + "latitude": 39.362514, + "longitude": -81.906878, + "city": "Stewart", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45779, + "latitude": 39.003291, + "longitude": -81.966122, + "city": "Syracuse", + "state": "OH", + "county": "Meigs" + }, + { + "zip_code": 45780, + "latitude": 39.35076, + "longitude": -81.968751, + "city": "The Plains", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45781, + "latitude": 39.368235, + "longitude": -82.010132, + "city": "Torch", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45782, + "latitude": 39.484517, + "longitude": -82.080528, + "city": "Trimble", + "state": "OH", + "county": "Athens" + }, + { + "zip_code": 45783, + "latitude": 39.168349, + "longitude": -81.842313, + "city": "Tuppers Plains", + "state": "OH", + "county": "Meigs" + }, + { + "zip_code": 45784, + "latitude": 39.367877, + "longitude": -81.665232, + "city": "Vincent", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45786, + "latitude": 39.538788, + "longitude": -81.639888, + "city": "Waterford", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45787, + "latitude": 39.430738, + "longitude": -81.44512, + "city": "Watertown", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45788, + "latitude": 39.430738, + "longitude": -81.44512, + "city": "Whipple", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45789, + "latitude": 39.544391, + "longitude": -81.245804, + "city": "Wingett Run", + "state": "OH", + "county": "Washington" + }, + { + "zip_code": 45801, + "latitude": 40.772147, + "longitude": -84.0471, + "city": "Lima", + "state": "OH", + "county": "Allen" + }, + { + "zip_code": 45802, + "latitude": 40.781785, + "longitude": -84.138566, + "city": "Lima", + "state": "OH", + "county": "Allen" + }, + { + "zip_code": 45804, + "latitude": 40.694996, + "longitude": -84.063491, + "city": "Lima", + "state": "OH", + "county": "Allen" + }, + { + "zip_code": 45805, + "latitude": 40.733043, + "longitude": -84.169749, + "city": "Lima", + "state": "OH", + "county": "Allen" + }, + { + "zip_code": 45806, + "latitude": 40.589876, + "longitude": -84.12786, + "city": "Lima", + "state": "OH", + "county": "Auglaize" + }, + { + "zip_code": 45807, + "latitude": 40.795463, + "longitude": -84.138298, + "city": "Lima", + "state": "OH", + "county": "Allen" + }, + { + "zip_code": 45808, + "latitude": 40.831419, + "longitude": -83.975831, + "city": "Beaverdam", + "state": "OH", + "county": "Allen" + }, + { + "zip_code": 45809, + "latitude": 40.847946, + "longitude": -84.183152, + "city": "Gomer", + "state": "OH", + "county": "Allen" + }, + { + "zip_code": 45810, + "latitude": 40.676042, + "longitude": -83.700633, + "city": "Ada", + "state": "OH", + "county": "Hardin" + }, + { + "zip_code": 45812, + "latitude": 40.679192, + "longitude": -83.795649, + "city": "Alger", + "state": "OH", + "county": "Hardin" + }, + { + "zip_code": 45813, + "latitude": 41.186851, + "longitude": -84.727141, + "city": "Antwerp", + "state": "OH", + "county": "Paulding" + }, + { + "zip_code": 45814, + "latitude": 40.908204, + "longitude": -83.617612, + "city": "Arlington", + "state": "OH", + "county": "Hancock" + }, + { + "zip_code": 45815, + "latitude": 41.153855, + "longitude": -83.941281, + "city": "Belmore", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45816, + "latitude": 41.003087, + "longitude": -83.793147, + "city": "Benton Ridge", + "state": "OH", + "county": "Hancock" + }, + { + "zip_code": 45817, + "latitude": 40.78635, + "longitude": -83.928268, + "city": "Bluffton", + "state": "OH", + "county": "Allen" + }, + { + "zip_code": 45819, + "latitude": 40.62408, + "longitude": -84.260275, + "city": "Buckland", + "state": "OH", + "county": "Auglaize" + }, + { + "zip_code": 45820, + "latitude": 40.830388, + "longitude": -84.085154, + "city": "Cairo", + "state": "OH", + "county": "Allen" + }, + { + "zip_code": 45821, + "latitude": 41.223404, + "longitude": -84.571519, + "city": "Cecil", + "state": "OH", + "county": "Paulding" + }, + { + "zip_code": 45822, + "latitude": 40.556645, + "longitude": -84.628714, + "city": "Celina", + "state": "OH", + "county": "Mercer" + }, + { + "zip_code": 45826, + "latitude": 40.428177, + "longitude": -84.633484, + "city": "Chickasaw", + "state": "OH", + "county": "Mercer" + }, + { + "zip_code": 45827, + "latitude": 41.003391, + "longitude": -84.298718, + "city": "Cloverdale", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45828, + "latitude": 40.476443, + "longitude": -84.68752, + "city": "Coldwater", + "state": "OH", + "county": "Mercer" + }, + { + "zip_code": 45830, + "latitude": 40.97793, + "longitude": -84.15053, + "city": "Columbus Grove", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45831, + "latitude": 41.104335, + "longitude": -84.236754, + "city": "Continental", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45832, + "latitude": 40.896997, + "longitude": -84.716607, + "city": "Convoy", + "state": "OH", + "county": "Van Wert" + }, + { + "zip_code": 45833, + "latitude": 40.794444, + "longitude": -84.311596, + "city": "Delphos", + "state": "OH", + "county": "Allen" + }, + { + "zip_code": 45835, + "latitude": 40.761389, + "longitude": -83.702404, + "city": "Dola", + "state": "OH", + "county": "Hardin" + }, + { + "zip_code": 45836, + "latitude": 40.782629, + "longitude": -83.652433, + "city": "Dunkirk", + "state": "OH", + "county": "Hardin" + }, + { + "zip_code": 45837, + "latitude": 41.046252, + "longitude": -84.319494, + "city": "Dupont", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45838, + "latitude": 40.735491, + "longitude": -84.485028, + "city": "Elgin", + "state": "OH", + "county": "Van Wert" + }, + { + "zip_code": 45839, + "latitude": 40.993263, + "longitude": -83.650714, + "city": "Findlay", + "state": "OH", + "county": "Hancock" + }, + { + "zip_code": 45840, + "latitude": 41.015219, + "longitude": -83.664786, + "city": "Findlay", + "state": "OH", + "county": "Hancock" + }, + { + "zip_code": 45841, + "latitude": 40.885048, + "longitude": -83.722963, + "city": "Jenera", + "state": "OH", + "county": "Hancock" + }, + { + "zip_code": 45843, + "latitude": 40.755387, + "longitude": -83.671142, + "city": "Forest", + "state": "OH", + "county": "Hardin" + }, + { + "zip_code": 45844, + "latitude": 40.922538, + "longitude": -84.295652, + "city": "Fort Jennings", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45845, + "latitude": 40.364003, + "longitude": -84.23261, + "city": "Fort Loramie", + "state": "OH", + "county": "Shelby" + }, + { + "zip_code": 45846, + "latitude": 40.452405, + "longitude": -84.7169, + "city": "Fort Recovery", + "state": "OH", + "county": "Mercer" + }, + { + "zip_code": 45848, + "latitude": 41.096421, + "longitude": -84.112031, + "city": "Glandorf", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45849, + "latitude": 41.032277, + "longitude": -84.479422, + "city": "Grover Hill", + "state": "OH", + "county": "Paulding" + }, + { + "zip_code": 45850, + "latitude": 40.739067, + "longitude": -83.941613, + "city": "Harrod", + "state": "OH", + "county": "Allen" + }, + { + "zip_code": 45851, + "latitude": 41.03321, + "longitude": -84.60076, + "city": "Haviland", + "state": "OH", + "county": "Paulding" + }, + { + "zip_code": 45853, + "latitude": 40.979612, + "longitude": -84.219208, + "city": "Kalida", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45854, + "latitude": 40.758211, + "longitude": -83.949934, + "city": "Lafayette", + "state": "OH", + "county": "Allen" + }, + { + "zip_code": 45855, + "latitude": 41.07712, + "longitude": -84.583005, + "city": "Latty", + "state": "OH", + "county": "Paulding" + }, + { + "zip_code": 45856, + "latitude": 41.050948, + "longitude": -84.11025, + "city": "Leipsic", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45858, + "latitude": 41.09817, + "longitude": -83.784671, + "city": "Mc Comb", + "state": "OH", + "county": "Hancock" + }, + { + "zip_code": 45859, + "latitude": 40.689897, + "longitude": -83.811072, + "city": "Mc Guffey", + "state": "OH", + "county": "Hardin" + }, + { + "zip_code": 45860, + "latitude": 40.394413, + "longitude": -84.535296, + "city": "Maria Stein", + "state": "OH", + "county": "Mercer" + }, + { + "zip_code": 45861, + "latitude": 41.08119, + "longitude": -84.428684, + "city": "Melrose", + "state": "OH", + "county": "Paulding" + }, + { + "zip_code": 45862, + "latitude": 40.575306, + "longitude": -84.547735, + "city": "Mendon", + "state": "OH", + "county": "Mercer" + }, + { + "zip_code": 45863, + "latitude": 40.899321, + "longitude": -84.454113, + "city": "Middle Point", + "state": "OH", + "county": "Van Wert" + }, + { + "zip_code": 45864, + "latitude": 41.103776, + "longitude": -84.131541, + "city": "Miller City", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45865, + "latitude": 40.410299, + "longitude": -84.39708, + "city": "Minster", + "state": "OH", + "county": "Auglaize" + }, + { + "zip_code": 45866, + "latitude": 40.489028, + "longitude": -84.549391, + "city": "Montezuma", + "state": "OH", + "county": "Mercer" + }, + { + "zip_code": 45867, + "latitude": 40.904671, + "longitude": -83.528932, + "city": "Mount Blanchard", + "state": "OH", + "county": "Hancock" + }, + { + "zip_code": 45868, + "latitude": 40.970761, + "longitude": -83.842293, + "city": "Mount Cory", + "state": "OH", + "county": "Hancock" + }, + { + "zip_code": 45869, + "latitude": 40.504687, + "longitude": -84.2145, + "city": "New Bremen", + "state": "OH", + "county": "Auglaize" + }, + { + "zip_code": 45870, + "latitude": 40.549772, + "longitude": -83.950093, + "city": "New Hampshire", + "state": "OH", + "county": "Auglaize" + }, + { + "zip_code": 45871, + "latitude": 40.496141, + "longitude": -84.282659, + "city": "New Knoxville", + "state": "OH", + "county": "Auglaize" + }, + { + "zip_code": 45872, + "latitude": 41.204236, + "longitude": -83.6837, + "city": "North Baltimore", + "state": "OH", + "county": "Wood" + }, + { + "zip_code": 45873, + "latitude": 41.121548, + "longitude": -84.534212, + "city": "Oakwood", + "state": "OH", + "county": "Paulding" + }, + { + "zip_code": 45874, + "latitude": 40.821778, + "longitude": -84.658335, + "city": "Ohio City", + "state": "OH", + "county": "Van Wert" + }, + { + "zip_code": 45875, + "latitude": 41.019657, + "longitude": -84.111533, + "city": "Ottawa", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45876, + "latitude": 41.027573, + "longitude": -84.238754, + "city": "Ottoville", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45877, + "latitude": 40.956609, + "longitude": -83.937984, + "city": "Pandora", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45879, + "latitude": 41.121205, + "longitude": -84.532406, + "city": "Paulding", + "state": "OH", + "county": "Paulding" + }, + { + "zip_code": 45880, + "latitude": 41.062763, + "longitude": -84.716982, + "city": "Payne", + "state": "OH", + "county": "Paulding" + }, + { + "zip_code": 45881, + "latitude": 40.941562, + "longitude": -83.770206, + "city": "Rawson", + "state": "OH", + "county": "Hancock" + }, + { + "zip_code": 45882, + "latitude": 40.669681, + "longitude": -84.657861, + "city": "Rockford", + "state": "OH", + "county": "Mercer" + }, + { + "zip_code": 45883, + "latitude": 40.408584, + "longitude": -84.635417, + "city": "Saint Henry", + "state": "OH", + "county": "Mercer" + }, + { + "zip_code": 45884, + "latitude": 40.520289, + "longitude": -84.16797, + "city": "Saint Johns", + "state": "OH", + "county": "Auglaize" + }, + { + "zip_code": 45885, + "latitude": 40.584975, + "longitude": -84.376744, + "city": "Saint Marys", + "state": "OH", + "county": "Auglaize" + }, + { + "zip_code": 45886, + "latitude": 40.975363, + "longitude": -84.603141, + "city": "Scott", + "state": "OH", + "county": "Van Wert" + }, + { + "zip_code": 45887, + "latitude": 40.732147, + "longitude": -84.159688, + "city": "Spencerville", + "state": "OH", + "county": "Allen" + }, + { + "zip_code": 45888, + "latitude": 40.602259, + "longitude": -84.086022, + "city": "Uniopolis", + "state": "OH", + "county": "Auglaize" + }, + { + "zip_code": 45889, + "latitude": 41.142264, + "longitude": -83.628337, + "city": "Van Buren", + "state": "OH", + "county": "Hancock" + }, + { + "zip_code": 45890, + "latitude": 40.935704, + "longitude": -83.502731, + "city": "Vanlue", + "state": "OH", + "county": "Hancock" + }, + { + "zip_code": 45891, + "latitude": 40.873247, + "longitude": -84.594525, + "city": "Van Wert", + "state": "OH", + "county": "Van Wert" + }, + { + "zip_code": 45893, + "latitude": 40.882077, + "longitude": -84.148028, + "city": "Vaughnsville", + "state": "OH", + "county": "Putnam" + }, + { + "zip_code": 45894, + "latitude": 40.771925, + "longitude": -84.47458, + "city": "Venedocia", + "state": "OH", + "county": "Van Wert" + }, + { + "zip_code": 45895, + "latitude": 40.582252, + "longitude": -84.152138, + "city": "Wapakoneta", + "state": "OH", + "county": "Auglaize" + }, + { + "zip_code": 45896, + "latitude": 40.589899, + "longitude": -83.953648, + "city": "Waynesfield", + "state": "OH", + "county": "Auglaize" + }, + { + "zip_code": 45897, + "latitude": 40.834004, + "longitude": -83.651785, + "city": "Williamstown", + "state": "OH", + "county": "Hancock" + }, + { + "zip_code": 45898, + "latitude": 40.775148, + "longitude": -84.745809, + "city": "Willshire", + "state": "OH", + "county": "Van Wert" + }, + { + "zip_code": 45899, + "latitude": 40.794002, + "longitude": -84.785735, + "city": "Wren", + "state": "OH", + "county": "Van Wert" + }, + { + "zip_code": 45944, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 45999, + "latitude": 39.166759, + "longitude": -84.53822, + "city": "Cincinnati", + "state": "OH", + "county": "Hamilton" + }, + { + "zip_code": 46001, + "latitude": 40.213154, + "longitude": -85.680698, + "city": "Alexandria", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46011, + "latitude": 40.141033, + "longitude": -85.766164, + "city": "Anderson", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46012, + "latitude": 40.165726, + "longitude": -85.633225, + "city": "Anderson", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46013, + "latitude": 40.05668, + "longitude": -85.674976, + "city": "Anderson", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46014, + "latitude": 40.161733, + "longitude": -85.719659, + "city": "Anderson", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46015, + "latitude": 40.093792, + "longitude": -85.657825, + "city": "Anderson", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46016, + "latitude": 40.144894, + "longitude": -85.742377, + "city": "Anderson", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46017, + "latitude": 40.100275, + "longitude": -85.710226, + "city": "Anderson", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46018, + "latitude": 40.161733, + "longitude": -85.719659, + "city": "Anderson", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46030, + "latitude": 40.167756, + "longitude": -86.045789, + "city": "Arcadia", + "state": "IN", + "county": "Hamilton" + }, + { + "zip_code": 46031, + "latitude": 40.174289, + "longitude": -86.018909, + "city": "Atlanta", + "state": "IN", + "county": "Hamilton" + }, + { + "zip_code": 46032, + "latitude": 40.071102, + "longitude": -86.117215, + "city": "Carmel", + "state": "IN", + "county": "Hamilton" + }, + { + "zip_code": 46033, + "latitude": 39.974404, + "longitude": -86.082936, + "city": "Carmel", + "state": "IN", + "county": "Hamilton" + }, + { + "zip_code": 46034, + "latitude": 40.154903, + "longitude": -86.038337, + "city": "Cicero", + "state": "IN", + "county": "Hamilton" + }, + { + "zip_code": 46035, + "latitude": 40.211041, + "longitude": -86.64787, + "city": "Colfax", + "state": "IN", + "county": "Clinton" + }, + { + "zip_code": 46036, + "latitude": 40.27843, + "longitude": -85.719657, + "city": "Elwood", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46038, + "latitude": 39.967406, + "longitude": -85.964894, + "city": "Fishers", + "state": "IN", + "county": "Hamilton" + }, + { + "zip_code": 46039, + "latitude": 40.373825, + "longitude": -86.309246, + "city": "Forest", + "state": "IN", + "county": "Clinton" + }, + { + "zip_code": 46040, + "latitude": 39.894912, + "longitude": -85.792762, + "city": "Fortville", + "state": "IN", + "county": "Hancock" + }, + { + "zip_code": 46041, + "latitude": 40.304355, + "longitude": -86.468915, + "city": "Frankfort", + "state": "IN", + "county": "Clinton" + }, + { + "zip_code": 46044, + "latitude": 40.213173, + "longitude": -85.786049, + "city": "Frankton", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46045, + "latitude": 40.289836, + "longitude": -86.149423, + "city": "Goldsmith", + "state": "IN", + "county": "Tipton" + }, + { + "zip_code": 46046, + "latitude": 40.304473, + "longitude": -86.469044, + "city": "Hillisburg", + "state": "IN", + "county": "Clinton" + }, + { + "zip_code": 46047, + "latitude": 40.284101, + "longitude": -85.945505, + "city": "Hobbs", + "state": "IN", + "county": "Tipton" + }, + { + "zip_code": 46048, + "latitude": 39.95729, + "longitude": -85.798078, + "city": "Ingalls", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46049, + "latitude": 40.307545, + "longitude": -86.146767, + "city": "Kempton", + "state": "IN", + "county": "Tipton" + }, + { + "zip_code": 46050, + "latitude": 40.259929, + "longitude": -86.45201, + "city": "Kirklin", + "state": "IN", + "county": "Clinton" + }, + { + "zip_code": 46051, + "latitude": 40.05956, + "longitude": -85.834429, + "city": "Lapel", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46052, + "latitude": 40.050302, + "longitude": -86.490381, + "city": "Lebanon", + "state": "IN", + "county": "Boone" + }, + { + "zip_code": 46055, + "latitude": 39.878113, + "longitude": -85.897957, + "city": "Mc Cordsville", + "state": "IN", + "county": "Hancock" + }, + { + "zip_code": 46056, + "latitude": 39.985793, + "longitude": -85.617925, + "city": "Markleville", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46057, + "latitude": 40.306276, + "longitude": -86.490945, + "city": "Michigantown", + "state": "IN", + "county": "Clinton" + }, + { + "zip_code": 46058, + "latitude": 40.359433, + "longitude": -86.628659, + "city": "Mulberry", + "state": "IN", + "county": "Clinton" + }, + { + "zip_code": 46060, + "latitude": 40.073328, + "longitude": -85.999521, + "city": "Noblesville", + "state": "IN", + "county": "Hamilton" + }, + { + "zip_code": 46061, + "latitude": 40.072462, + "longitude": -86.052285, + "city": "Noblesville", + "state": "IN", + "county": "Hamilton" + }, + { + "zip_code": 46063, + "latitude": 40.271524, + "longitude": -85.72808, + "city": "Orestes", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46064, + "latitude": 40.107304, + "longitude": -85.757678, + "city": "Pendleton", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46065, + "latitude": 40.360973, + "longitude": -86.603449, + "city": "Rossville", + "state": "IN", + "county": "Clinton" + }, + { + "zip_code": 46067, + "latitude": 40.304473, + "longitude": -86.469044, + "city": "Sedalia", + "state": "IN", + "county": "Clinton" + }, + { + "zip_code": 46068, + "latitude": 40.354088, + "longitude": -86.118782, + "city": "Sharpsville", + "state": "IN", + "county": "Tipton" + }, + { + "zip_code": 46069, + "latitude": 40.129468, + "longitude": -86.185273, + "city": "Sheridan", + "state": "IN", + "county": "Hamilton" + }, + { + "zip_code": 46070, + "latitude": 40.314012, + "longitude": -85.666794, + "city": "Summitville", + "state": "IN", + "county": "Madison" + }, + { + "zip_code": 46071, + "latitude": 40.068631, + "longitude": -86.58186, + "city": "Thorntown", + "state": "IN", + "county": "Boone" + }, + { + "zip_code": 46072, + "latitude": 40.311418, + "longitude": -86.063107, + "city": "Tipton", + "state": "IN", + "county": "Tipton" + }, + { + "zip_code": 46074, + "latitude": 40.097028, + "longitude": -86.125716, + "city": "Westfield", + "state": "IN", + "county": "Hamilton" + }, + { + "zip_code": 46075, + "latitude": 40.022608, + "longitude": -86.346179, + "city": "Whitestown", + "state": "IN", + "county": "Boone" + }, + { + "zip_code": 46076, + "latitude": 40.348927, + "longitude": -85.937642, + "city": "Windfall", + "state": "IN", + "county": "Tipton" + }, + { + "zip_code": 46077, + "latitude": 39.997457, + "longitude": -86.298135, + "city": "Zionsville", + "state": "IN", + "county": "Boone" + }, + { + "zip_code": 46082, + "latitude": 40.072462, + "longitude": -86.052285, + "city": "Carmel", + "state": "IN", + "county": "Hamilton" + }, + { + "zip_code": 46102, + "latitude": 39.995599, + "longitude": -86.619774, + "city": "Advance", + "state": "IN", + "county": "Boone" + }, + { + "zip_code": 46103, + "latitude": 39.736926, + "longitude": -86.483474, + "city": "Amo", + "state": "IN", + "county": "Hendricks" + }, + { + "zip_code": 46104, + "latitude": 39.663342, + "longitude": -85.590869, + "city": "Arlington", + "state": "IN", + "county": "Rush" + }, + { + "zip_code": 46105, + "latitude": 39.752428, + "longitude": -86.812416, + "city": "Bainbridge", + "state": "IN", + "county": "Putnam" + }, + { + "zip_code": 46106, + "latitude": 39.489652, + "longitude": -86.102271, + "city": "Bargersville", + "state": "IN", + "county": "Johnson" + }, + { + "zip_code": 46107, + "latitude": 39.713893, + "longitude": -86.093293, + "city": "Beech Grove", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46110, + "latitude": 39.566614, + "longitude": -85.91406, + "city": "Boggstown", + "state": "IN", + "county": "Shelby" + }, + { + "zip_code": 46111, + "latitude": 39.539599, + "longitude": -86.370057, + "city": "Brooklyn", + "state": "IN", + "county": "Morgan" + }, + { + "zip_code": 46112, + "latitude": 39.807038, + "longitude": -86.470429, + "city": "Brownsburg", + "state": "IN", + "county": "Hendricks" + }, + { + "zip_code": 46113, + "latitude": 39.6533, + "longitude": -86.30309, + "city": "Camby", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46114, + "latitude": 39.762448, + "longitude": -86.510386, + "city": "Cartersburg", + "state": "IN", + "county": "Hendricks" + }, + { + "zip_code": 46115, + "latitude": 39.735455, + "longitude": -85.552199, + "city": "Carthage", + "state": "IN", + "county": "Rush" + }, + { + "zip_code": 46117, + "latitude": 39.838824, + "longitude": -85.625798, + "city": "Charlottesville", + "state": "IN", + "county": "Hancock" + }, + { + "zip_code": 46118, + "latitude": 39.711088, + "longitude": -86.495365, + "city": "Clayton", + "state": "IN", + "county": "Hendricks" + }, + { + "zip_code": 46120, + "latitude": 39.658826, + "longitude": -86.782523, + "city": "Cloverdale", + "state": "IN", + "county": "Putnam" + }, + { + "zip_code": 46121, + "latitude": 39.688598, + "longitude": -86.594745, + "city": "Coatesville", + "state": "IN", + "county": "Hendricks" + }, + { + "zip_code": 46122, + "latitude": 39.766794, + "longitude": -86.530319, + "city": "Danville", + "state": "IN", + "county": "Hendricks" + }, + { + "zip_code": 46123, + "latitude": 39.721434, + "longitude": -86.488881, + "city": "Avon", + "state": "IN", + "county": "Hendricks" + }, + { + "zip_code": 46124, + "latitude": 39.430795, + "longitude": -86.099838, + "city": "Edinburgh", + "state": "IN", + "county": "Johnson" + }, + { + "zip_code": 46125, + "latitude": 39.506641, + "longitude": -86.641773, + "city": "Eminence", + "state": "IN", + "county": "Morgan" + }, + { + "zip_code": 46126, + "latitude": 39.617344, + "longitude": -85.87593, + "city": "Fairland", + "state": "IN", + "county": "Shelby" + }, + { + "zip_code": 46127, + "latitude": 39.729032, + "longitude": -85.333088, + "city": "Falmouth", + "state": "IN", + "county": "Rush" + }, + { + "zip_code": 46128, + "latitude": 39.652271, + "longitude": -86.73796, + "city": "Fillmore", + "state": "IN", + "county": "Putnam" + }, + { + "zip_code": 46129, + "latitude": 39.821516, + "longitude": -85.765169, + "city": "Finly", + "state": "IN", + "county": "Hancock" + }, + { + "zip_code": 46130, + "latitude": 39.580663, + "longitude": -85.809775, + "city": "Fountaintown", + "state": "IN", + "county": "Shelby" + }, + { + "zip_code": 46131, + "latitude": 39.469172, + "longitude": -86.068718, + "city": "Franklin", + "state": "IN", + "county": "Johnson" + }, + { + "zip_code": 46133, + "latitude": 39.58598, + "longitude": -85.276882, + "city": "Glenwood", + "state": "IN", + "county": "Fayette" + }, + { + "zip_code": 46135, + "latitude": 39.699485, + "longitude": -86.857172, + "city": "Greencastle", + "state": "IN", + "county": "Putnam" + }, + { + "zip_code": 46140, + "latitude": 39.821787, + "longitude": -85.775403, + "city": "Greenfield", + "state": "IN", + "county": "Hancock" + }, + { + "zip_code": 46142, + "latitude": 39.491246, + "longitude": -86.100454, + "city": "Greenwood", + "state": "IN", + "county": "Johnson" + }, + { + "zip_code": 46143, + "latitude": 39.50708, + "longitude": -86.10149, + "city": "Greenwood", + "state": "IN", + "county": "Johnson" + }, + { + "zip_code": 46144, + "latitude": 39.66172, + "longitude": -85.647634, + "city": "Gwynneville", + "state": "IN", + "county": "Shelby" + }, + { + "zip_code": 46146, + "latitude": 39.619923, + "longitude": -85.46554, + "city": "Homer", + "state": "IN", + "county": "Rush" + }, + { + "zip_code": 46147, + "latitude": 39.988674, + "longitude": -86.563204, + "city": "Jamestown", + "state": "IN", + "county": "Boone" + }, + { + "zip_code": 46148, + "latitude": 39.836197, + "longitude": -85.474444, + "city": "Knightstown", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 46149, + "latitude": 39.871667, + "longitude": -86.560328, + "city": "Lizton", + "state": "IN", + "county": "Hendricks" + }, + { + "zip_code": 46150, + "latitude": 39.546509, + "longitude": -85.583666, + "city": "Manilla", + "state": "IN", + "county": "Rush" + }, + { + "zip_code": 46151, + "latitude": 39.477625, + "longitude": -86.466792, + "city": "Martinsville", + "state": "IN", + "county": "Morgan" + }, + { + "zip_code": 46154, + "latitude": 39.856763, + "longitude": -85.768357, + "city": "Maxwell", + "state": "IN", + "county": "Hancock" + }, + { + "zip_code": 46155, + "latitude": 39.743769, + "longitude": -85.431184, + "city": "Mays", + "state": "IN", + "county": "Rush" + }, + { + "zip_code": 46156, + "latitude": 39.488994, + "longitude": -85.486278, + "city": "Milroy", + "state": "IN", + "county": "Rush" + }, + { + "zip_code": 46157, + "latitude": 39.555178, + "longitude": -86.531957, + "city": "Monrovia", + "state": "IN", + "county": "Morgan" + }, + { + "zip_code": 46158, + "latitude": 39.50942, + "longitude": -86.437089, + "city": "Mooresville", + "state": "IN", + "county": "Morgan" + }, + { + "zip_code": 46160, + "latitude": 39.244566, + "longitude": -86.267561, + "city": "Morgantown", + "state": "IN", + "county": "Brown" + }, + { + "zip_code": 46161, + "latitude": 39.65521, + "longitude": -85.71264, + "city": "Morristown", + "state": "IN", + "county": "Shelby" + }, + { + "zip_code": 46162, + "latitude": 39.560511, + "longitude": -85.96563, + "city": "Needham", + "state": "IN", + "county": "Johnson" + }, + { + "zip_code": 46163, + "latitude": 39.739927, + "longitude": -85.885962, + "city": "New Palestine", + "state": "IN", + "county": "Hancock" + }, + { + "zip_code": 46164, + "latitude": 39.391505, + "longitude": -86.109534, + "city": "Nineveh", + "state": "IN", + "county": "Johnson" + }, + { + "zip_code": 46165, + "latitude": 39.839162, + "longitude": -86.640794, + "city": "North Salem", + "state": "IN", + "county": "Hendricks" + }, + { + "zip_code": 46166, + "latitude": 39.427654, + "longitude": -86.533865, + "city": "Paragon", + "state": "IN", + "county": "Morgan" + }, + { + "zip_code": 46167, + "latitude": 39.784191, + "longitude": -86.475318, + "city": "Pittsboro", + "state": "IN", + "county": "Hendricks" + }, + { + "zip_code": 46168, + "latitude": 39.729892, + "longitude": -86.423412, + "city": "Plainfield", + "state": "IN", + "county": "Hendricks" + }, + { + "zip_code": 46170, + "latitude": 39.668441, + "longitude": -86.828402, + "city": "Putnamville", + "state": "IN", + "county": "Putnam" + }, + { + "zip_code": 46171, + "latitude": 39.543141, + "longitude": -86.955955, + "city": "Reelsville", + "state": "IN", + "county": "Putnam" + }, + { + "zip_code": 46172, + "latitude": 39.821381, + "longitude": -86.814317, + "city": "Roachdale", + "state": "IN", + "county": "Putnam" + }, + { + "zip_code": 46173, + "latitude": 39.612836, + "longitude": -85.439133, + "city": "Rushville", + "state": "IN", + "county": "Rush" + }, + { + "zip_code": 46175, + "latitude": 39.822491, + "longitude": -86.973306, + "city": "Russellville", + "state": "IN", + "county": "Putnam" + }, + { + "zip_code": 46176, + "latitude": 39.511568, + "longitude": -85.791993, + "city": "Shelbyville", + "state": "IN", + "county": "Shelby" + }, + { + "zip_code": 46180, + "latitude": 39.632997, + "longitude": -86.607678, + "city": "Stilesville", + "state": "IN", + "county": "Hendricks" + }, + { + "zip_code": 46181, + "latitude": 39.416652, + "longitude": -86.103674, + "city": "Trafalgar", + "state": "IN", + "county": "Johnson" + }, + { + "zip_code": 46182, + "latitude": 39.515, + "longitude": -85.781538, + "city": "Waldron", + "state": "IN", + "county": "Shelby" + }, + { + "zip_code": 46183, + "latitude": 39.648251, + "longitude": -86.28509, + "city": "West Newton", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46184, + "latitude": 39.50607, + "longitude": -86.08434, + "city": "Whiteland", + "state": "IN", + "county": "Johnson" + }, + { + "zip_code": 46186, + "latitude": 39.895139, + "longitude": -85.643767, + "city": "Wilkinson", + "state": "IN", + "county": "Hancock" + }, + { + "zip_code": 46201, + "latitude": 39.775092, + "longitude": -86.13216, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46202, + "latitude": 39.762392, + "longitude": -86.143736, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46203, + "latitude": 39.743493, + "longitude": -86.113535, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46204, + "latitude": 39.772692, + "longitude": -86.158038, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46205, + "latitude": 39.822641, + "longitude": -86.129886, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46206, + "latitude": 39.761293, + "longitude": -86.161336, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46207, + "latitude": 39.767293, + "longitude": -86.160616, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46208, + "latitude": 39.832741, + "longitude": -86.190186, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46209, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46211, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46214, + "latitude": 39.792379, + "longitude": -86.287465, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46216, + "latitude": 39.864689, + "longitude": -86.013632, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46217, + "latitude": 39.678245, + "longitude": -86.197637, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46218, + "latitude": 39.806991, + "longitude": -86.100535, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46219, + "latitude": 39.782841, + "longitude": -86.081084, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46220, + "latitude": 39.86904, + "longitude": -86.10895, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46221, + "latitude": 39.764258, + "longitude": -86.130655, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46222, + "latitude": 39.783642, + "longitude": -86.207687, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46223, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46224, + "latitude": 39.794042, + "longitude": -86.27074, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46225, + "latitude": 39.743793, + "longitude": -86.167886, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46226, + "latitude": 39.832577, + "longitude": -86.083634, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46227, + "latitude": 39.678945, + "longitude": -86.130154, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46228, + "latitude": 39.846191, + "longitude": -86.195081, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46229, + "latitude": 39.798941, + "longitude": -86.035533, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46230, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46231, + "latitude": 39.703844, + "longitude": -86.30294, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46234, + "latitude": 39.808793, + "longitude": -86.316288, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46235, + "latitude": 39.84709, + "longitude": -85.974081, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46236, + "latitude": 39.868939, + "longitude": -85.976532, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46237, + "latitude": 39.742726, + "longitude": -86.171117, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46239, + "latitude": 39.726493, + "longitude": -86.000482, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46240, + "latitude": 39.877991, + "longitude": -86.200688, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46241, + "latitude": 39.709624, + "longitude": -86.261389, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46242, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46244, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46247, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46249, + "latitude": 39.858989, + "longitude": -86.006082, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46250, + "latitude": 39.904838, + "longitude": -86.067263, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46251, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46253, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46254, + "latitude": 39.81594, + "longitude": -86.22681, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46255, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46256, + "latitude": 39.897708, + "longitude": -86.009447, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46259, + "latitude": 39.667045, + "longitude": -85.998092, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46260, + "latitude": 39.89384, + "longitude": -86.137988, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46266, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46268, + "latitude": 39.868173, + "longitude": -86.21231, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46274, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46275, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46277, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46278, + "latitude": 39.872591, + "longitude": -86.276791, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46280, + "latitude": 39.9416, + "longitude": -86.115707, + "city": "Indianapolis", + "state": "IN", + "county": "Hamilton" + }, + { + "zip_code": 46282, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46283, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46285, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46290, + "latitude": 39.93731, + "longitude": -86.199445, + "city": "Indianapolis", + "state": "IN", + "county": "Hamilton" + }, + { + "zip_code": 46291, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46295, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46296, + "latitude": "", + "longitude": "", + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46298, + "latitude": 39.779492, + "longitude": -86.132837, + "city": "Indianapolis", + "state": "IN", + "county": "Marion" + }, + { + "zip_code": 46301, + "latitude": 41.683796, + "longitude": -86.975178, + "city": "Beverly Shores", + "state": "IN", + "county": "Porter" + }, + { + "zip_code": 46302, + "latitude": 41.354186, + "longitude": -87.130431, + "city": "Boone Grove", + "state": "IN", + "county": "Porter" + }, + { + "zip_code": 46303, + "latitude": 41.311861, + "longitude": -87.41665, + "city": "Cedar Lake", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46304, + "latitude": 41.498946, + "longitude": -87.087021, + "city": "Chesterton", + "state": "IN", + "county": "Porter" + }, + { + "zip_code": 46307, + "latitude": 41.444409, + "longitude": -87.360089, + "city": "Crown Point", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46308, + "latitude": 41.461543, + "longitude": -87.372779, + "city": "Crown Point", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46310, + "latitude": 41.107336, + "longitude": -87.208423, + "city": "Demotte", + "state": "IN", + "county": "Jasper" + }, + { + "zip_code": 46311, + "latitude": 41.451993, + "longitude": -87.499489, + "city": "Dyer", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46312, + "latitude": 41.640835, + "longitude": -87.46149, + "city": "East Chicago", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46319, + "latitude": 41.522129, + "longitude": -87.390338, + "city": "Griffith", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46320, + "latitude": 41.444246, + "longitude": -87.487242, + "city": "Hammond", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46321, + "latitude": 41.550535, + "longitude": -87.502585, + "city": "Munster", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46322, + "latitude": 41.577699, + "longitude": -87.47744, + "city": "Highland", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46323, + "latitude": 41.590519, + "longitude": -87.45644, + "city": "Hammond", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46324, + "latitude": 41.585185, + "longitude": -87.496665, + "city": "Hammond", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46325, + "latitude": 41.461543, + "longitude": -87.372779, + "city": "Hammond", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46327, + "latitude": 41.615085, + "longitude": -87.49039, + "city": "Hammond", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46340, + "latitude": 41.378592, + "longitude": -86.788687, + "city": "Hanna", + "state": "IN", + "county": "La Porte" + }, + { + "zip_code": 46341, + "latitude": 41.347188, + "longitude": -87.152358, + "city": "Hebron", + "state": "IN", + "county": "Porter" + }, + { + "zip_code": 46342, + "latitude": 41.520515, + "longitude": -87.347486, + "city": "Hobart", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46345, + "latitude": 41.526023, + "longitude": -86.699703, + "city": "Kingsbury", + "state": "IN", + "county": "La Porte" + }, + { + "zip_code": 46346, + "latitude": 41.480172, + "longitude": -86.691914, + "city": "Kingsford Heights", + "state": "IN", + "county": "La Porte" + }, + { + "zip_code": 46347, + "latitude": 41.301319, + "longitude": -87.066825, + "city": "Kouts", + "state": "IN", + "county": "Porter" + }, + { + "zip_code": 46348, + "latitude": 41.394105, + "longitude": -86.806742, + "city": "La Crosse", + "state": "IN", + "county": "La Porte" + }, + { + "zip_code": 46349, + "latitude": 41.108242, + "longitude": -87.418963, + "city": "Lake Village", + "state": "IN", + "county": "Newton" + }, + { + "zip_code": 46350, + "latitude": 41.537585, + "longitude": -86.73764, + "city": "La Porte", + "state": "IN", + "county": "La Porte" + }, + { + "zip_code": 46352, + "latitude": 41.498992, + "longitude": -86.709883, + "city": "La Porte", + "state": "IN", + "county": "La Porte" + }, + { + "zip_code": 46355, + "latitude": 41.359415, + "longitude": -87.27081, + "city": "Leroy", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46356, + "latitude": 41.280102, + "longitude": -87.411308, + "city": "Lowell", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46360, + "latitude": 41.594185, + "longitude": -86.756985, + "city": "Michigan City", + "state": "IN", + "county": "La Porte" + }, + { + "zip_code": 46361, + "latitude": 41.70354, + "longitude": -86.915077, + "city": "Michigan City", + "state": "IN", + "county": "La Porte" + }, + { + "zip_code": 46365, + "latitude": 41.609081, + "longitude": -86.543956, + "city": "Mill Creek", + "state": "IN", + "county": "La Porte" + }, + { + "zip_code": 46366, + "latitude": 41.25163, + "longitude": -86.735127, + "city": "North Judson", + "state": "IN", + "county": "Starke" + }, + { + "zip_code": 46368, + "latitude": 41.473367, + "longitude": -87.12927, + "city": "Portage", + "state": "IN", + "county": "Porter" + }, + { + "zip_code": 46371, + "latitude": 41.686609, + "longitude": -86.599414, + "city": "Rolling Prairie", + "state": "IN", + "county": "La Porte" + }, + { + "zip_code": 46372, + "latitude": 41.143358, + "longitude": -87.322049, + "city": "Roselawn", + "state": "IN", + "county": "Newton" + }, + { + "zip_code": 46373, + "latitude": 41.453965, + "longitude": -87.453086, + "city": "Saint John", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46374, + "latitude": 41.216655, + "longitude": -86.884, + "city": "San Pierre", + "state": "IN", + "county": "Starke" + }, + { + "zip_code": 46375, + "latitude": 41.487733, + "longitude": -87.441525, + "city": "Schererville", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46376, + "latitude": 41.189953, + "longitude": -87.477881, + "city": "Schneider", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46377, + "latitude": 41.191734, + "longitude": -87.339778, + "city": "Shelby", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46379, + "latitude": 41.167119, + "longitude": -87.43355, + "city": "Sumava Resorts", + "state": "IN", + "county": "Newton" + }, + { + "zip_code": 46380, + "latitude": 41.194816, + "longitude": -86.968614, + "city": "Tefft", + "state": "IN", + "county": "Jasper" + }, + { + "zip_code": 46381, + "latitude": 41.17115, + "longitude": -87.331323, + "city": "Thayer", + "state": "IN", + "county": "Newton" + }, + { + "zip_code": 46382, + "latitude": 41.466863, + "longitude": -86.772226, + "city": "Union Mills", + "state": "IN", + "county": "La Porte" + }, + { + "zip_code": 46383, + "latitude": 41.454731, + "longitude": -87.065565, + "city": "Valparaiso", + "state": "IN", + "county": "Porter" + }, + { + "zip_code": 46384, + "latitude": 41.490545, + "longitude": -87.076094, + "city": "Valparaiso", + "state": "IN", + "county": "Porter" + }, + { + "zip_code": 46385, + "latitude": 41.470567, + "longitude": -87.078309, + "city": "Valparaiso", + "state": "IN", + "county": "Porter" + }, + { + "zip_code": 46390, + "latitude": 41.421123, + "longitude": -86.872078, + "city": "Wanatah", + "state": "IN", + "county": "La Porte" + }, + { + "zip_code": 46391, + "latitude": 41.549933, + "longitude": -86.742979, + "city": "Westville", + "state": "IN", + "county": "La Porte" + }, + { + "zip_code": 46392, + "latitude": 41.133299, + "longitude": -87.063818, + "city": "Wheatfield", + "state": "IN", + "county": "Jasper" + }, + { + "zip_code": 46393, + "latitude": 41.511578, + "longitude": -87.179177, + "city": "Wheeler", + "state": "IN", + "county": "Porter" + }, + { + "zip_code": 46394, + "latitude": 41.656785, + "longitude": -87.493392, + "city": "Whiting", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46401, + "latitude": 41.590686, + "longitude": -87.319937, + "city": "Gary", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46402, + "latitude": 41.599336, + "longitude": -87.336338, + "city": "Gary", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46403, + "latitude": 41.605636, + "longitude": -87.268536, + "city": "Gary", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46404, + "latitude": 41.584136, + "longitude": -87.377538, + "city": "Gary", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46405, + "latitude": 41.555785, + "longitude": -87.354587, + "city": "Lake Station", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46406, + "latitude": 41.596012, + "longitude": -87.388189, + "city": "Gary", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46407, + "latitude": 41.578886, + "longitude": -87.319987, + "city": "Gary", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46408, + "latitude": 41.544936, + "longitude": -87.375307, + "city": "Gary", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46409, + "latitude": 41.545636, + "longitude": -87.304186, + "city": "Gary", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46410, + "latitude": 41.497212, + "longitude": -87.338656, + "city": "Merrillville", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46411, + "latitude": 41.461543, + "longitude": -87.372779, + "city": "Merrillville", + "state": "IN", + "county": "Lake" + }, + { + "zip_code": 46501, + "latitude": 41.242669, + "longitude": -86.248052, + "city": "Argos", + "state": "IN", + "county": "Marshall" + }, + { + "zip_code": 46502, + "latitude": 41.254035, + "longitude": -85.969708, + "city": "Atwood", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46504, + "latitude": 41.323904, + "longitude": -86.150818, + "city": "Bourbon", + "state": "IN", + "county": "Marshall" + }, + { + "zip_code": 46506, + "latitude": 41.40577, + "longitude": -86.242235, + "city": "Bremen", + "state": "IN", + "county": "Marshall" + }, + { + "zip_code": 46507, + "latitude": 41.712983, + "longitude": -85.824845, + "city": "Bristol", + "state": "IN", + "county": "Elkhart" + }, + { + "zip_code": 46508, + "latitude": 41.154726, + "longitude": -85.969282, + "city": "Burket", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46510, + "latitude": 41.136771, + "longitude": -85.871487, + "city": "Claypool", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46511, + "latitude": 41.314629, + "longitude": -86.386582, + "city": "Culver", + "state": "IN", + "county": "Marshall" + }, + { + "zip_code": 46513, + "latitude": 41.361903, + "longitude": -86.444254, + "city": "Donaldson", + "state": "IN", + "county": "Marshall" + }, + { + "zip_code": 46514, + "latitude": 41.71873, + "longitude": -85.937024, + "city": "Elkhart", + "state": "IN", + "county": "Elkhart" + }, + { + "zip_code": 46515, + "latitude": 41.641449, + "longitude": -85.938348, + "city": "Elkhart", + "state": "IN", + "county": "Elkhart" + }, + { + "zip_code": 46516, + "latitude": 41.620856, + "longitude": -85.897236, + "city": "Elkhart", + "state": "IN", + "county": "Elkhart" + }, + { + "zip_code": 46517, + "latitude": 41.617705, + "longitude": -85.965717, + "city": "Elkhart", + "state": "IN", + "county": "Elkhart" + }, + { + "zip_code": 46524, + "latitude": 41.296306, + "longitude": -85.99843, + "city": "Etna Green", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46526, + "latitude": 41.584839, + "longitude": -85.858059, + "city": "Goshen", + "state": "IN", + "county": "Elkhart" + }, + { + "zip_code": 46527, + "latitude": 41.597739, + "longitude": -85.858076, + "city": "Goshen", + "state": "IN", + "county": "Elkhart" + }, + { + "zip_code": 46528, + "latitude": 41.624763, + "longitude": -85.839139, + "city": "Goshen", + "state": "IN", + "county": "Elkhart" + }, + { + "zip_code": 46530, + "latitude": 41.734912, + "longitude": -86.139868, + "city": "Granger", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46531, + "latitude": 41.34963, + "longitude": -86.524321, + "city": "Grovertown", + "state": "IN", + "county": "Starke" + }, + { + "zip_code": 46532, + "latitude": 41.393141, + "longitude": -86.594849, + "city": "Hamlet", + "state": "IN", + "county": "Starke" + }, + { + "zip_code": 46534, + "latitude": 41.280907, + "longitude": -86.608249, + "city": "Knox", + "state": "IN", + "county": "Starke" + }, + { + "zip_code": 46536, + "latitude": 41.526373, + "longitude": -86.270086, + "city": "Lakeville", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46537, + "latitude": 41.455431, + "longitude": -86.309368, + "city": "Lapaz", + "state": "IN", + "county": "Marshall" + }, + { + "zip_code": 46538, + "latitude": 41.342883, + "longitude": -85.823785, + "city": "Leesburg", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46539, + "latitude": 41.177648, + "longitude": -86.008586, + "city": "Mentone", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46540, + "latitude": 41.646192, + "longitude": -85.831327, + "city": "Middlebury", + "state": "IN", + "county": "Elkhart" + }, + { + "zip_code": 46542, + "latitude": 41.28296, + "longitude": -85.871138, + "city": "Milford", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46543, + "latitude": 41.531255, + "longitude": -85.712083, + "city": "Millersburg", + "state": "IN", + "county": "Elkhart" + }, + { + "zip_code": 46544, + "latitude": 41.61536, + "longitude": -86.287884, + "city": "Mishawaka", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46545, + "latitude": 41.696407, + "longitude": -86.304735, + "city": "Mishawaka", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46546, + "latitude": 41.688432, + "longitude": -86.196485, + "city": "Mishawaka", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46550, + "latitude": 41.574743, + "longitude": -85.972724, + "city": "Nappanee", + "state": "IN", + "county": "Elkhart" + }, + { + "zip_code": 46552, + "latitude": 41.701172, + "longitude": -86.455494, + "city": "New Carlisle", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46553, + "latitude": 41.47867, + "longitude": -85.8192, + "city": "New Paris", + "state": "IN", + "county": "Elkhart" + }, + { + "zip_code": 46554, + "latitude": 41.561716, + "longitude": -86.414045, + "city": "North Liberty", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46555, + "latitude": 41.332568, + "longitude": -85.710285, + "city": "North Webster", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46556, + "latitude": 41.596769, + "longitude": -86.292991, + "city": "Notre Dame", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46561, + "latitude": 41.669504, + "longitude": -86.087002, + "city": "Osceola", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46562, + "latitude": 41.265769, + "longitude": -85.854745, + "city": "Pierceton", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46563, + "latitude": 41.352997, + "longitude": -86.301486, + "city": "Plymouth", + "state": "IN", + "county": "Marshall" + }, + { + "zip_code": 46565, + "latitude": 41.67572, + "longitude": -85.567362, + "city": "Shipshewana", + "state": "IN", + "county": "Lagrange" + }, + { + "zip_code": 46566, + "latitude": 41.137923, + "longitude": -85.88883, + "city": "Sidney", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46567, + "latitude": 41.296386, + "longitude": -85.844729, + "city": "Syracuse", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46570, + "latitude": 41.215971, + "longitude": -86.12282, + "city": "Tippecanoe", + "state": "IN", + "county": "Marshall" + }, + { + "zip_code": 46571, + "latitude": 41.578904, + "longitude": -85.540055, + "city": "Topeka", + "state": "IN", + "county": "Lagrange" + }, + { + "zip_code": 46572, + "latitude": 41.325513, + "longitude": -86.260569, + "city": "Tyner", + "state": "IN", + "county": "Marshall" + }, + { + "zip_code": 46573, + "latitude": 41.58574, + "longitude": -85.882695, + "city": "Wakarusa", + "state": "IN", + "county": "Elkhart" + }, + { + "zip_code": 46574, + "latitude": 41.488957, + "longitude": -86.446734, + "city": "Walkerton", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46580, + "latitude": 41.2228, + "longitude": -85.860179, + "city": "Warsaw", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46581, + "latitude": 41.239365, + "longitude": -85.864267, + "city": "Warsaw", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46582, + "latitude": 41.254225, + "longitude": -85.849508, + "city": "Warsaw", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46590, + "latitude": 41.232725, + "longitude": -85.826346, + "city": "Winona Lake", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46595, + "latitude": 41.518136, + "longitude": -86.165227, + "city": "Wyatt", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46601, + "latitude": 41.673383, + "longitude": -86.251654, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46604, + "latitude": 41.664198, + "longitude": -86.221805, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46612, + "latitude": 41.628483, + "longitude": -86.234589, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46613, + "latitude": 41.656573, + "longitude": -86.255696, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46614, + "latitude": 41.616532, + "longitude": -86.278463, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46615, + "latitude": 41.677046, + "longitude": -86.216105, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46616, + "latitude": 41.695957, + "longitude": -86.264293, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46617, + "latitude": 41.682897, + "longitude": -86.238906, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46619, + "latitude": 41.672919, + "longitude": -86.296056, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46620, + "latitude": 41.596769, + "longitude": -86.292991, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46624, + "latitude": 41.733223, + "longitude": -86.283278, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46626, + "latitude": 41.677397, + "longitude": -86.252506, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46628, + "latitude": 41.716559, + "longitude": -86.335738, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46629, + "latitude": 41.671919, + "longitude": -86.27911, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46634, + "latitude": 41.596769, + "longitude": -86.292991, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46635, + "latitude": 41.686358, + "longitude": -86.338666, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46637, + "latitude": 41.699077, + "longitude": -86.315321, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46660, + "latitude": 41.596769, + "longitude": -86.292991, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46680, + "latitude": 41.596769, + "longitude": -86.292991, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46699, + "latitude": 41.596769, + "longitude": -86.292991, + "city": "South Bend", + "state": "IN", + "county": "St Joseph" + }, + { + "zip_code": 46701, + "latitude": 41.376028, + "longitude": -85.413862, + "city": "Albion", + "state": "IN", + "county": "Noble" + }, + { + "zip_code": 46702, + "latitude": 40.820278, + "longitude": -85.597862, + "city": "Andrews", + "state": "IN", + "county": "Huntington" + }, + { + "zip_code": 46703, + "latitude": 41.672567, + "longitude": -85.000474, + "city": "Angola", + "state": "IN", + "county": "Steuben" + }, + { + "zip_code": 46704, + "latitude": 41.103797, + "longitude": -85.292474, + "city": "Arcola", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46705, + "latitude": 41.501455, + "longitude": -85.071275, + "city": "Ashley", + "state": "IN", + "county": "De Kalb" + }, + { + "zip_code": 46706, + "latitude": 41.377758, + "longitude": -85.027689, + "city": "Auburn", + "state": "IN", + "county": "De Kalb" + }, + { + "zip_code": 46710, + "latitude": 41.368123, + "longitude": -85.391019, + "city": "Avilla", + "state": "IN", + "county": "Noble" + }, + { + "zip_code": 46711, + "latitude": 40.671628, + "longitude": -84.934331, + "city": "Berne", + "state": "IN", + "county": "Adams" + }, + { + "zip_code": 46713, + "latitude": 40.829196, + "longitude": -85.489198, + "city": "Bippus", + "state": "IN", + "county": "Huntington" + }, + { + "zip_code": 46714, + "latitude": 40.71327, + "longitude": -85.2023, + "city": "Bluffton", + "state": "IN", + "county": "Wells" + }, + { + "zip_code": 46720, + "latitude": 41.395275, + "longitude": -85.423462, + "city": "Brimfield", + "state": "IN", + "county": "Noble" + }, + { + "zip_code": 46721, + "latitude": 41.426441, + "longitude": -84.912517, + "city": "Butler", + "state": "IN", + "county": "De Kalb" + }, + { + "zip_code": 46723, + "latitude": 41.190811, + "longitude": -85.389672, + "city": "Churubusco", + "state": "IN", + "county": "Whitley" + }, + { + "zip_code": 46725, + "latitude": 41.14956, + "longitude": -85.50042, + "city": "Columbia City", + "state": "IN", + "county": "Whitley" + }, + { + "zip_code": 46730, + "latitude": 41.463082, + "longitude": -85.137324, + "city": "Corunna", + "state": "IN", + "county": "De Kalb" + }, + { + "zip_code": 46731, + "latitude": 40.794056, + "longitude": -85.104206, + "city": "Craigville", + "state": "IN", + "county": "Wells" + }, + { + "zip_code": 46732, + "latitude": 41.377903, + "longitude": -85.59875, + "city": "Cromwell", + "state": "IN", + "county": "Noble" + }, + { + "zip_code": 46733, + "latitude": 40.81911, + "longitude": -84.93785, + "city": "Decatur", + "state": "IN", + "county": "Adams" + }, + { + "zip_code": 46737, + "latitude": 41.711462, + "longitude": -84.945643, + "city": "Fremont", + "state": "IN", + "county": "Steuben" + }, + { + "zip_code": 46738, + "latitude": 41.323007, + "longitude": -85.140707, + "city": "Garrett", + "state": "IN", + "county": "De Kalb" + }, + { + "zip_code": 46740, + "latitude": 40.612058, + "longitude": -84.936072, + "city": "Geneva", + "state": "IN", + "county": "Adams" + }, + { + "zip_code": 46741, + "latitude": 41.195015, + "longitude": -84.963984, + "city": "Grabill", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46742, + "latitude": 41.572304, + "longitude": -84.897465, + "city": "Hamilton", + "state": "IN", + "county": "Steuben" + }, + { + "zip_code": 46743, + "latitude": 41.227324, + "longitude": -84.987882, + "city": "Harlan", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46745, + "latitude": 40.957347, + "longitude": -85.002148, + "city": "Hoagland", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46746, + "latitude": 41.711914, + "longitude": -85.367474, + "city": "Howe", + "state": "IN", + "county": "Lagrange" + }, + { + "zip_code": 46747, + "latitude": 41.577125, + "longitude": -85.113166, + "city": "Hudson", + "state": "IN", + "county": "Steuben" + }, + { + "zip_code": 46748, + "latitude": 41.237988, + "longitude": -85.159437, + "city": "Huntertown", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46750, + "latitude": 40.842697, + "longitude": -85.489225, + "city": "Huntington", + "state": "IN", + "county": "Huntington" + }, + { + "zip_code": 46755, + "latitude": 41.431488, + "longitude": -85.389073, + "city": "Kendallville", + "state": "IN", + "county": "Noble" + }, + { + "zip_code": 46759, + "latitude": 40.603317, + "longitude": -85.205635, + "city": "Keystone", + "state": "IN", + "county": "Wells" + }, + { + "zip_code": 46760, + "latitude": 41.369423, + "longitude": -85.543448, + "city": "Kimmell", + "state": "IN", + "county": "Noble" + }, + { + "zip_code": 46761, + "latitude": 41.655135, + "longitude": -85.387208, + "city": "Lagrange", + "state": "IN", + "county": "Lagrange" + }, + { + "zip_code": 46763, + "latitude": 41.292913, + "longitude": -85.27904, + "city": "Laotto", + "state": "IN", + "county": "Noble" + }, + { + "zip_code": 46764, + "latitude": 41.206938, + "longitude": -85.591994, + "city": "Larwill", + "state": "IN", + "county": "Whitley" + }, + { + "zip_code": 46765, + "latitude": 41.232203, + "longitude": -85.043118, + "city": "Leo", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46766, + "latitude": 40.698551, + "longitude": -85.278222, + "city": "Liberty Center", + "state": "IN", + "county": "Wells" + }, + { + "zip_code": 46767, + "latitude": 41.405478, + "longitude": -85.42573, + "city": "Ligonier", + "state": "IN", + "county": "Noble" + }, + { + "zip_code": 46769, + "latitude": 40.74532, + "longitude": -84.937926, + "city": "Linn Grove", + "state": "IN", + "county": "Adams" + }, + { + "zip_code": 46770, + "latitude": 40.862309, + "longitude": -85.354611, + "city": "Markle", + "state": "IN", + "county": "Huntington" + }, + { + "zip_code": 46771, + "latitude": 41.665489, + "longitude": -85.267567, + "city": "Mongo", + "state": "IN", + "county": "Lagrange" + }, + { + "zip_code": 46772, + "latitude": 40.709518, + "longitude": -84.919164, + "city": "Monroe", + "state": "IN", + "county": "Adams" + }, + { + "zip_code": 46773, + "latitude": 41.059007, + "longitude": -84.90402, + "city": "Monroeville", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46774, + "latitude": 41.102098, + "longitude": -84.962038, + "city": "New Haven", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46776, + "latitude": 41.71364, + "longitude": -85.140168, + "city": "Orland", + "state": "IN", + "county": "Steuben" + }, + { + "zip_code": 46777, + "latitude": 40.855435, + "longitude": -85.203797, + "city": "Ossian", + "state": "IN", + "county": "Wells" + }, + { + "zip_code": 46778, + "latitude": 40.611419, + "longitude": -85.152604, + "city": "Petroleum", + "state": "IN", + "county": "Wells" + }, + { + "zip_code": 46779, + "latitude": 41.577443, + "longitude": -85.031873, + "city": "Pleasant Lake", + "state": "IN", + "county": "Steuben" + }, + { + "zip_code": 46780, + "latitude": 40.74532, + "longitude": -84.937926, + "city": "Pleasant Mills", + "state": "IN", + "county": "Adams" + }, + { + "zip_code": 46781, + "latitude": 40.639684, + "longitude": -85.259163, + "city": "Poneto", + "state": "IN", + "county": "Wells" + }, + { + "zip_code": 46782, + "latitude": 40.83204, + "longitude": -85.005402, + "city": "Preble", + "state": "IN", + "county": "Adams" + }, + { + "zip_code": 46783, + "latitude": 40.954446, + "longitude": -85.393868, + "city": "Roanoke", + "state": "IN", + "county": "Huntington" + }, + { + "zip_code": 46784, + "latitude": 41.401296, + "longitude": -85.401402, + "city": "Rome City", + "state": "IN", + "county": "Noble" + }, + { + "zip_code": 46785, + "latitude": 41.319754, + "longitude": -84.888552, + "city": "Saint Joe", + "state": "IN", + "county": "De Kalb" + }, + { + "zip_code": 46786, + "latitude": 41.536899, + "longitude": -85.319241, + "city": "South Milford", + "state": "IN", + "county": "Lagrange" + }, + { + "zip_code": 46787, + "latitude": 41.071204, + "longitude": -85.510981, + "city": "South Whitley", + "state": "IN", + "county": "Whitley" + }, + { + "zip_code": 46788, + "latitude": 41.302927, + "longitude": -84.902416, + "city": "Spencerville", + "state": "IN", + "county": "De Kalb" + }, + { + "zip_code": 46789, + "latitude": 41.583493, + "longitude": -85.199186, + "city": "Stroh", + "state": "IN", + "county": "Lagrange" + }, + { + "zip_code": 46791, + "latitude": 40.859358, + "longitude": -85.270039, + "city": "Uniondale", + "state": "IN", + "county": "Wells" + }, + { + "zip_code": 46792, + "latitude": 40.712066, + "longitude": -85.468798, + "city": "Warren", + "state": "IN", + "county": "Huntington" + }, + { + "zip_code": 46793, + "latitude": 41.461019, + "longitude": -85.019562, + "city": "Waterloo", + "state": "IN", + "county": "De Kalb" + }, + { + "zip_code": 46794, + "latitude": 41.476682, + "longitude": -85.386856, + "city": "Wawaka", + "state": "IN", + "county": "Noble" + }, + { + "zip_code": 46795, + "latitude": 41.583475, + "longitude": -85.337737, + "city": "Wolcottville", + "state": "IN", + "county": "Lagrange" + }, + { + "zip_code": 46796, + "latitude": 41.336115, + "longitude": -85.500246, + "city": "Wolflake", + "state": "IN", + "county": "Noble" + }, + { + "zip_code": 46797, + "latitude": 41.125044, + "longitude": -84.874249, + "city": "Woodburn", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46798, + "latitude": 41.009498, + "longitude": -85.086518, + "city": "Yoder", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46799, + "latitude": 40.918797, + "longitude": -85.282422, + "city": "Zanesville", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46801, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46802, + "latitude": 41.065397, + "longitude": -85.15842, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46803, + "latitude": 41.065648, + "longitude": -85.084069, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46804, + "latitude": 41.057168, + "longitude": -85.239172, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46805, + "latitude": 41.099948, + "longitude": -85.078019, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46806, + "latitude": 41.049248, + "longitude": -85.082319, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46807, + "latitude": 41.042342, + "longitude": -85.14682, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46808, + "latitude": 41.093898, + "longitude": -85.184121, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46809, + "latitude": 41.037097, + "longitude": -85.205071, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46814, + "latitude": 41.045647, + "longitude": -85.305823, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46815, + "latitude": 41.141189, + "longitude": -85.072068, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46816, + "latitude": 40.988047, + "longitude": -85.033817, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46818, + "latitude": 41.112548, + "longitude": -85.203895, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46819, + "latitude": 40.978697, + "longitude": -85.126419, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46825, + "latitude": 41.138003, + "longitude": -85.104001, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46835, + "latitude": 41.156698, + "longitude": -85.057218, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46845, + "latitude": 41.095957, + "longitude": -85.084581, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46850, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46851, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46852, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46853, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46854, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46855, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46856, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46857, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46858, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46859, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46860, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46861, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46862, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46863, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46864, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46865, + "latitude": 41.126298, + "longitude": -85.090669, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46866, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46867, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46868, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46869, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46885, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46895, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46896, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46897, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46898, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46899, + "latitude": 41.093763, + "longitude": -85.070713, + "city": "Fort Wayne", + "state": "IN", + "county": "Allen" + }, + { + "zip_code": 46901, + "latitude": 40.506851, + "longitude": -86.171054, + "city": "Kokomo", + "state": "IN", + "county": "Howard" + }, + { + "zip_code": 46902, + "latitude": 40.444291, + "longitude": -86.17559, + "city": "Kokomo", + "state": "IN", + "county": "Howard" + }, + { + "zip_code": 46903, + "latitude": 40.469625, + "longitude": -86.11894, + "city": "Kokomo", + "state": "IN", + "county": "Howard" + }, + { + "zip_code": 46904, + "latitude": 40.469625, + "longitude": -86.11894, + "city": "Kokomo", + "state": "IN", + "county": "Howard" + }, + { + "zip_code": 46910, + "latitude": 41.047932, + "longitude": -86.069172, + "city": "Akron", + "state": "IN", + "county": "Fulton" + }, + { + "zip_code": 46911, + "latitude": 40.650476, + "longitude": -85.943552, + "city": "Amboy", + "state": "IN", + "county": "Miami" + }, + { + "zip_code": 46912, + "latitude": 41.040988, + "longitude": -86.206925, + "city": "Athens", + "state": "IN", + "county": "Fulton" + }, + { + "zip_code": 46913, + "latitude": 40.500141, + "longitude": -86.507065, + "city": "Bringhurst", + "state": "IN", + "county": "Carroll" + }, + { + "zip_code": 46914, + "latitude": 40.659068, + "longitude": -86.102125, + "city": "Bunker Hill", + "state": "IN", + "county": "Miami" + }, + { + "zip_code": 46915, + "latitude": 40.495181, + "longitude": -86.394248, + "city": "Burlington", + "state": "IN", + "county": "Carroll" + }, + { + "zip_code": 46916, + "latitude": 40.584272, + "longitude": -86.573952, + "city": "Burrows", + "state": "IN", + "county": "Carroll" + }, + { + "zip_code": 46917, + "latitude": 40.626954, + "longitude": -86.499148, + "city": "Camden", + "state": "IN", + "county": "Carroll" + }, + { + "zip_code": 46919, + "latitude": 40.578034, + "longitude": -85.878104, + "city": "Converse", + "state": "IN", + "county": "Miami" + }, + { + "zip_code": 46920, + "latitude": 40.485424, + "longitude": -86.488525, + "city": "Cutler", + "state": "IN", + "county": "Carroll" + }, + { + "zip_code": 46921, + "latitude": 40.960538, + "longitude": -86.12908, + "city": "Deedsville", + "state": "IN", + "county": "Miami" + }, + { + "zip_code": 46922, + "latitude": 41.040988, + "longitude": -86.206925, + "city": "Delong", + "state": "IN", + "county": "Fulton" + }, + { + "zip_code": 46923, + "latitude": 40.580452, + "longitude": -86.637891, + "city": "Delphi", + "state": "IN", + "county": "Carroll" + }, + { + "zip_code": 46926, + "latitude": 40.867036, + "longitude": -86.07524, + "city": "Denver", + "state": "IN", + "county": "Miami" + }, + { + "zip_code": 46928, + "latitude": 40.515421, + "longitude": -85.661196, + "city": "Fairmount", + "state": "IN", + "county": "Grant" + }, + { + "zip_code": 46929, + "latitude": 40.556269, + "longitude": -86.490521, + "city": "Flora", + "state": "IN", + "county": "Carroll" + }, + { + "zip_code": 46930, + "latitude": 40.40993, + "longitude": -85.571035, + "city": "Fowlerton", + "state": "IN", + "county": "Grant" + }, + { + "zip_code": 46931, + "latitude": 40.948405, + "longitude": -86.265814, + "city": "Fulton", + "state": "IN", + "county": "Fulton" + }, + { + "zip_code": 46932, + "latitude": 40.634254, + "longitude": -86.269625, + "city": "Galveston", + "state": "IN", + "county": "Cass" + }, + { + "zip_code": 46933, + "latitude": 40.54429, + "longitude": -85.585245, + "city": "Gas City", + "state": "IN", + "county": "Grant" + }, + { + "zip_code": 46935, + "latitude": 41.040988, + "longitude": -86.206925, + "city": "Grass Creek", + "state": "IN", + "county": "Fulton" + }, + { + "zip_code": 46936, + "latitude": 40.485442, + "longitude": -85.997326, + "city": "Greentown", + "state": "IN", + "county": "Howard" + }, + { + "zip_code": 46937, + "latitude": 40.418662, + "longitude": -86.018139, + "city": "Hemlock", + "state": "IN", + "county": "Howard" + }, + { + "zip_code": 46938, + "latitude": 40.44673, + "longitude": -85.650398, + "city": "Jonesboro", + "state": "IN", + "county": "Grant" + }, + { + "zip_code": 46939, + "latitude": 41.040533, + "longitude": -86.374647, + "city": "Kewanna", + "state": "IN", + "county": "Fulton" + }, + { + "zip_code": 46940, + "latitude": 40.696155, + "longitude": -85.740428, + "city": "La Fontaine", + "state": "IN", + "county": "Wabash" + }, + { + "zip_code": 46941, + "latitude": 40.826475, + "longitude": -85.700909, + "city": "Lagro", + "state": "IN", + "county": "Wabash" + }, + { + "zip_code": 46942, + "latitude": 40.736111, + "longitude": -86.37341, + "city": "Lake Cicott", + "state": "IN", + "county": "Cass" + }, + { + "zip_code": 46943, + "latitude": 40.974279, + "longitude": -85.837546, + "city": "Laketon", + "state": "IN", + "county": "Wabash" + }, + { + "zip_code": 46945, + "latitude": 41.040988, + "longitude": -86.206925, + "city": "Leiters Ford", + "state": "IN", + "county": "Fulton" + }, + { + "zip_code": 46946, + "latitude": 41.035629, + "longitude": -85.735756, + "city": "Liberty Mills", + "state": "IN", + "county": "Wabash" + }, + { + "zip_code": 46947, + "latitude": 40.77927, + "longitude": -86.375168, + "city": "Logansport", + "state": "IN", + "county": "Cass" + }, + { + "zip_code": 46950, + "latitude": 40.875277, + "longitude": -86.354066, + "city": "Lucerne", + "state": "IN", + "county": "Cass" + }, + { + "zip_code": 46951, + "latitude": 40.95841, + "longitude": -86.129366, + "city": "Macy", + "state": "IN", + "county": "Miami" + }, + { + "zip_code": 46952, + "latitude": 40.519756, + "longitude": -85.636731, + "city": "Marion", + "state": "IN", + "county": "Grant" + }, + { + "zip_code": 46953, + "latitude": 40.499959, + "longitude": -85.626401, + "city": "Marion", + "state": "IN", + "county": "Grant" + }, + { + "zip_code": 46957, + "latitude": 40.389831, + "longitude": -85.476619, + "city": "Matthews", + "state": "IN", + "county": "Grant" + }, + { + "zip_code": 46958, + "latitude": 40.822384, + "longitude": -86.116189, + "city": "Mexico", + "state": "IN", + "county": "Miami" + }, + { + "zip_code": 46959, + "latitude": 40.61466, + "longitude": -86.106432, + "city": "Miami", + "state": "IN", + "county": "Miami" + }, + { + "zip_code": 46960, + "latitude": 41.124552, + "longitude": -86.544617, + "city": "Monterey", + "state": "IN", + "county": "Pulaski" + }, + { + "zip_code": 46961, + "latitude": 40.762054, + "longitude": -86.193648, + "city": "New Waverly", + "state": "IN", + "county": "Cass" + }, + { + "zip_code": 46962, + "latitude": 40.859877, + "longitude": -85.794138, + "city": "North Manchester", + "state": "IN", + "county": "Wabash" + }, + { + "zip_code": 46965, + "latitude": 40.412741, + "longitude": -86.101484, + "city": "Oakford", + "state": "IN", + "county": "Howard" + }, + { + "zip_code": 46967, + "latitude": 40.694298, + "longitude": -86.204238, + "city": "Onward", + "state": "IN", + "county": "Cass" + }, + { + "zip_code": 46968, + "latitude": 41.175557, + "longitude": -86.554326, + "city": "Ora", + "state": "IN", + "county": "Starke" + }, + { + "zip_code": 46970, + "latitude": 40.73991, + "longitude": -86.07581, + "city": "Peru", + "state": "IN", + "county": "Miami" + }, + { + "zip_code": 46971, + "latitude": 40.780955, + "longitude": -86.016441, + "city": "Grissom Arb", + "state": "IN", + "county": "Miami" + }, + { + "zip_code": 46974, + "latitude": 40.951589, + "longitude": -85.854151, + "city": "Roann", + "state": "IN", + "county": "Wabash" + }, + { + "zip_code": 46975, + "latitude": 41.040988, + "longitude": -86.254272, + "city": "Rochester", + "state": "IN", + "county": "Fulton" + }, + { + "zip_code": 46977, + "latitude": 40.584272, + "longitude": -86.573952, + "city": "Rockfield", + "state": "IN", + "county": "Carroll" + }, + { + "zip_code": 46978, + "latitude": 40.851622, + "longitude": -86.492019, + "city": "Royal Center", + "state": "IN", + "county": "Cass" + }, + { + "zip_code": 46979, + "latitude": 40.42573, + "longitude": -86.269717, + "city": "Russiaville", + "state": "IN", + "county": "Howard" + }, + { + "zip_code": 46980, + "latitude": 40.848927, + "longitude": -85.792501, + "city": "Servia", + "state": "IN", + "county": "Wabash" + }, + { + "zip_code": 46982, + "latitude": 41.130963, + "longitude": -85.856589, + "city": "Silver Lake", + "state": "IN", + "county": "Kosciusko" + }, + { + "zip_code": 46984, + "latitude": 40.671369, + "longitude": -85.828846, + "city": "Somerset", + "state": "IN", + "county": "Wabash" + }, + { + "zip_code": 46985, + "latitude": 41.003004, + "longitude": -86.589005, + "city": "Star City", + "state": "IN", + "county": "Pulaski" + }, + { + "zip_code": 46986, + "latitude": 40.505141, + "longitude": -85.815617, + "city": "Swayzee", + "state": "IN", + "county": "Grant" + }, + { + "zip_code": 46987, + "latitude": 40.564673, + "longitude": -85.765569, + "city": "Sweetser", + "state": "IN", + "county": "Grant" + }, + { + "zip_code": 46988, + "latitude": 40.866096, + "longitude": -86.233899, + "city": "Twelve Mile", + "state": "IN", + "county": "Cass" + }, + { + "zip_code": 46989, + "latitude": 40.455985, + "longitude": -85.62512, + "city": "Upland", + "state": "IN", + "county": "Grant" + }, + { + "zip_code": 46990, + "latitude": 40.886571, + "longitude": -85.736386, + "city": "Urbana", + "state": "IN", + "county": "Wabash" + }, + { + "zip_code": 46991, + "latitude": 40.617379, + "longitude": -85.514796, + "city": "Van Buren", + "state": "IN", + "county": "Grant" + }, + { + "zip_code": 46992, + "latitude": 40.801867, + "longitude": -85.791823, + "city": "Wabash", + "state": "IN", + "county": "Wabash" + }, + { + "zip_code": 46994, + "latitude": 40.677128, + "longitude": -86.260927, + "city": "Walton", + "state": "IN", + "county": "Cass" + }, + { + "zip_code": 46995, + "latitude": 40.442117, + "longitude": -86.215482, + "city": "West Middleton", + "state": "IN", + "county": "Howard" + }, + { + "zip_code": 46996, + "latitude": 41.035862, + "longitude": -86.622156, + "city": "Winamac", + "state": "IN", + "county": "Pulaski" + }, + { + "zip_code": 46998, + "latitude": 40.866023, + "longitude": -86.225982, + "city": "Young America", + "state": "IN", + "county": "Cass" + }, + { + "zip_code": 47001, + "latitude": 39.091081, + "longitude": -84.988904, + "city": "Aurora", + "state": "IN", + "county": "Dearborn" + }, + { + "zip_code": 47003, + "latitude": 39.515851, + "longitude": -84.862979, + "city": "West College Corner", + "state": "IN", + "county": "Union" + }, + { + "zip_code": 47006, + "latitude": 39.19017, + "longitude": -85.229151, + "city": "Batesville", + "state": "IN", + "county": "Ripley" + }, + { + "zip_code": 47010, + "latitude": 39.490701, + "longitude": -84.853529, + "city": "Bath", + "state": "IN", + "county": "Franklin" + }, + { + "zip_code": 47011, + "latitude": 38.864386, + "longitude": -85.074867, + "city": "Bennington", + "state": "IN", + "county": "Switzerland" + }, + { + "zip_code": 47012, + "latitude": 39.416398, + "longitude": -85.00028, + "city": "Brookville", + "state": "IN", + "county": "Franklin" + }, + { + "zip_code": 47016, + "latitude": 39.367379, + "longitude": -84.910391, + "city": "Cedar Grove", + "state": "IN", + "county": "Franklin" + }, + { + "zip_code": 47017, + "latitude": 38.945037, + "longitude": -85.191159, + "city": "Cross Plains", + "state": "IN", + "county": "Ripley" + }, + { + "zip_code": 47018, + "latitude": 39.002217, + "longitude": -85.02623, + "city": "Dillsboro", + "state": "IN", + "county": "Dearborn" + }, + { + "zip_code": 47019, + "latitude": 38.868591, + "longitude": -84.925998, + "city": "East Enterprise", + "state": "IN", + "county": "Switzerland" + }, + { + "zip_code": 47020, + "latitude": 38.82353, + "longitude": -84.950119, + "city": "Florence", + "state": "IN", + "county": "Switzerland" + }, + { + "zip_code": 47021, + "latitude": 38.970266, + "longitude": -85.15039, + "city": "Friendship", + "state": "IN", + "county": "Ripley" + }, + { + "zip_code": 47022, + "latitude": 39.193261, + "longitude": -84.964354, + "city": "Guilford", + "state": "IN", + "county": "Dearborn" + }, + { + "zip_code": 47023, + "latitude": 39.082863, + "longitude": -85.374353, + "city": "Holton", + "state": "IN", + "county": "Ripley" + }, + { + "zip_code": 47024, + "latitude": 39.467957, + "longitude": -85.178057, + "city": "Laurel", + "state": "IN", + "county": "Franklin" + }, + { + "zip_code": 47025, + "latitude": 39.152741, + "longitude": -84.891015, + "city": "Lawrenceburg", + "state": "IN", + "county": "Dearborn" + }, + { + "zip_code": 47030, + "latitude": 39.433095, + "longitude": -85.111826, + "city": "Metamora", + "state": "IN", + "county": "Franklin" + }, + { + "zip_code": 47031, + "latitude": 39.115266, + "longitude": -85.22819, + "city": "Milan", + "state": "IN", + "county": "Ripley" + }, + { + "zip_code": 47032, + "latitude": 39.16259, + "longitude": -84.980417, + "city": "Moores Hill", + "state": "IN", + "county": "Dearborn" + }, + { + "zip_code": 47033, + "latitude": 39.281429, + "longitude": -85.1739, + "city": "Morris", + "state": "IN", + "county": "Ripley" + }, + { + "zip_code": 47034, + "latitude": 39.204833, + "longitude": -85.326962, + "city": "Napoleon", + "state": "IN", + "county": "Ripley" + }, + { + "zip_code": 47035, + "latitude": 39.309983, + "longitude": -84.900711, + "city": "New Trenton", + "state": "IN", + "county": "Franklin" + }, + { + "zip_code": 47036, + "latitude": 39.386175, + "longitude": -85.238529, + "city": "Oldenburg", + "state": "IN", + "county": "Franklin" + }, + { + "zip_code": 47037, + "latitude": 39.172808, + "longitude": -85.285367, + "city": "Osgood", + "state": "IN", + "county": "Ripley" + }, + { + "zip_code": 47038, + "latitude": 38.84188, + "longitude": -84.881782, + "city": "Patriot", + "state": "IN", + "county": "Switzerland" + }, + { + "zip_code": 47039, + "latitude": 39.111625, + "longitude": -85.255114, + "city": "Pierceville", + "state": "IN", + "county": "Ripley" + }, + { + "zip_code": 47040, + "latitude": 38.958134, + "longitude": -84.984085, + "city": "Rising Sun", + "state": "IN", + "county": "Ohio" + }, + { + "zip_code": 47041, + "latitude": 39.231396, + "longitude": -85.140001, + "city": "Sunman", + "state": "IN", + "county": "Ripley" + }, + { + "zip_code": 47042, + "latitude": 39.039682, + "longitude": -85.244161, + "city": "Versailles", + "state": "IN", + "county": "Ripley" + }, + { + "zip_code": 47043, + "latitude": 38.809388, + "longitude": -85.061136, + "city": "Vevay", + "state": "IN", + "county": "Switzerland" + }, + { + "zip_code": 47060, + "latitude": 39.25151, + "longitude": -84.91437, + "city": "West Harrison", + "state": "IN", + "county": "Dearborn" + }, + { + "zip_code": 47102, + "latitude": 38.748455, + "longitude": -85.750469, + "city": "Austin", + "state": "IN", + "county": "Scott" + }, + { + "zip_code": 47104, + "latitude": 38.539899, + "longitude": -85.421753, + "city": "Bethlehem", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47106, + "latitude": 38.482335, + "longitude": -85.76776, + "city": "Borden", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47107, + "latitude": 38.190314, + "longitude": -86.115257, + "city": "Bradford", + "state": "IN", + "county": "Harrison" + }, + { + "zip_code": 47108, + "latitude": 38.614255, + "longitude": -86.220645, + "city": "Campbellsburg", + "state": "IN", + "county": "Washington" + }, + { + "zip_code": 47110, + "latitude": 38.096971, + "longitude": -86.172327, + "city": "Central", + "state": "IN", + "county": "Harrison" + }, + { + "zip_code": 47111, + "latitude": 38.459992, + "longitude": -85.615235, + "city": "Charlestown", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47112, + "latitude": 38.1863, + "longitude": -86.145211, + "city": "Corydon", + "state": "IN", + "county": "Harrison" + }, + { + "zip_code": 47114, + "latitude": 38.289882, + "longitude": -86.08239, + "city": "Crandall", + "state": "IN", + "county": "Harrison" + }, + { + "zip_code": 47115, + "latitude": 38.338462, + "longitude": -86.212957, + "city": "Depauw", + "state": "IN", + "county": "Harrison" + }, + { + "zip_code": 47116, + "latitude": 38.329303, + "longitude": -86.575635, + "city": "Eckerty", + "state": "IN", + "county": "Crawford" + }, + { + "zip_code": 47117, + "latitude": 38.094629, + "longitude": -85.988349, + "city": "Elizabeth", + "state": "IN", + "county": "Harrison" + }, + { + "zip_code": 47118, + "latitude": 38.288549, + "longitude": -86.501185, + "city": "English", + "state": "IN", + "county": "Crawford" + }, + { + "zip_code": 47119, + "latitude": 38.35257, + "longitude": -85.890727, + "city": "Floyds Knobs", + "state": "IN", + "county": "Floyd" + }, + { + "zip_code": 47120, + "latitude": 38.46772, + "longitude": -86.185333, + "city": "Fredericksburg", + "state": "IN", + "county": "Washington" + }, + { + "zip_code": 47122, + "latitude": 38.31098, + "longitude": -85.960009, + "city": "Georgetown", + "state": "IN", + "county": "Floyd" + }, + { + "zip_code": 47123, + "latitude": 38.281966, + "longitude": -86.484327, + "city": "Grantsburg", + "state": "IN", + "county": "Crawford" + }, + { + "zip_code": 47124, + "latitude": 38.373209, + "longitude": -85.986626, + "city": "Greenville", + "state": "IN", + "county": "Floyd" + }, + { + "zip_code": 47125, + "latitude": 38.500408, + "longitude": -86.244689, + "city": "Hardinsburg", + "state": "IN", + "county": "Washington" + }, + { + "zip_code": 47126, + "latitude": 38.5504, + "longitude": -85.774327, + "city": "Henryville", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47129, + "latitude": 38.310958, + "longitude": -85.764463, + "city": "Clarksville", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47130, + "latitude": 38.404909, + "longitude": -85.716548, + "city": "Jeffersonville", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47131, + "latitude": 38.437021, + "longitude": -85.704973, + "city": "Jeffersonville", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47132, + "latitude": 38.286819, + "longitude": -85.732062, + "city": "Jeffersonville", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47133, + "latitude": 38.286819, + "longitude": -85.732062, + "city": "Jeffersonville", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47134, + "latitude": 38.286819, + "longitude": -85.732062, + "city": "Jeffersonville", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47135, + "latitude": 38.039957, + "longitude": -86.06555, + "city": "Laconia", + "state": "IN", + "county": "Harrison" + }, + { + "zip_code": 47136, + "latitude": 38.227684, + "longitude": -85.990389, + "city": "Lanesville", + "state": "IN", + "county": "Harrison" + }, + { + "zip_code": 47137, + "latitude": 38.195771, + "longitude": -86.368905, + "city": "Leavenworth", + "state": "IN", + "county": "Crawford" + }, + { + "zip_code": 47138, + "latitude": 38.671281, + "longitude": -85.6333, + "city": "Lexington", + "state": "IN", + "county": "Scott" + }, + { + "zip_code": 47139, + "latitude": 38.600666, + "longitude": -86.078828, + "city": "Little York", + "state": "IN", + "county": "Washington" + }, + { + "zip_code": 47140, + "latitude": 38.357884, + "longitude": -86.372687, + "city": "Marengo", + "state": "IN", + "county": "Crawford" + }, + { + "zip_code": 47141, + "latitude": 38.549871, + "longitude": -85.597466, + "city": "Marysville", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47142, + "latitude": 38.073945, + "longitude": -86.204065, + "city": "Mauckport", + "state": "IN", + "county": "Harrison" + }, + { + "zip_code": 47143, + "latitude": 38.467595, + "longitude": -85.769631, + "city": "Memphis", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47144, + "latitude": 38.286819, + "longitude": -85.732062, + "city": "Jeffersonville", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47145, + "latitude": 38.337832, + "longitude": -86.314971, + "city": "Milltown", + "state": "IN", + "county": "Crawford" + }, + { + "zip_code": 47146, + "latitude": 38.298486, + "longitude": -85.896961, + "city": "Mount Saint Francis", + "state": "IN", + "county": "Floyd" + }, + { + "zip_code": 47147, + "latitude": 38.580326, + "longitude": -85.532171, + "city": "Nabb", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47150, + "latitude": 38.293355, + "longitude": -85.837911, + "city": "New Albany", + "state": "IN", + "county": "Floyd" + }, + { + "zip_code": 47151, + "latitude": 38.298486, + "longitude": -85.896961, + "city": "New Albany", + "state": "IN", + "county": "Floyd" + }, + { + "zip_code": 47160, + "latitude": 38.148843, + "longitude": -86.049282, + "city": "New Middletown", + "state": "IN", + "county": "Harrison" + }, + { + "zip_code": 47161, + "latitude": 38.328025, + "longitude": -86.105996, + "city": "New Salisbury", + "state": "IN", + "county": "Harrison" + }, + { + "zip_code": 47162, + "latitude": 38.550289, + "longitude": -85.486131, + "city": "New Washington", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47163, + "latitude": 38.535058, + "longitude": -85.669829, + "city": "Otisco", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47164, + "latitude": 38.380353, + "longitude": -86.105954, + "city": "Palmyra", + "state": "IN", + "county": "Harrison" + }, + { + "zip_code": 47165, + "latitude": 38.512878, + "longitude": -86.010567, + "city": "Pekin", + "state": "IN", + "county": "Washington" + }, + { + "zip_code": 47166, + "latitude": 38.303364, + "longitude": -86.168979, + "city": "Ramsey", + "state": "IN", + "county": "Harrison" + }, + { + "zip_code": 47167, + "latitude": 38.608621, + "longitude": -86.079404, + "city": "Salem", + "state": "IN", + "county": "Washington" + }, + { + "zip_code": 47170, + "latitude": 38.695648, + "longitude": -85.772815, + "city": "Scottsburg", + "state": "IN", + "county": "Scott" + }, + { + "zip_code": 47172, + "latitude": 38.404577, + "longitude": -85.787963, + "city": "Sellersburg", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47174, + "latitude": 38.22588, + "longitude": -86.490751, + "city": "Sulphur", + "state": "IN", + "county": "Crawford" + }, + { + "zip_code": 47175, + "latitude": 38.345487, + "longitude": -86.54608, + "city": "Taswell", + "state": "IN", + "county": "Crawford" + }, + { + "zip_code": 47177, + "latitude": 38.584823, + "longitude": -85.748631, + "city": "Underwood", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47199, + "latitude": 38.286819, + "longitude": -85.732062, + "city": "Jeffersonville", + "state": "IN", + "county": "Clark" + }, + { + "zip_code": 47201, + "latitude": 39.191447, + "longitude": -85.891338, + "city": "Columbus", + "state": "IN", + "county": "Bartholomew" + }, + { + "zip_code": 47202, + "latitude": 39.192972, + "longitude": -85.885168, + "city": "Columbus", + "state": "IN", + "county": "Bartholomew" + }, + { + "zip_code": 47203, + "latitude": 39.241129, + "longitude": -85.827439, + "city": "Columbus", + "state": "IN", + "county": "Bartholomew" + }, + { + "zip_code": 47220, + "latitude": 38.866192, + "longitude": -86.046452, + "city": "Brownstown", + "state": "IN", + "county": "Jackson" + }, + { + "zip_code": 47223, + "latitude": 39.046146, + "longitude": -85.486831, + "city": "Butlerville", + "state": "IN", + "county": "Jennings" + }, + { + "zip_code": 47224, + "latitude": 38.873448, + "longitude": -85.291935, + "city": "Canaan", + "state": "IN", + "county": "Jefferson" + }, + { + "zip_code": 47225, + "latitude": 39.424072, + "longitude": -85.347677, + "city": "Clarksburg", + "state": "IN", + "county": "Decatur" + }, + { + "zip_code": 47226, + "latitude": 39.282609, + "longitude": -85.868533, + "city": "Clifford", + "state": "IN", + "county": "Bartholomew" + }, + { + "zip_code": 47227, + "latitude": 38.868992, + "longitude": -85.660004, + "city": "Commiskey", + "state": "IN", + "county": "Jennings" + }, + { + "zip_code": 47228, + "latitude": 38.974458, + "longitude": -85.962761, + "city": "Cortland", + "state": "IN", + "county": "Jackson" + }, + { + "zip_code": 47229, + "latitude": 38.815289, + "longitude": -85.985182, + "city": "Crothersville", + "state": "IN", + "county": "Jackson" + }, + { + "zip_code": 47230, + "latitude": 38.794988, + "longitude": -85.60731, + "city": "Deputy", + "state": "IN", + "county": "Jefferson" + }, + { + "zip_code": 47231, + "latitude": 38.876272, + "longitude": -85.500519, + "city": "Dupont", + "state": "IN", + "county": "Jefferson" + }, + { + "zip_code": 47232, + "latitude": 39.118884, + "longitude": -85.773533, + "city": "Elizabethtown", + "state": "IN", + "county": "Bartholomew" + }, + { + "zip_code": 47234, + "latitude": 39.393802, + "longitude": -85.77201, + "city": "Flat Rock", + "state": "IN", + "county": "Shelby" + }, + { + "zip_code": 47235, + "latitude": 38.962837, + "longitude": -86.155545, + "city": "Freetown", + "state": "IN", + "county": "Jackson" + }, + { + "zip_code": 47236, + "latitude": 39.152228, + "longitude": -85.726135, + "city": "Grammer", + "state": "IN", + "county": "Bartholomew" + }, + { + "zip_code": 47240, + "latitude": 39.299802, + "longitude": -85.491781, + "city": "Greensburg", + "state": "IN", + "county": "Decatur" + }, + { + "zip_code": 47243, + "latitude": 38.734755, + "longitude": -85.376804, + "city": "Hanover", + "state": "IN", + "county": "Jefferson" + }, + { + "zip_code": 47244, + "latitude": 39.218578, + "longitude": -85.717648, + "city": "Hartsville", + "state": "IN", + "county": "Bartholomew" + }, + { + "zip_code": 47245, + "latitude": 39.001301, + "longitude": -85.619906, + "city": "Hayden", + "state": "IN", + "county": "Jennings" + }, + { + "zip_code": 47246, + "latitude": 39.20336, + "longitude": -85.787611, + "city": "Hope", + "state": "IN", + "county": "Bartholomew" + }, + { + "zip_code": 47247, + "latitude": 39.059349, + "longitude": -85.888579, + "city": "Jonesville", + "state": "IN", + "county": "Bartholomew" + }, + { + "zip_code": 47249, + "latitude": 38.897974, + "longitude": -86.056681, + "city": "Kurtz", + "state": "IN", + "county": "Jackson" + }, + { + "zip_code": 47250, + "latitude": 38.804552, + "longitude": -85.420605, + "city": "Madison", + "state": "IN", + "county": "Jefferson" + }, + { + "zip_code": 47260, + "latitude": 38.84003, + "longitude": -86.194693, + "city": "Medora", + "state": "IN", + "county": "Jackson" + }, + { + "zip_code": 47261, + "latitude": 39.292004, + "longitude": -85.491788, + "city": "Millhousen", + "state": "IN", + "county": "Decatur" + }, + { + "zip_code": 47262, + "latitude": 39.001301, + "longitude": -85.619906, + "city": "Nebraska", + "state": "IN", + "county": "Jennings" + }, + { + "zip_code": 47263, + "latitude": 39.308252, + "longitude": -85.329695, + "city": "New Point", + "state": "IN", + "county": "Decatur" + }, + { + "zip_code": 47264, + "latitude": 38.947371, + "longitude": -86.23671, + "city": "Norman", + "state": "IN", + "county": "Jackson" + }, + { + "zip_code": 47265, + "latitude": 39.023539, + "longitude": -85.622328, + "city": "North Vernon", + "state": "IN", + "county": "Jennings" + }, + { + "zip_code": 47270, + "latitude": 38.86752, + "longitude": -85.716186, + "city": "Paris Crossing", + "state": "IN", + "county": "Jennings" + }, + { + "zip_code": 47272, + "latitude": 39.318, + "longitude": -85.463684, + "city": "Saint Paul", + "state": "IN", + "county": "Decatur" + }, + { + "zip_code": 47273, + "latitude": 39.064795, + "longitude": -85.733853, + "city": "Scipio", + "state": "IN", + "county": "Jennings" + }, + { + "zip_code": 47274, + "latitude": 38.944827, + "longitude": -86.010789, + "city": "Seymour", + "state": "IN", + "county": "Jackson" + }, + { + "zip_code": 47280, + "latitude": 39.295266, + "longitude": -85.949844, + "city": "Taylorsville", + "state": "IN", + "county": "Bartholomew" + }, + { + "zip_code": 47281, + "latitude": 38.814419, + "longitude": -86.092983, + "city": "Vallonia", + "state": "IN", + "county": "Jackson" + }, + { + "zip_code": 47282, + "latitude": 38.982509, + "longitude": -85.616595, + "city": "Vernon", + "state": "IN", + "county": "Jennings" + }, + { + "zip_code": 47283, + "latitude": 39.241181, + "longitude": -85.564278, + "city": "Westport", + "state": "IN", + "county": "Decatur" + }, + { + "zip_code": 47302, + "latitude": 40.142124, + "longitude": -85.389874, + "city": "Muncie", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47303, + "latitude": 40.280332, + "longitude": -85.383447, + "city": "Muncie", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47304, + "latitude": 40.238544, + "longitude": -85.484122, + "city": "Muncie", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47305, + "latitude": 40.247979, + "longitude": -85.433223, + "city": "Muncie", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47306, + "latitude": 40.202293, + "longitude": -85.408221, + "city": "Muncie", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47307, + "latitude": 40.162093, + "longitude": -85.442772, + "city": "Muncie", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47308, + "latitude": 40.227938, + "longitude": -85.396685, + "city": "Muncie", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47320, + "latitude": 40.277967, + "longitude": -85.274125, + "city": "Albany", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47322, + "latitude": 39.656994, + "longitude": -85.167996, + "city": "Bentonville", + "state": "IN", + "county": "Fayette" + }, + { + "zip_code": 47324, + "latitude": 39.757864, + "longitude": -84.848442, + "city": "Boston", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47325, + "latitude": 39.682946, + "longitude": -84.995266, + "city": "Brownsville", + "state": "IN", + "county": "Union" + }, + { + "zip_code": 47326, + "latitude": 40.54116, + "longitude": -84.982803, + "city": "Bryant", + "state": "IN", + "county": "Jay" + }, + { + "zip_code": 47327, + "latitude": 39.848569, + "longitude": -85.035364, + "city": "Cambridge City", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47330, + "latitude": 39.787438, + "longitude": -84.986277, + "city": "Centerville", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47331, + "latitude": 39.656933, + "longitude": -85.168099, + "city": "Connersville", + "state": "IN", + "county": "Fayette" + }, + { + "zip_code": 47334, + "latitude": 40.143843, + "longitude": -85.508457, + "city": "Daleville", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47335, + "latitude": 39.812688, + "longitude": -85.204359, + "city": "Dublin", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47336, + "latitude": 40.43525, + "longitude": -85.091124, + "city": "Dunkirk", + "state": "IN", + "county": "Jay" + }, + { + "zip_code": 47337, + "latitude": 39.803063, + "longitude": -85.43711, + "city": "Dunreith", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47338, + "latitude": 40.252982, + "longitude": -85.338738, + "city": "Eaton", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47339, + "latitude": 39.961044, + "longitude": -85.102314, + "city": "Economy", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47340, + "latitude": 40.187565, + "longitude": -85.14558, + "city": "Farmland", + "state": "IN", + "county": "Randolph" + }, + { + "zip_code": 47341, + "latitude": 39.864218, + "longitude": -84.995365, + "city": "Fountain City", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47342, + "latitude": 40.309361, + "longitude": -85.432657, + "city": "Gaston", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47344, + "latitude": 39.878933, + "longitude": -85.464036, + "city": "Greensboro", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47345, + "latitude": 39.893845, + "longitude": -85.013775, + "city": "Greens Fork", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47346, + "latitude": 39.895789, + "longitude": -85.05967, + "city": "Hagerstown", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47348, + "latitude": 40.472672, + "longitude": -85.326447, + "city": "Hartford City", + "state": "IN", + "county": "Blackford" + }, + { + "zip_code": 47351, + "latitude": 39.904018, + "longitude": -85.520548, + "city": "Kennard", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47352, + "latitude": 39.830372, + "longitude": -85.372732, + "city": "Lewisville", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47353, + "latitude": 39.625149, + "longitude": -84.925002, + "city": "Liberty", + "state": "IN", + "county": "Union" + }, + { + "zip_code": 47354, + "latitude": 40.048148, + "longitude": -85.17051, + "city": "Losantville", + "state": "IN", + "county": "Randolph" + }, + { + "zip_code": 47355, + "latitude": 40.055775, + "longitude": -84.941102, + "city": "Lynn", + "state": "IN", + "county": "Randolph" + }, + { + "zip_code": 47356, + "latitude": 39.941555, + "longitude": -85.462793, + "city": "Middletown", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47357, + "latitude": 39.764911, + "longitude": -85.109015, + "city": "Milton", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47358, + "latitude": 40.055419, + "longitude": -85.108514, + "city": "Modoc", + "state": "IN", + "county": "Randolph" + }, + { + "zip_code": 47359, + "latitude": 40.515895, + "longitude": -85.295619, + "city": "Montpelier", + "state": "IN", + "county": "Blackford" + }, + { + "zip_code": 47360, + "latitude": 40.01641, + "longitude": -85.293037, + "city": "Mooreland", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47361, + "latitude": 40.001295, + "longitude": -85.319923, + "city": "Mount Summit", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47362, + "latitude": 39.92487, + "longitude": -85.366926, + "city": "New Castle", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47366, + "latitude": 39.931785, + "longitude": -85.398625, + "city": "New Lisbon", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47367, + "latitude": 40.079197, + "longitude": -85.389978, + "city": "Oakville", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47368, + "latitude": 40.174184, + "longitude": -85.173858, + "city": "Parker City", + "state": "IN", + "county": "Randolph" + }, + { + "zip_code": 47369, + "latitude": 40.457413, + "longitude": -85.133813, + "city": "Pennville", + "state": "IN", + "county": "Jay" + }, + { + "zip_code": 47370, + "latitude": 39.861314, + "longitude": -85.147437, + "city": "Pershing", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47371, + "latitude": 40.431634, + "longitude": -84.983015, + "city": "Portland", + "state": "IN", + "county": "Jay" + }, + { + "zip_code": 47373, + "latitude": 40.359568, + "longitude": -85.151994, + "city": "Redkey", + "state": "IN", + "county": "Jay" + }, + { + "zip_code": 47374, + "latitude": 39.84081, + "longitude": -85.010442, + "city": "Richmond", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47375, + "latitude": 39.860417, + "longitude": -85.015983, + "city": "Richmond", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47380, + "latitude": 40.167082, + "longitude": -85.048286, + "city": "Ridgeville", + "state": "IN", + "county": "Randolph" + }, + { + "zip_code": 47381, + "latitude": 40.378574, + "longitude": -84.882263, + "city": "Salamonia", + "state": "IN", + "county": "Jay" + }, + { + "zip_code": 47382, + "latitude": 40.234703, + "longitude": -84.91848, + "city": "Saratoga", + "state": "IN", + "county": "Randolph" + }, + { + "zip_code": 47383, + "latitude": 40.15178, + "longitude": -85.265562, + "city": "Selma", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47384, + "latitude": 39.946332, + "longitude": -85.485528, + "city": "Shirley", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47385, + "latitude": 39.91725, + "longitude": -85.450834, + "city": "Spiceland", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47386, + "latitude": 40.011128, + "longitude": -85.383768, + "city": "Springport", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47387, + "latitude": 39.83059, + "longitude": -85.284275, + "city": "Straughn", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47388, + "latitude": 40.005999, + "longitude": -85.44341, + "city": "Sulphur Springs", + "state": "IN", + "county": "Henry" + }, + { + "zip_code": 47390, + "latitude": 40.166457, + "longitude": -85.006297, + "city": "Union City", + "state": "IN", + "county": "Randolph" + }, + { + "zip_code": 47392, + "latitude": 39.911895, + "longitude": -84.935057, + "city": "Webster", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47393, + "latitude": 39.930541, + "longitude": -85.028032, + "city": "Williamsburg", + "state": "IN", + "county": "Wayne" + }, + { + "zip_code": 47394, + "latitude": 40.159854, + "longitude": -84.984682, + "city": "Winchester", + "state": "IN", + "county": "Randolph" + }, + { + "zip_code": 47396, + "latitude": 40.19855, + "longitude": -85.509272, + "city": "Yorktown", + "state": "IN", + "county": "Delaware" + }, + { + "zip_code": 47401, + "latitude": 39.07881, + "longitude": -86.435094, + "city": "Bloomington", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47402, + "latitude": 39.173234, + "longitude": -86.501543, + "city": "Bloomington", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47403, + "latitude": 39.07884, + "longitude": -86.592389, + "city": "Bloomington", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47404, + "latitude": 39.25007, + "longitude": -86.580849, + "city": "Bloomington", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47405, + "latitude": 39.173447, + "longitude": -86.515145, + "city": "Bloomington", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47406, + "latitude": 39.174541, + "longitude": -86.518296, + "city": "Bloomington", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47407, + "latitude": 39.173234, + "longitude": -86.501543, + "city": "Bloomington", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47408, + "latitude": 39.230326, + "longitude": -86.469187, + "city": "Bloomington", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47420, + "latitude": 38.839482, + "longitude": -86.47943, + "city": "Avoca", + "state": "IN", + "county": "Lawrence" + }, + { + "zip_code": 47421, + "latitude": 38.890524, + "longitude": -86.525843, + "city": "Bedford", + "state": "IN", + "county": "Lawrence" + }, + { + "zip_code": 47424, + "latitude": 39.031541, + "longitude": -86.838359, + "city": "Bloomfield", + "state": "IN", + "county": "Greene" + }, + { + "zip_code": 47426, + "latitude": 39.173234, + "longitude": -86.501543, + "city": "Clear Creek", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47427, + "latitude": 39.319527, + "longitude": -86.842743, + "city": "Coal City", + "state": "IN", + "county": "Owen" + }, + { + "zip_code": 47429, + "latitude": 39.276356, + "longitude": -86.62658, + "city": "Ellettsville", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47430, + "latitude": 38.839482, + "longitude": -86.47943, + "city": "Fort Ritner", + "state": "IN", + "county": "Lawrence" + }, + { + "zip_code": 47431, + "latitude": 39.319527, + "longitude": -86.842743, + "city": "Freedom", + "state": "IN", + "county": "Owen" + }, + { + "zip_code": 47432, + "latitude": 38.486914, + "longitude": -86.587861, + "city": "French Lick", + "state": "IN", + "county": "Orange" + }, + { + "zip_code": 47433, + "latitude": 39.346964, + "longitude": -86.701332, + "city": "Gosport", + "state": "IN", + "county": "Owen" + }, + { + "zip_code": 47434, + "latitude": 39.012984, + "longitude": -86.545732, + "city": "Harrodsburg", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47435, + "latitude": 39.196272, + "longitude": -86.230212, + "city": "Helmsburg", + "state": "IN", + "county": "Brown" + }, + { + "zip_code": 47436, + "latitude": 38.839482, + "longitude": -86.47943, + "city": "Heltonville", + "state": "IN", + "county": "Lawrence" + }, + { + "zip_code": 47437, + "latitude": 38.722153, + "longitude": -86.670987, + "city": "Huron", + "state": "IN", + "county": "Lawrence" + }, + { + "zip_code": 47438, + "latitude": 39.078835, + "longitude": -86.992896, + "city": "Jasonville", + "state": "IN", + "county": "Greene" + }, + { + "zip_code": 47439, + "latitude": 39.037144, + "longitude": -86.961577, + "city": "Koleen", + "state": "IN", + "county": "Greene" + }, + { + "zip_code": 47441, + "latitude": 39.04963, + "longitude": -87.126965, + "city": "Linton", + "state": "IN", + "county": "Greene" + }, + { + "zip_code": 47443, + "latitude": 38.988255, + "longitude": -87.102958, + "city": "Lyons", + "state": "IN", + "county": "Greene" + }, + { + "zip_code": 47445, + "latitude": 39.037144, + "longitude": -86.961577, + "city": "Midland", + "state": "IN", + "county": "Greene" + }, + { + "zip_code": 47446, + "latitude": 38.803928, + "longitude": -86.50326, + "city": "Mitchell", + "state": "IN", + "county": "Lawrence" + }, + { + "zip_code": 47448, + "latitude": 39.180583, + "longitude": -86.226228, + "city": "Nashville", + "state": "IN", + "county": "Brown" + }, + { + "zip_code": 47449, + "latitude": 39.037144, + "longitude": -86.961577, + "city": "Newberry", + "state": "IN", + "county": "Greene" + }, + { + "zip_code": 47451, + "latitude": 38.895608, + "longitude": -86.525522, + "city": "Oolitic", + "state": "IN", + "county": "Lawrence" + }, + { + "zip_code": 47452, + "latitude": 38.586595, + "longitude": -86.451946, + "city": "Orleans", + "state": "IN", + "county": "Orange" + }, + { + "zip_code": 47453, + "latitude": 39.037144, + "longitude": -86.961577, + "city": "Owensburg", + "state": "IN", + "county": "Greene" + }, + { + "zip_code": 47454, + "latitude": 38.513132, + "longitude": -86.459473, + "city": "Paoli", + "state": "IN", + "county": "Orange" + }, + { + "zip_code": 47455, + "latitude": 39.319527, + "longitude": -86.842743, + "city": "Patricksburg", + "state": "IN", + "county": "Owen" + }, + { + "zip_code": 47456, + "latitude": 39.442888, + "longitude": -86.669559, + "city": "Quincy", + "state": "IN", + "county": "Owen" + }, + { + "zip_code": 47457, + "latitude": 39.037144, + "longitude": -86.961577, + "city": "Scotland", + "state": "IN", + "county": "Greene" + }, + { + "zip_code": 47458, + "latitude": 39.173234, + "longitude": -86.501543, + "city": "Smithville", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47459, + "latitude": 39.104137, + "longitude": -86.73706, + "city": "Solsberry", + "state": "IN", + "county": "Greene" + }, + { + "zip_code": 47460, + "latitude": 39.313258, + "longitude": -86.756423, + "city": "Spencer", + "state": "IN", + "county": "Owen" + }, + { + "zip_code": 47462, + "latitude": 38.941408, + "longitude": -86.584408, + "city": "Springville", + "state": "IN", + "county": "Lawrence" + }, + { + "zip_code": 47463, + "latitude": 39.085896, + "longitude": -86.6689, + "city": "Stanford", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47464, + "latitude": 39.299823, + "longitude": -86.648201, + "city": "Stinesville", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47465, + "latitude": 39.037144, + "longitude": -86.961577, + "city": "Switz City", + "state": "IN", + "county": "Greene" + }, + { + "zip_code": 47467, + "latitude": 38.839482, + "longitude": -86.47943, + "city": "Tunnelton", + "state": "IN", + "county": "Lawrence" + }, + { + "zip_code": 47468, + "latitude": 39.274735, + "longitude": -86.42106, + "city": "Unionville", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47469, + "latitude": 38.620834, + "longitude": -86.589851, + "city": "West Baden Springs", + "state": "IN", + "county": "Orange" + }, + { + "zip_code": 47470, + "latitude": 38.839482, + "longitude": -86.47943, + "city": "Williams", + "state": "IN", + "county": "Lawrence" + }, + { + "zip_code": 47471, + "latitude": 39.124289, + "longitude": -86.970755, + "city": "Worthington", + "state": "IN", + "county": "Greene" + }, + { + "zip_code": 47490, + "latitude": 39.173234, + "longitude": -86.501543, + "city": "Bloomington", + "state": "IN", + "county": "Monroe" + }, + { + "zip_code": 47501, + "latitude": 38.689503, + "longitude": -87.121505, + "city": "Washington", + "state": "IN", + "county": "Daviess" + }, + { + "zip_code": 47512, + "latitude": 38.741286, + "longitude": -87.346192, + "city": "Bicknell", + "state": "IN", + "county": "Knox" + }, + { + "zip_code": 47513, + "latitude": 38.326772, + "longitude": -86.820726, + "city": "Birdseye", + "state": "IN", + "county": "Dubois" + }, + { + "zip_code": 47514, + "latitude": 38.053876, + "longitude": -86.621994, + "city": "Branchville", + "state": "IN", + "county": "Perry" + }, + { + "zip_code": 47515, + "latitude": 38.198133, + "longitude": -86.682068, + "city": "Bristow", + "state": "IN", + "county": "Perry" + }, + { + "zip_code": 47516, + "latitude": 38.761354, + "longitude": -87.417076, + "city": "Bruceville", + "state": "IN", + "county": "Knox" + }, + { + "zip_code": 47519, + "latitude": 38.697289, + "longitude": -87.091762, + "city": "Cannelburg", + "state": "IN", + "county": "Daviess" + }, + { + "zip_code": 47520, + "latitude": 37.949544, + "longitude": -86.715557, + "city": "Cannelton", + "state": "IN", + "county": "Perry" + }, + { + "zip_code": 47521, + "latitude": 38.406745, + "longitude": -86.742618, + "city": "Celestine", + "state": "IN", + "county": "Dubois" + }, + { + "zip_code": 47522, + "latitude": 38.894879, + "longitude": -86.900174, + "city": "Crane", + "state": "IN", + "county": "Martin" + }, + { + "zip_code": 47523, + "latitude": 38.149611, + "longitude": -86.946217, + "city": "Dale", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47524, + "latitude": 38.626138, + "longitude": -87.511863, + "city": "Decker", + "state": "IN", + "county": "Knox" + }, + { + "zip_code": 47525, + "latitude": 38.020017, + "longitude": -86.565129, + "city": "Derby", + "state": "IN", + "county": "Perry" + }, + { + "zip_code": 47527, + "latitude": 38.439461, + "longitude": -86.777335, + "city": "Dubois", + "state": "IN", + "county": "Dubois" + }, + { + "zip_code": 47528, + "latitude": 38.786795, + "longitude": -87.38271, + "city": "Edwardsport", + "state": "IN", + "county": "Knox" + }, + { + "zip_code": 47529, + "latitude": 38.877167, + "longitude": -87.085001, + "city": "Elnora", + "state": "IN", + "county": "Daviess" + }, + { + "zip_code": 47531, + "latitude": 38.045062, + "longitude": -86.864745, + "city": "Evanston", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47532, + "latitude": 38.251171, + "longitude": -86.867492, + "city": "Ferdinand", + "state": "IN", + "county": "Dubois" + }, + { + "zip_code": 47535, + "latitude": 38.862735, + "longitude": -87.312678, + "city": "Freelandville", + "state": "IN", + "county": "Knox" + }, + { + "zip_code": 47536, + "latitude": 37.993813, + "longitude": -87.016971, + "city": "Fulda", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47537, + "latitude": 38.080052, + "longitude": -87.049834, + "city": "Gentryville", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47541, + "latitude": 38.249617, + "longitude": -87.007734, + "city": "Holland", + "state": "IN", + "county": "Dubois" + }, + { + "zip_code": 47542, + "latitude": 38.298972, + "longitude": -86.952413, + "city": "Huntingburg", + "state": "IN", + "county": "Dubois" + }, + { + "zip_code": 47545, + "latitude": 38.413687, + "longitude": -87.000879, + "city": "Ireland", + "state": "IN", + "county": "Dubois" + }, + { + "zip_code": 47546, + "latitude": 38.360357, + "longitude": -86.929481, + "city": "Jasper", + "state": "IN", + "county": "Dubois" + }, + { + "zip_code": 47547, + "latitude": 38.364749, + "longitude": -86.876173, + "city": "Jasper", + "state": "IN", + "county": "Dubois" + }, + { + "zip_code": 47549, + "latitude": 38.364749, + "longitude": -86.876173, + "city": "Jasper", + "state": "IN", + "county": "Dubois" + }, + { + "zip_code": 47550, + "latitude": 38.042888, + "longitude": -86.94971, + "city": "Lamar", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47551, + "latitude": 38.127658, + "longitude": -86.570969, + "city": "Leopold", + "state": "IN", + "county": "Perry" + }, + { + "zip_code": 47552, + "latitude": 38.124192, + "longitude": -86.995988, + "city": "Lincoln City", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47553, + "latitude": 38.771691, + "longitude": -86.912985, + "city": "Loogootee", + "state": "IN", + "county": "Martin" + }, + { + "zip_code": 47556, + "latitude": 38.16644, + "longitude": -86.917205, + "city": "Mariah Hill", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47557, + "latitude": 38.590433, + "longitude": -87.368456, + "city": "Monroe City", + "state": "IN", + "county": "Knox" + }, + { + "zip_code": 47558, + "latitude": 38.697289, + "longitude": -87.091762, + "city": "Montgomery", + "state": "IN", + "county": "Daviess" + }, + { + "zip_code": 47561, + "latitude": 38.709818, + "longitude": -87.388134, + "city": "Oaktown", + "state": "IN", + "county": "Knox" + }, + { + "zip_code": 47562, + "latitude": 38.841866, + "longitude": -86.986145, + "city": "Odon", + "state": "IN", + "county": "Daviess" + }, + { + "zip_code": 47564, + "latitude": 38.477976, + "longitude": -87.128545, + "city": "Otwell", + "state": "IN", + "county": "Pike" + }, + { + "zip_code": 47567, + "latitude": 38.459787, + "longitude": -87.298174, + "city": "Petersburg", + "state": "IN", + "county": "Pike" + }, + { + "zip_code": 47568, + "latitude": 38.697289, + "longitude": -87.091762, + "city": "Plainville", + "state": "IN", + "county": "Daviess" + }, + { + "zip_code": 47573, + "latitude": 38.744136, + "longitude": -87.321357, + "city": "Ragsdale", + "state": "IN", + "county": "Knox" + }, + { + "zip_code": 47574, + "latitude": 37.937193, + "longitude": -86.534002, + "city": "Rome", + "state": "IN", + "county": "Perry" + }, + { + "zip_code": 47575, + "latitude": 38.321125, + "longitude": -86.823444, + "city": "Saint Anthony", + "state": "IN", + "county": "Dubois" + }, + { + "zip_code": 47576, + "latitude": 38.152479, + "longitude": -86.64902, + "city": "Saint Croix", + "state": "IN", + "county": "Perry" + }, + { + "zip_code": 47577, + "latitude": 38.141725, + "longitude": -86.821891, + "city": "Saint Meinrad", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47578, + "latitude": 38.881471, + "longitude": -87.19594, + "city": "Sandborn", + "state": "IN", + "county": "Knox" + }, + { + "zip_code": 47579, + "latitude": 38.117579, + "longitude": -86.928645, + "city": "Santa Claus", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47580, + "latitude": 38.352759, + "longitude": -86.912488, + "city": "Schnellville", + "state": "IN", + "county": "Dubois" + }, + { + "zip_code": 47581, + "latitude": 38.669976, + "longitude": -86.788412, + "city": "Shoals", + "state": "IN", + "county": "Martin" + }, + { + "zip_code": 47584, + "latitude": 38.26376, + "longitude": -87.230482, + "city": "Spurgeon", + "state": "IN", + "county": "Pike" + }, + { + "zip_code": 47585, + "latitude": 38.271004, + "longitude": -87.147783, + "city": "Stendal", + "state": "IN", + "county": "Pike" + }, + { + "zip_code": 47586, + "latitude": 37.999711, + "longitude": -86.731971, + "city": "Tell City", + "state": "IN", + "county": "Perry" + }, + { + "zip_code": 47588, + "latitude": 38.033118, + "longitude": -86.798123, + "city": "Troy", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47590, + "latitude": 38.367402, + "longitude": -87.109044, + "city": "Velpen", + "state": "IN", + "county": "Pike" + }, + { + "zip_code": 47591, + "latitude": 38.707231, + "longitude": -87.417306, + "city": "Vincennes", + "state": "IN", + "county": "Knox" + }, + { + "zip_code": 47596, + "latitude": 38.791556, + "longitude": -87.3318, + "city": "Westphalia", + "state": "IN", + "county": "Knox" + }, + { + "zip_code": 47597, + "latitude": 38.656969, + "longitude": -87.329395, + "city": "Wheatland", + "state": "IN", + "county": "Knox" + }, + { + "zip_code": 47598, + "latitude": 38.372926, + "longitude": -87.211093, + "city": "Winslow", + "state": "IN", + "county": "Pike" + }, + { + "zip_code": 47601, + "latitude": 38.04247, + "longitude": -87.287145, + "city": "Boonville", + "state": "IN", + "county": "Warrick" + }, + { + "zip_code": 47610, + "latitude": 38.054569, + "longitude": -87.267847, + "city": "Chandler", + "state": "IN", + "county": "Warrick" + }, + { + "zip_code": 47611, + "latitude": 38.031396, + "longitude": -86.970053, + "city": "Chrisney", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47612, + "latitude": 38.175698, + "longitude": -87.711423, + "city": "Cynthiana", + "state": "IN", + "county": "Posey" + }, + { + "zip_code": 47613, + "latitude": 38.128931, + "longitude": -87.416104, + "city": "Elberfeld", + "state": "IN", + "county": "Warrick" + }, + { + "zip_code": 47614, + "latitude": 38.130034, + "longitude": -87.163636, + "city": "Folsomville", + "state": "IN", + "county": "Warrick" + }, + { + "zip_code": 47615, + "latitude": 38.003542, + "longitude": -86.996351, + "city": "Grandview", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47616, + "latitude": 38.190994, + "longitude": -87.91701, + "city": "Griffin", + "state": "IN", + "county": "Posey" + }, + { + "zip_code": 47617, + "latitude": 37.903557, + "longitude": -87.249886, + "city": "Hatfield", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47618, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Inglefield", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47619, + "latitude": 38.162899, + "longitude": -87.283955, + "city": "Lynnville", + "state": "IN", + "county": "Warrick" + }, + { + "zip_code": 47620, + "latitude": 37.961781, + "longitude": -87.868228, + "city": "Mount Vernon", + "state": "IN", + "county": "Posey" + }, + { + "zip_code": 47629, + "latitude": 38.06242, + "longitude": -87.245214, + "city": "Newburgh", + "state": "IN", + "county": "Warrick" + }, + { + "zip_code": 47630, + "latitude": 38.038331, + "longitude": -87.283581, + "city": "Newburgh", + "state": "IN", + "county": "Warrick" + }, + { + "zip_code": 47631, + "latitude": 38.101827, + "longitude": -87.898765, + "city": "New Harmony", + "state": "IN", + "county": "Posey" + }, + { + "zip_code": 47633, + "latitude": 38.148016, + "longitude": -87.786303, + "city": "Poseyville", + "state": "IN", + "county": "Posey" + }, + { + "zip_code": 47634, + "latitude": 37.975392, + "longitude": -87.136282, + "city": "Richland", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47635, + "latitude": 37.929173, + "longitude": -87.033681, + "city": "Rockport", + "state": "IN", + "county": "Spencer" + }, + { + "zip_code": 47637, + "latitude": 38.118439, + "longitude": -87.244937, + "city": "Tennyson", + "state": "IN", + "county": "Warrick" + }, + { + "zip_code": 47638, + "latitude": 38.069277, + "longitude": -87.783602, + "city": "Wadesville", + "state": "IN", + "county": "Posey" + }, + { + "zip_code": 47639, + "latitude": 38.202701, + "longitude": -87.577358, + "city": "Haubstadt", + "state": "IN", + "county": "Gibson" + }, + { + "zip_code": 47640, + "latitude": 38.384971, + "longitude": -87.473674, + "city": "Hazleton", + "state": "IN", + "county": "Gibson" + }, + { + "zip_code": 47647, + "latitude": 38.34949, + "longitude": -87.651777, + "city": "Buckskin", + "state": "IN", + "county": "Gibson" + }, + { + "zip_code": 47648, + "latitude": 38.30512, + "longitude": -87.518339, + "city": "Fort Branch", + "state": "IN", + "county": "Gibson" + }, + { + "zip_code": 47649, + "latitude": 38.331581, + "longitude": -87.447826, + "city": "Francisco", + "state": "IN", + "county": "Gibson" + }, + { + "zip_code": 47654, + "latitude": 38.34949, + "longitude": -87.651777, + "city": "Mackey", + "state": "IN", + "county": "Gibson" + }, + { + "zip_code": 47660, + "latitude": 38.306265, + "longitude": -87.514796, + "city": "Oakland City", + "state": "IN", + "county": "Gibson" + }, + { + "zip_code": 47665, + "latitude": 38.272833, + "longitude": -87.681174, + "city": "Owensville", + "state": "IN", + "county": "Gibson" + }, + { + "zip_code": 47666, + "latitude": 38.401233, + "longitude": -87.583761, + "city": "Patoka", + "state": "IN", + "county": "Gibson" + }, + { + "zip_code": 47670, + "latitude": 38.303369, + "longitude": -87.534003, + "city": "Princeton", + "state": "IN", + "county": "Gibson" + }, + { + "zip_code": 47683, + "latitude": 38.281095, + "longitude": -87.37734, + "city": "Somerville", + "state": "IN", + "county": "Gibson" + }, + { + "zip_code": 47701, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47702, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47703, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47704, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47705, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47706, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47708, + "latitude": 37.976692, + "longitude": -87.564842, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47710, + "latitude": 38.029714, + "longitude": -87.569024, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47711, + "latitude": 38.061732, + "longitude": -87.554802, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47712, + "latitude": 37.984112, + "longitude": -87.580057, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47713, + "latitude": 37.95219, + "longitude": -87.547564, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47714, + "latitude": 37.959092, + "longitude": -87.519682, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47715, + "latitude": 37.984202, + "longitude": -87.489212, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47716, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47719, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47720, + "latitude": 38.059937, + "longitude": -87.637962, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47721, + "latitude": 37.978035, + "longitude": -87.600791, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47722, + "latitude": 37.970192, + "longitude": -87.542014, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47724, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47725, + "latitude": 38.045237, + "longitude": -87.547704, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47727, + "latitude": 38.031942, + "longitude": -87.538915, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47728, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47730, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47731, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47732, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47733, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47734, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47735, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47736, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47737, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47739, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47740, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47741, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47744, + "latitude": 37.977492, + "longitude": -87.597316, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47747, + "latitude": 37.997128, + "longitude": -87.574963, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47750, + "latitude": 37.962292, + "longitude": -87.505512, + "city": "Evansville", + "state": "IN", + "county": "Vanderburgh" + }, + { + "zip_code": 47801, + "latitude": 39.433602, + "longitude": -87.410094, + "city": "Terre Haute", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47802, + "latitude": 39.357875, + "longitude": -87.42014, + "city": "Terre Haute", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47803, + "latitude": 39.468961, + "longitude": -87.315069, + "city": "Terre Haute", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47804, + "latitude": 39.505836, + "longitude": -87.342968, + "city": "Terre Haute", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47805, + "latitude": 39.532737, + "longitude": -87.325458, + "city": "Terre Haute", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47807, + "latitude": 39.467536, + "longitude": -87.392019, + "city": "Terre Haute", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47808, + "latitude": 39.433602, + "longitude": -87.410094, + "city": "Terre Haute", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47809, + "latitude": 39.470986, + "longitude": -87.41107, + "city": "Terre Haute", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47811, + "latitude": 39.433602, + "longitude": -87.410094, + "city": "Terre Haute", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47812, + "latitude": 39.433602, + "longitude": -87.410094, + "city": "Terre Haute", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47813, + "latitude": 39.433602, + "longitude": -87.410094, + "city": "Terre Haute", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47814, + "latitude": 39.433602, + "longitude": -87.410094, + "city": "Terre Haute", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47830, + "latitude": 39.779078, + "longitude": -87.221819, + "city": "Bellmore", + "state": "IN", + "county": "Parke" + }, + { + "zip_code": 47831, + "latitude": 39.877847, + "longitude": -87.443566, + "city": "Blanford", + "state": "IN", + "county": "Vermillion" + }, + { + "zip_code": 47832, + "latitude": 39.779078, + "longitude": -87.221819, + "city": "Bloomingdale", + "state": "IN", + "county": "Parke" + }, + { + "zip_code": 47833, + "latitude": 39.415414, + "longitude": -87.065524, + "city": "Bowling Green", + "state": "IN", + "county": "Clay" + }, + { + "zip_code": 47834, + "latitude": 39.387611, + "longitude": -87.126509, + "city": "Brazil", + "state": "IN", + "county": "Clay" + }, + { + "zip_code": 47836, + "latitude": 39.779078, + "longitude": -87.221819, + "city": "Bridgeton", + "state": "IN", + "county": "Parke" + }, + { + "zip_code": 47837, + "latitude": 39.591282, + "longitude": -87.113196, + "city": "Carbon", + "state": "IN", + "county": "Clay" + }, + { + "zip_code": 47838, + "latitude": 38.966806, + "longitude": -87.384354, + "city": "Carlisle", + "state": "IN", + "county": "Sullivan" + }, + { + "zip_code": 47840, + "latitude": 39.408241, + "longitude": -87.053309, + "city": "Centerpoint", + "state": "IN", + "county": "Clay" + }, + { + "zip_code": 47841, + "latitude": 39.301664, + "longitude": -87.136902, + "city": "Clay City", + "state": "IN", + "county": "Clay" + }, + { + "zip_code": 47842, + "latitude": 39.746685, + "longitude": -87.458654, + "city": "Clinton", + "state": "IN", + "county": "Vermillion" + }, + { + "zip_code": 47845, + "latitude": 39.387544, + "longitude": -87.090363, + "city": "Coalmont", + "state": "IN", + "county": "Clay" + }, + { + "zip_code": 47846, + "latitude": 39.368643, + "longitude": -87.175317, + "city": "Cory", + "state": "IN", + "county": "Clay" + }, + { + "zip_code": 47847, + "latitude": 39.838952, + "longitude": -87.471163, + "city": "Dana", + "state": "IN", + "county": "Vermillion" + }, + { + "zip_code": 47848, + "latitude": 39.039488, + "longitude": -87.30662, + "city": "Dugger", + "state": "IN", + "county": "Sullivan" + }, + { + "zip_code": 47849, + "latitude": 39.190101, + "longitude": -87.547036, + "city": "Fairbanks", + "state": "IN", + "county": "Sullivan" + }, + { + "zip_code": 47850, + "latitude": 39.222063, + "longitude": -87.425279, + "city": "Farmersburg", + "state": "IN", + "county": "Sullivan" + }, + { + "zip_code": 47851, + "latitude": 39.573663, + "longitude": -87.24536, + "city": "Fontanet", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47852, + "latitude": 39.080474, + "longitude": -87.449558, + "city": "Graysville", + "state": "IN", + "county": "Sullivan" + }, + { + "zip_code": 47853, + "latitude": 39.537199, + "longitude": -87.072888, + "city": "Harmony", + "state": "IN", + "county": "Clay" + }, + { + "zip_code": 47854, + "latitude": 39.808476, + "longitude": -87.424521, + "city": "Hillsdale", + "state": "IN", + "county": "Vermillion" + }, + { + "zip_code": 47855, + "latitude": 39.183335, + "longitude": -87.299448, + "city": "Hymera", + "state": "IN", + "county": "Sullivan" + }, + { + "zip_code": 47856, + "latitude": 39.779078, + "longitude": -87.221819, + "city": "Judson", + "state": "IN", + "county": "Parke" + }, + { + "zip_code": 47857, + "latitude": 39.526913, + "longitude": -87.086882, + "city": "Knightsville", + "state": "IN", + "county": "Clay" + }, + { + "zip_code": 47858, + "latitude": 39.302796, + "longitude": -87.277737, + "city": "Lewis", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47859, + "latitude": 39.779078, + "longitude": -87.221819, + "city": "Marshall", + "state": "IN", + "county": "Parke" + }, + { + "zip_code": 47860, + "latitude": 39.779078, + "longitude": -87.221819, + "city": "Mecca", + "state": "IN", + "county": "Parke" + }, + { + "zip_code": 47861, + "latitude": 39.057641, + "longitude": -87.566595, + "city": "Merom", + "state": "IN", + "county": "Sullivan" + }, + { + "zip_code": 47862, + "latitude": 39.791725, + "longitude": -87.369135, + "city": "Montezuma", + "state": "IN", + "county": "Parke" + }, + { + "zip_code": 47863, + "latitude": 39.580285, + "longitude": -87.46157, + "city": "New Goshen", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47864, + "latitude": 39.041245, + "longitude": -87.475747, + "city": "New Lebanon", + "state": "IN", + "county": "Sullivan" + }, + { + "zip_code": 47865, + "latitude": 39.01849, + "longitude": -87.389047, + "city": "Paxton", + "state": "IN", + "county": "Sullivan" + }, + { + "zip_code": 47866, + "latitude": 39.292886, + "longitude": -87.33555, + "city": "Pimento", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47868, + "latitude": 39.444565, + "longitude": -86.960667, + "city": "Poland", + "state": "IN", + "county": "Clay" + }, + { + "zip_code": 47869, + "latitude": 39.433602, + "longitude": -87.410094, + "city": "Prairie Creek", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47870, + "latitude": 39.371187, + "longitude": -87.475871, + "city": "Prairieton", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47871, + "latitude": 39.388638, + "longitude": -87.301367, + "city": "Riley", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47872, + "latitude": 39.712361, + "longitude": -87.222646, + "city": "Rockville", + "state": "IN", + "county": "Parke" + }, + { + "zip_code": 47874, + "latitude": 39.622405, + "longitude": -87.320767, + "city": "Rosedale", + "state": "IN", + "county": "Parke" + }, + { + "zip_code": 47875, + "latitude": 39.877847, + "longitude": -87.443566, + "city": "Saint Bernice", + "state": "IN", + "county": "Vermillion" + }, + { + "zip_code": 47876, + "latitude": 39.433602, + "longitude": -87.410094, + "city": "Saint Mary Of The Woods", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47878, + "latitude": 39.492838, + "longitude": -87.266549, + "city": "Seelyville", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47879, + "latitude": 39.10494, + "longitude": -87.382988, + "city": "Shelburn", + "state": "IN", + "county": "Sullivan" + }, + { + "zip_code": 47880, + "latitude": 39.600636, + "longitude": -87.419569, + "city": "Shepardsville", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47881, + "latitude": 39.491743, + "longitude": -87.186673, + "city": "Staunton", + "state": "IN", + "county": "Clay" + }, + { + "zip_code": 47882, + "latitude": 39.084199, + "longitude": -87.419003, + "city": "Sullivan", + "state": "IN", + "county": "Sullivan" + }, + { + "zip_code": 47884, + "latitude": 39.622129, + "longitude": -87.454769, + "city": "Universal", + "state": "IN", + "county": "Vermillion" + }, + { + "zip_code": 47885, + "latitude": 39.498419, + "longitude": -87.468825, + "city": "West Terre Haute", + "state": "IN", + "county": "Vigo" + }, + { + "zip_code": 47901, + "latitude": 40.39905, + "longitude": -86.830286, + "city": "Lafayette", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47902, + "latitude": 40.388656, + "longitude": -86.894908, + "city": "Lafayette", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47903, + "latitude": 40.304402, + "longitude": -86.824468, + "city": "Lafayette", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47904, + "latitude": 40.482287, + "longitude": -86.917273, + "city": "Lafayette", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47905, + "latitude": 40.392686, + "longitude": -86.884071, + "city": "Lafayette", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47906, + "latitude": 40.467303, + "longitude": -86.928132, + "city": "West Lafayette", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47907, + "latitude": 40.424923, + "longitude": -86.916215, + "city": "West Lafayette", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47909, + "latitude": 40.322769, + "longitude": -86.888066, + "city": "Lafayette", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47916, + "latitude": 39.962271, + "longitude": -87.050635, + "city": "Alamo", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47917, + "latitude": 40.527877, + "longitude": -87.499343, + "city": "Ambia", + "state": "IN", + "county": "Benton" + }, + { + "zip_code": 47918, + "latitude": 40.240204, + "longitude": -87.213921, + "city": "Attica", + "state": "IN", + "county": "Fountain" + }, + { + "zip_code": 47920, + "latitude": 40.533131, + "longitude": -86.822842, + "city": "Battle Ground", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47921, + "latitude": 40.577648, + "longitude": -87.311618, + "city": "Boswell", + "state": "IN", + "county": "Benton" + }, + { + "zip_code": 47922, + "latitude": 40.883043, + "longitude": -87.394076, + "city": "Brook", + "state": "IN", + "county": "Newton" + }, + { + "zip_code": 47923, + "latitude": 40.661019, + "longitude": -86.845433, + "city": "Brookston", + "state": "IN", + "county": "White" + }, + { + "zip_code": 47924, + "latitude": 40.487603, + "longitude": -86.763111, + "city": "Buck Creek", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47925, + "latitude": 40.750414, + "longitude": -86.789632, + "city": "Buffalo", + "state": "IN", + "county": "White" + }, + { + "zip_code": 47926, + "latitude": 40.813168, + "longitude": -86.619353, + "city": "Burnettsville", + "state": "IN", + "county": "White" + }, + { + "zip_code": 47928, + "latitude": 39.927176, + "longitude": -87.471616, + "city": "Cayuga", + "state": "IN", + "county": "Vermillion" + }, + { + "zip_code": 47929, + "latitude": 40.754782, + "longitude": -86.934599, + "city": "Chalmers", + "state": "IN", + "county": "White" + }, + { + "zip_code": 47930, + "latitude": 40.250791, + "longitude": -86.75244, + "city": "Clarks Hill", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47932, + "latitude": 40.096833, + "longitude": -87.352877, + "city": "Covington", + "state": "IN", + "county": "Fountain" + }, + { + "zip_code": 47933, + "latitude": 40.042425, + "longitude": -86.893538, + "city": "Crawfordsville", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47934, + "latitude": 40.040014, + "longitude": -86.893614, + "city": "Crawfordsville", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47935, + "latitude": 40.040014, + "longitude": -86.893614, + "city": "Crawfordsville", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47936, + "latitude": 40.040014, + "longitude": -86.893614, + "city": "Crawfordsville", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47937, + "latitude": 40.040014, + "longitude": -86.893614, + "city": "Crawfordsville", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47938, + "latitude": 40.040014, + "longitude": -86.893614, + "city": "Crawfordsville", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47939, + "latitude": 40.040014, + "longitude": -86.893614, + "city": "Crawfordsville", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47940, + "latitude": 40.107625, + "longitude": -86.777653, + "city": "Darlington", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47941, + "latitude": 40.362781, + "longitude": -86.763031, + "city": "Dayton", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47942, + "latitude": 40.679382, + "longitude": -87.415972, + "city": "Earl Park", + "state": "IN", + "county": "Benton" + }, + { + "zip_code": 47943, + "latitude": 41.076883, + "longitude": -87.208786, + "city": "Fair Oaks", + "state": "IN", + "county": "Jasper" + }, + { + "zip_code": 47944, + "latitude": 40.606541, + "longitude": -87.311247, + "city": "Fowler", + "state": "IN", + "county": "Benton" + }, + { + "zip_code": 47946, + "latitude": 40.984442, + "longitude": -86.83465, + "city": "Francesville", + "state": "IN", + "county": "Pulaski" + }, + { + "zip_code": 47948, + "latitude": 40.794039, + "longitude": -87.324812, + "city": "Goodland", + "state": "IN", + "county": "Newton" + }, + { + "zip_code": 47949, + "latitude": 40.045073, + "longitude": -87.175046, + "city": "Hillsboro", + "state": "IN", + "county": "Fountain" + }, + { + "zip_code": 47950, + "latitude": 40.809887, + "longitude": -86.739391, + "city": "Idaville", + "state": "IN", + "county": "White" + }, + { + "zip_code": 47951, + "latitude": 40.794191, + "longitude": -87.439821, + "city": "Kentland", + "state": "IN", + "county": "Newton" + }, + { + "zip_code": 47952, + "latitude": 40.017364, + "longitude": -87.256877, + "city": "Kingman", + "state": "IN", + "county": "Fountain" + }, + { + "zip_code": 47954, + "latitude": 40.050732, + "longitude": -86.855491, + "city": "Ladoga", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47955, + "latitude": 40.191498, + "longitude": -86.901826, + "city": "Linden", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47957, + "latitude": 41.072624, + "longitude": -86.849745, + "city": "Medaryville", + "state": "IN", + "county": "Pulaski" + }, + { + "zip_code": 47958, + "latitude": 40.164139, + "longitude": -87.14754, + "city": "Mellott", + "state": "IN", + "county": "Fountain" + }, + { + "zip_code": 47959, + "latitude": 40.795391, + "longitude": -86.93711, + "city": "Monon", + "state": "IN", + "county": "White" + }, + { + "zip_code": 47960, + "latitude": 40.779211, + "longitude": -86.749521, + "city": "Monticello", + "state": "IN", + "county": "White" + }, + { + "zip_code": 47962, + "latitude": 40.473159, + "longitude": -87.027571, + "city": "Montmorenci", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47963, + "latitude": 40.95469, + "longitude": -87.411025, + "city": "Morocco", + "state": "IN", + "county": "Newton" + }, + { + "zip_code": 47964, + "latitude": 40.977567, + "longitude": -87.396982, + "city": "Mount Ayr", + "state": "IN", + "county": "Newton" + }, + { + "zip_code": 47965, + "latitude": 39.952351, + "longitude": -86.920609, + "city": "New Market", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47966, + "latitude": 39.87356, + "longitude": -87.406937, + "city": "Newport", + "state": "IN", + "county": "Vermillion" + }, + { + "zip_code": 47967, + "latitude": 40.193583, + "longitude": -86.976237, + "city": "New Richmond", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47968, + "latitude": 40.026229, + "longitude": -86.827059, + "city": "New Ross", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47969, + "latitude": 40.203459, + "longitude": -87.147014, + "city": "Newtown", + "state": "IN", + "county": "Fountain" + }, + { + "zip_code": 47970, + "latitude": 40.598666, + "longitude": -87.13607, + "city": "Otterbein", + "state": "IN", + "county": "Benton" + }, + { + "zip_code": 47971, + "latitude": 40.533538, + "longitude": -87.259375, + "city": "Oxford", + "state": "IN", + "county": "Benton" + }, + { + "zip_code": 47974, + "latitude": 40.023673, + "longitude": -87.475513, + "city": "Perrysville", + "state": "IN", + "county": "Vermillion" + }, + { + "zip_code": 47975, + "latitude": 40.439726, + "longitude": -87.255833, + "city": "Pine Village", + "state": "IN", + "county": "Warren" + }, + { + "zip_code": 47977, + "latitude": 40.903837, + "longitude": -87.140991, + "city": "Remington", + "state": "IN", + "county": "Jasper" + }, + { + "zip_code": 47978, + "latitude": 40.994793, + "longitude": -87.10368, + "city": "Rensselaer", + "state": "IN", + "county": "Jasper" + }, + { + "zip_code": 47980, + "latitude": 40.782613, + "longitude": -86.919278, + "city": "Reynolds", + "state": "IN", + "county": "White" + }, + { + "zip_code": 47981, + "latitude": 40.258026, + "longitude": -86.920786, + "city": "Romney", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47982, + "latitude": 40.19674, + "longitude": -87.526532, + "city": "State Line", + "state": "IN", + "county": "Warren" + }, + { + "zip_code": 47983, + "latitude": 40.284511, + "longitude": -86.772436, + "city": "Stockwell", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47984, + "latitude": 40.606301, + "longitude": -87.310042, + "city": "Talbot", + "state": "IN", + "county": "Benton" + }, + { + "zip_code": 47986, + "latitude": 40.505497, + "longitude": -87.20696, + "city": "Templeton", + "state": "IN", + "county": "Benton" + }, + { + "zip_code": 47987, + "latitude": 40.110318, + "longitude": -87.228444, + "city": "Veedersburg", + "state": "IN", + "county": "Fountain" + }, + { + "zip_code": 47988, + "latitude": 39.986538, + "longitude": -87.147674, + "city": "Wallace", + "state": "IN", + "county": "Fountain" + }, + { + "zip_code": 47989, + "latitude": 39.913473, + "longitude": -86.980365, + "city": "Waveland", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47990, + "latitude": 40.055655, + "longitude": -87.035366, + "city": "Waynetown", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47991, + "latitude": 40.265862, + "longitude": -87.438432, + "city": "West Lebanon", + "state": "IN", + "county": "Warren" + }, + { + "zip_code": 47992, + "latitude": 40.318084, + "longitude": -87.046004, + "city": "Westpoint", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47993, + "latitude": 40.314172, + "longitude": -87.403882, + "city": "Williamsport", + "state": "IN", + "county": "Warren" + }, + { + "zip_code": 47994, + "latitude": 40.118361, + "longitude": -86.964894, + "city": "Wingate", + "state": "IN", + "county": "Montgomery" + }, + { + "zip_code": 47995, + "latitude": 40.726466, + "longitude": -86.989485, + "city": "Wolcott", + "state": "IN", + "county": "White" + }, + { + "zip_code": 47996, + "latitude": 40.388656, + "longitude": -86.894908, + "city": "West Lafayette", + "state": "IN", + "county": "Tippecanoe" + }, + { + "zip_code": 47997, + "latitude": 40.670628, + "longitude": -86.722352, + "city": "Yeoman", + "state": "IN", + "county": "Carroll" + }, + { + "zip_code": 48001, + "latitude": 42.614984, + "longitude": -82.597768, + "city": "Algonac", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48002, + "latitude": 42.938828, + "longitude": -82.919818, + "city": "Allenton", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48003, + "latitude": 42.934027, + "longitude": -83.052481, + "city": "Almont", + "state": "MI", + "county": "Lapeer" + }, + { + "zip_code": 48004, + "latitude": 42.824095, + "longitude": -82.66522, + "city": "Anchorville", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48005, + "latitude": 42.850051, + "longitude": -82.894993, + "city": "Armada", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48006, + "latitude": 43.075152, + "longitude": -82.695467, + "city": "Avoca", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48007, + "latitude": 42.606088, + "longitude": -83.297593, + "city": "Troy", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48009, + "latitude": 42.534834, + "longitude": -83.22416, + "city": "Birmingham", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48012, + "latitude": 42.604425, + "longitude": -83.292382, + "city": "Birmingham", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48014, + "latitude": 43.026326, + "longitude": -82.929772, + "city": "Capac", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48015, + "latitude": 42.480186, + "longitude": -83.027221, + "city": "Center Line", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48017, + "latitude": 42.536785, + "longitude": -83.146427, + "city": "Clawson", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48021, + "latitude": 42.464986, + "longitude": -82.944318, + "city": "Eastpointe", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48022, + "latitude": 43.03545, + "longitude": -82.800896, + "city": "Emmett", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48023, + "latitude": 42.702264, + "longitude": -82.668829, + "city": "Fair Haven", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48025, + "latitude": 42.520184, + "longitude": -83.264031, + "city": "Franklin", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48026, + "latitude": 42.538702, + "longitude": -82.949421, + "city": "Fraser", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48027, + "latitude": 42.944333, + "longitude": -82.691559, + "city": "Goodells", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48028, + "latitude": 42.597245, + "longitude": -82.596757, + "city": "Harsens Island", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48030, + "latitude": 42.496485, + "longitude": -83.098474, + "city": "Hazel Park", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48032, + "latitude": 43.12226, + "longitude": -82.599804, + "city": "Jeddo", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48034, + "latitude": 42.478495, + "longitude": -83.279164, + "city": "Southfield", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48035, + "latitude": 42.551185, + "longitude": -82.91672, + "city": "Clinton Township", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48036, + "latitude": 42.593834, + "longitude": -82.913321, + "city": "Clinton Township", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48037, + "latitude": 42.567543, + "longitude": -83.149978, + "city": "Southfield", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48038, + "latitude": 42.620607, + "longitude": -82.960775, + "city": "Clinton Township", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48039, + "latitude": 42.68586, + "longitude": -82.549857, + "city": "Marine City", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48040, + "latitude": 42.78269, + "longitude": -82.491538, + "city": "Marysville", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48041, + "latitude": 42.941032, + "longitude": -82.804636, + "city": "Memphis", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48042, + "latitude": 42.673476, + "longitude": -82.916262, + "city": "Macomb", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48043, + "latitude": 42.597984, + "longitude": -82.877669, + "city": "Mount Clemens", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48044, + "latitude": 42.644211, + "longitude": -82.898513, + "city": "Macomb", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48045, + "latitude": 42.587734, + "longitude": -82.821517, + "city": "Harrison Township", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48046, + "latitude": 42.672322, + "longitude": -82.903065, + "city": "Mount Clemens", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48047, + "latitude": 42.601469, + "longitude": -82.821874, + "city": "New Baltimore", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48048, + "latitude": 42.744267, + "longitude": -82.804166, + "city": "New Haven", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48049, + "latitude": 43.034915, + "longitude": -82.574831, + "city": "North Street", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48050, + "latitude": 42.785908, + "longitude": -82.797858, + "city": "New Haven", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48051, + "latitude": 42.67518, + "longitude": -82.809082, + "city": "New Baltimore", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48054, + "latitude": 42.776889, + "longitude": -82.543697, + "city": "East China", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48059, + "latitude": 43.088821, + "longitude": -82.490486, + "city": "Fort Gratiot", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48060, + "latitude": 42.984014, + "longitude": -82.467461, + "city": "Port Huron", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48061, + "latitude": 42.824095, + "longitude": -82.66522, + "city": "Port Huron", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48062, + "latitude": 42.838913, + "longitude": -82.799617, + "city": "Richmond", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48063, + "latitude": 42.889238, + "longitude": -82.667478, + "city": "Columbus", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48064, + "latitude": 42.767364, + "longitude": -82.672786, + "city": "Casco", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48065, + "latitude": 42.839951, + "longitude": -83.038836, + "city": "Romeo", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48066, + "latitude": 42.509635, + "longitude": -82.936069, + "city": "Roseville", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48067, + "latitude": 42.492485, + "longitude": -83.145375, + "city": "Royal Oak", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48068, + "latitude": 42.660091, + "longitude": -83.3863, + "city": "Royal Oak", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48069, + "latitude": 42.471385, + "longitude": -83.144026, + "city": "Pleasant Ridge", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48070, + "latitude": 42.481786, + "longitude": -83.166376, + "city": "Huntington Woods", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48071, + "latitude": 42.505292, + "longitude": -83.136126, + "city": "Madison Heights", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48072, + "latitude": 42.499235, + "longitude": -83.181077, + "city": "Berkley", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48073, + "latitude": 42.5216, + "longitude": -83.163477, + "city": "Royal Oak", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48074, + "latitude": 42.905056, + "longitude": -82.567942, + "city": "Smiths Creek", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48075, + "latitude": 42.462215, + "longitude": -83.230578, + "city": "Southfield", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48076, + "latitude": 42.498117, + "longitude": -83.205798, + "city": "Southfield", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48079, + "latitude": 42.876235, + "longitude": -82.547672, + "city": "Saint Clair", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48080, + "latitude": 42.470639, + "longitude": -82.902194, + "city": "Saint Clair Shores", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48081, + "latitude": 42.494085, + "longitude": -82.898986, + "city": "Saint Clair Shores", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48082, + "latitude": 42.526935, + "longitude": -82.884117, + "city": "Saint Clair Shores", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48083, + "latitude": 42.555985, + "longitude": -83.119206, + "city": "Troy", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48084, + "latitude": 42.554751, + "longitude": -83.17688, + "city": "Troy", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48085, + "latitude": "", + "longitude": "", + "city": "Troy", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48086, + "latitude": 42.660091, + "longitude": -83.3863, + "city": "Southfield", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48088, + "latitude": "", + "longitude": "", + "city": "Warren", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48089, + "latitude": 42.474786, + "longitude": -82.995121, + "city": "Warren", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48090, + "latitude": 42.672322, + "longitude": -82.903065, + "city": "Warren", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48091, + "latitude": 42.470938, + "longitude": -83.054623, + "city": "Warren", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48092, + "latitude": 42.513435, + "longitude": -83.056988, + "city": "Warren", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48093, + "latitude": 42.514886, + "longitude": -83.006613, + "city": "Warren", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48094, + "latitude": 42.755979, + "longitude": -83.037598, + "city": "Washington", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48095, + "latitude": 42.768153, + "longitude": -83.039474, + "city": "Washington", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48096, + "latitude": 42.754039, + "longitude": -82.916348, + "city": "Ray", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48097, + "latitude": 42.879217, + "longitude": -82.739491, + "city": "Yale", + "state": "MI", + "county": "Saint Clair" + }, + { + "zip_code": 48098, + "latitude": 42.599883, + "longitude": -83.14908, + "city": "Troy", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48099, + "latitude": 42.587643, + "longitude": -83.173666, + "city": "Troy", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48101, + "latitude": 42.27633, + "longitude": -83.194425, + "city": "Allen Park", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48103, + "latitude": 42.266638, + "longitude": -83.849042, + "city": "Ann Arbor", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48104, + "latitude": 42.270903, + "longitude": -83.727826, + "city": "Ann Arbor", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48105, + "latitude": 42.323077, + "longitude": -83.713891, + "city": "Ann Arbor", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48106, + "latitude": 42.253502, + "longitude": -83.836571, + "city": "Ann Arbor", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48107, + "latitude": 42.253502, + "longitude": -83.836571, + "city": "Ann Arbor", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48108, + "latitude": 42.223305, + "longitude": -83.729342, + "city": "Ann Arbor", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48109, + "latitude": 42.276324, + "longitude": -83.711228, + "city": "Ann Arbor", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48110, + "latitude": 42.008164, + "longitude": -83.664277, + "city": "Azalia", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48111, + "latitude": 42.263968, + "longitude": -83.416284, + "city": "Belleville", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48112, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Belleville", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48113, + "latitude": 42.253502, + "longitude": -83.836571, + "city": "Ann Arbor", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48114, + "latitude": 42.546402, + "longitude": -83.877776, + "city": "Brighton", + "state": "MI", + "county": "Livingston" + }, + { + "zip_code": 48115, + "latitude": 42.160216, + "longitude": -83.911693, + "city": "Bridgewater", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48116, + "latitude": 42.529541, + "longitude": -83.776055, + "city": "Brighton", + "state": "MI", + "county": "Livingston" + }, + { + "zip_code": 48117, + "latitude": 42.0413, + "longitude": -83.428904, + "city": "Carleton", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48118, + "latitude": 42.31375, + "longitude": -84.013999, + "city": "Chelsea", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48120, + "latitude": 42.310037, + "longitude": -83.177625, + "city": "Dearborn", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48121, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Dearborn", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48122, + "latitude": 42.353686, + "longitude": -83.223427, + "city": "Melvindale", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48123, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Dearborn", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48124, + "latitude": 42.299302, + "longitude": -83.242577, + "city": "Dearborn", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48125, + "latitude": 42.342272, + "longitude": -83.298123, + "city": "Dearborn Heights", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48126, + "latitude": 42.271811, + "longitude": -83.225877, + "city": "Dearborn", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48127, + "latitude": 42.334386, + "longitude": -83.273929, + "city": "Dearborn Heights", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48128, + "latitude": 42.31927, + "longitude": -83.251428, + "city": "Dearborn", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48130, + "latitude": 42.353887, + "longitude": -83.898295, + "city": "Dexter", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48131, + "latitude": 41.964903, + "longitude": -83.668808, + "city": "Dundee", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48133, + "latitude": 41.790287, + "longitude": -83.504033, + "city": "Erie", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48134, + "latitude": 42.116811, + "longitude": -83.300439, + "city": "Flat Rock", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48135, + "latitude": 42.326437, + "longitude": -83.343431, + "city": "Garden City", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48136, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Garden City", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48137, + "latitude": 42.496024, + "longitude": -84.084724, + "city": "Gregory", + "state": "MI", + "county": "Livingston" + }, + { + "zip_code": 48138, + "latitude": 42.135191, + "longitude": -83.156124, + "city": "Grosse Ile", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48139, + "latitude": 42.452284, + "longitude": -83.814654, + "city": "Hamburg", + "state": "MI", + "county": "Livingston" + }, + { + "zip_code": 48140, + "latitude": 41.887078, + "longitude": -83.58177, + "city": "Ida", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48141, + "latitude": 42.293338, + "longitude": -83.314674, + "city": "Inkster", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48143, + "latitude": 42.457317, + "longitude": -83.836643, + "city": "Lakeland", + "state": "MI", + "county": "Livingston" + }, + { + "zip_code": 48144, + "latitude": 41.759998, + "longitude": -83.618485, + "city": "Lambertville", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48145, + "latitude": 41.845509, + "longitude": -83.462383, + "city": "La Salle", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48146, + "latitude": 42.242038, + "longitude": -83.180375, + "city": "Lincoln Park", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48150, + "latitude": 42.369351, + "longitude": -83.371753, + "city": "Livonia", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48151, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Livonia", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48152, + "latitude": 42.426235, + "longitude": -83.370682, + "city": "Livonia", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48153, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Livonia", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48154, + "latitude": 42.375986, + "longitude": -83.389962, + "city": "Livonia", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48157, + "latitude": 41.813365, + "longitude": -83.436032, + "city": "Luna Pier", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48158, + "latitude": 42.18314, + "longitude": -84.013795, + "city": "Manchester", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48159, + "latitude": 42.041832, + "longitude": -83.557254, + "city": "Maybee", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48160, + "latitude": 42.001525, + "longitude": -83.659763, + "city": "Milan", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48161, + "latitude": 41.928024, + "longitude": -83.430682, + "city": "Monroe", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48162, + "latitude": 41.929341, + "longitude": -83.444773, + "city": "Monroe", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48164, + "latitude": 42.135225, + "longitude": -83.390422, + "city": "New Boston", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48165, + "latitude": 42.498145, + "longitude": -83.608727, + "city": "New Hudson", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48166, + "latitude": 41.921912, + "longitude": -83.330583, + "city": "Newport", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48167, + "latitude": 42.41729, + "longitude": -83.432434, + "city": "Northville", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48169, + "latitude": 42.467503, + "longitude": -83.946982, + "city": "Pinckney", + "state": "MI", + "county": "Livingston" + }, + { + "zip_code": 48170, + "latitude": 42.366737, + "longitude": -83.489679, + "city": "Plymouth", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48173, + "latitude": 42.112182, + "longitude": -83.272588, + "city": "Rockwood", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48174, + "latitude": 42.20284, + "longitude": -83.351255, + "city": "Romulus", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48175, + "latitude": 42.405636, + "longitude": -83.578088, + "city": "Salem", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48176, + "latitude": 42.147636, + "longitude": -83.802375, + "city": "Saline", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48177, + "latitude": 41.807647, + "longitude": -83.579334, + "city": "Samaria", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48178, + "latitude": 42.474564, + "longitude": -83.612188, + "city": "South Lyon", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48179, + "latitude": 42.051135, + "longitude": -83.27095, + "city": "South Rockwood", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48180, + "latitude": 42.245837, + "longitude": -83.249067, + "city": "Taylor", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48182, + "latitude": 41.790497, + "longitude": -83.584998, + "city": "Temperance", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 48183, + "latitude": 42.138209, + "longitude": -83.217937, + "city": "Trenton", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48184, + "latitude": 42.263487, + "longitude": -83.395975, + "city": "Wayne", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48185, + "latitude": 42.31507, + "longitude": -83.373093, + "city": "Westland", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48186, + "latitude": 42.28902, + "longitude": -83.368582, + "city": "Westland", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48187, + "latitude": 42.374118, + "longitude": -83.418143, + "city": "Canton", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48188, + "latitude": 42.291734, + "longitude": -83.485776, + "city": "Canton", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48189, + "latitude": 42.386914, + "longitude": -83.783736, + "city": "Whitmore Lake", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48190, + "latitude": 42.124398, + "longitude": -83.594567, + "city": "Whittaker", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48191, + "latitude": 42.129589, + "longitude": -83.569965, + "city": "Willis", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48192, + "latitude": 42.19499, + "longitude": -83.206572, + "city": "Wyandotte", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48195, + "latitude": 42.257801, + "longitude": -83.285939, + "city": "Southgate", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48197, + "latitude": 42.202139, + "longitude": -83.620494, + "city": "Ypsilanti", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48198, + "latitude": 42.309687, + "longitude": -83.772991, + "city": "Ypsilanti", + "state": "MI", + "county": "Washtenaw" + }, + { + "zip_code": 48201, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48202, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48203, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Highland Park", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48204, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48205, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48206, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48207, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48208, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48209, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48210, + "latitude": 42.326937, + "longitude": -83.148424, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48211, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48212, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Hamtramck", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48213, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48214, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48215, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48216, + "latitude": 42.337787, + "longitude": -83.167925, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48217, + "latitude": 42.273038, + "longitude": -83.152573, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48218, + "latitude": 42.268761, + "longitude": -83.135137, + "city": "River Rouge", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48219, + "latitude": 42.437192, + "longitude": -83.287477, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48220, + "latitude": 42.460586, + "longitude": -83.140675, + "city": "Ferndale", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48221, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48222, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48223, + "latitude": 42.395986, + "longitude": -83.275979, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48224, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48225, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Harper Woods", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48226, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48227, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48228, + "latitude": 42.335937, + "longitude": -83.217127, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48229, + "latitude": 42.249838, + "longitude": -83.143121, + "city": "Ecorse", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48230, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Grosse Pointe", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48231, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48232, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48233, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48234, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48235, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48236, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Grosse Pointe", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48237, + "latitude": 42.466585, + "longitude": -83.178177, + "city": "Oak Park", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48238, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48239, + "latitude": 42.392286, + "longitude": -83.282029, + "city": "Redford", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48240, + "latitude": 42.423035, + "longitude": -83.30358, + "city": "Redford", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48242, + "latitude": 42.216575, + "longitude": -83.35324, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48243, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48244, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48255, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48260, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48264, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48265, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48266, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48267, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48268, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48269, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48272, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48275, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48277, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48278, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48279, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48288, + "latitude": 42.239933, + "longitude": -83.150823, + "city": "Detroit", + "state": "MI", + "county": "Wayne" + }, + { + "zip_code": 48301, + "latitude": 42.544534, + "longitude": -83.279231, + "city": "Bloomfield Hills", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48302, + "latitude": 42.584789, + "longitude": -83.282116, + "city": "Bloomfield Hills", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48303, + "latitude": 42.660091, + "longitude": -83.3863, + "city": "Bloomfield Hills", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48304, + "latitude": 42.587034, + "longitude": -83.235931, + "city": "Bloomfield Hills", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48306, + "latitude": 42.726216, + "longitude": -83.156629, + "city": "Rochester", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48307, + "latitude": 42.659283, + "longitude": -83.122482, + "city": "Rochester", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48308, + "latitude": 42.638533, + "longitude": -83.131426, + "city": "Rochester", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48309, + "latitude": 42.662644, + "longitude": -83.183666, + "city": "Rochester", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48310, + "latitude": 42.564395, + "longitude": -83.068475, + "city": "Sterling Heights", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48311, + "latitude": 42.672322, + "longitude": -82.903065, + "city": "Sterling Heights", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48312, + "latitude": 42.566338, + "longitude": -83.028532, + "city": "Sterling Heights", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48313, + "latitude": 42.606847, + "longitude": -83.01041, + "city": "Sterling Heights", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48314, + "latitude": 42.603976, + "longitude": -83.036259, + "city": "Sterling Heights", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48315, + "latitude": 42.671025, + "longitude": -82.998811, + "city": "Utica", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48316, + "latitude": 42.688531, + "longitude": -83.05483, + "city": "Utica", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48317, + "latitude": 42.641276, + "longitude": -83.05043, + "city": "Utica", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48318, + "latitude": 42.672322, + "longitude": -82.903065, + "city": "Utica", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48320, + "latitude": 42.611409, + "longitude": -83.335629, + "city": "Keego Harbor", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48321, + "latitude": 42.660091, + "longitude": -83.3863, + "city": "Auburn Hills", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48322, + "latitude": 42.542715, + "longitude": -83.379535, + "city": "West Bloomfield", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48323, + "latitude": 42.568292, + "longitude": -83.380535, + "city": "West Bloomfield", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48324, + "latitude": 42.596093, + "longitude": -83.381886, + "city": "West Bloomfield", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48325, + "latitude": 42.660091, + "longitude": -83.3863, + "city": "West Bloomfield", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48326, + "latitude": 42.673931, + "longitude": -83.295052, + "city": "Auburn Hills", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48327, + "latitude": 42.644824, + "longitude": -83.406111, + "city": "Waterford", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48328, + "latitude": 42.647831, + "longitude": -83.355433, + "city": "Waterford", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48329, + "latitude": 42.68258, + "longitude": -83.386338, + "city": "Waterford", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48330, + "latitude": 42.675435, + "longitude": -83.363697, + "city": "Drayton Plains", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48331, + "latitude": 42.505138, + "longitude": -83.407233, + "city": "Farmington", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48332, + "latitude": 42.660091, + "longitude": -83.3863, + "city": "Farmington", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48333, + "latitude": 42.660091, + "longitude": -83.3863, + "city": "Farmington", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48334, + "latitude": 42.506468, + "longitude": -83.348394, + "city": "Farmington", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48335, + "latitude": 42.461669, + "longitude": -83.405333, + "city": "Farmington", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48336, + "latitude": 42.465635, + "longitude": -83.363784, + "city": "Farmington", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48340, + "latitude": 42.670272, + "longitude": -83.289036, + "city": "Pontiac", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48341, + "latitude": 42.633716, + "longitude": -83.291471, + "city": "Pontiac", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48342, + "latitude": 42.694224, + "longitude": -83.288516, + "city": "Pontiac", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48343, + "latitude": 42.660091, + "longitude": -83.3863, + "city": "Pontiac", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48346, + "latitude": 42.723851, + "longitude": -83.423242, + "city": "Clarkston", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48347, + "latitude": 42.660091, + "longitude": -83.3863, + "city": "Clarkston", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48348, + "latitude": 42.760507, + "longitude": -83.403984, + "city": "Clarkston", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48350, + "latitude": 42.749639, + "longitude": -83.535805, + "city": "Davisburg", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48353, + "latitude": 42.648484, + "longitude": -83.717806, + "city": "Hartland", + "state": "MI", + "county": "Livingston" + }, + { + "zip_code": 48356, + "latitude": 42.701111, + "longitude": -83.422549, + "city": "Highland", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48357, + "latitude": 42.654444, + "longitude": -83.561306, + "city": "Highland", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48359, + "latitude": 42.723081, + "longitude": -83.276903, + "city": "Lake Orion", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48360, + "latitude": 42.74288, + "longitude": -83.272037, + "city": "Lake Orion", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48361, + "latitude": 42.660091, + "longitude": -83.3863, + "city": "Lake Orion", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48362, + "latitude": 42.776329, + "longitude": -83.274778, + "city": "Lake Orion", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48363, + "latitude": 42.766093, + "longitude": -83.157643, + "city": "Oakland", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48366, + "latitude": 42.803277, + "longitude": -83.18412, + "city": "Lakeville", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48367, + "latitude": 42.843653, + "longitude": -83.140608, + "city": "Leonard", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48370, + "latitude": 42.840328, + "longitude": -83.200206, + "city": "Oxford", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48371, + "latitude": 42.772209, + "longitude": -83.339754, + "city": "Oxford", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48374, + "latitude": 42.468959, + "longitude": -83.522221, + "city": "Novi", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48375, + "latitude": 42.463569, + "longitude": -83.46663, + "city": "Novi", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48376, + "latitude": 42.470984, + "longitude": -83.474785, + "city": "Novi", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48377, + "latitude": 42.49917, + "longitude": -83.477335, + "city": "Novi", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48380, + "latitude": 42.593161, + "longitude": -83.645451, + "city": "Milford", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48381, + "latitude": 42.554322, + "longitude": -83.579098, + "city": "Milford", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48382, + "latitude": 42.583382, + "longitude": -83.500878, + "city": "Commerce Township", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48383, + "latitude": 42.657698, + "longitude": -83.534444, + "city": "White Lake", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48386, + "latitude": 42.657843, + "longitude": -83.478714, + "city": "White Lake", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48387, + "latitude": 42.7253, + "longitude": -83.311605, + "city": "Union Lake", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48390, + "latitude": 42.558183, + "longitude": -83.47726, + "city": "Walled Lake", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48391, + "latitude": 42.660091, + "longitude": -83.3863, + "city": "Walled Lake", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48393, + "latitude": 42.520533, + "longitude": -83.549145, + "city": "Wixom", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48397, + "latitude": 42.491736, + "longitude": -83.040222, + "city": "Warren", + "state": "MI", + "county": "Macomb" + }, + { + "zip_code": 48398, + "latitude": 42.660091, + "longitude": -83.3863, + "city": "Clawson", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48401, + "latitude": 43.35159, + "longitude": -82.670835, + "city": "Applegate", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48410, + "latitude": 43.558856, + "longitude": -82.945483, + "city": "Argyle", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48411, + "latitude": 42.940019, + "longitude": -83.536923, + "city": "Atlas", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48412, + "latitude": 43.066173, + "longitude": -83.257592, + "city": "Attica", + "state": "MI", + "county": "Lapeer" + }, + { + "zip_code": 48413, + "latitude": 43.79455, + "longitude": -82.949138, + "city": "Bad Axe", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48414, + "latitude": 42.865732, + "longitude": -84.083097, + "city": "Bancroft", + "state": "MI", + "county": "Shiawassee" + }, + { + "zip_code": 48415, + "latitude": 43.27849, + "longitude": -83.81449, + "city": "Birch Run", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48416, + "latitude": 43.242602, + "longitude": -82.918819, + "city": "Brown City", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48417, + "latitude": 43.263947, + "longitude": -83.893403, + "city": "Burt", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48418, + "latitude": 42.826333, + "longitude": -84.020577, + "city": "Byron", + "state": "MI", + "county": "Shiawassee" + }, + { + "zip_code": 48419, + "latitude": 43.443662, + "longitude": -82.663858, + "city": "Carsonville", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48420, + "latitude": 43.170497, + "longitude": -83.707374, + "city": "Clio", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48421, + "latitude": 43.072417, + "longitude": -83.292729, + "city": "Columbiaville", + "state": "MI", + "county": "Lapeer" + }, + { + "zip_code": 48422, + "latitude": 43.252807, + "longitude": -82.644104, + "city": "Croswell", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48423, + "latitude": 43.041994, + "longitude": -83.622843, + "city": "Davison", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48426, + "latitude": 43.517467, + "longitude": -82.853426, + "city": "Decker", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48427, + "latitude": 43.535064, + "longitude": -82.722491, + "city": "Deckerville", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48428, + "latitude": 42.937629, + "longitude": -83.154685, + "city": "Dryden", + "state": "MI", + "county": "Lapeer" + }, + { + "zip_code": 48429, + "latitude": 42.894936, + "longitude": -84.02596, + "city": "Durand", + "state": "MI", + "county": "Shiawassee" + }, + { + "zip_code": 48430, + "latitude": 42.83333, + "longitude": -83.763433, + "city": "Fenton", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48432, + "latitude": 43.952572, + "longitude": -82.973268, + "city": "Filion", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48433, + "latitude": 42.978274, + "longitude": -83.808006, + "city": "Flushing", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48434, + "latitude": 43.663206, + "longitude": -82.613319, + "city": "Forestville", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48435, + "latitude": 43.277734, + "longitude": -83.39199, + "city": "Fostoria", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48436, + "latitude": 42.872466, + "longitude": -83.858445, + "city": "Gaines", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48437, + "latitude": 43.018423, + "longitude": -83.691666, + "city": "Genesee", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48438, + "latitude": 42.91884, + "longitude": -83.51249, + "city": "Goodrich", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48439, + "latitude": 42.9227, + "longitude": -83.67376, + "city": "Grand Blanc", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48440, + "latitude": 42.93062, + "longitude": -83.360013, + "city": "Hadley", + "state": "MI", + "county": "Lapeer" + }, + { + "zip_code": 48441, + "latitude": 43.867295, + "longitude": -82.800293, + "city": "Harbor Beach", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48442, + "latitude": 42.775922, + "longitude": -83.579384, + "city": "Holly", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48444, + "latitude": 43.065642, + "longitude": -83.060893, + "city": "Imlay City", + "state": "MI", + "county": "Lapeer" + }, + { + "zip_code": 48445, + "latitude": 43.961537, + "longitude": -82.944266, + "city": "Kinde", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48446, + "latitude": 43.121459, + "longitude": -83.319558, + "city": "Lapeer", + "state": "MI", + "county": "Lapeer" + }, + { + "zip_code": 48449, + "latitude": 42.98966, + "longitude": -83.900264, + "city": "Lennon", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48450, + "latitude": 43.392172, + "longitude": -82.78895, + "city": "Lexington", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48451, + "latitude": 42.825944, + "longitude": -83.811322, + "city": "Linden", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48453, + "latitude": 43.357539, + "longitude": -83.002816, + "city": "Marlette", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48454, + "latitude": 43.20471, + "longitude": -82.810553, + "city": "Melvin", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48455, + "latitude": 42.942128, + "longitude": -83.29607, + "city": "Metamora", + "state": "MI", + "county": "Lapeer" + }, + { + "zip_code": 48456, + "latitude": 43.651302, + "longitude": -82.756025, + "city": "Minden City", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48457, + "latitude": 43.003962, + "longitude": -83.873179, + "city": "Montrose", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48458, + "latitude": 43.120587, + "longitude": -83.692978, + "city": "Mount Morris", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48460, + "latitude": 43.109913, + "longitude": -83.998893, + "city": "New Lothrop", + "state": "MI", + "county": "Shiawassee" + }, + { + "zip_code": 48461, + "latitude": 43.112848, + "longitude": -83.250511, + "city": "North Branch", + "state": "MI", + "county": "Lapeer" + }, + { + "zip_code": 48462, + "latitude": 42.835019, + "longitude": -83.42298, + "city": "Ortonville", + "state": "MI", + "county": "Oakland" + }, + { + "zip_code": 48463, + "latitude": 43.157936, + "longitude": -83.529863, + "city": "Otisville", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48464, + "latitude": 43.211722, + "longitude": -83.405752, + "city": "Otter Lake", + "state": "MI", + "county": "Lapeer" + }, + { + "zip_code": 48465, + "latitude": 43.614613, + "longitude": -82.707455, + "city": "Palms", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48466, + "latitude": 43.274949, + "longitude": -82.807228, + "city": "Peck", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48467, + "latitude": 43.99756, + "longitude": -83.052623, + "city": "Port Austin", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48468, + "latitude": 43.944086, + "longitude": -82.907943, + "city": "Port Hope", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48469, + "latitude": 43.458914, + "longitude": -82.566894, + "city": "Port Sanilac", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48470, + "latitude": 43.743805, + "longitude": -82.740132, + "city": "Ruth", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48471, + "latitude": 43.374676, + "longitude": -82.858995, + "city": "Sandusky", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48472, + "latitude": 43.40401, + "longitude": -82.951494, + "city": "Snover", + "state": "MI", + "county": "Sanilac" + }, + { + "zip_code": 48473, + "latitude": 42.950323, + "longitude": -83.812575, + "city": "Swartz Creek", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48475, + "latitude": 43.80794, + "longitude": -83.023993, + "city": "Ubly", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48476, + "latitude": 42.940553, + "longitude": -84.032828, + "city": "Vernon", + "state": "MI", + "county": "Shiawassee" + }, + { + "zip_code": 48501, + "latitude": 42.965926, + "longitude": -83.780835, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48502, + "latitude": 43.015127, + "longitude": -83.694756, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48503, + "latitude": 43.010835, + "longitude": -83.69278, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48504, + "latitude": 43.020626, + "longitude": -83.697666, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48505, + "latitude": 43.076926, + "longitude": -83.690207, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48506, + "latitude": 43.065313, + "longitude": -83.631004, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48507, + "latitude": 42.982076, + "longitude": -83.734004, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48509, + "latitude": 43.025934, + "longitude": -83.604053, + "city": "Burton", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48519, + "latitude": 42.985927, + "longitude": -83.613452, + "city": "Burton", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48529, + "latitude": 42.974427, + "longitude": -83.662853, + "city": "Burton", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48531, + "latitude": 43.002, + "longitude": -83.692507, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48532, + "latitude": 43.011127, + "longitude": -83.803045, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48550, + "latitude": 43.034927, + "longitude": -83.688706, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48551, + "latitude": 42.978995, + "longitude": -83.713124, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48552, + "latitude": 42.977895, + "longitude": -83.713074, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48553, + "latitude": 42.973627, + "longitude": -83.720306, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48554, + "latitude": 42.972244, + "longitude": -83.79463, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48555, + "latitude": 43.011277, + "longitude": -83.710756, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48556, + "latitude": 43.032677, + "longitude": -83.646255, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48557, + "latitude": 43.080578, + "longitude": -83.783675, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48559, + "latitude": 43.002, + "longitude": -83.692507, + "city": "Flint", + "state": "MI", + "county": "Genesee" + }, + { + "zip_code": 48601, + "latitude": 43.41242, + "longitude": -83.886873, + "city": "Saginaw", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48602, + "latitude": 43.42926, + "longitude": -84.056977, + "city": "Saginaw", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48603, + "latitude": 43.460115, + "longitude": -84.026587, + "city": "Saginaw", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48604, + "latitude": 43.482403, + "longitude": -83.969391, + "city": "Saginaw", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48605, + "latitude": 43.458776, + "longitude": -84.051827, + "city": "Saginaw", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48606, + "latitude": 43.348535, + "longitude": -84.032612, + "city": "Saginaw", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48607, + "latitude": 43.431875, + "longitude": -83.933672, + "city": "Saginaw", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48608, + "latitude": 43.348535, + "longitude": -84.032612, + "city": "Saginaw", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48609, + "latitude": 43.38689, + "longitude": -84.092633, + "city": "Saginaw", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48610, + "latitude": 44.324353, + "longitude": -84.162443, + "city": "Alger", + "state": "MI", + "county": "Ogemaw" + }, + { + "zip_code": 48611, + "latitude": 43.639444, + "longitude": -84.059141, + "city": "Auburn", + "state": "MI", + "county": "Bay" + }, + { + "zip_code": 48612, + "latitude": 43.965212, + "longitude": -84.436146, + "city": "Beaverton", + "state": "MI", + "county": "Gladwin" + }, + { + "zip_code": 48613, + "latitude": 43.92673, + "longitude": -84.105306, + "city": "Bentley", + "state": "MI", + "county": "Bay" + }, + { + "zip_code": 48614, + "latitude": 43.237044, + "longitude": -84.288736, + "city": "Brant", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48615, + "latitude": 43.38631, + "longitude": -84.46894, + "city": "Breckenridge", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48616, + "latitude": 43.329465, + "longitude": -84.136197, + "city": "Chesaning", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48617, + "latitude": 43.976073, + "longitude": -84.739685, + "city": "Clare", + "state": "MI", + "county": "Clare" + }, + { + "zip_code": 48618, + "latitude": 43.720284, + "longitude": -84.52035, + "city": "Coleman", + "state": "MI", + "county": "Midland" + }, + { + "zip_code": 48619, + "latitude": 44.756363, + "longitude": -84.046449, + "city": "Comins", + "state": "MI", + "county": "Oscoda" + }, + { + "zip_code": 48620, + "latitude": 43.777368, + "longitude": -84.381307, + "city": "Edenville", + "state": "MI", + "county": "Midland" + }, + { + "zip_code": 48621, + "latitude": 44.689286, + "longitude": -84.011959, + "city": "Fairview", + "state": "MI", + "county": "Oscoda" + }, + { + "zip_code": 48622, + "latitude": 43.951093, + "longitude": -84.866432, + "city": "Farwell", + "state": "MI", + "county": "Clare" + }, + { + "zip_code": 48623, + "latitude": 43.496884, + "longitude": -84.102426, + "city": "Freeland", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48624, + "latitude": 44.032603, + "longitude": -84.429231, + "city": "Gladwin", + "state": "MI", + "county": "Gladwin" + }, + { + "zip_code": 48625, + "latitude": 44.005299, + "longitude": -84.85096, + "city": "Harrison", + "state": "MI", + "county": "Clare" + }, + { + "zip_code": 48626, + "latitude": 43.428523, + "longitude": -84.230091, + "city": "Hemlock", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48627, + "latitude": 44.387123, + "longitude": -84.701346, + "city": "Higgins Lake", + "state": "MI", + "county": "Roscommon" + }, + { + "zip_code": 48628, + "latitude": 43.770317, + "longitude": -84.4046, + "city": "Hope", + "state": "MI", + "county": "Midland" + }, + { + "zip_code": 48629, + "latitude": 44.351007, + "longitude": -84.733596, + "city": "Houghton Lake", + "state": "MI", + "county": "Roscommon" + }, + { + "zip_code": 48630, + "latitude": 44.332152, + "longitude": -84.71945, + "city": "Houghton Lake Heights", + "state": "MI", + "county": "Roscommon" + }, + { + "zip_code": 48631, + "latitude": 43.688372, + "longitude": -84.026419, + "city": "Kawkawlin", + "state": "MI", + "county": "Bay" + }, + { + "zip_code": 48632, + "latitude": 43.914196, + "longitude": -84.867626, + "city": "Lake", + "state": "MI", + "county": "Clare" + }, + { + "zip_code": 48633, + "latitude": 43.958329, + "longitude": -84.919332, + "city": "Lake George", + "state": "MI", + "county": "Clare" + }, + { + "zip_code": 48634, + "latitude": 43.771397, + "longitude": -84.051257, + "city": "Linwood", + "state": "MI", + "county": "Bay" + }, + { + "zip_code": 48635, + "latitude": 44.377795, + "longitude": -84.072974, + "city": "Lupton", + "state": "MI", + "county": "Ogemaw" + }, + { + "zip_code": 48636, + "latitude": 44.622852, + "longitude": -84.14818, + "city": "Luzerne", + "state": "MI", + "county": "Oscoda" + }, + { + "zip_code": 48637, + "latitude": 43.389643, + "longitude": -84.309397, + "city": "Merrill", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48640, + "latitude": 43.626132, + "longitude": -84.33803, + "city": "Midland", + "state": "MI", + "county": "Midland" + }, + { + "zip_code": 48641, + "latitude": 43.538252, + "longitude": -84.387753, + "city": "Midland", + "state": "MI", + "county": "Midland" + }, + { + "zip_code": 48642, + "latitude": 43.68698, + "longitude": -84.280136, + "city": "Midland", + "state": "MI", + "county": "Midland" + }, + { + "zip_code": 48647, + "latitude": 44.662952, + "longitude": -84.089518, + "city": "Mio", + "state": "MI", + "county": "Oscoda" + }, + { + "zip_code": 48649, + "latitude": 43.165075, + "longitude": -84.207683, + "city": "Oakley", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48650, + "latitude": 43.839179, + "longitude": -84.038715, + "city": "Pinconning", + "state": "MI", + "county": "Bay" + }, + { + "zip_code": 48651, + "latitude": 44.343508, + "longitude": -84.647139, + "city": "Prudenville", + "state": "MI", + "county": "Roscommon" + }, + { + "zip_code": 48652, + "latitude": 43.868833, + "longitude": -84.228499, + "city": "Rhodes", + "state": "MI", + "county": "Gladwin" + }, + { + "zip_code": 48653, + "latitude": 44.394517, + "longitude": -84.611194, + "city": "Roscommon", + "state": "MI", + "county": "Roscommon" + }, + { + "zip_code": 48654, + "latitude": 44.334415, + "longitude": -84.190661, + "city": "Rose City", + "state": "MI", + "county": "Ogemaw" + }, + { + "zip_code": 48655, + "latitude": 43.25677, + "longitude": -84.180476, + "city": "Saint Charles", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48656, + "latitude": 44.359863, + "longitude": -84.543576, + "city": "Saint Helen", + "state": "MI", + "county": "Roscommon" + }, + { + "zip_code": 48657, + "latitude": 43.712095, + "longitude": -84.399532, + "city": "Sanford", + "state": "MI", + "county": "Midland" + }, + { + "zip_code": 48658, + "latitude": 43.979427, + "longitude": -83.900702, + "city": "Standish", + "state": "MI", + "county": "Arenac" + }, + { + "zip_code": 48659, + "latitude": 44.079473, + "longitude": -83.956748, + "city": "Sterling", + "state": "MI", + "county": "Arenac" + }, + { + "zip_code": 48661, + "latitude": 44.33095, + "longitude": -84.202733, + "city": "West Branch", + "state": "MI", + "county": "Ogemaw" + }, + { + "zip_code": 48662, + "latitude": 43.379034, + "longitude": -84.419329, + "city": "Wheeler", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48663, + "latitude": 43.467315, + "longitude": -83.975475, + "city": "Saginaw", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48667, + "latitude": 43.647297, + "longitude": -84.387331, + "city": "Midland", + "state": "MI", + "county": "Midland" + }, + { + "zip_code": 48670, + "latitude": 43.637471, + "longitude": -84.256758, + "city": "Midland", + "state": "MI", + "county": "Midland" + }, + { + "zip_code": 48674, + "latitude": 43.612884, + "longitude": -84.197125, + "city": "Midland", + "state": "MI", + "county": "Midland" + }, + { + "zip_code": 48686, + "latitude": 43.647297, + "longitude": -84.387331, + "city": "Midland", + "state": "MI", + "county": "Midland" + }, + { + "zip_code": 48701, + "latitude": 43.582147, + "longitude": -83.546114, + "city": "Akron", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48703, + "latitude": 44.063621, + "longitude": -83.686379, + "city": "Au Gres", + "state": "MI", + "county": "Arenac" + }, + { + "zip_code": 48705, + "latitude": 44.678354, + "longitude": -83.599977, + "city": "Barton City", + "state": "MI", + "county": "Alcona" + }, + { + "zip_code": 48706, + "latitude": 43.608773, + "longitude": -83.953007, + "city": "Bay City", + "state": "MI", + "county": "Bay" + }, + { + "zip_code": 48707, + "latitude": 43.737798, + "longitude": -83.933337, + "city": "Bay City", + "state": "MI", + "county": "Bay" + }, + { + "zip_code": 48708, + "latitude": 43.559572, + "longitude": -83.820876, + "city": "Bay City", + "state": "MI", + "county": "Bay" + }, + { + "zip_code": 48710, + "latitude": 43.556574, + "longitude": -83.994328, + "city": "University Center", + "state": "MI", + "county": "Bay" + }, + { + "zip_code": 48720, + "latitude": 43.815182, + "longitude": -83.341775, + "city": "Bay Port", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48721, + "latitude": 44.794881, + "longitude": -83.34884, + "city": "Black River", + "state": "MI", + "county": "Alcona" + }, + { + "zip_code": 48722, + "latitude": 43.343016, + "longitude": -83.832323, + "city": "Bridgeport", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48723, + "latitude": 43.489001, + "longitude": -83.385078, + "city": "Caro", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48724, + "latitude": 43.465024, + "longitude": -83.925473, + "city": "Carrollton", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48725, + "latitude": 43.84953, + "longitude": -83.232873, + "city": "Caseville", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48726, + "latitude": 43.586075, + "longitude": -83.293496, + "city": "Cass City", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48727, + "latitude": 43.28298, + "longitude": -83.178182, + "city": "Clifford", + "state": "MI", + "county": "Lapeer" + }, + { + "zip_code": 48728, + "latitude": 44.705591, + "longitude": -83.78745, + "city": "Curran", + "state": "MI", + "county": "Alcona" + }, + { + "zip_code": 48729, + "latitude": 43.491974, + "longitude": -83.198239, + "city": "Deford", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48730, + "latitude": 44.349592, + "longitude": -83.562942, + "city": "East Tawas", + "state": "MI", + "county": "Iosco" + }, + { + "zip_code": 48731, + "latitude": 43.826222, + "longitude": -83.141633, + "city": "Elkton", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48732, + "latitude": 43.601522, + "longitude": -83.778971, + "city": "Essexville", + "state": "MI", + "county": "Bay" + }, + { + "zip_code": 48733, + "latitude": 43.534504, + "longitude": -83.573677, + "city": "Fairgrove", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48734, + "latitude": 43.353763, + "longitude": -83.756467, + "city": "Frankenmuth", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48735, + "latitude": 43.599096, + "longitude": -83.340629, + "city": "Gagetown", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48736, + "latitude": 43.49442, + "longitude": -83.624431, + "city": "Gilford", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48737, + "latitude": 44.57341, + "longitude": -83.708328, + "city": "Glennie", + "state": "MI", + "county": "Alcona" + }, + { + "zip_code": 48738, + "latitude": 44.557782, + "longitude": -83.338437, + "city": "Greenbush", + "state": "MI", + "county": "Alcona" + }, + { + "zip_code": 48739, + "latitude": 44.358808, + "longitude": -83.764739, + "city": "Hale", + "state": "MI", + "county": "Iosco" + }, + { + "zip_code": 48740, + "latitude": 44.656694, + "longitude": -83.41973, + "city": "Harrisville", + "state": "MI", + "county": "Alcona" + }, + { + "zip_code": 48741, + "latitude": 43.398564, + "longitude": -83.195025, + "city": "Kingston", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48742, + "latitude": 44.65922, + "longitude": -83.454865, + "city": "Lincoln", + "state": "MI", + "county": "Alcona" + }, + { + "zip_code": 48743, + "latitude": 44.441563, + "longitude": -83.851644, + "city": "Long Lake", + "state": "MI", + "county": "Iosco" + }, + { + "zip_code": 48744, + "latitude": 43.344868, + "longitude": -83.367939, + "city": "Mayville", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48745, + "latitude": 44.578092, + "longitude": -83.591419, + "city": "Mikado", + "state": "MI", + "county": "Alcona" + }, + { + "zip_code": 48746, + "latitude": 43.297434, + "longitude": -83.47392, + "city": "Millington", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48747, + "latitude": 43.529339, + "longitude": -83.762898, + "city": "Munger", + "state": "MI", + "county": "Bay" + }, + { + "zip_code": 48748, + "latitude": 44.280833, + "longitude": -83.71748, + "city": "National City", + "state": "MI", + "county": "Iosco" + }, + { + "zip_code": 48749, + "latitude": 44.065941, + "longitude": -83.846526, + "city": "Omer", + "state": "MI", + "county": "Arenac" + }, + { + "zip_code": 48750, + "latitude": 44.422917, + "longitude": -83.550866, + "city": "Oscoda", + "state": "MI", + "county": "Iosco" + }, + { + "zip_code": 48754, + "latitude": 43.768927, + "longitude": -83.228252, + "city": "Owendale", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48755, + "latitude": 43.84452, + "longitude": -83.241886, + "city": "Pigeon", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48756, + "latitude": 44.291742, + "longitude": -83.985725, + "city": "Prescott", + "state": "MI", + "county": "Ogemaw" + }, + { + "zip_code": 48757, + "latitude": 43.478735, + "longitude": -83.619435, + "city": "Reese", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48758, + "latitude": 43.407321, + "longitude": -83.676156, + "city": "Richville", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48759, + "latitude": 43.73616, + "longitude": -83.381857, + "city": "Sebewaing", + "state": "MI", + "county": "Huron" + }, + { + "zip_code": 48760, + "latitude": 43.285214, + "longitude": -83.261468, + "city": "Silverwood", + "state": "MI", + "county": "Lapeer" + }, + { + "zip_code": 48761, + "latitude": 44.472352, + "longitude": -83.959844, + "city": "South Branch", + "state": "MI", + "county": "Ogemaw" + }, + { + "zip_code": 48762, + "latitude": 44.792293, + "longitude": -83.489404, + "city": "Spruce", + "state": "MI", + "county": "Alcona" + }, + { + "zip_code": 48763, + "latitude": 44.277551, + "longitude": -83.677131, + "city": "Tawas City", + "state": "MI", + "county": "Iosco" + }, + { + "zip_code": 48764, + "latitude": 44.266549, + "longitude": -83.519166, + "city": "Tawas City", + "state": "MI", + "county": "Iosco" + }, + { + "zip_code": 48765, + "latitude": 44.110526, + "longitude": -83.701888, + "city": "Turner", + "state": "MI", + "county": "Arenac" + }, + { + "zip_code": 48766, + "latitude": 44.104905, + "longitude": -83.865674, + "city": "Twining", + "state": "MI", + "county": "Arenac" + }, + { + "zip_code": 48767, + "latitude": 43.649504, + "longitude": -83.452826, + "city": "Unionville", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48768, + "latitude": 43.404594, + "longitude": -83.561187, + "city": "Vassar", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48769, + "latitude": 43.327048, + "longitude": -83.657355, + "city": "Tuscola", + "state": "MI", + "county": "Tuscola" + }, + { + "zip_code": 48770, + "latitude": 44.262826, + "longitude": -83.688778, + "city": "Whittemore", + "state": "MI", + "county": "Iosco" + }, + { + "zip_code": 48787, + "latitude": 43.334958, + "longitude": -83.749418, + "city": "Frankenmuth", + "state": "MI", + "county": "Saginaw" + }, + { + "zip_code": 48801, + "latitude": 43.298805, + "longitude": -84.63017, + "city": "Alma", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48802, + "latitude": 43.389262, + "longitude": -84.666661, + "city": "Alma", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48804, + "latitude": 43.640574, + "longitude": -84.847417, + "city": "Mount Pleasant", + "state": "MI", + "county": "Isabella" + }, + { + "zip_code": 48805, + "latitude": 42.599184, + "longitude": -84.371973, + "city": "Okemos", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48806, + "latitude": 43.204648, + "longitude": -84.494123, + "city": "Ashley", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48807, + "latitude": 43.161282, + "longitude": -84.433708, + "city": "Bannister", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48808, + "latitude": 42.819509, + "longitude": -84.483853, + "city": "Bath", + "state": "MI", + "county": "Clinton" + }, + { + "zip_code": 48809, + "latitude": 42.98004, + "longitude": -85.128727, + "city": "Belding", + "state": "MI", + "county": "Ionia" + }, + { + "zip_code": 48811, + "latitude": 43.279958, + "longitude": -85.05493, + "city": "Carson City", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 48812, + "latitude": 43.413761, + "longitude": -84.975271, + "city": "Cedar Lake", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 48813, + "latitude": 42.574191, + "longitude": -84.838452, + "city": "Charlotte", + "state": "MI", + "county": "Eaton" + }, + { + "zip_code": 48815, + "latitude": 42.835039, + "longitude": -85.252353, + "city": "Clarksville", + "state": "MI", + "county": "Ionia" + }, + { + "zip_code": 48816, + "latitude": 42.757633, + "longitude": -83.938967, + "city": "Cohoctah", + "state": "MI", + "county": "Livingston" + }, + { + "zip_code": 48817, + "latitude": 42.995625, + "longitude": -84.140012, + "city": "Corunna", + "state": "MI", + "county": "Shiawassee" + }, + { + "zip_code": 48818, + "latitude": 43.267035, + "longitude": -84.95489, + "city": "Crystal", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 48819, + "latitude": 42.549235, + "longitude": -84.273815, + "city": "Dansville", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48820, + "latitude": 42.85479, + "longitude": -84.616108, + "city": "Dewitt", + "state": "MI", + "county": "Clinton" + }, + { + "zip_code": 48821, + "latitude": 42.654335, + "longitude": -84.654181, + "city": "Dimondale", + "state": "MI", + "county": "Eaton" + }, + { + "zip_code": 48822, + "latitude": 42.85703, + "longitude": -84.759243, + "city": "Eagle", + "state": "MI", + "county": "Clinton" + }, + { + "zip_code": 48823, + "latitude": 42.737334, + "longitude": -84.503527, + "city": "East Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48824, + "latitude": 42.728334, + "longitude": -84.488226, + "city": "East Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48825, + "latitude": 42.723784, + "longitude": -84.464775, + "city": "East Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48826, + "latitude": 42.599184, + "longitude": -84.371973, + "city": "East Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48827, + "latitude": 42.590246, + "longitude": -84.797012, + "city": "Eaton Rapids", + "state": "MI", + "county": "Eaton" + }, + { + "zip_code": 48829, + "latitude": 43.401096, + "longitude": -85.022308, + "city": "Edmore", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 48830, + "latitude": 43.363931, + "longitude": -84.836198, + "city": "Elm Hall", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48831, + "latitude": 43.08143, + "longitude": -84.445584, + "city": "Elsie", + "state": "MI", + "county": "Clinton" + }, + { + "zip_code": 48832, + "latitude": 43.408141, + "longitude": -84.775817, + "city": "Elwell", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48833, + "latitude": 42.944209, + "longitude": -84.600723, + "city": "Eureka", + "state": "MI", + "county": "Clinton" + }, + { + "zip_code": 48834, + "latitude": 43.292973, + "longitude": -85.045217, + "city": "Fenwick", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 48835, + "latitude": 42.993295, + "longitude": -84.761244, + "city": "Fowler", + "state": "MI", + "county": "Clinton" + }, + { + "zip_code": 48836, + "latitude": 42.641649, + "longitude": -84.054241, + "city": "Fowlerville", + "state": "MI", + "county": "Livingston" + }, + { + "zip_code": 48837, + "latitude": 42.700035, + "longitude": -84.766787, + "city": "Grand Ledge", + "state": "MI", + "county": "Eaton" + }, + { + "zip_code": 48838, + "latitude": 43.282538, + "longitude": -85.077695, + "city": "Greenville", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 48840, + "latitude": 42.750324, + "longitude": -84.378655, + "city": "Haslett", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48841, + "latitude": 42.983136, + "longitude": -84.229888, + "city": "Henderson", + "state": "MI", + "county": "Shiawassee" + }, + { + "zip_code": 48842, + "latitude": 42.639785, + "longitude": -84.506522, + "city": "Holt", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48843, + "latitude": 42.630687, + "longitude": -83.910266, + "city": "Howell", + "state": "MI", + "county": "Livingston" + }, + { + "zip_code": 48844, + "latitude": 42.603479, + "longitude": -83.911173, + "city": "Howell", + "state": "MI", + "county": "Livingston" + }, + { + "zip_code": 48845, + "latitude": 43.090457, + "longitude": -84.896225, + "city": "Hubbardston", + "state": "MI", + "county": "Ionia" + }, + { + "zip_code": 48846, + "latitude": 42.973427, + "longitude": -85.090548, + "city": "Ionia", + "state": "MI", + "county": "Ionia" + }, + { + "zip_code": 48847, + "latitude": 43.249453, + "longitude": -84.60379, + "city": "Ithaca", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48848, + "latitude": 42.879874, + "longitude": -84.313294, + "city": "Laingsburg", + "state": "MI", + "county": "Shiawassee" + }, + { + "zip_code": 48849, + "latitude": 42.827728, + "longitude": -85.143286, + "city": "Lake Odessa", + "state": "MI", + "county": "Ionia" + }, + { + "zip_code": 48850, + "latitude": 43.398672, + "longitude": -85.175752, + "city": "Lakeview", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 48851, + "latitude": 42.956819, + "longitude": -84.958071, + "city": "Lyons", + "state": "MI", + "county": "Ionia" + }, + { + "zip_code": 48852, + "latitude": 43.350251, + "longitude": -85.051692, + "city": "Mcbrides", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 48853, + "latitude": 43.099153, + "longitude": -84.68977, + "city": "Maple Rapids", + "state": "MI", + "county": "Clinton" + }, + { + "zip_code": 48854, + "latitude": 42.574335, + "longitude": -84.460273, + "city": "Mason", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48856, + "latitude": 43.197902, + "longitude": -84.730738, + "city": "Middleton", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48857, + "latitude": 42.844288, + "longitude": -84.136097, + "city": "Morrice", + "state": "MI", + "county": "Shiawassee" + }, + { + "zip_code": 48858, + "latitude": 43.636855, + "longitude": -84.807511, + "city": "Mount Pleasant", + "state": "MI", + "county": "Isabella" + }, + { + "zip_code": 48859, + "latitude": 43.564736, + "longitude": -84.847297, + "city": "Mount Pleasant", + "state": "MI", + "county": "Isabella" + }, + { + "zip_code": 48860, + "latitude": 43.046851, + "longitude": -84.900482, + "city": "Muir", + "state": "MI", + "county": "Ionia" + }, + { + "zip_code": 48861, + "latitude": 42.724229, + "longitude": -84.916222, + "city": "Mulliken", + "state": "MI", + "county": "Eaton" + }, + { + "zip_code": 48862, + "latitude": 43.356518, + "longitude": -84.497138, + "city": "North Star", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48863, + "latitude": 42.603479, + "longitude": -83.911173, + "city": "Oak Grove", + "state": "MI", + "county": "Livingston" + }, + { + "zip_code": 48864, + "latitude": 42.719534, + "longitude": -84.425136, + "city": "Okemos", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48865, + "latitude": 43.078789, + "longitude": -85.102387, + "city": "Orleans", + "state": "MI", + "county": "Ionia" + }, + { + "zip_code": 48866, + "latitude": 43.015906, + "longitude": -84.52884, + "city": "Ovid", + "state": "MI", + "county": "Clinton" + }, + { + "zip_code": 48867, + "latitude": 42.982578, + "longitude": -84.184937, + "city": "Owosso", + "state": "MI", + "county": "Shiawassee" + }, + { + "zip_code": 48870, + "latitude": 43.113587, + "longitude": -85.007665, + "city": "Palo", + "state": "MI", + "county": "Ionia" + }, + { + "zip_code": 48871, + "latitude": 43.162586, + "longitude": -84.679727, + "city": "Perrinton", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48872, + "latitude": 42.823317, + "longitude": -84.211149, + "city": "Perry", + "state": "MI", + "county": "Shiawassee" + }, + { + "zip_code": 48873, + "latitude": 42.970044, + "longitude": -84.916118, + "city": "Pewamo", + "state": "MI", + "county": "Ionia" + }, + { + "zip_code": 48874, + "latitude": 43.186268, + "longitude": -84.601718, + "city": "Pompeii", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48875, + "latitude": 42.883458, + "longitude": -84.965969, + "city": "Portland", + "state": "MI", + "county": "Ionia" + }, + { + "zip_code": 48876, + "latitude": 42.643807, + "longitude": -84.729716, + "city": "Potterville", + "state": "MI", + "county": "Eaton" + }, + { + "zip_code": 48877, + "latitude": 43.382803, + "longitude": -84.816107, + "city": "Riverdale", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48878, + "latitude": 43.709243, + "longitude": -84.770931, + "city": "Rosebush", + "state": "MI", + "county": "Isabella" + }, + { + "zip_code": 48879, + "latitude": 42.979673, + "longitude": -84.581962, + "city": "Saint Johns", + "state": "MI", + "county": "Clinton" + }, + { + "zip_code": 48880, + "latitude": 43.324772, + "longitude": -84.603002, + "city": "Saint Louis", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48881, + "latitude": 42.93571, + "longitude": -85.20298, + "city": "Saranac", + "state": "MI", + "county": "Ionia" + }, + { + "zip_code": 48882, + "latitude": 42.803973, + "longitude": -84.295949, + "city": "Shaftsburg", + "state": "MI", + "county": "Shiawassee" + }, + { + "zip_code": 48883, + "latitude": 43.530865, + "longitude": -84.756824, + "city": "Shepherd", + "state": "MI", + "county": "Isabella" + }, + { + "zip_code": 48884, + "latitude": 43.206319, + "longitude": -85.069087, + "city": "Sheridan", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 48885, + "latitude": 43.235402, + "longitude": -85.191444, + "city": "Sidney", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 48886, + "latitude": 43.341346, + "longitude": -85.177052, + "city": "Six Lakes", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 48887, + "latitude": 42.944929, + "longitude": -85.074665, + "city": "Smyrna", + "state": "MI", + "county": "Ionia" + }, + { + "zip_code": 48888, + "latitude": 43.289347, + "longitude": -85.059556, + "city": "Stanton", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 48889, + "latitude": 43.26895, + "longitude": -84.660821, + "city": "Sumner", + "state": "MI", + "county": "Gratiot" + }, + { + "zip_code": 48890, + "latitude": 42.703177, + "longitude": -84.896833, + "city": "Sunfield", + "state": "MI", + "county": "Eaton" + }, + { + "zip_code": 48891, + "latitude": 43.294643, + "longitude": -84.955903, + "city": "Vestaburg", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 48892, + "latitude": 42.656484, + "longitude": -84.200923, + "city": "Webberville", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48893, + "latitude": 43.67589, + "longitude": -84.977751, + "city": "Weidman", + "state": "MI", + "county": "Isabella" + }, + { + "zip_code": 48894, + "latitude": 42.932843, + "longitude": -84.808267, + "city": "Westphalia", + "state": "MI", + "county": "Clinton" + }, + { + "zip_code": 48895, + "latitude": 42.680434, + "longitude": -84.271215, + "city": "Williamston", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48896, + "latitude": 43.530832, + "longitude": -84.906289, + "city": "Winn", + "state": "MI", + "county": "Isabella" + }, + { + "zip_code": 48897, + "latitude": 42.697951, + "longitude": -85.133685, + "city": "Woodland", + "state": "MI", + "county": "Barry" + }, + { + "zip_code": 48901, + "latitude": 42.599184, + "longitude": -84.371973, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48906, + "latitude": 42.755284, + "longitude": -84.562979, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48907, + "latitude": 42.596071, + "longitude": -84.838206, + "city": "Lansing", + "state": "MI", + "county": "Eaton" + }, + { + "zip_code": 48908, + "latitude": 42.596071, + "longitude": -84.838206, + "city": "Lansing", + "state": "MI", + "county": "Eaton" + }, + { + "zip_code": 48909, + "latitude": 42.599184, + "longitude": -84.371973, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48910, + "latitude": 42.703435, + "longitude": -84.518543, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48911, + "latitude": 42.680335, + "longitude": -84.543494, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48912, + "latitude": 42.740054, + "longitude": -84.524939, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48913, + "latitude": 42.599184, + "longitude": -84.371973, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48915, + "latitude": 42.738764, + "longitude": -84.571179, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48916, + "latitude": 42.599184, + "longitude": -84.371973, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48917, + "latitude": 42.722414, + "longitude": -84.652032, + "city": "Lansing", + "state": "MI", + "county": "Eaton" + }, + { + "zip_code": 48918, + "latitude": 42.599184, + "longitude": -84.371973, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48919, + "latitude": 42.728585, + "longitude": -84.551728, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48921, + "latitude": 42.723735, + "longitude": -84.555629, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48922, + "latitude": 42.732535, + "longitude": -84.558679, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48924, + "latitude": 42.599184, + "longitude": -84.371973, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48929, + "latitude": 42.732535, + "longitude": -84.558679, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48930, + "latitude": 42.732535, + "longitude": -84.558679, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48933, + "latitude": 42.731384, + "longitude": -84.553698, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48937, + "latitude": 42.748734, + "longitude": -84.559029, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48950, + "latitude": 42.599184, + "longitude": -84.371973, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48951, + "latitude": "", + "longitude": "", + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48956, + "latitude": 42.732535, + "longitude": -84.558679, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 48980, + "latitude": 42.599184, + "longitude": -84.371973, + "city": "Lansing", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 49001, + "latitude": 42.261596, + "longitude": -85.510095, + "city": "Kalamazoo", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49002, + "latitude": 42.193793, + "longitude": -85.563901, + "city": "Portage", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49003, + "latitude": 42.245412, + "longitude": -85.529858, + "city": "Kalamazoo", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49004, + "latitude": 42.306859, + "longitude": -85.56816, + "city": "Kalamazoo", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49005, + "latitude": 42.323045, + "longitude": -85.493232, + "city": "Kalamazoo", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49006, + "latitude": 42.292247, + "longitude": -85.633033, + "city": "Kalamazoo", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49007, + "latitude": 42.242774, + "longitude": -85.560265, + "city": "Kalamazoo", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49008, + "latitude": 42.263007, + "longitude": -85.618046, + "city": "Kalamazoo", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49009, + "latitude": 42.299211, + "longitude": -85.592635, + "city": "Kalamazoo", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49010, + "latitude": 42.539295, + "longitude": -85.894873, + "city": "Allegan", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49011, + "latitude": 42.119031, + "longitude": -85.214348, + "city": "Athens", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49012, + "latitude": 42.353739, + "longitude": -85.346599, + "city": "Augusta", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49013, + "latitude": 42.312771, + "longitude": -86.096133, + "city": "Bangor", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49014, + "latitude": 42.303041, + "longitude": -85.13044, + "city": "Battle Creek", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49015, + "latitude": 42.219313, + "longitude": -85.229238, + "city": "Battle Creek", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49016, + "latitude": 42.246402, + "longitude": -85.004511, + "city": "Battle Creek", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49017, + "latitude": 42.367389, + "longitude": -85.194996, + "city": "Battle Creek", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49018, + "latitude": 42.246402, + "longitude": -85.004511, + "city": "Battle Creek", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49019, + "latitude": 42.245412, + "longitude": -85.529858, + "city": "Kalamazoo", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49020, + "latitude": 42.246402, + "longitude": -85.004511, + "city": "Bedford", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49021, + "latitude": 42.514158, + "longitude": -85.014665, + "city": "Bellevue", + "state": "MI", + "county": "Eaton" + }, + { + "zip_code": 49022, + "latitude": 42.14338, + "longitude": -86.348568, + "city": "Benton Harbor", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49023, + "latitude": 42.001551, + "longitude": -86.715294, + "city": "Benton Harbor", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49024, + "latitude": 42.197442, + "longitude": -85.619352, + "city": "Portage", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49026, + "latitude": 42.367738, + "longitude": -85.964714, + "city": "Bloomingdale", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49027, + "latitude": 42.346504, + "longitude": -86.072501, + "city": "Breedsville", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49028, + "latitude": 41.880399, + "longitude": -85.162804, + "city": "Bronson", + "state": "MI", + "county": "Branch" + }, + { + "zip_code": 49029, + "latitude": 42.130843, + "longitude": -85.1023, + "city": "Burlington", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49030, + "latitude": 41.839785, + "longitude": -85.365433, + "city": "Burr Oak", + "state": "MI", + "county": "Saint Joseph" + }, + { + "zip_code": 49031, + "latitude": 41.904174, + "longitude": -85.999067, + "city": "Cassopolis", + "state": "MI", + "county": "Cass" + }, + { + "zip_code": 49032, + "latitude": 41.904488, + "longitude": -85.479907, + "city": "Centreville", + "state": "MI", + "county": "Saint Joseph" + }, + { + "zip_code": 49033, + "latitude": 42.235692, + "longitude": -85.090633, + "city": "Ceresco", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49034, + "latitude": 42.226193, + "longitude": -85.363194, + "city": "Climax", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49035, + "latitude": 42.595121, + "longitude": -85.308555, + "city": "Cloverdale", + "state": "MI", + "county": "Barry" + }, + { + "zip_code": 49036, + "latitude": 41.905358, + "longitude": -85.058716, + "city": "Coldwater", + "state": "MI", + "county": "Branch" + }, + { + "zip_code": 49038, + "latitude": 42.147551, + "longitude": -86.365588, + "city": "Coloma", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49039, + "latitude": 42.224757, + "longitude": -86.372276, + "city": "Hagar Shores", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49040, + "latitude": 41.977796, + "longitude": -85.351074, + "city": "Colon", + "state": "MI", + "county": "Saint Joseph" + }, + { + "zip_code": 49041, + "latitude": 42.245412, + "longitude": -85.529858, + "city": "Comstock", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49042, + "latitude": 41.936948, + "longitude": -85.533122, + "city": "Constantine", + "state": "MI", + "county": "Saint Joseph" + }, + { + "zip_code": 49043, + "latitude": 42.28054, + "longitude": -86.266608, + "city": "Covert", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49045, + "latitude": 42.174485, + "longitude": -86.071429, + "city": "Decatur", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49046, + "latitude": 42.532723, + "longitude": -85.384885, + "city": "Delton", + "state": "MI", + "county": "Barry" + }, + { + "zip_code": 49047, + "latitude": 41.961597, + "longitude": -86.019304, + "city": "Dowagiac", + "state": "MI", + "county": "Cass" + }, + { + "zip_code": 49048, + "latitude": "", + "longitude": "", + "city": "Kalamazoo", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49050, + "latitude": 42.605588, + "longitude": -85.339902, + "city": "Dowling", + "state": "MI", + "county": "Barry" + }, + { + "zip_code": 49051, + "latitude": 42.1779, + "longitude": -85.234287, + "city": "East Leroy", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49052, + "latitude": 42.13344, + "longitude": -85.342481, + "city": "Fulton", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49053, + "latitude": 42.303241, + "longitude": -85.395798, + "city": "Galesburg", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49055, + "latitude": 42.357819, + "longitude": -85.859198, + "city": "Gobles", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49056, + "latitude": 42.367516, + "longitude": -86.07133, + "city": "Grand Junction", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49057, + "latitude": 42.218519, + "longitude": -86.052434, + "city": "Hartford", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49058, + "latitude": 42.639121, + "longitude": -85.28988, + "city": "Hastings", + "state": "MI", + "county": "Barry" + }, + { + "zip_code": 49060, + "latitude": 42.500132, + "longitude": -85.396204, + "city": "Hickory Corners", + "state": "MI", + "county": "Barry" + }, + { + "zip_code": 49061, + "latitude": 41.885831, + "longitude": -85.833847, + "city": "Jones", + "state": "MI", + "county": "Cass" + }, + { + "zip_code": 49062, + "latitude": 42.36175, + "longitude": -85.814072, + "city": "Kendall", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49063, + "latitude": 42.393586, + "longitude": -86.209904, + "city": "Lacota", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49064, + "latitude": 42.214896, + "longitude": -86.047077, + "city": "Lawrence", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49065, + "latitude": 42.185207, + "longitude": -86.011811, + "city": "Lawton", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49066, + "latitude": 42.028161, + "longitude": -85.35224, + "city": "Leonidas", + "state": "MI", + "county": "Saint Joseph" + }, + { + "zip_code": 49067, + "latitude": 42.008635, + "longitude": -85.857579, + "city": "Marcellus", + "state": "MI", + "county": "Cass" + }, + { + "zip_code": 49068, + "latitude": 42.265016, + "longitude": -84.948946, + "city": "Marshall", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49069, + "latitude": 42.204494, + "longitude": -84.949919, + "city": "Marshall", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49070, + "latitude": 42.537142, + "longitude": -85.626918, + "city": "Martin", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49071, + "latitude": 42.244501, + "longitude": -85.805041, + "city": "Mattawan", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49072, + "latitude": 42.009094, + "longitude": -85.449665, + "city": "Mendon", + "state": "MI", + "county": "Saint Joseph" + }, + { + "zip_code": 49073, + "latitude": 42.621104, + "longitude": -85.197412, + "city": "Nashville", + "state": "MI", + "county": "Barry" + }, + { + "zip_code": 49074, + "latitude": 42.245412, + "longitude": -85.529858, + "city": "Nazareth", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49075, + "latitude": 41.918535, + "longitude": -85.452884, + "city": "Nottawa", + "state": "MI", + "county": "Saint Joseph" + }, + { + "zip_code": 49076, + "latitude": 42.559717, + "longitude": -84.922599, + "city": "Olivet", + "state": "MI", + "county": "Eaton" + }, + { + "zip_code": 49077, + "latitude": 42.245412, + "longitude": -85.529858, + "city": "Oshtemo", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49078, + "latitude": 42.486075, + "longitude": -85.724612, + "city": "Otsego", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49079, + "latitude": 42.243011, + "longitude": -85.930846, + "city": "Paw Paw", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49080, + "latitude": 42.479577, + "longitude": -85.633538, + "city": "Plainwell", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49081, + "latitude": 42.171777, + "longitude": -85.617824, + "city": "Portage", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49082, + "latitude": 41.949119, + "longitude": -85.032201, + "city": "Quincy", + "state": "MI", + "county": "Branch" + }, + { + "zip_code": 49083, + "latitude": 42.376138, + "longitude": -85.454755, + "city": "Richland", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49084, + "latitude": 42.178035, + "longitude": -86.38557, + "city": "Riverside", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49085, + "latitude": 41.977412, + "longitude": -86.533144, + "city": "Saint Joseph", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49087, + "latitude": 42.135078, + "longitude": -85.656846, + "city": "Schoolcraft", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49088, + "latitude": 42.254992, + "longitude": -85.424395, + "city": "Scotts", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49089, + "latitude": 42.000564, + "longitude": -85.225195, + "city": "Sherwood", + "state": "MI", + "county": "Branch" + }, + { + "zip_code": 49090, + "latitude": 42.363778, + "longitude": -86.138952, + "city": "South Haven", + "state": "MI", + "county": "Van Buren" + }, + { + "zip_code": 49091, + "latitude": 41.842913, + "longitude": -85.478265, + "city": "Sturgis", + "state": "MI", + "county": "Saint Joseph" + }, + { + "zip_code": 49092, + "latitude": 42.13422, + "longitude": -84.972831, + "city": "Tekonsha", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49093, + "latitude": 41.928972, + "longitude": -85.538215, + "city": "Three Rivers", + "state": "MI", + "county": "Saint Joseph" + }, + { + "zip_code": 49094, + "latitude": 42.025271, + "longitude": -85.078799, + "city": "Union City", + "state": "MI", + "county": "Branch" + }, + { + "zip_code": 49095, + "latitude": 41.936454, + "longitude": -85.885793, + "city": "Vandalia", + "state": "MI", + "county": "Cass" + }, + { + "zip_code": 49096, + "latitude": 42.639932, + "longitude": -85.004661, + "city": "Vermontville", + "state": "MI", + "county": "Eaton" + }, + { + "zip_code": 49097, + "latitude": 42.17954, + "longitude": -85.473371, + "city": "Vicksburg", + "state": "MI", + "county": "Kalamazoo" + }, + { + "zip_code": 49098, + "latitude": 42.161397, + "longitude": -86.271878, + "city": "Watervliet", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49099, + "latitude": 41.859335, + "longitude": -85.553193, + "city": "White Pigeon", + "state": "MI", + "county": "Saint Joseph" + }, + { + "zip_code": 49101, + "latitude": 41.949647, + "longitude": -86.475504, + "city": "Baroda", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49102, + "latitude": 41.954986, + "longitude": -86.2681, + "city": "Berrien Center", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49103, + "latitude": 41.907363, + "longitude": -86.472582, + "city": "Berrien Springs", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49104, + "latitude": 42.001551, + "longitude": -86.715294, + "city": "Berrien Springs", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49106, + "latitude": 41.942151, + "longitude": -86.544561, + "city": "Bridgman", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49107, + "latitude": 41.841369, + "longitude": -86.429249, + "city": "Buchanan", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49111, + "latitude": 42.027591, + "longitude": -86.299153, + "city": "Eau Claire", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49112, + "latitude": 41.807011, + "longitude": -85.997234, + "city": "Edwardsburg", + "state": "MI", + "county": "Cass" + }, + { + "zip_code": 49113, + "latitude": 41.81146, + "longitude": -86.499237, + "city": "Galien", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49115, + "latitude": 41.877103, + "longitude": -86.630243, + "city": "Harbert", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49116, + "latitude": 41.833625, + "longitude": -86.662174, + "city": "Lakeside", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49117, + "latitude": 41.79273, + "longitude": -86.746022, + "city": "New Buffalo", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49119, + "latitude": 41.868746, + "longitude": -86.547369, + "city": "New Troy", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49120, + "latitude": 41.844732, + "longitude": -86.421005, + "city": "Niles", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49121, + "latitude": 42.001551, + "longitude": -86.715294, + "city": "Niles", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49125, + "latitude": 41.899733, + "longitude": -86.571325, + "city": "Sawyer", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49126, + "latitude": 42.029487, + "longitude": -86.378199, + "city": "Sodus", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49127, + "latitude": 42.00743, + "longitude": -86.508146, + "city": "Stevensville", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49128, + "latitude": 41.827553, + "longitude": -86.600498, + "city": "Three Oaks", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49129, + "latitude": 41.825532, + "longitude": -86.684816, + "city": "Union Pier", + "state": "MI", + "county": "Berrien" + }, + { + "zip_code": 49130, + "latitude": 41.800617, + "longitude": -85.866011, + "city": "Union", + "state": "MI", + "county": "Cass" + }, + { + "zip_code": 49201, + "latitude": 42.248979, + "longitude": -84.421104, + "city": "Jackson", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49202, + "latitude": 42.275635, + "longitude": -84.398207, + "city": "Jackson", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49203, + "latitude": 42.186861, + "longitude": -84.46471, + "city": "Jackson", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49204, + "latitude": 42.252847, + "longitude": -84.213755, + "city": "Jackson", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49220, + "latitude": 41.985346, + "longitude": -84.314543, + "city": "Addison", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49221, + "latitude": 41.889943, + "longitude": -84.065892, + "city": "Adrian", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49224, + "latitude": 42.2906, + "longitude": -84.792885, + "city": "Albion", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49227, + "latitude": 41.956346, + "longitude": -84.767913, + "city": "Allen", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49228, + "latitude": 41.852645, + "longitude": -83.873899, + "city": "Blissfield", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49229, + "latitude": 41.997944, + "longitude": -83.857925, + "city": "Britton", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49230, + "latitude": 42.160388, + "longitude": -84.388821, + "city": "Brooklyn", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49232, + "latitude": 41.747377, + "longitude": -84.638542, + "city": "Camden", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49233, + "latitude": 42.048091, + "longitude": -84.315009, + "city": "Cement City", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49234, + "latitude": 42.119607, + "longitude": -84.369085, + "city": "Clarklake", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49235, + "latitude": 41.930577, + "longitude": -84.156209, + "city": "Clayton", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49236, + "latitude": 42.061881, + "longitude": -83.957586, + "city": "Clinton", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49237, + "latitude": 42.186022, + "longitude": -84.641897, + "city": "Concord", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49238, + "latitude": 41.900279, + "longitude": -83.817849, + "city": "Deerfield", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49239, + "latitude": 41.782499, + "longitude": -84.604662, + "city": "Frontier", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49240, + "latitude": 42.258533, + "longitude": -84.344285, + "city": "Grass Lake", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49241, + "latitude": 42.111258, + "longitude": -84.601588, + "city": "Hanover", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49242, + "latitude": 41.853903, + "longitude": -84.582913, + "city": "Hillsdale", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49245, + "latitude": 42.144355, + "longitude": -84.848182, + "city": "Homer", + "state": "MI", + "county": "Calhoun" + }, + { + "zip_code": 49246, + "latitude": 42.131129, + "longitude": -84.479081, + "city": "Horton", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49247, + "latitude": 41.870383, + "longitude": -84.095955, + "city": "Hudson", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49248, + "latitude": 41.770362, + "longitude": -84.001125, + "city": "Jasper", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49249, + "latitude": 42.029587, + "longitude": -84.468662, + "city": "Jerome", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49250, + "latitude": 41.898745, + "longitude": -84.585577, + "city": "Jonesville", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49251, + "latitude": 42.478186, + "longitude": -84.407118, + "city": "Leslie", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 49252, + "latitude": 42.029101, + "longitude": -84.619228, + "city": "Litchfield", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49253, + "latitude": 41.970384, + "longitude": -84.270369, + "city": "Manitou Beach", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49254, + "latitude": 42.208747, + "longitude": -84.465922, + "city": "Michigan Center", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49255, + "latitude": 41.792652, + "longitude": -84.900917, + "city": "Montgomery", + "state": "MI", + "county": "Branch" + }, + { + "zip_code": 49256, + "latitude": 41.84736, + "longitude": -84.229012, + "city": "Morenci", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49257, + "latitude": 42.054795, + "longitude": -84.503905, + "city": "Moscow", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49258, + "latitude": 41.884795, + "longitude": -84.593491, + "city": "Mosherville", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49259, + "latitude": 42.360385, + "longitude": -84.233087, + "city": "Munith", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49261, + "latitude": 42.164338, + "longitude": -84.24575, + "city": "Napoleon", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49262, + "latitude": 41.963943, + "longitude": -84.473084, + "city": "North Adams", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49263, + "latitude": 42.158189, + "longitude": -84.183828, + "city": "Norvell", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49264, + "latitude": 42.472836, + "longitude": -84.541672, + "city": "Onondaga", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 49265, + "latitude": 42.007537, + "longitude": -84.182082, + "city": "Onsted", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49266, + "latitude": 41.832935, + "longitude": -84.548539, + "city": "Osseo", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49267, + "latitude": 41.772724, + "longitude": -83.704835, + "city": "Ottawa Lake", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 49268, + "latitude": 41.86957, + "longitude": -83.920024, + "city": "Palmyra", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49269, + "latitude": 42.257902, + "longitude": -84.580681, + "city": "Parma", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49270, + "latitude": 41.865026, + "longitude": -83.670689, + "city": "Petersburg", + "state": "MI", + "county": "Monroe" + }, + { + "zip_code": 49271, + "latitude": 41.854948, + "longitude": -84.452585, + "city": "Pittsford", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49272, + "latitude": 42.387785, + "longitude": -84.347636, + "city": "Pleasant Lake", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49274, + "latitude": 41.846897, + "longitude": -84.728441, + "city": "Reading", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49275, + "latitude": 41.988026, + "longitude": -83.865674, + "city": "Ridgeway", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49276, + "latitude": 41.791518, + "longitude": -83.814189, + "city": "Riga", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49277, + "latitude": 42.384636, + "longitude": -84.465133, + "city": "Rives Junction", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49278, + "latitude": 41.912292, + "longitude": -84.32652, + "city": "Rollin", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49279, + "latitude": 41.775793, + "longitude": -84.112125, + "city": "Sand Creek", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49280, + "latitude": 41.79583, + "longitude": -84.186608, + "city": "Seneca", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49281, + "latitude": 42.023026, + "longitude": -84.379391, + "city": "Somerset", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49282, + "latitude": 42.050199, + "longitude": -84.392191, + "city": "Somerset Center", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49283, + "latitude": 42.272863, + "longitude": -84.605612, + "city": "Spring Arbor", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49284, + "latitude": 42.37823, + "longitude": -84.630106, + "city": "Springport", + "state": "MI", + "county": "Jackson" + }, + { + "zip_code": 49285, + "latitude": 42.496734, + "longitude": -84.24306, + "city": "Stockbridge", + "state": "MI", + "county": "Ingham" + }, + { + "zip_code": 49286, + "latitude": 42.008398, + "longitude": -83.922214, + "city": "Tecumseh", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49287, + "latitude": 42.02172, + "longitude": -84.064971, + "city": "Tipton", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49288, + "latitude": 41.743114, + "longitude": -84.447488, + "city": "Waldron", + "state": "MI", + "county": "Hillsdale" + }, + { + "zip_code": 49289, + "latitude": 41.768254, + "longitude": -84.107609, + "city": "Weston", + "state": "MI", + "county": "Lenawee" + }, + { + "zip_code": 49301, + "latitude": 42.963833, + "longitude": -85.482266, + "city": "Ada", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49302, + "latitude": 42.856096, + "longitude": -85.402859, + "city": "Alto", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49303, + "latitude": 43.272182, + "longitude": -85.854471, + "city": "Bailey", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49304, + "latitude": 43.929225, + "longitude": -85.840774, + "city": "Baldwin", + "state": "MI", + "county": "Lake" + }, + { + "zip_code": 49305, + "latitude": 43.737488, + "longitude": -85.166327, + "city": "Barryton", + "state": "MI", + "county": "Mecosta" + }, + { + "zip_code": 49306, + "latitude": 43.074996, + "longitude": -85.563211, + "city": "Belmont", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49307, + "latitude": 43.683493, + "longitude": -85.3518, + "city": "Big Rapids", + "state": "MI", + "county": "Mecosta" + }, + { + "zip_code": 49309, + "latitude": 43.712217, + "longitude": -85.860379, + "city": "Bitely", + "state": "MI", + "county": "Newaygo" + }, + { + "zip_code": 49310, + "latitude": 43.552836, + "longitude": -84.966988, + "city": "Blanchard", + "state": "MI", + "county": "Isabella" + }, + { + "zip_code": 49311, + "latitude": 42.633006, + "longitude": -85.643043, + "city": "Bradley", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49312, + "latitude": 43.666006, + "longitude": -85.791055, + "city": "Brohman", + "state": "MI", + "county": "Newaygo" + }, + { + "zip_code": 49314, + "latitude": 42.731193, + "longitude": -85.840372, + "city": "Burnips", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49315, + "latitude": 42.835828, + "longitude": -85.664425, + "city": "Byron Center", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49316, + "latitude": 42.81868, + "longitude": -85.524437, + "city": "Caledonia", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49317, + "latitude": 43.071201, + "longitude": -85.480856, + "city": "Cannonsburg", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49318, + "latitude": 43.234658, + "longitude": -85.840115, + "city": "Casnovia", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49319, + "latitude": 43.175953, + "longitude": -85.514105, + "city": "Cedar Springs", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49320, + "latitude": 43.755335, + "longitude": -85.278303, + "city": "Chippewa Lake", + "state": "MI", + "county": "Mecosta" + }, + { + "zip_code": 49321, + "latitude": 43.081164, + "longitude": -85.679652, + "city": "Comstock Park", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49322, + "latitude": 43.359517, + "longitude": -85.353161, + "city": "Coral", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 49323, + "latitude": 42.721585, + "longitude": -85.788666, + "city": "Dorr", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49325, + "latitude": 42.738867, + "longitude": -85.364444, + "city": "Freeport", + "state": "MI", + "county": "Barry" + }, + { + "zip_code": 49326, + "latitude": 43.310955, + "longitude": -85.21072, + "city": "Gowen", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 49327, + "latitude": 43.539032, + "longitude": -85.850409, + "city": "Grant", + "state": "MI", + "county": "Newaygo" + }, + { + "zip_code": 49328, + "latitude": 42.623664, + "longitude": -85.780339, + "city": "Hopkins", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49329, + "latitude": 43.382007, + "longitude": -85.442836, + "city": "Howard City", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 49330, + "latitude": 43.23506, + "longitude": -85.670248, + "city": "Kent City", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49331, + "latitude": 42.969378, + "longitude": -85.384134, + "city": "Lowell", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49332, + "latitude": 43.60077, + "longitude": -85.31329, + "city": "Mecosta", + "state": "MI", + "county": "Mecosta" + }, + { + "zip_code": 49333, + "latitude": 42.670351, + "longitude": -85.427281, + "city": "Middleville", + "state": "MI", + "county": "Barry" + }, + { + "zip_code": 49335, + "latitude": 42.736987, + "longitude": -85.663538, + "city": "Moline", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49336, + "latitude": 43.52199, + "longitude": -85.423262, + "city": "Morley", + "state": "MI", + "county": "Mecosta" + }, + { + "zip_code": 49337, + "latitude": 43.444927, + "longitude": -85.73898, + "city": "Newaygo", + "state": "MI", + "county": "Newaygo" + }, + { + "zip_code": 49338, + "latitude": 43.72777, + "longitude": -85.365385, + "city": "Paris", + "state": "MI", + "county": "Mecosta" + }, + { + "zip_code": 49339, + "latitude": 43.368549, + "longitude": -85.473124, + "city": "Pierson", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 49340, + "latitude": 43.637851, + "longitude": -85.198945, + "city": "Remus", + "state": "MI", + "county": "Mecosta" + }, + { + "zip_code": 49341, + "latitude": 43.132429, + "longitude": -85.551631, + "city": "Rockford", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49342, + "latitude": 43.691187, + "longitude": -85.318534, + "city": "Rodney", + "state": "MI", + "county": "Mecosta" + }, + { + "zip_code": 49343, + "latitude": 43.258296, + "longitude": -85.504509, + "city": "Sand Lake", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49344, + "latitude": 42.612772, + "longitude": -85.612828, + "city": "Shelbyville", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49345, + "latitude": 43.157685, + "longitude": -85.683555, + "city": "Sparta", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49346, + "latitude": 43.590861, + "longitude": -85.403676, + "city": "Stanwood", + "state": "MI", + "county": "Mecosta" + }, + { + "zip_code": 49347, + "latitude": 43.330898, + "longitude": -85.414422, + "city": "Trufant", + "state": "MI", + "county": "Montcalm" + }, + { + "zip_code": 49348, + "latitude": 42.685065, + "longitude": -85.642406, + "city": "Wayland", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49349, + "latitude": 43.611483, + "longitude": -85.797989, + "city": "White Cloud", + "state": "MI", + "county": "Newaygo" + }, + { + "zip_code": 49351, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Rockford", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49355, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Ada", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49356, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Ada", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49357, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Ada", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49401, + "latitude": 42.979522, + "longitude": -85.93927, + "city": "Allendale", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49402, + "latitude": 43.967633, + "longitude": -85.980028, + "city": "Branch", + "state": "MI", + "county": "Lake" + }, + { + "zip_code": 49403, + "latitude": 43.118172, + "longitude": -85.848391, + "city": "Conklin", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49404, + "latitude": 43.062122, + "longitude": -85.959758, + "city": "Coopersville", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49405, + "latitude": 43.932434, + "longitude": -86.177683, + "city": "Custer", + "state": "MI", + "county": "Mason" + }, + { + "zip_code": 49406, + "latitude": 42.636883, + "longitude": -86.202158, + "city": "Douglas", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49408, + "latitude": 42.542809, + "longitude": -86.11849, + "city": "Fennville", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49409, + "latitude": 43.080865, + "longitude": -86.215413, + "city": "Ferrysburg", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49410, + "latitude": 44.030126, + "longitude": -86.142483, + "city": "Fountain", + "state": "MI", + "county": "Mason" + }, + { + "zip_code": 49411, + "latitude": 44.071924, + "longitude": -86.252729, + "city": "Free Soil", + "state": "MI", + "county": "Mason" + }, + { + "zip_code": 49412, + "latitude": 43.513456, + "longitude": -85.9132, + "city": "Fremont", + "state": "MI", + "county": "Newaygo" + }, + { + "zip_code": 49413, + "latitude": 43.554311, + "longitude": -85.800884, + "city": "Fremont", + "state": "MI", + "county": "Newaygo" + }, + { + "zip_code": 49415, + "latitude": 43.275502, + "longitude": -86.07655, + "city": "Fruitport", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49416, + "latitude": 42.630533, + "longitude": -86.072032, + "city": "Glenn", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49417, + "latitude": 43.008786, + "longitude": -86.129031, + "city": "Grand Haven", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49418, + "latitude": 42.882726, + "longitude": -85.753056, + "city": "Grandville", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49419, + "latitude": 42.693859, + "longitude": -85.980959, + "city": "Hamilton", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49420, + "latitude": 43.700968, + "longitude": -86.334122, + "city": "Hart", + "state": "MI", + "county": "Oceana" + }, + { + "zip_code": 49421, + "latitude": 43.574326, + "longitude": -86.223175, + "city": "Hesperia", + "state": "MI", + "county": "Oceana" + }, + { + "zip_code": 49422, + "latitude": 42.985596, + "longitude": -86.444751, + "city": "Holland", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49423, + "latitude": 42.812579, + "longitude": -86.037218, + "city": "Holland", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49424, + "latitude": 42.924578, + "longitude": -86.121901, + "city": "Holland", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49425, + "latitude": 43.417206, + "longitude": -86.130268, + "city": "Holton", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49426, + "latitude": 42.861575, + "longitude": -85.935917, + "city": "Hudsonville", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49427, + "latitude": 42.826676, + "longitude": -85.844378, + "city": "Jamestown", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49428, + "latitude": 42.918544, + "longitude": -85.842586, + "city": "Jenison", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49429, + "latitude": 42.985596, + "longitude": -86.444751, + "city": "Jenison", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49430, + "latitude": 43.010337, + "longitude": -85.89754, + "city": "Lamont", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49431, + "latitude": 43.998926, + "longitude": -86.349439, + "city": "Ludington", + "state": "MI", + "county": "Mason" + }, + { + "zip_code": 49434, + "latitude": 42.76973, + "longitude": -86.205471, + "city": "Macatawa", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49435, + "latitude": 43.023673, + "longitude": -85.844039, + "city": "Marne", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49436, + "latitude": 43.681533, + "longitude": -86.468975, + "city": "Mears", + "state": "MI", + "county": "Oceana" + }, + { + "zip_code": 49437, + "latitude": 43.42404, + "longitude": -86.339517, + "city": "Montague", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49440, + "latitude": 43.233764, + "longitude": -86.232858, + "city": "Muskegon", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49441, + "latitude": 43.245871, + "longitude": -86.264015, + "city": "Muskegon", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49442, + "latitude": 43.237314, + "longitude": -86.14768, + "city": "Muskegon", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49443, + "latitude": 43.295493, + "longitude": -86.468853, + "city": "Muskegon", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49444, + "latitude": 43.245821, + "longitude": -86.185694, + "city": "Muskegon", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49445, + "latitude": 43.295208, + "longitude": -86.278985, + "city": "Muskegon", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49446, + "latitude": 43.536651, + "longitude": -86.322856, + "city": "New Era", + "state": "MI", + "county": "Oceana" + }, + { + "zip_code": 49448, + "latitude": 43.080186, + "longitude": -86.068544, + "city": "Nunica", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49449, + "latitude": 43.728586, + "longitude": -86.291994, + "city": "Pentwater", + "state": "MI", + "county": "Oceana" + }, + { + "zip_code": 49450, + "latitude": 42.483692, + "longitude": -86.06653, + "city": "Pullman", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49451, + "latitude": 43.20596, + "longitude": -85.968106, + "city": "Ravenna", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49452, + "latitude": 43.626346, + "longitude": -86.233687, + "city": "Rothbury", + "state": "MI", + "county": "Oceana" + }, + { + "zip_code": 49453, + "latitude": 42.645611, + "longitude": -86.165451, + "city": "Saugatuck", + "state": "MI", + "county": "Allegan" + }, + { + "zip_code": 49454, + "latitude": 43.940385, + "longitude": -86.26351, + "city": "Scottville", + "state": "MI", + "county": "Mason" + }, + { + "zip_code": 49455, + "latitude": 43.638343, + "longitude": -86.349283, + "city": "Shelby", + "state": "MI", + "county": "Oceana" + }, + { + "zip_code": 49456, + "latitude": 43.076609, + "longitude": -86.19538, + "city": "Spring Lake", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49457, + "latitude": 43.358015, + "longitude": -86.157722, + "city": "Twin Lake", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49458, + "latitude": 43.949422, + "longitude": -86.10421, + "city": "Walhalla", + "state": "MI", + "county": "Mason" + }, + { + "zip_code": 49459, + "latitude": 43.721873, + "longitude": -86.141107, + "city": "Walkerville", + "state": "MI", + "county": "Oceana" + }, + { + "zip_code": 49460, + "latitude": 42.929518, + "longitude": -86.095232, + "city": "West Olive", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49461, + "latitude": 43.345831, + "longitude": -86.327092, + "city": "Whitehall", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49463, + "latitude": 43.295493, + "longitude": -86.468853, + "city": "Wabaningo", + "state": "MI", + "county": "Muskegon" + }, + { + "zip_code": 49464, + "latitude": 42.869816, + "longitude": -85.969722, + "city": "Zeeland", + "state": "MI", + "county": "Ottawa" + }, + { + "zip_code": 49468, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grandville", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49501, + "latitude": 42.984226, + "longitude": -85.629101, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49502, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49503, + "latitude": 42.956176, + "longitude": -85.660693, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49504, + "latitude": 42.973687, + "longitude": -85.726496, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49505, + "latitude": 43.017776, + "longitude": -85.611596, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49506, + "latitude": 42.943577, + "longitude": -85.577113, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49507, + "latitude": 42.930777, + "longitude": -85.656978, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49508, + "latitude": 42.889378, + "longitude": -85.621876, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49509, + "latitude": 42.899917, + "longitude": -85.710077, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49510, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49512, + "latitude": 42.880192, + "longitude": -85.535214, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49514, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49515, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49516, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49518, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49523, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49525, + "latitude": 43.013527, + "longitude": -85.602729, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49530, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49544, + "latitude": 43.007274, + "longitude": -85.725535, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49546, + "latitude": 42.930146, + "longitude": -85.53904, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49548, + "latitude": 42.864793, + "longitude": -85.615175, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49550, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49555, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49560, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49588, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49599, + "latitude": 43.031413, + "longitude": -85.550267, + "city": "Grand Rapids", + "state": "MI", + "county": "Kent" + }, + { + "zip_code": 49601, + "latitude": 44.335278, + "longitude": -85.549093, + "city": "Cadillac", + "state": "MI", + "county": "Wexford" + }, + { + "zip_code": 49610, + "latitude": 44.789382, + "longitude": -85.488449, + "city": "Acme", + "state": "MI", + "county": "Grand Traverse" + }, + { + "zip_code": 49611, + "latitude": 44.983262, + "longitude": -84.961776, + "city": "Alba", + "state": "MI", + "county": "Antrim" + }, + { + "zip_code": 49612, + "latitude": 44.900641, + "longitude": -85.232932, + "city": "Alden", + "state": "MI", + "county": "Antrim" + }, + { + "zip_code": 49613, + "latitude": 44.478837, + "longitude": -86.209391, + "city": "Arcadia", + "state": "MI", + "county": "Manistee" + }, + { + "zip_code": 49614, + "latitude": 44.396671, + "longitude": -86.116727, + "city": "Bear Lake", + "state": "MI", + "county": "Manistee" + }, + { + "zip_code": 49615, + "latitude": 44.997248, + "longitude": -85.198742, + "city": "Bellaire", + "state": "MI", + "county": "Antrim" + }, + { + "zip_code": 49616, + "latitude": 44.574478, + "longitude": -86.07937, + "city": "Benzonia", + "state": "MI", + "county": "Benzie" + }, + { + "zip_code": 49617, + "latitude": 44.630634, + "longitude": -86.002509, + "city": "Beulah", + "state": "MI", + "county": "Benzie" + }, + { + "zip_code": 49618, + "latitude": 44.289721, + "longitude": -85.675458, + "city": "Boon", + "state": "MI", + "county": "Wexford" + }, + { + "zip_code": 49619, + "latitude": 44.309195, + "longitude": -85.972541, + "city": "Brethren", + "state": "MI", + "county": "Manistee" + }, + { + "zip_code": 49620, + "latitude": 44.465123, + "longitude": -85.681485, + "city": "Buckley", + "state": "MI", + "county": "Wexford" + }, + { + "zip_code": 49621, + "latitude": 44.860517, + "longitude": -85.813768, + "city": "Cedar", + "state": "MI", + "county": "Leelanau" + }, + { + "zip_code": 49622, + "latitude": 45.075986, + "longitude": -85.25591, + "city": "Central Lake", + "state": "MI", + "county": "Antrim" + }, + { + "zip_code": 49623, + "latitude": 43.95217, + "longitude": -85.672695, + "city": "Chase", + "state": "MI", + "county": "Lake" + }, + { + "zip_code": 49625, + "latitude": 44.42757, + "longitude": -86.028192, + "city": "Copemish", + "state": "MI", + "county": "Manistee" + }, + { + "zip_code": 49626, + "latitude": 44.241337, + "longitude": -86.291309, + "city": "Eastlake", + "state": "MI", + "county": "Manistee" + }, + { + "zip_code": 49627, + "latitude": 45.08806, + "longitude": -85.3219, + "city": "Eastport", + "state": "MI", + "county": "Antrim" + }, + { + "zip_code": 49628, + "latitude": 44.599526, + "longitude": -86.21407, + "city": "Elberta", + "state": "MI", + "county": "Benzie" + }, + { + "zip_code": 49629, + "latitude": 44.92902, + "longitude": -85.319467, + "city": "Elk Rapids", + "state": "MI", + "county": "Antrim" + }, + { + "zip_code": 49630, + "latitude": 44.837888, + "longitude": -85.976477, + "city": "Empire", + "state": "MI", + "county": "Leelanau" + }, + { + "zip_code": 49631, + "latitude": 43.958084, + "longitude": -85.302063, + "city": "Evart", + "state": "MI", + "county": "Osceola" + }, + { + "zip_code": 49632, + "latitude": 44.242162, + "longitude": -85.043655, + "city": "Falmouth", + "state": "MI", + "county": "Missaukee" + }, + { + "zip_code": 49633, + "latitude": 44.584533, + "longitude": -85.393948, + "city": "Fife Lake", + "state": "MI", + "county": "Grand Traverse" + }, + { + "zip_code": 49634, + "latitude": 44.238191, + "longitude": -86.057975, + "city": "Filer City", + "state": "MI", + "county": "Manistee" + }, + { + "zip_code": 49635, + "latitude": 44.613058, + "longitude": -86.177255, + "city": "Frankfort", + "state": "MI", + "county": "Benzie" + }, + { + "zip_code": 49636, + "latitude": 44.873421, + "longitude": -85.98867, + "city": "Glen Arbor", + "state": "MI", + "county": "Leelanau" + }, + { + "zip_code": 49637, + "latitude": 44.634126, + "longitude": -85.703494, + "city": "Grawn", + "state": "MI", + "county": "Grand Traverse" + }, + { + "zip_code": 49638, + "latitude": 44.280319, + "longitude": -85.710694, + "city": "Harrietta", + "state": "MI", + "county": "Wexford" + }, + { + "zip_code": 49639, + "latitude": 43.981883, + "longitude": -85.360457, + "city": "Hersey", + "state": "MI", + "county": "Osceola" + }, + { + "zip_code": 49640, + "latitude": 44.690037, + "longitude": -86.050384, + "city": "Honor", + "state": "MI", + "county": "Benzie" + }, + { + "zip_code": 49642, + "latitude": 43.887179, + "longitude": -85.775872, + "city": "Idlewild", + "state": "MI", + "county": "Lake" + }, + { + "zip_code": 49643, + "latitude": 44.633562, + "longitude": -85.782278, + "city": "Interlochen", + "state": "MI", + "county": "Grand Traverse" + }, + { + "zip_code": 49644, + "latitude": 44.091983, + "longitude": -85.90658, + "city": "Irons", + "state": "MI", + "county": "Lake" + }, + { + "zip_code": 49645, + "latitude": 44.377928, + "longitude": -86.041189, + "city": "Kaleva", + "state": "MI", + "county": "Manistee" + }, + { + "zip_code": 49646, + "latitude": 44.697144, + "longitude": -85.092905, + "city": "Kalkaska", + "state": "MI", + "county": "Kalkaska" + }, + { + "zip_code": 49648, + "latitude": 45.006971, + "longitude": -85.355394, + "city": "Kewadin", + "state": "MI", + "county": "Antrim" + }, + { + "zip_code": 49649, + "latitude": 44.577555, + "longitude": -85.530156, + "city": "Kingsley", + "state": "MI", + "county": "Grand Traverse" + }, + { + "zip_code": 49650, + "latitude": 44.722002, + "longitude": -85.882364, + "city": "Lake Ann", + "state": "MI", + "county": "Benzie" + }, + { + "zip_code": 49651, + "latitude": 44.376692, + "longitude": -85.0946, + "city": "Lake City", + "state": "MI", + "county": "Missaukee" + }, + { + "zip_code": 49653, + "latitude": 44.980451, + "longitude": -85.736199, + "city": "Lake Leelanau", + "state": "MI", + "county": "Leelanau" + }, + { + "zip_code": 49654, + "latitude": 44.989416, + "longitude": -85.770227, + "city": "Leland", + "state": "MI", + "county": "Leelanau" + }, + { + "zip_code": 49655, + "latitude": 44.013375, + "longitude": -85.32548, + "city": "Leroy", + "state": "MI", + "county": "Osceola" + }, + { + "zip_code": 49656, + "latitude": 44.04206, + "longitude": -85.712873, + "city": "Luther", + "state": "MI", + "county": "Lake" + }, + { + "zip_code": 49657, + "latitude": 44.258292, + "longitude": -85.154382, + "city": "Mc Bain", + "state": "MI", + "county": "Missaukee" + }, + { + "zip_code": 49659, + "latitude": 44.947938, + "longitude": -85.122624, + "city": "Mancelona", + "state": "MI", + "county": "Antrim" + }, + { + "zip_code": 49660, + "latitude": 44.263534, + "longitude": -86.182473, + "city": "Manistee", + "state": "MI", + "county": "Manistee" + }, + { + "zip_code": 49663, + "latitude": 44.412765, + "longitude": -85.468268, + "city": "Manton", + "state": "MI", + "county": "Wexford" + }, + { + "zip_code": 49664, + "latitude": 44.869321, + "longitude": -85.902284, + "city": "Maple City", + "state": "MI", + "county": "Leelanau" + }, + { + "zip_code": 49665, + "latitude": 43.989936, + "longitude": -85.271121, + "city": "Marion", + "state": "MI", + "county": "Osceola" + }, + { + "zip_code": 49666, + "latitude": 44.625041, + "longitude": -85.542496, + "city": "Mayfield", + "state": "MI", + "county": "Grand Traverse" + }, + { + "zip_code": 49667, + "latitude": 44.343261, + "longitude": -84.944639, + "city": "Merritt", + "state": "MI", + "county": "Missaukee" + }, + { + "zip_code": 49668, + "latitude": 44.39912, + "longitude": -85.629669, + "city": "Mesick", + "state": "MI", + "county": "Wexford" + }, + { + "zip_code": 49670, + "latitude": 45.12216, + "longitude": -85.61847, + "city": "Northport", + "state": "MI", + "county": "Leelanau" + }, + { + "zip_code": 49673, + "latitude": 44.955872, + "longitude": -85.490005, + "city": "Old Mission", + "state": "MI", + "county": "Grand Traverse" + }, + { + "zip_code": 49674, + "latitude": 45.066568, + "longitude": -85.597374, + "city": "Omena", + "state": "MI", + "county": "Leelanau" + }, + { + "zip_code": 49675, + "latitude": 44.418184, + "longitude": -86.222187, + "city": "Onekama", + "state": "MI", + "county": "Manistee" + }, + { + "zip_code": 49676, + "latitude": 44.80389, + "longitude": -85.250629, + "city": "Rapid City", + "state": "MI", + "county": "Kalkaska" + }, + { + "zip_code": 49677, + "latitude": 43.952029, + "longitude": -85.414718, + "city": "Reed City", + "state": "MI", + "county": "Osceola" + }, + { + "zip_code": 49679, + "latitude": 43.963767, + "longitude": -85.187258, + "city": "Sears", + "state": "MI", + "county": "Osceola" + }, + { + "zip_code": 49680, + "latitude": 44.634438, + "longitude": -85.252891, + "city": "South Boardman", + "state": "MI", + "county": "Kalkaska" + }, + { + "zip_code": 49682, + "latitude": 44.988569, + "longitude": -85.644068, + "city": "Suttons Bay", + "state": "MI", + "county": "Leelanau" + }, + { + "zip_code": 49683, + "latitude": 44.58678, + "longitude": -85.931969, + "city": "Thompsonville", + "state": "MI", + "county": "Benzie" + }, + { + "zip_code": 49684, + "latitude": 44.693963, + "longitude": -85.676342, + "city": "Traverse City", + "state": "MI", + "county": "Grand Traverse" + }, + { + "zip_code": 49685, + "latitude": 44.816178, + "longitude": -85.575147, + "city": "Traverse City", + "state": "MI", + "county": "Grand Traverse" + }, + { + "zip_code": 49686, + "latitude": 44.784919, + "longitude": -85.490673, + "city": "Traverse City", + "state": "MI", + "county": "Grand Traverse" + }, + { + "zip_code": 49688, + "latitude": 44.112055, + "longitude": -85.405091, + "city": "Tustin", + "state": "MI", + "county": "Osceola" + }, + { + "zip_code": 49689, + "latitude": 44.330169, + "longitude": -86.027194, + "city": "Wellston", + "state": "MI", + "county": "Manistee" + }, + { + "zip_code": 49690, + "latitude": 44.767181, + "longitude": -85.427605, + "city": "Williamsburg", + "state": "MI", + "county": "Grand Traverse" + }, + { + "zip_code": 49696, + "latitude": 44.816178, + "longitude": -85.575147, + "city": "Traverse City", + "state": "MI", + "county": "Grand Traverse" + }, + { + "zip_code": 49701, + "latitude": 45.753019, + "longitude": -84.691745, + "city": "Mackinaw City", + "state": "MI", + "county": "Cheboygan" + }, + { + "zip_code": 49705, + "latitude": 45.366479, + "longitude": -84.429893, + "city": "Afton", + "state": "MI", + "county": "Cheboygan" + }, + { + "zip_code": 49706, + "latitude": 45.539802, + "longitude": -84.805792, + "city": "Alanson", + "state": "MI", + "county": "Emmet" + }, + { + "zip_code": 49707, + "latitude": 45.033143, + "longitude": -83.495091, + "city": "Alpena", + "state": "MI", + "county": "Alpena" + }, + { + "zip_code": 49709, + "latitude": 45.030626, + "longitude": -84.173067, + "city": "Atlanta", + "state": "MI", + "county": "Montmorency" + }, + { + "zip_code": 49710, + "latitude": 46.278437, + "longitude": -84.196899, + "city": "Barbeau", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49711, + "latitude": 45.523425, + "longitude": -85.332038, + "city": "Bay Shore", + "state": "MI", + "county": "Charlevoix" + }, + { + "zip_code": 49712, + "latitude": 45.226478, + "longitude": -85.016896, + "city": "Boyne City", + "state": "MI", + "county": "Charlevoix" + }, + { + "zip_code": 49713, + "latitude": 45.203875, + "longitude": -84.848126, + "city": "Boyne Falls", + "state": "MI", + "county": "Charlevoix" + }, + { + "zip_code": 49715, + "latitude": 46.389131, + "longitude": -84.698136, + "city": "Brimley", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49716, + "latitude": 45.506991, + "longitude": -84.703893, + "city": "Brutus", + "state": "MI", + "county": "Cheboygan" + }, + { + "zip_code": 49717, + "latitude": 45.430705, + "longitude": -84.691207, + "city": "Burt Lake", + "state": "MI", + "county": "Cheboygan" + }, + { + "zip_code": 49718, + "latitude": 45.59626, + "longitude": -84.851386, + "city": "Carp Lake", + "state": "MI", + "county": "Emmet" + }, + { + "zip_code": 49719, + "latitude": 46.007211, + "longitude": -84.276199, + "city": "Cedarville", + "state": "MI", + "county": "Mackinac" + }, + { + "zip_code": 49720, + "latitude": 45.26536, + "longitude": -85.229723, + "city": "Charlevoix", + "state": "MI", + "county": "Charlevoix" + }, + { + "zip_code": 49721, + "latitude": 45.592842, + "longitude": -84.468639, + "city": "Cheboygan", + "state": "MI", + "county": "Cheboygan" + }, + { + "zip_code": 49722, + "latitude": 45.423616, + "longitude": -84.852401, + "city": "Conway", + "state": "MI", + "county": "Emmet" + }, + { + "zip_code": 49723, + "latitude": 45.625353, + "longitude": -85.041872, + "city": "Cross Village", + "state": "MI", + "county": "Emmet" + }, + { + "zip_code": 49724, + "latitude": 46.311604, + "longitude": -84.617131, + "city": "Dafter", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49725, + "latitude": 45.997182, + "longitude": -83.923941, + "city": "De Tour Village", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49726, + "latitude": 46.011531, + "longitude": -83.692502, + "city": "Drummond Island", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49727, + "latitude": 45.203995, + "longitude": -85.102843, + "city": "East Jordan", + "state": "MI", + "county": "Charlevoix" + }, + { + "zip_code": 49728, + "latitude": 46.536871, + "longitude": -84.862889, + "city": "Eckerman", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49729, + "latitude": 45.156457, + "longitude": -85.303853, + "city": "Ellsworth", + "state": "MI", + "county": "Antrim" + }, + { + "zip_code": 49730, + "latitude": 45.02396, + "longitude": -84.755439, + "city": "Elmira", + "state": "MI", + "county": "Otsego" + }, + { + "zip_code": 49733, + "latitude": 44.786738, + "longitude": -84.697844, + "city": "Frederic", + "state": "MI", + "county": "Crawford" + }, + { + "zip_code": 49734, + "latitude": 45.028411, + "longitude": -84.612207, + "city": "Gaylord", + "state": "MI", + "county": "Otsego" + }, + { + "zip_code": 49735, + "latitude": 45.000937, + "longitude": -84.624586, + "city": "Gaylord", + "state": "MI", + "county": "Otsego" + }, + { + "zip_code": 49736, + "latitude": 46.078984, + "longitude": -84.144989, + "city": "Goetzville", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49737, + "latitude": 45.580183, + "longitude": -85.113678, + "city": "Good Hart", + "state": "MI", + "county": "Emmet" + }, + { + "zip_code": 49738, + "latitude": 44.691777, + "longitude": -84.612941, + "city": "Grayling", + "state": "MI", + "county": "Crawford" + }, + { + "zip_code": 49739, + "latitude": 44.682996, + "longitude": -84.610441, + "city": "Grayling", + "state": "MI", + "county": "Crawford" + }, + { + "zip_code": 49740, + "latitude": 45.55423, + "longitude": -84.925826, + "city": "Harbor Springs", + "state": "MI", + "county": "Emmet" + }, + { + "zip_code": 49743, + "latitude": 45.283467, + "longitude": -83.873719, + "city": "Hawks", + "state": "MI", + "county": "Presque Isle" + }, + { + "zip_code": 49744, + "latitude": 44.996329, + "longitude": -83.667641, + "city": "Herron", + "state": "MI", + "county": "Alpena" + }, + { + "zip_code": 49745, + "latitude": 46.021715, + "longitude": -84.42845, + "city": "Hessel", + "state": "MI", + "county": "Mackinac" + }, + { + "zip_code": 49746, + "latitude": 45.05958, + "longitude": -84.022691, + "city": "Hillman", + "state": "MI", + "county": "Montmorency" + }, + { + "zip_code": 49747, + "latitude": 44.909723, + "longitude": -83.608911, + "city": "Hubbard Lake", + "state": "MI", + "county": "Alpena" + }, + { + "zip_code": 49748, + "latitude": 46.390752, + "longitude": -85.176386, + "city": "Hulbert", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49749, + "latitude": 45.447209, + "longitude": -84.578019, + "city": "Indian River", + "state": "MI", + "county": "Cheboygan" + }, + { + "zip_code": 49751, + "latitude": 44.963223, + "longitude": -84.505983, + "city": "Johannesburg", + "state": "MI", + "county": "Otsego" + }, + { + "zip_code": 49752, + "latitude": 46.259604, + "longitude": -84.647332, + "city": "Kinross", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49753, + "latitude": 45.013075, + "longitude": -83.761958, + "city": "Lachine", + "state": "MI", + "county": "Alpena" + }, + { + "zip_code": 49755, + "latitude": 45.592565, + "longitude": -84.86323, + "city": "Levering", + "state": "MI", + "county": "Emmet" + }, + { + "zip_code": 49756, + "latitude": 44.91306, + "longitude": -84.21857, + "city": "Lewiston", + "state": "MI", + "county": "Montmorency" + }, + { + "zip_code": 49757, + "latitude": 45.853721, + "longitude": -84.618203, + "city": "Mackinac Island", + "state": "MI", + "county": "Mackinac" + }, + { + "zip_code": 49759, + "latitude": 45.430946, + "longitude": -84.085375, + "city": "Millersburg", + "state": "MI", + "county": "Presque Isle" + }, + { + "zip_code": 49760, + "latitude": 46.07039, + "longitude": -84.992591, + "city": "Moran", + "state": "MI", + "county": "Mackinac" + }, + { + "zip_code": 49761, + "latitude": 45.559536, + "longitude": -84.522098, + "city": "Mullett Lake", + "state": "MI", + "county": "Cheboygan" + }, + { + "zip_code": 49762, + "latitude": 46.109525, + "longitude": -85.34592, + "city": "Naubinway", + "state": "MI", + "county": "Mackinac" + }, + { + "zip_code": 49764, + "latitude": 45.480257, + "longitude": -84.814645, + "city": "Oden", + "state": "MI", + "county": "Emmet" + }, + { + "zip_code": 49765, + "latitude": 45.363283, + "longitude": -83.871571, + "city": "Onaway", + "state": "MI", + "county": "Presque Isle" + }, + { + "zip_code": 49766, + "latitude": 45.028249, + "longitude": -83.53661, + "city": "Ossineke", + "state": "MI", + "county": "Alpena" + }, + { + "zip_code": 49768, + "latitude": 46.595083, + "longitude": -85.097324, + "city": "Paradise", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49769, + "latitude": 45.566112, + "longitude": -84.863241, + "city": "Pellston", + "state": "MI", + "county": "Emmet" + }, + { + "zip_code": 49770, + "latitude": 45.355915, + "longitude": -84.913255, + "city": "Petoskey", + "state": "MI", + "county": "Emmet" + }, + { + "zip_code": 49774, + "latitude": 46.179987, + "longitude": -84.315417, + "city": "Pickford", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49775, + "latitude": 45.969075, + "longitude": -84.991195, + "city": "Pointe Aux Pins", + "state": "MI", + "county": "Mackinac" + }, + { + "zip_code": 49776, + "latitude": 45.278913, + "longitude": -83.734615, + "city": "Posen", + "state": "MI", + "county": "Presque Isle" + }, + { + "zip_code": 49777, + "latitude": 45.283057, + "longitude": -83.586073, + "city": "Presque Isle", + "state": "MI", + "county": "Presque Isle" + }, + { + "zip_code": 49778, + "latitude": 46.410777, + "longitude": -84.336519, + "city": "Brimley", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49779, + "latitude": 45.384168, + "longitude": -83.74985, + "city": "Rogers City", + "state": "MI", + "county": "Presque Isle" + }, + { + "zip_code": 49780, + "latitude": 46.258514, + "longitude": -84.800411, + "city": "Rudyard", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49781, + "latitude": 45.99852, + "longitude": -84.697818, + "city": "Saint Ignace", + "state": "MI", + "county": "Mackinac" + }, + { + "zip_code": 49782, + "latitude": 45.668447, + "longitude": -85.547299, + "city": "Beaver Island", + "state": "MI", + "county": "Charlevoix" + }, + { + "zip_code": 49783, + "latitude": 46.357439, + "longitude": -84.587315, + "city": "Sault Sainte Marie", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49784, + "latitude": 46.410777, + "longitude": -84.336519, + "city": "Kincheloe", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49785, + "latitude": 46.181451, + "longitude": -84.405367, + "city": "Kincheloe", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49786, + "latitude": 46.410777, + "longitude": -84.336519, + "city": "Kincheloe", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49788, + "latitude": 46.288432, + "longitude": -84.541577, + "city": "Kincheloe", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49790, + "latitude": 46.387377, + "longitude": -84.966792, + "city": "Strongs", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49791, + "latitude": 45.483842, + "longitude": -84.593561, + "city": "Topinabee", + "state": "MI", + "county": "Cheboygan" + }, + { + "zip_code": 49792, + "latitude": 45.358825, + "longitude": -84.295283, + "city": "Tower", + "state": "MI", + "county": "Cheboygan" + }, + { + "zip_code": 49793, + "latitude": 46.215929, + "longitude": -85.006769, + "city": "Trout Lake", + "state": "MI", + "county": "Chippewa" + }, + { + "zip_code": 49795, + "latitude": 45.139667, + "longitude": -84.552604, + "city": "Vanderbilt", + "state": "MI", + "county": "Otsego" + }, + { + "zip_code": 49796, + "latitude": 45.245371, + "longitude": -84.938228, + "city": "Walloon Lake", + "state": "MI", + "county": "Charlevoix" + }, + { + "zip_code": 49797, + "latitude": 44.870234, + "longitude": -84.659847, + "city": "Waters", + "state": "MI", + "county": "Otsego" + }, + { + "zip_code": 49799, + "latitude": 45.326831, + "longitude": -84.549533, + "city": "Wolverine", + "state": "MI", + "county": "Cheboygan" + }, + { + "zip_code": 49801, + "latitude": 46.021627, + "longitude": -87.874496, + "city": "Iron Mountain", + "state": "MI", + "county": "Dickinson" + }, + { + "zip_code": 49802, + "latitude": 45.807905, + "longitude": -88.084302, + "city": "Kingsford", + "state": "MI", + "county": "Dickinson" + }, + { + "zip_code": 49805, + "latitude": 47.287939, + "longitude": -88.412893, + "city": "Allouez", + "state": "MI", + "county": "Keweenaw" + }, + { + "zip_code": 49806, + "latitude": 46.444586, + "longitude": -86.911506, + "city": "Au Train", + "state": "MI", + "county": "Alger" + }, + { + "zip_code": 49807, + "latitude": 45.695595, + "longitude": -87.207306, + "city": "Bark River", + "state": "MI", + "county": "Delta" + }, + { + "zip_code": 49808, + "latitude": 46.770788, + "longitude": -87.672566, + "city": "Big Bay", + "state": "MI", + "county": "Marquette" + }, + { + "zip_code": 49812, + "latitude": 45.601899, + "longitude": -87.519075, + "city": "Carney", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49813, + "latitude": 45.443789, + "longitude": -87.401604, + "city": "Cedar River", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49814, + "latitude": 46.466637, + "longitude": -87.920429, + "city": "Champion", + "state": "MI", + "county": "Marquette" + }, + { + "zip_code": 49815, + "latitude": 46.17823, + "longitude": -87.934279, + "city": "Channing", + "state": "MI", + "county": "Dickinson" + }, + { + "zip_code": 49816, + "latitude": 46.336962, + "longitude": -86.993579, + "city": "Chatham", + "state": "MI", + "county": "Alger" + }, + { + "zip_code": 49817, + "latitude": 45.915778, + "longitude": -86.473246, + "city": "Cooks", + "state": "MI", + "county": "Schoolcraft" + }, + { + "zip_code": 49818, + "latitude": 45.910352, + "longitude": -87.20714, + "city": "Cornell", + "state": "MI", + "county": "Delta" + }, + { + "zip_code": 49819, + "latitude": 46.604141, + "longitude": -87.614805, + "city": "Arnold", + "state": "MI", + "county": "Marquette" + }, + { + "zip_code": 49820, + "latitude": 46.159286, + "longitude": -85.699294, + "city": "Curtis", + "state": "MI", + "county": "Mackinac" + }, + { + "zip_code": 49821, + "latitude": 45.524441, + "longitude": -87.614772, + "city": "Daggett", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49822, + "latitude": 46.426964, + "longitude": -87.049704, + "city": "Deerton", + "state": "MI", + "county": "Alger" + }, + { + "zip_code": 49825, + "latitude": 46.329926, + "longitude": -87.013761, + "city": "Eben Junction", + "state": "MI", + "county": "Alger" + }, + { + "zip_code": 49826, + "latitude": 46.348071, + "longitude": -87.043622, + "city": "Rumely", + "state": "MI", + "county": "Alger" + }, + { + "zip_code": 49827, + "latitude": 46.169384, + "longitude": -85.587976, + "city": "Engadine", + "state": "MI", + "county": "Mackinac" + }, + { + "zip_code": 49829, + "latitude": 45.851343, + "longitude": -87.057049, + "city": "Escanaba", + "state": "MI", + "county": "Delta" + }, + { + "zip_code": 49831, + "latitude": 46.022634, + "longitude": -87.793865, + "city": "Felch", + "state": "MI", + "county": "Dickinson" + }, + { + "zip_code": 49833, + "latitude": 46.279714, + "longitude": -87.331099, + "city": "Little Lake", + "state": "MI", + "county": "Marquette" + }, + { + "zip_code": 49834, + "latitude": 45.939891, + "longitude": -87.805995, + "city": "Foster City", + "state": "MI", + "county": "Dickinson" + }, + { + "zip_code": 49835, + "latitude": 45.756636, + "longitude": -86.586125, + "city": "Garden", + "state": "MI", + "county": "Delta" + }, + { + "zip_code": 49836, + "latitude": 46.042076, + "longitude": -86.235756, + "city": "Germfask", + "state": "MI", + "county": "Schoolcraft" + }, + { + "zip_code": 49837, + "latitude": 45.881256, + "longitude": -87.115221, + "city": "Gladstone", + "state": "MI", + "county": "Delta" + }, + { + "zip_code": 49838, + "latitude": 46.074658, + "longitude": -85.733841, + "city": "Gould City", + "state": "MI", + "county": "Mackinac" + }, + { + "zip_code": 49839, + "latitude": 46.668806, + "longitude": -85.964145, + "city": "Grand Marais", + "state": "MI", + "county": "Alger" + }, + { + "zip_code": 49840, + "latitude": 46.042076, + "longitude": -86.235756, + "city": "Gulliver", + "state": "MI", + "county": "Schoolcraft" + }, + { + "zip_code": 49841, + "latitude": 46.331119, + "longitude": -87.439658, + "city": "Gwinn", + "state": "MI", + "county": "Marquette" + }, + { + "zip_code": 49845, + "latitude": 45.692178, + "longitude": -87.351342, + "city": "Harris", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49847, + "latitude": 45.700102, + "longitude": -87.642374, + "city": "Hermansville", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49848, + "latitude": 45.371769, + "longitude": -87.623735, + "city": "Ingalls", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49849, + "latitude": 46.43869, + "longitude": -87.709096, + "city": "Ishpeming", + "state": "MI", + "county": "Marquette" + }, + { + "zip_code": 49852, + "latitude": 45.827514, + "longitude": -87.776381, + "city": "Loretto", + "state": "MI", + "county": "Dickinson" + }, + { + "zip_code": 49853, + "latitude": 46.347592, + "longitude": -85.658525, + "city": "Mc Millan", + "state": "MI", + "county": "Luce" + }, + { + "zip_code": 49854, + "latitude": 46.006223, + "longitude": -86.25549, + "city": "Manistique", + "state": "MI", + "county": "Schoolcraft" + }, + { + "zip_code": 49855, + "latitude": 46.593435, + "longitude": -87.615282, + "city": "Marquette", + "state": "MI", + "county": "Marquette" + }, + { + "zip_code": 49858, + "latitude": 45.228959, + "longitude": -87.56772, + "city": "Menominee", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49861, + "latitude": 46.530795, + "longitude": -88.091432, + "city": "Michigamme", + "state": "MI", + "county": "Marquette" + }, + { + "zip_code": 49862, + "latitude": 46.414779, + "longitude": -86.460319, + "city": "Munising", + "state": "MI", + "county": "Alger" + }, + { + "zip_code": 49863, + "latitude": 45.608658, + "longitude": -87.56331, + "city": "Nadeau", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49864, + "latitude": 45.842437, + "longitude": -86.655849, + "city": "Nahma", + "state": "MI", + "county": "Delta" + }, + { + "zip_code": 49865, + "latitude": 46.604141, + "longitude": -87.614805, + "city": "National Mine", + "state": "MI", + "county": "Marquette" + }, + { + "zip_code": 49866, + "latitude": 46.494904, + "longitude": -87.799518, + "city": "Negaunee", + "state": "MI", + "county": "Marquette" + }, + { + "zip_code": 49868, + "latitude": 46.460159, + "longitude": -85.515605, + "city": "Newberry", + "state": "MI", + "county": "Luce" + }, + { + "zip_code": 49870, + "latitude": 45.857201, + "longitude": -87.917602, + "city": "Norway", + "state": "MI", + "county": "Dickinson" + }, + { + "zip_code": 49871, + "latitude": 46.441565, + "longitude": -87.576355, + "city": "Palmer", + "state": "MI", + "county": "Marquette" + }, + { + "zip_code": 49872, + "latitude": 45.992476, + "longitude": -87.079231, + "city": "Perkins", + "state": "MI", + "county": "Delta" + }, + { + "zip_code": 49873, + "latitude": 45.84102, + "longitude": -87.481565, + "city": "Perronville", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49874, + "latitude": 45.703409, + "longitude": -87.512409, + "city": "Powers", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49876, + "latitude": 45.80759, + "longitude": -87.959862, + "city": "Quinnesec", + "state": "MI", + "county": "Dickinson" + }, + { + "zip_code": 49877, + "latitude": 46.129666, + "longitude": -87.736665, + "city": "Ralph", + "state": "MI", + "county": "Dickinson" + }, + { + "zip_code": 49878, + "latitude": 45.913952, + "longitude": -86.804734, + "city": "Rapid River", + "state": "MI", + "county": "Delta" + }, + { + "zip_code": 49879, + "latitude": 46.36558, + "longitude": -87.89039, + "city": "Republic", + "state": "MI", + "county": "Marquette" + }, + { + "zip_code": 49880, + "latitude": 46.057396, + "longitude": -87.122594, + "city": "Rock", + "state": "MI", + "county": "Delta" + }, + { + "zip_code": 49881, + "latitude": 46.074737, + "longitude": -88.039613, + "city": "Sagola", + "state": "MI", + "county": "Dickinson" + }, + { + "zip_code": 49883, + "latitude": 46.042076, + "longitude": -86.235756, + "city": "Seney", + "state": "MI", + "county": "Schoolcraft" + }, + { + "zip_code": 49884, + "latitude": 46.434256, + "longitude": -86.367899, + "city": "Shingleton", + "state": "MI", + "county": "Alger" + }, + { + "zip_code": 49885, + "latitude": 46.396896, + "longitude": -87.300505, + "city": "Skandia", + "state": "MI", + "county": "Marquette" + }, + { + "zip_code": 49886, + "latitude": 45.677744, + "longitude": -87.485236, + "city": "Spalding", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49887, + "latitude": 45.447416, + "longitude": -87.61396, + "city": "Stephenson", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49891, + "latitude": 46.238695, + "longitude": -87.014443, + "city": "Trenary", + "state": "MI", + "county": "Alger" + }, + { + "zip_code": 49892, + "latitude": 45.830389, + "longitude": -87.807258, + "city": "Vulcan", + "state": "MI", + "county": "Dickinson" + }, + { + "zip_code": 49893, + "latitude": 45.295383, + "longitude": -87.585611, + "city": "Wallace", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49894, + "latitude": 45.788216, + "longitude": -87.078454, + "city": "Wells", + "state": "MI", + "county": "Delta" + }, + { + "zip_code": 49895, + "latitude": 46.291471, + "longitude": -86.671351, + "city": "Wetmore", + "state": "MI", + "county": "Alger" + }, + { + "zip_code": 49896, + "latitude": 45.679339, + "longitude": -87.389877, + "city": "Wilson", + "state": "MI", + "county": "Menominee" + }, + { + "zip_code": 49901, + "latitude": 47.293287, + "longitude": -88.389708, + "city": "Ahmeek", + "state": "MI", + "county": "Keweenaw" + }, + { + "zip_code": 49902, + "latitude": 46.030951, + "longitude": -88.377097, + "city": "Alpha", + "state": "MI", + "county": "Iron" + }, + { + "zip_code": 49903, + "latitude": 46.249415, + "longitude": -88.417593, + "city": "Amasa", + "state": "MI", + "county": "Iron" + }, + { + "zip_code": 49905, + "latitude": 47.072716, + "longitude": -88.634939, + "city": "Atlantic Mine", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49908, + "latitude": 46.80476, + "longitude": -88.575842, + "city": "Baraga", + "state": "MI", + "county": "Baraga" + }, + { + "zip_code": 49910, + "latitude": 46.585302, + "longitude": -89.517464, + "city": "Bergland", + "state": "MI", + "county": "Ontonagon" + }, + { + "zip_code": 49911, + "latitude": 46.423427, + "longitude": -89.992677, + "city": "Bessemer", + "state": "MI", + "county": "Gogebic" + }, + { + "zip_code": 49912, + "latitude": 46.475105, + "longitude": -89.222897, + "city": "Bruce Crossing", + "state": "MI", + "county": "Ontonagon" + }, + { + "zip_code": 49913, + "latitude": 47.154742, + "longitude": -88.525475, + "city": "Calumet", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49915, + "latitude": 46.065734, + "longitude": -88.630972, + "city": "Caspian", + "state": "MI", + "county": "Iron" + }, + { + "zip_code": 49916, + "latitude": 47.020152, + "longitude": -88.572499, + "city": "Chassell", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49917, + "latitude": 47.284183, + "longitude": -88.387535, + "city": "Copper City", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49918, + "latitude": 47.471616, + "longitude": -87.946283, + "city": "Copper Harbor", + "state": "MI", + "county": "Keweenaw" + }, + { + "zip_code": 49919, + "latitude": 46.526495, + "longitude": -88.584598, + "city": "Covington", + "state": "MI", + "county": "Baraga" + }, + { + "zip_code": 49920, + "latitude": 46.143009, + "longitude": -88.376197, + "city": "Crystal Falls", + "state": "MI", + "county": "Iron" + }, + { + "zip_code": 49921, + "latitude": 47.092838, + "longitude": -88.583578, + "city": "Dodgeville", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49922, + "latitude": 47.120346, + "longitude": -88.461337, + "city": "Dollar Bay", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49925, + "latitude": 46.548352, + "longitude": -89.365311, + "city": "Ewen", + "state": "MI", + "county": "Ontonagon" + }, + { + "zip_code": 49927, + "latitude": 46.035213, + "longitude": -88.56094, + "city": "Gaastra", + "state": "MI", + "county": "Iron" + }, + { + "zip_code": 49929, + "latitude": 46.780865, + "longitude": -89.114601, + "city": "Greenland", + "state": "MI", + "county": "Ontonagon" + }, + { + "zip_code": 49930, + "latitude": 47.156614, + "longitude": -88.558554, + "city": "Hancock", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49931, + "latitude": 47.105336, + "longitude": -88.548157, + "city": "Houghton", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49934, + "latitude": 47.167087, + "longitude": -88.466785, + "city": "Hubbell", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49935, + "latitude": 46.12047, + "longitude": -88.618995, + "city": "Iron River", + "state": "MI", + "county": "Iron" + }, + { + "zip_code": 49938, + "latitude": 46.479574, + "longitude": -90.167111, + "city": "Ironwood", + "state": "MI", + "county": "Gogebic" + }, + { + "zip_code": 49942, + "latitude": 47.269416, + "longitude": -88.41841, + "city": "Kearsarge", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49945, + "latitude": 47.162481, + "longitude": -88.503108, + "city": "Lake Linden", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49946, + "latitude": 46.740227, + "longitude": -88.44705, + "city": "Lanse", + "state": "MI", + "county": "Baraga" + }, + { + "zip_code": 49947, + "latitude": 46.379315, + "longitude": -89.612621, + "city": "Marenisco", + "state": "MI", + "county": "Gogebic" + }, + { + "zip_code": 49948, + "latitude": 46.722794, + "longitude": -89.051191, + "city": "Mass City", + "state": "MI", + "county": "Ontonagon" + }, + { + "zip_code": 49950, + "latitude": 47.352566, + "longitude": -88.288905, + "city": "Mohawk", + "state": "MI", + "county": "Keweenaw" + }, + { + "zip_code": 49952, + "latitude": 46.774818, + "longitude": -88.879888, + "city": "Nisula", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49953, + "latitude": 46.73807, + "longitude": -89.334696, + "city": "Ontonagon", + "state": "MI", + "county": "Ontonagon" + }, + { + "zip_code": 49955, + "latitude": 47.04038, + "longitude": -88.670361, + "city": "Painesdale", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49958, + "latitude": 46.7402, + "longitude": -88.7479, + "city": "Pelkie", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49959, + "latitude": 46.472742, + "longitude": -89.99761, + "city": "Ramsay", + "state": "MI", + "county": "Gogebic" + }, + { + "zip_code": 49960, + "latitude": 46.753715, + "longitude": -89.195837, + "city": "Rockland", + "state": "MI", + "county": "Ontonagon" + }, + { + "zip_code": 49961, + "latitude": 46.501487, + "longitude": -88.79715, + "city": "Sidnaw", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49962, + "latitude": 46.867128, + "longitude": -88.139072, + "city": "Skanee", + "state": "MI", + "county": "Baraga" + }, + { + "zip_code": 49963, + "latitude": 47.071862, + "longitude": -88.651973, + "city": "South Range", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49964, + "latitude": 46.079655, + "longitude": -88.629006, + "city": "Stambaugh", + "state": "MI", + "county": "Iron" + }, + { + "zip_code": 49965, + "latitude": 46.910918, + "longitude": -88.85321, + "city": "Toivola", + "state": "MI", + "county": "Houghton" + }, + { + "zip_code": 49967, + "latitude": 46.4931, + "longitude": -89.085164, + "city": "Trout Creek", + "state": "MI", + "county": "Ontonagon" + }, + { + "zip_code": 49968, + "latitude": 46.490844, + "longitude": -89.875182, + "city": "Wakefield", + "state": "MI", + "county": "Gogebic" + }, + { + "zip_code": 49969, + "latitude": 46.22184, + "longitude": -89.240577, + "city": "Watersmeet", + "state": "MI", + "county": "Gogebic" + }, + { + "zip_code": 49970, + "latitude": 46.731668, + "longitude": -88.335388, + "city": "Watton", + "state": "MI", + "county": "Baraga" + }, + { + "zip_code": 49971, + "latitude": 46.782698, + "longitude": -89.597404, + "city": "White Pine", + "state": "MI", + "county": "Ontonagon" + }, + { + "zip_code": 50001, + "latitude": 41.384345, + "longitude": -93.424294, + "city": "Ackworth", + "state": "IA", + "county": "Warren" + }, + { + "zip_code": 50002, + "latitude": 41.439109, + "longitude": -94.633805, + "city": "Adair", + "state": "IA", + "county": "Adair" + }, + { + "zip_code": 50003, + "latitude": 41.617591, + "longitude": -94.034515, + "city": "Adel", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50005, + "latitude": 42.143933, + "longitude": -92.961868, + "city": "Albion", + "state": "IA", + "county": "Marshall" + }, + { + "zip_code": 50006, + "latitude": 42.430997, + "longitude": -93.390638, + "city": "Alden", + "state": "IA", + "county": "Hardin" + }, + { + "zip_code": 50007, + "latitude": 41.813089, + "longitude": -93.609929, + "city": "Alleman", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50008, + "latitude": 40.672872, + "longitude": -93.405589, + "city": "Allerton", + "state": "IA", + "county": "Wayne" + }, + { + "zip_code": 50009, + "latitude": 41.65097, + "longitude": -93.4685, + "city": "Altoona", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50010, + "latitude": 42.037879, + "longitude": -93.600254, + "city": "Ames", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50011, + "latitude": 42.035998, + "longitude": -93.465172, + "city": "Ames", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50012, + "latitude": 42.023557, + "longitude": -93.648465, + "city": "Ames", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50013, + "latitude": 42.023535, + "longitude": -93.640818, + "city": "Ames", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50014, + "latitude": 42.045748, + "longitude": -93.647237, + "city": "Ames", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50015, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Ankeny", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50020, + "latitude": 41.390677, + "longitude": -94.813882, + "city": "Anita", + "state": "IA", + "county": "Cass" + }, + { + "zip_code": 50021, + "latitude": 41.756321, + "longitude": -93.601467, + "city": "Ankeny", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50022, + "latitude": 41.381871, + "longitude": -94.960765, + "city": "Atlantic", + "state": "IA", + "county": "Cass" + }, + { + "zip_code": 50025, + "latitude": 41.704535, + "longitude": -94.918652, + "city": "Audubon", + "state": "IA", + "county": "Audubon" + }, + { + "zip_code": 50026, + "latitude": 41.827251, + "longitude": -94.449511, + "city": "Bagley", + "state": "IA", + "county": "Guthrie" + }, + { + "zip_code": 50027, + "latitude": 41.46974, + "longitude": -92.487177, + "city": "Barnes City", + "state": "IA", + "county": "Mahaska" + }, + { + "zip_code": 50028, + "latitude": 41.811839, + "longitude": -93.159506, + "city": "Baxter", + "state": "IA", + "county": "Jasper" + }, + { + "zip_code": 50029, + "latitude": 41.6872, + "longitude": -94.528322, + "city": "Bayard", + "state": "IA", + "county": "Guthrie" + }, + { + "zip_code": 50031, + "latitude": 42.038746, + "longitude": -94.143566, + "city": "Beaver", + "state": "IA", + "county": "Boone" + }, + { + "zip_code": 50032, + "latitude": 41.665838, + "longitude": -93.54323, + "city": "Berwick", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50033, + "latitude": 41.334078, + "longitude": -94.015337, + "city": "Bevington", + "state": "IA", + "county": "Madison" + }, + { + "zip_code": 50034, + "latitude": 42.485099, + "longitude": -93.68778, + "city": "Blairsburg", + "state": "IA", + "county": "Hamilton" + }, + { + "zip_code": 50035, + "latitude": 41.730186, + "longitude": -93.45694, + "city": "Bondurant", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50036, + "latitude": 42.0425, + "longitude": -93.904897, + "city": "Boone", + "state": "IA", + "county": "Boone" + }, + { + "zip_code": 50037, + "latitude": 42.036552, + "longitude": -93.931686, + "city": "Boone", + "state": "IA", + "county": "Boone" + }, + { + "zip_code": 50038, + "latitude": 41.630419, + "longitude": -93.946297, + "city": "Booneville", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50039, + "latitude": 41.82003, + "longitude": -94.00881, + "city": "Bouton", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50040, + "latitude": 42.161647, + "longitude": -94.088499, + "city": "Boxholm", + "state": "IA", + "county": "Boone" + }, + { + "zip_code": 50041, + "latitude": 42.600335, + "longitude": -93.223204, + "city": "Bradford", + "state": "IA", + "county": "Franklin" + }, + { + "zip_code": 50042, + "latitude": 41.54069, + "longitude": -94.878382, + "city": "Brayton", + "state": "IA", + "county": "Audubon" + }, + { + "zip_code": 50043, + "latitude": 42.417866, + "longitude": -93.375544, + "city": "Buckeye", + "state": "IA", + "county": "Hardin" + }, + { + "zip_code": 50044, + "latitude": 41.211897, + "longitude": -93.054149, + "city": "Bussey", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50046, + "latitude": 41.914036, + "longitude": -93.51988, + "city": "Cambridge", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50047, + "latitude": 41.416785, + "longitude": -93.520445, + "city": "Carlisle", + "state": "IA", + "county": "Warren" + }, + { + "zip_code": 50048, + "latitude": 41.576333, + "longitude": -94.521205, + "city": "Casey", + "state": "IA", + "county": "Guthrie" + }, + { + "zip_code": 50049, + "latitude": 41.046868, + "longitude": -93.309464, + "city": "Chariton", + "state": "IA", + "county": "Lucas" + }, + { + "zip_code": 50050, + "latitude": 42.141856, + "longitude": -94.503538, + "city": "Churdan", + "state": "IA", + "county": "Greene" + }, + { + "zip_code": 50051, + "latitude": 42.11412, + "longitude": -93.149072, + "city": "Clemons", + "state": "IA", + "county": "Marshall" + }, + { + "zip_code": 50052, + "latitude": 40.634202, + "longitude": -93.447953, + "city": "Clio", + "state": "IA", + "county": "Wayne" + }, + { + "zip_code": 50054, + "latitude": 41.684507, + "longitude": -93.222321, + "city": "Colfax", + "state": "IA", + "county": "Jasper" + }, + { + "zip_code": 50055, + "latitude": 41.906479, + "longitude": -93.294572, + "city": "Collins", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50056, + "latitude": 42.000921, + "longitude": -93.380733, + "city": "Colo", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50057, + "latitude": 41.196557, + "longitude": -93.159664, + "city": "Columbia", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50058, + "latitude": 41.957228, + "longitude": -94.735083, + "city": "Coon Rapids", + "state": "IA", + "county": "Carroll" + }, + { + "zip_code": 50059, + "latitude": 42.036334, + "longitude": -94.396956, + "city": "Cooper", + "state": "IA", + "county": "Greene" + }, + { + "zip_code": 50060, + "latitude": 40.777093, + "longitude": -93.327355, + "city": "Corydon", + "state": "IA", + "county": "Wayne" + }, + { + "zip_code": 50061, + "latitude": 41.468663, + "longitude": -93.745358, + "city": "Cumming", + "state": "IA", + "county": "Warren" + }, + { + "zip_code": 50062, + "latitude": 41.334487, + "longitude": -93.14778, + "city": "Dallas", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50063, + "latitude": 41.713107, + "longitude": -93.930807, + "city": "Dallas Center", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50064, + "latitude": 42.100422, + "longitude": -94.230723, + "city": "Dana", + "state": "IA", + "county": "Greene" + }, + { + "zip_code": 50065, + "latitude": 40.634604, + "longitude": -93.8105, + "city": "Davis City", + "state": "IA", + "county": "Decatur" + }, + { + "zip_code": 50066, + "latitude": 41.800769, + "longitude": -94.202714, + "city": "Dawson", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50067, + "latitude": 40.743001, + "longitude": -93.831719, + "city": "Decatur", + "state": "IA", + "county": "Decatur" + }, + { + "zip_code": 50068, + "latitude": 41.029481, + "longitude": -93.327475, + "city": "Derby", + "state": "IA", + "county": "Lucas" + }, + { + "zip_code": 50069, + "latitude": 41.521176, + "longitude": -94.107532, + "city": "De Soto", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50070, + "latitude": 41.531827, + "longitude": -94.205252, + "city": "Dexter", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50071, + "latitude": 42.651566, + "longitude": -93.582732, + "city": "Dows", + "state": "IA", + "county": "Wright" + }, + { + "zip_code": 50072, + "latitude": 41.43059, + "longitude": -94.107202, + "city": "Earlham", + "state": "IA", + "county": "Madison" + }, + { + "zip_code": 50073, + "latitude": 41.783265, + "longitude": -93.5171, + "city": "Elkhart", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50074, + "latitude": 40.846834, + "longitude": -94.088656, + "city": "Ellston", + "state": "IA", + "county": "Ringgold" + }, + { + "zip_code": 50075, + "latitude": 42.325487, + "longitude": -93.55153, + "city": "Ellsworth", + "state": "IA", + "county": "Hamilton" + }, + { + "zip_code": 50076, + "latitude": 41.589212, + "longitude": -94.870749, + "city": "Exira", + "state": "IA", + "county": "Audubon" + }, + { + "zip_code": 50078, + "latitude": 41.937357, + "longitude": -92.865043, + "city": "Ferguson", + "state": "IA", + "county": "Marshall" + }, + { + "zip_code": 50101, + "latitude": 42.666494, + "longitude": -93.627104, + "city": "Galt", + "state": "IA", + "county": "Wright" + }, + { + "zip_code": 50102, + "latitude": 42.235432, + "longitude": -93.373262, + "city": "Garden City", + "state": "IA", + "county": "Hardin" + }, + { + "zip_code": 50103, + "latitude": 40.736644, + "longitude": -93.785839, + "city": "Garden Grove", + "state": "IA", + "county": "Decatur" + }, + { + "zip_code": 50104, + "latitude": 41.480854, + "longitude": -92.371164, + "city": "Gibson", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 50105, + "latitude": 42.114752, + "longitude": -93.63986, + "city": "Gilbert", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50106, + "latitude": 41.987444, + "longitude": -92.963098, + "city": "Gilman", + "state": "IA", + "county": "Marshall" + }, + { + "zip_code": 50107, + "latitude": 42.035745, + "longitude": -94.242288, + "city": "Grand Junction", + "state": "IA", + "county": "Greene" + }, + { + "zip_code": 50108, + "latitude": 40.819397, + "longitude": -93.962986, + "city": "Grand River", + "state": "IA", + "county": "Decatur" + }, + { + "zip_code": 50109, + "latitude": 41.761574, + "longitude": -93.853297, + "city": "Granger", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50110, + "latitude": 41.840109, + "longitude": -94.981191, + "city": "Gray", + "state": "IA", + "county": "Audubon" + }, + { + "zip_code": 50111, + "latitude": 41.652116, + "longitude": -93.600453, + "city": "Grimes", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50112, + "latitude": 41.685324, + "longitude": -92.630258, + "city": "Grinnell", + "state": "IA", + "county": "Poweshiek" + }, + { + "zip_code": 50115, + "latitude": 41.683516, + "longitude": -94.559702, + "city": "Guthrie Center", + "state": "IA", + "county": "Guthrie" + }, + { + "zip_code": 50116, + "latitude": 41.189953, + "longitude": -92.95896, + "city": "Hamilton", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50117, + "latitude": 41.746719, + "longitude": -94.847093, + "city": "Hamlin", + "state": "IA", + "county": "Audubon" + }, + { + "zip_code": 50118, + "latitude": 41.439093, + "longitude": -93.36963, + "city": "Hartford", + "state": "IA", + "county": "Warren" + }, + { + "zip_code": 50119, + "latitude": 41.299888, + "longitude": -92.928147, + "city": "Harvey", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50120, + "latitude": 41.938248, + "longitude": -92.968108, + "city": "Haverhill", + "state": "IA", + "county": "Marshall" + }, + { + "zip_code": 50122, + "latitude": 42.303338, + "longitude": -93.329584, + "city": "Hubbard", + "state": "IA", + "county": "Hardin" + }, + { + "zip_code": 50123, + "latitude": 40.80286, + "longitude": -93.518445, + "city": "Humeston", + "state": "IA", + "county": "Wayne" + }, + { + "zip_code": 50124, + "latitude": 41.906086, + "longitude": -93.616342, + "city": "Huxley", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50125, + "latitude": 41.314309, + "longitude": -93.588041, + "city": "Indianola", + "state": "IA", + "county": "Warren" + }, + { + "zip_code": 50126, + "latitude": 42.43026, + "longitude": -93.253363, + "city": "Iowa Falls", + "state": "IA", + "county": "Hardin" + }, + { + "zip_code": 50127, + "latitude": 41.777174, + "longitude": -93.21383, + "city": "Ira", + "state": "IA", + "county": "Jasper" + }, + { + "zip_code": 50128, + "latitude": 41.820851, + "longitude": -94.319081, + "city": "Jamaica", + "state": "IA", + "county": "Guthrie" + }, + { + "zip_code": 50129, + "latitude": 42.007323, + "longitude": -94.372586, + "city": "Jefferson", + "state": "IA", + "county": "Greene" + }, + { + "zip_code": 50130, + "latitude": 42.339466, + "longitude": -93.721503, + "city": "Jewell", + "state": "IA", + "county": "Hamilton" + }, + { + "zip_code": 50131, + "latitude": 41.714435, + "longitude": -93.732559, + "city": "Johnston", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50132, + "latitude": 42.390667, + "longitude": -93.684048, + "city": "Kamrar", + "state": "IA", + "county": "Hamilton" + }, + { + "zip_code": 50133, + "latitude": 40.709922, + "longitude": -94.049307, + "city": "Kellerton", + "state": "IA", + "county": "Ringgold" + }, + { + "zip_code": 50134, + "latitude": 41.932278, + "longitude": -93.654229, + "city": "Kelley", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50135, + "latitude": 41.706656, + "longitude": -93.023296, + "city": "Kellogg", + "state": "IA", + "county": "Jasper" + }, + { + "zip_code": 50136, + "latitude": 41.455621, + "longitude": -92.288871, + "city": "Keswick", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 50137, + "latitude": 41.659444, + "longitude": -92.939073, + "city": "Killduff", + "state": "IA", + "county": "Jasper" + }, + { + "zip_code": 50138, + "latitude": 41.295893, + "longitude": -93.104232, + "city": "Knoxville", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50139, + "latitude": 41.218741, + "longitude": -93.414713, + "city": "Lacona", + "state": "IA", + "county": "Warren" + }, + { + "zip_code": 50140, + "latitude": 40.618769, + "longitude": -93.927187, + "city": "Lamoni", + "state": "IA", + "county": "Decatur" + }, + { + "zip_code": 50141, + "latitude": 41.898521, + "longitude": -92.967122, + "city": "Laurel", + "state": "IA", + "county": "Marshall" + }, + { + "zip_code": 50142, + "latitude": 42.020946, + "longitude": -92.775909, + "city": "Le Grand", + "state": "IA", + "county": "Marshall" + }, + { + "zip_code": 50143, + "latitude": 41.338137, + "longitude": -92.794397, + "city": "Leighton", + "state": "IA", + "county": "Mahaska" + }, + { + "zip_code": 50144, + "latitude": 40.740697, + "longitude": -93.748889, + "city": "Leon", + "state": "IA", + "county": "Decatur" + }, + { + "zip_code": 50145, + "latitude": 41.207133, + "longitude": -93.499347, + "city": "Liberty Center", + "state": "IA", + "county": "Warren" + }, + { + "zip_code": 50146, + "latitude": 41.674068, + "longitude": -94.203105, + "city": "Linden", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50147, + "latitude": 40.586053, + "longitude": -93.523318, + "city": "Lineville", + "state": "IA", + "county": "Wayne" + }, + { + "zip_code": 50148, + "latitude": 42.175223, + "longitude": -92.969854, + "city": "Liscomb", + "state": "IA", + "county": "Marshall" + }, + { + "zip_code": 50149, + "latitude": 41.108111, + "longitude": -94.102318, + "city": "Lorimor", + "state": "IA", + "county": "Union" + }, + { + "zip_code": 50150, + "latitude": 41.028469, + "longitude": -92.976822, + "city": "Lovilia", + "state": "IA", + "county": "Monroe" + }, + { + "zip_code": 50151, + "latitude": 41.004925, + "longitude": -93.492145, + "city": "Lucas", + "state": "IA", + "county": "Lucas" + }, + { + "zip_code": 50152, + "latitude": 41.938679, + "longitude": -93.837061, + "city": "Luther", + "state": "IA", + "county": "Boone" + }, + { + "zip_code": 50153, + "latitude": 41.60565, + "longitude": -92.846323, + "city": "Lynnville", + "state": "IA", + "county": "Jasper" + }, + { + "zip_code": 50154, + "latitude": 42.158029, + "longitude": -93.395647, + "city": "Mc Callsburg", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50155, + "latitude": 41.210365, + "longitude": -94.182509, + "city": "Macksburg", + "state": "IA", + "county": "Madison" + }, + { + "zip_code": 50156, + "latitude": 41.92886, + "longitude": -93.797086, + "city": "Madrid", + "state": "IA", + "county": "Boone" + }, + { + "zip_code": 50157, + "latitude": 41.732036, + "longitude": -92.512822, + "city": "Malcom", + "state": "IA", + "county": "Poweshiek" + }, + { + "zip_code": 50158, + "latitude": 42.036096, + "longitude": -92.998867, + "city": "Marshalltown", + "state": "IA", + "county": "Marshall" + }, + { + "zip_code": 50160, + "latitude": 41.385401, + "longitude": -93.741773, + "city": "Martensdale", + "state": "IA", + "county": "Warren" + }, + { + "zip_code": 50161, + "latitude": 41.920999, + "longitude": -93.395946, + "city": "Maxwell", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50162, + "latitude": 42.035719, + "longitude": -93.115647, + "city": "Melbourne", + "state": "IA", + "county": "Marshall" + }, + { + "zip_code": 50163, + "latitude": 41.242194, + "longitude": -93.173193, + "city": "Melcher", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50164, + "latitude": 41.553004, + "longitude": -94.395245, + "city": "Menlo", + "state": "IA", + "county": "Guthrie" + }, + { + "zip_code": 50165, + "latitude": 40.843741, + "longitude": -93.362185, + "city": "Millerton", + "state": "IA", + "county": "Wayne" + }, + { + "zip_code": 50166, + "latitude": 41.283124, + "longitude": -93.428847, + "city": "Milo", + "state": "IA", + "county": "Warren" + }, + { + "zip_code": 50167, + "latitude": 41.732252, + "longitude": -94.047607, + "city": "Minburn", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50168, + "latitude": 41.775852, + "longitude": -93.246431, + "city": "Mingo", + "state": "IA", + "county": "Jasper" + }, + { + "zip_code": 50169, + "latitude": 41.626952, + "longitude": -93.373903, + "city": "Mitchellville", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50170, + "latitude": 41.569003, + "longitude": -93.101184, + "city": "Monroe", + "state": "IA", + "county": "Jasper" + }, + { + "zip_code": 50171, + "latitude": 41.605693, + "longitude": -92.473857, + "city": "Montezuma", + "state": "IA", + "county": "Poweshiek" + }, + { + "zip_code": 50173, + "latitude": 41.95619, + "longitude": -92.712756, + "city": "Montour", + "state": "IA", + "county": "Tama" + }, + { + "zip_code": 50174, + "latitude": 41.026682, + "longitude": -93.925695, + "city": "Murray", + "state": "IA", + "county": "Clarke" + }, + { + "zip_code": 50177, + "latitude": 41.685742, + "longitude": -92.532032, + "city": "Grinnell", + "state": "IA", + "county": "Poweshiek" + }, + { + "zip_code": 50197, + "latitude": 41.334549, + "longitude": -93.099205, + "city": "Knoxville", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50198, + "latitude": 41.334549, + "longitude": -93.099205, + "city": "Knoxville", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50201, + "latitude": 42.00207, + "longitude": -93.503866, + "city": "Nevada", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50206, + "latitude": 42.272076, + "longitude": -93.256399, + "city": "New Providence", + "state": "IA", + "county": "Hardin" + }, + { + "zip_code": 50207, + "latitude": 41.393559, + "longitude": -92.634295, + "city": "New Sharon", + "state": "IA", + "county": "Mahaska" + }, + { + "zip_code": 50208, + "latitude": 41.718107, + "longitude": -93.012335, + "city": "Newton", + "state": "IA", + "county": "Jasper" + }, + { + "zip_code": 50210, + "latitude": 41.319061, + "longitude": -93.672017, + "city": "New Virginia", + "state": "IA", + "county": "Warren" + }, + { + "zip_code": 50211, + "latitude": 41.442071, + "longitude": -93.667713, + "city": "Norwalk", + "state": "IA", + "county": "Warren" + }, + { + "zip_code": 50212, + "latitude": 42.043714, + "longitude": -94.052358, + "city": "Ogden", + "state": "IA", + "county": "Boone" + }, + { + "zip_code": 50213, + "latitude": 41.029937, + "longitude": -93.775845, + "city": "Osceola", + "state": "IA", + "county": "Clarke" + }, + { + "zip_code": 50214, + "latitude": 41.426958, + "longitude": -93.030605, + "city": "Otley", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50216, + "latitude": 41.650933, + "longitude": -94.425111, + "city": "Panora", + "state": "IA", + "county": "Guthrie" + }, + { + "zip_code": 50217, + "latitude": 42.166202, + "longitude": -94.280982, + "city": "Paton", + "state": "IA", + "county": "Greene" + }, + { + "zip_code": 50218, + "latitude": 41.349901, + "longitude": -93.880265, + "city": "Patterson", + "state": "IA", + "county": "Madison" + }, + { + "zip_code": 50219, + "latitude": 41.341915, + "longitude": -93.092797, + "city": "Pella", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50220, + "latitude": 41.790296, + "longitude": -94.06178, + "city": "Perry", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50222, + "latitude": 41.221731, + "longitude": -93.962334, + "city": "Peru", + "state": "IA", + "county": "Madison" + }, + { + "zip_code": 50223, + "latitude": 42.059677, + "longitude": -94.040876, + "city": "Pilot Mound", + "state": "IA", + "county": "Boone" + }, + { + "zip_code": 50225, + "latitude": 41.351116, + "longitude": -93.23362, + "city": "Pleasantville", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50226, + "latitude": 41.75673, + "longitude": -93.698063, + "city": "Polk City", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50227, + "latitude": 42.644276, + "longitude": -93.450081, + "city": "Popejoy", + "state": "IA", + "county": "Franklin" + }, + { + "zip_code": 50228, + "latitude": 41.590964, + "longitude": -93.234793, + "city": "Prairie City", + "state": "IA", + "county": "Jasper" + }, + { + "zip_code": 50229, + "latitude": 41.368045, + "longitude": -93.703126, + "city": "Prole", + "state": "IA", + "county": "Warren" + }, + { + "zip_code": 50230, + "latitude": 42.310875, + "longitude": -93.347563, + "city": "Radcliffe", + "state": "IA", + "county": "Hardin" + }, + { + "zip_code": 50231, + "latitude": 42.240121, + "longitude": -93.628266, + "city": "Randall", + "state": "IA", + "county": "Hamilton" + }, + { + "zip_code": 50232, + "latitude": 41.560308, + "longitude": -92.981908, + "city": "Reasnor", + "state": "IA", + "county": "Jasper" + }, + { + "zip_code": 50233, + "latitude": 41.621146, + "longitude": -94.212048, + "city": "Redfield", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50234, + "latitude": 41.906231, + "longitude": -93.154445, + "city": "Rhodes", + "state": "IA", + "county": "Marshall" + }, + { + "zip_code": 50235, + "latitude": 41.928403, + "longitude": -94.222127, + "city": "Rippey", + "state": "IA", + "county": "Greene" + }, + { + "zip_code": 50236, + "latitude": 42.161972, + "longitude": -93.496057, + "city": "Roland", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50237, + "latitude": 41.561367, + "longitude": -93.398946, + "city": "Runnells", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50238, + "latitude": 40.981221, + "longitude": -93.200472, + "city": "Russell", + "state": "IA", + "county": "Lucas" + }, + { + "zip_code": 50239, + "latitude": 42.140911, + "longitude": -93.174505, + "city": "Saint Anthony", + "state": "IA", + "county": "Marshall" + }, + { + "zip_code": 50240, + "latitude": 41.289336, + "longitude": -93.862695, + "city": "Saint Charles", + "state": "IA", + "county": "Madison" + }, + { + "zip_code": 50241, + "latitude": 41.308413, + "longitude": -93.736916, + "city": "Saint Marys", + "state": "IA", + "county": "Warren" + }, + { + "zip_code": 50242, + "latitude": 41.569631, + "longitude": -92.654204, + "city": "Searsboro", + "state": "IA", + "county": "Poweshiek" + }, + { + "zip_code": 50243, + "latitude": 41.857068, + "longitude": -93.697325, + "city": "Sheldahl", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50244, + "latitude": 41.8925, + "longitude": -93.664006, + "city": "Slater", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50246, + "latitude": 42.296671, + "longitude": -93.776637, + "city": "Stanhope", + "state": "IA", + "county": "Hamilton" + }, + { + "zip_code": 50247, + "latitude": 42.02551, + "longitude": -93.144785, + "city": "State Center", + "state": "IA", + "county": "Marshall" + }, + { + "zip_code": 50248, + "latitude": 42.158072, + "longitude": -93.610141, + "city": "Story City", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50249, + "latitude": 42.296737, + "longitude": -93.721315, + "city": "Stratford", + "state": "IA", + "county": "Hamilton" + }, + { + "zip_code": 50250, + "latitude": 41.573966, + "longitude": -94.339598, + "city": "Stuart", + "state": "IA", + "county": "Guthrie" + }, + { + "zip_code": 50251, + "latitude": 41.576832, + "longitude": -92.924355, + "city": "Sully", + "state": "IA", + "county": "Jasper" + }, + { + "zip_code": 50252, + "latitude": 41.457722, + "longitude": -93.219421, + "city": "Swan", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50254, + "latitude": 40.978688, + "longitude": -94.10039, + "city": "Thayer", + "state": "IA", + "county": "Union" + }, + { + "zip_code": 50255, + "latitude": 41.336267, + "longitude": -92.178366, + "city": "Thornburg", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 50256, + "latitude": 41.263991, + "longitude": -92.938838, + "city": "Tracy", + "state": "IA", + "county": "Marion" + }, + { + "zip_code": 50257, + "latitude": 41.206381, + "longitude": -93.863473, + "city": "Truro", + "state": "IA", + "county": "Madison" + }, + { + "zip_code": 50258, + "latitude": 42.252265, + "longitude": -93.089028, + "city": "Union", + "state": "IA", + "county": "Hardin" + }, + { + "zip_code": 50259, + "latitude": 42.383133, + "longitude": -93.250567, + "city": "Gifford", + "state": "IA", + "county": "Hardin" + }, + { + "zip_code": 50261, + "latitude": 41.658215, + "longitude": -93.944641, + "city": "Van Meter", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50262, + "latitude": 40.736644, + "longitude": -93.785839, + "city": "Van Wert", + "state": "IA", + "county": "Decatur" + }, + { + "zip_code": 50263, + "latitude": 41.59896, + "longitude": -93.875317, + "city": "Waukee", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50264, + "latitude": 40.885821, + "longitude": -93.761591, + "city": "Weldon", + "state": "IA", + "county": "Decatur" + }, + { + "zip_code": 50265, + "latitude": 41.567138, + "longitude": -93.717232, + "city": "West Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50266, + "latitude": 41.653027, + "longitude": -93.747073, + "city": "West Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50268, + "latitude": 41.396307, + "longitude": -92.331335, + "city": "What Cheer", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 50269, + "latitude": 42.271774, + "longitude": -93.021413, + "city": "Whitten", + "state": "IA", + "county": "Hardin" + }, + { + "zip_code": 50271, + "latitude": 42.477733, + "longitude": -93.554643, + "city": "Williams", + "state": "IA", + "county": "Hamilton" + }, + { + "zip_code": 50272, + "latitude": 41.029481, + "longitude": -93.327475, + "city": "Williamson", + "state": "IA", + "county": "Lucas" + }, + { + "zip_code": 50273, + "latitude": 41.351621, + "longitude": -94.042219, + "city": "Winterset", + "state": "IA", + "county": "Madison" + }, + { + "zip_code": 50274, + "latitude": 41.374394, + "longitude": -94.904879, + "city": "Wiota", + "state": "IA", + "county": "Cass" + }, + { + "zip_code": 50275, + "latitude": 41.029822, + "longitude": -93.614875, + "city": "Woodburn", + "state": "IA", + "county": "Clarke" + }, + { + "zip_code": 50276, + "latitude": 41.776121, + "longitude": -93.955694, + "city": "Woodward", + "state": "IA", + "county": "Dallas" + }, + { + "zip_code": 50277, + "latitude": 41.775934, + "longitude": -94.357971, + "city": "Yale", + "state": "IA", + "county": "Guthrie" + }, + { + "zip_code": 50278, + "latitude": 42.149851, + "longitude": -93.29898, + "city": "Zearing", + "state": "IA", + "county": "Story" + }, + { + "zip_code": 50301, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50302, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50303, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50304, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50305, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50306, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50307, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50308, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50309, + "latitude": 41.584089, + "longitude": -93.620267, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50310, + "latitude": 41.623438, + "longitude": -93.680954, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50311, + "latitude": 41.63998, + "longitude": -93.71657, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50312, + "latitude": 41.582645, + "longitude": -93.691719, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50313, + "latitude": 41.643316, + "longitude": -93.621343, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50314, + "latitude": 41.603938, + "longitude": -93.613817, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50315, + "latitude": 41.545107, + "longitude": -93.620917, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50316, + "latitude": 41.609988, + "longitude": -93.600816, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50317, + "latitude": 41.612221, + "longitude": -93.529588, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50318, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50319, + "latitude": 41.592089, + "longitude": -93.603967, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50320, + "latitude": 41.544539, + "longitude": -93.582366, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50321, + "latitude": 41.546945, + "longitude": -93.659668, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50322, + "latitude": 41.630449, + "longitude": -93.753628, + "city": "Urbandale", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50323, + "latitude": 41.62938, + "longitude": -93.771676, + "city": "Urbandale", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50325, + "latitude": 41.607588, + "longitude": -93.744905, + "city": "Clive", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50327, + "latitude": "", + "longitude": "", + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50328, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50329, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50330, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50331, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50332, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50333, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50334, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50335, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50336, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50338, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50339, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50340, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50347, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50350, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50359, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50360, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50361, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50362, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50363, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50364, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50367, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50368, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50369, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50380, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50381, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50391, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50392, + "latitude": 41.587839, + "longitude": -93.627368, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50393, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50394, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50395, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50396, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50397, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50398, + "latitude": 41.594543, + "longitude": -93.785502, + "city": "West Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50401, + "latitude": 43.116477, + "longitude": -93.270559, + "city": "Mason City", + "state": "IA", + "county": "Cerro Gordo" + }, + { + "zip_code": 50402, + "latitude": 43.081604, + "longitude": -93.260879, + "city": "Mason City", + "state": "IA", + "county": "Cerro Gordo" + }, + { + "zip_code": 50420, + "latitude": 42.819841, + "longitude": -93.429379, + "city": "Alexander", + "state": "IA", + "county": "Franklin" + }, + { + "zip_code": 50421, + "latitude": 42.783801, + "longitude": -93.712614, + "city": "Belmond", + "state": "IA", + "county": "Wright" + }, + { + "zip_code": 50423, + "latitude": 43.081779, + "longitude": -93.734689, + "city": "Britt", + "state": "IA", + "county": "Hancock" + }, + { + "zip_code": 50424, + "latitude": 43.37731, + "longitude": -93.803062, + "city": "Buffalo Center", + "state": "IA", + "county": "Winnebago" + }, + { + "zip_code": 50426, + "latitude": 43.414935, + "longitude": -93.002846, + "city": "Carpenter", + "state": "IA", + "county": "Mitchell" + }, + { + "zip_code": 50427, + "latitude": 42.834852, + "longitude": -93.222587, + "city": "Chapin", + "state": "IA", + "county": "Franklin" + }, + { + "zip_code": 50428, + "latitude": 43.100399, + "longitude": -93.260676, + "city": "Clear Lake", + "state": "IA", + "county": "Cerro Gordo" + }, + { + "zip_code": 50430, + "latitude": 42.980309, + "longitude": -93.872724, + "city": "Corwith", + "state": "IA", + "county": "Hancock" + }, + { + "zip_code": 50431, + "latitude": 42.738164, + "longitude": -93.369996, + "city": "Coulter", + "state": "IA", + "county": "Franklin" + }, + { + "zip_code": 50432, + "latitude": 43.21835, + "longitude": -93.800697, + "city": "Crystal Lake", + "state": "IA", + "county": "Hancock" + }, + { + "zip_code": 50433, + "latitude": 43.053101, + "longitude": -93.261024, + "city": "Dougherty", + "state": "IA", + "county": "Cerro Gordo" + }, + { + "zip_code": 50434, + "latitude": 43.299228, + "longitude": -93.28496, + "city": "Fertile", + "state": "IA", + "county": "Worth" + }, + { + "zip_code": 50435, + "latitude": 43.136067, + "longitude": -92.77932, + "city": "Floyd", + "state": "IA", + "county": "Floyd" + }, + { + "zip_code": 50436, + "latitude": 43.299419, + "longitude": -93.684781, + "city": "Forest City", + "state": "IA", + "county": "Winnebago" + }, + { + "zip_code": 50438, + "latitude": 43.089116, + "longitude": -93.734009, + "city": "Garner", + "state": "IA", + "county": "Hancock" + }, + { + "zip_code": 50439, + "latitude": 43.074783, + "longitude": -93.675089, + "city": "Goodell", + "state": "IA", + "county": "Hancock" + }, + { + "zip_code": 50440, + "latitude": 43.320548, + "longitude": -93.200006, + "city": "Grafton", + "state": "IA", + "county": "Worth" + }, + { + "zip_code": 50441, + "latitude": 42.731454, + "longitude": -93.230657, + "city": "Hampton", + "state": "IA", + "county": "Franklin" + }, + { + "zip_code": 50444, + "latitude": 43.32067, + "longitude": -93.378938, + "city": "Hanlontown", + "state": "IA", + "county": "Worth" + }, + { + "zip_code": 50446, + "latitude": 43.353565, + "longitude": -93.3832, + "city": "Joice", + "state": "IA", + "county": "Worth" + }, + { + "zip_code": 50447, + "latitude": 43.069212, + "longitude": -93.734839, + "city": "Kanawha", + "state": "IA", + "county": "Hancock" + }, + { + "zip_code": 50448, + "latitude": 43.359809, + "longitude": -93.240306, + "city": "Kensett", + "state": "IA", + "county": "Worth" + }, + { + "zip_code": 50449, + "latitude": 42.991727, + "longitude": -93.566985, + "city": "Klemme", + "state": "IA", + "county": "Hancock" + }, + { + "zip_code": 50450, + "latitude": 43.408993, + "longitude": -93.567204, + "city": "Lake Mills", + "state": "IA", + "county": "Winnebago" + }, + { + "zip_code": 50451, + "latitude": 43.366038, + "longitude": -94.10309, + "city": "Lakota", + "state": "IA", + "county": "Kossuth" + }, + { + "zip_code": 50452, + "latitude": 42.782628, + "longitude": -93.389744, + "city": "Latimer", + "state": "IA", + "county": "Franklin" + }, + { + "zip_code": 50453, + "latitude": 43.342548, + "longitude": -93.689464, + "city": "Leland", + "state": "IA", + "county": "Winnebago" + }, + { + "zip_code": 50454, + "latitude": 43.385605, + "longitude": -92.738099, + "city": "Little Cedar", + "state": "IA", + "county": "Mitchell" + }, + { + "zip_code": 50455, + "latitude": 43.457197, + "longitude": -92.63316, + "city": "Mc Intire", + "state": "IA", + "county": "Mitchell" + }, + { + "zip_code": 50456, + "latitude": 43.342237, + "longitude": -93.271287, + "city": "Manly", + "state": "IA", + "county": "Worth" + }, + { + "zip_code": 50457, + "latitude": 43.059175, + "longitude": -93.292969, + "city": "Meservey", + "state": "IA", + "county": "Cerro Gordo" + }, + { + "zip_code": 50458, + "latitude": 43.149677, + "longitude": -92.974488, + "city": "Nora Springs", + "state": "IA", + "county": "Floyd" + }, + { + "zip_code": 50459, + "latitude": 43.428355, + "longitude": -93.261042, + "city": "Northwood", + "state": "IA", + "county": "Worth" + }, + { + "zip_code": 50460, + "latitude": 43.234006, + "longitude": -92.686031, + "city": "Orchard", + "state": "IA", + "county": "Mitchell" + }, + { + "zip_code": 50461, + "latitude": 43.320773, + "longitude": -92.789683, + "city": "Osage", + "state": "IA", + "county": "Mitchell" + }, + { + "zip_code": 50464, + "latitude": 43.234199, + "longitude": -93.082854, + "city": "Plymouth", + "state": "IA", + "county": "Cerro Gordo" + }, + { + "zip_code": 50465, + "latitude": 43.464673, + "longitude": -93.872202, + "city": "Rake", + "state": "IA", + "county": "Winnebago" + }, + { + "zip_code": 50466, + "latitude": 43.381795, + "longitude": -92.475226, + "city": "Riceville", + "state": "IA", + "county": "Howard" + }, + { + "zip_code": 50467, + "latitude": 43.206593, + "longitude": -93.08574, + "city": "Rock Falls", + "state": "IA", + "county": "Cerro Gordo" + }, + { + "zip_code": 50468, + "latitude": 43.016911, + "longitude": -92.907599, + "city": "Rockford", + "state": "IA", + "county": "Floyd" + }, + { + "zip_code": 50469, + "latitude": 43.00211, + "longitude": -93.181709, + "city": "Rockwell", + "state": "IA", + "county": "Cerro Gordo" + }, + { + "zip_code": 50470, + "latitude": 42.724794, + "longitude": -93.558042, + "city": "Rowan", + "state": "IA", + "county": "Wright" + }, + { + "zip_code": 50471, + "latitude": 43.128382, + "longitude": -92.887374, + "city": "Rudd", + "state": "IA", + "county": "Floyd" + }, + { + "zip_code": 50472, + "latitude": 43.406399, + "longitude": -92.810582, + "city": "Saint Ansgar", + "state": "IA", + "county": "Mitchell" + }, + { + "zip_code": 50473, + "latitude": 43.457336, + "longitude": -93.674587, + "city": "Scarville", + "state": "IA", + "county": "Winnebago" + }, + { + "zip_code": 50475, + "latitude": 42.732312, + "longitude": -93.262211, + "city": "Sheffield", + "state": "IA", + "county": "Franklin" + }, + { + "zip_code": 50476, + "latitude": 43.435628, + "longitude": -92.853243, + "city": "Stacyville", + "state": "IA", + "county": "Mitchell" + }, + { + "zip_code": 50477, + "latitude": 42.984273, + "longitude": -93.35609, + "city": "Swaledale", + "state": "IA", + "county": "Cerro Gordo" + }, + { + "zip_code": 50478, + "latitude": 43.406406, + "longitude": -93.748603, + "city": "Thompson", + "state": "IA", + "county": "Winnebago" + }, + { + "zip_code": 50479, + "latitude": 43.077155, + "longitude": -93.312569, + "city": "Thornton", + "state": "IA", + "county": "Cerro Gordo" + }, + { + "zip_code": 50480, + "latitude": 43.253389, + "longitude": -94.05929, + "city": "Titonka", + "state": "IA", + "county": "Kossuth" + }, + { + "zip_code": 50481, + "latitude": 43.356439, + "longitude": -92.788967, + "city": "Toeterville", + "state": "IA", + "county": "Mitchell" + }, + { + "zip_code": 50482, + "latitude": 43.111474, + "longitude": -93.467873, + "city": "Ventura", + "state": "IA", + "county": "Cerro Gordo" + }, + { + "zip_code": 50483, + "latitude": 43.103297, + "longitude": -94.029455, + "city": "Wesley", + "state": "IA", + "county": "Kossuth" + }, + { + "zip_code": 50484, + "latitude": 43.197698, + "longitude": -93.881521, + "city": "Woden", + "state": "IA", + "county": "Hancock" + }, + { + "zip_code": 50501, + "latitude": 42.438596, + "longitude": -94.166587, + "city": "Fort Dodge", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50510, + "latitude": 42.735002, + "longitude": -95.151118, + "city": "Albert City", + "state": "IA", + "county": "Buena Vista" + }, + { + "zip_code": 50511, + "latitude": 43.109313, + "longitude": -94.166994, + "city": "Algona", + "state": "IA", + "county": "Kossuth" + }, + { + "zip_code": 50514, + "latitude": 43.407517, + "longitude": -94.531703, + "city": "Armstrong", + "state": "IA", + "county": "Emmet" + }, + { + "zip_code": 50515, + "latitude": 43.01825, + "longitude": -94.855316, + "city": "Ayrshire", + "state": "IA", + "county": "Palo Alto" + }, + { + "zip_code": 50516, + "latitude": 42.601287, + "longitude": -94.148103, + "city": "Badger", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50517, + "latitude": 43.306166, + "longitude": -94.251434, + "city": "Bancroft", + "state": "IA", + "county": "Kossuth" + }, + { + "zip_code": 50518, + "latitude": 42.552043, + "longitude": -94.369181, + "city": "Barnum", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50519, + "latitude": 42.863891, + "longitude": -94.295698, + "city": "Bode", + "state": "IA", + "county": "Humboldt" + }, + { + "zip_code": 50520, + "latitude": 42.801126, + "longitude": -94.358387, + "city": "Bradgate", + "state": "IA", + "county": "Humboldt" + }, + { + "zip_code": 50521, + "latitude": 42.346605, + "longitude": -94.116205, + "city": "Burnside", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50522, + "latitude": 43.183395, + "longitude": -94.177422, + "city": "Burt", + "state": "IA", + "county": "Kossuth" + }, + { + "zip_code": 50523, + "latitude": 42.347134, + "longitude": -94.280864, + "city": "Callender", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50524, + "latitude": 42.514307, + "longitude": -94.212455, + "city": "Clare", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50525, + "latitude": 42.703045, + "longitude": -93.745623, + "city": "Clarion", + "state": "IA", + "county": "Wright" + }, + { + "zip_code": 50526, + "latitude": 42.733001, + "longitude": -93.73523, + "city": "Clarion", + "state": "IA", + "county": "Wright" + }, + { + "zip_code": 50527, + "latitude": 42.970187, + "longitude": -94.769596, + "city": "Curlew", + "state": "IA", + "county": "Palo Alto" + }, + { + "zip_code": 50528, + "latitude": 43.124819, + "longitude": -94.531189, + "city": "Cylinder", + "state": "IA", + "county": "Palo Alto" + }, + { + "zip_code": 50529, + "latitude": 42.73695, + "longitude": -94.243675, + "city": "Dakota City", + "state": "IA", + "county": "Humboldt" + }, + { + "zip_code": 50530, + "latitude": 42.281924, + "longitude": -94.110777, + "city": "Dayton", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50531, + "latitude": 43.449975, + "longitude": -94.610236, + "city": "Dolliver", + "state": "IA", + "county": "Emmet" + }, + { + "zip_code": 50532, + "latitude": 42.463053, + "longitude": -94.016459, + "city": "Duncombe", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50533, + "latitude": 42.646337, + "longitude": -93.882675, + "city": "Eagle Grove", + "state": "IA", + "county": "Wright" + }, + { + "zip_code": 50535, + "latitude": 42.458243, + "longitude": -95.16624, + "city": "Early", + "state": "IA", + "county": "Sac" + }, + { + "zip_code": 50536, + "latitude": 43.118345, + "longitude": -94.690755, + "city": "Emmetsburg", + "state": "IA", + "county": "Palo Alto" + }, + { + "zip_code": 50538, + "latitude": 42.279298, + "longitude": -94.465144, + "city": "Farnhamville", + "state": "IA", + "county": "Calhoun" + }, + { + "zip_code": 50539, + "latitude": 43.241336, + "longitude": -94.384458, + "city": "Fenton", + "state": "IA", + "county": "Kossuth" + }, + { + "zip_code": 50540, + "latitude": 42.646211, + "longitude": -94.797046, + "city": "Fonda", + "state": "IA", + "county": "Pocahontas" + }, + { + "zip_code": 50541, + "latitude": 42.720638, + "longitude": -94.393684, + "city": "Gilmore City", + "state": "IA", + "county": "Humboldt" + }, + { + "zip_code": 50542, + "latitude": 42.785534, + "longitude": -93.91222, + "city": "Goldfield", + "state": "IA", + "county": "Wright" + }, + { + "zip_code": 50543, + "latitude": 42.325308, + "longitude": -94.25193, + "city": "Gowrie", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50544, + "latitude": 42.260243, + "longitude": -94.16463, + "city": "Harcourt", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50545, + "latitude": 42.797529, + "longitude": -94.079932, + "city": "Hardy", + "state": "IA", + "county": "Humboldt" + }, + { + "zip_code": 50546, + "latitude": 42.842446, + "longitude": -94.721926, + "city": "Havelock", + "state": "IA", + "county": "Pocahontas" + }, + { + "zip_code": 50548, + "latitude": 42.775833, + "longitude": -94.207763, + "city": "Humboldt", + "state": "IA", + "county": "Humboldt" + }, + { + "zip_code": 50551, + "latitude": 42.487057, + "longitude": -94.756959, + "city": "Jolley", + "state": "IA", + "county": "Calhoun" + }, + { + "zip_code": 50552, + "latitude": 42.42361, + "longitude": -94.458642, + "city": "Knierim", + "state": "IA", + "county": "Calhoun" + }, + { + "zip_code": 50554, + "latitude": 42.821248, + "longitude": -94.835889, + "city": "Laurens", + "state": "IA", + "county": "Pocahontas" + }, + { + "zip_code": 50556, + "latitude": 43.443079, + "longitude": -94.187319, + "city": "Ledyard", + "state": "IA", + "county": "Kossuth" + }, + { + "zip_code": 50557, + "latitude": 42.390452, + "longitude": -94.048108, + "city": "Lehigh", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50558, + "latitude": 42.841534, + "longitude": -94.163578, + "city": "Livermore", + "state": "IA", + "county": "Humboldt" + }, + { + "zip_code": 50559, + "latitude": 43.219959, + "longitude": -94.309997, + "city": "Lone Rock", + "state": "IA", + "county": "Kossuth" + }, + { + "zip_code": 50560, + "latitude": 42.976166, + "longitude": -94.124477, + "city": "Lu Verne", + "state": "IA", + "county": "Kossuth" + }, + { + "zip_code": 50561, + "latitude": 42.421312, + "longitude": -94.821328, + "city": "Lytton", + "state": "IA", + "county": "Calhoun" + }, + { + "zip_code": 50562, + "latitude": 42.973755, + "longitude": -94.644417, + "city": "Mallard", + "state": "IA", + "county": "Palo Alto" + }, + { + "zip_code": 50563, + "latitude": 42.50089, + "longitude": -94.57695, + "city": "Manson", + "state": "IA", + "county": "Calhoun" + }, + { + "zip_code": 50565, + "latitude": 42.858254, + "longitude": -94.9984, + "city": "Marathon", + "state": "IA", + "county": "Buena Vista" + }, + { + "zip_code": 50566, + "latitude": 42.440996, + "longitude": -94.315601, + "city": "Moorland", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50567, + "latitude": 42.509655, + "longitude": -95.104435, + "city": "Nemaha", + "state": "IA", + "county": "Sac" + }, + { + "zip_code": 50568, + "latitude": 42.705762, + "longitude": -95.003782, + "city": "Newell", + "state": "IA", + "county": "Buena Vista" + }, + { + "zip_code": 50569, + "latitude": 42.437722, + "longitude": -94.220655, + "city": "Otho", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50570, + "latitude": 42.841797, + "longitude": -94.374343, + "city": "Ottosen", + "state": "IA", + "county": "Humboldt" + }, + { + "zip_code": 50571, + "latitude": 42.645733, + "longitude": -94.560735, + "city": "Palmer", + "state": "IA", + "county": "Pocahontas" + }, + { + "zip_code": 50573, + "latitude": 42.864825, + "longitude": -94.619745, + "city": "Plover", + "state": "IA", + "county": "Pocahontas" + }, + { + "zip_code": 50574, + "latitude": 42.726507, + "longitude": -94.650755, + "city": "Pocahontas", + "state": "IA", + "county": "Pocahontas" + }, + { + "zip_code": 50575, + "latitude": 42.519205, + "longitude": -94.678445, + "city": "Pomeroy", + "state": "IA", + "county": "Calhoun" + }, + { + "zip_code": 50576, + "latitude": 42.825241, + "longitude": -95.141444, + "city": "Rembrandt", + "state": "IA", + "county": "Buena Vista" + }, + { + "zip_code": 50577, + "latitude": 42.844755, + "longitude": -94.1314, + "city": "Renwick", + "state": "IA", + "county": "Humboldt" + }, + { + "zip_code": 50578, + "latitude": 43.31281, + "longitude": -94.560669, + "city": "Ringsted", + "state": "IA", + "county": "Emmet" + }, + { + "zip_code": 50579, + "latitude": 42.393114, + "longitude": -94.633664, + "city": "Rockwell City", + "state": "IA", + "county": "Calhoun" + }, + { + "zip_code": 50581, + "latitude": 42.744133, + "longitude": -94.642302, + "city": "Rolfe", + "state": "IA", + "county": "Pocahontas" + }, + { + "zip_code": 50582, + "latitude": 42.79315, + "longitude": -94.305614, + "city": "Rutland", + "state": "IA", + "county": "Humboldt" + }, + { + "zip_code": 50583, + "latitude": 42.439752, + "longitude": -94.992967, + "city": "Sac City", + "state": "IA", + "county": "Sac" + }, + { + "zip_code": 50585, + "latitude": 42.757096, + "longitude": -95.103677, + "city": "Sioux Rapids", + "state": "IA", + "county": "Buena Vista" + }, + { + "zip_code": 50586, + "latitude": 42.386479, + "longitude": -94.454529, + "city": "Somers", + "state": "IA", + "county": "Calhoun" + }, + { + "zip_code": 50588, + "latitude": 42.693184, + "longitude": -95.151811, + "city": "Storm Lake", + "state": "IA", + "county": "Buena Vista" + }, + { + "zip_code": 50590, + "latitude": 43.283285, + "longitude": -94.295584, + "city": "Swea City", + "state": "IA", + "county": "Kossuth" + }, + { + "zip_code": 50591, + "latitude": 42.77609, + "longitude": -94.059946, + "city": "Thor", + "state": "IA", + "county": "Humboldt" + }, + { + "zip_code": 50592, + "latitude": 42.726167, + "longitude": -95.185325, + "city": "Truesdale", + "state": "IA", + "county": "Buena Vista" + }, + { + "zip_code": 50593, + "latitude": 42.659794, + "longitude": -94.897858, + "city": "Varina", + "state": "IA", + "county": "Pocahontas" + }, + { + "zip_code": 50594, + "latitude": 42.581749, + "longitude": -94.030651, + "city": "Vincent", + "state": "IA", + "county": "Webster" + }, + { + "zip_code": 50595, + "latitude": 42.434161, + "longitude": -93.825581, + "city": "Webster City", + "state": "IA", + "county": "Hamilton" + }, + { + "zip_code": 50597, + "latitude": 43.002465, + "longitude": -94.501553, + "city": "West Bend", + "state": "IA", + "county": "Palo Alto" + }, + { + "zip_code": 50598, + "latitude": 43.082501, + "longitude": -94.389877, + "city": "Whittemore", + "state": "IA", + "county": "Kossuth" + }, + { + "zip_code": 50599, + "latitude": 42.600976, + "longitude": -93.794414, + "city": "Woolstock", + "state": "IA", + "county": "Wright" + }, + { + "zip_code": 50601, + "latitude": 42.408805, + "longitude": -93.09251, + "city": "Ackley", + "state": "IA", + "county": "Hardin" + }, + { + "zip_code": 50602, + "latitude": 42.697108, + "longitude": -92.7981, + "city": "Allison", + "state": "IA", + "county": "Butler" + }, + { + "zip_code": 50603, + "latitude": 43.13992, + "longitude": -92.424719, + "city": "Alta Vista", + "state": "IA", + "county": "Chickasaw" + }, + { + "zip_code": 50604, + "latitude": 42.657249, + "longitude": -92.895287, + "city": "Aplington", + "state": "IA", + "county": "Butler" + }, + { + "zip_code": 50605, + "latitude": 42.804004, + "longitude": -92.985938, + "city": "Aredale", + "state": "IA", + "county": "Butler" + }, + { + "zip_code": 50606, + "latitude": 42.752653, + "longitude": -91.69556, + "city": "Arlington", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 50607, + "latitude": 42.570346, + "longitude": -91.748063, + "city": "Aurora", + "state": "IA", + "county": "Buchanan" + }, + { + "zip_code": 50608, + "latitude": 42.58243, + "longitude": -92.95988, + "city": "Austinville", + "state": "IA", + "county": "Butler" + }, + { + "zip_code": 50609, + "latitude": 42.260476, + "longitude": -92.806788, + "city": "Beaman", + "state": "IA", + "county": "Grundy" + }, + { + "zip_code": 50611, + "latitude": 42.811045, + "longitude": -92.882596, + "city": "Bristow", + "state": "IA", + "county": "Butler" + }, + { + "zip_code": 50612, + "latitude": 42.271906, + "longitude": -92.388908, + "city": "Buckingham", + "state": "IA", + "county": "Tama" + }, + { + "zip_code": 50613, + "latitude": 42.517091, + "longitude": -92.43585, + "city": "Cedar Falls", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50614, + "latitude": 42.469768, + "longitude": -92.309475, + "city": "Cedar Falls", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50616, + "latitude": 43.059926, + "longitude": -92.789058, + "city": "Charles City", + "state": "IA", + "county": "Floyd" + }, + { + "zip_code": 50619, + "latitude": 42.793119, + "longitude": -92.653238, + "city": "Clarksville", + "state": "IA", + "county": "Butler" + }, + { + "zip_code": 50620, + "latitude": 43.110765, + "longitude": -92.744821, + "city": "Colwell", + "state": "IA", + "county": "Floyd" + }, + { + "zip_code": 50621, + "latitude": 42.261859, + "longitude": -92.913373, + "city": "Conrad", + "state": "IA", + "county": "Grundy" + }, + { + "zip_code": 50622, + "latitude": 42.686195, + "longitude": -92.387102, + "city": "Denver", + "state": "IA", + "county": "Bremer" + }, + { + "zip_code": 50623, + "latitude": 42.525282, + "longitude": -92.220701, + "city": "Dewar", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50624, + "latitude": 42.377438, + "longitude": -92.713296, + "city": "Dike", + "state": "IA", + "county": "Grundy" + }, + { + "zip_code": 50625, + "latitude": 42.753663, + "longitude": -92.912537, + "city": "Dumont", + "state": "IA", + "county": "Butler" + }, + { + "zip_code": 50626, + "latitude": 42.562505, + "longitude": -92.178342, + "city": "Dunkerton", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50627, + "latitude": 42.335289, + "longitude": -93.141651, + "city": "Eldora", + "state": "IA", + "county": "Hardin" + }, + { + "zip_code": 50628, + "latitude": 43.296535, + "longitude": -92.3868, + "city": "Elma", + "state": "IA", + "county": "Howard" + }, + { + "zip_code": 50629, + "latitude": 42.577399, + "longitude": -91.981702, + "city": "Fairbank", + "state": "IA", + "county": "Buchanan" + }, + { + "zip_code": 50630, + "latitude": 43.052855, + "longitude": -92.205513, + "city": "Fredericksburg", + "state": "IA", + "county": "Chickasaw" + }, + { + "zip_code": 50631, + "latitude": 42.882661, + "longitude": -92.306271, + "city": "Frederika", + "state": "IA", + "county": "Bremer" + }, + { + "zip_code": 50632, + "latitude": 42.101125, + "longitude": -92.674254, + "city": "Garwin", + "state": "IA", + "county": "Tama" + }, + { + "zip_code": 50633, + "latitude": 42.669601, + "longitude": -93.114687, + "city": "Geneva", + "state": "IA", + "county": "Franklin" + }, + { + "zip_code": 50634, + "latitude": 42.419686, + "longitude": -92.21986, + "city": "Gilbertville", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50635, + "latitude": 42.194806, + "longitude": -92.533334, + "city": "Gladbrook", + "state": "IA", + "county": "Tama" + }, + { + "zip_code": 50636, + "latitude": 42.826237, + "longitude": -92.84909, + "city": "Greene", + "state": "IA", + "county": "Butler" + }, + { + "zip_code": 50638, + "latitude": 42.369118, + "longitude": -92.807878, + "city": "Grundy Center", + "state": "IA", + "county": "Grundy" + }, + { + "zip_code": 50641, + "latitude": 42.574258, + "longitude": -91.924112, + "city": "Hazleton", + "state": "IA", + "county": "Buchanan" + }, + { + "zip_code": 50642, + "latitude": 42.44797, + "longitude": -92.817924, + "city": "Holland", + "state": "IA", + "county": "Grundy" + }, + { + "zip_code": 50643, + "latitude": 42.383317, + "longitude": -92.416125, + "city": "Hudson", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50644, + "latitude": 42.506055, + "longitude": -91.81214, + "city": "Independence", + "state": "IA", + "county": "Buchanan" + }, + { + "zip_code": 50645, + "latitude": 43.052822, + "longitude": -92.445706, + "city": "Ionia", + "state": "IA", + "county": "Chickasaw" + }, + { + "zip_code": 50647, + "latitude": 42.665934, + "longitude": -92.465858, + "city": "Janesville", + "state": "IA", + "county": "Bremer" + }, + { + "zip_code": 50648, + "latitude": 42.482524, + "longitude": -91.90519, + "city": "Jesup", + "state": "IA", + "county": "Buchanan" + }, + { + "zip_code": 50649, + "latitude": 42.662619, + "longitude": -92.911151, + "city": "Kesley", + "state": "IA", + "county": "Butler" + }, + { + "zip_code": 50650, + "latitude": 42.585655, + "longitude": -91.716494, + "city": "Lamont", + "state": "IA", + "county": "Buchanan" + }, + { + "zip_code": 50651, + "latitude": 42.369559, + "longitude": -92.206097, + "city": "La Porte City", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50652, + "latitude": 42.264291, + "longitude": -92.693018, + "city": "Lincoln", + "state": "IA", + "county": "Tama" + }, + { + "zip_code": 50653, + "latitude": 43.060131, + "longitude": -92.877776, + "city": "Marble Rock", + "state": "IA", + "county": "Floyd" + }, + { + "zip_code": 50654, + "latitude": 42.457286, + "longitude": -91.564233, + "city": "Masonville", + "state": "IA", + "county": "Delaware" + }, + { + "zip_code": 50655, + "latitude": 42.878853, + "longitude": -91.917241, + "city": "Maynard", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 50657, + "latitude": 42.343304, + "longitude": -92.673819, + "city": "Morrison", + "state": "IA", + "county": "Grundy" + }, + { + "zip_code": 50658, + "latitude": 42.985096, + "longitude": -92.475463, + "city": "Nashua", + "state": "IA", + "county": "Chickasaw" + }, + { + "zip_code": 50659, + "latitude": 43.065359, + "longitude": -92.338474, + "city": "New Hampton", + "state": "IA", + "county": "Chickasaw" + }, + { + "zip_code": 50660, + "latitude": 42.599292, + "longitude": -92.623199, + "city": "New Hartford", + "state": "IA", + "county": "Butler" + }, + { + "zip_code": 50661, + "latitude": 43.117425, + "longitude": -92.414422, + "city": "North Washington", + "state": "IA", + "county": "Chickasaw" + }, + { + "zip_code": 50662, + "latitude": 42.693463, + "longitude": -91.853578, + "city": "Oelwein", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 50664, + "latitude": 42.862275, + "longitude": -91.843639, + "city": "Oran", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 50665, + "latitude": 42.655813, + "longitude": -92.824122, + "city": "Parkersburg", + "state": "IA", + "county": "Butler" + }, + { + "zip_code": 50666, + "latitude": 42.840591, + "longitude": -92.470373, + "city": "Plainfield", + "state": "IA", + "county": "Bremer" + }, + { + "zip_code": 50667, + "latitude": 42.466587, + "longitude": -92.21642, + "city": "Raymond", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50668, + "latitude": 42.693337, + "longitude": -92.219605, + "city": "Readlyn", + "state": "IA", + "county": "Bremer" + }, + { + "zip_code": 50669, + "latitude": 42.332039, + "longitude": -92.705292, + "city": "Reinbeck", + "state": "IA", + "county": "Grundy" + }, + { + "zip_code": 50670, + "latitude": 42.674311, + "longitude": -92.633495, + "city": "Shell Rock", + "state": "IA", + "county": "Butler" + }, + { + "zip_code": 50671, + "latitude": 42.614435, + "longitude": -91.795647, + "city": "Stanley", + "state": "IA", + "county": "Buchanan" + }, + { + "zip_code": 50672, + "latitude": 42.412327, + "longitude": -93.084751, + "city": "Steamboat Rock", + "state": "IA", + "county": "Hardin" + }, + { + "zip_code": 50673, + "latitude": 42.525507, + "longitude": -92.70291, + "city": "Stout", + "state": "IA", + "county": "Grundy" + }, + { + "zip_code": 50674, + "latitude": 42.787919, + "longitude": -92.309263, + "city": "Sumner", + "state": "IA", + "county": "Bremer" + }, + { + "zip_code": 50675, + "latitude": 42.173618, + "longitude": -92.527236, + "city": "Traer", + "state": "IA", + "county": "Tama" + }, + { + "zip_code": 50676, + "latitude": 42.786204, + "longitude": -92.278632, + "city": "Tripoli", + "state": "IA", + "county": "Bremer" + }, + { + "zip_code": 50677, + "latitude": 42.774781, + "longitude": -92.403969, + "city": "Waverly", + "state": "IA", + "county": "Bremer" + }, + { + "zip_code": 50680, + "latitude": 42.445049, + "longitude": -92.926227, + "city": "Wellsburg", + "state": "IA", + "county": "Grundy" + }, + { + "zip_code": 50681, + "latitude": 42.781206, + "longitude": -92.012235, + "city": "Westgate", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 50682, + "latitude": 42.433855, + "longitude": -91.831019, + "city": "Winthrop", + "state": "IA", + "county": "Buchanan" + }, + { + "zip_code": 50701, + "latitude": 42.441117, + "longitude": -92.339209, + "city": "Waterloo", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50702, + "latitude": 42.458761, + "longitude": -92.313876, + "city": "Waterloo", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50703, + "latitude": 42.549802, + "longitude": -92.258493, + "city": "Waterloo", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50704, + "latitude": 42.469768, + "longitude": -92.309475, + "city": "Waterloo", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50706, + "latitude": 42.415638, + "longitude": -92.270339, + "city": "Waterloo", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50707, + "latitude": 42.482297, + "longitude": -92.276183, + "city": "Evansdale", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50799, + "latitude": 42.469768, + "longitude": -92.309475, + "city": "Waterloo", + "state": "IA", + "county": "Black Hawk" + }, + { + "zip_code": 50801, + "latitude": 41.049896, + "longitude": -94.347137, + "city": "Creston", + "state": "IA", + "county": "Union" + }, + { + "zip_code": 50830, + "latitude": 41.033593, + "longitude": -94.19714, + "city": "Afton", + "state": "IA", + "county": "Union" + }, + { + "zip_code": 50831, + "latitude": 40.931394, + "longitude": -94.219334, + "city": "Arispe", + "state": "IA", + "county": "Union" + }, + { + "zip_code": 50833, + "latitude": 40.687613, + "longitude": -94.690576, + "city": "Bedford", + "state": "IA", + "county": "Taylor" + }, + { + "zip_code": 50835, + "latitude": 40.735117, + "longitude": -94.243258, + "city": "Benton", + "state": "IA", + "county": "Ringgold" + }, + { + "zip_code": 50836, + "latitude": 40.624823, + "longitude": -94.547407, + "city": "Blockton", + "state": "IA", + "county": "Taylor" + }, + { + "zip_code": 50837, + "latitude": 41.258885, + "longitude": -94.666868, + "city": "Bridgewater", + "state": "IA", + "county": "Adair" + }, + { + "zip_code": 50839, + "latitude": 41.048733, + "longitude": -94.823088, + "city": "Carbon", + "state": "IA", + "county": "Adams" + }, + { + "zip_code": 50840, + "latitude": 40.782221, + "longitude": -94.606348, + "city": "Clearfield", + "state": "IA", + "county": "Taylor" + }, + { + "zip_code": 50841, + "latitude": 41.028942, + "longitude": -94.746591, + "city": "Corning", + "state": "IA", + "county": "Adams" + }, + { + "zip_code": 50842, + "latitude": 41.039762, + "longitude": -94.461622, + "city": "Cromwell", + "state": "IA", + "county": "Union" + }, + { + "zip_code": 50843, + "latitude": 41.255042, + "longitude": -94.947597, + "city": "Cumberland", + "state": "IA", + "county": "Cass" + }, + { + "zip_code": 50845, + "latitude": 40.727999, + "longitude": -94.292656, + "city": "Diagonal", + "state": "IA", + "county": "Ringgold" + }, + { + "zip_code": 50846, + "latitude": 41.300894, + "longitude": -94.54783, + "city": "Fontanelle", + "state": "IA", + "county": "Adair" + }, + { + "zip_code": 50847, + "latitude": 41.142675, + "longitude": -94.984159, + "city": "Grant", + "state": "IA", + "county": "Montgomery" + }, + { + "zip_code": 50848, + "latitude": 40.772971, + "longitude": -94.737189, + "city": "Gravity", + "state": "IA", + "county": "Taylor" + }, + { + "zip_code": 50849, + "latitude": 41.299977, + "longitude": -94.456404, + "city": "Greenfield", + "state": "IA", + "county": "Adair" + }, + { + "zip_code": 50851, + "latitude": 40.844837, + "longitude": -94.585174, + "city": "Lenox", + "state": "IA", + "county": "Taylor" + }, + { + "zip_code": 50853, + "latitude": 41.229493, + "longitude": -94.784375, + "city": "Massena", + "state": "IA", + "county": "Cass" + }, + { + "zip_code": 50854, + "latitude": 40.716275, + "longitude": -94.228794, + "city": "Mount Ayr", + "state": "IA", + "county": "Ringgold" + }, + { + "zip_code": 50857, + "latitude": 40.9765, + "longitude": -94.871606, + "city": "Nodaway", + "state": "IA", + "county": "Adams" + }, + { + "zip_code": 50858, + "latitude": 41.215096, + "longitude": -94.423224, + "city": "Orient", + "state": "IA", + "county": "Adair" + }, + { + "zip_code": 50859, + "latitude": 41.057677, + "longitude": -94.594228, + "city": "Prescott", + "state": "IA", + "county": "Adams" + }, + { + "zip_code": 50860, + "latitude": 40.604641, + "longitude": -94.388509, + "city": "Redding", + "state": "IA", + "county": "Ringgold" + }, + { + "zip_code": 50861, + "latitude": 40.933655, + "longitude": -94.242881, + "city": "Shannon City", + "state": "IA", + "county": "Union" + }, + { + "zip_code": 50862, + "latitude": 40.812934, + "longitude": -94.662137, + "city": "Sharpsburg", + "state": "IA", + "county": "Taylor" + }, + { + "zip_code": 50863, + "latitude": 40.853588, + "longitude": -94.194013, + "city": "Tingley", + "state": "IA", + "county": "Ringgold" + }, + { + "zip_code": 50864, + "latitude": 41.029639, + "longitude": -95.051602, + "city": "Villisca", + "state": "IA", + "county": "Montgomery" + }, + { + "zip_code": 50936, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50940, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50947, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50950, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50980, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 50981, + "latitude": 41.672687, + "longitude": -93.572173, + "city": "Des Moines", + "state": "IA", + "county": "Polk" + }, + { + "zip_code": 51001, + "latitude": 42.822482, + "longitude": -96.462952, + "city": "Akron", + "state": "IA", + "county": "Plymouth" + }, + { + "zip_code": 51002, + "latitude": 42.735364, + "longitude": -95.151121, + "city": "Alta", + "state": "IA", + "county": "Buena Vista" + }, + { + "zip_code": 51003, + "latitude": 43.03801, + "longitude": -95.970314, + "city": "Alton", + "state": "IA", + "county": "Sioux" + }, + { + "zip_code": 51004, + "latitude": 42.336668, + "longitude": -95.962495, + "city": "Anthon", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51005, + "latitude": 42.719513, + "longitude": -95.534693, + "city": "Aurelia", + "state": "IA", + "county": "Cherokee" + }, + { + "zip_code": 51006, + "latitude": 42.359052, + "longitude": -95.546574, + "city": "Battle Creek", + "state": "IA", + "county": "Ida" + }, + { + "zip_code": 51007, + "latitude": 42.421334, + "longitude": -96.165179, + "city": "Bronson", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51008, + "latitude": 42.809252, + "longitude": -96.26257, + "city": "Brunsville", + "state": "IA", + "county": "Plymouth" + }, + { + "zip_code": 51009, + "latitude": 42.9552, + "longitude": -95.570082, + "city": "Calumet", + "state": "IA", + "county": "Obrien" + }, + { + "zip_code": 51010, + "latitude": 42.080842, + "longitude": -95.903339, + "city": "Castana", + "state": "IA", + "county": "Monona" + }, + { + "zip_code": 51011, + "latitude": 42.926468, + "longitude": -96.494824, + "city": "Chatsworth", + "state": "IA", + "county": "Sioux" + }, + { + "zip_code": 51012, + "latitude": 42.721535, + "longitude": -95.574297, + "city": "Cherokee", + "state": "IA", + "county": "Cherokee" + }, + { + "zip_code": 51014, + "latitude": 42.779201, + "longitude": -95.701743, + "city": "Cleghorn", + "state": "IA", + "county": "Cherokee" + }, + { + "zip_code": 51015, + "latitude": 42.345024, + "longitude": -96.087523, + "city": "Climbing Hill", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51016, + "latitude": 42.394029, + "longitude": -95.969596, + "city": "Correctionville", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51017, + "latitude": 42.896225, + "longitude": -96.309509, + "city": "Craig", + "state": "IA", + "county": "Plymouth" + }, + { + "zip_code": 51018, + "latitude": 42.355069, + "longitude": -96.015944, + "city": "Cushing", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51019, + "latitude": 42.339186, + "longitude": -96.016316, + "city": "Danbury", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51020, + "latitude": 42.487916, + "longitude": -95.430208, + "city": "Galva", + "state": "IA", + "county": "Ida" + }, + { + "zip_code": 51022, + "latitude": 42.974677, + "longitude": -96.086114, + "city": "Granville", + "state": "IA", + "county": "Sioux" + }, + { + "zip_code": 51023, + "latitude": 43.022799, + "longitude": -96.263075, + "city": "Hawarden", + "state": "IA", + "county": "Sioux" + }, + { + "zip_code": 51024, + "latitude": 42.625126, + "longitude": -96.299512, + "city": "Hinton", + "state": "IA", + "county": "Plymouth" + }, + { + "zip_code": 51025, + "latitude": 42.443085, + "longitude": -95.530596, + "city": "Holstein", + "state": "IA", + "county": "Ida" + }, + { + "zip_code": 51026, + "latitude": 42.300778, + "longitude": -96.092119, + "city": "Hornick", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51027, + "latitude": 43.039676, + "longitude": -96.303174, + "city": "Ireton", + "state": "IA", + "county": "Sioux" + }, + { + "zip_code": 51028, + "latitude": 42.619263, + "longitude": -96.077531, + "city": "Kingsley", + "state": "IA", + "county": "Plymouth" + }, + { + "zip_code": 51029, + "latitude": 42.873445, + "longitude": -95.565095, + "city": "Larrabee", + "state": "IA", + "county": "Cherokee" + }, + { + "zip_code": 51030, + "latitude": 42.475035, + "longitude": -96.03323, + "city": "Lawton", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51031, + "latitude": 42.749146, + "longitude": -96.261735, + "city": "Le Mars", + "state": "IA", + "county": "Plymouth" + }, + { + "zip_code": 51033, + "latitude": 42.865889, + "longitude": -95.274623, + "city": "Linn Grove", + "state": "IA", + "county": "Buena Vista" + }, + { + "zip_code": 51034, + "latitude": 42.137392, + "longitude": -95.913273, + "city": "Mapleton", + "state": "IA", + "county": "Monona" + }, + { + "zip_code": 51035, + "latitude": 42.76416, + "longitude": -95.786406, + "city": "Marcus", + "state": "IA", + "county": "Cherokee" + }, + { + "zip_code": 51036, + "latitude": 42.975118, + "longitude": -96.307201, + "city": "Maurice", + "state": "IA", + "county": "Sioux" + }, + { + "zip_code": 51037, + "latitude": 42.822577, + "longitude": -95.642519, + "city": "Meriden", + "state": "IA", + "county": "Cherokee" + }, + { + "zip_code": 51038, + "latitude": 42.764455, + "longitude": -96.354983, + "city": "Merrill", + "state": "IA", + "county": "Plymouth" + }, + { + "zip_code": 51039, + "latitude": 42.444948, + "longitude": -96.069377, + "city": "Moville", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51040, + "latitude": 42.021131, + "longitude": -96.129525, + "city": "Onawa", + "state": "IA", + "county": "Monona" + }, + { + "zip_code": 51041, + "latitude": 43.033432, + "longitude": -96.076051, + "city": "Orange City", + "state": "IA", + "county": "Sioux" + }, + { + "zip_code": 51044, + "latitude": 42.298397, + "longitude": -95.972137, + "city": "Oto", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51045, + "latitude": 42.8199, + "longitude": -96.056556, + "city": "Oyens", + "state": "IA", + "county": "Plymouth" + }, + { + "zip_code": 51046, + "latitude": 42.982521, + "longitude": -95.69489, + "city": "Paullina", + "state": "IA", + "county": "Obrien" + }, + { + "zip_code": 51047, + "latitude": 43.004019, + "longitude": -95.299649, + "city": "Peterson", + "state": "IA", + "county": "Clay" + }, + { + "zip_code": 51048, + "latitude": 42.394713, + "longitude": -96.017208, + "city": "Pierson", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51049, + "latitude": 42.701397, + "longitude": -95.70264, + "city": "Quimby", + "state": "IA", + "county": "Cherokee" + }, + { + "zip_code": 51050, + "latitude": 42.793867, + "longitude": -96.207399, + "city": "Remsen", + "state": "IA", + "county": "Plymouth" + }, + { + "zip_code": 51051, + "latitude": 42.197953, + "longitude": -95.976865, + "city": "Rodney", + "state": "IA", + "county": "Monona" + }, + { + "zip_code": 51052, + "latitude": 42.399824, + "longitude": -96.11349, + "city": "Salix", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51053, + "latitude": 42.480673, + "longitude": -95.265117, + "city": "Schaller", + "state": "IA", + "county": "Sac" + }, + { + "zip_code": 51054, + "latitude": 42.387867, + "longitude": -96.335924, + "city": "Sergeant Bluff", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51055, + "latitude": 42.345513, + "longitude": -96.048349, + "city": "Sloan", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51056, + "latitude": 42.347007, + "longitude": -96.037409, + "city": "Smithland", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51058, + "latitude": 42.997133, + "longitude": -95.486296, + "city": "Sutherland", + "state": "IA", + "county": "Obrien" + }, + { + "zip_code": 51059, + "latitude": 42.033205, + "longitude": -95.965126, + "city": "Turin", + "state": "IA", + "county": "Monona" + }, + { + "zip_code": 51060, + "latitude": 42.033712, + "longitude": -95.720898, + "city": "Ute", + "state": "IA", + "county": "Monona" + }, + { + "zip_code": 51061, + "latitude": 42.691698, + "longitude": -95.628595, + "city": "Washta", + "state": "IA", + "county": "Cherokee" + }, + { + "zip_code": 51062, + "latitude": 42.70123, + "longitude": -96.50939, + "city": "Westfield", + "state": "IA", + "county": "Plymouth" + }, + { + "zip_code": 51063, + "latitude": 42.149647, + "longitude": -96.179563, + "city": "Whiting", + "state": "IA", + "county": "Monona" + }, + { + "zip_code": 51101, + "latitude": 42.494745, + "longitude": -96.399356, + "city": "Sioux City", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51102, + "latitude": 42.368406, + "longitude": -96.317951, + "city": "Sioux City", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51103, + "latitude": 42.523895, + "longitude": -96.435508, + "city": "Sioux City", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51104, + "latitude": 42.472367, + "longitude": -96.106247, + "city": "Sioux City", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51105, + "latitude": 42.481003, + "longitude": -96.403691, + "city": "Sioux City", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51106, + "latitude": 42.471097, + "longitude": -96.338435, + "city": "Sioux City", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51108, + "latitude": 42.5336, + "longitude": -96.354682, + "city": "Sioux City", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51109, + "latitude": 42.527558, + "longitude": -96.453358, + "city": "Sioux City", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51111, + "latitude": 42.423688, + "longitude": -96.378007, + "city": "Sioux City", + "state": "IA", + "county": "Woodbury" + }, + { + "zip_code": 51201, + "latitude": 43.170886, + "longitude": -95.792885, + "city": "Sheldon", + "state": "IA", + "county": "Obrien" + }, + { + "zip_code": 51230, + "latitude": 43.352717, + "longitude": -96.311777, + "city": "Alvord", + "state": "IA", + "county": "Lyon" + }, + { + "zip_code": 51231, + "latitude": 43.098882, + "longitude": -95.743011, + "city": "Archer", + "state": "IA", + "county": "Obrien" + }, + { + "zip_code": 51232, + "latitude": 43.309073, + "longitude": -95.772984, + "city": "Ashton", + "state": "IA", + "county": "Osceola" + }, + { + "zip_code": 51234, + "latitude": 43.186085, + "longitude": -96.005794, + "city": "Boyden", + "state": "IA", + "county": "Sioux" + }, + { + "zip_code": 51235, + "latitude": 43.301697, + "longitude": -96.244934, + "city": "Doon", + "state": "IA", + "county": "Lyon" + }, + { + "zip_code": 51237, + "latitude": 43.345209, + "longitude": -95.988879, + "city": "George", + "state": "IA", + "county": "Lyon" + }, + { + "zip_code": 51238, + "latitude": 43.07719, + "longitude": -95.938839, + "city": "Hospers", + "state": "IA", + "county": "Sioux" + }, + { + "zip_code": 51239, + "latitude": 43.192887, + "longitude": -96.180883, + "city": "Hull", + "state": "IA", + "county": "Sioux" + }, + { + "zip_code": 51240, + "latitude": 43.338402, + "longitude": -96.293245, + "city": "Inwood", + "state": "IA", + "county": "Lyon" + }, + { + "zip_code": 51241, + "latitude": 43.423375, + "longitude": -96.457839, + "city": "Larchwood", + "state": "IA", + "county": "Lyon" + }, + { + "zip_code": 51242, + "latitude": 43.444333, + "longitude": -96.336111, + "city": "Lester", + "state": "IA", + "county": "Lyon" + }, + { + "zip_code": 51243, + "latitude": 43.389621, + "longitude": -96.081644, + "city": "Little Rock", + "state": "IA", + "county": "Lyon" + }, + { + "zip_code": 51244, + "latitude": 43.214976, + "longitude": -95.915089, + "city": "Matlock", + "state": "IA", + "county": "Sioux" + }, + { + "zip_code": 51245, + "latitude": 43.083854, + "longitude": -95.625042, + "city": "Primghar", + "state": "IA", + "county": "Obrien" + }, + { + "zip_code": 51246, + "latitude": 43.415126, + "longitude": -96.146555, + "city": "Rock Rapids", + "state": "IA", + "county": "Lyon" + }, + { + "zip_code": 51247, + "latitude": 43.084636, + "longitude": -96.204802, + "city": "Rock Valley", + "state": "IA", + "county": "Sioux" + }, + { + "zip_code": 51248, + "latitude": 43.172865, + "longitude": -95.643967, + "city": "Sanborn", + "state": "IA", + "county": "Obrien" + }, + { + "zip_code": 51249, + "latitude": 43.377681, + "longitude": -95.624809, + "city": "Sibley", + "state": "IA", + "county": "Osceola" + }, + { + "zip_code": 51250, + "latitude": 43.084013, + "longitude": -96.269648, + "city": "Sioux Center", + "state": "IA", + "county": "Sioux" + }, + { + "zip_code": 51301, + "latitude": 43.13291, + "longitude": -95.177909, + "city": "Spencer", + "state": "IA", + "county": "Clay" + }, + { + "zip_code": 51330, + "latitude": 43.415305, + "longitude": -95.643435, + "city": "Allendorf", + "state": "IA", + "county": "Osceola" + }, + { + "zip_code": 51331, + "latitude": 43.377945, + "longitude": -95.24015, + "city": "Arnolds Park", + "state": "IA", + "county": "Dickinson" + }, + { + "zip_code": 51333, + "latitude": 43.135131, + "longitude": -94.983739, + "city": "Dickens", + "state": "IA", + "county": "Clay" + }, + { + "zip_code": 51334, + "latitude": 43.377886, + "longitude": -94.737792, + "city": "Estherville", + "state": "IA", + "county": "Emmet" + }, + { + "zip_code": 51338, + "latitude": 43.176799, + "longitude": -95.308899, + "city": "Everly", + "state": "IA", + "county": "Clay" + }, + { + "zip_code": 51340, + "latitude": 43.082426, + "longitude": -95.151095, + "city": "Fostoria", + "state": "IA", + "county": "Clay" + }, + { + "zip_code": 51341, + "latitude": 43.015704, + "longitude": -95.043088, + "city": "Gillett Grove", + "state": "IA", + "county": "Clay" + }, + { + "zip_code": 51342, + "latitude": 43.19802, + "longitude": -94.736878, + "city": "Graettinger", + "state": "IA", + "county": "Palo Alto" + }, + { + "zip_code": 51343, + "latitude": 43.107743, + "longitude": -95.140993, + "city": "Greenville", + "state": "IA", + "county": "Clay" + }, + { + "zip_code": 51344, + "latitude": 43.393593, + "longitude": -94.704925, + "city": "Gruver", + "state": "IA", + "county": "Emmet" + }, + { + "zip_code": 51345, + "latitude": 43.399433, + "longitude": -95.437464, + "city": "Harris", + "state": "IA", + "county": "Osceola" + }, + { + "zip_code": 51346, + "latitude": 43.154712, + "longitude": -95.505959, + "city": "Hartley", + "state": "IA", + "county": "Obrien" + }, + { + "zip_code": 51347, + "latitude": 43.399671, + "longitude": -95.284164, + "city": "Lake Park", + "state": "IA", + "county": "Dickinson" + }, + { + "zip_code": 51349, + "latitude": 43.377882, + "longitude": -95.624809, + "city": "May City", + "state": "IA", + "county": "Osceola" + }, + { + "zip_code": 51350, + "latitude": 43.315953, + "longitude": -95.614641, + "city": "Melvin", + "state": "IA", + "county": "Osceola" + }, + { + "zip_code": 51351, + "latitude": 43.367677, + "longitude": -95.208331, + "city": "Milford", + "state": "IA", + "county": "Dickinson" + }, + { + "zip_code": 51354, + "latitude": 43.378852, + "longitude": -95.626901, + "city": "Ocheyedan", + "state": "IA", + "county": "Osceola" + }, + { + "zip_code": 51355, + "latitude": 43.429006, + "longitude": -95.077599, + "city": "Okoboji", + "state": "IA", + "county": "Dickinson" + }, + { + "zip_code": 51357, + "latitude": 43.043676, + "longitude": -95.199867, + "city": "Royal", + "state": "IA", + "county": "Clay" + }, + { + "zip_code": 51358, + "latitude": 43.130459, + "longitude": -94.855389, + "city": "Ruthven", + "state": "IA", + "county": "Palo Alto" + }, + { + "zip_code": 51360, + "latitude": 43.407002, + "longitude": -95.121813, + "city": "Spirit Lake", + "state": "IA", + "county": "Dickinson" + }, + { + "zip_code": 51363, + "latitude": 43.431836, + "longitude": -94.946943, + "city": "Superior", + "state": "IA", + "county": "Dickinson" + }, + { + "zip_code": 51364, + "latitude": 43.35271, + "longitude": -95.119487, + "city": "Terril", + "state": "IA", + "county": "Dickinson" + }, + { + "zip_code": 51365, + "latitude": 43.318868, + "longitude": -94.796359, + "city": "Wallingford", + "state": "IA", + "county": "Emmet" + }, + { + "zip_code": 51366, + "latitude": 42.967221, + "longitude": -95.013216, + "city": "Webb", + "state": "IA", + "county": "Clay" + }, + { + "zip_code": 51401, + "latitude": 42.042547, + "longitude": -94.8338, + "city": "Carroll", + "state": "IA", + "county": "Carroll" + }, + { + "zip_code": 51430, + "latitude": 42.087657, + "longitude": -95.015299, + "city": "Arcadia", + "state": "IA", + "county": "Carroll" + }, + { + "zip_code": 51431, + "latitude": 42.341553, + "longitude": -95.371381, + "city": "Arthur", + "state": "IA", + "county": "Ida" + }, + { + "zip_code": 51432, + "latitude": 41.911924, + "longitude": -95.135602, + "city": "Aspinwall", + "state": "IA", + "county": "Crawford" + }, + { + "zip_code": 51433, + "latitude": 42.340836, + "longitude": -95.080439, + "city": "Auburn", + "state": "IA", + "county": "Sac" + }, + { + "zip_code": 51436, + "latitude": 42.15864, + "longitude": -94.991919, + "city": "Breda", + "state": "IA", + "county": "Carroll" + }, + { + "zip_code": 51439, + "latitude": 42.08798, + "longitude": -95.372611, + "city": "Charter Oak", + "state": "IA", + "county": "Crawford" + }, + { + "zip_code": 51440, + "latitude": 41.960798, + "longitude": -94.833323, + "city": "Dedham", + "state": "IA", + "county": "Carroll" + }, + { + "zip_code": 51441, + "latitude": 42.123762, + "longitude": -95.304518, + "city": "Deloit", + "state": "IA", + "county": "Crawford" + }, + { + "zip_code": 51442, + "latitude": 42.037235, + "longitude": -95.381819, + "city": "Denison", + "state": "IA", + "county": "Crawford" + }, + { + "zip_code": 51443, + "latitude": 42.049241, + "longitude": -94.802643, + "city": "Glidden", + "state": "IA", + "county": "Carroll" + }, + { + "zip_code": 51444, + "latitude": 42.008229, + "longitude": -94.994311, + "city": "Halbur", + "state": "IA", + "county": "Carroll" + }, + { + "zip_code": 51445, + "latitude": 42.326783, + "longitude": -95.477979, + "city": "Ida Grove", + "state": "IA", + "county": "Ida" + }, + { + "zip_code": 51446, + "latitude": 41.684667, + "longitude": -95.325315, + "city": "Irwin", + "state": "IA", + "county": "Shelby" + }, + { + "zip_code": 51447, + "latitude": 41.718539, + "longitude": -95.189811, + "city": "Kirkman", + "state": "IA", + "county": "Shelby" + }, + { + "zip_code": 51448, + "latitude": 42.046292, + "longitude": -95.294668, + "city": "Kiron", + "state": "IA", + "county": "Crawford" + }, + { + "zip_code": 51449, + "latitude": 42.29709, + "longitude": -94.721051, + "city": "Lake City", + "state": "IA", + "county": "Calhoun" + }, + { + "zip_code": 51450, + "latitude": 42.312348, + "longitude": -95.028491, + "city": "Lake View", + "state": "IA", + "county": "Sac" + }, + { + "zip_code": 51451, + "latitude": 42.184481, + "longitude": -94.691739, + "city": "Lanesboro", + "state": "IA", + "county": "Carroll" + }, + { + "zip_code": 51452, + "latitude": 42.125396, + "longitude": -94.775361, + "city": "Lidderdale", + "state": "IA", + "county": "Carroll" + }, + { + "zip_code": 51453, + "latitude": 42.281733, + "longitude": -94.542337, + "city": "Lohrville", + "state": "IA", + "county": "Calhoun" + }, + { + "zip_code": 51454, + "latitude": 41.968254, + "longitude": -95.222803, + "city": "Manilla", + "state": "IA", + "county": "Crawford" + }, + { + "zip_code": 51455, + "latitude": 42.024754, + "longitude": -94.861182, + "city": "Manning", + "state": "IA", + "county": "Carroll" + }, + { + "zip_code": 51458, + "latitude": 42.319844, + "longitude": -95.100688, + "city": "Odebolt", + "state": "IA", + "county": "Sac" + }, + { + "zip_code": 51459, + "latitude": 42.041412, + "longitude": -94.632143, + "city": "Ralston", + "state": "IA", + "county": "Carroll" + }, + { + "zip_code": 51460, + "latitude": 42.130428, + "longitude": -95.574593, + "city": "Ricketts", + "state": "IA", + "county": "Crawford" + }, + { + "zip_code": 51461, + "latitude": 42.137253, + "longitude": -95.388295, + "city": "Schleswig", + "state": "IA", + "county": "Crawford" + }, + { + "zip_code": 51462, + "latitude": 42.02913, + "longitude": -94.541989, + "city": "Scranton", + "state": "IA", + "county": "Greene" + }, + { + "zip_code": 51463, + "latitude": 41.912702, + "longitude": -94.898698, + "city": "Templeton", + "state": "IA", + "county": "Carroll" + }, + { + "zip_code": 51465, + "latitude": 42.037189, + "longitude": -95.256476, + "city": "Vail", + "state": "IA", + "county": "Crawford" + }, + { + "zip_code": 51466, + "latitude": 42.268076, + "longitude": -95.121242, + "city": "Wall Lake", + "state": "IA", + "county": "Sac" + }, + { + "zip_code": 51467, + "latitude": 42.080572, + "longitude": -95.26403, + "city": "Westside", + "state": "IA", + "county": "Crawford" + }, + { + "zip_code": 51501, + "latitude": 41.23238, + "longitude": -95.875086, + "city": "Council Bluffs", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51502, + "latitude": 41.332943, + "longitude": -95.587197, + "city": "Council Bluffs", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51503, + "latitude": 41.286046, + "longitude": -95.711085, + "city": "Council Bluffs", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51510, + "latitude": 41.287335, + "longitude": -95.91689, + "city": "Carter Lake", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51520, + "latitude": 41.979124, + "longitude": -95.450804, + "city": "Arion", + "state": "IA", + "county": "Crawford" + }, + { + "zip_code": 51521, + "latitude": 41.433448, + "longitude": -95.342363, + "city": "Avoca", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51523, + "latitude": 41.915049, + "longitude": -96.049414, + "city": "Blencoe", + "state": "IA", + "county": "Monona" + }, + { + "zip_code": 51525, + "latitude": 41.224143, + "longitude": -95.413327, + "city": "Carson", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51526, + "latitude": 41.363436, + "longitude": -95.887827, + "city": "Crescent", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51527, + "latitude": 41.80531, + "longitude": -95.353707, + "city": "Defiance", + "state": "IA", + "county": "Shelby" + }, + { + "zip_code": 51528, + "latitude": 41.950237, + "longitude": -95.470108, + "city": "Dow City", + "state": "IA", + "county": "Crawford" + }, + { + "zip_code": 51529, + "latitude": 41.779196, + "longitude": -95.716392, + "city": "Dunlap", + "state": "IA", + "county": "Harrison" + }, + { + "zip_code": 51530, + "latitude": 41.787073, + "longitude": -95.438704, + "city": "Earling", + "state": "IA", + "county": "Shelby" + }, + { + "zip_code": 51531, + "latitude": 41.562409, + "longitude": -95.129522, + "city": "Elk Horn", + "state": "IA", + "county": "Shelby" + }, + { + "zip_code": 51532, + "latitude": 41.119637, + "longitude": -95.108675, + "city": "Elliott", + "state": "IA", + "county": "Montgomery" + }, + { + "zip_code": 51533, + "latitude": 41.016355, + "longitude": -95.422695, + "city": "Emerson", + "state": "IA", + "county": "Mills" + }, + { + "zip_code": 51534, + "latitude": 41.031806, + "longitude": -95.71558, + "city": "Glenwood", + "state": "IA", + "county": "Mills" + }, + { + "zip_code": 51535, + "latitude": 41.236242, + "longitude": -95.041216, + "city": "Griswold", + "state": "IA", + "county": "Cass" + }, + { + "zip_code": 51536, + "latitude": 41.389941, + "longitude": -95.372891, + "city": "Hancock", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51537, + "latitude": 41.667566, + "longitude": -95.29087, + "city": "Harlan", + "state": "IA", + "county": "Shelby" + }, + { + "zip_code": 51540, + "latitude": 41.013156, + "longitude": -95.500756, + "city": "Hastings", + "state": "IA", + "county": "Mills" + }, + { + "zip_code": 51541, + "latitude": 41.12933, + "longitude": -95.453376, + "city": "Henderson", + "state": "IA", + "county": "Mills" + }, + { + "zip_code": 51542, + "latitude": 41.435092, + "longitude": -95.831903, + "city": "Honey Creek", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51543, + "latitude": 41.657834, + "longitude": -95.044476, + "city": "Kimballton", + "state": "IA", + "county": "Audubon" + }, + { + "zip_code": 51544, + "latitude": 41.252785, + "longitude": -95.098198, + "city": "Lewis", + "state": "IA", + "county": "Cass" + }, + { + "zip_code": 51545, + "latitude": 41.787434, + "longitude": -96.005056, + "city": "Little Sioux", + "state": "IA", + "county": "Harrison" + }, + { + "zip_code": 51546, + "latitude": 41.657856, + "longitude": -95.786047, + "city": "Logan", + "state": "IA", + "county": "Harrison" + }, + { + "zip_code": 51548, + "latitude": 41.377671, + "longitude": -95.599683, + "city": "Mc Clelland", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51549, + "latitude": 41.327892, + "longitude": -95.514083, + "city": "Macedonia", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51550, + "latitude": 41.693412, + "longitude": -95.889638, + "city": "Magnolia", + "state": "IA", + "county": "Harrison" + }, + { + "zip_code": 51551, + "latitude": 41.006817, + "longitude": -95.594792, + "city": "Malvern", + "state": "IA", + "county": "Mills" + }, + { + "zip_code": 51552, + "latitude": 41.447152, + "longitude": -95.104078, + "city": "Marne", + "state": "IA", + "county": "Cass" + }, + { + "zip_code": 51553, + "latitude": 41.404922, + "longitude": -95.549781, + "city": "Minden", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51554, + "latitude": 41.141404, + "longitude": -95.700491, + "city": "Mineola", + "state": "IA", + "county": "Mills" + }, + { + "zip_code": 51555, + "latitude": 41.605102, + "longitude": -95.908803, + "city": "Missouri Valley", + "state": "IA", + "county": "Harrison" + }, + { + "zip_code": 51556, + "latitude": 41.643973, + "longitude": -96.013027, + "city": "Modale", + "state": "IA", + "county": "Harrison" + }, + { + "zip_code": 51557, + "latitude": 41.739098, + "longitude": -95.99577, + "city": "Mondamin", + "state": "IA", + "county": "Harrison" + }, + { + "zip_code": 51558, + "latitude": 41.939436, + "longitude": -95.853673, + "city": "Moorhead", + "state": "IA", + "county": "Monona" + }, + { + "zip_code": 51559, + "latitude": 41.390749, + "longitude": -95.583086, + "city": "Neola", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51560, + "latitude": 41.324842, + "longitude": -95.422978, + "city": "Oakland", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51561, + "latitude": 41.011257, + "longitude": -95.808797, + "city": "Pacific Junction", + "state": "IA", + "county": "Mills" + }, + { + "zip_code": 51562, + "latitude": 41.701435, + "longitude": -95.492423, + "city": "Panama", + "state": "IA", + "county": "Shelby" + }, + { + "zip_code": 51563, + "latitude": 41.634002, + "longitude": -95.788095, + "city": "Persia", + "state": "IA", + "county": "Harrison" + }, + { + "zip_code": 51564, + "latitude": 41.805536, + "longitude": -95.898207, + "city": "Pisgah", + "state": "IA", + "county": "Harrison" + }, + { + "zip_code": 51565, + "latitude": 41.708156, + "longitude": -95.44989, + "city": "Portsmouth", + "state": "IA", + "county": "Shelby" + }, + { + "zip_code": 51566, + "latitude": 41.030516, + "longitude": -95.19404, + "city": "Red Oak", + "state": "IA", + "county": "Montgomery" + }, + { + "zip_code": 51570, + "latitude": 41.476766, + "longitude": -95.370203, + "city": "Shelby", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51571, + "latitude": 41.110642, + "longitude": -95.604984, + "city": "Silver City", + "state": "IA", + "county": "Mills" + }, + { + "zip_code": 51572, + "latitude": 41.994014, + "longitude": -95.778514, + "city": "Soldier", + "state": "IA", + "county": "Monona" + }, + { + "zip_code": 51573, + "latitude": 40.980119, + "longitude": -95.115799, + "city": "Stanton", + "state": "IA", + "county": "Montgomery" + }, + { + "zip_code": 51574, + "latitude": 41.595663, + "longitude": -95.441923, + "city": "Tennant", + "state": "IA", + "county": "Shelby" + }, + { + "zip_code": 51575, + "latitude": 41.230742, + "longitude": -95.608582, + "city": "Treynor", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51576, + "latitude": 41.382994, + "longitude": -95.721535, + "city": "Underwood", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51577, + "latitude": 41.418923, + "longitude": -95.302966, + "city": "Walnut", + "state": "IA", + "county": "Pottawattamie" + }, + { + "zip_code": 51578, + "latitude": 41.719899, + "longitude": -95.395187, + "city": "Westphalia", + "state": "IA", + "county": "Shelby" + }, + { + "zip_code": 51579, + "latitude": 41.745172, + "longitude": -95.716704, + "city": "Woodbine", + "state": "IA", + "county": "Harrison" + }, + { + "zip_code": 51591, + "latitude": 41.030256, + "longitude": -95.156205, + "city": "Red Oak", + "state": "IA", + "county": "Montgomery" + }, + { + "zip_code": 51593, + "latitude": 41.332943, + "longitude": -95.587197, + "city": "Harlan", + "state": "IA", + "county": "Shelby" + }, + { + "zip_code": 51601, + "latitude": 40.718258, + "longitude": -95.16372, + "city": "Shenandoah", + "state": "IA", + "county": "Page" + }, + { + "zip_code": 51602, + "latitude": 40.738309, + "longitude": -95.149305, + "city": "Shenandoah", + "state": "IA", + "county": "Page" + }, + { + "zip_code": 51603, + "latitude": 40.738309, + "longitude": -95.149305, + "city": "Shenandoah", + "state": "IA", + "county": "Page" + }, + { + "zip_code": 51630, + "latitude": 40.616851, + "longitude": -95.152493, + "city": "Blanchard", + "state": "IA", + "county": "Page" + }, + { + "zip_code": 51631, + "latitude": 40.604915, + "longitude": -95.017884, + "city": "Braddyville", + "state": "IA", + "county": "Page" + }, + { + "zip_code": 51632, + "latitude": 40.738247, + "longitude": -95.108481, + "city": "Clarinda", + "state": "IA", + "county": "Page" + }, + { + "zip_code": 51636, + "latitude": 40.646512, + "longitude": -95.199797, + "city": "Coin", + "state": "IA", + "county": "Page" + }, + { + "zip_code": 51637, + "latitude": 40.63122, + "longitude": -95.12241, + "city": "College Springs", + "state": "IA", + "county": "Page" + }, + { + "zip_code": 51638, + "latitude": 40.77046, + "longitude": -95.261263, + "city": "Essex", + "state": "IA", + "county": "Page" + }, + { + "zip_code": 51639, + "latitude": 40.72146, + "longitude": -95.477606, + "city": "Farragut", + "state": "IA", + "county": "Fremont" + }, + { + "zip_code": 51640, + "latitude": 40.741699, + "longitude": -95.583179, + "city": "Hamburg", + "state": "IA", + "county": "Fremont" + }, + { + "zip_code": 51645, + "latitude": 40.858205, + "longitude": -95.432381, + "city": "Imogene", + "state": "IA", + "county": "Fremont" + }, + { + "zip_code": 51646, + "latitude": 40.722464, + "longitude": -94.842837, + "city": "New Market", + "state": "IA", + "county": "Taylor" + }, + { + "zip_code": 51647, + "latitude": 40.609974, + "longitude": -95.316476, + "city": "Northboro", + "state": "IA", + "county": "Page" + }, + { + "zip_code": 51648, + "latitude": 40.742301, + "longitude": -95.761779, + "city": "Percival", + "state": "IA", + "county": "Fremont" + }, + { + "zip_code": 51649, + "latitude": 40.847951, + "longitude": -95.537377, + "city": "Randolph", + "state": "IA", + "county": "Fremont" + }, + { + "zip_code": 51650, + "latitude": 40.662884, + "longitude": -95.577257, + "city": "Riverton", + "state": "IA", + "county": "Fremont" + }, + { + "zip_code": 51651, + "latitude": 40.65747, + "longitude": -95.024969, + "city": "Shambaugh", + "state": "IA", + "county": "Page" + }, + { + "zip_code": 51652, + "latitude": 40.77152, + "longitude": -95.626355, + "city": "Sidney", + "state": "IA", + "county": "Fremont" + }, + { + "zip_code": 51653, + "latitude": 40.822599, + "longitude": -95.694406, + "city": "Tabor", + "state": "IA", + "county": "Fremont" + }, + { + "zip_code": 51654, + "latitude": 40.79334, + "longitude": -95.758636, + "city": "Thurman", + "state": "IA", + "county": "Fremont" + }, + { + "zip_code": 51656, + "latitude": 40.737446, + "longitude": -95.156217, + "city": "Yorktown", + "state": "IA", + "county": "Page" + }, + { + "zip_code": 52001, + "latitude": 42.458876, + "longitude": -90.877135, + "city": "Dubuque", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52002, + "latitude": 42.532019, + "longitude": -90.7718, + "city": "Dubuque", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52003, + "latitude": 42.436426, + "longitude": -90.716921, + "city": "Dubuque", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52004, + "latitude": 42.484861, + "longitude": -90.804116, + "city": "Dubuque", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52030, + "latitude": 42.164053, + "longitude": -90.61074, + "city": "Andrew", + "state": "IA", + "county": "Jackson" + }, + { + "zip_code": 52031, + "latitude": 42.207444, + "longitude": -90.49192, + "city": "Bellevue", + "state": "IA", + "county": "Jackson" + }, + { + "zip_code": 52032, + "latitude": 42.338928, + "longitude": -90.864175, + "city": "Bernard", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52033, + "latitude": 42.362066, + "longitude": -90.903195, + "city": "Cascade", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52035, + "latitude": 42.560859, + "longitude": -91.347333, + "city": "Colesburg", + "state": "IA", + "county": "Delaware" + }, + { + "zip_code": 52036, + "latitude": 42.476609, + "longitude": -91.311248, + "city": "Delaware", + "state": "IA", + "county": "Delaware" + }, + { + "zip_code": 52037, + "latitude": 41.9604, + "longitude": -90.636408, + "city": "Delmar", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52038, + "latitude": 42.559127, + "longitude": -91.47609, + "city": "Dundee", + "state": "IA", + "county": "Delaware" + }, + { + "zip_code": 52039, + "latitude": 42.534545, + "longitude": -90.851368, + "city": "Durango", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52040, + "latitude": 42.421746, + "longitude": -91.035655, + "city": "Dyersville", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52041, + "latitude": 42.519834, + "longitude": -91.299742, + "city": "Earlville", + "state": "IA", + "county": "Delaware" + }, + { + "zip_code": 52042, + "latitude": 42.756961, + "longitude": -91.34453, + "city": "Edgewood", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52043, + "latitude": 42.842609, + "longitude": -91.408507, + "city": "Elkader", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52044, + "latitude": 42.762431, + "longitude": -91.320305, + "city": "Elkport", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52045, + "latitude": 42.458113, + "longitude": -90.933197, + "city": "Epworth", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52046, + "latitude": 42.45328, + "longitude": -91.026374, + "city": "Farley", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52047, + "latitude": 42.984477, + "longitude": -91.354816, + "city": "Farmersburg", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52048, + "latitude": 42.736871, + "longitude": -91.249013, + "city": "Garber", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52049, + "latitude": 42.808244, + "longitude": -91.257708, + "city": "Garnavillo", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52050, + "latitude": 42.554136, + "longitude": -91.332816, + "city": "Greeley", + "state": "IA", + "county": "Delaware" + }, + { + "zip_code": 52052, + "latitude": 42.845668, + "longitude": -91.249472, + "city": "Guttenberg", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52053, + "latitude": 42.539813, + "longitude": -90.90914, + "city": "Holy Cross", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52054, + "latitude": 42.284057, + "longitude": -90.595351, + "city": "La Motte", + "state": "IA", + "county": "Jackson" + }, + { + "zip_code": 52055, + "latitude": 42.862739, + "longitude": -91.252459, + "city": "Littleport", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52056, + "latitude": 42.578283, + "longitude": -91.062066, + "city": "Luxemburg", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52057, + "latitude": 42.492356, + "longitude": -91.39658, + "city": "Manchester", + "state": "IA", + "county": "Delaware" + }, + { + "zip_code": 52060, + "latitude": 42.19807, + "longitude": -90.605827, + "city": "Maquoketa", + "state": "IA", + "county": "Jackson" + }, + { + "zip_code": 52064, + "latitude": 42.120881, + "longitude": -90.329993, + "city": "Miles", + "state": "IA", + "county": "Jackson" + }, + { + "zip_code": 52065, + "latitude": 42.547149, + "longitude": -90.991701, + "city": "New Vienna", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52066, + "latitude": 42.667786, + "longitude": -90.986518, + "city": "North Buena Vista", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52068, + "latitude": 42.432281, + "longitude": -90.808309, + "city": "Peosta", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52069, + "latitude": 42.076366, + "longitude": -90.432502, + "city": "Preston", + "state": "IA", + "county": "Jackson" + }, + { + "zip_code": 52070, + "latitude": 42.093989, + "longitude": -90.360035, + "city": "Sabula", + "state": "IA", + "county": "Jackson" + }, + { + "zip_code": 52071, + "latitude": 42.319577, + "longitude": -90.490269, + "city": "Saint Donatus", + "state": "IA", + "county": "Jackson" + }, + { + "zip_code": 52072, + "latitude": 42.876289, + "longitude": -91.386044, + "city": "Saint Olaf", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52073, + "latitude": 42.5854, + "longitude": -90.811885, + "city": "Sherrill", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52074, + "latitude": 42.098358, + "longitude": -90.478972, + "city": "Spragueville", + "state": "IA", + "county": "Jackson" + }, + { + "zip_code": 52075, + "latitude": 42.164766, + "longitude": -90.498366, + "city": "Springbrook", + "state": "IA", + "county": "Jackson" + }, + { + "zip_code": 52076, + "latitude": 42.720409, + "longitude": -91.490023, + "city": "Strawberry Point", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52077, + "latitude": 42.844453, + "longitude": -91.496533, + "city": "Volga", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52078, + "latitude": 42.388741, + "longitude": -91.089374, + "city": "Worthington", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52079, + "latitude": 42.338446, + "longitude": -90.714464, + "city": "Zwingle", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52099, + "latitude": 42.484861, + "longitude": -90.804116, + "city": "Dubuque", + "state": "IA", + "county": "Dubuque" + }, + { + "zip_code": 52101, + "latitude": 43.294252, + "longitude": -91.789582, + "city": "Decorah", + "state": "IA", + "county": "Winneshiek" + }, + { + "zip_code": 52132, + "latitude": 43.168758, + "longitude": -91.867666, + "city": "Calmar", + "state": "IA", + "county": "Winneshiek" + }, + { + "zip_code": 52133, + "latitude": 43.136114, + "longitude": -91.664324, + "city": "Castalia", + "state": "IA", + "county": "Winneshiek" + }, + { + "zip_code": 52134, + "latitude": 43.464701, + "longitude": -92.40617, + "city": "Chester", + "state": "IA", + "county": "Howard" + }, + { + "zip_code": 52135, + "latitude": 42.942633, + "longitude": -91.674712, + "city": "Clermont", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 52136, + "latitude": 43.35666, + "longitude": -92.189287, + "city": "Cresco", + "state": "IA", + "county": "Howard" + }, + { + "zip_code": 52140, + "latitude": 43.43073, + "longitude": -91.509087, + "city": "Dorchester", + "state": "IA", + "county": "Allamakee" + }, + { + "zip_code": 52141, + "latitude": 42.941219, + "longitude": -91.699573, + "city": "Elgin", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 52142, + "latitude": 42.885443, + "longitude": -91.8084, + "city": "Fayette", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 52144, + "latitude": 43.268916, + "longitude": -91.924788, + "city": "Fort Atkinson", + "state": "IA", + "county": "Winneshiek" + }, + { + "zip_code": 52146, + "latitude": 43.288601, + "longitude": -91.209339, + "city": "Harpers Ferry", + "state": "IA", + "county": "Allamakee" + }, + { + "zip_code": 52147, + "latitude": 42.938391, + "longitude": -91.929151, + "city": "Hawkeye", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 52149, + "latitude": 43.463765, + "longitude": -91.689862, + "city": "Highlandville", + "state": "IA", + "county": "Winneshiek" + }, + { + "zip_code": 52151, + "latitude": 43.346574, + "longitude": -91.277117, + "city": "Lansing", + "state": "IA", + "county": "Allamakee" + }, + { + "zip_code": 52154, + "latitude": 43.110826, + "longitude": -92.169251, + "city": "Lawler", + "state": "IA", + "county": "Chickasaw" + }, + { + "zip_code": 52155, + "latitude": 43.410582, + "longitude": -92.276168, + "city": "Lime Springs", + "state": "IA", + "county": "Howard" + }, + { + "zip_code": 52156, + "latitude": 43.020695, + "longitude": -91.47665, + "city": "Luana", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52157, + "latitude": 42.91563, + "longitude": -91.295555, + "city": "Mc Gregor", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52158, + "latitude": 43.036006, + "longitude": -91.193057, + "city": "Marquette", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52159, + "latitude": 43.034025, + "longitude": -91.393408, + "city": "Monona", + "state": "IA", + "county": "Clayton" + }, + { + "zip_code": 52160, + "latitude": 43.457526, + "longitude": -91.354022, + "city": "New Albin", + "state": "IA", + "county": "Allamakee" + }, + { + "zip_code": 52161, + "latitude": 43.142181, + "longitude": -91.763097, + "city": "Ossian", + "state": "IA", + "county": "Winneshiek" + }, + { + "zip_code": 52162, + "latitude": 43.175423, + "longitude": -91.507751, + "city": "Postville", + "state": "IA", + "county": "Allamakee" + }, + { + "zip_code": 52163, + "latitude": 43.216975, + "longitude": -92.092682, + "city": "Protivin", + "state": "IA", + "county": "Howard" + }, + { + "zip_code": 52164, + "latitude": 42.846576, + "longitude": -91.896581, + "city": "Randalia", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 52165, + "latitude": 43.253702, + "longitude": -91.880018, + "city": "Ridgeway", + "state": "IA", + "county": "Winneshiek" + }, + { + "zip_code": 52166, + "latitude": 43.060717, + "longitude": -91.923226, + "city": "Saint Lucas", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 52168, + "latitude": 43.203195, + "longitude": -91.944055, + "city": "Spillville", + "state": "IA", + "county": "Winneshiek" + }, + { + "zip_code": 52169, + "latitude": 42.841014, + "longitude": -91.674168, + "city": "Wadena", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 52170, + "latitude": 43.217292, + "longitude": -91.310349, + "city": "Waterville", + "state": "IA", + "county": "Allamakee" + }, + { + "zip_code": 52171, + "latitude": 42.92664, + "longitude": -91.976961, + "city": "Waucoma", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 52172, + "latitude": 43.290026, + "longitude": -91.445754, + "city": "Waukon", + "state": "IA", + "county": "Allamakee" + }, + { + "zip_code": 52175, + "latitude": 42.943828, + "longitude": -91.833409, + "city": "West Union", + "state": "IA", + "county": "Fayette" + }, + { + "zip_code": 52201, + "latitude": 41.351113, + "longitude": -91.581212, + "city": "Ainsworth", + "state": "IA", + "county": "Washington" + }, + { + "zip_code": 52202, + "latitude": 42.157086, + "longitude": -91.645825, + "city": "Alburnett", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52203, + "latitude": 41.812242, + "longitude": -91.913869, + "city": "Amana", + "state": "IA", + "county": "Iowa" + }, + { + "zip_code": 52204, + "latitude": 41.686351, + "longitude": -92.063603, + "city": "Amana", + "state": "IA", + "county": "Iowa" + }, + { + "zip_code": 52205, + "latitude": 42.10352, + "longitude": -91.240145, + "city": "Anamosa", + "state": "IA", + "county": "Jones" + }, + { + "zip_code": 52206, + "latitude": 42.057516, + "longitude": -92.058526, + "city": "Atkins", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52207, + "latitude": 42.120007, + "longitude": -90.816341, + "city": "Baldwin", + "state": "IA", + "county": "Jackson" + }, + { + "zip_code": 52208, + "latitude": 41.917133, + "longitude": -92.242382, + "city": "Belle Plaine", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52209, + "latitude": 41.913181, + "longitude": -92.112381, + "city": "Blairstown", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52210, + "latitude": 42.348147, + "longitude": -92.003981, + "city": "Brandon", + "state": "IA", + "county": "Buchanan" + }, + { + "zip_code": 52211, + "latitude": 41.759702, + "longitude": -92.436452, + "city": "Brooklyn", + "state": "IA", + "county": "Poweshiek" + }, + { + "zip_code": 52212, + "latitude": 42.120097, + "longitude": -91.029004, + "city": "Center Junction", + "state": "IA", + "county": "Jones" + }, + { + "zip_code": 52213, + "latitude": 42.197041, + "longitude": -91.744447, + "city": "Center Point", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52214, + "latitude": 42.186959, + "longitude": -91.520359, + "city": "Central City", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52215, + "latitude": 42.036478, + "longitude": -92.400098, + "city": "Chelsea", + "state": "IA", + "county": "Tama" + }, + { + "zip_code": 52216, + "latitude": 41.864242, + "longitude": -91.024771, + "city": "Clarence", + "state": "IA", + "county": "Cedar" + }, + { + "zip_code": 52217, + "latitude": 42.083382, + "longitude": -92.420884, + "city": "Clutier", + "state": "IA", + "county": "Tama" + }, + { + "zip_code": 52218, + "latitude": 42.250724, + "longitude": -91.53445, + "city": "Coggon", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52219, + "latitude": 42.231046, + "longitude": -91.395429, + "city": "Prairieburg", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52220, + "latitude": 41.73543, + "longitude": -92.010162, + "city": "Conroy", + "state": "IA", + "county": "Iowa" + }, + { + "zip_code": 52221, + "latitude": 41.637767, + "longitude": -92.347941, + "city": "Guernsey", + "state": "IA", + "county": "Poweshiek" + }, + { + "zip_code": 52222, + "latitude": 41.59165, + "longitude": -92.373998, + "city": "Deep River", + "state": "IA", + "county": "Poweshiek" + }, + { + "zip_code": 52223, + "latitude": 42.413678, + "longitude": -91.31071, + "city": "Delhi", + "state": "IA", + "county": "Delaware" + }, + { + "zip_code": 52224, + "latitude": 42.195645, + "longitude": -92.36492, + "city": "Dysart", + "state": "IA", + "county": "Tama" + }, + { + "zip_code": 52225, + "latitude": 41.990954, + "longitude": -92.363359, + "city": "Elberon", + "state": "IA", + "county": "Tama" + }, + { + "zip_code": 52226, + "latitude": 41.988971, + "longitude": -90.73596, + "city": "Elwood", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52227, + "latitude": 41.910425, + "longitude": -91.575268, + "city": "Ely", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52228, + "latitude": 41.912837, + "longitude": -91.764387, + "city": "Fairfax", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52229, + "latitude": 42.137698, + "longitude": -92.160995, + "city": "Garrison", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52231, + "latitude": 41.357763, + "longitude": -92.063442, + "city": "Harper", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 52232, + "latitude": 41.810889, + "longitude": -92.342571, + "city": "Hartwick", + "state": "IA", + "county": "Poweshiek" + }, + { + "zip_code": 52233, + "latitude": 42.047863, + "longitude": -91.685645, + "city": "Hiawatha", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52235, + "latitude": 41.555704, + "longitude": -91.530842, + "city": "Hills", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52236, + "latitude": 41.730806, + "longitude": -91.881072, + "city": "Homestead", + "state": "IA", + "county": "Iowa" + }, + { + "zip_code": 52237, + "latitude": 42.366671, + "longitude": -91.276347, + "city": "Hopkinton", + "state": "IA", + "county": "Delaware" + }, + { + "zip_code": 52240, + "latitude": 41.648207, + "longitude": -91.541579, + "city": "Iowa City", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52241, + "latitude": 41.699942, + "longitude": -91.6332, + "city": "Coralville", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52242, + "latitude": 41.733924, + "longitude": -91.555328, + "city": "Iowa City", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52243, + "latitude": 41.642657, + "longitude": -91.599974, + "city": "Iowa City", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52244, + "latitude": 41.572682, + "longitude": -91.661901, + "city": "Iowa City", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52245, + "latitude": 41.668592, + "longitude": -91.518388, + "city": "Iowa City", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52246, + "latitude": 41.600628, + "longitude": -91.589264, + "city": "Iowa City", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52247, + "latitude": 41.460979, + "longitude": -91.698928, + "city": "Kalona", + "state": "IA", + "county": "Washington" + }, + { + "zip_code": 52248, + "latitude": 41.356073, + "longitude": -92.001798, + "city": "Keota", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 52249, + "latitude": 42.007605, + "longitude": -92.071971, + "city": "Keystone", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52251, + "latitude": 41.710377, + "longitude": -92.189413, + "city": "Ladora", + "state": "IA", + "county": "Iowa" + }, + { + "zip_code": 52252, + "latitude": 42.191979, + "longitude": -91.225836, + "city": "Langworthy", + "state": "IA", + "county": "Jones" + }, + { + "zip_code": 52253, + "latitude": 41.914581, + "longitude": -91.385445, + "city": "Lisbon", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52254, + "latitude": 41.876909, + "longitude": -90.541188, + "city": "Lost Nation", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52255, + "latitude": 41.856539, + "longitude": -90.966516, + "city": "Lowden", + "state": "IA", + "county": "Cedar" + }, + { + "zip_code": 52257, + "latitude": 42.003812, + "longitude": -92.163137, + "city": "Luzerne", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52301, + "latitude": 41.768214, + "longitude": -92.094866, + "city": "Marengo", + "state": "IA", + "county": "Iowa" + }, + { + "zip_code": 52302, + "latitude": 42.056938, + "longitude": -91.573963, + "city": "Marion", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52305, + "latitude": 42.018308, + "longitude": -91.321727, + "city": "Martelle", + "state": "IA", + "county": "Jones" + }, + { + "zip_code": 52306, + "latitude": 41.866983, + "longitude": -91.269378, + "city": "Mechanicsville", + "state": "IA", + "county": "Cedar" + }, + { + "zip_code": 52307, + "latitude": 41.79544, + "longitude": -91.901776, + "city": "Middle Amana", + "state": "IA", + "county": "Iowa" + }, + { + "zip_code": 52308, + "latitude": 41.576444, + "longitude": -92.166645, + "city": "Millersburg", + "state": "IA", + "county": "Iowa" + }, + { + "zip_code": 52309, + "latitude": 42.13894, + "longitude": -90.864621, + "city": "Monmouth", + "state": "IA", + "county": "Jackson" + }, + { + "zip_code": 52310, + "latitude": 42.139945, + "longitude": -91.158852, + "city": "Monticello", + "state": "IA", + "county": "Jones" + }, + { + "zip_code": 52312, + "latitude": 42.048397, + "longitude": -91.178455, + "city": "Morley", + "state": "IA", + "county": "Jones" + }, + { + "zip_code": 52313, + "latitude": 42.254106, + "longitude": -92.098959, + "city": "Mount Auburn", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52314, + "latitude": 41.939802, + "longitude": -91.450762, + "city": "Mount Vernon", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52315, + "latitude": 42.006958, + "longitude": -91.970161, + "city": "Newhall", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52316, + "latitude": 41.555588, + "longitude": -92.067635, + "city": "North English", + "state": "IA", + "county": "Iowa" + }, + { + "zip_code": 52317, + "latitude": 41.763944, + "longitude": -91.604798, + "city": "North Liberty", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52318, + "latitude": 41.905263, + "longitude": -91.900096, + "city": "Norway", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52319, + "latitude": 41.642657, + "longitude": -91.599974, + "city": "Oakdale", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52320, + "latitude": 42.08132, + "longitude": -91.116054, + "city": "Olin", + "state": "IA", + "county": "Jones" + }, + { + "zip_code": 52321, + "latitude": 42.1065, + "longitude": -91.020988, + "city": "Onslow", + "state": "IA", + "county": "Jones" + }, + { + "zip_code": 52322, + "latitude": 41.700994, + "longitude": -91.730339, + "city": "Oxford", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52323, + "latitude": 42.030946, + "longitude": -91.005688, + "city": "Oxford Junction", + "state": "IA", + "county": "Jones" + }, + { + "zip_code": 52324, + "latitude": 42.049832, + "longitude": -91.788933, + "city": "Palo", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52325, + "latitude": 41.575705, + "longitude": -91.939701, + "city": "Parnell", + "state": "IA", + "county": "Iowa" + }, + { + "zip_code": 52326, + "latitude": 42.469908, + "longitude": -91.710553, + "city": "Quasqueton", + "state": "IA", + "county": "Buchanan" + }, + { + "zip_code": 52327, + "latitude": 41.39539, + "longitude": -91.580364, + "city": "Riverside", + "state": "IA", + "county": "Washington" + }, + { + "zip_code": 52328, + "latitude": 42.073943, + "longitude": -91.665177, + "city": "Robins", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52329, + "latitude": 42.469721, + "longitude": -91.773824, + "city": "Rowley", + "state": "IA", + "county": "Buchanan" + }, + { + "zip_code": 52330, + "latitude": 42.367794, + "longitude": -91.445994, + "city": "Ryan", + "state": "IA", + "county": "Delaware" + }, + { + "zip_code": 52332, + "latitude": 42.101443, + "longitude": -91.914187, + "city": "Shellsburg", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52333, + "latitude": 41.792851, + "longitude": -91.506086, + "city": "Solon", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52334, + "latitude": 41.724365, + "longitude": -91.939343, + "city": "South Amana", + "state": "IA", + "county": "Iowa" + }, + { + "zip_code": 52335, + "latitude": 41.452856, + "longitude": -92.067973, + "city": "South English", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 52336, + "latitude": 42.063342, + "longitude": -91.471893, + "city": "Springville", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52337, + "latitude": 41.89206, + "longitude": -91.152099, + "city": "Stanwood", + "state": "IA", + "county": "Cedar" + }, + { + "zip_code": 52338, + "latitude": 41.827112, + "longitude": -91.721642, + "city": "Swisher", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52339, + "latitude": 41.934093, + "longitude": -92.585494, + "city": "Tama", + "state": "IA", + "county": "Tama" + }, + { + "zip_code": 52340, + "latitude": 41.701791, + "longitude": -91.677347, + "city": "Tiffin", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52341, + "latitude": 42.111669, + "longitude": -91.732863, + "city": "Toddville", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52342, + "latitude": 42.068965, + "longitude": -92.551725, + "city": "Toledo", + "state": "IA", + "county": "Tama" + }, + { + "zip_code": 52344, + "latitude": 42.079415, + "longitude": -91.599215, + "city": "Troy Mills", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52345, + "latitude": 42.236512, + "longitude": -91.888136, + "city": "Urbana", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52346, + "latitude": 42.014398, + "longitude": -92.067227, + "city": "Van Horne", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52347, + "latitude": 41.706644, + "longitude": -92.25127, + "city": "Victor", + "state": "IA", + "county": "Iowa" + }, + { + "zip_code": 52348, + "latitude": 41.980201, + "longitude": -92.375713, + "city": "Vining", + "state": "IA", + "county": "Tama" + }, + { + "zip_code": 52349, + "latitude": 42.087347, + "longitude": -91.987332, + "city": "Vinton", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52350, + "latitude": 42.091217, + "longitude": -91.385047, + "city": "Viola", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52351, + "latitude": 41.877045, + "longitude": -91.836855, + "city": "Walford", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52352, + "latitude": 42.255159, + "longitude": -91.726637, + "city": "Walker", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52353, + "latitude": 41.31663, + "longitude": -91.751808, + "city": "Washington", + "state": "IA", + "county": "Washington" + }, + { + "zip_code": 52354, + "latitude": 41.92003, + "longitude": -91.978744, + "city": "Watkins", + "state": "IA", + "county": "Benton" + }, + { + "zip_code": 52355, + "latitude": 41.449144, + "longitude": -92.169002, + "city": "Webster", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 52356, + "latitude": 41.448663, + "longitude": -91.840264, + "city": "Wellman", + "state": "IA", + "county": "Washington" + }, + { + "zip_code": 52358, + "latitude": 41.728915, + "longitude": -91.25056, + "city": "West Branch", + "state": "IA", + "county": "Cedar" + }, + { + "zip_code": 52359, + "latitude": 41.393969, + "longitude": -91.740025, + "city": "West Chester", + "state": "IA", + "county": "Washington" + }, + { + "zip_code": 52361, + "latitude": 41.649999, + "longitude": -92.065181, + "city": "Williamsburg", + "state": "IA", + "county": "Iowa" + }, + { + "zip_code": 52362, + "latitude": 42.065281, + "longitude": -91.078891, + "city": "Wyoming", + "state": "IA", + "county": "Jones" + }, + { + "zip_code": 52401, + "latitude": 41.976612, + "longitude": -91.657578, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52402, + "latitude": 42.020105, + "longitude": -91.681029, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52403, + "latitude": 41.972936, + "longitude": -91.58127, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52404, + "latitude": 41.919542, + "longitude": -91.704467, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52405, + "latitude": 41.987067, + "longitude": -91.753326, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52406, + "latitude": 42.287191, + "longitude": -91.777472, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52407, + "latitude": 42.079415, + "longitude": -91.599215, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52408, + "latitude": 42.079415, + "longitude": -91.599215, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52409, + "latitude": 42.079415, + "longitude": -91.599215, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52410, + "latitude": 42.079415, + "longitude": -91.599215, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52411, + "latitude": 42.049262, + "longitude": -91.726331, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52497, + "latitude": 42.079415, + "longitude": -91.599215, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52498, + "latitude": 42.079415, + "longitude": -91.599215, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52499, + "latitude": 42.079415, + "longitude": -91.599215, + "city": "Cedar Rapids", + "state": "IA", + "county": "Linn" + }, + { + "zip_code": 52501, + "latitude": 41.030933, + "longitude": -92.409827, + "city": "Ottumwa", + "state": "IA", + "county": "Wapello" + }, + { + "zip_code": 52530, + "latitude": 40.979036, + "longitude": -92.426183, + "city": "Agency", + "state": "IA", + "county": "Wapello" + }, + { + "zip_code": 52531, + "latitude": 41.00004, + "longitude": -92.835186, + "city": "Albia", + "state": "IA", + "county": "Monroe" + }, + { + "zip_code": 52533, + "latitude": 41.013559, + "longitude": -92.0835, + "city": "Batavia", + "state": "IA", + "county": "Jefferson" + }, + { + "zip_code": 52534, + "latitude": 41.29511, + "longitude": -92.598024, + "city": "Beacon", + "state": "IA", + "county": "Mahaska" + }, + { + "zip_code": 52535, + "latitude": 40.827181, + "longitude": -91.951174, + "city": "Birmingham", + "state": "IA", + "county": "Van Buren" + }, + { + "zip_code": 52536, + "latitude": 40.981083, + "longitude": -92.570024, + "city": "Blakesburg", + "state": "IA", + "county": "Wapello" + }, + { + "zip_code": 52537, + "latitude": 40.746315, + "longitude": -92.406245, + "city": "Bloomfield", + "state": "IA", + "county": "Davis" + }, + { + "zip_code": 52538, + "latitude": 40.745286, + "longitude": -92.408679, + "city": "West Grove", + "state": "IA", + "county": "Davis" + }, + { + "zip_code": 52540, + "latitude": 41.211747, + "longitude": -91.845034, + "city": "Brighton", + "state": "IA", + "county": "Washington" + }, + { + "zip_code": 52542, + "latitude": 40.643077, + "longitude": -92.069754, + "city": "Cantril", + "state": "IA", + "county": "Van Buren" + }, + { + "zip_code": 52543, + "latitude": 41.219972, + "longitude": -92.506291, + "city": "Cedar", + "state": "IA", + "county": "Mahaska" + }, + { + "zip_code": 52544, + "latitude": 40.686447, + "longitude": -92.881614, + "city": "Centerville", + "state": "IA", + "county": "Appanoose" + }, + { + "zip_code": 52548, + "latitude": 41.060681, + "longitude": -92.552769, + "city": "Chillicothe", + "state": "IA", + "county": "Wapello" + }, + { + "zip_code": 52549, + "latitude": 40.626921, + "longitude": -92.953118, + "city": "Cincinnati", + "state": "IA", + "county": "Appanoose" + }, + { + "zip_code": 52550, + "latitude": 41.28437, + "longitude": -92.351218, + "city": "Delta", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 52551, + "latitude": 40.837786, + "longitude": -92.085948, + "city": "Douds", + "state": "IA", + "county": "Van Buren" + }, + { + "zip_code": 52552, + "latitude": 40.819643, + "longitude": -92.500244, + "city": "Drakesville", + "state": "IA", + "county": "Davis" + }, + { + "zip_code": 52553, + "latitude": 41.112342, + "longitude": -92.570765, + "city": "Eddyville", + "state": "IA", + "county": "Wapello" + }, + { + "zip_code": 52554, + "latitude": 41.030032, + "longitude": -92.408837, + "city": "Eldon", + "state": "IA", + "county": "Wapello" + }, + { + "zip_code": 52555, + "latitude": 40.630992, + "longitude": -92.884722, + "city": "Exline", + "state": "IA", + "county": "Appanoose" + }, + { + "zip_code": 52556, + "latitude": 41.030998, + "longitude": -91.957527, + "city": "Fairfield", + "state": "IA", + "county": "Jefferson" + }, + { + "zip_code": 52557, + "latitude": 41.016566, + "longitude": -91.96821, + "city": "Fairfield", + "state": "IA", + "county": "Jefferson" + }, + { + "zip_code": 52560, + "latitude": 40.84047, + "longitude": -92.284098, + "city": "Floris", + "state": "IA", + "county": "Davis" + }, + { + "zip_code": 52561, + "latitude": 41.227386, + "longitude": -92.467531, + "city": "Fremont", + "state": "IA", + "county": "Mahaska" + }, + { + "zip_code": 52562, + "latitude": 41.336267, + "longitude": -92.178366, + "city": "Hayesville", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 52563, + "latitude": 41.211206, + "longitude": -92.297854, + "city": "Hedrick", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 52565, + "latitude": 40.704158, + "longitude": -91.853076, + "city": "Keosauqua", + "state": "IA", + "county": "Van Buren" + }, + { + "zip_code": 52566, + "latitude": 41.143796, + "longitude": -92.5006, + "city": "Kirkville", + "state": "IA", + "county": "Wapello" + }, + { + "zip_code": 52567, + "latitude": 40.951469, + "longitude": -92.082459, + "city": "Libertyville", + "state": "IA", + "county": "Jefferson" + }, + { + "zip_code": 52568, + "latitude": 41.194806, + "longitude": -92.271472, + "city": "Martinsburg", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 52569, + "latitude": 41.03227, + "longitude": -93.035367, + "city": "Melrose", + "state": "IA", + "county": "Monroe" + }, + { + "zip_code": 52570, + "latitude": 40.671781, + "longitude": -92.162092, + "city": "Milton", + "state": "IA", + "county": "Van Buren" + }, + { + "zip_code": 52571, + "latitude": 40.866821, + "longitude": -92.736442, + "city": "Moravia", + "state": "IA", + "county": "Appanoose" + }, + { + "zip_code": 52572, + "latitude": 40.740795, + "longitude": -92.806081, + "city": "Moulton", + "state": "IA", + "county": "Appanoose" + }, + { + "zip_code": 52573, + "latitude": 40.749913, + "longitude": -91.948106, + "city": "Mount Sterling", + "state": "IA", + "county": "Van Buren" + }, + { + "zip_code": 52574, + "latitude": 40.780847, + "longitude": -92.979322, + "city": "Mystic", + "state": "IA", + "county": "Appanoose" + }, + { + "zip_code": 52576, + "latitude": 41.218708, + "longitude": -92.120482, + "city": "Ollie", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 52577, + "latitude": 41.283366, + "longitude": -92.662675, + "city": "Oskaloosa", + "state": "IA", + "county": "Mahaska" + }, + { + "zip_code": 52580, + "latitude": 41.119571, + "longitude": -92.092371, + "city": "Packwood", + "state": "IA", + "county": "Jefferson" + }, + { + "zip_code": 52581, + "latitude": 40.818638, + "longitude": -92.975714, + "city": "Plano", + "state": "IA", + "county": "Appanoose" + }, + { + "zip_code": 52583, + "latitude": 40.786539, + "longitude": -93.141255, + "city": "Promise City", + "state": "IA", + "county": "Wayne" + }, + { + "zip_code": 52584, + "latitude": 40.649038, + "longitude": -92.265179, + "city": "Pulaski", + "state": "IA", + "county": "Davis" + }, + { + "zip_code": 52585, + "latitude": 41.20699, + "longitude": -92.126742, + "city": "Richland", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 52586, + "latitude": 41.390468, + "longitude": -92.560102, + "city": "Rose Hill", + "state": "IA", + "county": "Mahaska" + }, + { + "zip_code": 52588, + "latitude": 40.749913, + "longitude": -91.948106, + "city": "Selma", + "state": "IA", + "county": "Van Buren" + }, + { + "zip_code": 52590, + "latitude": 40.710521, + "longitude": -93.130436, + "city": "Seymour", + "state": "IA", + "county": "Wayne" + }, + { + "zip_code": 52591, + "latitude": 41.310884, + "longitude": -92.159246, + "city": "Sigourney", + "state": "IA", + "county": "Keokuk" + }, + { + "zip_code": 52593, + "latitude": 40.80475, + "longitude": -92.714834, + "city": "Udell", + "state": "IA", + "county": "Appanoose" + }, + { + "zip_code": 52594, + "latitude": 40.812488, + "longitude": -92.701454, + "city": "Unionville", + "state": "IA", + "county": "Appanoose" + }, + { + "zip_code": 52595, + "latitude": 41.286383, + "longitude": -92.618357, + "city": "University Park", + "state": "IA", + "county": "Mahaska" + }, + { + "zip_code": 52601, + "latitude": 40.898412, + "longitude": -91.164393, + "city": "Burlington", + "state": "IA", + "county": "Des Moines" + }, + { + "zip_code": 52619, + "latitude": 40.546499, + "longitude": -91.585217, + "city": "Argyle", + "state": "IA", + "county": "Lee" + }, + { + "zip_code": 52620, + "latitude": 40.672405, + "longitude": -91.770841, + "city": "Bonaparte", + "state": "IA", + "county": "Van Buren" + }, + { + "zip_code": 52621, + "latitude": 41.20951, + "longitude": -91.551283, + "city": "Crawfordsville", + "state": "IA", + "county": "Washington" + }, + { + "zip_code": 52623, + "latitude": 40.866863, + "longitude": -91.307634, + "city": "Danville", + "state": "IA", + "county": "Des Moines" + }, + { + "zip_code": 52624, + "latitude": 40.743432, + "longitude": -91.323858, + "city": "Denmark", + "state": "IA", + "county": "Lee" + }, + { + "zip_code": 52625, + "latitude": 40.631583, + "longitude": -91.56008, + "city": "Donnellson", + "state": "IA", + "county": "Lee" + }, + { + "zip_code": 52626, + "latitude": 40.639028, + "longitude": -91.7394, + "city": "Farmington", + "state": "IA", + "county": "Van Buren" + }, + { + "zip_code": 52627, + "latitude": 40.596949, + "longitude": -91.434473, + "city": "Fort Madison", + "state": "IA", + "county": "Lee" + }, + { + "zip_code": 52630, + "latitude": 40.845708, + "longitude": -91.670699, + "city": "Hillsboro", + "state": "IA", + "county": "Henry" + }, + { + "zip_code": 52631, + "latitude": 40.769982, + "longitude": -91.613795, + "city": "Houghton", + "state": "IA", + "county": "Lee" + }, + { + "zip_code": 52632, + "latitude": 40.584716, + "longitude": -91.471682, + "city": "Keokuk", + "state": "IA", + "county": "Lee" + }, + { + "zip_code": 52635, + "latitude": 40.988685, + "longitude": -91.785249, + "city": "Lockridge", + "state": "IA", + "county": "Jefferson" + }, + { + "zip_code": 52637, + "latitude": 41.012819, + "longitude": -91.127994, + "city": "Mediapolis", + "state": "IA", + "county": "Des Moines" + }, + { + "zip_code": 52638, + "latitude": 40.848173, + "longitude": -91.269867, + "city": "Middletown", + "state": "IA", + "county": "Des Moines" + }, + { + "zip_code": 52639, + "latitude": 40.542856, + "longitude": -91.468901, + "city": "Montrose", + "state": "IA", + "county": "Lee" + }, + { + "zip_code": 52640, + "latitude": 41.135562, + "longitude": -91.291067, + "city": "Morning Sun", + "state": "IA", + "county": "Louisa" + }, + { + "zip_code": 52641, + "latitude": 40.994595, + "longitude": -91.573713, + "city": "Mount Pleasant", + "state": "IA", + "county": "Henry" + }, + { + "zip_code": 52642, + "latitude": 40.977395, + "longitude": -91.692312, + "city": "Rome", + "state": "IA", + "county": "Henry" + }, + { + "zip_code": 52644, + "latitude": 41.010776, + "longitude": -91.43819, + "city": "Mount Union", + "state": "IA", + "county": "Henry" + }, + { + "zip_code": 52645, + "latitude": 40.907221, + "longitude": -91.527126, + "city": "New London", + "state": "IA", + "county": "Henry" + }, + { + "zip_code": 52646, + "latitude": 41.117324, + "longitude": -91.074161, + "city": "Oakville", + "state": "IA", + "county": "Louisa" + }, + { + "zip_code": 52647, + "latitude": 41.146979, + "longitude": -91.544426, + "city": "Olds", + "state": "IA", + "county": "Henry" + }, + { + "zip_code": 52648, + "latitude": 40.594704, + "longitude": -91.415648, + "city": "Pilot Grove", + "state": "IA", + "county": "Lee" + }, + { + "zip_code": 52649, + "latitude": 40.857375, + "longitude": -91.610895, + "city": "Salem", + "state": "IA", + "county": "Henry" + }, + { + "zip_code": 52650, + "latitude": 40.920383, + "longitude": -91.208938, + "city": "Sperry", + "state": "IA", + "county": "Des Moines" + }, + { + "zip_code": 52651, + "latitude": 40.868097, + "longitude": -91.889766, + "city": "Stockport", + "state": "IA", + "county": "Van Buren" + }, + { + "zip_code": 52652, + "latitude": 41.104302, + "longitude": -91.546988, + "city": "Swedesburg", + "state": "IA", + "county": "Henry" + }, + { + "zip_code": 52653, + "latitude": 41.203527, + "longitude": -91.207463, + "city": "Wapello", + "state": "IA", + "county": "Louisa" + }, + { + "zip_code": 52654, + "latitude": 41.033746, + "longitude": -91.561327, + "city": "Wayland", + "state": "IA", + "county": "Henry" + }, + { + "zip_code": 52655, + "latitude": 40.850783, + "longitude": -91.229873, + "city": "West Burlington", + "state": "IA", + "county": "Des Moines" + }, + { + "zip_code": 52656, + "latitude": 40.610778, + "longitude": -91.461569, + "city": "West Point", + "state": "IA", + "county": "Lee" + }, + { + "zip_code": 52657, + "latitude": 40.758742, + "longitude": -91.478305, + "city": "Saint Paul", + "state": "IA", + "county": "Lee" + }, + { + "zip_code": 52658, + "latitude": 40.7129, + "longitude": -91.23819, + "city": "Wever", + "state": "IA", + "county": "Lee" + }, + { + "zip_code": 52659, + "latitude": 41.082887, + "longitude": -91.543142, + "city": "Winfield", + "state": "IA", + "county": "Henry" + }, + { + "zip_code": 52660, + "latitude": 40.983507, + "longitude": -91.302644, + "city": "Yarmouth", + "state": "IA", + "county": "Des Moines" + }, + { + "zip_code": 52701, + "latitude": 41.964393, + "longitude": -90.222348, + "city": "Andover", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52720, + "latitude": 41.475075, + "longitude": -91.16406, + "city": "Atalissa", + "state": "IA", + "county": "Muscatine" + }, + { + "zip_code": 52721, + "latitude": 41.749923, + "longitude": -90.96289, + "city": "Bennett", + "state": "IA", + "county": "Cedar" + }, + { + "zip_code": 52722, + "latitude": 41.57048, + "longitude": -90.529138, + "city": "Bettendorf", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52726, + "latitude": 41.61105, + "longitude": -90.660178, + "city": "Blue Grass", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52727, + "latitude": 41.953426, + "longitude": -90.326961, + "city": "Bryant", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52728, + "latitude": 41.469263, + "longitude": -90.736557, + "city": "Buffalo", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52729, + "latitude": 41.829003, + "longitude": -90.740567, + "city": "Calamus", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52730, + "latitude": 41.813438, + "longitude": -90.317574, + "city": "Camanche", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52731, + "latitude": 41.966744, + "longitude": -90.555111, + "city": "Charlotte", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52732, + "latitude": 41.899176, + "longitude": -90.301599, + "city": "Clinton", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52733, + "latitude": 41.880619, + "longitude": -90.519519, + "city": "Clinton", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52736, + "latitude": 41.880619, + "longitude": -90.519519, + "city": "Clinton", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52737, + "latitude": 41.25926, + "longitude": -91.374686, + "city": "Columbus City", + "state": "IA", + "county": "Louisa" + }, + { + "zip_code": 52738, + "latitude": 41.292638, + "longitude": -91.300624, + "city": "Columbus Junction", + "state": "IA", + "county": "Louisa" + }, + { + "zip_code": 52739, + "latitude": 41.401379, + "longitude": -91.338658, + "city": "Conesville", + "state": "IA", + "county": "Muscatine" + }, + { + "zip_code": 52742, + "latitude": 41.841735, + "longitude": -90.55621, + "city": "De Witt", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52745, + "latitude": 41.711283, + "longitude": -90.75534, + "city": "Dixon", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52746, + "latitude": 41.71654, + "longitude": -90.646985, + "city": "Donahue", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52747, + "latitude": 41.772184, + "longitude": -91.132045, + "city": "Durant", + "state": "IA", + "county": "Cedar" + }, + { + "zip_code": 52748, + "latitude": 41.59972, + "longitude": -90.564348, + "city": "Eldridge", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52749, + "latitude": 41.3486, + "longitude": -91.123729, + "city": "Fruitland", + "state": "IA", + "county": "Muscatine" + }, + { + "zip_code": 52750, + "latitude": 41.942428, + "longitude": -90.378578, + "city": "Goose Lake", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52751, + "latitude": 41.850144, + "longitude": -90.669527, + "city": "Grand Mound", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52752, + "latitude": 41.256712, + "longitude": -91.19669, + "city": "Grandview", + "state": "IA", + "county": "Louisa" + }, + { + "zip_code": 52753, + "latitude": 41.568131, + "longitude": -90.537234, + "city": "Le Claire", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52754, + "latitude": 41.304284, + "longitude": -91.249503, + "city": "Letts", + "state": "IA", + "county": "Louisa" + }, + { + "zip_code": 52755, + "latitude": 41.510935, + "longitude": -91.440616, + "city": "Lone Tree", + "state": "IA", + "county": "Johnson" + }, + { + "zip_code": 52756, + "latitude": 41.726242, + "longitude": -90.540219, + "city": "Long Grove", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52757, + "latitude": 41.806528, + "longitude": -90.370566, + "city": "Low Moor", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52758, + "latitude": 41.743048, + "longitude": -90.453905, + "city": "Mc Causland", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52759, + "latitude": 41.462494, + "longitude": -90.808767, + "city": "Montpelier", + "state": "IA", + "county": "Muscatine" + }, + { + "zip_code": 52760, + "latitude": 41.552779, + "longitude": -91.058797, + "city": "Moscow", + "state": "IA", + "county": "Muscatine" + }, + { + "zip_code": 52761, + "latitude": 41.462426, + "longitude": -91.053888, + "city": "Muscatine", + "state": "IA", + "county": "Muscatine" + }, + { + "zip_code": 52765, + "latitude": 41.713165, + "longitude": -90.850502, + "city": "New Liberty", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52766, + "latitude": 41.492577, + "longitude": -91.196155, + "city": "Nichols", + "state": "IA", + "county": "Muscatine" + }, + { + "zip_code": 52767, + "latitude": 41.574582, + "longitude": -90.42128, + "city": "Pleasant Valley", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52768, + "latitude": 41.69565, + "longitude": -90.394692, + "city": "Princeton", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52769, + "latitude": 41.538729, + "longitude": -90.856921, + "city": "Stockton", + "state": "IA", + "county": "Muscatine" + }, + { + "zip_code": 52771, + "latitude": 41.999113, + "longitude": -90.218704, + "city": "Teeds Grove", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52772, + "latitude": 41.772503, + "longitude": -91.13248, + "city": "Tipton", + "state": "IA", + "county": "Cedar" + }, + { + "zip_code": 52773, + "latitude": 41.61358, + "longitude": -90.753478, + "city": "Walcott", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52774, + "latitude": 41.917411, + "longitude": -90.597017, + "city": "Welton", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52776, + "latitude": 41.529715, + "longitude": -91.190607, + "city": "West Liberty", + "state": "IA", + "county": "Muscatine" + }, + { + "zip_code": 52777, + "latitude": 41.873852, + "longitude": -90.682244, + "city": "Wheatland", + "state": "IA", + "county": "Clinton" + }, + { + "zip_code": 52778, + "latitude": 41.559742, + "longitude": -90.959154, + "city": "Wilton", + "state": "IA", + "county": "Muscatine" + }, + { + "zip_code": 52801, + "latitude": 41.527232, + "longitude": -90.573686, + "city": "Davenport", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52802, + "latitude": 41.497582, + "longitude": -90.623887, + "city": "Davenport", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52803, + "latitude": 41.538332, + "longitude": -90.556985, + "city": "Davenport", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52804, + "latitude": 41.556481, + "longitude": -90.598757, + "city": "Davenport", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52805, + "latitude": 41.613034, + "longitude": -90.606284, + "city": "Davenport", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52806, + "latitude": 41.545731, + "longitude": -90.633688, + "city": "Davenport", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52807, + "latitude": 41.571131, + "longitude": -90.555825, + "city": "Davenport", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52808, + "latitude": 41.613034, + "longitude": -90.606284, + "city": "Davenport", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 52809, + "latitude": 41.613034, + "longitude": -90.606284, + "city": "Davenport", + "state": "IA", + "county": "Scott" + }, + { + "zip_code": 53001, + "latitude": 43.658488, + "longitude": -87.973717, + "city": "Adell", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53002, + "latitude": 43.382128, + "longitude": -88.26219, + "city": "Allenton", + "state": "WI", + "county": "Washington" + }, + { + "zip_code": 53003, + "latitude": 43.217506, + "longitude": -88.525315, + "city": "Ashippun", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53004, + "latitude": 43.499631, + "longitude": -87.918042, + "city": "Belgium", + "state": "WI", + "county": "Ozaukee" + }, + { + "zip_code": 53005, + "latitude": 43.062707, + "longitude": -88.105906, + "city": "Brookfield", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53006, + "latitude": 43.602789, + "longitude": -88.52302, + "city": "Brownsville", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53007, + "latitude": 43.108459, + "longitude": -88.071489, + "city": "Butler", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53008, + "latitude": 43.018696, + "longitude": -88.302997, + "city": "Brookfield", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53010, + "latitude": 43.682727, + "longitude": -88.350947, + "city": "Campbellsport", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 53011, + "latitude": 43.725504, + "longitude": -88.048378, + "city": "Cascade", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53012, + "latitude": 43.321475, + "longitude": -88.004033, + "city": "Cedarburg", + "state": "WI", + "county": "Ozaukee" + }, + { + "zip_code": 53013, + "latitude": 43.590548, + "longitude": -87.85532, + "city": "Cedar Grove", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53014, + "latitude": 44.020561, + "longitude": -88.185906, + "city": "Chilton", + "state": "WI", + "county": "Calumet" + }, + { + "zip_code": 53015, + "latitude": 43.935653, + "longitude": -87.80346, + "city": "Cleveland", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 53016, + "latitude": 43.31546, + "longitude": -88.720642, + "city": "Clyman", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53017, + "latitude": 43.209445, + "longitude": -88.241501, + "city": "Colgate", + "state": "WI", + "county": "Washington" + }, + { + "zip_code": 53018, + "latitude": 43.015666, + "longitude": -88.386519, + "city": "Delafield", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53019, + "latitude": 43.672543, + "longitude": -88.50384, + "city": "Eden", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 53020, + "latitude": 43.827363, + "longitude": -87.9915, + "city": "Elkhart Lake", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53021, + "latitude": 43.477015, + "longitude": -87.961162, + "city": "Fredonia", + "state": "WI", + "county": "Ozaukee" + }, + { + "zip_code": 53022, + "latitude": 43.235477, + "longitude": -88.124711, + "city": "Germantown", + "state": "WI", + "county": "Washington" + }, + { + "zip_code": 53023, + "latitude": 43.772128, + "longitude": -88.041299, + "city": "Glenbeulah", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53024, + "latitude": 43.299956, + "longitude": -87.94104, + "city": "Grafton", + "state": "WI", + "county": "Ozaukee" + }, + { + "zip_code": 53026, + "latitude": 43.718294, + "longitude": -87.618716, + "city": "Greenbush", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53027, + "latitude": 43.357616, + "longitude": -88.319032, + "city": "Hartford", + "state": "WI", + "county": "Washington" + }, + { + "zip_code": 53029, + "latitude": 43.123679, + "longitude": -88.336087, + "city": "Hartland", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53031, + "latitude": 43.639395, + "longitude": -87.915705, + "city": "Hingham", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53032, + "latitude": 43.422045, + "longitude": -88.624268, + "city": "Horicon", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53033, + "latitude": 43.367185, + "longitude": -88.252892, + "city": "Hubertus", + "state": "WI", + "county": "Washington" + }, + { + "zip_code": 53034, + "latitude": 43.330523, + "longitude": -88.603032, + "city": "Hustisford", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53035, + "latitude": 43.36296, + "longitude": -88.581515, + "city": "Iron Ridge", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53036, + "latitude": 43.147748, + "longitude": -88.588628, + "city": "Ixonia", + "state": "WI", + "county": "Jefferson" + }, + { + "zip_code": 53037, + "latitude": 43.32393, + "longitude": -88.152212, + "city": "Jackson", + "state": "WI", + "county": "Washington" + }, + { + "zip_code": 53038, + "latitude": 43.092348, + "longitude": -88.743276, + "city": "Johnson Creek", + "state": "WI", + "county": "Jefferson" + }, + { + "zip_code": 53039, + "latitude": 43.372221, + "longitude": -88.710157, + "city": "Juneau", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53040, + "latitude": 43.499425, + "longitude": -88.206447, + "city": "Kewaskum", + "state": "WI", + "county": "Washington" + }, + { + "zip_code": 53042, + "latitude": 43.96317, + "longitude": -87.955059, + "city": "Kiel", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 53044, + "latitude": 43.748441, + "longitude": -87.776246, + "city": "Kohler", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53045, + "latitude": 43.06081, + "longitude": -88.15589, + "city": "Brookfield", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53046, + "latitude": 43.153279, + "longitude": -88.164427, + "city": "Lannon", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53047, + "latitude": 43.256793, + "longitude": -88.6281, + "city": "Lebanon", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53048, + "latitude": 43.516912, + "longitude": -88.480811, + "city": "Lomira", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53049, + "latitude": 43.875302, + "longitude": -88.287108, + "city": "Malone", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 53050, + "latitude": 43.483463, + "longitude": -88.545925, + "city": "Mayville", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53051, + "latitude": 43.124189, + "longitude": -88.227543, + "city": "Menomonee Falls", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53052, + "latitude": 43.018696, + "longitude": -88.302997, + "city": "Menomonee Falls", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53056, + "latitude": 43.146023, + "longitude": -88.30975, + "city": "Merton", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53057, + "latitude": 43.711957, + "longitude": -88.443585, + "city": "Mount Calvary", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 53058, + "latitude": 43.109127, + "longitude": -88.40248, + "city": "Nashotah", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53059, + "latitude": 43.289809, + "longitude": -88.533958, + "city": "Neosho", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53060, + "latitude": 43.433807, + "longitude": -88.062338, + "city": "Newburg", + "state": "WI", + "county": "Washington" + }, + { + "zip_code": 53061, + "latitude": 43.949886, + "longitude": -88.101954, + "city": "New Holstein", + "state": "WI", + "county": "Calumet" + }, + { + "zip_code": 53062, + "latitude": 44.067942, + "longitude": -88.223131, + "city": "New Holstein", + "state": "WI", + "county": "Calumet" + }, + { + "zip_code": 53063, + "latitude": 43.957599, + "longitude": -87.792815, + "city": "Newton", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 53064, + "latitude": 43.018696, + "longitude": -88.302997, + "city": "North Lake", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53065, + "latitude": 43.690246, + "longitude": -88.678209, + "city": "Oakfield", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 53066, + "latitude": 43.087062, + "longitude": -88.463305, + "city": "Oconomowoc", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53069, + "latitude": 43.117886, + "longitude": -88.439353, + "city": "Okauchee", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53070, + "latitude": 43.620857, + "longitude": -87.810616, + "city": "Oostburg", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53072, + "latitude": 43.080185, + "longitude": -88.264875, + "city": "Pewaukee", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53073, + "latitude": 43.768454, + "longitude": -87.975773, + "city": "Plymouth", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53074, + "latitude": 43.387702, + "longitude": -87.881232, + "city": "Port Washington", + "state": "WI", + "county": "Ozaukee" + }, + { + "zip_code": 53075, + "latitude": 43.582924, + "longitude": -88.000555, + "city": "Random Lake", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53076, + "latitude": 43.2727, + "longitude": -88.206716, + "city": "Richfield", + "state": "WI", + "county": "Washington" + }, + { + "zip_code": 53078, + "latitude": 43.304408, + "longitude": -88.504428, + "city": "Rubicon", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53079, + "latitude": 43.797531, + "longitude": -88.201679, + "city": "Saint Cloud", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 53080, + "latitude": 43.432544, + "longitude": -87.947537, + "city": "Saukville", + "state": "WI", + "county": "Ozaukee" + }, + { + "zip_code": 53081, + "latitude": 43.722489, + "longitude": -87.856793, + "city": "Sheboygan", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53082, + "latitude": 43.718294, + "longitude": -87.618716, + "city": "Sheboygan", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53083, + "latitude": 43.775428, + "longitude": -87.860803, + "city": "Sheboygan", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53085, + "latitude": 43.726404, + "longitude": -87.853069, + "city": "Sheboygan Falls", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53086, + "latitude": 43.327417, + "longitude": -88.260878, + "city": "Slinger", + "state": "WI", + "county": "Washington" + }, + { + "zip_code": 53088, + "latitude": 44.080455, + "longitude": -88.312404, + "city": "Stockbridge", + "state": "WI", + "county": "Calumet" + }, + { + "zip_code": 53089, + "latitude": 43.148887, + "longitude": -88.245381, + "city": "Sussex", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53090, + "latitude": 43.443839, + "longitude": -88.19631, + "city": "West Bend", + "state": "WI", + "county": "Washington" + }, + { + "zip_code": 53091, + "latitude": 43.483635, + "longitude": -88.450107, + "city": "Theresa", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53092, + "latitude": 43.235856, + "longitude": -87.981188, + "city": "Thiensville", + "state": "WI", + "county": "Ozaukee" + }, + { + "zip_code": 53093, + "latitude": 43.662704, + "longitude": -87.930254, + "city": "Waldo", + "state": "WI", + "county": "Sheboygan" + }, + { + "zip_code": 53094, + "latitude": 43.132599, + "longitude": -88.743595, + "city": "Watertown", + "state": "WI", + "county": "Jefferson" + }, + { + "zip_code": 53095, + "latitude": 43.422223, + "longitude": -88.195862, + "city": "West Bend", + "state": "WI", + "county": "Washington" + }, + { + "zip_code": 53097, + "latitude": 43.247112, + "longitude": -87.980914, + "city": "Mequon", + "state": "WI", + "county": "Ozaukee" + }, + { + "zip_code": 53098, + "latitude": 43.276444, + "longitude": -88.715408, + "city": "Watertown", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53099, + "latitude": 43.414202, + "longitude": -88.704914, + "city": "Woodland", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53101, + "latitude": 42.58098, + "longitude": -87.662878, + "city": "Bassett", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53102, + "latitude": 42.500141, + "longitude": -88.079983, + "city": "Benet Lake", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53103, + "latitude": 42.882441, + "longitude": -88.205514, + "city": "Big Bend", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53104, + "latitude": 42.553518, + "longitude": -88.028986, + "city": "Bristol", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53105, + "latitude": 42.692103, + "longitude": -88.228793, + "city": "Burlington", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53108, + "latitude": 42.803697, + "longitude": -87.930936, + "city": "Caledonia", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53109, + "latitude": 42.535968, + "longitude": -88.144386, + "city": "Camp Lake", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53110, + "latitude": 42.948015, + "longitude": -87.866831, + "city": "Cudahy", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53114, + "latitude": 42.658281, + "longitude": -88.660964, + "city": "Darien", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53115, + "latitude": 42.641556, + "longitude": -88.653496, + "city": "Delavan", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53118, + "latitude": 42.951536, + "longitude": -88.444097, + "city": "Dousman", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53119, + "latitude": 42.929074, + "longitude": -88.47489, + "city": "Eagle", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53120, + "latitude": 42.756533, + "longitude": -88.507327, + "city": "East Troy", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53121, + "latitude": 42.671666, + "longitude": -88.563961, + "city": "Elkhorn", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53122, + "latitude": 43.048211, + "longitude": -88.087888, + "city": "Elm Grove", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53125, + "latitude": 42.545625, + "longitude": -88.463036, + "city": "Fontana", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53126, + "latitude": 42.785553, + "longitude": -87.995471, + "city": "Franksville", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53127, + "latitude": 42.960098, + "longitude": -88.374455, + "city": "Genesee Depot", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53128, + "latitude": 42.549412, + "longitude": -88.438624, + "city": "Genoa City", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53129, + "latitude": 42.937765, + "longitude": -87.998935, + "city": "Greendale", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53130, + "latitude": 42.943614, + "longitude": -88.046454, + "city": "Hales Corners", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53132, + "latitude": 42.887289, + "longitude": -88.009597, + "city": "Franklin", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53137, + "latitude": 43.008958, + "longitude": -88.6726, + "city": "Helenville", + "state": "WI", + "county": "Jefferson" + }, + { + "zip_code": 53138, + "latitude": 42.66749, + "longitude": -88.541721, + "city": "Honey Creek", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53139, + "latitude": 42.720022, + "longitude": -88.120616, + "city": "Kansasville", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53140, + "latitude": 42.622449, + "longitude": -87.830375, + "city": "Kenosha", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53141, + "latitude": 42.58098, + "longitude": -87.662878, + "city": "Kenosha", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53142, + "latitude": 42.558221, + "longitude": -87.925876, + "city": "Kenosha", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53143, + "latitude": 42.53607, + "longitude": -87.824828, + "city": "Kenosha", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53144, + "latitude": 42.618427, + "longitude": -87.948079, + "city": "Kenosha", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53146, + "latitude": 42.969924, + "longitude": -88.177554, + "city": "New Berlin", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53147, + "latitude": 42.617877, + "longitude": -88.52023, + "city": "Lake Geneva", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53148, + "latitude": 42.648665, + "longitude": -88.359044, + "city": "Lyons", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53149, + "latitude": 42.97594, + "longitude": -88.329731, + "city": "Mukwonago", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53150, + "latitude": 42.88799, + "longitude": -88.132708, + "city": "Muskego", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53151, + "latitude": 42.973459, + "longitude": -88.127689, + "city": "New Berlin", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53152, + "latitude": 42.574616, + "longitude": -88.232632, + "city": "New Munster", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53153, + "latitude": 42.940971, + "longitude": -88.401712, + "city": "North Prairie", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53154, + "latitude": 42.886266, + "longitude": -87.89198, + "city": "Oak Creek", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53156, + "latitude": 42.893937, + "longitude": -88.59712, + "city": "Palmyra", + "state": "WI", + "county": "Jefferson" + }, + { + "zip_code": 53157, + "latitude": 42.540048, + "longitude": -88.358167, + "city": "Pell Lake", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53158, + "latitude": 42.52926, + "longitude": -87.885546, + "city": "Pleasant Prairie", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53159, + "latitude": 42.555695, + "longitude": -88.296914, + "city": "Powers Lake", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53167, + "latitude": 42.748168, + "longitude": -88.243586, + "city": "Rochester", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53168, + "latitude": 42.574598, + "longitude": -88.137535, + "city": "Salem", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53170, + "latitude": 42.552018, + "longitude": -88.160836, + "city": "Silver Lake", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53171, + "latitude": 42.642298, + "longitude": -87.903161, + "city": "Somers", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53172, + "latitude": 42.911616, + "longitude": -87.950533, + "city": "South Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53176, + "latitude": 42.636038, + "longitude": -88.415987, + "city": "Springfield", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53177, + "latitude": 42.712962, + "longitude": -87.934013, + "city": "Sturtevant", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53178, + "latitude": 43.018327, + "longitude": -88.600429, + "city": "Sullivan", + "state": "WI", + "county": "Jefferson" + }, + { + "zip_code": 53179, + "latitude": 42.517168, + "longitude": -88.138001, + "city": "Trevor", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53181, + "latitude": 42.523887, + "longitude": -88.235389, + "city": "Twin Lakes", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53182, + "latitude": 42.739435, + "longitude": -88.083092, + "city": "Union Grove", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53183, + "latitude": 43.003573, + "longitude": -88.376916, + "city": "Wales", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53184, + "latitude": 42.561543, + "longitude": -88.597153, + "city": "Walworth", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53185, + "latitude": 42.763168, + "longitude": -88.197361, + "city": "Waterford", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53186, + "latitude": 42.987835, + "longitude": -88.217715, + "city": "Waukesha", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53187, + "latitude": 43.018696, + "longitude": -88.302997, + "city": "Waukesha", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53188, + "latitude": 42.994564, + "longitude": -88.241786, + "city": "Waukesha", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53189, + "latitude": 42.95163, + "longitude": -88.296321, + "city": "Waukesha", + "state": "WI", + "county": "Waukesha" + }, + { + "zip_code": 53190, + "latitude": 42.784255, + "longitude": -88.592559, + "city": "Whitewater", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53191, + "latitude": 42.691288, + "longitude": -88.635035, + "city": "Williams Bay", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53192, + "latitude": 42.507165, + "longitude": -88.191337, + "city": "Wilmot", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53194, + "latitude": 42.58098, + "longitude": -87.662878, + "city": "Woodworth", + "state": "WI", + "county": "Kenosha" + }, + { + "zip_code": 53195, + "latitude": 42.513649, + "longitude": -88.484322, + "city": "Zenda", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53201, + "latitude": 43.011264, + "longitude": -87.958409, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53202, + "latitude": 43.043213, + "longitude": -87.894734, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53203, + "latitude": 43.038313, + "longitude": -87.916534, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53204, + "latitude": 43.019463, + "longitude": -87.925534, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53205, + "latitude": 43.053112, + "longitude": -87.933185, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53206, + "latitude": 43.074311, + "longitude": -87.933135, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53207, + "latitude": 42.975115, + "longitude": -87.894682, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53208, + "latitude": 43.045962, + "longitude": -87.963536, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53209, + "latitude": 43.140909, + "longitude": -87.942653, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53210, + "latitude": 43.071111, + "longitude": -87.973786, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53211, + "latitude": 43.082018, + "longitude": -87.889534, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53212, + "latitude": 43.074862, + "longitude": -87.907178, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53213, + "latitude": 43.075461, + "longitude": -87.999511, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53214, + "latitude": 43.021514, + "longitude": -88.017587, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53215, + "latitude": 43.006014, + "longitude": -87.942935, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53216, + "latitude": 43.086244, + "longitude": -87.976988, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53217, + "latitude": 43.13446, + "longitude": -87.933386, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53218, + "latitude": 43.11546, + "longitude": -87.991687, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53219, + "latitude": 42.995814, + "longitude": -87.990335, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53220, + "latitude": 42.955864, + "longitude": -87.993285, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53221, + "latitude": 42.950565, + "longitude": -87.987933, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53222, + "latitude": 43.082161, + "longitude": -88.036938, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53223, + "latitude": 43.162959, + "longitude": -87.977896, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53224, + "latitude": 43.163122, + "longitude": -88.022586, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53225, + "latitude": 43.115159, + "longitude": -88.040188, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53226, + "latitude": 43.049312, + "longitude": -88.041387, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53227, + "latitude": 43.000926, + "longitude": -88.031418, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53228, + "latitude": 42.967564, + "longitude": -88.043386, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53233, + "latitude": 43.037213, + "longitude": -87.933529, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53234, + "latitude": 43.017412, + "longitude": -87.569664, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53235, + "latitude": 42.969865, + "longitude": -87.873732, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53237, + "latitude": 43.017412, + "longitude": -87.569664, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53259, + "latitude": 43.038663, + "longitude": -87.913934, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53263, + "latitude": 43.074583, + "longitude": -88.06044, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53267, + "latitude": 43.044013, + "longitude": -87.909834, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53268, + "latitude": 43.038513, + "longitude": -87.909584, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53270, + "latitude": 43.038763, + "longitude": -87.903634, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53274, + "latitude": 43.017412, + "longitude": -87.569664, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53277, + "latitude": 43.038863, + "longitude": -87.902384, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53278, + "latitude": 43.038863, + "longitude": -87.902384, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53280, + "latitude": 43.040963, + "longitude": -87.957786, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53281, + "latitude": 43.040963, + "longitude": -87.957786, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53284, + "latitude": 43.017412, + "longitude": -87.569664, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53285, + "latitude": 43.017412, + "longitude": -87.569664, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53288, + "latitude": 43.040613, + "longitude": -87.909784, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53290, + "latitude": 43.037263, + "longitude": -87.914034, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53293, + "latitude": 43.040813, + "longitude": -87.919135, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53295, + "latitude": 43.017412, + "longitude": -87.569664, + "city": "Milwaukee", + "state": "WI", + "county": "Milwaukee" + }, + { + "zip_code": 53401, + "latitude": 42.727153, + "longitude": -87.675979, + "city": "Racine", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53402, + "latitude": 42.755628, + "longitude": -87.821815, + "city": "Racine", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53403, + "latitude": 42.700619, + "longitude": -87.835901, + "city": "Racine", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53404, + "latitude": 42.756718, + "longitude": -87.812275, + "city": "Racine", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53405, + "latitude": 42.731827, + "longitude": -87.820925, + "city": "Racine", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53406, + "latitude": 42.72993, + "longitude": -87.866213, + "city": "Racine", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53407, + "latitude": 42.731224, + "longitude": -87.782818, + "city": "Racine", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53408, + "latitude": 42.727153, + "longitude": -87.675979, + "city": "Racine", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53490, + "latitude": 42.727153, + "longitude": -87.675979, + "city": "Racine", + "state": "WI", + "county": "Racine" + }, + { + "zip_code": 53501, + "latitude": 42.605454, + "longitude": -89.070448, + "city": "Afton", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53502, + "latitude": 42.712827, + "longitude": -89.45123, + "city": "Albany", + "state": "WI", + "county": "Green" + }, + { + "zip_code": 53503, + "latitude": 43.119643, + "longitude": -89.947679, + "city": "Arena", + "state": "WI", + "county": "Iowa" + }, + { + "zip_code": 53504, + "latitude": 42.690143, + "longitude": -89.922697, + "city": "Argyle", + "state": "WI", + "county": "Lafayette" + }, + { + "zip_code": 53505, + "latitude": 42.659301, + "longitude": -88.83065, + "city": "Avalon", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53506, + "latitude": 43.138475, + "longitude": -90.280725, + "city": "Avoca", + "state": "WI", + "county": "Iowa" + }, + { + "zip_code": 53507, + "latitude": 43.008396, + "longitude": -89.897387, + "city": "Barneveld", + "state": "WI", + "county": "Iowa" + }, + { + "zip_code": 53508, + "latitude": 42.903829, + "longitude": -89.586339, + "city": "Belleville", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53510, + "latitude": 42.685375, + "longitude": -90.263828, + "city": "Belmont", + "state": "WI", + "county": "Lafayette" + }, + { + "zip_code": 53511, + "latitude": 42.562039, + "longitude": -89.086045, + "city": "Beloit", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53512, + "latitude": 42.669779, + "longitude": -89.072779, + "city": "Beloit", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53515, + "latitude": 43.113953, + "longitude": -89.624544, + "city": "Black Earth", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53516, + "latitude": 42.693258, + "longitude": -90.104765, + "city": "Blanchardville", + "state": "WI", + "county": "Lafayette" + }, + { + "zip_code": 53517, + "latitude": 43.03822, + "longitude": -89.804576, + "city": "Blue Mounds", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53518, + "latitude": 42.97045, + "longitude": -90.571655, + "city": "Blue River", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53520, + "latitude": 42.605797, + "longitude": -89.580126, + "city": "Brodhead", + "state": "WI", + "county": "Green" + }, + { + "zip_code": 53521, + "latitude": 42.717122, + "longitude": -89.582703, + "city": "Brooklyn", + "state": "WI", + "county": "Green" + }, + { + "zip_code": 53522, + "latitude": 42.563199, + "longitude": -89.778793, + "city": "Browntown", + "state": "WI", + "county": "Green" + }, + { + "zip_code": 53523, + "latitude": 42.987505, + "longitude": -89.080742, + "city": "Cambridge", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53525, + "latitude": 42.56239, + "longitude": -88.859993, + "city": "Clinton", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53526, + "latitude": 42.963325, + "longitude": -90.369319, + "city": "Cobb", + "state": "WI", + "county": "Iowa" + }, + { + "zip_code": 53527, + "latitude": 43.071165, + "longitude": -89.196996, + "city": "Cottage Grove", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53528, + "latitude": 43.106453, + "longitude": -89.695091, + "city": "Cross Plains", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53529, + "latitude": 43.239966, + "longitude": -89.523346, + "city": "Dane", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53530, + "latitude": 42.69112, + "longitude": -90.134781, + "city": "Darlington", + "state": "WI", + "county": "Lafayette" + }, + { + "zip_code": 53531, + "latitude": 43.057662, + "longitude": -89.091798, + "city": "Deerfield", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53532, + "latitude": 43.149066, + "longitude": -89.260855, + "city": "De Forest", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53533, + "latitude": 43.007063, + "longitude": -90.192522, + "city": "Dodgeville", + "state": "WI", + "county": "Iowa" + }, + { + "zip_code": 53534, + "latitude": 42.803797, + "longitude": -89.101389, + "city": "Edgerton", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53535, + "latitude": 43.011323, + "longitude": -90.133932, + "city": "Edmund", + "state": "WI", + "county": "Iowa" + }, + { + "zip_code": 53536, + "latitude": 42.766359, + "longitude": -89.250152, + "city": "Evansville", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53537, + "latitude": 42.672575, + "longitude": -89.211151, + "city": "Footville", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53538, + "latitude": 42.926467, + "longitude": -88.841626, + "city": "Fort Atkinson", + "state": "WI", + "county": "Jefferson" + }, + { + "zip_code": 53540, + "latitude": 43.234509, + "longitude": -90.261804, + "city": "Gotham", + "state": "WI", + "county": "Richland" + }, + { + "zip_code": 53541, + "latitude": 42.579894, + "longitude": -90.031186, + "city": "Gratiot", + "state": "WI", + "county": "Lafayette" + }, + { + "zip_code": 53542, + "latitude": 42.632325, + "longitude": -89.15942, + "city": "Hanover", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53543, + "latitude": 42.991078, + "longitude": -90.133812, + "city": "Highland", + "state": "WI", + "county": "Iowa" + }, + { + "zip_code": 53544, + "latitude": 42.871497, + "longitude": -89.923881, + "city": "Hollandale", + "state": "WI", + "county": "Iowa" + }, + { + "zip_code": 53545, + "latitude": 42.710981, + "longitude": -89.112201, + "city": "Janesville", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53546, + "latitude": 42.663574, + "longitude": -88.947859, + "city": "Janesville", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53547, + "latitude": 42.729359, + "longitude": -89.030111, + "city": "Janesville", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53549, + "latitude": 42.993502, + "longitude": -88.759793, + "city": "Jefferson", + "state": "WI", + "county": "Jefferson" + }, + { + "zip_code": 53550, + "latitude": 42.564434, + "longitude": -89.507906, + "city": "Juda", + "state": "WI", + "county": "Green" + }, + { + "zip_code": 53551, + "latitude": 43.080902, + "longitude": -88.913251, + "city": "Lake Mills", + "state": "WI", + "county": "Jefferson" + }, + { + "zip_code": 53553, + "latitude": 42.963106, + "longitude": -90.320561, + "city": "Linden", + "state": "WI", + "county": "Iowa" + }, + { + "zip_code": 53554, + "latitude": 42.898716, + "longitude": -90.511593, + "city": "Livingston", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53555, + "latitude": 43.342813, + "longitude": -89.557023, + "city": "Lodi", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 53556, + "latitude": 43.241475, + "longitude": -90.265197, + "city": "Lone Rock", + "state": "WI", + "county": "Richland" + }, + { + "zip_code": 53557, + "latitude": 43.343056, + "longitude": -88.791442, + "city": "Lowell", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53558, + "latitude": 43.010519, + "longitude": -89.363862, + "city": "Mc Farland", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53559, + "latitude": 43.173921, + "longitude": -89.091315, + "city": "Marshall", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53560, + "latitude": 43.190983, + "longitude": -89.729261, + "city": "Mazomanie", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53561, + "latitude": 43.364531, + "longitude": -89.66396, + "city": "Merrimac", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53562, + "latitude": 43.114772, + "longitude": -89.529153, + "city": "Middleton", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53563, + "latitude": 42.737804, + "longitude": -89.041277, + "city": "Milton", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53565, + "latitude": 42.989701, + "longitude": -90.152558, + "city": "Mineral Point", + "state": "WI", + "county": "Iowa" + }, + { + "zip_code": 53566, + "latitude": 42.612966, + "longitude": -89.656994, + "city": "Monroe", + "state": "WI", + "county": "Green" + }, + { + "zip_code": 53569, + "latitude": 43.031263, + "longitude": -90.492475, + "city": "Montfort", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53570, + "latitude": 42.74305, + "longitude": -89.621013, + "city": "Monticello", + "state": "WI", + "county": "Green" + }, + { + "zip_code": 53571, + "latitude": 43.277325, + "longitude": -89.356403, + "city": "Morrisonville", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53572, + "latitude": 42.973438, + "longitude": -89.513903, + "city": "Mount Horeb", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53573, + "latitude": 43.1234, + "longitude": -90.488423, + "city": "Muscoda", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53574, + "latitude": 42.816273, + "longitude": -89.651287, + "city": "New Glarus", + "state": "WI", + "county": "Green" + }, + { + "zip_code": 53575, + "latitude": 42.933918, + "longitude": -89.389642, + "city": "Oregon", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53576, + "latitude": 42.614273, + "longitude": -89.233129, + "city": "Orfordville", + "state": "WI", + "county": "Rock" + }, + { + "zip_code": 53577, + "latitude": 43.293776, + "longitude": -90.022327, + "city": "Plain", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53578, + "latitude": 43.360759, + "longitude": -89.808407, + "city": "Prairie Du Sac", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53579, + "latitude": 43.287987, + "longitude": -88.887444, + "city": "Reeseville", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53580, + "latitude": 42.856934, + "longitude": -90.377784, + "city": "Rewey", + "state": "WI", + "county": "Iowa" + }, + { + "zip_code": 53581, + "latitude": 43.366148, + "longitude": -90.430225, + "city": "Richland Center", + "state": "WI", + "county": "Richland" + }, + { + "zip_code": 53582, + "latitude": 43.016577, + "longitude": -89.986458, + "city": "Ridgeway", + "state": "WI", + "county": "Iowa" + }, + { + "zip_code": 53583, + "latitude": 43.251127, + "longitude": -89.89584, + "city": "Sauk City", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53584, + "latitude": 43.279435, + "longitude": -90.287566, + "city": "Sextonville", + "state": "WI", + "county": "Richland" + }, + { + "zip_code": 53585, + "latitude": 42.607688, + "longitude": -88.623745, + "city": "Sharon", + "state": "WI", + "county": "Walworth" + }, + { + "zip_code": 53586, + "latitude": 42.605221, + "longitude": -90.113635, + "city": "Shullsburg", + "state": "WI", + "county": "Lafayette" + }, + { + "zip_code": 53587, + "latitude": 42.579926, + "longitude": -89.931751, + "city": "South Wayne", + "state": "WI", + "county": "Lafayette" + }, + { + "zip_code": 53588, + "latitude": 43.230001, + "longitude": -90.040066, + "city": "Spring Green", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53589, + "latitude": 42.931289, + "longitude": -89.168354, + "city": "Stoughton", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53590, + "latitude": 43.195712, + "longitude": -89.209418, + "city": "Sun Prairie", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53591, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Sun Prairie", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53593, + "latitude": 42.995697, + "longitude": -89.566512, + "city": "Verona", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53594, + "latitude": 43.12904, + "longitude": -88.947513, + "city": "Waterloo", + "state": "WI", + "county": "Jefferson" + }, + { + "zip_code": 53595, + "latitude": 42.976078, + "longitude": -90.141299, + "city": "Dodgeville", + "state": "WI", + "county": "Iowa" + }, + { + "zip_code": 53596, + "latitude": 43.192403, + "longitude": -89.26288, + "city": "Sun Prairie", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53597, + "latitude": 43.183972, + "longitude": -89.322655, + "city": "Waunakee", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53598, + "latitude": 43.207783, + "longitude": -89.34178, + "city": "Windsor", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53599, + "latitude": 42.649309, + "longitude": -89.862202, + "city": "Woodford", + "state": "WI", + "county": "Lafayette" + }, + { + "zip_code": 53701, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53702, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53703, + "latitude": 43.053085, + "longitude": -89.352764, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53704, + "latitude": 43.104429, + "longitude": -89.322135, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53705, + "latitude": 43.073147, + "longitude": -89.45681, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53706, + "latitude": 43.077755, + "longitude": -89.413326, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53707, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53708, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53709, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53710, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53711, + "latitude": 43.021252, + "longitude": -89.417973, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53713, + "latitude": 43.037167, + "longitude": -89.397066, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53714, + "latitude": 43.118663, + "longitude": -89.312644, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53715, + "latitude": 43.061839, + "longitude": -89.394619, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53716, + "latitude": 43.063103, + "longitude": -89.313327, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53717, + "latitude": 43.015966, + "longitude": -89.656734, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53718, + "latitude": 43.11416, + "longitude": -89.249067, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53719, + "latitude": 43.03125, + "longitude": -89.494568, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53725, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53726, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53744, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53777, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53778, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53779, + "latitude": 43.098202, + "longitude": -89.324196, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53780, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53782, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53783, + "latitude": 43.15955, + "longitude": -89.285235, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53784, + "latitude": 43.048908, + "longitude": -89.338447, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53785, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53786, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53787, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53788, + "latitude": 43.076691, + "longitude": -89.37632, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53789, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53790, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53791, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53792, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53793, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53794, + "latitude": 43.06956, + "longitude": -89.423861, + "city": "Madison", + "state": "WI", + "county": "Dane" + }, + { + "zip_code": 53801, + "latitude": 42.796401, + "longitude": -90.823145, + "city": "Bagley", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53802, + "latitude": 42.873625, + "longitude": -90.936354, + "city": "Beetown", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53803, + "latitude": 42.554499, + "longitude": -90.350817, + "city": "Benton", + "state": "WI", + "county": "Lafayette" + }, + { + "zip_code": 53804, + "latitude": 42.838191, + "longitude": -90.907665, + "city": "Bloomington", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53805, + "latitude": 42.896051, + "longitude": -90.779071, + "city": "Boscobel", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53806, + "latitude": 42.782451, + "longitude": -90.945303, + "city": "Cassville", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53807, + "latitude": 42.751647, + "longitude": -90.699166, + "city": "Cuba City", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53808, + "latitude": 42.635081, + "longitude": -90.583298, + "city": "Dickeyville", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53809, + "latitude": 42.806387, + "longitude": -90.677324, + "city": "Fennimore", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53810, + "latitude": 42.822065, + "longitude": -90.982153, + "city": "Glen Haven", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53811, + "latitude": 42.543893, + "longitude": -90.536322, + "city": "Hazel Green", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53812, + "latitude": 42.859325, + "longitude": -90.791337, + "city": "Kieler", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53813, + "latitude": 42.864155, + "longitude": -90.684965, + "city": "Lancaster", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53816, + "latitude": 42.975521, + "longitude": -90.84962, + "city": "Mount Hope", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53817, + "latitude": 42.942183, + "longitude": -90.964596, + "city": "Patch Grove", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53818, + "latitude": 42.795971, + "longitude": -90.644975, + "city": "Platteville", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53820, + "latitude": 42.692445, + "longitude": -90.731654, + "city": "Potosi", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53821, + "latitude": 43.084008, + "longitude": -91.069064, + "city": "Prairie Du Chien", + "state": "WI", + "county": "Crawford" + }, + { + "zip_code": 53824, + "latitude": 42.859325, + "longitude": -90.791337, + "city": "Sinsinawa", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53825, + "latitude": 42.926596, + "longitude": -90.583575, + "city": "Stitzer", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53826, + "latitude": 43.110147, + "longitude": -90.957097, + "city": "Wauzeka", + "state": "WI", + "county": "Crawford" + }, + { + "zip_code": 53827, + "latitude": 43.035813, + "longitude": -90.853002, + "city": "Woodman", + "state": "WI", + "county": "Grant" + }, + { + "zip_code": 53901, + "latitude": 43.50666, + "longitude": -89.399335, + "city": "Portage", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 53910, + "latitude": 43.892066, + "longitude": -89.827509, + "city": "Adams", + "state": "WI", + "county": "Adams" + }, + { + "zip_code": 53911, + "latitude": 43.336846, + "longitude": -89.36061, + "city": "Arlington", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 53913, + "latitude": 43.446602, + "longitude": -89.863957, + "city": "Baraboo", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53916, + "latitude": 43.466482, + "longitude": -88.862852, + "city": "Beaver Dam", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53917, + "latitude": 43.414202, + "longitude": -88.704914, + "city": "Beaver Dam", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53919, + "latitude": 43.740975, + "longitude": -88.62245, + "city": "Brandon", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 53920, + "latitude": 43.7076, + "longitude": -89.551629, + "city": "Briggsville", + "state": "WI", + "county": "Marquette" + }, + { + "zip_code": 53922, + "latitude": 43.517272, + "longitude": -88.73346, + "city": "Burnett", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53923, + "latitude": 43.550235, + "longitude": -89.15173, + "city": "Cambria", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 53924, + "latitude": 43.46358, + "longitude": -90.28225, + "city": "Cazenovia", + "state": "WI", + "county": "Richland" + }, + { + "zip_code": 53925, + "latitude": 43.3569, + "longitude": -89.12088, + "city": "Columbus", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 53926, + "latitude": 43.679317, + "longitude": -89.186656, + "city": "Dalton", + "state": "WI", + "county": "Green Lake" + }, + { + "zip_code": 53927, + "latitude": 43.95546, + "longitude": -89.941771, + "city": "Dellwood", + "state": "WI", + "county": "Adams" + }, + { + "zip_code": 53928, + "latitude": 43.426605, + "longitude": -89.149069, + "city": "Doylestown", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 53929, + "latitude": 43.82702, + "longitude": -90.10446, + "city": "Elroy", + "state": "WI", + "county": "Juneau" + }, + { + "zip_code": 53930, + "latitude": 43.6866, + "longitude": -89.483441, + "city": "Endeavor", + "state": "WI", + "county": "Marquette" + }, + { + "zip_code": 53931, + "latitude": 43.747481, + "longitude": -88.866516, + "city": "Fairwater", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 53932, + "latitude": 43.417126, + "longitude": -89.070459, + "city": "Fall River", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 53933, + "latitude": 43.568169, + "longitude": -88.895723, + "city": "Fox Lake", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53934, + "latitude": 43.997966, + "longitude": -89.777051, + "city": "Friendship", + "state": "WI", + "county": "Adams" + }, + { + "zip_code": 53935, + "latitude": 43.590116, + "longitude": -89.05931, + "city": "Friesland", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 53936, + "latitude": 43.947894, + "longitude": -89.72751, + "city": "Grand Marsh", + "state": "WI", + "county": "Adams" + }, + { + "zip_code": 53937, + "latitude": 43.390863, + "longitude": -90.128539, + "city": "Hillpoint", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53939, + "latitude": 43.6911, + "longitude": -89.130237, + "city": "Kingston", + "state": "WI", + "county": "Green Lake" + }, + { + "zip_code": 53940, + "latitude": 43.593912, + "longitude": -89.791242, + "city": "Lake Delton", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53941, + "latitude": 43.547459, + "longitude": -90.117243, + "city": "La Valle", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53942, + "latitude": 43.468211, + "longitude": -90.161478, + "city": "Lime Ridge", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53943, + "latitude": 43.385775, + "longitude": -90.017885, + "city": "Loganville", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53944, + "latitude": 43.714061, + "longitude": -89.949337, + "city": "Lyndon Station", + "state": "WI", + "county": "Juneau" + }, + { + "zip_code": 53946, + "latitude": 43.723578, + "longitude": -89.065361, + "city": "Markesan", + "state": "WI", + "county": "Green Lake" + }, + { + "zip_code": 53947, + "latitude": 43.746464, + "longitude": -89.138441, + "city": "Marquette", + "state": "WI", + "county": "Green Lake" + }, + { + "zip_code": 53948, + "latitude": 43.908679, + "longitude": -90.07242, + "city": "Mauston", + "state": "WI", + "county": "Juneau" + }, + { + "zip_code": 53949, + "latitude": 43.812581, + "longitude": -89.372011, + "city": "Montello", + "state": "WI", + "county": "Marquette" + }, + { + "zip_code": 53950, + "latitude": 43.911145, + "longitude": -90.165918, + "city": "New Lisbon", + "state": "WI", + "county": "Juneau" + }, + { + "zip_code": 53951, + "latitude": 43.4031, + "longitude": -89.872232, + "city": "North Freedom", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53952, + "latitude": 43.767789, + "longitude": -89.463944, + "city": "Oxford", + "state": "WI", + "county": "Marquette" + }, + { + "zip_code": 53953, + "latitude": 43.764385, + "longitude": -89.4576, + "city": "Packwaukee", + "state": "WI", + "county": "Marquette" + }, + { + "zip_code": 53954, + "latitude": 43.516772, + "longitude": -89.31459, + "city": "Pardeeville", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 53955, + "latitude": 43.433273, + "longitude": -89.394518, + "city": "Poynette", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 53956, + "latitude": 43.534002, + "longitude": -88.946714, + "city": "Randolph", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53957, + "latitude": 43.535249, + "longitude": -89.006845, + "city": "Randolph", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 53958, + "latitude": 43.393767, + "longitude": -89.95589, + "city": "Reedsburg", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53959, + "latitude": 43.482108, + "longitude": -89.966806, + "city": "Reedsburg", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53960, + "latitude": 43.398335, + "longitude": -89.250177, + "city": "Rio", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 53961, + "latitude": 43.459884, + "longitude": -89.931931, + "city": "Rock Springs", + "state": "WI", + "county": "Sauk" + }, + { + "zip_code": 53962, + "latitude": 43.94521, + "longitude": -90.049489, + "city": "Union Center", + "state": "WI", + "county": "Juneau" + }, + { + "zip_code": 53963, + "latitude": 43.459309, + "longitude": -88.754483, + "city": "Waupun", + "state": "WI", + "county": "Dodge" + }, + { + "zip_code": 53964, + "latitude": 43.848698, + "longitude": -89.478459, + "city": "Westfield", + "state": "WI", + "county": "Marquette" + }, + { + "zip_code": 53965, + "latitude": 43.568982, + "longitude": -89.44168, + "city": "Wisconsin Dells", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 53968, + "latitude": 43.690867, + "longitude": -90.203595, + "city": "Wonewoc", + "state": "WI", + "county": "Juneau" + }, + { + "zip_code": 53969, + "latitude": 43.498907, + "longitude": -89.30497, + "city": "Wyocena", + "state": "WI", + "county": "Columbia" + }, + { + "zip_code": 54001, + "latitude": 45.348566, + "longitude": -92.401379, + "city": "Amery", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54002, + "latitude": 44.969171, + "longitude": -92.441061, + "city": "Baldwin", + "state": "WI", + "county": "Saint Croix" + }, + { + "zip_code": 54003, + "latitude": 44.789742, + "longitude": -92.448434, + "city": "Beldenville", + "state": "WI", + "county": "Pierce" + }, + { + "zip_code": 54004, + "latitude": 45.31484, + "longitude": -92.430772, + "city": "Clayton", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54005, + "latitude": 45.282945, + "longitude": -92.429816, + "city": "Clear Lake", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54006, + "latitude": 45.554321, + "longitude": -92.662155, + "city": "Cushing", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54007, + "latitude": 45.087504, + "longitude": -92.379021, + "city": "Deer Park", + "state": "WI", + "county": "Saint Croix" + }, + { + "zip_code": 54009, + "latitude": 45.36179, + "longitude": -92.549952, + "city": "Dresser", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54010, + "latitude": 44.734759, + "longitude": -92.465532, + "city": "East Ellsworth", + "state": "WI", + "county": "Pierce" + }, + { + "zip_code": 54011, + "latitude": 44.740142, + "longitude": -92.548289, + "city": "Ellsworth", + "state": "WI", + "county": "Pierce" + }, + { + "zip_code": 54012, + "latitude": 45.11453, + "longitude": -92.276235, + "city": "Emerald", + "state": "WI", + "county": "Saint Croix" + }, + { + "zip_code": 54013, + "latitude": 45.060365, + "longitude": -92.248403, + "city": "Glenwood City", + "state": "WI", + "county": "Saint Croix" + }, + { + "zip_code": 54014, + "latitude": 44.655504, + "longitude": -92.573652, + "city": "Hager City", + "state": "WI", + "county": "Pierce" + }, + { + "zip_code": 54015, + "latitude": 44.966939, + "longitude": -92.456512, + "city": "Hammond", + "state": "WI", + "county": "Saint Croix" + }, + { + "zip_code": 54016, + "latitude": 44.971853, + "longitude": -92.481156, + "city": "Hudson", + "state": "WI", + "county": "Saint Croix" + }, + { + "zip_code": 54017, + "latitude": 45.090925, + "longitude": -92.496993, + "city": "New Richmond", + "state": "WI", + "county": "Saint Croix" + }, + { + "zip_code": 54020, + "latitude": 45.283783, + "longitude": -92.535618, + "city": "Osceola", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54021, + "latitude": 44.747209, + "longitude": -92.640483, + "city": "Prescott", + "state": "WI", + "county": "Pierce" + }, + { + "zip_code": 54022, + "latitude": 44.802351, + "longitude": -92.595365, + "city": "River Falls", + "state": "WI", + "county": "Pierce" + }, + { + "zip_code": 54023, + "latitude": 44.974357, + "longitude": -92.59762, + "city": "Roberts", + "state": "WI", + "county": "Saint Croix" + }, + { + "zip_code": 54024, + "latitude": 45.509689, + "longitude": -92.611733, + "city": "Saint Croix Falls", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54025, + "latitude": 45.081379, + "longitude": -92.474419, + "city": "Somerset", + "state": "WI", + "county": "Saint Croix" + }, + { + "zip_code": 54026, + "latitude": 45.265619, + "longitude": -92.480793, + "city": "Star Prairie", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54027, + "latitude": 44.945813, + "longitude": -92.25605, + "city": "Wilson", + "state": "WI", + "county": "Saint Croix" + }, + { + "zip_code": 54028, + "latitude": 44.946202, + "longitude": -92.376526, + "city": "Woodville", + "state": "WI", + "county": "Saint Croix" + }, + { + "zip_code": 54082, + "latitude": 45.080119, + "longitude": -92.746568, + "city": "Houlton", + "state": "WI", + "county": "Saint Croix" + }, + { + "zip_code": 54101, + "latitude": 44.792284, + "longitude": -88.044067, + "city": "Abrams", + "state": "WI", + "county": "Oconto" + }, + { + "zip_code": 54102, + "latitude": 45.492839, + "longitude": -88.049604, + "city": "Amberg", + "state": "WI", + "county": "Marinette" + }, + { + "zip_code": 54103, + "latitude": 45.672311, + "longitude": -88.530545, + "city": "Armstrong Creek", + "state": "WI", + "county": "Forest" + }, + { + "zip_code": 54104, + "latitude": 45.420602, + "longitude": -88.246901, + "city": "Athelstane", + "state": "WI", + "county": "Marinette" + }, + { + "zip_code": 54106, + "latitude": 44.470235, + "longitude": -88.454719, + "city": "Black Creek", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54107, + "latitude": 44.699153, + "longitude": -88.454312, + "city": "Bonduel", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54110, + "latitude": 44.163209, + "longitude": -88.133876, + "city": "Brillion", + "state": "WI", + "county": "Calumet" + }, + { + "zip_code": 54111, + "latitude": 44.810274, + "longitude": -88.391648, + "city": "Cecil", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54112, + "latitude": 45.306273, + "longitude": -88.002389, + "city": "Coleman", + "state": "WI", + "county": "Marinette" + }, + { + "zip_code": 54113, + "latitude": 44.348711, + "longitude": -88.361208, + "city": "Combined Locks", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54114, + "latitude": 45.261661, + "longitude": -88.078001, + "city": "Crivitz", + "state": "WI", + "county": "Marinette" + }, + { + "zip_code": 54115, + "latitude": 44.453629, + "longitude": -87.978279, + "city": "De Pere", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54119, + "latitude": 45.591557, + "longitude": -88.222435, + "city": "Dunbar", + "state": "WI", + "county": "Marinette" + }, + { + "zip_code": 54120, + "latitude": 45.74447, + "longitude": -88.47565, + "city": "Fence", + "state": "WI", + "county": "Florence" + }, + { + "zip_code": 54121, + "latitude": 45.845525, + "longitude": -88.284254, + "city": "Florence", + "state": "WI", + "county": "Florence" + }, + { + "zip_code": 54123, + "latitude": 44.211065, + "longitude": -88.151532, + "city": "Forest Junction", + "state": "WI", + "county": "Calumet" + }, + { + "zip_code": 54124, + "latitude": 44.916397, + "longitude": -88.174299, + "city": "Gillett", + "state": "WI", + "county": "Oconto" + }, + { + "zip_code": 54125, + "latitude": 45.648826, + "longitude": -88.333152, + "city": "Goodman", + "state": "WI", + "county": "Marinette" + }, + { + "zip_code": 54126, + "latitude": 44.347365, + "longitude": -88.037736, + "city": "Greenleaf", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54127, + "latitude": 44.804687, + "longitude": -88.269238, + "city": "Green Valley", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54128, + "latitude": 44.806061, + "longitude": -88.732786, + "city": "Gresham", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54129, + "latitude": 44.146516, + "longitude": -88.195124, + "city": "Hilbert", + "state": "WI", + "county": "Calumet" + }, + { + "zip_code": 54130, + "latitude": 44.334465, + "longitude": -88.295776, + "city": "Kaukauna", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54131, + "latitude": 44.416326, + "longitude": -88.464873, + "city": "Freedom", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54135, + "latitude": 44.88646, + "longitude": -88.575133, + "city": "Keshena", + "state": "WI", + "county": "Menominee" + }, + { + "zip_code": 54136, + "latitude": 44.303208, + "longitude": -88.473445, + "city": "Kimberly", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54137, + "latitude": 44.755693, + "longitude": -88.289822, + "city": "Krakow", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54138, + "latitude": 45.308254, + "longitude": -88.477771, + "city": "Lakewood", + "state": "WI", + "county": "Oconto" + }, + { + "zip_code": 54139, + "latitude": 45.063468, + "longitude": -88.214802, + "city": "Lena", + "state": "WI", + "county": "Oconto" + }, + { + "zip_code": 54140, + "latitude": 44.294746, + "longitude": -88.316305, + "city": "Little Chute", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54141, + "latitude": 44.744566, + "longitude": -87.995493, + "city": "Little Suamico", + "state": "WI", + "county": "Oconto" + }, + { + "zip_code": 54143, + "latitude": 45.086805, + "longitude": -87.716311, + "city": "Marinette", + "state": "WI", + "county": "Marinette" + }, + { + "zip_code": 54149, + "latitude": 45.095725, + "longitude": -88.47889, + "city": "Mountain", + "state": "WI", + "county": "Oconto" + }, + { + "zip_code": 54150, + "latitude": 44.86893, + "longitude": -88.618552, + "city": "Neopit", + "state": "WI", + "county": "Menominee" + }, + { + "zip_code": 54151, + "latitude": 45.579448, + "longitude": -87.918821, + "city": "Niagara", + "state": "WI", + "county": "Marinette" + }, + { + "zip_code": 54152, + "latitude": 44.566799, + "longitude": -88.458164, + "city": "Nichols", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54153, + "latitude": 44.897088, + "longitude": -88.082586, + "city": "Oconto", + "state": "WI", + "county": "Oconto" + }, + { + "zip_code": 54154, + "latitude": 44.901999, + "longitude": -88.125829, + "city": "Oconto Falls", + "state": "WI", + "county": "Oconto" + }, + { + "zip_code": 54155, + "latitude": 44.447167, + "longitude": -88.23333, + "city": "Oneida", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54156, + "latitude": 45.392437, + "longitude": -87.904337, + "city": "Pembine", + "state": "WI", + "county": "Marinette" + }, + { + "zip_code": 54157, + "latitude": 45.174269, + "longitude": -87.902, + "city": "Peshtigo", + "state": "WI", + "county": "Marinette" + }, + { + "zip_code": 54159, + "latitude": 45.205901, + "longitude": -87.8274, + "city": "Porterfield", + "state": "WI", + "county": "Marinette" + }, + { + "zip_code": 54160, + "latitude": 44.119917, + "longitude": -88.096495, + "city": "Potter", + "state": "WI", + "county": "Calumet" + }, + { + "zip_code": 54161, + "latitude": 45.117544, + "longitude": -87.977136, + "city": "Pound", + "state": "WI", + "county": "Marinette" + }, + { + "zip_code": 54162, + "latitude": 44.583761, + "longitude": -88.103417, + "city": "Pulaski", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54165, + "latitude": 44.430443, + "longitude": -88.463328, + "city": "Seymour", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54166, + "latitude": 44.745058, + "longitude": -88.664156, + "city": "Shawano", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54169, + "latitude": 44.167388, + "longitude": -88.229438, + "city": "Sherwood", + "state": "WI", + "county": "Calumet" + }, + { + "zip_code": 54170, + "latitude": 44.482935, + "longitude": -88.589547, + "city": "Shiocton", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54171, + "latitude": 44.726641, + "longitude": -88.121792, + "city": "Sobieski", + "state": "WI", + "county": "Oconto" + }, + { + "zip_code": 54173, + "latitude": 44.635701, + "longitude": -88.122034, + "city": "Suamico", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54174, + "latitude": 45.111843, + "longitude": -88.418694, + "city": "Suring", + "state": "WI", + "county": "Oconto" + }, + { + "zip_code": 54175, + "latitude": 45.309457, + "longitude": -88.605896, + "city": "Townsend", + "state": "WI", + "county": "Oconto" + }, + { + "zip_code": 54177, + "latitude": 45.383307, + "longitude": -87.876231, + "city": "Wausaukee", + "state": "WI", + "county": "Marinette" + }, + { + "zip_code": 54180, + "latitude": 44.494921, + "longitude": -88.124743, + "city": "Wrightstown", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54182, + "latitude": 44.731453, + "longitude": -88.369842, + "city": "Zachow", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54201, + "latitude": 44.596017, + "longitude": -87.540266, + "city": "Algoma", + "state": "WI", + "county": "Kewaunee" + }, + { + "zip_code": 54202, + "latitude": 45.077002, + "longitude": -87.14603, + "city": "Baileys Harbor", + "state": "WI", + "county": "Door" + }, + { + "zip_code": 54203, + "latitude": 44.109853, + "longitude": -87.483874, + "city": "Branch", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54204, + "latitude": 44.752379, + "longitude": -87.625888, + "city": "Brussels", + "state": "WI", + "county": "Door" + }, + { + "zip_code": 54205, + "latitude": 44.596082, + "longitude": -87.637308, + "city": "Casco", + "state": "WI", + "county": "Kewaunee" + }, + { + "zip_code": 54207, + "latitude": 44.091021, + "longitude": -87.990241, + "city": "Collins", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54208, + "latitude": 44.459153, + "longitude": -87.885734, + "city": "Denmark", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54209, + "latitude": 45.012261, + "longitude": -87.266031, + "city": "Egg Harbor", + "state": "WI", + "county": "Door" + }, + { + "zip_code": 54210, + "latitude": 45.253108, + "longitude": -87.044698, + "city": "Ellison Bay", + "state": "WI", + "county": "Door" + }, + { + "zip_code": 54211, + "latitude": 45.159184, + "longitude": -87.171024, + "city": "Ephraim", + "state": "WI", + "county": "Door" + }, + { + "zip_code": 54212, + "latitude": 45.11038, + "longitude": -87.209899, + "city": "Fish Creek", + "state": "WI", + "county": "Door" + }, + { + "zip_code": 54213, + "latitude": 44.722418, + "longitude": -87.528122, + "city": "Forestville", + "state": "WI", + "county": "Door" + }, + { + "zip_code": 54214, + "latitude": 44.204875, + "longitude": -87.715629, + "city": "Francis Creek", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54215, + "latitude": 44.222585, + "longitude": -87.801651, + "city": "Kellnersville", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54216, + "latitude": 44.438185, + "longitude": -87.592719, + "city": "Kewaunee", + "state": "WI", + "county": "Kewaunee" + }, + { + "zip_code": 54217, + "latitude": 44.541977, + "longitude": -87.670551, + "city": "Luxemburg", + "state": "WI", + "county": "Kewaunee" + }, + { + "zip_code": 54220, + "latitude": 44.109709, + "longitude": -87.714403, + "city": "Manitowoc", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54221, + "latitude": 44.132295, + "longitude": -87.599031, + "city": "Manitowoc", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54226, + "latitude": 45.059713, + "longitude": -87.006012, + "city": "Maplewood", + "state": "WI", + "county": "Door" + }, + { + "zip_code": 54227, + "latitude": 44.276554, + "longitude": -87.801651, + "city": "Maribel", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54228, + "latitude": 44.167783, + "longitude": -87.739206, + "city": "Mishicot", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54229, + "latitude": 44.571416, + "longitude": -87.833306, + "city": "New Franken", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54230, + "latitude": 44.142382, + "longitude": -87.904684, + "city": "Reedsville", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54232, + "latitude": 44.005714, + "longitude": -87.922351, + "city": "Saint Nazianz", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54234, + "latitude": 45.178293, + "longitude": -87.101748, + "city": "Sister Bay", + "state": "WI", + "county": "Door" + }, + { + "zip_code": 54235, + "latitude": 44.945314, + "longitude": -87.384142, + "city": "Sturgeon Bay", + "state": "WI", + "county": "Door" + }, + { + "zip_code": 54240, + "latitude": 44.282802, + "longitude": -87.632398, + "city": "Tisch Mills", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54241, + "latitude": 44.225538, + "longitude": -87.627759, + "city": "Two Rivers", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54245, + "latitude": 44.053321, + "longitude": -87.899912, + "city": "Valders", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54246, + "latitude": 45.373786, + "longitude": -86.897472, + "city": "Washington Island", + "state": "WI", + "county": "Door" + }, + { + "zip_code": 54247, + "latitude": 44.189293, + "longitude": -87.781594, + "city": "Whitelaw", + "state": "WI", + "county": "Manitowoc" + }, + { + "zip_code": 54301, + "latitude": 44.494385, + "longitude": -87.976051, + "city": "Green Bay", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54302, + "latitude": 44.495042, + "longitude": -87.978652, + "city": "Green Bay", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54303, + "latitude": 44.552247, + "longitude": -88.078803, + "city": "Green Bay", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54304, + "latitude": 44.497541, + "longitude": -88.032443, + "city": "Green Bay", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54305, + "latitude": 44.460064, + "longitude": -88.007382, + "city": "Green Bay", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54306, + "latitude": 44.460064, + "longitude": -88.007382, + "city": "Green Bay", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54307, + "latitude": 44.460064, + "longitude": -88.007382, + "city": "Green Bay", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54308, + "latitude": 44.459509, + "longitude": -87.805912, + "city": "Green Bay", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54311, + "latitude": 44.523605, + "longitude": -87.957687, + "city": "Green Bay", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54313, + "latitude": 44.54964, + "longitude": -87.99597, + "city": "Green Bay", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54324, + "latitude": 44.460064, + "longitude": -88.007382, + "city": "Green Bay", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54344, + "latitude": 44.42504, + "longitude": -88.111252, + "city": "Green Bay", + "state": "WI", + "county": "Brown" + }, + { + "zip_code": 54401, + "latitude": 44.961874, + "longitude": -89.794002, + "city": "Wausau", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54402, + "latitude": 44.900936, + "longitude": -89.7701, + "city": "Wausau", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54403, + "latitude": 44.952863, + "longitude": -89.531804, + "city": "Wausau", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54404, + "latitude": 44.466554, + "longitude": -90.02136, + "city": "Marshfield", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54405, + "latitude": 44.960186, + "longitude": -90.374893, + "city": "Abbotsford", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54406, + "latitude": 44.393087, + "longitude": -89.335313, + "city": "Amherst", + "state": "WI", + "county": "Portage" + }, + { + "zip_code": 54407, + "latitude": 44.530435, + "longitude": -89.356252, + "city": "Amherst Junction", + "state": "WI", + "county": "Portage" + }, + { + "zip_code": 54408, + "latitude": 45.008812, + "longitude": -89.357822, + "city": "Aniwa", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54409, + "latitude": 45.160809, + "longitude": -89.093942, + "city": "Antigo", + "state": "WI", + "county": "Langlade" + }, + { + "zip_code": 54410, + "latitude": 44.535658, + "longitude": -90.007245, + "city": "Arpin", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54411, + "latitude": 44.982348, + "longitude": -90.007765, + "city": "Athens", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54412, + "latitude": 44.559652, + "longitude": -90.00532, + "city": "Auburndale", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54413, + "latitude": 44.298272, + "longitude": -90.140404, + "city": "Babcock", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54414, + "latitude": 44.919163, + "longitude": -89.1042, + "city": "Birnamwood", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54415, + "latitude": 44.619128, + "longitude": -89.918563, + "city": "Blenker", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54416, + "latitude": 44.898739, + "longitude": -88.838922, + "city": "Bowler", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54417, + "latitude": 45.02735, + "longitude": -89.654118, + "city": "Brokaw", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54418, + "latitude": 45.160395, + "longitude": -88.994008, + "city": "Bryant", + "state": "WI", + "county": "Langlade" + }, + { + "zip_code": 54420, + "latitude": 44.606893, + "longitude": -90.375852, + "city": "Chili", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54421, + "latitude": 44.879977, + "longitude": -90.384734, + "city": "Colby", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54422, + "latitude": 44.944027, + "longitude": -90.52792, + "city": "Curtiss", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54423, + "latitude": 44.580724, + "longitude": -89.586502, + "city": "Custer", + "state": "WI", + "county": "Portage" + }, + { + "zip_code": 54424, + "latitude": 45.272303, + "longitude": -89.086848, + "city": "Deerbrook", + "state": "WI", + "county": "Langlade" + }, + { + "zip_code": 54425, + "latitude": 44.996496, + "longitude": -90.374411, + "city": "Dorchester", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54426, + "latitude": 44.904647, + "longitude": -90.012469, + "city": "Edgar", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54427, + "latitude": 44.808419, + "longitude": -89.301349, + "city": "Eland", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54428, + "latitude": 45.413361, + "longitude": -89.143347, + "city": "Elcho", + "state": "WI", + "county": "Langlade" + }, + { + "zip_code": 54429, + "latitude": 44.780171, + "longitude": -89.247809, + "city": "Elderon", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54430, + "latitude": 45.212455, + "longitude": -88.83459, + "city": "Elton", + "state": "WI", + "county": "Langlade" + }, + { + "zip_code": 54432, + "latitude": 44.900936, + "longitude": -89.7701, + "city": "Galloway", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54433, + "latitude": 45.197791, + "longitude": -90.632113, + "city": "Gilman", + "state": "WI", + "county": "Taylor" + }, + { + "zip_code": 54434, + "latitude": 45.206757, + "longitude": -90.484132, + "city": "Jump River", + "state": "WI", + "county": "Taylor" + }, + { + "zip_code": 54435, + "latitude": 45.38097, + "longitude": -89.607232, + "city": "Gleason", + "state": "WI", + "county": "Lincoln" + }, + { + "zip_code": 54436, + "latitude": 44.607247, + "longitude": -90.457313, + "city": "Granton", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54437, + "latitude": 44.660403, + "longitude": -90.6756, + "city": "Greenwood", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54439, + "latitude": 45.206757, + "longitude": -90.484132, + "city": "Hannibal", + "state": "WI", + "county": "Taylor" + }, + { + "zip_code": 54440, + "latitude": 44.797963, + "longitude": -89.513916, + "city": "Hatley", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54441, + "latitude": 44.645875, + "longitude": -90.105056, + "city": "Hewitt", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54442, + "latitude": 45.366386, + "longitude": -89.670022, + "city": "Irma", + "state": "WI", + "county": "Lincoln" + }, + { + "zip_code": 54443, + "latitude": 44.588962, + "longitude": -89.707997, + "city": "Junction City", + "state": "WI", + "county": "Portage" + }, + { + "zip_code": 54444, + "latitude": 45.249382, + "longitude": -89.032136, + "city": "Kempster", + "state": "WI", + "county": "Langlade" + }, + { + "zip_code": 54446, + "latitude": 44.729482, + "longitude": -90.634557, + "city": "Loyal", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54447, + "latitude": 45.16658, + "longitude": -90.769811, + "city": "Lublin", + "state": "WI", + "county": "Taylor" + }, + { + "zip_code": 54448, + "latitude": 44.875437, + "longitude": -89.80077, + "city": "Marathon", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54449, + "latitude": 44.589394, + "longitude": -90.190595, + "city": "Marshfield", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54450, + "latitude": 45.006232, + "longitude": -89.047379, + "city": "Mattoon", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54451, + "latitude": 45.164705, + "longitude": -90.445798, + "city": "Medford", + "state": "WI", + "county": "Taylor" + }, + { + "zip_code": 54452, + "latitude": 45.217518, + "longitude": -89.713291, + "city": "Merrill", + "state": "WI", + "county": "Lincoln" + }, + { + "zip_code": 54454, + "latitude": 44.598179, + "longitude": -89.904543, + "city": "Milladore", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54455, + "latitude": 44.809226, + "longitude": -89.701277, + "city": "Mosinee", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54456, + "latitude": 44.688149, + "longitude": -90.669407, + "city": "Neillsville", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54457, + "latitude": 44.299968, + "longitude": -89.920843, + "city": "Nekoosa", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54458, + "latitude": 44.490241, + "longitude": -89.310944, + "city": "Nelsonville", + "state": "WI", + "county": "Portage" + }, + { + "zip_code": 54459, + "latitude": 45.451541, + "longitude": -90.287732, + "city": "Ogema", + "state": "WI", + "county": "Price" + }, + { + "zip_code": 54460, + "latitude": 44.900923, + "longitude": -90.627475, + "city": "Owen", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54462, + "latitude": 45.386148, + "longitude": -88.971242, + "city": "Pearson", + "state": "WI", + "county": "Langlade" + }, + { + "zip_code": 54463, + "latitude": 45.525897, + "longitude": -89.236033, + "city": "Pelican Lake", + "state": "WI", + "county": "Oneida" + }, + { + "zip_code": 54464, + "latitude": 45.249382, + "longitude": -89.032136, + "city": "Phlox", + "state": "WI", + "county": "Langlade" + }, + { + "zip_code": 54465, + "latitude": 45.362544, + "longitude": -88.950339, + "city": "Pickerel", + "state": "WI", + "county": "Langlade" + }, + { + "zip_code": 54466, + "latitude": 44.408897, + "longitude": -90.190911, + "city": "Pittsville", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54467, + "latitude": 44.413942, + "longitude": -89.565507, + "city": "Plover", + "state": "WI", + "county": "Portage" + }, + { + "zip_code": 54469, + "latitude": 44.350934, + "longitude": -89.876274, + "city": "Port Edwards", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54470, + "latitude": 45.208013, + "longitude": -90.168991, + "city": "Rib Lake", + "state": "WI", + "county": "Taylor" + }, + { + "zip_code": 54471, + "latitude": 44.929692, + "longitude": -89.364964, + "city": "Ringle", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54472, + "latitude": 44.466554, + "longitude": -90.02136, + "city": "Marshfield", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54473, + "latitude": 44.605786, + "longitude": -89.356834, + "city": "Rosholt", + "state": "WI", + "county": "Portage" + }, + { + "zip_code": 54474, + "latitude": 44.898819, + "longitude": -89.712935, + "city": "Rothschild", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54475, + "latitude": 44.474097, + "longitude": -89.795501, + "city": "Rudolph", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54476, + "latitude": 44.866501, + "longitude": -89.576968, + "city": "Schofield", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54479, + "latitude": 44.805167, + "longitude": -90.141112, + "city": "Spencer", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54480, + "latitude": 45.19405, + "longitude": -90.302783, + "city": "Stetsonville", + "state": "WI", + "county": "Taylor" + }, + { + "zip_code": 54481, + "latitude": 44.551808, + "longitude": -89.531871, + "city": "Stevens Point", + "state": "WI", + "county": "Portage" + }, + { + "zip_code": 54484, + "latitude": 44.809072, + "longitude": -90.030674, + "city": "Stratford", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54485, + "latitude": 45.396466, + "longitude": -89.217933, + "city": "Summit Lake", + "state": "WI", + "county": "Langlade" + }, + { + "zip_code": 54486, + "latitude": 44.75984, + "longitude": -89.039052, + "city": "Tigerton", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54487, + "latitude": 45.337814, + "longitude": -89.765239, + "city": "Tomahawk", + "state": "WI", + "county": "Lincoln" + }, + { + "zip_code": 54488, + "latitude": 44.840956, + "longitude": -90.257456, + "city": "Unity", + "state": "WI", + "county": "Marathon" + }, + { + "zip_code": 54489, + "latitude": 44.462338, + "longitude": -90.003283, + "city": "Vesper", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54490, + "latitude": 45.330939, + "longitude": -90.401519, + "city": "Westboro", + "state": "WI", + "county": "Taylor" + }, + { + "zip_code": 54491, + "latitude": 45.248003, + "longitude": -88.803154, + "city": "White Lake", + "state": "WI", + "county": "Langlade" + }, + { + "zip_code": 54492, + "latitude": 44.509433, + "longitude": -89.528584, + "city": "Stevens Point", + "state": "WI", + "county": "Portage" + }, + { + "zip_code": 54493, + "latitude": 44.715341, + "longitude": -90.769733, + "city": "Willard", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54494, + "latitude": 44.379694, + "longitude": -89.918546, + "city": "Wisconsin Rapids", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54495, + "latitude": 44.388082, + "longitude": -89.922751, + "city": "Wisconsin Rapids", + "state": "WI", + "county": "Wood" + }, + { + "zip_code": 54498, + "latitude": 44.944248, + "longitude": -90.638388, + "city": "Withee", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54499, + "latitude": 44.801314, + "longitude": -89.11476, + "city": "Wittenberg", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54501, + "latitude": 45.704474, + "longitude": -89.386562, + "city": "Rhinelander", + "state": "WI", + "county": "Oneida" + }, + { + "zip_code": 54511, + "latitude": 45.711791, + "longitude": -88.810386, + "city": "Argonne", + "state": "WI", + "county": "Forest" + }, + { + "zip_code": 54512, + "latitude": 46.078442, + "longitude": -89.531393, + "city": "Boulder Junction", + "state": "WI", + "county": "Vilas" + }, + { + "zip_code": 54513, + "latitude": 45.584525, + "longitude": -90.166914, + "city": "Brantwood", + "state": "WI", + "county": "Price" + }, + { + "zip_code": 54514, + "latitude": 46.394779, + "longitude": -90.628174, + "city": "Butternut", + "state": "WI", + "county": "Ashland" + }, + { + "zip_code": 54515, + "latitude": 45.535762, + "longitude": -90.504465, + "city": "Catawba", + "state": "WI", + "county": "Price" + }, + { + "zip_code": 54517, + "latitude": 46.645163, + "longitude": -90.442721, + "city": "Clam Lake", + "state": "WI", + "county": "Ashland" + }, + { + "zip_code": 54519, + "latitude": 46.072385, + "longitude": -89.260939, + "city": "Conover", + "state": "WI", + "county": "Vilas" + }, + { + "zip_code": 54520, + "latitude": 45.511846, + "longitude": -88.891846, + "city": "Crandon", + "state": "WI", + "county": "Forest" + }, + { + "zip_code": 54521, + "latitude": 45.988126, + "longitude": -89.265609, + "city": "Eagle River", + "state": "WI", + "county": "Vilas" + }, + { + "zip_code": 54524, + "latitude": 45.814336, + "longitude": -90.453045, + "city": "Fifield", + "state": "WI", + "county": "Price" + }, + { + "zip_code": 54525, + "latitude": 46.395746, + "longitude": -90.191139, + "city": "Gile", + "state": "WI", + "county": "Iron" + }, + { + "zip_code": 54526, + "latitude": 45.486195, + "longitude": -90.847935, + "city": "Glen Flora", + "state": "WI", + "county": "Rusk" + }, + { + "zip_code": 54527, + "latitude": 46.126107, + "longitude": -90.611172, + "city": "Glidden", + "state": "WI", + "county": "Ashland" + }, + { + "zip_code": 54529, + "latitude": 45.690115, + "longitude": -89.663974, + "city": "Harshaw", + "state": "WI", + "county": "Oneida" + }, + { + "zip_code": 54530, + "latitude": 45.518558, + "longitude": -90.743138, + "city": "Hawkins", + "state": "WI", + "county": "Rusk" + }, + { + "zip_code": 54531, + "latitude": 45.74835, + "longitude": -89.821598, + "city": "Hazelhurst", + "state": "WI", + "county": "Oneida" + }, + { + "zip_code": 54532, + "latitude": 45.337678, + "longitude": -89.735524, + "city": "Heafford Junction", + "state": "WI", + "county": "Lincoln" + }, + { + "zip_code": 54534, + "latitude": 46.371032, + "longitude": -90.221645, + "city": "Hurley", + "state": "WI", + "county": "Iron" + }, + { + "zip_code": 54536, + "latitude": 46.318241, + "longitude": -90.342024, + "city": "Iron Belt", + "state": "WI", + "county": "Iron" + }, + { + "zip_code": 54537, + "latitude": 45.528816, + "longitude": -90.606178, + "city": "Kennan", + "state": "WI", + "county": "Price" + }, + { + "zip_code": 54538, + "latitude": 46.068073, + "longitude": -89.76566, + "city": "Lac Du Flambeau", + "state": "WI", + "county": "Vilas" + }, + { + "zip_code": 54539, + "latitude": 45.775685, + "longitude": -89.574808, + "city": "Lake Tomahawk", + "state": "WI", + "county": "Oneida" + }, + { + "zip_code": 54540, + "latitude": 46.073659, + "longitude": -89.444514, + "city": "Land O Lakes", + "state": "WI", + "county": "Vilas" + }, + { + "zip_code": 54541, + "latitude": 45.561723, + "longitude": -88.706496, + "city": "Laona", + "state": "WI", + "county": "Forest" + }, + { + "zip_code": 54542, + "latitude": 45.913837, + "longitude": -88.623498, + "city": "Long Lake", + "state": "WI", + "county": "Florence" + }, + { + "zip_code": 54543, + "latitude": 45.72293, + "longitude": -89.557263, + "city": "Mc Naughton", + "state": "WI", + "county": "Oneida" + }, + { + "zip_code": 54545, + "latitude": 46.155097, + "longitude": -89.845465, + "city": "Manitowish Waters", + "state": "WI", + "county": "Vilas" + }, + { + "zip_code": 54546, + "latitude": 46.320677, + "longitude": -90.746141, + "city": "Mellen", + "state": "WI", + "county": "Ashland" + }, + { + "zip_code": 54547, + "latitude": 46.143746, + "longitude": -90.110725, + "city": "Mercer", + "state": "WI", + "county": "Iron" + }, + { + "zip_code": 54548, + "latitude": 45.827583, + "longitude": -89.824294, + "city": "Minocqua", + "state": "WI", + "county": "Oneida" + }, + { + "zip_code": 54550, + "latitude": 46.396613, + "longitude": -90.309085, + "city": "Montreal", + "state": "WI", + "county": "Iron" + }, + { + "zip_code": 54552, + "latitude": 45.846473, + "longitude": -90.360373, + "city": "Park Falls", + "state": "WI", + "county": "Price" + }, + { + "zip_code": 54554, + "latitude": 46.092807, + "longitude": -89.257762, + "city": "Phelps", + "state": "WI", + "county": "Vilas" + }, + { + "zip_code": 54555, + "latitude": 45.724607, + "longitude": -90.370984, + "city": "Phillips", + "state": "WI", + "county": "Price" + }, + { + "zip_code": 54556, + "latitude": 45.532944, + "longitude": -90.28166, + "city": "Prentice", + "state": "WI", + "county": "Price" + }, + { + "zip_code": 54557, + "latitude": 46.200011, + "longitude": -89.738691, + "city": "Presque Isle", + "state": "WI", + "county": "Vilas" + }, + { + "zip_code": 54558, + "latitude": 45.942092, + "longitude": -89.686925, + "city": "Saint Germain", + "state": "WI", + "county": "Vilas" + }, + { + "zip_code": 54559, + "latitude": 46.502552, + "longitude": -90.402719, + "city": "Saxon", + "state": "WI", + "county": "Iron" + }, + { + "zip_code": 54560, + "latitude": 46.02023, + "longitude": -89.497889, + "city": "Sayner", + "state": "WI", + "county": "Vilas" + }, + { + "zip_code": 54561, + "latitude": 46.061297, + "longitude": -89.485834, + "city": "Star Lake", + "state": "WI", + "county": "Vilas" + }, + { + "zip_code": 54562, + "latitude": 45.762075, + "longitude": -89.157339, + "city": "Three Lakes", + "state": "WI", + "county": "Oneida" + }, + { + "zip_code": 54563, + "latitude": 45.45197, + "longitude": -90.964443, + "city": "Tony", + "state": "WI", + "county": "Rusk" + }, + { + "zip_code": 54564, + "latitude": 45.725515, + "longitude": -89.943993, + "city": "Tripoli", + "state": "WI", + "county": "Oneida" + }, + { + "zip_code": 54565, + "latitude": 46.370313, + "longitude": -90.434344, + "city": "Upson", + "state": "WI", + "county": "Iron" + }, + { + "zip_code": 54566, + "latitude": 45.443574, + "longitude": -88.619413, + "city": "Wabeno", + "state": "WI", + "county": "Forest" + }, + { + "zip_code": 54568, + "latitude": 45.859618, + "longitude": -89.653705, + "city": "Woodruff", + "state": "WI", + "county": "Oneida" + }, + { + "zip_code": 54601, + "latitude": 43.85456, + "longitude": -91.132072, + "city": "La Crosse", + "state": "WI", + "county": "La Crosse" + }, + { + "zip_code": 54602, + "latitude": 43.907739, + "longitude": -91.167621, + "city": "La Crosse", + "state": "WI", + "county": "La Crosse" + }, + { + "zip_code": 54603, + "latitude": 43.853763, + "longitude": -91.246238, + "city": "La Crosse", + "state": "WI", + "county": "La Crosse" + }, + { + "zip_code": 54610, + "latitude": 44.346721, + "longitude": -91.836481, + "city": "Alma", + "state": "WI", + "county": "Buffalo" + }, + { + "zip_code": 54611, + "latitude": 44.451027, + "longitude": -90.975918, + "city": "Alma Center", + "state": "WI", + "county": "Jackson" + }, + { + "zip_code": 54612, + "latitude": 44.251711, + "longitude": -91.387699, + "city": "Arcadia", + "state": "WI", + "county": "Trempealeau" + }, + { + "zip_code": 54613, + "latitude": 44.079992, + "longitude": -89.803877, + "city": "Arkdale", + "state": "WI", + "county": "Adams" + }, + { + "zip_code": 54614, + "latitude": 43.919308, + "longitude": -91.081457, + "city": "Bangor", + "state": "WI", + "county": "La Crosse" + }, + { + "zip_code": 54615, + "latitude": 44.295394, + "longitude": -90.83128, + "city": "Black River Falls", + "state": "WI", + "county": "Jackson" + }, + { + "zip_code": 54616, + "latitude": 44.251701, + "longitude": -91.264753, + "city": "Blair", + "state": "WI", + "county": "Trempealeau" + }, + { + "zip_code": 54618, + "latitude": 43.988481, + "longitude": -90.239261, + "city": "Camp Douglas", + "state": "WI", + "county": "Juneau" + }, + { + "zip_code": 54619, + "latitude": 43.851133, + "longitude": -90.699047, + "city": "Cashton", + "state": "WI", + "county": "Monroe" + }, + { + "zip_code": 54620, + "latitude": 44.087601, + "longitude": -90.842289, + "city": "Cataract", + "state": "WI", + "county": "Monroe" + }, + { + "zip_code": 54621, + "latitude": 43.667006, + "longitude": -90.741409, + "city": "Chaseburg", + "state": "WI", + "county": "Vernon" + }, + { + "zip_code": 54622, + "latitude": 44.237714, + "longitude": -91.741701, + "city": "Cochrane", + "state": "WI", + "county": "Buffalo" + }, + { + "zip_code": 54623, + "latitude": 43.574486, + "longitude": -91.043819, + "city": "Coon Valley", + "state": "WI", + "county": "Vernon" + }, + { + "zip_code": 54624, + "latitude": 43.480668, + "longitude": -91.133309, + "city": "De Soto", + "state": "WI", + "county": "Vernon" + }, + { + "zip_code": 54625, + "latitude": 44.14309, + "longitude": -91.520432, + "city": "Dodge", + "state": "WI", + "county": "Trempealeau" + }, + { + "zip_code": 54626, + "latitude": 43.220573, + "longitude": -91.034135, + "city": "Eastman", + "state": "WI", + "county": "Crawford" + }, + { + "zip_code": 54627, + "latitude": 44.184171, + "longitude": -91.257707, + "city": "Ettrick", + "state": "WI", + "county": "Trempealeau" + }, + { + "zip_code": 54628, + "latitude": 43.319219, + "longitude": -91.054678, + "city": "Ferryville", + "state": "WI", + "county": "Crawford" + }, + { + "zip_code": 54629, + "latitude": 44.170774, + "longitude": -91.674962, + "city": "Fountain City", + "state": "WI", + "county": "Buffalo" + }, + { + "zip_code": 54630, + "latitude": 44.094809, + "longitude": -91.339528, + "city": "Galesville", + "state": "WI", + "county": "Trempealeau" + }, + { + "zip_code": 54631, + "latitude": 43.269667, + "longitude": -90.83178, + "city": "Gays Mills", + "state": "WI", + "county": "Crawford" + }, + { + "zip_code": 54632, + "latitude": 43.618089, + "longitude": -90.837971, + "city": "Genoa", + "state": "WI", + "county": "Vernon" + }, + { + "zip_code": 54634, + "latitude": 43.616843, + "longitude": -90.659829, + "city": "Hillsboro", + "state": "WI", + "county": "Vernon" + }, + { + "zip_code": 54635, + "latitude": 44.40376, + "longitude": -91.044171, + "city": "Hixton", + "state": "WI", + "county": "Jackson" + }, + { + "zip_code": 54636, + "latitude": 43.968617, + "longitude": -91.223484, + "city": "Holmen", + "state": "WI", + "county": "La Crosse" + }, + { + "zip_code": 54637, + "latitude": 43.88013, + "longitude": -90.272928, + "city": "Hustler", + "state": "WI", + "county": "Juneau" + }, + { + "zip_code": 54638, + "latitude": 43.816431, + "longitude": -90.40265, + "city": "Kendall", + "state": "WI", + "county": "Monroe" + }, + { + "zip_code": 54639, + "latitude": 43.600044, + "longitude": -90.636482, + "city": "La Farge", + "state": "WI", + "county": "Vernon" + }, + { + "zip_code": 54640, + "latitude": 43.266172, + "longitude": -91.022031, + "city": "Lynxville", + "state": "WI", + "county": "Crawford" + }, + { + "zip_code": 54641, + "latitude": 43.94521, + "longitude": -90.049489, + "city": "Mather", + "state": "WI", + "county": "Juneau" + }, + { + "zip_code": 54642, + "latitude": 44.196358, + "longitude": -90.979249, + "city": "Melrose", + "state": "WI", + "county": "Jackson" + }, + { + "zip_code": 54643, + "latitude": 44.186869, + "longitude": -90.635831, + "city": "Millston", + "state": "WI", + "county": "Jackson" + }, + { + "zip_code": 54644, + "latitude": 44.021422, + "longitude": -91.03295, + "city": "Mindoro", + "state": "WI", + "county": "La Crosse" + }, + { + "zip_code": 54645, + "latitude": 43.206361, + "longitude": -90.940479, + "city": "Mount Sterling", + "state": "WI", + "county": "Crawford" + }, + { + "zip_code": 54646, + "latitude": 44.022637, + "longitude": -90.130552, + "city": "Necedah", + "state": "WI", + "county": "Juneau" + }, + { + "zip_code": 54648, + "latitude": 43.83159, + "longitude": -90.647476, + "city": "Norwalk", + "state": "WI", + "county": "Monroe" + }, + { + "zip_code": 54649, + "latitude": 43.971514, + "longitude": -90.361161, + "city": "Oakdale", + "state": "WI", + "county": "Monroe" + }, + { + "zip_code": 54650, + "latitude": 43.886664, + "longitude": -91.130399, + "city": "Onalaska", + "state": "WI", + "county": "La Crosse" + }, + { + "zip_code": 54651, + "latitude": 43.696538, + "longitude": -90.548053, + "city": "Ontario", + "state": "WI", + "county": "Vernon" + }, + { + "zip_code": 54652, + "latitude": 43.470286, + "longitude": -90.774539, + "city": "Readstown", + "state": "WI", + "county": "Vernon" + }, + { + "zip_code": 54653, + "latitude": 43.841142, + "longitude": -90.950732, + "city": "Rockland", + "state": "WI", + "county": "La Crosse" + }, + { + "zip_code": 54654, + "latitude": 43.206361, + "longitude": -90.940479, + "city": "Seneca", + "state": "WI", + "county": "Crawford" + }, + { + "zip_code": 54655, + "latitude": 43.369813, + "longitude": -90.808363, + "city": "Soldiers Grove", + "state": "WI", + "county": "Crawford" + }, + { + "zip_code": 54656, + "latitude": 43.949925, + "longitude": -90.752783, + "city": "Sparta", + "state": "WI", + "county": "Monroe" + }, + { + "zip_code": 54657, + "latitude": 43.274205, + "longitude": -90.924336, + "city": "Steuben", + "state": "WI", + "county": "Crawford" + }, + { + "zip_code": 54658, + "latitude": 43.669102, + "longitude": -91.134346, + "city": "Stoddard", + "state": "WI", + "county": "Vernon" + }, + { + "zip_code": 54659, + "latitude": 44.291449, + "longitude": -91.087671, + "city": "Taylor", + "state": "WI", + "county": "Jackson" + }, + { + "zip_code": 54660, + "latitude": 43.983826, + "longitude": -90.473336, + "city": "Tomah", + "state": "WI", + "county": "Monroe" + }, + { + "zip_code": 54661, + "latitude": 44.076755, + "longitude": -91.460168, + "city": "Trempealeau", + "state": "WI", + "county": "Trempealeau" + }, + { + "zip_code": 54662, + "latitude": 44.003084, + "longitude": -90.562005, + "city": "Tunnel City", + "state": "WI", + "county": "Monroe" + }, + { + "zip_code": 54664, + "latitude": 43.501783, + "longitude": -90.706816, + "city": "Viola", + "state": "WI", + "county": "Richland" + }, + { + "zip_code": 54665, + "latitude": 43.530515, + "longitude": -90.991573, + "city": "Viroqua", + "state": "WI", + "county": "Vernon" + }, + { + "zip_code": 54666, + "latitude": 43.987879, + "longitude": -90.466582, + "city": "Warrens", + "state": "WI", + "county": "Monroe" + }, + { + "zip_code": 54667, + "latitude": 43.653701, + "longitude": -90.841723, + "city": "Westby", + "state": "WI", + "county": "Vernon" + }, + { + "zip_code": 54669, + "latitude": 43.897572, + "longitude": -91.120198, + "city": "West Salem", + "state": "WI", + "county": "La Crosse" + }, + { + "zip_code": 54670, + "latitude": 43.848835, + "longitude": -90.468791, + "city": "Wilton", + "state": "WI", + "county": "Monroe" + }, + { + "zip_code": 54701, + "latitude": 44.75653, + "longitude": -91.473097, + "city": "Eau Claire", + "state": "WI", + "county": "Eau Claire" + }, + { + "zip_code": 54702, + "latitude": 44.726626, + "longitude": -91.285931, + "city": "Eau Claire", + "state": "WI", + "county": "Eau Claire" + }, + { + "zip_code": 54703, + "latitude": 44.80456, + "longitude": -91.477897, + "city": "Eau Claire", + "state": "WI", + "county": "Eau Claire" + }, + { + "zip_code": 54720, + "latitude": 44.803612, + "longitude": -91.442253, + "city": "Altoona", + "state": "WI", + "county": "Eau Claire" + }, + { + "zip_code": 54721, + "latitude": 44.602774, + "longitude": -92.062219, + "city": "Arkansaw", + "state": "WI", + "county": "Pepin" + }, + { + "zip_code": 54722, + "latitude": 44.726811, + "longitude": -91.212598, + "city": "Augusta", + "state": "WI", + "county": "Eau Claire" + }, + { + "zip_code": 54723, + "latitude": 44.631517, + "longitude": -92.435186, + "city": "Bay City", + "state": "WI", + "county": "Pierce" + }, + { + "zip_code": 54724, + "latitude": 45.042352, + "longitude": -91.408026, + "city": "Bloomer", + "state": "WI", + "county": "Chippewa" + }, + { + "zip_code": 54725, + "latitude": 45.075804, + "longitude": -92.013036, + "city": "Boyceville", + "state": "WI", + "county": "Dunn" + }, + { + "zip_code": 54726, + "latitude": 45.00521, + "longitude": -91.175615, + "city": "Boyd", + "state": "WI", + "county": "Chippewa" + }, + { + "zip_code": 54727, + "latitude": 45.015803, + "longitude": -91.353301, + "city": "Cadott", + "state": "WI", + "county": "Chippewa" + }, + { + "zip_code": 54728, + "latitude": 45.405423, + "longitude": -91.828102, + "city": "Chetek", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54729, + "latitude": 44.958689, + "longitude": -91.319492, + "city": "Chippewa Falls", + "state": "WI", + "county": "Chippewa" + }, + { + "zip_code": 54730, + "latitude": 45.037889, + "longitude": -91.888046, + "city": "Colfax", + "state": "WI", + "county": "Dunn" + }, + { + "zip_code": 54731, + "latitude": 45.357563, + "longitude": -91.088353, + "city": "Conrath", + "state": "WI", + "county": "Rusk" + }, + { + "zip_code": 54732, + "latitude": 45.125153, + "longitude": -91.170922, + "city": "Cornell", + "state": "WI", + "county": "Chippewa" + }, + { + "zip_code": 54733, + "latitude": 45.261871, + "longitude": -91.845156, + "city": "Dallas", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54734, + "latitude": 45.001949, + "longitude": -92.099665, + "city": "Downing", + "state": "WI", + "county": "Dunn" + }, + { + "zip_code": 54735, + "latitude": 44.946496, + "longitude": -91.90344, + "city": "Downsville", + "state": "WI", + "county": "Dunn" + }, + { + "zip_code": 54736, + "latitude": 44.640224, + "longitude": -91.831869, + "city": "Durand", + "state": "WI", + "county": "Pepin" + }, + { + "zip_code": 54737, + "latitude": 44.749316, + "longitude": -92.04191, + "city": "Eau Galle", + "state": "WI", + "county": "Dunn" + }, + { + "zip_code": 54738, + "latitude": 44.394025, + "longitude": -91.411701, + "city": "Eleva", + "state": "WI", + "county": "Trempealeau" + }, + { + "zip_code": 54739, + "latitude": 44.855107, + "longitude": -91.736968, + "city": "Elk Mound", + "state": "WI", + "county": "Dunn" + }, + { + "zip_code": 54740, + "latitude": 44.744453, + "longitude": -92.226414, + "city": "Elmwood", + "state": "WI", + "county": "Pierce" + }, + { + "zip_code": 54741, + "latitude": 44.659822, + "longitude": -91.014753, + "city": "Fairchild", + "state": "WI", + "county": "Eau Claire" + }, + { + "zip_code": 54742, + "latitude": 44.762892, + "longitude": -91.306304, + "city": "Fall Creek", + "state": "WI", + "county": "Eau Claire" + }, + { + "zip_code": 54743, + "latitude": 44.311074, + "longitude": -91.806396, + "city": "Gilmanton", + "state": "WI", + "county": "Buffalo" + }, + { + "zip_code": 54744, + "latitude": 45.319786, + "longitude": -91.881754, + "city": "Hillsdale", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54745, + "latitude": 45.150752, + "longitude": -91.121308, + "city": "Holcombe", + "state": "WI", + "county": "Chippewa" + }, + { + "zip_code": 54746, + "latitude": 44.516708, + "longitude": -90.709853, + "city": "Humbird", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54747, + "latitude": 44.356483, + "longitude": -91.443718, + "city": "Independence", + "state": "WI", + "county": "Trempealeau" + }, + { + "zip_code": 54748, + "latitude": 45.088875, + "longitude": -91.256794, + "city": "Jim Falls", + "state": "WI", + "county": "Chippewa" + }, + { + "zip_code": 54749, + "latitude": 44.947538, + "longitude": -92.07521, + "city": "Knapp", + "state": "WI", + "county": "Dunn" + }, + { + "zip_code": 54750, + "latitude": 44.623923, + "longitude": -92.29072, + "city": "Maiden Rock", + "state": "WI", + "county": "Pierce" + }, + { + "zip_code": 54751, + "latitude": 44.867809, + "longitude": -91.943198, + "city": "Menomonie", + "state": "WI", + "county": "Dunn" + }, + { + "zip_code": 54754, + "latitude": 44.436841, + "longitude": -90.796318, + "city": "Merrillan", + "state": "WI", + "county": "Jackson" + }, + { + "zip_code": 54755, + "latitude": 44.48773, + "longitude": -91.68068, + "city": "Mondovi", + "state": "WI", + "county": "Buffalo" + }, + { + "zip_code": 54756, + "latitude": 44.473584, + "longitude": -91.910518, + "city": "Nelson", + "state": "WI", + "county": "Buffalo" + }, + { + "zip_code": 54757, + "latitude": 45.118159, + "longitude": -91.486707, + "city": "New Auburn", + "state": "WI", + "county": "Chippewa" + }, + { + "zip_code": 54758, + "latitude": 44.333502, + "longitude": -91.347015, + "city": "Osseo", + "state": "WI", + "county": "Trempealeau" + }, + { + "zip_code": 54759, + "latitude": 44.509108, + "longitude": -92.131821, + "city": "Pepin", + "state": "WI", + "county": "Pepin" + }, + { + "zip_code": 54760, + "latitude": 44.424863, + "longitude": -91.207421, + "city": "Pigeon Falls", + "state": "WI", + "county": "Trempealeau" + }, + { + "zip_code": 54761, + "latitude": 44.619607, + "longitude": -92.180419, + "city": "Plum City", + "state": "WI", + "county": "Pierce" + }, + { + "zip_code": 54762, + "latitude": 45.262353, + "longitude": -91.992842, + "city": "Prairie Farm", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54763, + "latitude": 45.168279, + "longitude": -91.875797, + "city": "Ridgeland", + "state": "WI", + "county": "Dunn" + }, + { + "zip_code": 54764, + "latitude": 44.946496, + "longitude": -91.90344, + "city": "Rock Falls", + "state": "WI", + "county": "Dunn" + }, + { + "zip_code": 54765, + "latitude": 45.142866, + "longitude": -91.699794, + "city": "Sand Creek", + "state": "WI", + "county": "Dunn" + }, + { + "zip_code": 54766, + "latitude": 45.349548, + "longitude": -90.887173, + "city": "Sheldon", + "state": "WI", + "county": "Rusk" + }, + { + "zip_code": 54767, + "latitude": 44.781928, + "longitude": -92.283761, + "city": "Spring Valley", + "state": "WI", + "county": "Pierce" + }, + { + "zip_code": 54768, + "latitude": 44.993395, + "longitude": -91.069525, + "city": "Stanley", + "state": "WI", + "county": "Chippewa" + }, + { + "zip_code": 54769, + "latitude": 44.508365, + "longitude": -92.232594, + "city": "Stockholm", + "state": "WI", + "county": "Pepin" + }, + { + "zip_code": 54770, + "latitude": 44.387425, + "longitude": -91.394415, + "city": "Strum", + "state": "WI", + "county": "Trempealeau" + }, + { + "zip_code": 54771, + "latitude": 44.894112, + "longitude": -90.790684, + "city": "Thorp", + "state": "WI", + "county": "Clark" + }, + { + "zip_code": 54772, + "latitude": 45.094148, + "longitude": -91.879257, + "city": "Wheeler", + "state": "WI", + "county": "Dunn" + }, + { + "zip_code": 54773, + "latitude": 44.443778, + "longitude": -91.285758, + "city": "Whitehall", + "state": "WI", + "county": "Trempealeau" + }, + { + "zip_code": 54774, + "latitude": 45.07413, + "longitude": -91.294397, + "city": "Chippewa Falls", + "state": "WI", + "county": "Chippewa" + }, + { + "zip_code": 54801, + "latitude": 45.922016, + "longitude": -91.811707, + "city": "Spooner", + "state": "WI", + "county": "Washburn" + }, + { + "zip_code": 54805, + "latitude": 45.434373, + "longitude": -91.965942, + "city": "Almena", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54806, + "latitude": 46.558577, + "longitude": -90.738773, + "city": "Ashland", + "state": "WI", + "county": "Ashland" + }, + { + "zip_code": 54810, + "latitude": 45.421648, + "longitude": -92.378752, + "city": "Balsam Lake", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54812, + "latitude": 45.47734, + "longitude": -91.86779, + "city": "Barron", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54813, + "latitude": 45.557393, + "longitude": -92.016728, + "city": "Barronett", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54814, + "latitude": 46.853517, + "longitude": -90.915934, + "city": "Bayfield", + "state": "WI", + "county": "Bayfield" + }, + { + "zip_code": 54816, + "latitude": 46.682796, + "longitude": -91.143254, + "city": "Benoit", + "state": "WI", + "county": "Bayfield" + }, + { + "zip_code": 54817, + "latitude": 45.732675, + "longitude": -91.615044, + "city": "Birchwood", + "state": "WI", + "county": "Washburn" + }, + { + "zip_code": 54818, + "latitude": 45.423409, + "longitude": -91.848206, + "city": "Brill", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54819, + "latitude": 45.469246, + "longitude": -91.293073, + "city": "Bruce", + "state": "WI", + "county": "Rusk" + }, + { + "zip_code": 54820, + "latitude": 46.555409, + "longitude": -91.605419, + "city": "Brule", + "state": "WI", + "county": "Douglas" + }, + { + "zip_code": 54821, + "latitude": 46.21018, + "longitude": -91.189305, + "city": "Cable", + "state": "WI", + "county": "Bayfield" + }, + { + "zip_code": 54822, + "latitude": 45.465645, + "longitude": -91.68441, + "city": "Cameron", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54824, + "latitude": 45.420898, + "longitude": -92.544088, + "city": "Centuria", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54826, + "latitude": 45.495679, + "longitude": -92.037821, + "city": "Comstock", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54827, + "latitude": 46.834502, + "longitude": -91.092821, + "city": "Cornucopia", + "state": "WI", + "county": "Bayfield" + }, + { + "zip_code": 54828, + "latitude": 45.837967, + "longitude": -91.291784, + "city": "Couderay", + "state": "WI", + "county": "Sawyer" + }, + { + "zip_code": 54829, + "latitude": 45.42772, + "longitude": -91.899489, + "city": "Cumberland", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54830, + "latitude": 45.972603, + "longitude": -92.292996, + "city": "Danbury", + "state": "WI", + "county": "Burnett" + }, + { + "zip_code": 54832, + "latitude": 46.682796, + "longitude": -91.143254, + "city": "Drummond", + "state": "WI", + "county": "Bayfield" + }, + { + "zip_code": 54834, + "latitude": 45.742371, + "longitude": -91.476541, + "city": "Edgewater", + "state": "WI", + "county": "Sawyer" + }, + { + "zip_code": 54835, + "latitude": 45.780382, + "longitude": -91.224718, + "city": "Exeland", + "state": "WI", + "county": "Sawyer" + }, + { + "zip_code": 54836, + "latitude": 46.452892, + "longitude": -92.171445, + "city": "Foxboro", + "state": "WI", + "county": "Douglas" + }, + { + "zip_code": 54837, + "latitude": 45.526263, + "longitude": -92.429333, + "city": "Frederic", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54838, + "latitude": 46.293033, + "longitude": -91.894633, + "city": "Gordon", + "state": "WI", + "county": "Douglas" + }, + { + "zip_code": 54839, + "latitude": 46.682796, + "longitude": -91.143254, + "city": "Grand View", + "state": "WI", + "county": "Bayfield" + }, + { + "zip_code": 54840, + "latitude": 45.795342, + "longitude": -92.693513, + "city": "Grantsburg", + "state": "WI", + "county": "Burnett" + }, + { + "zip_code": 54841, + "latitude": 45.620445, + "longitude": -91.801751, + "city": "Haugen", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54842, + "latitude": 46.514162, + "longitude": -91.862136, + "city": "Hawthorne", + "state": "WI", + "county": "Douglas" + }, + { + "zip_code": 54843, + "latitude": 45.955223, + "longitude": -91.278308, + "city": "Hayward", + "state": "WI", + "county": "Sawyer" + }, + { + "zip_code": 54844, + "latitude": 46.682796, + "longitude": -91.143254, + "city": "Herbster", + "state": "WI", + "county": "Bayfield" + }, + { + "zip_code": 54845, + "latitude": 45.799612, + "longitude": -92.153743, + "city": "Hertel", + "state": "WI", + "county": "Burnett" + }, + { + "zip_code": 54846, + "latitude": 46.376072, + "longitude": -90.761153, + "city": "High Bridge", + "state": "WI", + "county": "Ashland" + }, + { + "zip_code": 54847, + "latitude": 46.599552, + "longitude": -91.437437, + "city": "Iron River", + "state": "WI", + "county": "Bayfield" + }, + { + "zip_code": 54848, + "latitude": 45.490835, + "longitude": -91.0943, + "city": "Ladysmith", + "state": "WI", + "county": "Rusk" + }, + { + "zip_code": 54849, + "latitude": 46.493011, + "longitude": -91.71342, + "city": "Lake Nebagamon", + "state": "WI", + "county": "Douglas" + }, + { + "zip_code": 54850, + "latitude": 46.803272, + "longitude": -90.692287, + "city": "La Pointe", + "state": "WI", + "county": "Ashland" + }, + { + "zip_code": 54851, + "latitude": 45.468941, + "longitude": -92.521938, + "city": "Lewis", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54853, + "latitude": 45.455357, + "longitude": -92.467658, + "city": "Luck", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54854, + "latitude": 46.652638, + "longitude": -91.733798, + "city": "Maple", + "state": "WI", + "county": "Douglas" + }, + { + "zip_code": 54855, + "latitude": 46.366834, + "longitude": -90.840821, + "city": "Marengo", + "state": "WI", + "county": "Ashland" + }, + { + "zip_code": 54856, + "latitude": 46.362341, + "longitude": -91.116899, + "city": "Mason", + "state": "WI", + "county": "Bayfield" + }, + { + "zip_code": 54857, + "latitude": 45.609562, + "longitude": -91.61965, + "city": "Mikana", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54858, + "latitude": 45.51583, + "longitude": -92.461712, + "city": "Milltown", + "state": "WI", + "county": "Polk" + }, + { + "zip_code": 54859, + "latitude": 46.09709, + "longitude": -91.859913, + "city": "Minong", + "state": "WI", + "county": "Washburn" + }, + { + "zip_code": 54861, + "latitude": 46.560783, + "longitude": -90.619716, + "city": "Odanah", + "state": "WI", + "county": "Ashland" + }, + { + "zip_code": 54862, + "latitude": 45.797008, + "longitude": -91.127234, + "city": "Ojibwa", + "state": "WI", + "county": "Sawyer" + }, + { + "zip_code": 54864, + "latitude": 46.594249, + "longitude": -91.815333, + "city": "Poplar", + "state": "WI", + "county": "Douglas" + }, + { + "zip_code": 54865, + "latitude": 46.715564, + "longitude": -91.353195, + "city": "Port Wing", + "state": "WI", + "county": "Bayfield" + }, + { + "zip_code": 54867, + "latitude": 45.800649, + "longitude": -91.268979, + "city": "Radisson", + "state": "WI", + "county": "Sawyer" + }, + { + "zip_code": 54868, + "latitude": 45.519692, + "longitude": -91.826575, + "city": "Rice Lake", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54870, + "latitude": 45.73714, + "longitude": -91.775875, + "city": "Sarona", + "state": "WI", + "county": "Washburn" + }, + { + "zip_code": 54871, + "latitude": 45.878356, + "longitude": -91.79215, + "city": "Shell Lake", + "state": "WI", + "county": "Washburn" + }, + { + "zip_code": 54872, + "latitude": 45.782741, + "longitude": -92.385751, + "city": "Siren", + "state": "WI", + "county": "Burnett" + }, + { + "zip_code": 54873, + "latitude": 46.417261, + "longitude": -91.810992, + "city": "Solon Springs", + "state": "WI", + "county": "Douglas" + }, + { + "zip_code": 54874, + "latitude": 46.568809, + "longitude": -91.935156, + "city": "South Range", + "state": "WI", + "county": "Douglas" + }, + { + "zip_code": 54875, + "latitude": 45.945201, + "longitude": -91.675448, + "city": "Springbrook", + "state": "WI", + "county": "Washburn" + }, + { + "zip_code": 54876, + "latitude": 45.821216, + "longitude": -91.462771, + "city": "Stone Lake", + "state": "WI", + "county": "Sawyer" + }, + { + "zip_code": 54880, + "latitude": 46.574982, + "longitude": -92.117578, + "city": "Superior", + "state": "WI", + "county": "Douglas" + }, + { + "zip_code": 54888, + "latitude": 45.966368, + "longitude": -91.886372, + "city": "Trego", + "state": "WI", + "county": "Washburn" + }, + { + "zip_code": 54889, + "latitude": 45.400115, + "longitude": -92.074695, + "city": "Turtle Lake", + "state": "WI", + "county": "Barron" + }, + { + "zip_code": 54890, + "latitude": 46.525129, + "longitude": -91.921631, + "city": "Wascott", + "state": "WI", + "county": "Douglas" + }, + { + "zip_code": 54891, + "latitude": 46.697289, + "longitude": -90.904151, + "city": "Washburn", + "state": "WI", + "county": "Bayfield" + }, + { + "zip_code": 54893, + "latitude": 45.869606, + "longitude": -92.30286, + "city": "Webster", + "state": "WI", + "county": "Burnett" + }, + { + "zip_code": 54895, + "latitude": 45.40913, + "longitude": -91.423051, + "city": "Weyerhaeuser", + "state": "WI", + "county": "Rusk" + }, + { + "zip_code": 54896, + "latitude": 45.832746, + "longitude": -91.014362, + "city": "Winter", + "state": "WI", + "county": "Sawyer" + }, + { + "zip_code": 54901, + "latitude": 44.005661, + "longitude": -88.55756, + "city": "Oshkosh", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54902, + "latitude": 43.99461, + "longitude": -88.526025, + "city": "Oshkosh", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54903, + "latitude": 44.06858, + "longitude": -88.644873, + "city": "Oshkosh", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54904, + "latitude": 44.062366, + "longitude": -88.623779, + "city": "Oshkosh", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54906, + "latitude": 44.06858, + "longitude": -88.644873, + "city": "Oshkosh", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54909, + "latitude": 44.379544, + "longitude": -89.356552, + "city": "Almond", + "state": "WI", + "county": "Portage" + }, + { + "zip_code": 54911, + "latitude": 44.275702, + "longitude": -88.370856, + "city": "Appleton", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54912, + "latitude": 44.416326, + "longitude": -88.464873, + "city": "Appleton", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54913, + "latitude": 44.345553, + "longitude": -88.434297, + "city": "Appleton", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54914, + "latitude": 44.271285, + "longitude": -88.486307, + "city": "Appleton", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54915, + "latitude": 44.373778, + "longitude": -88.444396, + "city": "Appleton", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54919, + "latitude": 44.416326, + "longitude": -88.464873, + "city": "Appleton", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54921, + "latitude": 44.341602, + "longitude": -89.526303, + "city": "Bancroft", + "state": "WI", + "county": "Portage" + }, + { + "zip_code": 54922, + "latitude": 44.432373, + "longitude": -88.559628, + "city": "Bear Creek", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54923, + "latitude": 43.915726, + "longitude": -89.027124, + "city": "Berlin", + "state": "WI", + "county": "Green Lake" + }, + { + "zip_code": 54926, + "latitude": 44.617819, + "longitude": -89.016622, + "city": "Big Falls", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54927, + "latitude": 44.103137, + "longitude": -88.653949, + "city": "Butte Des Morts", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54928, + "latitude": 44.735836, + "longitude": -88.876673, + "city": "Caroline", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54929, + "latitude": 44.593386, + "longitude": -88.868093, + "city": "Clintonville", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54930, + "latitude": 44.026085, + "longitude": -89.486854, + "city": "Coloma", + "state": "WI", + "county": "Waushara" + }, + { + "zip_code": 54931, + "latitude": 44.416326, + "longitude": -88.464873, + "city": "Dale", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54932, + "latitude": 43.832253, + "longitude": -88.582166, + "city": "Eldorado", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 54933, + "latitude": 44.668605, + "longitude": -88.704318, + "city": "Embarrass", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54934, + "latitude": 44.003153, + "longitude": -88.839692, + "city": "Eureka", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54935, + "latitude": 43.734724, + "longitude": -88.523176, + "city": "Fond Du Lac", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 54936, + "latitude": 43.740559, + "longitude": -88.522984, + "city": "Fond Du Lac", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 54937, + "latitude": 43.765009, + "longitude": -88.605657, + "city": "Fond Du Lac", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 54940, + "latitude": 44.272779, + "longitude": -88.833282, + "city": "Fremont", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54941, + "latitude": 43.85627, + "longitude": -88.985883, + "city": "Green Lake", + "state": "WI", + "county": "Green Lake" + }, + { + "zip_code": 54942, + "latitude": 44.286983, + "longitude": -88.556406, + "city": "Greenville", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54943, + "latitude": 44.103548, + "longitude": -89.491566, + "city": "Hancock", + "state": "WI", + "county": "Waushara" + }, + { + "zip_code": 54944, + "latitude": 44.342058, + "longitude": -88.588244, + "city": "Hortonville", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54945, + "latitude": 44.572209, + "longitude": -89.071142, + "city": "Iola", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54946, + "latitude": 44.336537, + "longitude": -89.146258, + "city": "King", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54947, + "latitude": 44.194993, + "longitude": -88.688629, + "city": "Larsen", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54948, + "latitude": 44.781006, + "longitude": -88.890714, + "city": "Leopolis", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54949, + "latitude": 44.488057, + "longitude": -88.926954, + "city": "Manawa", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54950, + "latitude": 44.546623, + "longitude": -88.937717, + "city": "Marion", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54951, + "latitude": 44.416326, + "longitude": -88.464873, + "city": "Medina", + "state": "WI", + "county": "Outagamie" + }, + { + "zip_code": 54952, + "latitude": 44.141025, + "longitude": -88.569088, + "city": "Menasha", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54956, + "latitude": 44.170785, + "longitude": -88.658087, + "city": "Neenah", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54957, + "latitude": 44.198944, + "longitude": -88.678863, + "city": "Neenah", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54960, + "latitude": 43.922097, + "longitude": -89.310982, + "city": "Neshkoro", + "state": "WI", + "county": "Marquette" + }, + { + "zip_code": 54961, + "latitude": 44.405595, + "longitude": -88.859107, + "city": "New London", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54962, + "latitude": 44.426783, + "longitude": -88.993214, + "city": "Ogdensburg", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54963, + "latitude": 44.050782, + "longitude": -88.754887, + "city": "Omro", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54964, + "latitude": 43.956653, + "longitude": -88.71918, + "city": "Pickett", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54965, + "latitude": 44.155967, + "longitude": -89.02096, + "city": "Pine River", + "state": "WI", + "county": "Waushara" + }, + { + "zip_code": 54966, + "latitude": 44.191887, + "longitude": -89.297481, + "city": "Plainfield", + "state": "WI", + "county": "Waushara" + }, + { + "zip_code": 54967, + "latitude": 44.134044, + "longitude": -88.986361, + "city": "Poy Sippi", + "state": "WI", + "county": "Waushara" + }, + { + "zip_code": 54968, + "latitude": 43.832741, + "longitude": -89.122651, + "city": "Princeton", + "state": "WI", + "county": "Green Lake" + }, + { + "zip_code": 54969, + "latitude": 44.269991, + "longitude": -88.775457, + "city": "Readfield", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54970, + "latitude": 44.080217, + "longitude": -89.217031, + "city": "Redgranite", + "state": "WI", + "county": "Waushara" + }, + { + "zip_code": 54971, + "latitude": 43.782526, + "longitude": -88.533445, + "city": "Ripon", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 54974, + "latitude": 43.775697, + "longitude": -88.659504, + "city": "Rosendale", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 54975, + "latitude": 44.461926, + "longitude": -88.915027, + "city": "Royalton", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54976, + "latitude": 44.209313, + "longitude": -89.096856, + "city": "Saxeville", + "state": "WI", + "county": "Waushara" + }, + { + "zip_code": 54977, + "latitude": 44.451051, + "longitude": -89.146915, + "city": "Scandinavia", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54978, + "latitude": 44.79604, + "longitude": -88.898362, + "city": "Tilleda", + "state": "WI", + "county": "Shawano" + }, + { + "zip_code": 54979, + "latitude": 43.839613, + "longitude": -88.543924, + "city": "Van Dyne", + "state": "WI", + "county": "Fond Du Lac" + }, + { + "zip_code": 54980, + "latitude": 43.988578, + "longitude": -88.771167, + "city": "Waukau", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54981, + "latitude": 44.429163, + "longitude": -89.04668, + "city": "Waupaca", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54982, + "latitude": 44.075321, + "longitude": -89.271177, + "city": "Wautoma", + "state": "WI", + "county": "Waushara" + }, + { + "zip_code": 54983, + "latitude": 44.332498, + "longitude": -88.922821, + "city": "Weyauwega", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 54984, + "latitude": 44.168882, + "longitude": -89.223228, + "city": "Wild Rose", + "state": "WI", + "county": "Waushara" + }, + { + "zip_code": 54985, + "latitude": 44.070584, + "longitude": -88.517762, + "city": "Winnebago", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54986, + "latitude": 44.124886, + "longitude": -88.745129, + "city": "Winneconne", + "state": "WI", + "county": "Winnebago" + }, + { + "zip_code": 54990, + "latitude": 44.461926, + "longitude": -88.915027, + "city": "Iola", + "state": "WI", + "county": "Waupaca" + }, + { + "zip_code": 55001, + "latitude": 44.90717, + "longitude": -92.816193, + "city": "Afton", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55002, + "latitude": 45.513447, + "longitude": -92.894239, + "city": "Almelund", + "state": "MN", + "county": "Chisago" + }, + { + "zip_code": 55003, + "latitude": 45.013918, + "longitude": -92.781055, + "city": "Bayport", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55005, + "latitude": 45.388716, + "longitude": -93.231538, + "city": "Bethel", + "state": "MN", + "county": "Anoka" + }, + { + "zip_code": 55006, + "latitude": 45.69146, + "longitude": -93.278348, + "city": "Braham", + "state": "MN", + "county": "Isanti" + }, + { + "zip_code": 55007, + "latitude": 45.947444, + "longitude": -93.073628, + "city": "Brook Park", + "state": "MN", + "county": "Pine" + }, + { + "zip_code": 55008, + "latitude": 45.602457, + "longitude": -93.263457, + "city": "Cambridge", + "state": "MN", + "county": "Isanti" + }, + { + "zip_code": 55009, + "latitude": 44.483189, + "longitude": -92.885609, + "city": "Cannon Falls", + "state": "MN", + "county": "Goodhue" + }, + { + "zip_code": 55010, + "latitude": 44.547215, + "longitude": -93.153115, + "city": "Castle Rock", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55011, + "latitude": 45.341448, + "longitude": -93.235026, + "city": "Cedar", + "state": "MN", + "county": "Anoka" + }, + { + "zip_code": 55012, + "latitude": 45.448211, + "longitude": -92.789369, + "city": "Center City", + "state": "MN", + "county": "Chisago" + }, + { + "zip_code": 55013, + "latitude": 45.362621, + "longitude": -92.902261, + "city": "Chisago City", + "state": "MN", + "county": "Chisago" + }, + { + "zip_code": 55014, + "latitude": 45.185565, + "longitude": -93.129272, + "city": "Circle Pines", + "state": "MN", + "county": "Anoka" + }, + { + "zip_code": 55016, + "latitude": 44.818216, + "longitude": -92.92861, + "city": "Cottage Grove", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55017, + "latitude": 45.660954, + "longitude": -93.430806, + "city": "Dalbo", + "state": "MN", + "county": "Isanti" + }, + { + "zip_code": 55018, + "latitude": 44.426537, + "longitude": -92.955359, + "city": "Dennison", + "state": "MN", + "county": "Goodhue" + }, + { + "zip_code": 55019, + "latitude": 44.398613, + "longitude": -93.194444, + "city": "Dundas", + "state": "MN", + "county": "Rice" + }, + { + "zip_code": 55020, + "latitude": 44.588963, + "longitude": -93.369473, + "city": "Elko", + "state": "MN", + "county": "Scott" + }, + { + "zip_code": 55021, + "latitude": 44.36287, + "longitude": -93.267456, + "city": "Faribault", + "state": "MN", + "county": "Rice" + }, + { + "zip_code": 55024, + "latitude": 44.640515, + "longitude": -93.14196, + "city": "Farmington", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55025, + "latitude": 45.246466, + "longitude": -92.949266, + "city": "Forest Lake", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55026, + "latitude": 44.520038, + "longitude": -92.358158, + "city": "Frontenac", + "state": "MN", + "county": "Goodhue" + }, + { + "zip_code": 55027, + "latitude": 44.427157, + "longitude": -92.620355, + "city": "Goodhue", + "state": "MN", + "county": "Goodhue" + }, + { + "zip_code": 55029, + "latitude": 45.642235, + "longitude": -93.201107, + "city": "Grandy", + "state": "MN", + "county": "Isanti" + }, + { + "zip_code": 55030, + "latitude": 45.856598, + "longitude": -93.081255, + "city": "Grasston", + "state": "MN", + "county": "Pine" + }, + { + "zip_code": 55031, + "latitude": 44.608467, + "longitude": -92.955479, + "city": "Hampton", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55032, + "latitude": 45.593629, + "longitude": -92.998865, + "city": "Harris", + "state": "MN", + "county": "Chisago" + }, + { + "zip_code": 55033, + "latitude": 44.737166, + "longitude": -93.032909, + "city": "Hastings", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55036, + "latitude": 45.854335, + "longitude": -93.124235, + "city": "Henriette", + "state": "MN", + "county": "Pine" + }, + { + "zip_code": 55037, + "latitude": 46.014689, + "longitude": -92.938103, + "city": "Hinckley", + "state": "MN", + "county": "Pine" + }, + { + "zip_code": 55038, + "latitude": 45.182366, + "longitude": -92.945218, + "city": "Hugo", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55040, + "latitude": 45.565289, + "longitude": -93.287101, + "city": "Isanti", + "state": "MN", + "county": "Isanti" + }, + { + "zip_code": 55041, + "latitude": 44.421753, + "longitude": -92.232221, + "city": "Lake City", + "state": "MN", + "county": "Wabasha" + }, + { + "zip_code": 55042, + "latitude": 44.992866, + "longitude": -92.898177, + "city": "Lake Elmo", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55043, + "latitude": 44.940859, + "longitude": -92.789447, + "city": "Lakeland", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55044, + "latitude": 44.633421, + "longitude": -93.25812, + "city": "Lakeville", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55045, + "latitude": 45.404477, + "longitude": -92.823088, + "city": "Lindstrom", + "state": "MN", + "county": "Chisago" + }, + { + "zip_code": 55046, + "latitude": 44.447704, + "longitude": -93.425156, + "city": "Lonsdale", + "state": "MN", + "county": "Rice" + }, + { + "zip_code": 55047, + "latitude": 45.198774, + "longitude": -92.825767, + "city": "Marine On Saint Croix", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55049, + "latitude": 44.160283, + "longitude": -93.246471, + "city": "Medford", + "state": "MN", + "county": "Steele" + }, + { + "zip_code": 55051, + "latitude": 45.918782, + "longitude": -93.297792, + "city": "Mora", + "state": "MN", + "county": "Kanabec" + }, + { + "zip_code": 55052, + "latitude": 44.328365, + "longitude": -93.342652, + "city": "Morristown", + "state": "MN", + "county": "Rice" + }, + { + "zip_code": 55053, + "latitude": 44.32738, + "longitude": -93.242155, + "city": "Nerstrand", + "state": "MN", + "county": "Rice" + }, + { + "zip_code": 55054, + "latitude": 44.571056, + "longitude": -93.354267, + "city": "New Market", + "state": "MN", + "county": "Scott" + }, + { + "zip_code": 55055, + "latitude": 44.872395, + "longitude": -92.993263, + "city": "Newport", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55056, + "latitude": 45.556522, + "longitude": -92.885433, + "city": "North Branch", + "state": "MN", + "county": "Chisago" + }, + { + "zip_code": 55057, + "latitude": 44.376816, + "longitude": -93.241838, + "city": "Northfield", + "state": "MN", + "county": "Rice" + }, + { + "zip_code": 55060, + "latitude": 44.047613, + "longitude": -93.223724, + "city": "Owatonna", + "state": "MN", + "county": "Steele" + }, + { + "zip_code": 55063, + "latitude": 45.949599, + "longitude": -92.892997, + "city": "Pine City", + "state": "MN", + "county": "Pine" + }, + { + "zip_code": 55065, + "latitude": 44.545066, + "longitude": -93.02496, + "city": "Randolph", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55066, + "latitude": 44.521909, + "longitude": -92.537774, + "city": "Red Wing", + "state": "MN", + "county": "Goodhue" + }, + { + "zip_code": 55067, + "latitude": 46.074687, + "longitude": -92.718004, + "city": "Rock Creek", + "state": "MN", + "county": "Pine" + }, + { + "zip_code": 55068, + "latitude": 44.661216, + "longitude": -93.076163, + "city": "Rosemount", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55069, + "latitude": 45.67987, + "longitude": -92.978158, + "city": "Rush City", + "state": "MN", + "county": "Chisago" + }, + { + "zip_code": 55070, + "latitude": 45.393554, + "longitude": -93.357614, + "city": "Saint Francis", + "state": "MN", + "county": "Anoka" + }, + { + "zip_code": 55071, + "latitude": 44.822826, + "longitude": -92.989204, + "city": "Saint Paul Park", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55072, + "latitude": 46.132453, + "longitude": -92.588959, + "city": "Sandstone", + "state": "MN", + "county": "Pine" + }, + { + "zip_code": 55073, + "latitude": 45.253166, + "longitude": -92.837344, + "city": "Scandia", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55074, + "latitude": 45.382835, + "longitude": -92.726135, + "city": "Shafer", + "state": "MN", + "county": "Chisago" + }, + { + "zip_code": 55075, + "latitude": 44.890315, + "longitude": -93.049879, + "city": "South Saint Paul", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55076, + "latitude": 44.828816, + "longitude": -93.039064, + "city": "Inver Grove Heights", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55077, + "latitude": 44.828265, + "longitude": -93.093969, + "city": "Inver Grove Heights", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55078, + "latitude": 45.513447, + "longitude": -92.894239, + "city": "Stacy", + "state": "MN", + "county": "Chisago" + }, + { + "zip_code": 55079, + "latitude": 45.405278, + "longitude": -92.969118, + "city": "Stacy", + "state": "MN", + "county": "Chisago" + }, + { + "zip_code": 55080, + "latitude": 45.651313, + "longitude": -93.275622, + "city": "Stanchfield", + "state": "MN", + "county": "Isanti" + }, + { + "zip_code": 55082, + "latitude": 45.061416, + "longitude": -92.84736, + "city": "Stillwater", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55083, + "latitude": 45.021016, + "longitude": -92.983726, + "city": "Stillwater", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55084, + "latitude": 45.457557, + "longitude": -92.733042, + "city": "Taylors Falls", + "state": "MN", + "county": "Chisago" + }, + { + "zip_code": 55085, + "latitude": 44.674799, + "longitude": -92.968309, + "city": "Vermillion", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55087, + "latitude": 44.239946, + "longitude": -93.397354, + "city": "Warsaw", + "state": "MN", + "county": "Rice" + }, + { + "zip_code": 55088, + "latitude": 44.500341, + "longitude": -93.382574, + "city": "Webster", + "state": "MN", + "county": "Rice" + }, + { + "zip_code": 55089, + "latitude": 44.575372, + "longitude": -92.704731, + "city": "Welch", + "state": "MN", + "county": "Goodhue" + }, + { + "zip_code": 55090, + "latitude": 45.053466, + "longitude": -92.957034, + "city": "Willernie", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55092, + "latitude": 45.336417, + "longitude": -92.967517, + "city": "Wyoming", + "state": "MN", + "county": "Chisago" + }, + { + "zip_code": 55101, + "latitude": 44.967965, + "longitude": -93.092168, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55102, + "latitude": 44.932929, + "longitude": -93.118968, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55103, + "latitude": 44.967215, + "longitude": -93.125319, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55104, + "latitude": 44.955615, + "longitude": -93.16702, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55105, + "latitude": 44.934515, + "longitude": -93.16097, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55106, + "latitude": 44.957065, + "longitude": -93.041616, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55107, + "latitude": 44.932465, + "longitude": -93.087967, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55108, + "latitude": 44.980614, + "longitude": -93.177122, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55109, + "latitude": 45.013234, + "longitude": -93.029667, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55110, + "latitude": 45.079965, + "longitude": -93.022317, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55111, + "latitude": 44.882838, + "longitude": -93.200671, + "city": "Saint Paul", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55112, + "latitude": 45.078815, + "longitude": -93.187223, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55113, + "latitude": 45.013895, + "longitude": -93.157071, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55114, + "latitude": 44.964115, + "longitude": -93.194872, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55115, + "latitude": 45.070951, + "longitude": -92.939113, + "city": "Saint Paul", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55116, + "latitude": 44.911215, + "longitude": -93.165356, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55117, + "latitude": 45.002115, + "longitude": -93.106269, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55118, + "latitude": 44.856615, + "longitude": -93.113028, + "city": "Saint Paul", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55119, + "latitude": 44.941415, + "longitude": -93.010714, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55120, + "latitude": 44.870365, + "longitude": -93.143369, + "city": "Saint Paul", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55121, + "latitude": 44.822093, + "longitude": -93.15908, + "city": "Saint Paul", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55122, + "latitude": 44.786018, + "longitude": -93.220205, + "city": "Saint Paul", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55123, + "latitude": 44.805989, + "longitude": -93.140878, + "city": "Saint Paul", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55124, + "latitude": 44.749701, + "longitude": -93.202881, + "city": "Saint Paul", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55125, + "latitude": 44.919716, + "longitude": -92.943876, + "city": "Saint Paul", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55126, + "latitude": 45.073561, + "longitude": -93.138022, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55127, + "latitude": 45.080265, + "longitude": -93.08752, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55128, + "latitude": 44.991316, + "longitude": -92.948738, + "city": "Saint Paul", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55129, + "latitude": 44.898516, + "longitude": -92.92301, + "city": "Saint Paul", + "state": "MN", + "county": "Washington" + }, + { + "zip_code": 55133, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55144, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55145, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55146, + "latitude": 44.942656, + "longitude": -93.082793, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55150, + "latitude": 44.886554, + "longitude": -93.161258, + "city": "Mendota", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55155, + "latitude": 44.952165, + "longitude": -93.095518, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55161, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55164, + "latitude": 44.990915, + "longitude": -93.106593, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55165, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55166, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55168, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55169, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55170, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55171, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55172, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55175, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55177, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55182, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55187, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55188, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55190, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55191, + "latitude": 45.005902, + "longitude": -93.105869, + "city": "Saint Paul", + "state": "MN", + "county": "Ramsey" + }, + { + "zip_code": 55301, + "latitude": 45.258673, + "longitude": -93.664342, + "city": "Albertville", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55302, + "latitude": 45.218652, + "longitude": -94.105948, + "city": "Annandale", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55303, + "latitude": 45.282482, + "longitude": -93.418574, + "city": "Anoka", + "state": "MN", + "county": "Anoka" + }, + { + "zip_code": 55304, + "latitude": 45.237661, + "longitude": -93.272428, + "city": "Andover", + "state": "MN", + "county": "Anoka" + }, + { + "zip_code": 55305, + "latitude": 44.952763, + "longitude": -93.43723, + "city": "Hopkins", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55306, + "latitude": 44.762208, + "longitude": -93.221535, + "city": "Burnsville", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55307, + "latitude": 44.597449, + "longitude": -94.105481, + "city": "Arlington", + "state": "MN", + "county": "Sibley" + }, + { + "zip_code": 55308, + "latitude": 45.451864, + "longitude": -93.842187, + "city": "Becker", + "state": "MN", + "county": "Sherburne" + }, + { + "zip_code": 55309, + "latitude": 45.367294, + "longitude": -93.686916, + "city": "Big Lake", + "state": "MN", + "county": "Sherburne" + }, + { + "zip_code": 55310, + "latitude": 44.753182, + "longitude": -94.848215, + "city": "Bird Island", + "state": "MN", + "county": "Renville" + }, + { + "zip_code": 55311, + "latitude": 45.124263, + "longitude": -93.499583, + "city": "Osseo", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55312, + "latitude": 44.758102, + "longitude": -94.251718, + "city": "Brownton", + "state": "MN", + "county": "Mcleod" + }, + { + "zip_code": 55313, + "latitude": 45.180732, + "longitude": -93.927556, + "city": "Buffalo", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55314, + "latitude": 44.71031, + "longitude": -94.752767, + "city": "Buffalo Lake", + "state": "MN", + "county": "Renville" + }, + { + "zip_code": 55315, + "latitude": 44.723162, + "longitude": -93.701637, + "city": "Carver", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55316, + "latitude": 45.176914, + "longitude": -93.397481, + "city": "Champlin", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55317, + "latitude": 44.853364, + "longitude": -93.572584, + "city": "Chanhassen", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55318, + "latitude": 44.810062, + "longitude": -93.653336, + "city": "Chaska", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55319, + "latitude": 45.466197, + "longitude": -93.952504, + "city": "Clear Lake", + "state": "MN", + "county": "Sherburne" + }, + { + "zip_code": 55320, + "latitude": 45.226627, + "longitude": -93.92441, + "city": "Clearwater", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55321, + "latitude": 45.086044, + "longitude": -94.185096, + "city": "Cokato", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55322, + "latitude": 44.768262, + "longitude": -93.787041, + "city": "Cologne", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55323, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Crystal Bay", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55324, + "latitude": 45.070558, + "longitude": -94.420292, + "city": "Darwin", + "state": "MN", + "county": "Meeker" + }, + { + "zip_code": 55325, + "latitude": 45.102011, + "longitude": -94.368691, + "city": "Dassel", + "state": "MN", + "county": "Meeker" + }, + { + "zip_code": 55327, + "latitude": 45.201514, + "longitude": -93.482833, + "city": "Dayton", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55328, + "latitude": 45.041472, + "longitude": -93.97792, + "city": "Delano", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55329, + "latitude": 45.282592, + "longitude": -94.524712, + "city": "Eden Valley", + "state": "MN", + "county": "Meeker" + }, + { + "zip_code": 55330, + "latitude": 45.403289, + "longitude": -93.644522, + "city": "Elk River", + "state": "MN", + "county": "Sherburne" + }, + { + "zip_code": 55331, + "latitude": 44.912712, + "longitude": -93.623186, + "city": "Excelsior", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55332, + "latitude": 44.595338, + "longitude": -94.726284, + "city": "Fairfax", + "state": "MN", + "county": "Renville" + }, + { + "zip_code": 55333, + "latitude": 44.564953, + "longitude": -94.891273, + "city": "Franklin", + "state": "MN", + "county": "Renville" + }, + { + "zip_code": 55334, + "latitude": 44.572583, + "longitude": -94.191699, + "city": "Gaylord", + "state": "MN", + "county": "Sibley" + }, + { + "zip_code": 55335, + "latitude": 44.55017, + "longitude": -94.543258, + "city": "Gibbon", + "state": "MN", + "county": "Sibley" + }, + { + "zip_code": 55336, + "latitude": 44.770238, + "longitude": -94.195685, + "city": "Glencoe", + "state": "MN", + "county": "Mcleod" + }, + { + "zip_code": 55337, + "latitude": 44.771547, + "longitude": -93.226258, + "city": "Burnsville", + "state": "MN", + "county": "Dakota" + }, + { + "zip_code": 55338, + "latitude": 44.63575, + "longitude": -94.057781, + "city": "Green Isle", + "state": "MN", + "county": "Sibley" + }, + { + "zip_code": 55339, + "latitude": 44.785812, + "longitude": -93.837873, + "city": "Hamburg", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55340, + "latitude": 45.073663, + "longitude": -93.568735, + "city": "Hamel", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55341, + "latitude": 45.160196, + "longitude": -93.673418, + "city": "Hanover", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55342, + "latitude": 44.70976, + "longitude": -94.756704, + "city": "Hector", + "state": "MN", + "county": "Renville" + }, + { + "zip_code": 55343, + "latitude": 44.913969, + "longitude": -93.44813, + "city": "Hopkins", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55344, + "latitude": 44.850563, + "longitude": -93.440429, + "city": "Eden Prairie", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55345, + "latitude": 44.916963, + "longitude": -93.481749, + "city": "Minnetonka", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55346, + "latitude": 44.875463, + "longitude": -93.47808, + "city": "Eden Prairie", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55347, + "latitude": 44.841713, + "longitude": -93.459829, + "city": "Eden Prairie", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55348, + "latitude": 44.848263, + "longitude": -93.398727, + "city": "Maple Plain", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55349, + "latitude": 45.101679, + "longitude": -94.047497, + "city": "Howard Lake", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55350, + "latitude": 44.875565, + "longitude": -94.266332, + "city": "Hutchinson", + "state": "MN", + "county": "Mcleod" + }, + { + "zip_code": 55352, + "latitude": 44.658362, + "longitude": -93.601183, + "city": "Jordan", + "state": "MN", + "county": "Scott" + }, + { + "zip_code": 55353, + "latitude": 45.36261, + "longitude": -94.309928, + "city": "Kimball", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 55354, + "latitude": 44.880454, + "longitude": -94.100616, + "city": "Lester Prairie", + "state": "MN", + "county": "Mcleod" + }, + { + "zip_code": 55355, + "latitude": 45.122737, + "longitude": -94.529861, + "city": "Litchfield", + "state": "MN", + "county": "Meeker" + }, + { + "zip_code": 55356, + "latitude": 44.995129, + "longitude": -93.593836, + "city": "Long Lake", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55357, + "latitude": 45.100098, + "longitude": -93.657256, + "city": "Loretto", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55358, + "latitude": 45.214072, + "longitude": -94.060149, + "city": "Maple Lake", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55359, + "latitude": 44.983312, + "longitude": -93.689162, + "city": "Maple Plain", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55360, + "latitude": 44.905962, + "longitude": -93.913561, + "city": "Mayer", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55361, + "latitude": 44.940212, + "longitude": -93.592735, + "city": "Minnetonka Beach", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55362, + "latitude": 45.249636, + "longitude": -93.851533, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55363, + "latitude": 45.048202, + "longitude": -94.056543, + "city": "Montrose", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55364, + "latitude": 44.935062, + "longitude": -93.662938, + "city": "Mound", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55365, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55366, + "latitude": 44.673454, + "longitude": -94.229311, + "city": "New Auburn", + "state": "MN", + "county": "Sibley" + }, + { + "zip_code": 55367, + "latitude": 44.899612, + "longitude": -93.970832, + "city": "New Germany", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55368, + "latitude": 44.738862, + "longitude": -93.89995, + "city": "Norwood", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55369, + "latitude": 45.128414, + "longitude": -93.458932, + "city": "Osseo", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55370, + "latitude": 44.839939, + "longitude": -94.050518, + "city": "Plato", + "state": "MN", + "county": "Mcleod" + }, + { + "zip_code": 55371, + "latitude": 45.740703, + "longitude": -93.63663, + "city": "Princeton", + "state": "MN", + "county": "Mille Lacs" + }, + { + "zip_code": 55372, + "latitude": 44.682763, + "longitude": -93.464428, + "city": "Prior Lake", + "state": "MN", + "county": "Scott" + }, + { + "zip_code": 55373, + "latitude": 45.155019, + "longitude": -93.865168, + "city": "Rockford", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55374, + "latitude": 45.168896, + "longitude": -93.574586, + "city": "Rogers", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55375, + "latitude": 44.904062, + "longitude": -93.74904, + "city": "Saint Bonifacius", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55376, + "latitude": 45.16826, + "longitude": -93.893628, + "city": "Saint Michael", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55377, + "latitude": 45.540181, + "longitude": -93.815434, + "city": "Santiago", + "state": "MN", + "county": "Sherburne" + }, + { + "zip_code": 55378, + "latitude": 44.751113, + "longitude": -93.367975, + "city": "Savage", + "state": "MN", + "county": "Scott" + }, + { + "zip_code": 55379, + "latitude": 44.731113, + "longitude": -93.474144, + "city": "Shakopee", + "state": "MN", + "county": "Scott" + }, + { + "zip_code": 55380, + "latitude": 45.315823, + "longitude": -93.979766, + "city": "Silver Creek", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55381, + "latitude": 44.921134, + "longitude": -94.195425, + "city": "Silver Lake", + "state": "MN", + "county": "Mcleod" + }, + { + "zip_code": 55382, + "latitude": 45.265248, + "longitude": -94.165984, + "city": "South Haven", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55383, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Norwood", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55384, + "latitude": 44.936862, + "longitude": -93.630286, + "city": "Spring Park", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55385, + "latitude": 44.766671, + "longitude": -94.344376, + "city": "Stewart", + "state": "MN", + "county": "Mcleod" + }, + { + "zip_code": 55386, + "latitude": 44.846645, + "longitude": -93.661737, + "city": "Victoria", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55387, + "latitude": 44.844847, + "longitude": -93.746148, + "city": "Waconia", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55388, + "latitude": 44.924416, + "longitude": -93.853894, + "city": "Watertown", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55389, + "latitude": 45.268619, + "longitude": -94.444561, + "city": "Watkins", + "state": "MN", + "county": "Meeker" + }, + { + "zip_code": 55390, + "latitude": 45.060676, + "longitude": -93.974555, + "city": "Waverly", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55391, + "latitude": 44.984663, + "longitude": -93.542233, + "city": "Wayzata", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55392, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Navarre", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55393, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Maple Plain", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55394, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55395, + "latitude": 44.946121, + "longitude": -94.07572, + "city": "Winsted", + "state": "MN", + "county": "Mcleod" + }, + { + "zip_code": 55396, + "latitude": 44.550833, + "longitude": -94.347525, + "city": "Winthrop", + "state": "MN", + "county": "Sibley" + }, + { + "zip_code": 55397, + "latitude": 44.800912, + "longitude": -93.919675, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55398, + "latitude": 45.467503, + "longitude": -93.602475, + "city": "Zimmerman", + "state": "MN", + "county": "Sherburne" + }, + { + "zip_code": 55399, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55401, + "latitude": 44.979265, + "longitude": -93.273024, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55402, + "latitude": 44.975915, + "longitude": -93.271825, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55403, + "latitude": 44.972615, + "longitude": -93.287275, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55404, + "latitude": 44.948614, + "longitude": -93.329926, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55405, + "latitude": 44.970114, + "longitude": -93.300275, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55406, + "latitude": 44.976015, + "longitude": -93.278975, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55407, + "latitude": 44.935465, + "longitude": -93.254023, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55408, + "latitude": 44.947515, + "longitude": -93.288975, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55409, + "latitude": 44.925014, + "longitude": -93.289224, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55410, + "latitude": 44.912364, + "longitude": -93.318825, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55411, + "latitude": 44.999514, + "longitude": -93.297393, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55412, + "latitude": 45.025115, + "longitude": -93.298876, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55413, + "latitude": 44.994365, + "longitude": -93.240774, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55414, + "latitude": 44.974515, + "longitude": -93.234173, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55415, + "latitude": 44.974215, + "longitude": -93.258474, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55416, + "latitude": 44.949714, + "longitude": -93.337326, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55417, + "latitude": 44.962965, + "longitude": -93.253624, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55418, + "latitude": 45.017765, + "longitude": -93.244524, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55419, + "latitude": 44.890914, + "longitude": -93.282724, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55420, + "latitude": 44.835164, + "longitude": -93.255222, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55421, + "latitude": 45.052315, + "longitude": -93.254075, + "city": "Minneapolis", + "state": "MN", + "county": "Anoka" + }, + { + "zip_code": 55422, + "latitude": 45.009601, + "longitude": -93.342428, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55423, + "latitude": 44.875614, + "longitude": -93.255272, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55424, + "latitude": 44.905164, + "longitude": -93.340326, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55425, + "latitude": 44.842664, + "longitude": -93.236286, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55426, + "latitude": 44.955014, + "longitude": -93.382928, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55427, + "latitude": 44.999964, + "longitude": -93.390979, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55428, + "latitude": 44.981413, + "longitude": -93.372979, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55429, + "latitude": 44.975664, + "longitude": -93.336926, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55430, + "latitude": 45.063923, + "longitude": -93.302227, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55431, + "latitude": 44.828764, + "longitude": -93.311823, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55432, + "latitude": 45.094965, + "longitude": -93.23957, + "city": "Minneapolis", + "state": "MN", + "county": "Anoka" + }, + { + "zip_code": 55433, + "latitude": 45.164263, + "longitude": -93.319278, + "city": "Minneapolis", + "state": "MN", + "county": "Anoka" + }, + { + "zip_code": 55434, + "latitude": 45.170399, + "longitude": -93.226925, + "city": "Minneapolis", + "state": "MN", + "county": "Anoka" + }, + { + "zip_code": 55435, + "latitude": 44.932864, + "longitude": -93.367327, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55436, + "latitude": 44.901163, + "longitude": -93.42267, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55437, + "latitude": 44.826064, + "longitude": -93.353791, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55438, + "latitude": 44.826613, + "longitude": -93.375027, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55439, + "latitude": 44.874414, + "longitude": -93.375277, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55440, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55441, + "latitude": 45.005804, + "longitude": -93.419323, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55442, + "latitude": 45.04674, + "longitude": -93.431047, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55443, + "latitude": 45.119364, + "longitude": -93.34312, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55444, + "latitude": 45.117765, + "longitude": -93.305378, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55445, + "latitude": 45.123064, + "longitude": -93.352439, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55446, + "latitude": 45.040013, + "longitude": -93.486482, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55447, + "latitude": 45.003335, + "longitude": -93.487482, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55448, + "latitude": 45.174056, + "longitude": -93.313274, + "city": "Minneapolis", + "state": "MN", + "county": "Anoka" + }, + { + "zip_code": 55449, + "latitude": 45.169739, + "longitude": -93.188924, + "city": "Minneapolis", + "state": "MN", + "county": "Anoka" + }, + { + "zip_code": 55450, + "latitude": 44.881113, + "longitude": -93.220658, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55454, + "latitude": 44.980859, + "longitude": -93.252524, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55455, + "latitude": 45.038364, + "longitude": -93.298376, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55458, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55459, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55460, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55468, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55470, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55472, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55473, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Minneapolis", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55474, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55478, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55479, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55480, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55483, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55484, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55485, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55486, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55487, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55488, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Minneapolis", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55550, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55551, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55552, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55553, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55554, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Norwood", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55555, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55556, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55557, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55558, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55559, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55560, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55561, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Monticello", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55562, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55563, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Monticello", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55564, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55565, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55566, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55567, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55568, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55569, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Osseo", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55570, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Maple Plain", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55571, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Maple Plain", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55572, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Maple Plain", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55573, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Young America", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55574, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Maple Plain", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55575, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Howard Lake", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55576, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Maple Plain", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55577, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Maple Plain", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55578, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Maple Plain", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55579, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Maple Plain", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55580, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55581, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55582, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55583, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Norwood", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55584, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55585, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55586, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55587, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55588, + "latitude": 44.989512, + "longitude": -93.880245, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55589, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55590, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55591, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Monticello", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55592, + "latitude": 45.200875, + "longitude": -93.888099, + "city": "Maple Plain", + "state": "MN", + "county": "Wright" + }, + { + "zip_code": 55593, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Maple Plain", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55594, + "latitude": 44.805487, + "longitude": -93.766524, + "city": "Young America", + "state": "MN", + "county": "Carver" + }, + { + "zip_code": 55595, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Loretto", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55596, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Loretto", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55597, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Loretto", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55598, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Loretto", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55599, + "latitude": 45.015914, + "longitude": -93.47188, + "city": "Loretto", + "state": "MN", + "county": "Hennepin" + }, + { + "zip_code": 55601, + "latitude": 47.256021, + "longitude": -91.356586, + "city": "Beaver Bay", + "state": "MN", + "county": "Lake" + }, + { + "zip_code": 55602, + "latitude": 47.256933, + "longitude": -92.00427, + "city": "Brimson", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55603, + "latitude": 47.497114, + "longitude": -91.320571, + "city": "Finland", + "state": "MN", + "county": "Lake" + }, + { + "zip_code": 55604, + "latitude": 47.872285, + "longitude": -90.42294, + "city": "Grand Marais", + "state": "MN", + "county": "Cook" + }, + { + "zip_code": 55605, + "latitude": 47.923022, + "longitude": -89.851983, + "city": "Grand Portage", + "state": "MN", + "county": "Cook" + }, + { + "zip_code": 55606, + "latitude": 47.851669, + "longitude": -90.001214, + "city": "Hovland", + "state": "MN", + "county": "Cook" + }, + { + "zip_code": 55607, + "latitude": 47.660406, + "longitude": -91.498861, + "city": "Isabella", + "state": "MN", + "county": "Lake" + }, + { + "zip_code": 55609, + "latitude": 46.95388, + "longitude": -91.777997, + "city": "Knife River", + "state": "MN", + "county": "Lake" + }, + { + "zip_code": 55612, + "latitude": 47.7059, + "longitude": -90.682372, + "city": "Lutsen", + "state": "MN", + "county": "Cook" + }, + { + "zip_code": 55613, + "latitude": 47.518552, + "longitude": -90.949997, + "city": "Schroeder", + "state": "MN", + "county": "Cook" + }, + { + "zip_code": 55614, + "latitude": 47.358488, + "longitude": -91.220483, + "city": "Silver Bay", + "state": "MN", + "county": "Lake" + }, + { + "zip_code": 55615, + "latitude": 47.648636, + "longitude": -90.801861, + "city": "Tofte", + "state": "MN", + "county": "Cook" + }, + { + "zip_code": 55616, + "latitude": 47.134891, + "longitude": -91.545363, + "city": "Two Harbors", + "state": "MN", + "county": "Lake" + }, + { + "zip_code": 55701, + "latitude": 47.640367, + "longitude": -92.442797, + "city": "Adolph", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55702, + "latitude": 47.014861, + "longitude": -92.612312, + "city": "Alborn", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55703, + "latitude": 47.753747, + "longitude": -92.756769, + "city": "Angora", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55704, + "latitude": 46.215511, + "longitude": -92.759076, + "city": "Askov", + "state": "MN", + "county": "Pine" + }, + { + "zip_code": 55705, + "latitude": 47.634557, + "longitude": -92.071317, + "city": "Aurora", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55706, + "latitude": 47.742305, + "longitude": -91.953532, + "city": "Babbitt", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55707, + "latitude": 46.556833, + "longitude": -92.720097, + "city": "Barnum", + "state": "MN", + "county": "Carlton" + }, + { + "zip_code": 55708, + "latitude": 47.532826, + "longitude": -92.340774, + "city": "Biwabik", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55709, + "latitude": 47.347269, + "longitude": -93.388826, + "city": "Bovey", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55710, + "latitude": 47.645047, + "longitude": -92.651923, + "city": "Britt", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55711, + "latitude": 46.837747, + "longitude": -92.680451, + "city": "Brookston", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55712, + "latitude": 46.2263, + "longitude": -92.705581, + "city": "Bruno", + "state": "MN", + "county": "Pine" + }, + { + "zip_code": 55713, + "latitude": 47.493197, + "longitude": -92.764262, + "city": "Buhl", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55716, + "latitude": 47.322883, + "longitude": -93.276267, + "city": "Calumet", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55717, + "latitude": 47.0686, + "longitude": -92.442794, + "city": "Canyon", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55718, + "latitude": 46.622795, + "longitude": -92.675569, + "city": "Carlton", + "state": "MN", + "county": "Carlton" + }, + { + "zip_code": 55719, + "latitude": 47.563308, + "longitude": -92.443251, + "city": "Chisholm", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55720, + "latitude": 46.592512, + "longitude": -92.549564, + "city": "Cloquet", + "state": "MN", + "county": "Carlton" + }, + { + "zip_code": 55721, + "latitude": 47.238241, + "longitude": -93.516501, + "city": "Cohasset", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55722, + "latitude": 47.377503, + "longitude": -93.385597, + "city": "Coleraine", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55723, + "latitude": 47.877563, + "longitude": -92.768568, + "city": "Cook", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55724, + "latitude": 47.152067, + "longitude": -92.435223, + "city": "Cotton", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55725, + "latitude": 48.241245, + "longitude": -92.525385, + "city": "Crane Lake", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55726, + "latitude": 46.654061, + "longitude": -92.836499, + "city": "Cromwell", + "state": "MN", + "county": "Carlton" + }, + { + "zip_code": 55730, + "latitude": 47.087782, + "longitude": -93.921429, + "city": "Grand Rapids", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55731, + "latitude": 47.918943, + "longitude": -92.020778, + "city": "Ely", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55732, + "latitude": 47.662641, + "longitude": -92.228145, + "city": "Embarrass", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55733, + "latitude": 46.712582, + "longitude": -92.364896, + "city": "Esko", + "state": "MN", + "county": "Carlton" + }, + { + "zip_code": 55734, + "latitude": 47.386893, + "longitude": -92.452058, + "city": "Eveleth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55735, + "latitude": 46.23792, + "longitude": -92.950358, + "city": "Finlayson", + "state": "MN", + "county": "Pine" + }, + { + "zip_code": 55736, + "latitude": 46.937895, + "longitude": -92.837735, + "city": "Floodwood", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55738, + "latitude": 47.273191, + "longitude": -92.675563, + "city": "Forbes", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55741, + "latitude": 47.447686, + "longitude": -92.366335, + "city": "Gilbert", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55742, + "latitude": 47.167838, + "longitude": -93.132367, + "city": "Goodland", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55744, + "latitude": 47.232889, + "longitude": -93.393555, + "city": "Grand Rapids", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55745, + "latitude": 47.087782, + "longitude": -93.921429, + "city": "Grand Rapids", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55746, + "latitude": 47.413263, + "longitude": -92.87621, + "city": "Hibbing", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55747, + "latitude": 47.640367, + "longitude": -92.442797, + "city": "Hibbing", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55748, + "latitude": 46.671645, + "longitude": -93.432392, + "city": "Hill City", + "state": "MN", + "county": "Aitkin" + }, + { + "zip_code": 55749, + "latitude": 46.482697, + "longitude": -92.410931, + "city": "Holyoke", + "state": "MN", + "county": "Carlton" + }, + { + "zip_code": 55750, + "latitude": 47.507262, + "longitude": -92.112844, + "city": "Hoyt Lakes", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55751, + "latitude": 47.420472, + "longitude": -92.681078, + "city": "Iron", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55752, + "latitude": 46.592204, + "longitude": -93.433078, + "city": "Jacobson", + "state": "MN", + "county": "Aitkin" + }, + { + "zip_code": 55753, + "latitude": 47.398025, + "longitude": -93.078443, + "city": "Keewatin", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55756, + "latitude": 46.331356, + "longitude": -92.662237, + "city": "Kerrick", + "state": "MN", + "county": "Pine" + }, + { + "zip_code": 55757, + "latitude": 46.52049, + "longitude": -92.908622, + "city": "Kettle River", + "state": "MN", + "county": "Carlton" + }, + { + "zip_code": 55758, + "latitude": 47.512132, + "longitude": -92.740216, + "city": "Kinney", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55760, + "latitude": 46.607188, + "longitude": -93.30756, + "city": "Mcgregor", + "state": "MN", + "county": "Aitkin" + }, + { + "zip_code": 55763, + "latitude": 47.264753, + "longitude": -92.181209, + "city": "Makinen", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55764, + "latitude": 47.321916, + "longitude": -93.29388, + "city": "Marble", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55765, + "latitude": 47.116076, + "longitude": -92.803506, + "city": "Meadowlands", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55766, + "latitude": 47.249626, + "longitude": -92.412343, + "city": "Melrude", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55767, + "latitude": 46.552827, + "longitude": -92.756405, + "city": "Moose Lake", + "state": "MN", + "county": "Carlton" + }, + { + "zip_code": 55768, + "latitude": 47.454993, + "longitude": -92.686192, + "city": "Mountain Iron", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55769, + "latitude": 47.441216, + "longitude": -93.243688, + "city": "Nashwauk", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55771, + "latitude": 47.742195, + "longitude": -92.757902, + "city": "Orr", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55772, + "latitude": 48.081686, + "longitude": -93.083438, + "city": "Nett Lake", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55775, + "latitude": 47.287391, + "longitude": -93.212906, + "city": "Pengilly", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55777, + "latitude": 47.640367, + "longitude": -92.442797, + "city": "Virginia", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55779, + "latitude": 46.910179, + "longitude": -92.448123, + "city": "Saginaw", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55780, + "latitude": 46.701794, + "longitude": -92.639079, + "city": "Sawyer", + "state": "MN", + "county": "Carlton" + }, + { + "zip_code": 55781, + "latitude": 47.551459, + "longitude": -92.994885, + "city": "Side Lake", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55782, + "latitude": 47.821007, + "longitude": -92.246359, + "city": "Soudan", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55783, + "latitude": 46.367039, + "longitude": -92.824278, + "city": "Sturgeon Lake", + "state": "MN", + "county": "Pine" + }, + { + "zip_code": 55784, + "latitude": 47.06717, + "longitude": -93.190708, + "city": "Swan River", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55785, + "latitude": 46.696774, + "longitude": -93.645502, + "city": "Swatara", + "state": "MN", + "county": "Aitkin" + }, + { + "zip_code": 55786, + "latitude": 47.316395, + "longitude": -93.342118, + "city": "Taconite", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55787, + "latitude": 46.630318, + "longitude": -93.213416, + "city": "Tamarack", + "state": "MN", + "county": "Aitkin" + }, + { + "zip_code": 55790, + "latitude": 47.787247, + "longitude": -92.338233, + "city": "Tower", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55791, + "latitude": 47.640367, + "longitude": -92.442797, + "city": "Twig", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55792, + "latitude": 47.646075, + "longitude": -92.499975, + "city": "Virginia", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55793, + "latitude": 47.241169, + "longitude": -93.228104, + "city": "Warba", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 55795, + "latitude": 46.310484, + "longitude": -92.863863, + "city": "Willow River", + "state": "MN", + "county": "Pine" + }, + { + "zip_code": 55796, + "latitude": 47.720643, + "longitude": -92.266525, + "city": "Winton", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55797, + "latitude": 46.565172, + "longitude": -92.657895, + "city": "Wrenshall", + "state": "MN", + "county": "Carlton" + }, + { + "zip_code": 55798, + "latitude": 46.614151, + "longitude": -92.735406, + "city": "Wright", + "state": "MN", + "county": "Carlton" + }, + { + "zip_code": 55801, + "latitude": 47.005566, + "longitude": -92.001934, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55802, + "latitude": 46.904912, + "longitude": -92.039109, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55803, + "latitude": 47.217311, + "longitude": -92.1184, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55804, + "latitude": 46.886239, + "longitude": -92.005488, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55805, + "latitude": 46.800389, + "longitude": -92.094589, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55806, + "latitude": 46.774939, + "longitude": -92.133189, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55807, + "latitude": 46.735978, + "longitude": -92.17764, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55808, + "latitude": 46.683891, + "longitude": -92.242241, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55810, + "latitude": 46.76062, + "longitude": -92.266038, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55811, + "latitude": 46.814712, + "longitude": -92.199825, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55812, + "latitude": 46.810788, + "longitude": -92.072288, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55814, + "latitude": 47.640367, + "longitude": -92.442797, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55815, + "latitude": 47.640367, + "longitude": -92.442797, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55816, + "latitude": 47.640367, + "longitude": -92.442797, + "city": "Duluth", + "state": "MN", + "county": "Saint Louis" + }, + { + "zip_code": 55901, + "latitude": 44.075285, + "longitude": -92.516916, + "city": "Rochester", + "state": "MN", + "county": "Olmsted" + }, + { + "zip_code": 55902, + "latitude": 43.972494, + "longitude": -92.389901, + "city": "Rochester", + "state": "MN", + "county": "Olmsted" + }, + { + "zip_code": 55903, + "latitude": 43.996613, + "longitude": -92.540929, + "city": "Rochester", + "state": "MN", + "county": "Olmsted" + }, + { + "zip_code": 55904, + "latitude": 43.98622, + "longitude": -92.302649, + "city": "Rochester", + "state": "MN", + "county": "Olmsted" + }, + { + "zip_code": 55905, + "latitude": 44.022513, + "longitude": -92.466826, + "city": "Rochester", + "state": "MN", + "county": "Olmsted" + }, + { + "zip_code": 55906, + "latitude": 44.107815, + "longitude": -92.405294, + "city": "Rochester", + "state": "MN", + "county": "Olmsted" + }, + { + "zip_code": 55909, + "latitude": 43.565168, + "longitude": -92.74389, + "city": "Adams", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55910, + "latitude": 44.085616, + "longitude": -91.946134, + "city": "Altura", + "state": "MN", + "county": "Winona" + }, + { + "zip_code": 55912, + "latitude": 43.699305, + "longitude": -92.976818, + "city": "Austin", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55917, + "latitude": 44.011627, + "longitude": -93.144007, + "city": "Blooming Prairie", + "state": "MN", + "county": "Steele" + }, + { + "zip_code": 55918, + "latitude": 43.746834, + "longitude": -92.866996, + "city": "Brownsdale", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55919, + "latitude": 43.648232, + "longitude": -91.410977, + "city": "Brownsville", + "state": "MN", + "county": "Houston" + }, + { + "zip_code": 55920, + "latitude": 43.988227, + "longitude": -92.599372, + "city": "Byron", + "state": "MN", + "county": "Olmsted" + }, + { + "zip_code": 55921, + "latitude": 43.635474, + "longitude": -91.458938, + "city": "Caledonia", + "state": "MN", + "county": "Houston" + }, + { + "zip_code": 55922, + "latitude": 43.527479, + "longitude": -91.85297, + "city": "Canton", + "state": "MN", + "county": "Fillmore" + }, + { + "zip_code": 55923, + "latitude": 43.758684, + "longitude": -92.139962, + "city": "Chatfield", + "state": "MN", + "county": "Fillmore" + }, + { + "zip_code": 55924, + "latitude": 44.046168, + "longitude": -92.975313, + "city": "Claremont", + "state": "MN", + "county": "Dodge" + }, + { + "zip_code": 55925, + "latitude": 43.935613, + "longitude": -91.606021, + "city": "Dakota", + "state": "MN", + "county": "Winona" + }, + { + "zip_code": 55926, + "latitude": 43.616293, + "longitude": -92.786355, + "city": "Dexter", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55927, + "latitude": 44.045362, + "longitude": -92.910808, + "city": "Dodge Center", + "state": "MN", + "county": "Dodge" + }, + { + "zip_code": 55929, + "latitude": 43.989637, + "longitude": -92.138889, + "city": "Dover", + "state": "MN", + "county": "Olmsted" + }, + { + "zip_code": 55931, + "latitude": 43.508371, + "longitude": -91.463204, + "city": "Eitzen", + "state": "MN", + "county": "Houston" + }, + { + "zip_code": 55932, + "latitude": 44.123683, + "longitude": -92.252177, + "city": "Elgin", + "state": "MN", + "county": "Wabasha" + }, + { + "zip_code": 55933, + "latitude": 43.664334, + "longitude": -92.682753, + "city": "Elkton", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55934, + "latitude": 44.009932, + "longitude": -92.264837, + "city": "Eyota", + "state": "MN", + "county": "Olmsted" + }, + { + "zip_code": 55935, + "latitude": 43.651181, + "longitude": -92.075216, + "city": "Fountain", + "state": "MN", + "county": "Fillmore" + }, + { + "zip_code": 55936, + "latitude": 43.668417, + "longitude": -92.544587, + "city": "Grand Meadow", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55939, + "latitude": 43.534993, + "longitude": -92.069594, + "city": "Harmony", + "state": "MN", + "county": "Fillmore" + }, + { + "zip_code": 55940, + "latitude": 43.896909, + "longitude": -92.797679, + "city": "Hayfield", + "state": "MN", + "county": "Dodge" + }, + { + "zip_code": 55941, + "latitude": 43.759533, + "longitude": -91.398755, + "city": "Hokah", + "state": "MN", + "county": "Houston" + }, + { + "zip_code": 55942, + "latitude": 44.019989, + "longitude": -91.68187, + "city": "Homer", + "state": "MN", + "county": "Winona" + }, + { + "zip_code": 55943, + "latitude": 43.781431, + "longitude": -91.571198, + "city": "Houston", + "state": "MN", + "county": "Houston" + }, + { + "zip_code": 55944, + "latitude": 44.017216, + "longitude": -92.790593, + "city": "Kasson", + "state": "MN", + "county": "Dodge" + }, + { + "zip_code": 55945, + "latitude": 44.273871, + "longitude": -92.109479, + "city": "Kellogg", + "state": "MN", + "county": "Wabasha" + }, + { + "zip_code": 55946, + "latitude": 44.294333, + "longitude": -92.905937, + "city": "Kenyon", + "state": "MN", + "county": "Goodhue" + }, + { + "zip_code": 55947, + "latitude": 43.770564, + "longitude": -91.352968, + "city": "La Crescent", + "state": "MN", + "county": "Houston" + }, + { + "zip_code": 55949, + "latitude": 43.721194, + "longitude": -91.977384, + "city": "Lanesboro", + "state": "MN", + "county": "Fillmore" + }, + { + "zip_code": 55950, + "latitude": 43.762936, + "longitude": -92.965279, + "city": "Lansing", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55951, + "latitude": 43.546515, + "longitude": -92.532554, + "city": "Le Roy", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55952, + "latitude": 43.944412, + "longitude": -91.880535, + "city": "Lewiston", + "state": "MN", + "county": "Winona" + }, + { + "zip_code": 55953, + "latitude": 43.506952, + "longitude": -92.942939, + "city": "Lyle", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55954, + "latitude": 43.521277, + "longitude": -91.768082, + "city": "Mabel", + "state": "MN", + "county": "Fillmore" + }, + { + "zip_code": 55955, + "latitude": 44.065741, + "longitude": -92.760046, + "city": "Mantorville", + "state": "MN", + "county": "Dodge" + }, + { + "zip_code": 55956, + "latitude": 44.241752, + "longitude": -92.513947, + "city": "Mazeppa", + "state": "MN", + "county": "Wabasha" + }, + { + "zip_code": 55957, + "latitude": 44.234483, + "longitude": -92.336216, + "city": "Millville", + "state": "MN", + "county": "Wabasha" + }, + { + "zip_code": 55959, + "latitude": 44.081907, + "longitude": -91.73508, + "city": "Minnesota City", + "state": "MN", + "county": "Winona" + }, + { + "zip_code": 55960, + "latitude": 44.084556, + "longitude": -92.373869, + "city": "Oronoco", + "state": "MN", + "county": "Olmsted" + }, + { + "zip_code": 55961, + "latitude": 43.714209, + "longitude": -92.087863, + "city": "Ostrander", + "state": "MN", + "county": "Fillmore" + }, + { + "zip_code": 55962, + "latitude": 43.747262, + "longitude": -92.048539, + "city": "Peterson", + "state": "MN", + "county": "Fillmore" + }, + { + "zip_code": 55963, + "latitude": 44.261029, + "longitude": -92.710905, + "city": "Pine Island", + "state": "MN", + "county": "Goodhue" + }, + { + "zip_code": 55964, + "latitude": 44.15121, + "longitude": -92.202044, + "city": "Plainview", + "state": "MN", + "county": "Wabasha" + }, + { + "zip_code": 55965, + "latitude": 43.706377, + "longitude": -92.09459, + "city": "Preston", + "state": "MN", + "county": "Fillmore" + }, + { + "zip_code": 55967, + "latitude": 43.784072, + "longitude": -92.483567, + "city": "Racine", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55968, + "latitude": 44.340826, + "longitude": -92.282467, + "city": "Reads Landing", + "state": "MN", + "county": "Wabasha" + }, + { + "zip_code": 55969, + "latitude": 44.099266, + "longitude": -91.819882, + "city": "Rollingstone", + "state": "MN", + "county": "Winona" + }, + { + "zip_code": 55970, + "latitude": 43.669317, + "longitude": -92.830439, + "city": "Rose Creek", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55971, + "latitude": 43.809873, + "longitude": -91.793376, + "city": "Rushford", + "state": "MN", + "county": "Fillmore" + }, + { + "zip_code": 55972, + "latitude": 43.960809, + "longitude": -91.922346, + "city": "Saint Charles", + "state": "MN", + "county": "Winona" + }, + { + "zip_code": 55973, + "latitude": 43.804657, + "longitude": -92.802913, + "city": "Sargeant", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55974, + "latitude": 43.571029, + "longitude": -91.635822, + "city": "Spring Grove", + "state": "MN", + "county": "Houston" + }, + { + "zip_code": 55975, + "latitude": 43.689711, + "longitude": -92.334603, + "city": "Spring Valley", + "state": "MN", + "county": "Fillmore" + }, + { + "zip_code": 55976, + "latitude": 43.884346, + "longitude": -92.503744, + "city": "Stewartville", + "state": "MN", + "county": "Olmsted" + }, + { + "zip_code": 55977, + "latitude": 43.557786, + "longitude": -92.660555, + "city": "Taopi", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55979, + "latitude": 43.92098, + "longitude": -91.969704, + "city": "Utica", + "state": "MN", + "county": "Winona" + }, + { + "zip_code": 55981, + "latitude": 44.3579, + "longitude": -92.087925, + "city": "Wabasha", + "state": "MN", + "county": "Wabasha" + }, + { + "zip_code": 55982, + "latitude": 43.694738, + "longitude": -92.79693, + "city": "Waltham", + "state": "MN", + "county": "Mower" + }, + { + "zip_code": 55983, + "latitude": 44.272099, + "longitude": -92.812034, + "city": "Wanamingo", + "state": "MN", + "county": "Goodhue" + }, + { + "zip_code": 55985, + "latitude": 44.148244, + "longitude": -92.903452, + "city": "West Concord", + "state": "MN", + "county": "Dodge" + }, + { + "zip_code": 55987, + "latitude": 44.029975, + "longitude": -91.700889, + "city": "Winona", + "state": "MN", + "county": "Winona" + }, + { + "zip_code": 55988, + "latitude": 44.025217, + "longitude": -91.770781, + "city": "Stockton", + "state": "MN", + "county": "Winona" + }, + { + "zip_code": 55990, + "latitude": 43.704566, + "longitude": -92.237117, + "city": "Wykoff", + "state": "MN", + "county": "Fillmore" + }, + { + "zip_code": 55991, + "latitude": 44.242705, + "longitude": -92.425643, + "city": "Zumbro Falls", + "state": "MN", + "county": "Wabasha" + }, + { + "zip_code": 55992, + "latitude": 44.287597, + "longitude": -92.693235, + "city": "Zumbrota", + "state": "MN", + "county": "Goodhue" + }, + { + "zip_code": 56001, + "latitude": 44.061451, + "longitude": -94.003112, + "city": "Mankato", + "state": "MN", + "county": "Blue Earth" + }, + { + "zip_code": 56002, + "latitude": 44.056047, + "longitude": -94.069828, + "city": "Mankato", + "state": "MN", + "county": "Blue Earth" + }, + { + "zip_code": 56003, + "latitude": 44.217193, + "longitude": -94.094192, + "city": "Mankato", + "state": "MN", + "county": "Nicollet" + }, + { + "zip_code": 56006, + "latitude": 44.056047, + "longitude": -94.069828, + "city": "Mankato", + "state": "MN", + "county": "Blue Earth" + }, + { + "zip_code": 56007, + "latitude": 43.686288, + "longitude": -93.389838, + "city": "Albert Lea", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56009, + "latitude": 43.733525, + "longitude": -93.532143, + "city": "Alden", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56010, + "latitude": 43.886884, + "longitude": -94.15839, + "city": "Amboy", + "state": "MN", + "county": "Blue Earth" + }, + { + "zip_code": 56011, + "latitude": 44.608912, + "longitude": -93.757888, + "city": "Belle Plaine", + "state": "MN", + "county": "Scott" + }, + { + "zip_code": 56013, + "latitude": 43.6503, + "longitude": -93.977974, + "city": "Blue Earth", + "state": "MN", + "county": "Faribault" + }, + { + "zip_code": 56014, + "latitude": 43.669878, + "longitude": -93.826733, + "city": "Bricelyn", + "state": "MN", + "county": "Faribault" + }, + { + "zip_code": 56016, + "latitude": 43.761669, + "longitude": -93.326712, + "city": "Clarks Grove", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56017, + "latitude": 44.298188, + "longitude": -93.817622, + "city": "Cleveland", + "state": "MN", + "county": "Le Sueur" + }, + { + "zip_code": 56019, + "latitude": 44.111351, + "longitude": -94.907833, + "city": "Comfrey", + "state": "MN", + "county": "Brown" + }, + { + "zip_code": 56020, + "latitude": 43.62105, + "longitude": -93.548214, + "city": "Conger", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56021, + "latitude": 44.265888, + "longitude": -94.272911, + "city": "Courtland", + "state": "MN", + "county": "Nicollet" + }, + { + "zip_code": 56022, + "latitude": 44.05483, + "longitude": -94.790185, + "city": "Darfur", + "state": "MN", + "county": "Watonwan" + }, + { + "zip_code": 56023, + "latitude": 43.768062, + "longitude": -94.007655, + "city": "Delavan", + "state": "MN", + "county": "Faribault" + }, + { + "zip_code": 56024, + "latitude": 44.163231, + "longitude": -93.882127, + "city": "Eagle Lake", + "state": "MN", + "county": "Blue Earth" + }, + { + "zip_code": 56025, + "latitude": 43.760823, + "longitude": -93.897589, + "city": "Easton", + "state": "MN", + "county": "Faribault" + }, + { + "zip_code": 56026, + "latitude": 43.927861, + "longitude": -93.286367, + "city": "Ellendale", + "state": "MN", + "county": "Steele" + }, + { + "zip_code": 56027, + "latitude": 43.575712, + "longitude": -93.96984, + "city": "Elmore", + "state": "MN", + "county": "Faribault" + }, + { + "zip_code": 56028, + "latitude": 44.199317, + "longitude": -93.68198, + "city": "Elysian", + "state": "MN", + "county": "Le Sueur" + }, + { + "zip_code": 56029, + "latitude": 43.652544, + "longitude": -93.403429, + "city": "Emmons", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56030, + "latitude": 44.325833, + "longitude": -94.605226, + "city": "Essig", + "state": "MN", + "county": "Brown" + }, + { + "zip_code": 56031, + "latitude": 43.674049, + "longitude": -94.51078, + "city": "Fairmont", + "state": "MN", + "county": "Martin" + }, + { + "zip_code": 56032, + "latitude": 43.783807, + "longitude": -93.525396, + "city": "Freeborn", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56033, + "latitude": 43.564879, + "longitude": -93.908248, + "city": "Frost", + "state": "MN", + "county": "Faribault" + }, + { + "zip_code": 56034, + "latitude": 44.052118, + "longitude": -94.165036, + "city": "Garden City", + "state": "MN", + "county": "Blue Earth" + }, + { + "zip_code": 56035, + "latitude": 43.673904, + "longitude": -93.348869, + "city": "Geneva", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56036, + "latitude": 43.664991, + "longitude": -93.36173, + "city": "Glenville", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56037, + "latitude": 44.029182, + "longitude": -94.112395, + "city": "Good Thunder", + "state": "MN", + "county": "Blue Earth" + }, + { + "zip_code": 56039, + "latitude": 43.659429, + "longitude": -94.440978, + "city": "Granada", + "state": "MN", + "county": "Martin" + }, + { + "zip_code": 56041, + "latitude": 44.133457, + "longitude": -94.499485, + "city": "Hanska", + "state": "MN", + "county": "Brown" + }, + { + "zip_code": 56042, + "latitude": 43.803384, + "longitude": -93.485456, + "city": "Hartland", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56043, + "latitude": 43.646968, + "longitude": -93.244932, + "city": "Hayward", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56044, + "latitude": 44.564912, + "longitude": -93.962668, + "city": "Henderson", + "state": "MN", + "county": "Sibley" + }, + { + "zip_code": 56045, + "latitude": 43.759484, + "longitude": -93.204246, + "city": "Hollandale", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56046, + "latitude": 43.955103, + "longitude": -93.274017, + "city": "Hope", + "state": "MN", + "county": "Steele" + }, + { + "zip_code": 56047, + "latitude": 43.738397, + "longitude": -94.228897, + "city": "Huntley", + "state": "MN", + "county": "Faribault" + }, + { + "zip_code": 56048, + "latitude": 44.051012, + "longitude": -93.58735, + "city": "Janesville", + "state": "MN", + "county": "Waseca" + }, + { + "zip_code": 56050, + "latitude": 44.273281, + "longitude": -93.931119, + "city": "Kasota", + "state": "MN", + "county": "Le Sueur" + }, + { + "zip_code": 56051, + "latitude": 43.550446, + "longitude": -93.708504, + "city": "Kiester", + "state": "MN", + "county": "Faribault" + }, + { + "zip_code": 56052, + "latitude": 44.313417, + "longitude": -93.574653, + "city": "Kilkenny", + "state": "MN", + "county": "Le Sueur" + }, + { + "zip_code": 56054, + "latitude": 44.361224, + "longitude": -94.293887, + "city": "Lafayette", + "state": "MN", + "county": "Nicollet" + }, + { + "zip_code": 56055, + "latitude": 44.147701, + "longitude": -94.212574, + "city": "Lake Crystal", + "state": "MN", + "county": "Blue Earth" + }, + { + "zip_code": 56056, + "latitude": 43.978335, + "longitude": -94.614361, + "city": "La Salle", + "state": "MN", + "county": "Watonwan" + }, + { + "zip_code": 56057, + "latitude": 44.360047, + "longitude": -93.781405, + "city": "Le Center", + "state": "MN", + "county": "Le Sueur" + }, + { + "zip_code": 56058, + "latitude": 44.390864, + "longitude": -93.903348, + "city": "Le Sueur", + "state": "MN", + "county": "Le Sueur" + }, + { + "zip_code": 56060, + "latitude": 43.923423, + "longitude": -94.434135, + "city": "Lewisville", + "state": "MN", + "county": "Watonwan" + }, + { + "zip_code": 56062, + "latitude": 44.050715, + "longitude": -94.41548, + "city": "Madelia", + "state": "MN", + "county": "Watonwan" + }, + { + "zip_code": 56063, + "latitude": 44.08391, + "longitude": -93.862052, + "city": "Madison Lake", + "state": "MN", + "county": "Blue Earth" + }, + { + "zip_code": 56064, + "latitude": 43.763839, + "longitude": -93.468959, + "city": "Manchester", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56065, + "latitude": 43.925112, + "longitude": -93.952056, + "city": "Mapleton", + "state": "MN", + "county": "Blue Earth" + }, + { + "zip_code": 56068, + "latitude": 43.811561, + "longitude": -93.817817, + "city": "Minnesota Lake", + "state": "MN", + "county": "Faribault" + }, + { + "zip_code": 56069, + "latitude": 44.349609, + "longitude": -93.580277, + "city": "Montgomery", + "state": "MN", + "county": "Le Sueur" + }, + { + "zip_code": 56071, + "latitude": 44.536713, + "longitude": -93.55598, + "city": "New Prague", + "state": "MN", + "county": "Le Sueur" + }, + { + "zip_code": 56072, + "latitude": 43.981294, + "longitude": -93.561426, + "city": "New Richland", + "state": "MN", + "county": "Waseca" + }, + { + "zip_code": 56073, + "latitude": 44.259924, + "longitude": -94.511407, + "city": "New Ulm", + "state": "MN", + "county": "Brown" + }, + { + "zip_code": 56074, + "latitude": 44.273214, + "longitude": -94.188233, + "city": "Nicollet", + "state": "MN", + "county": "Nicollet" + }, + { + "zip_code": 56075, + "latitude": 43.735278, + "longitude": -94.435705, + "city": "Northrop", + "state": "MN", + "county": "Martin" + }, + { + "zip_code": 56076, + "latitude": 43.673904, + "longitude": -93.348869, + "city": "Oakland", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56078, + "latitude": 44.007674, + "longitude": -93.783274, + "city": "Pemberton", + "state": "MN", + "county": "Blue Earth" + }, + { + "zip_code": 56080, + "latitude": 44.081669, + "longitude": -93.857123, + "city": "Saint Clair", + "state": "MN", + "county": "Blue Earth" + }, + { + "zip_code": 56081, + "latitude": 43.982851, + "longitude": -94.604116, + "city": "Saint James", + "state": "MN", + "county": "Watonwan" + }, + { + "zip_code": 56082, + "latitude": 44.337793, + "longitude": -94.070153, + "city": "Saint Peter", + "state": "MN", + "county": "Nicollet" + }, + { + "zip_code": 56083, + "latitude": 44.282403, + "longitude": -95.167551, + "city": "Sanborn", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56084, + "latitude": 44.302893, + "longitude": -94.738827, + "city": "Searles", + "state": "MN", + "county": "Brown" + }, + { + "zip_code": 56085, + "latitude": 44.317309, + "longitude": -94.777163, + "city": "Sleepy Eye", + "state": "MN", + "county": "Brown" + }, + { + "zip_code": 56087, + "latitude": 44.253427, + "longitude": -94.903534, + "city": "Springfield", + "state": "MN", + "county": "Brown" + }, + { + "zip_code": 56088, + "latitude": 43.789856, + "longitude": -94.430809, + "city": "Truman", + "state": "MN", + "county": "Martin" + }, + { + "zip_code": 56089, + "latitude": 43.559269, + "longitude": -93.420578, + "city": "Twin Lakes", + "state": "MN", + "county": "Freeborn" + }, + { + "zip_code": 56090, + "latitude": 43.925892, + "longitude": -94.233683, + "city": "Vernon Center", + "state": "MN", + "county": "Blue Earth" + }, + { + "zip_code": 56091, + "latitude": 43.907326, + "longitude": -93.682513, + "city": "Waldorf", + "state": "MN", + "county": "Waseca" + }, + { + "zip_code": 56093, + "latitude": 44.065547, + "longitude": -93.550495, + "city": "Waseca", + "state": "MN", + "county": "Waseca" + }, + { + "zip_code": 56096, + "latitude": 44.324235, + "longitude": -93.569726, + "city": "Waterville", + "state": "MN", + "county": "Le Sueur" + }, + { + "zip_code": 56097, + "latitude": 43.702814, + "longitude": -93.912041, + "city": "Wells", + "state": "MN", + "county": "Faribault" + }, + { + "zip_code": 56098, + "latitude": 43.673848, + "longitude": -93.948241, + "city": "Winnebago", + "state": "MN", + "county": "Faribault" + }, + { + "zip_code": 56101, + "latitude": 43.900192, + "longitude": -95.046828, + "city": "Windom", + "state": "MN", + "county": "Cottonwood" + }, + { + "zip_code": 56110, + "latitude": 43.620754, + "longitude": -95.953225, + "city": "Adrian", + "state": "MN", + "county": "Nobles" + }, + { + "zip_code": 56111, + "latitude": 43.674174, + "longitude": -95.154494, + "city": "Alpha", + "state": "MN", + "county": "Jackson" + }, + { + "zip_code": 56113, + "latitude": 44.382668, + "longitude": -96.1842, + "city": "Arco", + "state": "MN", + "county": "Lincoln" + }, + { + "zip_code": 56114, + "latitude": 43.960084, + "longitude": -95.60317, + "city": "Avoca", + "state": "MN", + "county": "Murray" + }, + { + "zip_code": 56115, + "latitude": 44.261464, + "longitude": -95.889647, + "city": "Balaton", + "state": "MN", + "county": "Lyon" + }, + { + "zip_code": 56116, + "latitude": 43.612344, + "longitude": -96.364663, + "city": "Beaver Creek", + "state": "MN", + "county": "Rock" + }, + { + "zip_code": 56117, + "latitude": 43.540643, + "longitude": -95.687951, + "city": "Bigelow", + "state": "MN", + "county": "Nobles" + }, + { + "zip_code": 56118, + "latitude": 43.895565, + "longitude": -95.048996, + "city": "Bingham Lake", + "state": "MN", + "county": "Cottonwood" + }, + { + "zip_code": 56119, + "latitude": 43.732427, + "longitude": -95.512519, + "city": "Brewster", + "state": "MN", + "county": "Nobles" + }, + { + "zip_code": 56120, + "latitude": 44.002201, + "longitude": -94.814932, + "city": "Butterfield", + "state": "MN", + "county": "Watonwan" + }, + { + "zip_code": 56121, + "latitude": 43.584995, + "longitude": -94.606517, + "city": "Ceylon", + "state": "MN", + "county": "Martin" + }, + { + "zip_code": 56122, + "latitude": 43.92199, + "longitude": -95.81997, + "city": "Chandler", + "state": "MN", + "county": "Murray" + }, + { + "zip_code": 56123, + "latitude": 44.048028, + "longitude": -95.704397, + "city": "Currie", + "state": "MN", + "county": "Murray" + }, + { + "zip_code": 56125, + "latitude": 44.053323, + "longitude": -95.549899, + "city": "Dovray", + "state": "MN", + "county": "Murray" + }, + { + "zip_code": 56127, + "latitude": 43.674184, + "longitude": -94.550932, + "city": "Dunnell", + "state": "MN", + "county": "Martin" + }, + { + "zip_code": 56128, + "latitude": 43.930332, + "longitude": -96.149676, + "city": "Edgerton", + "state": "MN", + "county": "Pipestone" + }, + { + "zip_code": 56129, + "latitude": 43.536342, + "longitude": -95.983538, + "city": "Ellsworth", + "state": "MN", + "county": "Nobles" + }, + { + "zip_code": 56131, + "latitude": 43.905962, + "longitude": -95.593288, + "city": "Fulda", + "state": "MN", + "county": "Murray" + }, + { + "zip_code": 56132, + "latitude": 44.305584, + "longitude": -95.86177, + "city": "Garvin", + "state": "MN", + "county": "Lyon" + }, + { + "zip_code": 56134, + "latitude": 43.810378, + "longitude": -96.218283, + "city": "Hardwick", + "state": "MN", + "county": "Rock" + }, + { + "zip_code": 56136, + "latitude": 44.460984, + "longitude": -96.33771, + "city": "Hendricks", + "state": "MN", + "county": "Lincoln" + }, + { + "zip_code": 56137, + "latitude": 43.795977, + "longitude": -95.320571, + "city": "Heron Lake", + "state": "MN", + "county": "Jackson" + }, + { + "zip_code": 56138, + "latitude": 43.525185, + "longitude": -96.358365, + "city": "Hills", + "state": "MN", + "county": "Rock" + }, + { + "zip_code": 56139, + "latitude": 44.09239, + "longitude": -96.188124, + "city": "Holland", + "state": "MN", + "county": "Pipestone" + }, + { + "zip_code": 56140, + "latitude": 43.895464, + "longitude": -96.364032, + "city": "Ihlen", + "state": "MN", + "county": "Pipestone" + }, + { + "zip_code": 56141, + "latitude": 43.891474, + "longitude": -95.784003, + "city": "Iona", + "state": "MN", + "county": "Murray" + }, + { + "zip_code": 56142, + "latitude": 44.460411, + "longitude": -96.246374, + "city": "Ivanhoe", + "state": "MN", + "county": "Lincoln" + }, + { + "zip_code": 56143, + "latitude": 43.650174, + "longitude": -95.021954, + "city": "Jackson", + "state": "MN", + "county": "Jackson" + }, + { + "zip_code": 56144, + "latitude": 43.879857, + "longitude": -96.342955, + "city": "Jasper", + "state": "MN", + "county": "Pipestone" + }, + { + "zip_code": 56145, + "latitude": 44.055769, + "longitude": -95.195219, + "city": "Jeffers", + "state": "MN", + "county": "Cottonwood" + }, + { + "zip_code": 56146, + "latitude": 43.674883, + "longitude": -96.252794, + "city": "Kanaranzi", + "state": "MN", + "county": "Rock" + }, + { + "zip_code": 56147, + "latitude": 43.674883, + "longitude": -96.252794, + "city": "Kenneth", + "state": "MN", + "county": "Rock" + }, + { + "zip_code": 56149, + "latitude": 44.294793, + "longitude": -96.270936, + "city": "Lake Benton", + "state": "MN", + "county": "Lincoln" + }, + { + "zip_code": 56150, + "latitude": 43.678125, + "longitude": -95.171548, + "city": "Lakefield", + "state": "MN", + "county": "Jackson" + }, + { + "zip_code": 56151, + "latitude": 44.00692, + "longitude": -95.825082, + "city": "Lake Wilson", + "state": "MN", + "county": "Murray" + }, + { + "zip_code": 56152, + "latitude": 44.282497, + "longitude": -95.269338, + "city": "Lamberton", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56153, + "latitude": 43.840423, + "longitude": -96.012811, + "city": "Leota", + "state": "MN", + "county": "Nobles" + }, + { + "zip_code": 56155, + "latitude": 43.682995, + "longitude": -95.942501, + "city": "Lismore", + "state": "MN", + "county": "Nobles" + }, + { + "zip_code": 56156, + "latitude": 43.698546, + "longitude": -96.163242, + "city": "Luverne", + "state": "MN", + "county": "Rock" + }, + { + "zip_code": 56157, + "latitude": 44.399913, + "longitude": -95.937984, + "city": "Lynd", + "state": "MN", + "county": "Lyon" + }, + { + "zip_code": 56158, + "latitude": 43.644047, + "longitude": -96.07695, + "city": "Magnolia", + "state": "MN", + "county": "Rock" + }, + { + "zip_code": 56159, + "latitude": 43.939276, + "longitude": -94.924319, + "city": "Mountain Lake", + "state": "MN", + "county": "Cottonwood" + }, + { + "zip_code": 56160, + "latitude": 43.867848, + "longitude": -94.742716, + "city": "Odin", + "state": "MN", + "county": "Watonwan" + }, + { + "zip_code": 56161, + "latitude": 43.738986, + "longitude": -95.316815, + "city": "Okabena", + "state": "MN", + "county": "Jackson" + }, + { + "zip_code": 56162, + "latitude": 43.826503, + "longitude": -94.663493, + "city": "Ormsby", + "state": "MN", + "county": "Martin" + }, + { + "zip_code": 56164, + "latitude": 43.989267, + "longitude": -96.265153, + "city": "Pipestone", + "state": "MN", + "county": "Pipestone" + }, + { + "zip_code": 56165, + "latitude": 43.732304, + "longitude": -95.703514, + "city": "Reading", + "state": "MN", + "county": "Nobles" + }, + { + "zip_code": 56166, + "latitude": 44.23913, + "longitude": -95.355744, + "city": "Revere", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56167, + "latitude": 43.631841, + "longitude": -95.640477, + "city": "Round Lake", + "state": "MN", + "county": "Nobles" + }, + { + "zip_code": 56168, + "latitude": 43.623088, + "longitude": -95.803869, + "city": "Rushmore", + "state": "MN", + "county": "Nobles" + }, + { + "zip_code": 56169, + "latitude": 44.335085, + "longitude": -95.97804, + "city": "Russell", + "state": "MN", + "county": "Lyon" + }, + { + "zip_code": 56170, + "latitude": 44.153916, + "longitude": -96.275913, + "city": "Ruthton", + "state": "MN", + "county": "Pipestone" + }, + { + "zip_code": 56171, + "latitude": 43.667369, + "longitude": -94.759431, + "city": "Sherburn", + "state": "MN", + "county": "Martin" + }, + { + "zip_code": 56172, + "latitude": 43.993479, + "longitude": -95.763493, + "city": "Slayton", + "state": "MN", + "county": "Murray" + }, + { + "zip_code": 56173, + "latitude": 43.674883, + "longitude": -96.252794, + "city": "Steen", + "state": "MN", + "county": "Rock" + }, + { + "zip_code": 56174, + "latitude": 44.039624, + "longitude": -95.319366, + "city": "Storden", + "state": "MN", + "county": "Cottonwood" + }, + { + "zip_code": 56175, + "latitude": 44.290092, + "longitude": -95.773754, + "city": "Tracy", + "state": "MN", + "county": "Lyon" + }, + { + "zip_code": 56176, + "latitude": 43.783229, + "longitude": -94.713525, + "city": "Trimont", + "state": "MN", + "county": "Martin" + }, + { + "zip_code": 56177, + "latitude": 43.889477, + "longitude": -96.260066, + "city": "Trosky", + "state": "MN", + "county": "Pipestone" + }, + { + "zip_code": 56178, + "latitude": 44.275371, + "longitude": -96.141967, + "city": "Tyler", + "state": "MN", + "county": "Lincoln" + }, + { + "zip_code": 56180, + "latitude": 44.283007, + "longitude": -95.48189, + "city": "Walnut Grove", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56181, + "latitude": 43.66727, + "longitude": -94.673433, + "city": "Welcome", + "state": "MN", + "county": "Martin" + }, + { + "zip_code": 56183, + "latitude": 44.007813, + "longitude": -95.196562, + "city": "Westbrook", + "state": "MN", + "county": "Cottonwood" + }, + { + "zip_code": 56185, + "latitude": 43.790084, + "longitude": -95.826712, + "city": "Wilmont", + "state": "MN", + "county": "Nobles" + }, + { + "zip_code": 56186, + "latitude": 44.009283, + "longitude": -96.09925, + "city": "Woodstock", + "state": "MN", + "county": "Pipestone" + }, + { + "zip_code": 56187, + "latitude": 43.645207, + "longitude": -95.735375, + "city": "Worthington", + "state": "MN", + "county": "Nobles" + }, + { + "zip_code": 56201, + "latitude": 45.147104, + "longitude": -94.977723, + "city": "Willmar", + "state": "MN", + "county": "Kandiyohi" + }, + { + "zip_code": 56207, + "latitude": 45.585961, + "longitude": -96.000761, + "city": "Alberta", + "state": "MN", + "county": "Stevens" + }, + { + "zip_code": 56208, + "latitude": 45.282008, + "longitude": -95.95757, + "city": "Appleton", + "state": "MN", + "county": "Swift" + }, + { + "zip_code": 56209, + "latitude": 45.109205, + "longitude": -94.968572, + "city": "Atwater", + "state": "MN", + "county": "Kandiyohi" + }, + { + "zip_code": 56210, + "latitude": 45.559291, + "longitude": -96.558886, + "city": "Barry", + "state": "MN", + "county": "Big Stone" + }, + { + "zip_code": 56211, + "latitude": 45.381402, + "longitude": -96.469532, + "city": "Beardsley", + "state": "MN", + "county": "Big Stone" + }, + { + "zip_code": 56212, + "latitude": 45.053253, + "longitude": -96.095554, + "city": "Bellingham", + "state": "MN", + "county": "Lac Qui Parle" + }, + { + "zip_code": 56214, + "latitude": 44.553001, + "longitude": -95.324839, + "city": "Belview", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56215, + "latitude": 45.281669, + "longitude": -95.672102, + "city": "Benson", + "state": "MN", + "county": "Swift" + }, + { + "zip_code": 56216, + "latitude": 44.950076, + "longitude": -95.058849, + "city": "Blomkest", + "state": "MN", + "county": "Kandiyohi" + }, + { + "zip_code": 56218, + "latitude": 45.053253, + "longitude": -96.095554, + "city": "Boyd", + "state": "MN", + "county": "Lac Qui Parle" + }, + { + "zip_code": 56219, + "latitude": 45.59432, + "longitude": -96.834959, + "city": "Browns Valley", + "state": "MN", + "county": "Traverse" + }, + { + "zip_code": 56220, + "latitude": 44.775235, + "longitude": -95.916433, + "city": "Canby", + "state": "MN", + "county": "Yellow Medicine" + }, + { + "zip_code": 56221, + "latitude": 45.573876, + "longitude": -96.172979, + "city": "Chokio", + "state": "MN", + "county": "Stevens" + }, + { + "zip_code": 56222, + "latitude": 44.992549, + "longitude": -95.36042, + "city": "Clara City", + "state": "MN", + "county": "Chippewa" + }, + { + "zip_code": 56223, + "latitude": 44.790853, + "longitude": -95.806933, + "city": "Clarkfield", + "state": "MN", + "county": "Yellow Medicine" + }, + { + "zip_code": 56224, + "latitude": 44.418189, + "longitude": -95.261177, + "city": "Clements", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56225, + "latitude": 45.461092, + "longitude": -96.431538, + "city": "Clinton", + "state": "MN", + "county": "Big Stone" + }, + { + "zip_code": 56226, + "latitude": 45.305865, + "longitude": -95.838919, + "city": "Clontarf", + "state": "MN", + "county": "Swift" + }, + { + "zip_code": 56227, + "latitude": 45.381402, + "longitude": -96.469532, + "city": "Correll", + "state": "MN", + "county": "Big Stone" + }, + { + "zip_code": 56228, + "latitude": 45.022087, + "longitude": -94.660884, + "city": "Cosmos", + "state": "MN", + "county": "Meeker" + }, + { + "zip_code": 56229, + "latitude": 44.56956, + "longitude": -95.744921, + "city": "Cottonwood", + "state": "MN", + "county": "Lyon" + }, + { + "zip_code": 56230, + "latitude": 44.76007, + "longitude": -95.09754, + "city": "Danube", + "state": "MN", + "county": "Renville" + }, + { + "zip_code": 56231, + "latitude": 45.281751, + "longitude": -95.721936, + "city": "Danvers", + "state": "MN", + "county": "Swift" + }, + { + "zip_code": 56232, + "latitude": 44.929289, + "longitude": -96.056499, + "city": "Dawson", + "state": "MN", + "county": "Lac Qui Parle" + }, + { + "zip_code": 56235, + "latitude": 45.690959, + "longitude": -96.010121, + "city": "Donnelly", + "state": "MN", + "county": "Stevens" + }, + { + "zip_code": 56236, + "latitude": 45.718556, + "longitude": -96.422981, + "city": "Dumont", + "state": "MN", + "county": "Traverse" + }, + { + "zip_code": 56237, + "latitude": 44.617739, + "longitude": -95.411535, + "city": "Echo", + "state": "MN", + "county": "Yellow Medicine" + }, + { + "zip_code": 56239, + "latitude": 44.485432, + "longitude": -95.907811, + "city": "Ghent", + "state": "MN", + "county": "Lyon" + }, + { + "zip_code": 56240, + "latitude": 45.521519, + "longitude": -96.440429, + "city": "Graceville", + "state": "MN", + "county": "Big Stone" + }, + { + "zip_code": 56241, + "latitude": 44.780794, + "longitude": -95.670577, + "city": "Granite Falls", + "state": "MN", + "county": "Yellow Medicine" + }, + { + "zip_code": 56243, + "latitude": 45.146898, + "longitude": -94.674112, + "city": "Grove City", + "state": "MN", + "county": "Meeker" + }, + { + "zip_code": 56244, + "latitude": 45.497402, + "longitude": -95.79426, + "city": "Hancock", + "state": "MN", + "county": "Stevens" + }, + { + "zip_code": 56245, + "latitude": 44.692039, + "longitude": -95.62058, + "city": "Hanley Falls", + "state": "MN", + "county": "Yellow Medicine" + }, + { + "zip_code": 56246, + "latitude": 45.33763, + "longitude": -94.85611, + "city": "Hawick", + "state": "MN", + "county": "Kandiyohi" + }, + { + "zip_code": 56248, + "latitude": 45.838396, + "longitude": -96.141993, + "city": "Herman", + "state": "MN", + "county": "Grant" + }, + { + "zip_code": 56249, + "latitude": 45.29184, + "longitude": -95.624619, + "city": "Holloway", + "state": "MN", + "county": "Swift" + }, + { + "zip_code": 56251, + "latitude": 45.142577, + "longitude": -94.918264, + "city": "Kandiyohi", + "state": "MN", + "county": "Kandiyohi" + }, + { + "zip_code": 56252, + "latitude": 45.231737, + "longitude": -95.317927, + "city": "Kerkhoven", + "state": "MN", + "county": "Swift" + }, + { + "zip_code": 56253, + "latitude": 45.011036, + "longitude": -94.900783, + "city": "Lake Lillian", + "state": "MN", + "county": "Kandiyohi" + }, + { + "zip_code": 56255, + "latitude": 44.472194, + "longitude": -95.409783, + "city": "Lucan", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56256, + "latitude": 45.038164, + "longitude": -96.311044, + "city": "Madison", + "state": "MN", + "county": "Lac Qui Parle" + }, + { + "zip_code": 56257, + "latitude": 45.067384, + "longitude": -96.440184, + "city": "Marietta", + "state": "MN", + "county": "Lac Qui Parle" + }, + { + "zip_code": 56258, + "latitude": 44.460429, + "longitude": -95.785872, + "city": "Marshall", + "state": "MN", + "county": "Lyon" + }, + { + "zip_code": 56260, + "latitude": 44.999613, + "longitude": -95.573816, + "city": "Maynard", + "state": "MN", + "county": "Chippewa" + }, + { + "zip_code": 56262, + "latitude": 45.108407, + "longitude": -95.817699, + "city": "Milan", + "state": "MN", + "county": "Chippewa" + }, + { + "zip_code": 56263, + "latitude": 44.417632, + "longitude": -95.531336, + "city": "Milroy", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56264, + "latitude": 44.52307, + "longitude": -95.954362, + "city": "Minneota", + "state": "MN", + "county": "Lyon" + }, + { + "zip_code": 56265, + "latitude": 45.014054, + "longitude": -95.601718, + "city": "Montevideo", + "state": "MN", + "county": "Chippewa" + }, + { + "zip_code": 56266, + "latitude": 44.404589, + "longitude": -94.976823, + "city": "Morgan", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56267, + "latitude": 45.595739, + "longitude": -95.923233, + "city": "Morris", + "state": "MN", + "county": "Stevens" + }, + { + "zip_code": 56270, + "latitude": 44.586097, + "longitude": -94.97066, + "city": "Morton", + "state": "MN", + "county": "Renville" + }, + { + "zip_code": 56271, + "latitude": 45.281997, + "longitude": -95.512817, + "city": "Murdock", + "state": "MN", + "county": "Swift" + }, + { + "zip_code": 56273, + "latitude": 45.167597, + "longitude": -95.049378, + "city": "New London", + "state": "MN", + "county": "Kandiyohi" + }, + { + "zip_code": 56274, + "latitude": 45.934055, + "longitude": -96.012359, + "city": "Norcross", + "state": "MN", + "county": "Grant" + }, + { + "zip_code": 56276, + "latitude": 45.381402, + "longitude": -96.469532, + "city": "Odessa", + "state": "MN", + "county": "Big Stone" + }, + { + "zip_code": 56277, + "latitude": 44.760343, + "longitude": -95.032641, + "city": "Olivia", + "state": "MN", + "county": "Renville" + }, + { + "zip_code": 56278, + "latitude": 45.376691, + "longitude": -96.516214, + "city": "Ortonville", + "state": "MN", + "county": "Big Stone" + }, + { + "zip_code": 56279, + "latitude": 45.219496, + "longitude": -95.141233, + "city": "Pennock", + "state": "MN", + "county": "Kandiyohi" + }, + { + "zip_code": 56280, + "latitude": 44.674215, + "longitude": -96.11204, + "city": "Porter", + "state": "MN", + "county": "Yellow Medicine" + }, + { + "zip_code": 56281, + "latitude": 45.029662, + "longitude": -95.000152, + "city": "Prinsburg", + "state": "MN", + "county": "Kandiyohi" + }, + { + "zip_code": 56282, + "latitude": 45.094173, + "longitude": -95.111335, + "city": "Raymond", + "state": "MN", + "county": "Kandiyohi" + }, + { + "zip_code": 56283, + "latitude": 44.521759, + "longitude": -95.200255, + "city": "Redwood Falls", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56284, + "latitude": 44.760675, + "longitude": -95.240065, + "city": "Renville", + "state": "MN", + "county": "Renville" + }, + { + "zip_code": 56285, + "latitude": 44.779761, + "longitude": -95.370482, + "city": "Sacred Heart", + "state": "MN", + "county": "Renville" + }, + { + "zip_code": 56287, + "latitude": 44.461267, + "longitude": -95.328167, + "city": "Seaforth", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56288, + "latitude": 45.164862, + "longitude": -95.020124, + "city": "Spicer", + "state": "MN", + "county": "Kandiyohi" + }, + { + "zip_code": 56289, + "latitude": 45.258882, + "longitude": -95.141945, + "city": "Sunburg", + "state": "MN", + "county": "Kandiyohi" + }, + { + "zip_code": 56291, + "latitude": 44.580923, + "longitude": -95.883387, + "city": "Taunton", + "state": "MN", + "county": "Lyon" + }, + { + "zip_code": 56292, + "latitude": 44.492318, + "longitude": -95.447604, + "city": "Vesta", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56293, + "latitude": 44.420734, + "longitude": -95.248847, + "city": "Wabasso", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56294, + "latitude": 44.32978, + "longitude": -95.211785, + "city": "Wanda", + "state": "MN", + "county": "Redwood" + }, + { + "zip_code": 56295, + "latitude": 45.019892, + "longitude": -95.630814, + "city": "Watson", + "state": "MN", + "county": "Chippewa" + }, + { + "zip_code": 56296, + "latitude": 45.703481, + "longitude": -96.633211, + "city": "Wheaton", + "state": "MN", + "county": "Traverse" + }, + { + "zip_code": 56297, + "latitude": 44.667478, + "longitude": -95.576938, + "city": "Wood Lake", + "state": "MN", + "county": "Yellow Medicine" + }, + { + "zip_code": 56301, + "latitude": 45.519196, + "longitude": -94.330619, + "city": "Saint Cloud", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56302, + "latitude": 45.49343, + "longitude": -94.643922, + "city": "Saint Cloud", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56303, + "latitude": 45.627994, + "longitude": -94.223023, + "city": "Saint Cloud", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56304, + "latitude": 45.544864, + "longitude": -94.440969, + "city": "Saint Cloud", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56307, + "latitude": 45.614724, + "longitude": -94.494229, + "city": "Albany", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56308, + "latitude": 45.902017, + "longitude": -95.420589, + "city": "Alexandria", + "state": "MN", + "county": "Douglas" + }, + { + "zip_code": 56309, + "latitude": 46.09171, + "longitude": -95.816743, + "city": "Ashby", + "state": "MN", + "county": "Grant" + }, + { + "zip_code": 56310, + "latitude": 45.599386, + "longitude": -94.436477, + "city": "Avon", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56311, + "latitude": 45.902775, + "longitude": -95.85025, + "city": "Barrett", + "state": "MN", + "county": "Grant" + }, + { + "zip_code": 56312, + "latitude": 45.509715, + "longitude": -94.963049, + "city": "Belgrade", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56313, + "latitude": 45.784462, + "longitude": -93.552152, + "city": "Bock", + "state": "MN", + "county": "Mille Lacs" + }, + { + "zip_code": 56314, + "latitude": 45.868809, + "longitude": -94.422896, + "city": "Bowlus", + "state": "MN", + "county": "Morrison" + }, + { + "zip_code": 56315, + "latitude": 45.966435, + "longitude": -95.516619, + "city": "Brandon", + "state": "MN", + "county": "Douglas" + }, + { + "zip_code": 56316, + "latitude": 45.513441, + "longitude": -95.056661, + "city": "Brooten", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56317, + "latitude": 46.061307, + "longitude": -94.208731, + "city": "Buckman", + "state": "MN", + "county": "Morrison" + }, + { + "zip_code": 56318, + "latitude": 45.86575, + "longitude": -94.685781, + "city": "Burtrum", + "state": "MN", + "county": "Todd" + }, + { + "zip_code": 56319, + "latitude": 45.991208, + "longitude": -95.371207, + "city": "Carlos", + "state": "MN", + "county": "Douglas" + }, + { + "zip_code": 56320, + "latitude": 45.470708, + "longitude": -94.661654, + "city": "Cold Spring", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56321, + "latitude": 45.578278, + "longitude": -94.419941, + "city": "Collegeville", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56323, + "latitude": 45.641425, + "longitude": -95.709642, + "city": "Cyrus", + "state": "MN", + "county": "Pope" + }, + { + "zip_code": 56324, + "latitude": 46.172907, + "longitude": -95.918542, + "city": "Dalton", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56325, + "latitude": 45.563556, + "longitude": -94.946428, + "city": "Elrosa", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56326, + "latitude": 45.984659, + "longitude": -95.670545, + "city": "Evansville", + "state": "MN", + "county": "Douglas" + }, + { + "zip_code": 56327, + "latitude": 45.728746, + "longitude": -95.623944, + "city": "Farwell", + "state": "MN", + "county": "Pope" + }, + { + "zip_code": 56328, + "latitude": 45.953341, + "longitude": -94.546845, + "city": "Flensburg", + "state": "MN", + "county": "Morrison" + }, + { + "zip_code": 56329, + "latitude": 45.691931, + "longitude": -93.914797, + "city": "Foley", + "state": "MN", + "county": "Benton" + }, + { + "zip_code": 56330, + "latitude": 45.735675, + "longitude": -93.647135, + "city": "Foreston", + "state": "MN", + "county": "Mille Lacs" + }, + { + "zip_code": 56331, + "latitude": 45.643851, + "longitude": -94.660815, + "city": "Freeport", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56332, + "latitude": 45.984672, + "longitude": -95.506622, + "city": "Garfield", + "state": "MN", + "county": "Douglas" + }, + { + "zip_code": 56333, + "latitude": 45.691714, + "longitude": -94.05629, + "city": "Gilman", + "state": "MN", + "county": "Benton" + }, + { + "zip_code": 56334, + "latitude": 45.589131, + "longitude": -95.357347, + "city": "Glenwood", + "state": "MN", + "county": "Pope" + }, + { + "zip_code": 56335, + "latitude": 45.597122, + "longitude": -94.851494, + "city": "Greenwald", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56336, + "latitude": 45.827791, + "longitude": -94.77757, + "city": "Grey Eagle", + "state": "MN", + "county": "Todd" + }, + { + "zip_code": 56338, + "latitude": 45.990074, + "longitude": -93.888513, + "city": "Hillman", + "state": "MN", + "county": "Morrison" + }, + { + "zip_code": 56339, + "latitude": 45.836077, + "longitude": -95.791353, + "city": "Hoffman", + "state": "MN", + "county": "Grant" + }, + { + "zip_code": 56340, + "latitude": 45.623632, + "longitude": -94.41914, + "city": "Holdingford", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56341, + "latitude": 45.830998, + "longitude": -95.541618, + "city": "Holmes City", + "state": "MN", + "county": "Douglas" + }, + { + "zip_code": 56342, + "latitude": 45.973268, + "longitude": -93.536504, + "city": "Isle", + "state": "MN", + "county": "Mille Lacs" + }, + { + "zip_code": 56343, + "latitude": 45.811895, + "longitude": -95.665241, + "city": "Kensington", + "state": "MN", + "county": "Douglas" + }, + { + "zip_code": 56344, + "latitude": 46.061307, + "longitude": -94.208731, + "city": "Lastrup", + "state": "MN", + "county": "Morrison" + }, + { + "zip_code": 56345, + "latitude": 45.980055, + "longitude": -94.245867, + "city": "Little Falls", + "state": "MN", + "county": "Morrison" + }, + { + "zip_code": 56347, + "latitude": 45.904136, + "longitude": -94.815114, + "city": "Long Prairie", + "state": "MN", + "county": "Todd" + }, + { + "zip_code": 56349, + "latitude": 45.715846, + "longitude": -95.540402, + "city": "Lowry", + "state": "MN", + "county": "Pope" + }, + { + "zip_code": 56350, + "latitude": 46.195728, + "longitude": -93.377414, + "city": "Mc Grath", + "state": "MN", + "county": "Aitkin" + }, + { + "zip_code": 56352, + "latitude": 45.614071, + "longitude": -94.634556, + "city": "Melrose", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56353, + "latitude": 45.90321, + "longitude": -93.620355, + "city": "Milaca", + "state": "MN", + "county": "Mille Lacs" + }, + { + "zip_code": 56354, + "latitude": 46.06187, + "longitude": -95.295146, + "city": "Miltona", + "state": "MN", + "county": "Douglas" + }, + { + "zip_code": 56355, + "latitude": 45.935551, + "longitude": -95.23975, + "city": "Nelson", + "state": "MN", + "county": "Douglas" + }, + { + "zip_code": 56356, + "latitude": 45.62974, + "longitude": -94.751937, + "city": "New Munich", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56357, + "latitude": 45.702225, + "longitude": -93.816445, + "city": "Oak Park", + "state": "MN", + "county": "Benton" + }, + { + "zip_code": 56358, + "latitude": 45.833199, + "longitude": -93.402621, + "city": "Ogilvie", + "state": "MN", + "county": "Kanabec" + }, + { + "zip_code": 56359, + "latitude": 45.943108, + "longitude": -93.663152, + "city": "Onamia", + "state": "MN", + "county": "Mille Lacs" + }, + { + "zip_code": 56360, + "latitude": 45.871169, + "longitude": -95.237474, + "city": "Osakis", + "state": "MN", + "county": "Douglas" + }, + { + "zip_code": 56361, + "latitude": 46.150334, + "longitude": -95.350438, + "city": "Parkers Prairie", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56362, + "latitude": 45.506403, + "longitude": -94.734316, + "city": "Paynesville", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56363, + "latitude": 45.697362, + "longitude": -93.646503, + "city": "Pease", + "state": "MN", + "county": "Mille Lacs" + }, + { + "zip_code": 56364, + "latitude": 45.994539, + "longitude": -94.123384, + "city": "Pierz", + "state": "MN", + "county": "Morrison" + }, + { + "zip_code": 56367, + "latitude": 45.745866, + "longitude": -94.124878, + "city": "Rice", + "state": "MN", + "county": "Benton" + }, + { + "zip_code": 56368, + "latitude": 45.460536, + "longitude": -94.536053, + "city": "Richmond", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56369, + "latitude": 45.468679, + "longitude": -94.340582, + "city": "Rockville", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56371, + "latitude": 45.426781, + "longitude": -94.633502, + "city": "Roscoe", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56372, + "latitude": 45.52886, + "longitude": -94.593338, + "city": "Saint Cloud", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56373, + "latitude": 45.871308, + "longitude": -94.161377, + "city": "Royalton", + "state": "MN", + "county": "Morrison" + }, + { + "zip_code": 56374, + "latitude": 45.614235, + "longitude": -94.350962, + "city": "Saint Joseph", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56375, + "latitude": 45.587011, + "longitude": -94.380968, + "city": "Saint Stephen", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56376, + "latitude": 45.489612, + "longitude": -94.718248, + "city": "Saint Martin", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56377, + "latitude": 45.573808, + "longitude": -94.355049, + "city": "Sartell", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56378, + "latitude": 45.638568, + "longitude": -94.974275, + "city": "Sauk Centre", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56379, + "latitude": 45.654829, + "longitude": -94.073533, + "city": "Sauk Rapids", + "state": "MN", + "county": "Benton" + }, + { + "zip_code": 56381, + "latitude": 45.572758, + "longitude": -95.573436, + "city": "Starbuck", + "state": "MN", + "county": "Pope" + }, + { + "zip_code": 56382, + "latitude": 45.904382, + "longitude": -94.540074, + "city": "Swanville", + "state": "MN", + "county": "Morrison" + }, + { + "zip_code": 56384, + "latitude": 45.804875, + "longitude": -94.565187, + "city": "Upsala", + "state": "MN", + "county": "Morrison" + }, + { + "zip_code": 56385, + "latitude": 45.719299, + "longitude": -95.225097, + "city": "Villard", + "state": "MN", + "county": "Pope" + }, + { + "zip_code": 56386, + "latitude": 45.989733, + "longitude": -93.620235, + "city": "Wahkon", + "state": "MN", + "county": "Mille Lacs" + }, + { + "zip_code": 56387, + "latitude": 45.510622, + "longitude": -94.667422, + "city": "Waite Park", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56388, + "latitude": "", + "longitude": "", + "city": "Waite Park", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56389, + "latitude": 45.799542, + "longitude": -95.08213, + "city": "West Union", + "state": "MN", + "county": "Todd" + }, + { + "zip_code": 56393, + "latitude": 45.52886, + "longitude": -94.593338, + "city": "Saint Cloud", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56395, + "latitude": 45.52886, + "longitude": -94.593338, + "city": "Saint Cloud", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56396, + "latitude": 45.52886, + "longitude": -94.593338, + "city": "Saint Cloud", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56397, + "latitude": 45.52886, + "longitude": -94.593338, + "city": "Saint Cloud", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56398, + "latitude": 45.52886, + "longitude": -94.593338, + "city": "Saint Cloud", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56399, + "latitude": 45.52886, + "longitude": -94.593338, + "city": "Saint Cloud", + "state": "MN", + "county": "Stearns" + }, + { + "zip_code": 56401, + "latitude": 46.350195, + "longitude": -94.099983, + "city": "Brainerd", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56425, + "latitude": 46.373474, + "longitude": -94.196884, + "city": "Baxter", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56430, + "latitude": 46.862332, + "longitude": -94.641872, + "city": "Ah Gwah Ching", + "state": "MN", + "county": "Cass" + }, + { + "zip_code": 56431, + "latitude": 46.563605, + "longitude": -93.430495, + "city": "Aitkin", + "state": "MN", + "county": "Aitkin" + }, + { + "zip_code": 56433, + "latitude": 46.987609, + "longitude": -94.726405, + "city": "Akeley", + "state": "MN", + "county": "Hubbard" + }, + { + "zip_code": 56434, + "latitude": 46.379683, + "longitude": -94.936381, + "city": "Aldrich", + "state": "MN", + "county": "Wadena" + }, + { + "zip_code": 56435, + "latitude": 46.803348, + "longitude": -94.521914, + "city": "Backus", + "state": "MN", + "county": "Cass" + }, + { + "zip_code": 56436, + "latitude": 47.108153, + "longitude": -94.921064, + "city": "Benedict", + "state": "MN", + "county": "Hubbard" + }, + { + "zip_code": 56437, + "latitude": 46.268233, + "longitude": -95.06077, + "city": "Bertha", + "state": "MN", + "county": "Todd" + }, + { + "zip_code": 56438, + "latitude": 46.063955, + "longitude": -94.867727, + "city": "Browerville", + "state": "MN", + "county": "Todd" + }, + { + "zip_code": 56440, + "latitude": 46.128416, + "longitude": -94.950401, + "city": "Clarissa", + "state": "MN", + "county": "Todd" + }, + { + "zip_code": 56441, + "latitude": 46.537059, + "longitude": -93.928197, + "city": "Crosby", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56442, + "latitude": 46.67734, + "longitude": -94.112783, + "city": "Crosslake", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56443, + "latitude": 46.205759, + "longitude": -94.561294, + "city": "Cushing", + "state": "MN", + "county": "Morrison" + }, + { + "zip_code": 56444, + "latitude": 46.429194, + "longitude": -93.878493, + "city": "Deerwood", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56446, + "latitude": 46.149778, + "longitude": -94.99949, + "city": "Eagle Bend", + "state": "MN", + "county": "Todd" + }, + { + "zip_code": 56447, + "latitude": 46.697119, + "longitude": -94.117266, + "city": "Emily", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56448, + "latitude": 46.727867, + "longitude": -94.040303, + "city": "Fifty Lakes", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56449, + "latitude": 46.200293, + "longitude": -94.245167, + "city": "Fort Ripley", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56450, + "latitude": 46.312962, + "longitude": -93.866016, + "city": "Garrison", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56452, + "latitude": 46.939139, + "longitude": -94.450641, + "city": "Hackensack", + "state": "MN", + "county": "Cass" + }, + { + "zip_code": 56453, + "latitude": 46.330157, + "longitude": -94.945126, + "city": "Hewitt", + "state": "MN", + "county": "Todd" + }, + { + "zip_code": 56455, + "latitude": 46.477792, + "longitude": -93.978854, + "city": "Ironton", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56456, + "latitude": 46.480723, + "longitude": -94.08587, + "city": "Jenkins", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56458, + "latitude": 47.108153, + "longitude": -94.921064, + "city": "Lake George", + "state": "MN", + "county": "Hubbard" + }, + { + "zip_code": 56459, + "latitude": 46.498749, + "longitude": -94.251926, + "city": "Lake Hubert", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56461, + "latitude": 47.108153, + "longitude": -94.921064, + "city": "Laporte", + "state": "MN", + "county": "Hubbard" + }, + { + "zip_code": 56464, + "latitude": 46.730538, + "longitude": -94.975221, + "city": "Menahga", + "state": "MN", + "county": "Wadena" + }, + { + "zip_code": 56465, + "latitude": 46.539308, + "longitude": -94.134385, + "city": "Merrifield", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56466, + "latitude": 46.288105, + "longitude": -94.563773, + "city": "Motley", + "state": "MN", + "county": "Morrison" + }, + { + "zip_code": 56467, + "latitude": 46.94336, + "longitude": -94.844112, + "city": "Nevis", + "state": "MN", + "county": "Hubbard" + }, + { + "zip_code": 56468, + "latitude": 46.401244, + "longitude": -94.237094, + "city": "Nisswa", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56469, + "latitude": 46.712878, + "longitude": -93.489808, + "city": "Palisade", + "state": "MN", + "county": "Aitkin" + }, + { + "zip_code": 56470, + "latitude": 46.984699, + "longitude": -95.09935, + "city": "Park Rapids", + "state": "MN", + "county": "Hubbard" + }, + { + "zip_code": 56472, + "latitude": 46.616147, + "longitude": -94.235561, + "city": "Pequot Lakes", + "state": "MN", + "county": "Crow Wing" + }, + { + "zip_code": 56473, + "latitude": 46.693034, + "longitude": -94.464381, + "city": "Pillager", + "state": "MN", + "county": "Cass" + }, + { + "zip_code": 56474, + "latitude": 46.712158, + "longitude": -94.251126, + "city": "Pine River", + "state": "MN", + "county": "Cass" + }, + { + "zip_code": 56475, + "latitude": 46.105236, + "longitude": -94.531738, + "city": "Randall", + "state": "MN", + "county": "Morrison" + }, + { + "zip_code": 56477, + "latitude": 46.652292, + "longitude": -94.974942, + "city": "Sebeka", + "state": "MN", + "county": "Wadena" + }, + { + "zip_code": 56478, + "latitude": 46.605266, + "longitude": -94.900729, + "city": "Nimrod", + "state": "MN", + "county": "Wadena" + }, + { + "zip_code": 56479, + "latitude": 46.250882, + "longitude": -94.934361, + "city": "Staples", + "state": "MN", + "county": "Todd" + }, + { + "zip_code": 56481, + "latitude": 46.506528, + "longitude": -94.967564, + "city": "Verndale", + "state": "MN", + "county": "Wadena" + }, + { + "zip_code": 56482, + "latitude": 46.564002, + "longitude": -95.082796, + "city": "Wadena", + "state": "MN", + "county": "Wadena" + }, + { + "zip_code": 56484, + "latitude": 47.067057, + "longitude": -94.489824, + "city": "Walker", + "state": "MN", + "county": "Cass" + }, + { + "zip_code": 56501, + "latitude": 46.834262, + "longitude": -95.746871, + "city": "Detroit Lakes", + "state": "MN", + "county": "Becker" + }, + { + "zip_code": 56502, + "latitude": 46.933961, + "longitude": -95.678375, + "city": "Detroit Lakes", + "state": "MN", + "county": "Becker" + }, + { + "zip_code": 56510, + "latitude": 47.325283, + "longitude": -96.597259, + "city": "Ada", + "state": "MN", + "county": "Norman" + }, + { + "zip_code": 56511, + "latitude": 46.850852, + "longitude": -95.995824, + "city": "Audubon", + "state": "MN", + "county": "Becker" + }, + { + "zip_code": 56513, + "latitude": 46.890034, + "longitude": -96.506156, + "city": "Baker", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56514, + "latitude": 46.649467, + "longitude": -96.391637, + "city": "Barnesville", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56515, + "latitude": 46.294519, + "longitude": -95.707485, + "city": "Battle Lake", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56516, + "latitude": 47.325198, + "longitude": -95.80918, + "city": "Bejou", + "state": "MN", + "county": "Mahnomen" + }, + { + "zip_code": 56517, + "latitude": 47.801705, + "longitude": -96.43368, + "city": "Beltrami", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56518, + "latitude": 46.412413, + "longitude": -95.713452, + "city": "Bluffton", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56519, + "latitude": 47.201971, + "longitude": -96.500374, + "city": "Borup", + "state": "MN", + "county": "Norman" + }, + { + "zip_code": 56520, + "latitude": 46.191367, + "longitude": -96.500224, + "city": "Breckenridge", + "state": "MN", + "county": "Wilkin" + }, + { + "zip_code": 56521, + "latitude": 46.979328, + "longitude": -95.912192, + "city": "Callaway", + "state": "MN", + "county": "Becker" + }, + { + "zip_code": 56522, + "latitude": 46.140224, + "longitude": -96.443327, + "city": "Campbell", + "state": "MN", + "county": "Wilkin" + }, + { + "zip_code": 56523, + "latitude": 47.683698, + "longitude": -96.87154, + "city": "Climax", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56524, + "latitude": 46.275667, + "longitude": -95.630788, + "city": "Clitherall", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56525, + "latitude": 46.890034, + "longitude": -96.506156, + "city": "Comstock", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56527, + "latitude": 46.392933, + "longitude": -95.318951, + "city": "Deer Creek", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56528, + "latitude": 46.57101, + "longitude": -95.728629, + "city": "Dent", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56529, + "latitude": 46.877143, + "longitude": -96.709806, + "city": "Dilworth", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56531, + "latitude": 45.997662, + "longitude": -95.963007, + "city": "Elbow Lake", + "state": "MN", + "county": "Grant" + }, + { + "zip_code": 56533, + "latitude": 46.380324, + "longitude": -96.132614, + "city": "Elizabeth", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56534, + "latitude": 46.483858, + "longitude": -96.097914, + "city": "Erhard", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56535, + "latitude": 47.665688, + "longitude": -95.99807, + "city": "Erskine", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56536, + "latitude": 47.077246, + "longitude": -96.503987, + "city": "Felton", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56537, + "latitude": 46.3194, + "longitude": -95.657003, + "city": "Fergus Falls", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56538, + "latitude": 46.412413, + "longitude": -95.713452, + "city": "Fergus Falls", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56540, + "latitude": 47.534788, + "longitude": -96.285663, + "city": "Fertile", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56541, + "latitude": 47.325074, + "longitude": -96.469194, + "city": "Flom", + "state": "MN", + "county": "Norman" + }, + { + "zip_code": 56542, + "latitude": 47.597727, + "longitude": -96.270444, + "city": "Fosston", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56543, + "latitude": 46.326166, + "longitude": -96.528032, + "city": "Foxhome", + "state": "MN", + "county": "Wilkin" + }, + { + "zip_code": 56544, + "latitude": 46.803165, + "longitude": -95.579405, + "city": "Frazee", + "state": "MN", + "county": "Becker" + }, + { + "zip_code": 56545, + "latitude": 47.372863, + "longitude": -96.264276, + "city": "Gary", + "state": "MN", + "county": "Norman" + }, + { + "zip_code": 56546, + "latitude": 46.890034, + "longitude": -96.506156, + "city": "Georgetown", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56547, + "latitude": 46.870695, + "longitude": -96.576425, + "city": "Glyndon", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56548, + "latitude": 47.350668, + "longitude": -96.82368, + "city": "Halstad", + "state": "MN", + "county": "Norman" + }, + { + "zip_code": 56549, + "latitude": 46.977738, + "longitude": -96.409155, + "city": "Hawley", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56550, + "latitude": 47.263731, + "longitude": -96.811279, + "city": "Hendrum", + "state": "MN", + "county": "Norman" + }, + { + "zip_code": 56551, + "latitude": 46.293243, + "longitude": -95.483624, + "city": "Henning", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56552, + "latitude": 46.972026, + "longitude": -96.25589, + "city": "Hitterdal", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56553, + "latitude": 46.326166, + "longitude": -96.528032, + "city": "Kent", + "state": "MN", + "county": "Wilkin" + }, + { + "zip_code": 56554, + "latitude": 46.891231, + "longitude": -96.102425, + "city": "Lake Park", + "state": "MN", + "county": "Becker" + }, + { + "zip_code": 56556, + "latitude": 47.637117, + "longitude": -95.884768, + "city": "Mcintosh", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56557, + "latitude": 47.287889, + "longitude": -95.939586, + "city": "Mahnomen", + "state": "MN", + "county": "Mahnomen" + }, + { + "zip_code": 56560, + "latitude": 46.803546, + "longitude": -96.557389, + "city": "Moorhead", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56561, + "latitude": 46.890034, + "longitude": -96.506156, + "city": "Moorhead", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56562, + "latitude": 46.890034, + "longitude": -96.506156, + "city": "Moorhead", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56563, + "latitude": 46.890034, + "longitude": -96.506156, + "city": "Moorhead", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56565, + "latitude": 46.326166, + "longitude": -96.528032, + "city": "Nashua", + "state": "MN", + "county": "Wilkin" + }, + { + "zip_code": 56566, + "latitude": 47.325198, + "longitude": -95.80918, + "city": "Naytahwaush", + "state": "MN", + "county": "Mahnomen" + }, + { + "zip_code": 56567, + "latitude": 46.491294, + "longitude": -95.366068, + "city": "New York Mills", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56568, + "latitude": 47.836367, + "longitude": -96.3504, + "city": "Nielsville", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56569, + "latitude": 47.10914, + "longitude": -95.782254, + "city": "Ogema", + "state": "MN", + "county": "Becker" + }, + { + "zip_code": 56570, + "latitude": 46.923974, + "longitude": -95.362298, + "city": "Osage", + "state": "MN", + "county": "Becker" + }, + { + "zip_code": 56571, + "latitude": 46.465546, + "longitude": -95.564365, + "city": "Ottertail", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56572, + "latitude": 46.611549, + "longitude": -96.059669, + "city": "Pelican Rapids", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56573, + "latitude": 46.597093, + "longitude": -95.822634, + "city": "Perham", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56574, + "latitude": 47.177615, + "longitude": -96.804613, + "city": "Perley", + "state": "MN", + "county": "Norman" + }, + { + "zip_code": 56575, + "latitude": 47.061724, + "longitude": -95.429915, + "city": "Ponsford", + "state": "MN", + "county": "Becker" + }, + { + "zip_code": 56576, + "latitude": 46.443365, + "longitude": -95.792367, + "city": "Richville", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56577, + "latitude": 46.933961, + "longitude": -95.678375, + "city": "Richwood", + "state": "MN", + "county": "Becker" + }, + { + "zip_code": 56578, + "latitude": 46.886152, + "longitude": -95.724599, + "city": "Rochert", + "state": "MN", + "county": "Becker" + }, + { + "zip_code": 56579, + "latitude": 46.529553, + "longitude": -96.349085, + "city": "Rothsay", + "state": "MN", + "county": "Wilkin" + }, + { + "zip_code": 56580, + "latitude": 46.779487, + "longitude": -96.651185, + "city": "Sabin", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56581, + "latitude": 47.320042, + "longitude": -96.54441, + "city": "Shelly", + "state": "MN", + "county": "Norman" + }, + { + "zip_code": 56583, + "latitude": 46.007415, + "longitude": -96.359342, + "city": "Tintah", + "state": "MN", + "county": "Traverse" + }, + { + "zip_code": 56584, + "latitude": 47.271463, + "longitude": -96.182441, + "city": "Twin Valley", + "state": "MN", + "county": "Norman" + }, + { + "zip_code": 56585, + "latitude": 47.0663, + "longitude": -96.258706, + "city": "Ulen", + "state": "MN", + "county": "Clay" + }, + { + "zip_code": 56586, + "latitude": 46.285081, + "longitude": -95.874117, + "city": "Underwood", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56587, + "latitude": 46.457968, + "longitude": -95.919355, + "city": "Vergas", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56588, + "latitude": 46.412413, + "longitude": -95.713452, + "city": "Vining", + "state": "MN", + "county": "Otter Tail" + }, + { + "zip_code": 56589, + "latitude": 47.184343, + "longitude": -95.939849, + "city": "Waubun", + "state": "MN", + "county": "Mahnomen" + }, + { + "zip_code": 56590, + "latitude": 45.934055, + "longitude": -96.012359, + "city": "Wendell", + "state": "MN", + "county": "Grant" + }, + { + "zip_code": 56591, + "latitude": 46.933961, + "longitude": -95.678375, + "city": "White Earth", + "state": "MN", + "county": "Becker" + }, + { + "zip_code": 56592, + "latitude": 47.631462, + "longitude": -95.889453, + "city": "Winger", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56593, + "latitude": 46.821648, + "longitude": -95.391968, + "city": "Wolf Lake", + "state": "MN", + "county": "Becker" + }, + { + "zip_code": 56594, + "latitude": 46.326166, + "longitude": -96.528032, + "city": "Wolverton", + "state": "MN", + "county": "Wilkin" + }, + { + "zip_code": 56601, + "latitude": 47.571964, + "longitude": -94.801272, + "city": "Bemidji", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56619, + "latitude": 47.625699, + "longitude": -94.822154, + "city": "Bemidji", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56621, + "latitude": 47.531644, + "longitude": -95.377949, + "city": "Bagley", + "state": "MN", + "county": "Clearwater" + }, + { + "zip_code": 56623, + "latitude": 48.750473, + "longitude": -94.84626, + "city": "Baudette", + "state": "MN", + "county": "Lake Of The Woods" + }, + { + "zip_code": 56626, + "latitude": 47.370372, + "longitude": -94.251376, + "city": "Bena", + "state": "MN", + "county": "Cass" + }, + { + "zip_code": 56627, + "latitude": 48.091615, + "longitude": -93.81606, + "city": "Big Falls", + "state": "MN", + "county": "Koochiching" + }, + { + "zip_code": 56628, + "latitude": 47.710353, + "longitude": -93.612694, + "city": "Bigfork", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 56629, + "latitude": 48.642546, + "longitude": -94.06358, + "city": "Birchdale", + "state": "MN", + "county": "Koochiching" + }, + { + "zip_code": 56630, + "latitude": 47.804493, + "longitude": -94.575871, + "city": "Blackduck", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56631, + "latitude": 47.087782, + "longitude": -93.921429, + "city": "Bowstring", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 56633, + "latitude": 47.327719, + "longitude": -94.476853, + "city": "Cass Lake", + "state": "MN", + "county": "Cass" + }, + { + "zip_code": 56634, + "latitude": 47.610498, + "longitude": -95.421104, + "city": "Clearbrook", + "state": "MN", + "county": "Clearwater" + }, + { + "zip_code": 56636, + "latitude": 47.46843, + "longitude": -93.810949, + "city": "Deer River", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 56637, + "latitude": 47.615375, + "longitude": -93.837811, + "city": "Talmoon", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 56639, + "latitude": 47.852226, + "longitude": -93.524252, + "city": "Effie", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 56641, + "latitude": 47.206552, + "longitude": -94.263384, + "city": "Federal Dam", + "state": "MN", + "county": "Cass" + }, + { + "zip_code": 56644, + "latitude": 47.715406, + "longitude": -95.470782, + "city": "Gonvick", + "state": "MN", + "county": "Clearwater" + }, + { + "zip_code": 56646, + "latitude": 47.836367, + "longitude": -96.3504, + "city": "Gully", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56647, + "latitude": 47.974989, + "longitude": -95.008708, + "city": "Hines", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56649, + "latitude": 48.232494, + "longitude": -93.640382, + "city": "International Falls", + "state": "MN", + "county": "Koochiching" + }, + { + "zip_code": 56650, + "latitude": 47.940789, + "longitude": -94.45001, + "city": "Kelliher", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56651, + "latitude": 47.836367, + "longitude": -96.3504, + "city": "Lengby", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56652, + "latitude": 47.585873, + "longitude": -95.375974, + "city": "Leonard", + "state": "MN", + "county": "Clearwater" + }, + { + "zip_code": 56653, + "latitude": 48.357144, + "longitude": -93.612836, + "city": "Littlefork", + "state": "MN", + "county": "Koochiching" + }, + { + "zip_code": 56654, + "latitude": 48.538803, + "longitude": -93.840769, + "city": "Loman", + "state": "MN", + "county": "Koochiching" + }, + { + "zip_code": 56655, + "latitude": 46.994097, + "longitude": -94.243551, + "city": "Longville", + "state": "MN", + "county": "Cass" + }, + { + "zip_code": 56657, + "latitude": 47.548518, + "longitude": -93.62356, + "city": "Marcell", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 56658, + "latitude": 48.27888, + "longitude": -93.755536, + "city": "Margie", + "state": "MN", + "county": "Koochiching" + }, + { + "zip_code": 56659, + "latitude": 47.661759, + "longitude": -94.015607, + "city": "Max", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 56660, + "latitude": 47.933964, + "longitude": -94.23693, + "city": "Mizpah", + "state": "MN", + "county": "Koochiching" + }, + { + "zip_code": 56661, + "latitude": 47.919215, + "longitude": -94.097415, + "city": "Northome", + "state": "MN", + "county": "Koochiching" + }, + { + "zip_code": 56662, + "latitude": 46.879043, + "longitude": -93.918172, + "city": "Outing", + "state": "MN", + "county": "Cass" + }, + { + "zip_code": 56663, + "latitude": 47.448274, + "longitude": -94.471485, + "city": "Pennington", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56666, + "latitude": 47.974989, + "longitude": -95.008708, + "city": "Ponemah", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56667, + "latitude": 47.974989, + "longitude": -95.008708, + "city": "Puposky", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56668, + "latitude": 48.603143, + "longitude": -93.29771, + "city": "Ranier", + "state": "MN", + "county": "Koochiching" + }, + { + "zip_code": 56669, + "latitude": 48.394721, + "longitude": -93.310667, + "city": "Ray", + "state": "MN", + "county": "Koochiching" + }, + { + "zip_code": 56670, + "latitude": 47.974989, + "longitude": -95.008708, + "city": "Redby", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56671, + "latitude": 47.974989, + "longitude": -95.008708, + "city": "Redlake", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56672, + "latitude": 47.095793, + "longitude": -94.021032, + "city": "Remer", + "state": "MN", + "county": "Cass" + }, + { + "zip_code": 56673, + "latitude": 48.769244, + "longitude": -95.747559, + "city": "Roosevelt", + "state": "MN", + "county": "Roseau" + }, + { + "zip_code": 56676, + "latitude": 47.585873, + "longitude": -95.375974, + "city": "Shevlin", + "state": "MN", + "county": "Clearwater" + }, + { + "zip_code": 56678, + "latitude": 47.974989, + "longitude": -95.008708, + "city": "Solway", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56679, + "latitude": 48.27888, + "longitude": -93.755536, + "city": "South International Falls", + "state": "MN", + "county": "Koochiching" + }, + { + "zip_code": 56680, + "latitude": 47.635946, + "longitude": -93.922032, + "city": "Spring Lake", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 56681, + "latitude": 47.624415, + "longitude": -94.187735, + "city": "Squaw Lake", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 56682, + "latitude": 48.769244, + "longitude": -95.747559, + "city": "Swift", + "state": "MN", + "county": "Roseau" + }, + { + "zip_code": 56683, + "latitude": 47.974989, + "longitude": -95.008708, + "city": "Tenstrike", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56684, + "latitude": 47.836367, + "longitude": -96.3504, + "city": "Trail", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56685, + "latitude": 47.974989, + "longitude": -95.008708, + "city": "Waskish", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56686, + "latitude": 48.820843, + "longitude": -94.933138, + "city": "Williams", + "state": "MN", + "county": "Lake Of The Woods" + }, + { + "zip_code": 56687, + "latitude": 47.974989, + "longitude": -95.008708, + "city": "Wilton", + "state": "MN", + "county": "Beltrami" + }, + { + "zip_code": 56688, + "latitude": 47.746177, + "longitude": -93.962961, + "city": "Wirt", + "state": "MN", + "county": "Itasca" + }, + { + "zip_code": 56701, + "latitude": 48.076333, + "longitude": -96.149002, + "city": "Thief River Falls", + "state": "MN", + "county": "Pennington" + }, + { + "zip_code": 56710, + "latitude": 48.191085, + "longitude": -96.998433, + "city": "Alvarado", + "state": "MN", + "county": "Marshall" + }, + { + "zip_code": 56711, + "latitude": 48.875164, + "longitude": -94.885668, + "city": "Angle Inlet", + "state": "MN", + "county": "Lake Of The Woods" + }, + { + "zip_code": 56712, + "latitude": 47.836367, + "longitude": -96.3504, + "city": "Angus", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56713, + "latitude": 48.331455, + "longitude": -96.816197, + "city": "Argyle", + "state": "MN", + "county": "Marshall" + }, + { + "zip_code": 56714, + "latitude": 48.774428, + "longitude": -96.020334, + "city": "Badger", + "state": "MN", + "county": "Roseau" + }, + { + "zip_code": 56715, + "latitude": 47.814152, + "longitude": -96.005263, + "city": "Brooks", + "state": "MN", + "county": "Red Lake" + }, + { + "zip_code": 56716, + "latitude": 47.705082, + "longitude": -96.412, + "city": "Crookston", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56720, + "latitude": 48.771938, + "longitude": -96.812921, + "city": "Donaldson", + "state": "MN", + "county": "Kittson" + }, + { + "zip_code": 56721, + "latitude": 47.874048, + "longitude": -96.924085, + "city": "East Grand Forks", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56722, + "latitude": 47.836367, + "longitude": -96.3504, + "city": "Euclid", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56723, + "latitude": 47.799949, + "longitude": -96.798532, + "city": "Fisher", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56724, + "latitude": 48.358371, + "longitude": -96.378062, + "city": "Gatzke", + "state": "MN", + "county": "Marshall" + }, + { + "zip_code": 56725, + "latitude": 48.144158, + "longitude": -95.804345, + "city": "Goodridge", + "state": "MN", + "county": "Pennington" + }, + { + "zip_code": 56726, + "latitude": 48.834783, + "longitude": -96.286287, + "city": "Greenbush", + "state": "MN", + "county": "Roseau" + }, + { + "zip_code": 56727, + "latitude": 48.358371, + "longitude": -96.378062, + "city": "Grygla", + "state": "MN", + "county": "Marshall" + }, + { + "zip_code": 56728, + "latitude": 48.774787, + "longitude": -96.942022, + "city": "Hallock", + "state": "MN", + "county": "Kittson" + }, + { + "zip_code": 56729, + "latitude": 48.771938, + "longitude": -96.812921, + "city": "Halma", + "state": "MN", + "county": "Kittson" + }, + { + "zip_code": 56731, + "latitude": 48.771938, + "longitude": -96.812921, + "city": "Humboldt", + "state": "MN", + "county": "Kittson" + }, + { + "zip_code": 56732, + "latitude": 48.565003, + "longitude": -96.53266, + "city": "Karlstad", + "state": "MN", + "county": "Kittson" + }, + { + "zip_code": 56733, + "latitude": 48.643714, + "longitude": -96.914605, + "city": "Kennedy", + "state": "MN", + "county": "Kittson" + }, + { + "zip_code": 56734, + "latitude": 48.771938, + "longitude": -96.812921, + "city": "Lake Bronson", + "state": "MN", + "county": "Kittson" + }, + { + "zip_code": 56735, + "latitude": 48.771938, + "longitude": -96.812921, + "city": "Lancaster", + "state": "MN", + "county": "Kittson" + }, + { + "zip_code": 56736, + "latitude": 47.681728, + "longitude": -96.154311, + "city": "Mentor", + "state": "MN", + "county": "Polk" + }, + { + "zip_code": 56737, + "latitude": 48.438104, + "longitude": -96.513779, + "city": "Middle River", + "state": "MN", + "county": "Marshall" + }, + { + "zip_code": 56738, + "latitude": 48.358371, + "longitude": -96.378062, + "city": "Newfolden", + "state": "MN", + "county": "Marshall" + }, + { + "zip_code": 56740, + "latitude": 48.771938, + "longitude": -96.812921, + "city": "Noyes", + "state": "MN", + "county": "Kittson" + }, + { + "zip_code": 56741, + "latitude": 48.875164, + "longitude": -94.885668, + "city": "Oak Island", + "state": "MN", + "county": "Lake Of The Woods" + }, + { + "zip_code": 56742, + "latitude": 47.838345, + "longitude": -95.853261, + "city": "Oklee", + "state": "MN", + "county": "Red Lake" + }, + { + "zip_code": 56744, + "latitude": 48.19941, + "longitude": -97.130755, + "city": "Oslo", + "state": "MN", + "county": "Marshall" + }, + { + "zip_code": 56748, + "latitude": 47.86217, + "longitude": -96.095883, + "city": "Plummer", + "state": "MN", + "county": "Red Lake" + }, + { + "zip_code": 56750, + "latitude": 47.885347, + "longitude": -96.270368, + "city": "Red Lake Falls", + "state": "MN", + "county": "Red Lake" + }, + { + "zip_code": 56751, + "latitude": 48.704839, + "longitude": -95.750383, + "city": "Roseau", + "state": "MN", + "county": "Roseau" + }, + { + "zip_code": 56754, + "latitude": 48.014969, + "longitude": -96.213472, + "city": "Saint Hilaire", + "state": "MN", + "county": "Pennington" + }, + { + "zip_code": 56755, + "latitude": 48.871994, + "longitude": -97.092442, + "city": "Saint Vincent", + "state": "MN", + "county": "Kittson" + }, + { + "zip_code": 56756, + "latitude": 48.769244, + "longitude": -95.747559, + "city": "Salol", + "state": "MN", + "county": "Roseau" + }, + { + "zip_code": 56757, + "latitude": 48.477158, + "longitude": -96.867548, + "city": "Stephen", + "state": "MN", + "county": "Marshall" + }, + { + "zip_code": 56758, + "latitude": 48.358371, + "longitude": -96.378062, + "city": "Strandquist", + "state": "MN", + "county": "Marshall" + }, + { + "zip_code": 56759, + "latitude": 48.749138, + "longitude": -96.062783, + "city": "Strathcona", + "state": "MN", + "county": "Roseau" + }, + { + "zip_code": 56760, + "latitude": 48.358371, + "longitude": -96.378062, + "city": "Viking", + "state": "MN", + "county": "Marshall" + }, + { + "zip_code": 56761, + "latitude": 48.769244, + "longitude": -95.747559, + "city": "Wannaska", + "state": "MN", + "county": "Roseau" + }, + { + "zip_code": 56762, + "latitude": 48.261376, + "longitude": -96.772583, + "city": "Warren", + "state": "MN", + "county": "Marshall" + }, + { + "zip_code": 56763, + "latitude": 48.900663, + "longitude": -95.250324, + "city": "Warroad", + "state": "MN", + "county": "Roseau" + }, + { + "zip_code": 57001, + "latitude": 42.931698, + "longitude": -96.624298, + "city": "Alcester", + "state": "SD", + "county": "Union" + }, + { + "zip_code": 57002, + "latitude": 44.304195, + "longitude": -96.667977, + "city": "Aurora", + "state": "SD", + "county": "Brookings" + }, + { + "zip_code": 57003, + "latitude": 43.64514, + "longitude": -96.814589, + "city": "Baltic", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57004, + "latitude": 42.842947, + "longitude": -96.681135, + "city": "Beresford", + "state": "SD", + "county": "Union" + }, + { + "zip_code": 57005, + "latitude": 43.603401, + "longitude": -96.793708, + "city": "Brandon", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57006, + "latitude": 44.355091, + "longitude": -96.762102, + "city": "Brookings", + "state": "SD", + "county": "Brookings" + }, + { + "zip_code": 57007, + "latitude": 44.369696, + "longitude": -96.790705, + "city": "Brookings", + "state": "SD", + "county": "Brookings" + }, + { + "zip_code": 57010, + "latitude": 42.827796, + "longitude": -96.847373, + "city": "Burbank", + "state": "SD", + "county": "Clay" + }, + { + "zip_code": 57012, + "latitude": 43.572888, + "longitude": -97.248418, + "city": "Canistota", + "state": "SD", + "county": "Mccook" + }, + { + "zip_code": 57013, + "latitude": 43.29831, + "longitude": -96.70718, + "city": "Canton", + "state": "SD", + "county": "Lincoln" + }, + { + "zip_code": 57014, + "latitude": 43.291296, + "longitude": -97.042271, + "city": "Centerville", + "state": "SD", + "county": "Turner" + }, + { + "zip_code": 57015, + "latitude": 43.408226, + "longitude": -96.983852, + "city": "Chancellor", + "state": "SD", + "county": "Turner" + }, + { + "zip_code": 57016, + "latitude": 43.895505, + "longitude": -96.928024, + "city": "Chester", + "state": "SD", + "county": "Lake" + }, + { + "zip_code": 57017, + "latitude": 43.984778, + "longitude": -96.814237, + "city": "Colman", + "state": "SD", + "county": "Moody" + }, + { + "zip_code": 57018, + "latitude": 43.790192, + "longitude": -96.907845, + "city": "Colton", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57020, + "latitude": 43.666894, + "longitude": -96.822137, + "city": "Crooks", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57021, + "latitude": 43.272502, + "longitude": -96.983494, + "city": "Davis", + "state": "SD", + "county": "Turner" + }, + { + "zip_code": 57022, + "latitude": 43.803585, + "longitude": -96.699766, + "city": "Dell Rapids", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57024, + "latitude": 43.998434, + "longitude": -96.648034, + "city": "Egan", + "state": "SD", + "county": "Moody" + }, + { + "zip_code": 57025, + "latitude": 42.76399, + "longitude": -96.676742, + "city": "Elk Point", + "state": "SD", + "county": "Union" + }, + { + "zip_code": 57026, + "latitude": 44.289677, + "longitude": -96.540249, + "city": "Elkton", + "state": "SD", + "county": "Brookings" + }, + { + "zip_code": 57027, + "latitude": 43.197041, + "longitude": -96.513506, + "city": "Fairview", + "state": "SD", + "county": "Lincoln" + }, + { + "zip_code": 57028, + "latitude": 43.984004, + "longitude": -96.616189, + "city": "Flandreau", + "state": "SD", + "county": "Moody" + }, + { + "zip_code": 57029, + "latitude": 43.321384, + "longitude": -97.547869, + "city": "Freeman", + "state": "SD", + "county": "Hutchinson" + }, + { + "zip_code": 57030, + "latitude": 43.747639, + "longitude": -96.596379, + "city": "Garretson", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57031, + "latitude": 42.886136, + "longitude": -97.209902, + "city": "Gayville", + "state": "SD", + "county": "Yankton" + }, + { + "zip_code": 57032, + "latitude": 43.425258, + "longitude": -96.659737, + "city": "Harrisburg", + "state": "SD", + "county": "Lincoln" + }, + { + "zip_code": 57033, + "latitude": 43.630545, + "longitude": -96.814539, + "city": "Hartford", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57034, + "latitude": 43.184976, + "longitude": -96.580939, + "city": "Hudson", + "state": "SD", + "county": "Lincoln" + }, + { + "zip_code": 57035, + "latitude": 43.637836, + "longitude": -96.816129, + "city": "Humboldt", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57036, + "latitude": 43.278943, + "longitude": -97.141677, + "city": "Hurley", + "state": "SD", + "county": "Turner" + }, + { + "zip_code": 57037, + "latitude": 43.068331, + "longitude": -97.130498, + "city": "Irene", + "state": "SD", + "county": "Clay" + }, + { + "zip_code": 57038, + "latitude": 42.580112, + "longitude": -96.576256, + "city": "Jefferson", + "state": "SD", + "county": "Union" + }, + { + "zip_code": 57039, + "latitude": 43.298098, + "longitude": -96.856021, + "city": "Lennox", + "state": "SD", + "county": "Lincoln" + }, + { + "zip_code": 57040, + "latitude": 43.06062, + "longitude": -97.568901, + "city": "Lesterville", + "state": "SD", + "county": "Yankton" + }, + { + "zip_code": 57041, + "latitude": 43.728488, + "longitude": -96.870928, + "city": "Lyons", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57042, + "latitude": 44.054223, + "longitude": -97.091339, + "city": "Madison", + "state": "SD", + "county": "Lake" + }, + { + "zip_code": 57043, + "latitude": 43.292364, + "longitude": -97.278318, + "city": "Marion", + "state": "SD", + "county": "Turner" + }, + { + "zip_code": 57044, + "latitude": 42.840984, + "longitude": -97.091959, + "city": "Meckling", + "state": "SD", + "county": "Clay" + }, + { + "zip_code": 57045, + "latitude": 43.248825, + "longitude": -97.538733, + "city": "Menno", + "state": "SD", + "county": "Hutchinson" + }, + { + "zip_code": 57046, + "latitude": 42.969251, + "longitude": -97.297103, + "city": "Mission Hill", + "state": "SD", + "county": "Yankton" + }, + { + "zip_code": 57047, + "latitude": 43.489841, + "longitude": -97.250932, + "city": "Monroe", + "state": "SD", + "county": "Turner" + }, + { + "zip_code": 57048, + "latitude": 43.696853, + "longitude": -97.18593, + "city": "Montrose", + "state": "SD", + "county": "Mccook" + }, + { + "zip_code": 57049, + "latitude": 42.587483, + "longitude": -96.585026, + "city": "North Sioux City", + "state": "SD", + "county": "Union" + }, + { + "zip_code": 57050, + "latitude": 44.021983, + "longitude": -97.129455, + "city": "Nunda", + "state": "SD", + "county": "Lake" + }, + { + "zip_code": 57051, + "latitude": 44.245942, + "longitude": -97.32031, + "city": "Oldham", + "state": "SD", + "county": "Kingsbury" + }, + { + "zip_code": 57052, + "latitude": 43.284183, + "longitude": -97.718224, + "city": "Olivet", + "state": "SD", + "county": "Hutchinson" + }, + { + "zip_code": 57053, + "latitude": 43.399595, + "longitude": -97.134211, + "city": "Parker", + "state": "SD", + "county": "Turner" + }, + { + "zip_code": 57054, + "latitude": 44.1186, + "longitude": -97.215191, + "city": "Ramona", + "state": "SD", + "county": "Lake" + }, + { + "zip_code": 57055, + "latitude": 43.666979, + "longitude": -96.760473, + "city": "Renner", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57056, + "latitude": 43.521559, + "longitude": -96.558738, + "city": "Rowena", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57057, + "latitude": 44.021983, + "longitude": -97.129455, + "city": "Rutland", + "state": "SD", + "county": "Lake" + }, + { + "zip_code": 57058, + "latitude": 43.639298, + "longitude": -97.343417, + "city": "Salem", + "state": "SD", + "county": "Mccook" + }, + { + "zip_code": 57059, + "latitude": 43.024378, + "longitude": -97.783482, + "city": "Scotland", + "state": "SD", + "county": "Bon Homme" + }, + { + "zip_code": 57061, + "latitude": 44.242764, + "longitude": -97.018205, + "city": "Sinai", + "state": "SD", + "county": "Brookings" + }, + { + "zip_code": 57062, + "latitude": 42.881672, + "longitude": -97.926212, + "city": "Springfield", + "state": "SD", + "county": "Bon Homme" + }, + { + "zip_code": 57063, + "latitude": 42.947515, + "longitude": -97.714195, + "city": "Tabor", + "state": "SD", + "county": "Bon Homme" + }, + { + "zip_code": 57064, + "latitude": 43.41434, + "longitude": -96.842783, + "city": "Tea", + "state": "SD", + "county": "Lincoln" + }, + { + "zip_code": 57065, + "latitude": 43.907616, + "longitude": -96.653301, + "city": "Trent", + "state": "SD", + "county": "Moody" + }, + { + "zip_code": 57066, + "latitude": 42.98853, + "longitude": -97.873263, + "city": "Tyndall", + "state": "SD", + "county": "Bon Homme" + }, + { + "zip_code": 57067, + "latitude": 43.016376, + "longitude": -97.369385, + "city": "Utica", + "state": "SD", + "county": "Yankton" + }, + { + "zip_code": 57068, + "latitude": 43.594402, + "longitude": -96.528511, + "city": "Valley Springs", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57069, + "latitude": 42.854124, + "longitude": -96.973318, + "city": "Vermillion", + "state": "SD", + "county": "Clay" + }, + { + "zip_code": 57070, + "latitude": 43.188383, + "longitude": -97.180373, + "city": "Viborg", + "state": "SD", + "county": "Turner" + }, + { + "zip_code": 57071, + "latitude": 44.369694, + "longitude": -96.790512, + "city": "Volga", + "state": "SD", + "county": "Brookings" + }, + { + "zip_code": 57072, + "latitude": 43.002044, + "longitude": -97.239829, + "city": "Volin", + "state": "SD", + "county": "Yankton" + }, + { + "zip_code": 57073, + "latitude": 42.996509, + "longitude": -97.058654, + "city": "Wakonda", + "state": "SD", + "county": "Clay" + }, + { + "zip_code": 57075, + "latitude": 43.996979, + "longitude": -96.967095, + "city": "Wentworth", + "state": "SD", + "county": "Lake" + }, + { + "zip_code": 57076, + "latitude": 44.021983, + "longitude": -97.129455, + "city": "Winfred", + "state": "SD", + "county": "Lake" + }, + { + "zip_code": 57077, + "latitude": 43.286596, + "longitude": -96.776784, + "city": "Worthing", + "state": "SD", + "county": "Lincoln" + }, + { + "zip_code": 57078, + "latitude": 42.94396, + "longitude": -97.37689, + "city": "Yankton", + "state": "SD", + "county": "Yankton" + }, + { + "zip_code": 57079, + "latitude": 42.867556, + "longitude": -97.390268, + "city": "Yankton", + "state": "SD", + "county": "Yankton" + }, + { + "zip_code": 57101, + "latitude": 43.546358, + "longitude": -96.69063, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57103, + "latitude": 43.548433, + "longitude": -96.63871, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57104, + "latitude": 43.589218, + "longitude": -96.685294, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57105, + "latitude": 43.518636, + "longitude": -96.732266, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57106, + "latitude": 43.529244, + "longitude": -96.780065, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57107, + "latitude": 43.600064, + "longitude": -96.801033, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57108, + "latitude": 43.550404, + "longitude": -96.696878, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57109, + "latitude": 43.674582, + "longitude": -96.79134, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57110, + "latitude": 43.548613, + "longitude": -96.633203, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57115, + "latitude": 43.521895, + "longitude": -96.868464, + "city": "Buffalo Ridge", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57117, + "latitude": 43.674582, + "longitude": -96.79134, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57118, + "latitude": 43.674582, + "longitude": -96.79134, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57186, + "latitude": "", + "longitude": "", + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57188, + "latitude": 43.674582, + "longitude": -96.79134, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57189, + "latitude": 43.674582, + "longitude": -96.79134, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57192, + "latitude": 43.674582, + "longitude": -96.79134, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57193, + "latitude": 43.674582, + "longitude": -96.79134, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57194, + "latitude": 43.674582, + "longitude": -96.79134, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57195, + "latitude": 43.674582, + "longitude": -96.79134, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57196, + "latitude": 43.674582, + "longitude": -96.79134, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57197, + "latitude": 43.674582, + "longitude": -96.79134, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57198, + "latitude": 43.674582, + "longitude": -96.79134, + "city": "Sioux Falls", + "state": "SD", + "county": "Minnehaha" + }, + { + "zip_code": 57201, + "latitude": 44.955643, + "longitude": -97.177954, + "city": "Watertown", + "state": "SD", + "county": "Codington" + }, + { + "zip_code": 57202, + "latitude": 44.977634, + "longitude": -97.188372, + "city": "Waverly", + "state": "SD", + "county": "Codington" + }, + { + "zip_code": 57212, + "latitude": 44.368264, + "longitude": -97.246086, + "city": "Arlington", + "state": "SD", + "county": "Kingsbury" + }, + { + "zip_code": 57213, + "latitude": 44.562302, + "longitude": -96.591264, + "city": "Astoria", + "state": "SD", + "county": "Deuel" + }, + { + "zip_code": 57214, + "latitude": 44.484381, + "longitude": -97.209173, + "city": "Badger", + "state": "SD", + "county": "Kingsbury" + }, + { + "zip_code": 57216, + "latitude": 45.170552, + "longitude": -96.534574, + "city": "Big Stone City", + "state": "SD", + "county": "Grant" + }, + { + "zip_code": 57217, + "latitude": 44.90626, + "longitude": -97.708049, + "city": "Bradley", + "state": "SD", + "county": "Clark" + }, + { + "zip_code": 57218, + "latitude": 44.76048, + "longitude": -96.668424, + "city": "Brandt", + "state": "SD", + "county": "Deuel" + }, + { + "zip_code": 57219, + "latitude": 45.319218, + "longitude": -97.637812, + "city": "Bristol", + "state": "SD", + "county": "Day" + }, + { + "zip_code": 57220, + "latitude": 44.456735, + "longitude": -96.89302, + "city": "Bruce", + "state": "SD", + "county": "Brookings" + }, + { + "zip_code": 57221, + "latitude": 44.590094, + "longitude": -97.466776, + "city": "Bryant", + "state": "SD", + "county": "Hamlin" + }, + { + "zip_code": 57223, + "latitude": 44.65665, + "longitude": -97.116149, + "city": "Castlewood", + "state": "SD", + "county": "Hamlin" + }, + { + "zip_code": 57224, + "latitude": 45.616422, + "longitude": -96.849416, + "city": "Claire City", + "state": "SD", + "county": "Roberts" + }, + { + "zip_code": 57225, + "latitude": 44.891983, + "longitude": -97.832972, + "city": "Clark", + "state": "SD", + "county": "Clark" + }, + { + "zip_code": 57226, + "latitude": 44.761249, + "longitude": -96.690651, + "city": "Clear Lake", + "state": "SD", + "county": "Deuel" + }, + { + "zip_code": 57227, + "latitude": 45.616422, + "longitude": -96.849416, + "city": "Corona", + "state": "SD", + "county": "Roberts" + }, + { + "zip_code": 57231, + "latitude": 44.369482, + "longitude": -97.542049, + "city": "De Smet", + "state": "SD", + "county": "Kingsbury" + }, + { + "zip_code": 57232, + "latitude": 45.631054, + "longitude": -97.40057, + "city": "Eden", + "state": "SD", + "county": "Marshall" + }, + { + "zip_code": 57233, + "latitude": 44.470856, + "longitude": -97.370412, + "city": "Erwin", + "state": "SD", + "county": "Kingsbury" + }, + { + "zip_code": 57234, + "latitude": 44.673762, + "longitude": -97.188324, + "city": "Estelline", + "state": "SD", + "county": "Hamlin" + }, + { + "zip_code": 57235, + "latitude": 45.015481, + "longitude": -97.306014, + "city": "Florence", + "state": "SD", + "county": "Codington" + }, + { + "zip_code": 57236, + "latitude": 44.848565, + "longitude": -97.737227, + "city": "Garden City", + "state": "SD", + "county": "Clark" + }, + { + "zip_code": 57237, + "latitude": 44.792302, + "longitude": -96.45927, + "city": "Gary", + "state": "SD", + "county": "Deuel" + }, + { + "zip_code": 57238, + "latitude": 44.76048, + "longitude": -96.668424, + "city": "Goodwin", + "state": "SD", + "county": "Deuel" + }, + { + "zip_code": 57239, + "latitude": 45.369855, + "longitude": -97.603949, + "city": "Grenville", + "state": "SD", + "county": "Day" + }, + { + "zip_code": 57241, + "latitude": 44.657338, + "longitude": -97.20497, + "city": "Hayti", + "state": "SD", + "county": "Hamlin" + }, + { + "zip_code": 57242, + "latitude": 44.759144, + "longitude": -97.381575, + "city": "Hazel", + "state": "SD", + "county": "Hamlin" + }, + { + "zip_code": 57243, + "latitude": 44.929255, + "longitude": -97.391955, + "city": "Henry", + "state": "SD", + "county": "Codington" + }, + { + "zip_code": 57244, + "latitude": 44.425409, + "longitude": -97.289881, + "city": "Hetland", + "state": "SD", + "county": "Kingsbury" + }, + { + "zip_code": 57245, + "latitude": 44.892254, + "longitude": -96.917412, + "city": "Kranzburg", + "state": "SD", + "county": "Codington" + }, + { + "zip_code": 57246, + "latitude": 45.115408, + "longitude": -96.670622, + "city": "Labolt", + "state": "SD", + "county": "Grant" + }, + { + "zip_code": 57247, + "latitude": 45.717904, + "longitude": -97.470748, + "city": "Lake City", + "state": "SD", + "county": "Marshall" + }, + { + "zip_code": 57248, + "latitude": 44.588234, + "longitude": -97.142872, + "city": "Lake Norden", + "state": "SD", + "county": "Hamlin" + }, + { + "zip_code": 57249, + "latitude": 44.369159, + "longitude": -97.382824, + "city": "Lake Preston", + "state": "SD", + "county": "Kingsbury" + }, + { + "zip_code": 57251, + "latitude": 45.274296, + "longitude": -96.942159, + "city": "Marvin", + "state": "SD", + "county": "Grant" + }, + { + "zip_code": 57252, + "latitude": 45.171617, + "longitude": -96.629203, + "city": "Milbank", + "state": "SD", + "county": "Grant" + }, + { + "zip_code": 57253, + "latitude": 45.151477, + "longitude": -96.839235, + "city": "Milbank", + "state": "SD", + "county": "Grant" + }, + { + "zip_code": 57255, + "latitude": 45.616422, + "longitude": -96.849416, + "city": "New Effington", + "state": "SD", + "county": "Roberts" + }, + { + "zip_code": 57256, + "latitude": 45.616422, + "longitude": -96.849416, + "city": "Ortley", + "state": "SD", + "county": "Roberts" + }, + { + "zip_code": 57257, + "latitude": 45.542151, + "longitude": -96.951675, + "city": "Peever", + "state": "SD", + "county": "Roberts" + }, + { + "zip_code": 57258, + "latitude": 44.910756, + "longitude": -97.939298, + "city": "Raymond", + "state": "SD", + "county": "Clark" + }, + { + "zip_code": 57259, + "latitude": 45.080517, + "longitude": -96.555664, + "city": "Revillo", + "state": "SD", + "county": "Grant" + }, + { + "zip_code": 57260, + "latitude": 45.616422, + "longitude": -96.849416, + "city": "Rosholt", + "state": "SD", + "county": "Roberts" + }, + { + "zip_code": 57261, + "latitude": 45.369855, + "longitude": -97.603949, + "city": "Roslyn", + "state": "SD", + "county": "Day" + }, + { + "zip_code": 57262, + "latitude": 45.541443, + "longitude": -96.970202, + "city": "Sisseton", + "state": "SD", + "county": "Roberts" + }, + { + "zip_code": 57263, + "latitude": 45.100745, + "longitude": -97.036356, + "city": "South Shore", + "state": "SD", + "county": "Codington" + }, + { + "zip_code": 57264, + "latitude": 45.106694, + "longitude": -96.802259, + "city": "Stockholm", + "state": "SD", + "county": "Grant" + }, + { + "zip_code": 57265, + "latitude": 45.021579, + "longitude": -96.74078, + "city": "Strandburg", + "state": "SD", + "county": "Grant" + }, + { + "zip_code": 57266, + "latitude": 45.30204, + "longitude": -97.036537, + "city": "Summit", + "state": "SD", + "county": "Roberts" + }, + { + "zip_code": 57268, + "latitude": 44.567419, + "longitude": -96.59444, + "city": "Toronto", + "state": "SD", + "county": "Deuel" + }, + { + "zip_code": 57269, + "latitude": 45.230876, + "longitude": -96.823706, + "city": "Twin Brooks", + "state": "SD", + "county": "Grant" + }, + { + "zip_code": 57270, + "latitude": 45.849458, + "longitude": -97.376617, + "city": "Veblen", + "state": "SD", + "county": "Marshall" + }, + { + "zip_code": 57271, + "latitude": 44.848565, + "longitude": -97.737227, + "city": "Vienna", + "state": "SD", + "county": "Clark" + }, + { + "zip_code": 57272, + "latitude": 45.093607, + "longitude": -97.453149, + "city": "Wallace", + "state": "SD", + "county": "Codington" + }, + { + "zip_code": 57273, + "latitude": 45.332568, + "longitude": -97.307239, + "city": "Waubay", + "state": "SD", + "county": "Day" + }, + { + "zip_code": 57274, + "latitude": 45.31506, + "longitude": -97.525395, + "city": "Webster", + "state": "SD", + "county": "Day" + }, + { + "zip_code": 57276, + "latitude": 44.405596, + "longitude": -96.599788, + "city": "White", + "state": "SD", + "county": "Brookings" + }, + { + "zip_code": 57278, + "latitude": 44.659815, + "longitude": -97.573152, + "city": "Willow Lake", + "state": "SD", + "county": "Clark" + }, + { + "zip_code": 57279, + "latitude": 45.39857, + "longitude": -96.832256, + "city": "Wilmot", + "state": "SD", + "county": "Roberts" + }, + { + "zip_code": 57301, + "latitude": 43.69591, + "longitude": -98.086401, + "city": "Mitchell", + "state": "SD", + "county": "Davison" + }, + { + "zip_code": 57311, + "latitude": 43.66844, + "longitude": -97.75632, + "city": "Alexandria", + "state": "SD", + "county": "Hanson" + }, + { + "zip_code": 57312, + "latitude": 44.122811, + "longitude": -98.412198, + "city": "Alpena", + "state": "SD", + "county": "Jerauld" + }, + { + "zip_code": 57313, + "latitude": 43.341035, + "longitude": -98.398964, + "city": "Armour", + "state": "SD", + "county": "Douglas" + }, + { + "zip_code": 57314, + "latitude": 44.020961, + "longitude": -98.01144, + "city": "Artesian", + "state": "SD", + "county": "Sanborn" + }, + { + "zip_code": 57315, + "latitude": 42.988284, + "longitude": -97.878579, + "city": "Avon", + "state": "SD", + "county": "Bon Homme" + }, + { + "zip_code": 57317, + "latitude": 43.248832, + "longitude": -99.016376, + "city": "Bonesteel", + "state": "SD", + "county": "Gregory" + }, + { + "zip_code": 57319, + "latitude": 43.550264, + "longitude": -97.469058, + "city": "Bridgewater", + "state": "SD", + "county": "Mccook" + }, + { + "zip_code": 57321, + "latitude": 43.892123, + "longitude": -97.540053, + "city": "Canova", + "state": "SD", + "county": "Miner" + }, + { + "zip_code": 57322, + "latitude": 44.848565, + "longitude": -97.737227, + "city": "Carpenter", + "state": "SD", + "county": "Clark" + }, + { + "zip_code": 57323, + "latitude": 44.138176, + "longitude": -97.720661, + "city": "Carthage", + "state": "SD", + "county": "Miner" + }, + { + "zip_code": 57324, + "latitude": 44.325314, + "longitude": -98.013968, + "city": "Cavour", + "state": "SD", + "county": "Beadle" + }, + { + "zip_code": 57325, + "latitude": 43.772585, + "longitude": -99.149806, + "city": "Chamberlain", + "state": "SD", + "county": "Brule" + }, + { + "zip_code": 57326, + "latitude": 43.71725, + "longitude": -99.131736, + "city": "Chamberlain", + "state": "SD", + "county": "Brule" + }, + { + "zip_code": 57328, + "latitude": 43.420306, + "longitude": -98.439859, + "city": "Corsica", + "state": "SD", + "county": "Douglas" + }, + { + "zip_code": 57329, + "latitude": 42.984707, + "longitude": -98.175204, + "city": "Dante", + "state": "SD", + "county": "Charles Mix" + }, + { + "zip_code": 57330, + "latitude": 43.290614, + "longitude": -98.178372, + "city": "Delmont", + "state": "SD", + "county": "Douglas" + }, + { + "zip_code": 57331, + "latitude": 43.470444, + "longitude": -97.999352, + "city": "Dimock", + "state": "SD", + "county": "Hutchinson" + }, + { + "zip_code": 57332, + "latitude": 43.586451, + "longitude": -97.65539, + "city": "Emery", + "state": "SD", + "county": "Hanson" + }, + { + "zip_code": 57334, + "latitude": 43.59997, + "longitude": -98.074101, + "city": "Ethan", + "state": "SD", + "county": "Davison" + }, + { + "zip_code": 57335, + "latitude": 43.248832, + "longitude": -99.016376, + "city": "Fairfax", + "state": "SD", + "county": "Gregory" + }, + { + "zip_code": 57337, + "latitude": 44.001852, + "longitude": -97.750838, + "city": "Fedora", + "state": "SD", + "county": "Miner" + }, + { + "zip_code": 57339, + "latitude": 44.064873, + "longitude": -99.251509, + "city": "Fort Thompson", + "state": "SD", + "county": "Buffalo" + }, + { + "zip_code": 57340, + "latitude": 43.762939, + "longitude": -97.869025, + "city": "Fulton", + "state": "SD", + "county": "Hanson" + }, + { + "zip_code": 57341, + "latitude": 44.064873, + "longitude": -99.251509, + "city": "Gann Valley", + "state": "SD", + "county": "Buffalo" + }, + { + "zip_code": 57342, + "latitude": 43.251263, + "longitude": -98.736404, + "city": "Geddes", + "state": "SD", + "county": "Charles Mix" + }, + { + "zip_code": 57344, + "latitude": 43.409186, + "longitude": -98.528068, + "city": "Harrison", + "state": "SD", + "county": "Douglas" + }, + { + "zip_code": 57345, + "latitude": 44.574651, + "longitude": -99.486417, + "city": "Highmore", + "state": "SD", + "county": "Hyde" + }, + { + "zip_code": 57346, + "latitude": 44.545094, + "longitude": -99.488221, + "city": "Stephan", + "state": "SD", + "county": "Hyde" + }, + { + "zip_code": 57348, + "latitude": 44.567404, + "longitude": -98.406424, + "city": "Hitchcock", + "state": "SD", + "county": "Beadle" + }, + { + "zip_code": 57349, + "latitude": 44.037102, + "longitude": -97.56034, + "city": "Howard", + "state": "SD", + "county": "Miner" + }, + { + "zip_code": 57350, + "latitude": 44.398874, + "longitude": -98.180113, + "city": "Huron", + "state": "SD", + "county": "Beadle" + }, + { + "zip_code": 57353, + "latitude": 44.369593, + "longitude": -97.652194, + "city": "Iroquois", + "state": "SD", + "county": "Kingsbury" + }, + { + "zip_code": 57354, + "latitude": 43.334069, + "longitude": -97.756924, + "city": "Kaylor", + "state": "SD", + "county": "Hutchinson" + }, + { + "zip_code": 57355, + "latitude": 43.744477, + "longitude": -98.95381, + "city": "Kimball", + "state": "SD", + "county": "Brule" + }, + { + "zip_code": 57356, + "latitude": 43.147572, + "longitude": -98.527479, + "city": "Lake Andes", + "state": "SD", + "county": "Charles Mix" + }, + { + "zip_code": 57357, + "latitude": 43.136365, + "longitude": -98.427173, + "city": "Ravinia", + "state": "SD", + "county": "Charles Mix" + }, + { + "zip_code": 57358, + "latitude": 44.069628, + "longitude": -98.425228, + "city": "Lane", + "state": "SD", + "county": "Jerauld" + }, + { + "zip_code": 57359, + "latitude": 43.953471, + "longitude": -98.151193, + "city": "Letcher", + "state": "SD", + "county": "Sanborn" + }, + { + "zip_code": 57361, + "latitude": 43.01957, + "longitude": -98.446929, + "city": "Marty", + "state": "SD", + "county": "Charles Mix" + }, + { + "zip_code": 57362, + "latitude": 44.480979, + "longitude": -99.062766, + "city": "Miller", + "state": "SD", + "county": "Hand" + }, + { + "zip_code": 57363, + "latitude": 43.674994, + "longitude": -98.164483, + "city": "Mount Vernon", + "state": "SD", + "county": "Davison" + }, + { + "zip_code": 57364, + "latitude": 43.427358, + "longitude": -98.608778, + "city": "New Holland", + "state": "SD", + "county": "Douglas" + }, + { + "zip_code": 57365, + "latitude": 43.797502, + "longitude": -99.394735, + "city": "Oacoma", + "state": "SD", + "county": "Lyman" + }, + { + "zip_code": 57366, + "latitude": 43.383849, + "longitude": -97.915618, + "city": "Parkston", + "state": "SD", + "county": "Hutchinson" + }, + { + "zip_code": 57367, + "latitude": 43.067306, + "longitude": -98.522951, + "city": "Pickstown", + "state": "SD", + "county": "Charles Mix" + }, + { + "zip_code": 57368, + "latitude": 43.746753, + "longitude": -98.518533, + "city": "Plankinton", + "state": "SD", + "county": "Aurora" + }, + { + "zip_code": 57369, + "latitude": 43.2916, + "longitude": -98.767186, + "city": "Platte", + "state": "SD", + "county": "Charles Mix" + }, + { + "zip_code": 57370, + "latitude": 43.776542, + "longitude": -99.186931, + "city": "Pukwana", + "state": "SD", + "county": "Brule" + }, + { + "zip_code": 57371, + "latitude": 44.422833, + "longitude": -99.218556, + "city": "Ree Heights", + "state": "SD", + "county": "Hand" + }, + { + "zip_code": 57373, + "latitude": 44.495497, + "longitude": -98.869647, + "city": "Saint Lawrence", + "state": "SD", + "county": "Hand" + }, + { + "zip_code": 57374, + "latitude": 43.723565, + "longitude": -97.581441, + "city": "Spencer", + "state": "SD", + "county": "Mccook" + }, + { + "zip_code": 57375, + "latitude": 43.571628, + "longitude": -98.498361, + "city": "Stickney", + "state": "SD", + "county": "Aurora" + }, + { + "zip_code": 57376, + "latitude": 43.24846, + "longitude": -97.923502, + "city": "Tripp", + "state": "SD", + "county": "Hutchinson" + }, + { + "zip_code": 57379, + "latitude": 44.283816, + "longitude": -98.50273, + "city": "Virgil", + "state": "SD", + "county": "Beadle" + }, + { + "zip_code": 57380, + "latitude": 43.034725, + "longitude": -98.315504, + "city": "Wagner", + "state": "SD", + "county": "Charles Mix" + }, + { + "zip_code": 57381, + "latitude": 44.415437, + "longitude": -98.642453, + "city": "Wessington", + "state": "SD", + "county": "Beadle" + }, + { + "zip_code": 57382, + "latitude": 44.066415, + "longitude": -98.675133, + "city": "Wessington Springs", + "state": "SD", + "county": "Jerauld" + }, + { + "zip_code": 57383, + "latitude": 43.714955, + "longitude": -98.644922, + "city": "White Lake", + "state": "SD", + "county": "Aurora" + }, + { + "zip_code": 57384, + "latitude": 44.44945, + "longitude": -98.487894, + "city": "Wolsey", + "state": "SD", + "county": "Beadle" + }, + { + "zip_code": 57385, + "latitude": 44.04271, + "longitude": -98.231397, + "city": "Woonsocket", + "state": "SD", + "county": "Sanborn" + }, + { + "zip_code": 57386, + "latitude": 44.522526, + "longitude": -98.040081, + "city": "Yale", + "state": "SD", + "county": "Beadle" + }, + { + "zip_code": 57399, + "latitude": 44.414319, + "longitude": -98.279548, + "city": "Huron", + "state": "SD", + "county": "Beadle" + }, + { + "zip_code": 57401, + "latitude": 45.476172, + "longitude": -98.410405, + "city": "Aberdeen", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57402, + "latitude": 45.589567, + "longitude": -98.352014, + "city": "Aberdeen", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57420, + "latitude": 45.29069, + "longitude": -99.991823, + "city": "Akaska", + "state": "SD", + "county": "Walworth" + }, + { + "zip_code": 57421, + "latitude": 45.758528, + "longitude": -97.927389, + "city": "Amherst", + "state": "SD", + "county": "Marshall" + }, + { + "zip_code": 57422, + "latitude": 45.369855, + "longitude": -97.603949, + "city": "Andover", + "state": "SD", + "county": "Day" + }, + { + "zip_code": 57424, + "latitude": 45.046485, + "longitude": -98.397319, + "city": "Ashton", + "state": "SD", + "county": "Spink" + }, + { + "zip_code": 57426, + "latitude": 45.735409, + "longitude": -98.569848, + "city": "Barnard", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57427, + "latitude": 45.626851, + "longitude": -98.270454, + "city": "Bath", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57428, + "latitude": 45.469377, + "longitude": -99.595667, + "city": "Bowdle", + "state": "SD", + "county": "Edmunds" + }, + { + "zip_code": 57429, + "latitude": 45.163452, + "longitude": -98.319296, + "city": "Brentford", + "state": "SD", + "county": "Spink" + }, + { + "zip_code": 57430, + "latitude": 45.761704, + "longitude": -97.72957, + "city": "Britton", + "state": "SD", + "county": "Marshall" + }, + { + "zip_code": 57432, + "latitude": 45.682867, + "longitude": -98.051948, + "city": "Claremont", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57433, + "latitude": 45.537847, + "longitude": -98.339885, + "city": "Columbia", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57434, + "latitude": 45.139317, + "longitude": -98.15339, + "city": "Conde", + "state": "SD", + "county": "Spink" + }, + { + "zip_code": 57435, + "latitude": 45.136245, + "longitude": -98.915424, + "city": "Cresbard", + "state": "SD", + "county": "Faulk" + }, + { + "zip_code": 57436, + "latitude": 44.846523, + "longitude": -98.10236, + "city": "Doland", + "state": "SD", + "county": "Spink" + }, + { + "zip_code": 57437, + "latitude": 45.77074, + "longitude": -99.330778, + "city": "Eureka", + "state": "SD", + "county": "Mcpherson" + }, + { + "zip_code": 57438, + "latitude": 45.085504, + "longitude": -99.195418, + "city": "Faulkton", + "state": "SD", + "county": "Faulk" + }, + { + "zip_code": 57439, + "latitude": 45.32904, + "longitude": -98.083721, + "city": "Ferney", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57440, + "latitude": 44.870365, + "longitude": -98.225875, + "city": "Frankfort", + "state": "SD", + "county": "Spink" + }, + { + "zip_code": 57441, + "latitude": 45.693116, + "longitude": -98.368918, + "city": "Frederick", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57442, + "latitude": 45.033588, + "longitude": -100.035273, + "city": "Gettysburg", + "state": "SD", + "county": "Potter" + }, + { + "zip_code": 57445, + "latitude": 45.589027, + "longitude": -98.245639, + "city": "Groton", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57446, + "latitude": 45.849431, + "longitude": -98.157861, + "city": "Hecla", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57448, + "latitude": 45.552579, + "longitude": -99.461653, + "city": "Hosmer", + "state": "SD", + "county": "Edmunds" + }, + { + "zip_code": 57449, + "latitude": 45.60711, + "longitude": -98.170069, + "city": "Houghton", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57450, + "latitude": 45.241265, + "longitude": -99.777259, + "city": "Hoven", + "state": "SD", + "county": "Potter" + }, + { + "zip_code": 57451, + "latitude": 45.421905, + "longitude": -99.258683, + "city": "Ipswich", + "state": "SD", + "county": "Edmunds" + }, + { + "zip_code": 57452, + "latitude": 45.449196, + "longitude": -99.821987, + "city": "Java", + "state": "SD", + "county": "Walworth" + }, + { + "zip_code": 57454, + "latitude": 45.692919, + "longitude": -97.768102, + "city": "Langford", + "state": "SD", + "county": "Marshall" + }, + { + "zip_code": 57455, + "latitude": 45.072088, + "longitude": -99.998438, + "city": "Lebanon", + "state": "SD", + "county": "Potter" + }, + { + "zip_code": 57456, + "latitude": 45.773436, + "longitude": -98.983305, + "city": "Leola", + "state": "SD", + "county": "Mcpherson" + }, + { + "zip_code": 57457, + "latitude": 45.882332, + "longitude": -99.169825, + "city": "Longlake", + "state": "SD", + "county": "Mcpherson" + }, + { + "zip_code": 57460, + "latitude": 45.22295, + "longitude": -98.599388, + "city": "Mansfield", + "state": "SD", + "county": "Spink" + }, + { + "zip_code": 57461, + "latitude": 45.155829, + "longitude": -98.426714, + "city": "Mellette", + "state": "SD", + "county": "Spink" + }, + { + "zip_code": 57462, + "latitude": 45.404015, + "longitude": -98.806895, + "city": "Mina", + "state": "SD", + "county": "Edmunds" + }, + { + "zip_code": 57465, + "latitude": 45.125985, + "longitude": -98.625836, + "city": "Northville", + "state": "SD", + "county": "Spink" + }, + { + "zip_code": 57466, + "latitude": 45.180068, + "longitude": -99.46426, + "city": "Onaka", + "state": "SD", + "county": "Faulk" + }, + { + "zip_code": 57467, + "latitude": 44.911775, + "longitude": -99.073204, + "city": "Orient", + "state": "SD", + "county": "Faulk" + }, + { + "zip_code": 57468, + "latitude": 45.369855, + "longitude": -97.603949, + "city": "Pierpont", + "state": "SD", + "county": "Day" + }, + { + "zip_code": 57469, + "latitude": 44.954101, + "longitude": -98.406878, + "city": "Redfield", + "state": "SD", + "county": "Spink" + }, + { + "zip_code": 57470, + "latitude": 45.033056, + "longitude": -98.882787, + "city": "Rockham", + "state": "SD", + "county": "Faulk" + }, + { + "zip_code": 57471, + "latitude": 45.419289, + "longitude": -99.346593, + "city": "Roscoe", + "state": "SD", + "county": "Edmunds" + }, + { + "zip_code": 57472, + "latitude": 45.434632, + "longitude": -100.098171, + "city": "Selby", + "state": "SD", + "county": "Walworth" + }, + { + "zip_code": 57473, + "latitude": 44.99142, + "longitude": -99.340678, + "city": "Seneca", + "state": "SD", + "county": "Faulk" + }, + { + "zip_code": 57474, + "latitude": 45.306691, + "longitude": -98.258376, + "city": "Stratford", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57475, + "latitude": 45.22375, + "longitude": -99.694578, + "city": "Tolstoy", + "state": "SD", + "county": "Potter" + }, + { + "zip_code": 57476, + "latitude": 44.893778, + "longitude": -98.402047, + "city": "Tulare", + "state": "SD", + "county": "Spink" + }, + { + "zip_code": 57477, + "latitude": 45.045466, + "longitude": -98.182922, + "city": "Turton", + "state": "SD", + "county": "Spink" + }, + { + "zip_code": 57479, + "latitude": 45.329227, + "longitude": -98.47485, + "city": "Warner", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57481, + "latitude": 45.670534, + "longitude": -98.580207, + "city": "Westport", + "state": "SD", + "county": "Brown" + }, + { + "zip_code": 57501, + "latitude": 44.334073, + "longitude": -100.094195, + "city": "Pierre", + "state": "SD", + "county": "Hughes" + }, + { + "zip_code": 57520, + "latitude": 44.802621, + "longitude": -100.158903, + "city": "Agar", + "state": "SD", + "county": "Sully" + }, + { + "zip_code": 57521, + "latitude": 43.691966, + "longitude": -101.601609, + "city": "Belvidere", + "state": "SD", + "county": "Jackson" + }, + { + "zip_code": 57522, + "latitude": 44.43719, + "longitude": -99.926952, + "city": "Blunt", + "state": "SD", + "county": "Hughes" + }, + { + "zip_code": 57523, + "latitude": 43.182547, + "longitude": -99.293674, + "city": "Burke", + "state": "SD", + "county": "Gregory" + }, + { + "zip_code": 57526, + "latitude": 43.382122, + "longitude": -99.88231, + "city": "Carter", + "state": "SD", + "county": "Tripp" + }, + { + "zip_code": 57528, + "latitude": 43.260083, + "longitude": -99.716537, + "city": "Colome", + "state": "SD", + "county": "Tripp" + }, + { + "zip_code": 57529, + "latitude": 43.23571, + "longitude": -99.515887, + "city": "Dallas", + "state": "SD", + "county": "Gregory" + }, + { + "zip_code": 57531, + "latitude": 43.938049, + "longitude": -100.701672, + "city": "Draper", + "state": "SD", + "county": "Jones" + }, + { + "zip_code": 57532, + "latitude": 44.343326, + "longitude": -100.635312, + "city": "Fort Pierre", + "state": "SD", + "county": "Stanley" + }, + { + "zip_code": 57533, + "latitude": 43.213649, + "longitude": -99.36219, + "city": "Gregory", + "state": "SD", + "county": "Gregory" + }, + { + "zip_code": 57534, + "latitude": 43.382122, + "longitude": -99.88231, + "city": "Hamill", + "state": "SD", + "county": "Tripp" + }, + { + "zip_code": 57536, + "latitude": 44.333927, + "longitude": -99.767237, + "city": "Harrold", + "state": "SD", + "county": "Hughes" + }, + { + "zip_code": 57537, + "latitude": 44.531281, + "longitude": -101.014052, + "city": "Hayes", + "state": "SD", + "county": "Stanley" + }, + { + "zip_code": 57538, + "latitude": 43.114883, + "longitude": -99.195945, + "city": "Herrick", + "state": "SD", + "county": "Gregory" + }, + { + "zip_code": 57540, + "latitude": 44.490558, + "longitude": -99.589344, + "city": "Holabird", + "state": "SD", + "county": "Hyde" + }, + { + "zip_code": 57541, + "latitude": 43.382122, + "longitude": -99.88231, + "city": "Ideal", + "state": "SD", + "county": "Tripp" + }, + { + "zip_code": 57542, + "latitude": 43.85862, + "longitude": -99.824337, + "city": "Iona", + "state": "SD", + "county": "Lyman" + }, + { + "zip_code": 57543, + "latitude": 43.824178, + "longitude": -101.389524, + "city": "Kadoka", + "state": "SD", + "county": "Jackson" + }, + { + "zip_code": 57544, + "latitude": 43.85862, + "longitude": -99.824337, + "city": "Kennebec", + "state": "SD", + "county": "Lyman" + }, + { + "zip_code": 57547, + "latitude": 43.691966, + "longitude": -101.601609, + "city": "Long Valley", + "state": "SD", + "county": "Jackson" + }, + { + "zip_code": 57548, + "latitude": 43.85862, + "longitude": -99.824337, + "city": "Lower Brule", + "state": "SD", + "county": "Lyman" + }, + { + "zip_code": 57551, + "latitude": 43.172158, + "longitude": -101.734068, + "city": "Martin", + "state": "SD", + "county": "Bennett" + }, + { + "zip_code": 57552, + "latitude": 44.370733, + "longitude": -101.527178, + "city": "Midland", + "state": "SD", + "county": "Haakon" + }, + { + "zip_code": 57553, + "latitude": 44.370733, + "longitude": -101.527178, + "city": "Milesville", + "state": "SD", + "county": "Haakon" + }, + { + "zip_code": 57555, + "latitude": 43.304572, + "longitude": -100.662079, + "city": "Mission", + "state": "SD", + "county": "Todd" + }, + { + "zip_code": 57557, + "latitude": 44.475844, + "longitude": -100.529517, + "city": "Mission Ridge", + "state": "SD", + "county": "Stanley" + }, + { + "zip_code": 57559, + "latitude": 43.879993, + "longitude": -100.75734, + "city": "Murdo", + "state": "SD", + "county": "Jones" + }, + { + "zip_code": 57560, + "latitude": 43.623523, + "longitude": -100.721218, + "city": "Norris", + "state": "SD", + "county": "Mellette" + }, + { + "zip_code": 57562, + "latitude": 43.938049, + "longitude": -100.701672, + "city": "Okaton", + "state": "SD", + "county": "Jones" + }, + { + "zip_code": 57563, + "latitude": 43.194063, + "longitude": -100.713373, + "city": "Okreek", + "state": "SD", + "county": "Todd" + }, + { + "zip_code": 57564, + "latitude": 44.722873, + "longitude": -99.979546, + "city": "Onida", + "state": "SD", + "county": "Sully" + }, + { + "zip_code": 57566, + "latitude": 43.194063, + "longitude": -100.713373, + "city": "Parmelee", + "state": "SD", + "county": "Todd" + }, + { + "zip_code": 57567, + "latitude": 44.046063, + "longitude": -101.630722, + "city": "Philip", + "state": "SD", + "county": "Haakon" + }, + { + "zip_code": 57568, + "latitude": 43.908372, + "longitude": -100.046855, + "city": "Presho", + "state": "SD", + "county": "Lyman" + }, + { + "zip_code": 57569, + "latitude": 43.85862, + "longitude": -99.824337, + "city": "Reliance", + "state": "SD", + "county": "Lyman" + }, + { + "zip_code": 57570, + "latitude": 43.302375, + "longitude": -100.626863, + "city": "Rosebud", + "state": "SD", + "county": "Todd" + }, + { + "zip_code": 57571, + "latitude": 43.248832, + "longitude": -99.016376, + "city": "Saint Charles", + "state": "SD", + "county": "Gregory" + }, + { + "zip_code": 57572, + "latitude": 43.194063, + "longitude": -100.713373, + "city": "Saint Francis", + "state": "SD", + "county": "Todd" + }, + { + "zip_code": 57574, + "latitude": 43.193203, + "longitude": -101.66933, + "city": "Tuthill", + "state": "SD", + "county": "Bennett" + }, + { + "zip_code": 57576, + "latitude": 43.85862, + "longitude": -99.824337, + "city": "Vivian", + "state": "SD", + "county": "Lyman" + }, + { + "zip_code": 57577, + "latitude": 43.691966, + "longitude": -101.601609, + "city": "Wanblee", + "state": "SD", + "county": "Jackson" + }, + { + "zip_code": 57578, + "latitude": 43.382122, + "longitude": -99.88231, + "city": "Wewela", + "state": "SD", + "county": "Tripp" + }, + { + "zip_code": 57579, + "latitude": 43.566116, + "longitude": -100.745912, + "city": "White River", + "state": "SD", + "county": "Mellette" + }, + { + "zip_code": 57580, + "latitude": 43.331763, + "longitude": -99.803286, + "city": "Winner", + "state": "SD", + "county": "Tripp" + }, + { + "zip_code": 57584, + "latitude": 43.382122, + "longitude": -99.88231, + "city": "Witten", + "state": "SD", + "county": "Tripp" + }, + { + "zip_code": 57585, + "latitude": 43.623523, + "longitude": -100.721218, + "city": "Wood", + "state": "SD", + "county": "Mellette" + }, + { + "zip_code": 57601, + "latitude": 45.550822, + "longitude": -100.330283, + "city": "Mobridge", + "state": "SD", + "county": "Walworth" + }, + { + "zip_code": 57620, + "latitude": 45.409748, + "longitude": -102.513087, + "city": "Bison", + "state": "SD", + "county": "Perkins" + }, + { + "zip_code": 57621, + "latitude": 45.847567, + "longitude": -101.09974, + "city": "Bullhead", + "state": "SD", + "county": "Corson" + }, + { + "zip_code": 57622, + "latitude": 44.992051, + "longitude": -101.568656, + "city": "Cherry Creek", + "state": "SD", + "county": "Ziebach" + }, + { + "zip_code": 57623, + "latitude": 45.050456, + "longitude": -101.607171, + "city": "Dupree", + "state": "SD", + "county": "Ziebach" + }, + { + "zip_code": 57625, + "latitude": 45.001611, + "longitude": -101.232885, + "city": "Eagle Butte", + "state": "SD", + "county": "Dewey" + }, + { + "zip_code": 57626, + "latitude": 45.024533, + "longitude": -102.026734, + "city": "Faith", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57628, + "latitude": 45.098685, + "longitude": -100.879214, + "city": "Firesteel", + "state": "SD", + "county": "Dewey" + }, + { + "zip_code": 57629, + "latitude": 44.992051, + "longitude": -101.568656, + "city": "Glad Valley", + "state": "SD", + "county": "Ziebach" + }, + { + "zip_code": 57630, + "latitude": 45.098685, + "longitude": -100.879214, + "city": "Glencross", + "state": "SD", + "county": "Dewey" + }, + { + "zip_code": 57631, + "latitude": 45.504288, + "longitude": -100.311701, + "city": "Glenham", + "state": "SD", + "county": "Walworth" + }, + { + "zip_code": 57632, + "latitude": 45.833733, + "longitude": -100.020048, + "city": "Herreid", + "state": "SD", + "county": "Campbell" + }, + { + "zip_code": 57633, + "latitude": 45.396212, + "longitude": -101.438525, + "city": "Isabel", + "state": "SD", + "county": "Dewey" + }, + { + "zip_code": 57634, + "latitude": 45.708402, + "longitude": -101.154581, + "city": "Keldron", + "state": "SD", + "county": "Corson" + }, + { + "zip_code": 57636, + "latitude": 45.098685, + "longitude": -100.879214, + "city": "Lantry", + "state": "SD", + "county": "Dewey" + }, + { + "zip_code": 57638, + "latitude": 45.732219, + "longitude": -102.410975, + "city": "Lemmon", + "state": "SD", + "county": "Perkins" + }, + { + "zip_code": 57639, + "latitude": 45.708402, + "longitude": -101.154581, + "city": "Little Eagle", + "state": "SD", + "county": "Corson" + }, + { + "zip_code": 57640, + "latitude": 45.703777, + "longitude": -102.663011, + "city": "Lodgepole", + "state": "SD", + "county": "Perkins" + }, + { + "zip_code": 57641, + "latitude": 45.708402, + "longitude": -101.154581, + "city": "Mc Intosh", + "state": "SD", + "county": "Corson" + }, + { + "zip_code": 57642, + "latitude": 45.876336, + "longitude": -100.891469, + "city": "Mc Laughlin", + "state": "SD", + "county": "Corson" + }, + { + "zip_code": 57643, + "latitude": 45.708402, + "longitude": -101.154581, + "city": "Mahto", + "state": "SD", + "county": "Corson" + }, + { + "zip_code": 57644, + "latitude": 45.453221, + "longitude": -102.280948, + "city": "Meadow", + "state": "SD", + "county": "Perkins" + }, + { + "zip_code": 57645, + "latitude": 45.708402, + "longitude": -101.154581, + "city": "Morristown", + "state": "SD", + "county": "Corson" + }, + { + "zip_code": 57646, + "latitude": 45.715461, + "longitude": -100.048071, + "city": "Mound City", + "state": "SD", + "county": "Campbell" + }, + { + "zip_code": 57647, + "latitude": 45.098685, + "longitude": -100.879214, + "city": "Parade", + "state": "SD", + "county": "Dewey" + }, + { + "zip_code": 57648, + "latitude": 45.844431, + "longitude": -100.283026, + "city": "Pollock", + "state": "SD", + "county": "Campbell" + }, + { + "zip_code": 57649, + "latitude": 45.440744, + "longitude": -102.704216, + "city": "Prairie City", + "state": "SD", + "county": "Perkins" + }, + { + "zip_code": 57650, + "latitude": 45.578941, + "longitude": -103.493668, + "city": "Ralph", + "state": "SD", + "county": "Harding" + }, + { + "zip_code": 57651, + "latitude": 45.578941, + "longitude": -103.493668, + "city": "Reva", + "state": "SD", + "county": "Harding" + }, + { + "zip_code": 57652, + "latitude": 45.098685, + "longitude": -100.879214, + "city": "Ridgeview", + "state": "SD", + "county": "Dewey" + }, + { + "zip_code": 57653, + "latitude": 45.680798, + "longitude": -102.292753, + "city": "Shadehill", + "state": "SD", + "county": "Perkins" + }, + { + "zip_code": 57656, + "latitude": 45.427032, + "longitude": -101.07469, + "city": "Timber Lake", + "state": "SD", + "county": "Dewey" + }, + { + "zip_code": 57657, + "latitude": 45.708402, + "longitude": -101.154581, + "city": "Trail City", + "state": "SD", + "county": "Corson" + }, + { + "zip_code": 57658, + "latitude": 45.655452, + "longitude": -100.537928, + "city": "Wakpala", + "state": "SD", + "county": "Corson" + }, + { + "zip_code": 57659, + "latitude": 45.708402, + "longitude": -101.154581, + "city": "Walker", + "state": "SD", + "county": "Corson" + }, + { + "zip_code": 57660, + "latitude": 45.708402, + "longitude": -101.154581, + "city": "Watauga", + "state": "SD", + "county": "Corson" + }, + { + "zip_code": 57661, + "latitude": 45.098685, + "longitude": -100.879214, + "city": "Whitehorse", + "state": "SD", + "county": "Dewey" + }, + { + "zip_code": 57701, + "latitude": 44.004363, + "longitude": -103.240024, + "city": "Rapid City", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57702, + "latitude": 44.003641, + "longitude": -103.358868, + "city": "Rapid City", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57703, + "latitude": 44.048039, + "longitude": -103.176287, + "city": "Rapid City", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57706, + "latitude": 44.185222, + "longitude": -103.229087, + "city": "Ellsworth Afb", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57709, + "latitude": 44.076106, + "longitude": -103.317149, + "city": "Rapid City", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57714, + "latitude": 43.193203, + "longitude": -101.66933, + "city": "Allen", + "state": "SD", + "county": "Bennett" + }, + { + "zip_code": 57716, + "latitude": 43.352617, + "longitude": -102.5411, + "city": "Batesland", + "state": "SD", + "county": "Shannon" + }, + { + "zip_code": 57717, + "latitude": 44.93037, + "longitude": -103.87313, + "city": "Belle Fourche", + "state": "SD", + "county": "Butte" + }, + { + "zip_code": 57718, + "latitude": 44.183216, + "longitude": -103.326118, + "city": "Black Hawk", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57719, + "latitude": 44.03667, + "longitude": -103.204293, + "city": "Box Elder", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57720, + "latitude": 45.576652, + "longitude": -103.911719, + "city": "Buffalo", + "state": "SD", + "county": "Harding" + }, + { + "zip_code": 57722, + "latitude": 43.666816, + "longitude": -103.371071, + "city": "Buffalo Gap", + "state": "SD", + "county": "Custer" + }, + { + "zip_code": 57724, + "latitude": 45.578941, + "longitude": -103.493668, + "city": "Camp Crook", + "state": "SD", + "county": "Harding" + }, + { + "zip_code": 57725, + "latitude": 43.948063, + "longitude": -102.793461, + "city": "Caputa", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57729, + "latitude": 44.312407, + "longitude": -102.150335, + "city": "Creighton", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57730, + "latitude": 43.657304, + "longitude": -103.425807, + "city": "Custer", + "state": "SD", + "county": "Custer" + }, + { + "zip_code": 57732, + "latitude": 44.36485, + "longitude": -103.735731, + "city": "Deadwood", + "state": "SD", + "county": "Lawrence" + }, + { + "zip_code": 57735, + "latitude": 43.294549, + "longitude": -103.830431, + "city": "Edgemont", + "state": "SD", + "county": "Fall River" + }, + { + "zip_code": 57736, + "latitude": 44.348777, + "longitude": -102.52386, + "city": "Elm Springs", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57737, + "latitude": 44.589806, + "longitude": -102.787188, + "city": "Enning", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57738, + "latitude": 43.685927, + "longitude": -103.20817, + "city": "Fairburn", + "state": "SD", + "county": "Custer" + }, + { + "zip_code": 57741, + "latitude": 44.40932, + "longitude": -103.455428, + "city": "Fort Meade", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57742, + "latitude": 44.66913, + "longitude": -103.697073, + "city": "Fruitdale", + "state": "SD", + "county": "Butte" + }, + { + "zip_code": 57744, + "latitude": 43.838528, + "longitude": -103.19146, + "city": "Hermosa", + "state": "SD", + "county": "Custer" + }, + { + "zip_code": 57745, + "latitude": 44.0082, + "longitude": -103.651357, + "city": "Hill City", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57747, + "latitude": 43.314186, + "longitude": -103.528353, + "city": "Hot Springs", + "state": "SD", + "county": "Fall River" + }, + { + "zip_code": 57748, + "latitude": 44.589806, + "longitude": -102.787188, + "city": "Howes", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57750, + "latitude": 43.691966, + "longitude": -101.601609, + "city": "Interior", + "state": "SD", + "county": "Jackson" + }, + { + "zip_code": 57751, + "latitude": 43.884764, + "longitude": -103.399471, + "city": "Keystone", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57752, + "latitude": 43.352617, + "longitude": -102.5411, + "city": "Kyle", + "state": "SD", + "county": "Shannon" + }, + { + "zip_code": 57754, + "latitude": 44.444505, + "longitude": -103.752683, + "city": "Lead", + "state": "SD", + "county": "Lawrence" + }, + { + "zip_code": 57755, + "latitude": 45.578941, + "longitude": -103.493668, + "city": "Ludlow", + "state": "SD", + "county": "Harding" + }, + { + "zip_code": 57756, + "latitude": 43.352617, + "longitude": -102.5411, + "city": "Manderson", + "state": "SD", + "county": "Shannon" + }, + { + "zip_code": 57758, + "latitude": 44.589806, + "longitude": -102.787188, + "city": "Mud Butte", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57759, + "latitude": 44.372688, + "longitude": -103.754204, + "city": "Nemo", + "state": "SD", + "county": "Lawrence" + }, + { + "zip_code": 57760, + "latitude": 44.715217, + "longitude": -103.417574, + "city": "Newell", + "state": "SD", + "county": "Butte" + }, + { + "zip_code": 57761, + "latitude": 44.056691, + "longitude": -102.79897, + "city": "New Underwood", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57762, + "latitude": 44.673533, + "longitude": -103.556354, + "city": "Nisland", + "state": "SD", + "county": "Butte" + }, + { + "zip_code": 57763, + "latitude": 43.180956, + "longitude": -103.243935, + "city": "Oelrichs", + "state": "SD", + "county": "Fall River" + }, + { + "zip_code": 57764, + "latitude": 43.352617, + "longitude": -102.5411, + "city": "Oglala", + "state": "SD", + "county": "Shannon" + }, + { + "zip_code": 57765, + "latitude": 44.589806, + "longitude": -102.787188, + "city": "Opal", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57766, + "latitude": 43.239655, + "longitude": -103.527757, + "city": "Oral", + "state": "SD", + "county": "Fall River" + }, + { + "zip_code": 57767, + "latitude": 44.067413, + "longitude": -102.680781, + "city": "Owanka", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57769, + "latitude": 44.220524, + "longitude": -103.272284, + "city": "Piedmont", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57770, + "latitude": 43.024319, + "longitude": -102.535178, + "city": "Pine Ridge", + "state": "SD", + "county": "Shannon" + }, + { + "zip_code": 57772, + "latitude": 43.352617, + "longitude": -102.5411, + "city": "Porcupine", + "state": "SD", + "county": "Shannon" + }, + { + "zip_code": 57773, + "latitude": 43.666816, + "longitude": -103.371071, + "city": "Pringle", + "state": "SD", + "county": "Custer" + }, + { + "zip_code": 57774, + "latitude": 43.239655, + "longitude": -103.527757, + "city": "Provo", + "state": "SD", + "county": "Fall River" + }, + { + "zip_code": 57775, + "latitude": 44.068731, + "longitude": -102.222633, + "city": "Quinn", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57776, + "latitude": 45.578941, + "longitude": -103.493668, + "city": "Redig", + "state": "SD", + "county": "Harding" + }, + { + "zip_code": 57777, + "latitude": 44.691005, + "longitude": -102.587048, + "city": "Red Owl", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57778, + "latitude": 44.117606, + "longitude": -103.761058, + "city": "Rochford", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57779, + "latitude": 44.547307, + "longitude": -103.723214, + "city": "Saint Onge", + "state": "SD", + "county": "Lawrence" + }, + { + "zip_code": 57780, + "latitude": 43.788416, + "longitude": -102.346797, + "city": "Scenic", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57782, + "latitude": 43.239655, + "longitude": -103.527757, + "city": "Smithwick", + "state": "SD", + "county": "Fall River" + }, + { + "zip_code": 57783, + "latitude": 44.467137, + "longitude": -103.772331, + "city": "Spearfish", + "state": "SD", + "county": "Lawrence" + }, + { + "zip_code": 57785, + "latitude": 44.369172, + "longitude": -103.361658, + "city": "Sturgis", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57787, + "latitude": 44.653923, + "longitude": -102.725189, + "city": "Union Center", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57788, + "latitude": 44.719176, + "longitude": -103.42562, + "city": "Vale", + "state": "SD", + "county": "Butte" + }, + { + "zip_code": 57790, + "latitude": 44.013772, + "longitude": -102.238397, + "city": "Wall", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57791, + "latitude": 44.016848, + "longitude": -102.59866, + "city": "Wasta", + "state": "SD", + "county": "Pennington" + }, + { + "zip_code": 57792, + "latitude": 44.589806, + "longitude": -102.787188, + "city": "White Owl", + "state": "SD", + "county": "Meade" + }, + { + "zip_code": 57793, + "latitude": 44.46498, + "longitude": -103.644136, + "city": "Whitewood", + "state": "SD", + "county": "Lawrence" + }, + { + "zip_code": 57794, + "latitude": 43.352617, + "longitude": -102.5411, + "city": "Wounded Knee", + "state": "SD", + "county": "Shannon" + }, + { + "zip_code": 57799, + "latitude": 44.495846, + "longitude": -103.870251, + "city": "Spearfish", + "state": "SD", + "county": "Lawrence" + }, + { + "zip_code": 58001, + "latitude": 46.447936, + "longitude": -96.727788, + "city": "Abercrombie", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58002, + "latitude": 46.859694, + "longitude": -97.214587, + "city": "Absaraka", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58004, + "latitude": 47.021032, + "longitude": -97.271545, + "city": "Amenia", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58005, + "latitude": 47.057026, + "longitude": -96.975162, + "city": "Argusville", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58006, + "latitude": 47.102334, + "longitude": -97.140334, + "city": "Arthur", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58007, + "latitude": 47.01392, + "longitude": -97.462894, + "city": "Ayr", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58008, + "latitude": 46.273086, + "longitude": -96.864373, + "city": "Barney", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58009, + "latitude": 47.454888, + "longitude": -97.151692, + "city": "Blanchard", + "state": "ND", + "county": "Traill" + }, + { + "zip_code": 58011, + "latitude": 46.920016, + "longitude": -97.557491, + "city": "Buffalo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58012, + "latitude": 47.050272, + "longitude": -97.062647, + "city": "Casselton", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58013, + "latitude": 46.062144, + "longitude": -97.529438, + "city": "Cayuga", + "state": "ND", + "county": "Sargent" + }, + { + "zip_code": 58014, + "latitude": 46.775027, + "longitude": -97.352437, + "city": "Chaffee", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58015, + "latitude": 46.593582, + "longitude": -96.809354, + "city": "Christine", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58016, + "latitude": 47.454888, + "longitude": -97.151692, + "city": "Clifford", + "state": "ND", + "county": "Traill" + }, + { + "zip_code": 58017, + "latitude": 46.06593, + "longitude": -97.820733, + "city": "Cogswell", + "state": "ND", + "county": "Sargent" + }, + { + "zip_code": 58018, + "latitude": 46.457386, + "longitude": -96.873653, + "city": "Colfax", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58021, + "latitude": 46.731743, + "longitude": -97.063137, + "city": "Davenport", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58027, + "latitude": 46.456337, + "longitude": -97.777909, + "city": "Enderlin", + "state": "ND", + "county": "Ransom" + }, + { + "zip_code": 58029, + "latitude": 47.115505, + "longitude": -97.377138, + "city": "Erie", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58030, + "latitude": 46.094599, + "longitude": -96.907594, + "city": "Fairmount", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58031, + "latitude": 46.775099, + "longitude": -97.797553, + "city": "Fingal", + "state": "ND", + "county": "Barnes" + }, + { + "zip_code": 58032, + "latitude": 46.058634, + "longitude": -97.633282, + "city": "Forman", + "state": "ND", + "county": "Sargent" + }, + { + "zip_code": 58033, + "latitude": 46.449387, + "longitude": -97.909114, + "city": "Fort Ransom", + "state": "ND", + "county": "Ransom" + }, + { + "zip_code": 58035, + "latitude": 47.270447, + "longitude": -97.408156, + "city": "Galesburg", + "state": "ND", + "county": "Traill" + }, + { + "zip_code": 58036, + "latitude": 47.157949, + "longitude": -96.957752, + "city": "Gardner", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58038, + "latitude": 47.072418, + "longitude": -96.96915, + "city": "Grandin", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58039, + "latitude": 46.160427, + "longitude": -96.843465, + "city": "Great Bend", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58040, + "latitude": 46.152725, + "longitude": -97.767735, + "city": "Gwinner", + "state": "ND", + "county": "Sargent" + }, + { + "zip_code": 58041, + "latitude": 46.073423, + "longitude": -96.92473, + "city": "Hankinson", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58042, + "latitude": 46.956511, + "longitude": -96.965445, + "city": "Harwood", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58043, + "latitude": 45.978943, + "longitude": -97.54423, + "city": "Havana", + "state": "ND", + "county": "Sargent" + }, + { + "zip_code": 58045, + "latitude": 47.383461, + "longitude": -97.060324, + "city": "Hillsboro", + "state": "ND", + "county": "Traill" + }, + { + "zip_code": 58046, + "latitude": 47.323726, + "longitude": -97.713371, + "city": "Hope", + "state": "ND", + "county": "Steele" + }, + { + "zip_code": 58047, + "latitude": 46.710147, + "longitude": -96.88506, + "city": "Horace", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58048, + "latitude": 46.981541, + "longitude": -97.150669, + "city": "Hunter", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58049, + "latitude": 46.717679, + "longitude": -97.976311, + "city": "Kathryn", + "state": "ND", + "county": "Barnes" + }, + { + "zip_code": 58051, + "latitude": 46.673526, + "longitude": -97.050584, + "city": "Kindred", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58052, + "latitude": 46.765575, + "longitude": -97.294037, + "city": "Leonard", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58053, + "latitude": 46.191782, + "longitude": -96.994919, + "city": "Lidgerwood", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58054, + "latitude": 46.455974, + "longitude": -97.636917, + "city": "Lisbon", + "state": "ND", + "county": "Ransom" + }, + { + "zip_code": 58056, + "latitude": 47.45565, + "longitude": -97.718955, + "city": "Luverne", + "state": "ND", + "county": "Steele" + }, + { + "zip_code": 58057, + "latitude": 46.443826, + "longitude": -97.343373, + "city": "Mcleod", + "state": "ND", + "county": "Ransom" + }, + { + "zip_code": 58058, + "latitude": 46.16038, + "longitude": -96.969366, + "city": "Mantador", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58059, + "latitude": 46.861424, + "longitude": -97.115726, + "city": "Mapleton", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58060, + "latitude": 46.200657, + "longitude": -97.477179, + "city": "Milnor", + "state": "ND", + "county": "Sargent" + }, + { + "zip_code": 58061, + "latitude": 46.315035, + "longitude": -96.861092, + "city": "Mooreton", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58062, + "latitude": 46.680795, + "longitude": -97.786984, + "city": "Nome", + "state": "ND", + "county": "Barnes" + }, + { + "zip_code": 58063, + "latitude": 46.964791, + "longitude": -97.789289, + "city": "Oriska", + "state": "ND", + "county": "Barnes" + }, + { + "zip_code": 58064, + "latitude": 47.000029, + "longitude": -97.515646, + "city": "Page", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58065, + "latitude": 46.650741, + "longitude": -98.195722, + "city": "Pillsbury", + "state": "ND", + "county": "Barnes" + }, + { + "zip_code": 58067, + "latitude": 46.036974, + "longitude": -97.431104, + "city": "Rutland", + "state": "ND", + "county": "Sargent" + }, + { + "zip_code": 58068, + "latitude": 46.521481, + "longitude": -97.416257, + "city": "Sheldon", + "state": "ND", + "county": "Ransom" + }, + { + "zip_code": 58069, + "latitude": 46.221613, + "longitude": -97.62307, + "city": "Stirum", + "state": "ND", + "county": "Sargent" + }, + { + "zip_code": 58071, + "latitude": 46.949236, + "longitude": -97.626101, + "city": "Tower City", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58072, + "latitude": 46.972286, + "longitude": -98.007534, + "city": "Valley City", + "state": "ND", + "county": "Barnes" + }, + { + "zip_code": 58074, + "latitude": 46.283291, + "longitude": -96.917614, + "city": "Wahpeton", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58075, + "latitude": 46.336591, + "longitude": -96.792057, + "city": "Wahpeton", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58076, + "latitude": 46.271839, + "longitude": -96.608142, + "city": "Wahpeton", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58077, + "latitude": 46.445916, + "longitude": -97.013693, + "city": "Walcott", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58078, + "latitude": 46.890692, + "longitude": -96.925828, + "city": "West Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58079, + "latitude": 46.832617, + "longitude": -97.346067, + "city": "Wheatland", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58081, + "latitude": 46.384021, + "longitude": -97.11408, + "city": "Wyndmere", + "state": "ND", + "county": "Richland" + }, + { + "zip_code": 58102, + "latitude": 46.92536, + "longitude": -96.990615, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58103, + "latitude": 46.832152, + "longitude": -96.825841, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58104, + "latitude": 46.781589, + "longitude": -96.884106, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58105, + "latitude": 46.9414, + "longitude": -96.967371, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58106, + "latitude": 46.934596, + "longitude": -97.229718, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58107, + "latitude": 46.934596, + "longitude": -97.229718, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58108, + "latitude": 46.934596, + "longitude": -97.229718, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58109, + "latitude": 46.82352, + "longitude": -96.8148, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58121, + "latitude": 46.934596, + "longitude": -97.229718, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58122, + "latitude": 46.934596, + "longitude": -97.229718, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58123, + "latitude": 46.934596, + "longitude": -97.229718, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58124, + "latitude": 46.934596, + "longitude": -97.229718, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58125, + "latitude": 46.934596, + "longitude": -97.229718, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58126, + "latitude": 46.934596, + "longitude": -97.229718, + "city": "Fargo", + "state": "ND", + "county": "Cass" + }, + { + "zip_code": 58201, + "latitude": 47.9041, + "longitude": -97.431501, + "city": "Grand Forks", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58202, + "latitude": 47.933481, + "longitude": -97.394446, + "city": "Grand Forks", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58203, + "latitude": 47.892243, + "longitude": -97.301297, + "city": "Grand Forks", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58204, + "latitude": 47.967909, + "longitude": -97.367534, + "city": "Grand Forks Afb", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58205, + "latitude": 47.933481, + "longitude": -97.394446, + "city": "Grand Forks Afb", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58206, + "latitude": 47.933481, + "longitude": -97.394446, + "city": "Grand Forks", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58207, + "latitude": 47.933481, + "longitude": -97.394446, + "city": "Grand Forks", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58208, + "latitude": 47.933481, + "longitude": -97.394446, + "city": "Grand Forks", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58210, + "latitude": 48.383547, + "longitude": -97.997964, + "city": "Adams", + "state": "ND", + "county": "Walsh" + }, + { + "zip_code": 58212, + "latitude": 47.766493, + "longitude": -98.043481, + "city": "Aneta", + "state": "ND", + "county": "Nelson" + }, + { + "zip_code": 58213, + "latitude": 48.237795, + "longitude": -97.275528, + "city": "Ardoch", + "state": "ND", + "county": "Walsh" + }, + { + "zip_code": 58214, + "latitude": 47.925956, + "longitude": -97.494107, + "city": "Arvilla", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58216, + "latitude": 48.874863, + "longitude": -97.42543, + "city": "Bathgate", + "state": "ND", + "county": "Pembina" + }, + { + "zip_code": 58218, + "latitude": 47.602249, + "longitude": -97.099519, + "city": "Buxton", + "state": "ND", + "county": "Traill" + }, + { + "zip_code": 58219, + "latitude": 47.454888, + "longitude": -97.151692, + "city": "Caledonia", + "state": "ND", + "county": "Traill" + }, + { + "zip_code": 58220, + "latitude": 48.738902, + "longitude": -97.699122, + "city": "Cavalier", + "state": "ND", + "county": "Pembina" + }, + { + "zip_code": 58222, + "latitude": 48.6449, + "longitude": -97.633342, + "city": "Crystal", + "state": "ND", + "county": "Pembina" + }, + { + "zip_code": 58223, + "latitude": 47.454888, + "longitude": -97.151692, + "city": "Cummings", + "state": "ND", + "county": "Traill" + }, + { + "zip_code": 58224, + "latitude": 48.165871, + "longitude": -97.957485, + "city": "Dahlen", + "state": "ND", + "county": "Nelson" + }, + { + "zip_code": 58225, + "latitude": 48.668146, + "longitude": -97.362726, + "city": "Drayton", + "state": "ND", + "county": "Pembina" + }, + { + "zip_code": 58227, + "latitude": 48.499712, + "longitude": -97.893218, + "city": "Edinburg", + "state": "ND", + "county": "Walsh" + }, + { + "zip_code": 58228, + "latitude": 47.889676, + "longitude": -97.280993, + "city": "Emerado", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58229, + "latitude": 48.380603, + "longitude": -98.054828, + "city": "Fairdale", + "state": "ND", + "county": "Walsh" + }, + { + "zip_code": 58230, + "latitude": 47.51207, + "longitude": -97.83707, + "city": "Finley", + "state": "ND", + "county": "Steele" + }, + { + "zip_code": 58231, + "latitude": 48.281947, + "longitude": -97.827805, + "city": "Fordville", + "state": "ND", + "county": "Walsh" + }, + { + "zip_code": 58233, + "latitude": 48.259974, + "longitude": -97.522485, + "city": "Forest River", + "state": "ND", + "county": "Walsh" + }, + { + "zip_code": 58235, + "latitude": 48.085827, + "longitude": -97.514081, + "city": "Gilby", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58236, + "latitude": 48.720149, + "longitude": -97.469623, + "city": "Glasston", + "state": "ND", + "county": "Pembina" + }, + { + "zip_code": 58237, + "latitude": 48.368876, + "longitude": -97.437265, + "city": "Grafton", + "state": "ND", + "county": "Walsh" + }, + { + "zip_code": 58238, + "latitude": 48.778717, + "longitude": -97.449975, + "city": "Hamilton", + "state": "ND", + "county": "Pembina" + }, + { + "zip_code": 58239, + "latitude": 48.77178, + "longitude": -98.464102, + "city": "Hannah", + "state": "ND", + "county": "Cavalier" + }, + { + "zip_code": 58240, + "latitude": 47.638521, + "longitude": -97.459319, + "city": "Hatton", + "state": "ND", + "county": "Traill" + }, + { + "zip_code": 58241, + "latitude": 48.720338, + "longitude": -97.699287, + "city": "Hensel", + "state": "ND", + "county": "Pembina" + }, + { + "zip_code": 58243, + "latitude": 48.490539, + "longitude": -97.677015, + "city": "Hoople", + "state": "ND", + "county": "Walsh" + }, + { + "zip_code": 58244, + "latitude": 48.107863, + "longitude": -97.683056, + "city": "Inkster", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58249, + "latitude": 48.753679, + "longitude": -98.288629, + "city": "Langdon", + "state": "ND", + "county": "Cavalier" + }, + { + "zip_code": 58250, + "latitude": 48.282007, + "longitude": -98.076663, + "city": "Lankin", + "state": "ND", + "county": "Walsh" + }, + { + "zip_code": 58251, + "latitude": 47.911531, + "longitude": -97.626389, + "city": "Larimore", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58254, + "latitude": 47.856367, + "longitude": -98.134365, + "city": "Mcville", + "state": "ND", + "county": "Nelson" + }, + { + "zip_code": 58255, + "latitude": 48.77178, + "longitude": -98.464102, + "city": "Maida", + "state": "ND", + "county": "Cavalier" + }, + { + "zip_code": 58256, + "latitude": 48.107279, + "longitude": -97.28791, + "city": "Manvel", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58257, + "latitude": 47.487262, + "longitude": -97.345104, + "city": "Mayville", + "state": "ND", + "county": "Traill" + }, + { + "zip_code": 58258, + "latitude": 48.007368, + "longitude": -97.430451, + "city": "Mekinock", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58259, + "latitude": 48.020355, + "longitude": -98.118574, + "city": "Michigan", + "state": "ND", + "county": "Nelson" + }, + { + "zip_code": 58260, + "latitude": 48.624861, + "longitude": -98.042871, + "city": "Milton", + "state": "ND", + "county": "Cavalier" + }, + { + "zip_code": 58261, + "latitude": 48.25997, + "longitude": -97.314367, + "city": "Minto", + "state": "ND", + "county": "Walsh" + }, + { + "zip_code": 58262, + "latitude": 48.693099, + "longitude": -97.884115, + "city": "Mountain", + "state": "ND", + "county": "Pembina" + }, + { + "zip_code": 58265, + "latitude": 48.943793, + "longitude": -97.512602, + "city": "Neche", + "state": "ND", + "county": "Pembina" + }, + { + "zip_code": 58266, + "latitude": 48.015728, + "longitude": -97.817106, + "city": "Niagara", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58267, + "latitude": 47.759107, + "longitude": -97.603773, + "city": "Northwood", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58269, + "latitude": 48.77178, + "longitude": -98.464102, + "city": "Osnabrock", + "state": "ND", + "county": "Cavalier" + }, + { + "zip_code": 58270, + "latitude": 48.420411, + "longitude": -97.774812, + "city": "Park River", + "state": "ND", + "county": "Walsh" + }, + { + "zip_code": 58271, + "latitude": 48.85897, + "longitude": -97.288585, + "city": "Pembina", + "state": "ND", + "county": "Pembina" + }, + { + "zip_code": 58272, + "latitude": 48.00598, + "longitude": -98.000193, + "city": "Petersburg", + "state": "ND", + "county": "Nelson" + }, + { + "zip_code": 58273, + "latitude": 48.323898, + "longitude": -97.81439, + "city": "Pisek", + "state": "ND", + "county": "Walsh" + }, + { + "zip_code": 58274, + "latitude": 47.582141, + "longitude": -97.244353, + "city": "Portland", + "state": "ND", + "county": "Traill" + }, + { + "zip_code": 58275, + "latitude": 47.872332, + "longitude": -97.236128, + "city": "Reynolds", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58276, + "latitude": 48.630369, + "longitude": -97.471056, + "city": "Saint Thomas", + "state": "ND", + "county": "Pembina" + }, + { + "zip_code": 58277, + "latitude": 47.45565, + "longitude": -97.718955, + "city": "Sharon", + "state": "ND", + "county": "Steele" + }, + { + "zip_code": 58278, + "latitude": 47.785848, + "longitude": -97.34703, + "city": "Thompson", + "state": "ND", + "county": "Grand Forks" + }, + { + "zip_code": 58281, + "latitude": 48.77178, + "longitude": -98.464102, + "city": "Wales", + "state": "ND", + "county": "Cavalier" + }, + { + "zip_code": 58282, + "latitude": 48.880795, + "longitude": -97.797358, + "city": "Walhalla", + "state": "ND", + "county": "Pembina" + }, + { + "zip_code": 58301, + "latitude": 48.264352, + "longitude": -98.781979, + "city": "Devils Lake", + "state": "ND", + "county": "Ramsey" + }, + { + "zip_code": 58310, + "latitude": 48.770913, + "longitude": -99.772702, + "city": "Agate", + "state": "ND", + "county": "Rolette" + }, + { + "zip_code": 58311, + "latitude": 48.77178, + "longitude": -98.464102, + "city": "Alsen", + "state": "ND", + "county": "Cavalier" + }, + { + "zip_code": 58313, + "latitude": 48.104177, + "longitude": -99.992145, + "city": "Balta", + "state": "ND", + "county": "Pierce" + }, + { + "zip_code": 58316, + "latitude": 48.777557, + "longitude": -99.799919, + "city": "Belcourt", + "state": "ND", + "county": "Rolette" + }, + { + "zip_code": 58317, + "latitude": 48.58807, + "longitude": -99.23173, + "city": "Bisbee", + "state": "ND", + "county": "Towner" + }, + { + "zip_code": 58318, + "latitude": 48.830347, + "longitude": -100.601174, + "city": "Bottineau", + "state": "ND", + "county": "Bottineau" + }, + { + "zip_code": 58319, + "latitude": 47.663508, + "longitude": -99.664406, + "city": "Bremen", + "state": "ND", + "county": "Wells" + }, + { + "zip_code": 58320, + "latitude": 48.28641, + "longitude": -99.404705, + "city": "Brinsmade", + "state": "ND", + "county": "Benson" + }, + { + "zip_code": 58321, + "latitude": 48.238222, + "longitude": -98.400599, + "city": "Brocket", + "state": "ND", + "county": "Ramsey" + }, + { + "zip_code": 58323, + "latitude": 48.77178, + "longitude": -98.464102, + "city": "Calvin", + "state": "ND", + "county": "Cavalier" + }, + { + "zip_code": 58324, + "latitude": 48.500121, + "longitude": -99.231923, + "city": "Cando", + "state": "ND", + "county": "Towner" + }, + { + "zip_code": 58325, + "latitude": 48.29, + "longitude": -99.070499, + "city": "Churchs Ferry", + "state": "ND", + "county": "Ramsey" + }, + { + "zip_code": 58327, + "latitude": 48.091012, + "longitude": -98.573116, + "city": "Crary", + "state": "ND", + "county": "Ramsey" + }, + { + "zip_code": 58329, + "latitude": 48.856083, + "longitude": -100.024102, + "city": "Dunseith", + "state": "ND", + "county": "Rolette" + }, + { + "zip_code": 58330, + "latitude": 48.422614, + "longitude": -98.49963, + "city": "Edmore", + "state": "ND", + "county": "Ramsey" + }, + { + "zip_code": 58331, + "latitude": 48.652908, + "longitude": -99.123224, + "city": "Egeland", + "state": "ND", + "county": "Towner" + }, + { + "zip_code": 58332, + "latitude": 48.059736, + "longitude": -99.538336, + "city": "Esmond", + "state": "ND", + "county": "Benson" + }, + { + "zip_code": 58335, + "latitude": 48.108758, + "longitude": -99.186842, + "city": "Fort Totten", + "state": "ND", + "county": "Benson" + }, + { + "zip_code": 58337, + "latitude": 47.587372, + "longitude": -99.667737, + "city": "Hamberg", + "state": "ND", + "county": "Wells" + }, + { + "zip_code": 58338, + "latitude": 48.499953, + "longitude": -98.644371, + "city": "Hampden", + "state": "ND", + "county": "Ramsey" + }, + { + "zip_code": 58339, + "latitude": 48.900063, + "longitude": -99.427769, + "city": "Hansboro", + "state": "ND", + "county": "Towner" + }, + { + "zip_code": 58341, + "latitude": 47.703539, + "longitude": -99.747755, + "city": "Harvey", + "state": "ND", + "county": "Wells" + }, + { + "zip_code": 58343, + "latitude": 48.301215, + "longitude": -99.689358, + "city": "Knox", + "state": "ND", + "county": "Benson" + }, + { + "zip_code": 58344, + "latitude": 47.971966, + "longitude": -98.324631, + "city": "Lakota", + "state": "ND", + "county": "Nelson" + }, + { + "zip_code": 58345, + "latitude": 48.275146, + "longitude": -98.438346, + "city": "Lawton", + "state": "ND", + "county": "Ramsey" + }, + { + "zip_code": 58346, + "latitude": 48.165312, + "longitude": -99.432466, + "city": "Leeds", + "state": "ND", + "county": "Benson" + }, + { + "zip_code": 58348, + "latitude": 47.999093, + "longitude": -99.535801, + "city": "Maddock", + "state": "ND", + "county": "Benson" + }, + { + "zip_code": 58351, + "latitude": 48.130016, + "longitude": -99.38981, + "city": "Minnewaukan", + "state": "ND", + "county": "Benson" + }, + { + "zip_code": 58352, + "latitude": 48.66937, + "longitude": -98.835465, + "city": "Munich", + "state": "ND", + "county": "Cavalier" + }, + { + "zip_code": 58353, + "latitude": 48.772022, + "longitude": -99.838063, + "city": "Mylo", + "state": "ND", + "county": "Rolette" + }, + { + "zip_code": 58355, + "latitude": 48.77178, + "longitude": -98.464102, + "city": "Nekoma", + "state": "ND", + "county": "Cavalier" + }, + { + "zip_code": 58356, + "latitude": 47.71736, + "longitude": -98.898693, + "city": "New Rockford", + "state": "ND", + "county": "Eddy" + }, + { + "zip_code": 58357, + "latitude": 47.949694, + "longitude": -99.133201, + "city": "Oberon", + "state": "ND", + "county": "Benson" + }, + { + "zip_code": 58359, + "latitude": 48.089537, + "longitude": -100.164357, + "city": "Orrin", + "state": "ND", + "county": "Pierce" + }, + { + "zip_code": 58361, + "latitude": 47.798489, + "longitude": -98.364994, + "city": "Pekin", + "state": "ND", + "county": "Nelson" + }, + { + "zip_code": 58362, + "latitude": 48.275494, + "longitude": -99.070415, + "city": "Penn", + "state": "ND", + "county": "Ramsey" + }, + { + "zip_code": 58363, + "latitude": 48.754621, + "longitude": -99.438351, + "city": "Perth", + "state": "ND", + "county": "Towner" + }, + { + "zip_code": 58365, + "latitude": 48.844548, + "longitude": -99.26309, + "city": "Rocklake", + "state": "ND", + "county": "Towner" + }, + { + "zip_code": 58366, + "latitude": 48.700886, + "longitude": -99.878456, + "city": "Rolette", + "state": "ND", + "county": "Rolette" + }, + { + "zip_code": 58367, + "latitude": 48.826826, + "longitude": -99.786546, + "city": "Rolla", + "state": "ND", + "county": "Rolette" + }, + { + "zip_code": 58368, + "latitude": 48.254504, + "longitude": -99.989912, + "city": "Rugby", + "state": "ND", + "county": "Pierce" + }, + { + "zip_code": 58369, + "latitude": 48.880498, + "longitude": -99.734073, + "city": "Saint John", + "state": "ND", + "county": "Rolette" + }, + { + "zip_code": 58370, + "latitude": 47.985595, + "longitude": -98.849264, + "city": "Saint Michael", + "state": "ND", + "county": "Benson" + }, + { + "zip_code": 58372, + "latitude": 48.77178, + "longitude": -98.464102, + "city": "Sarles", + "state": "ND", + "county": "Cavalier" + }, + { + "zip_code": 58374, + "latitude": 47.761272, + "longitude": -98.90997, + "city": "Sheyenne", + "state": "ND", + "county": "Eddy" + }, + { + "zip_code": 58377, + "latitude": 48.449321, + "longitude": -98.760596, + "city": "Starkweather", + "state": "ND", + "county": "Ramsey" + }, + { + "zip_code": 58379, + "latitude": 48.108758, + "longitude": -99.186842, + "city": "Tokio", + "state": "ND", + "county": "Benson" + }, + { + "zip_code": 58380, + "latitude": 47.846213, + "longitude": -98.451175, + "city": "Tolna", + "state": "ND", + "county": "Nelson" + }, + { + "zip_code": 58381, + "latitude": 47.910133, + "longitude": -98.75889, + "city": "Warwick", + "state": "ND", + "county": "Benson" + }, + { + "zip_code": 58382, + "latitude": 48.317012, + "longitude": -98.800481, + "city": "Webster", + "state": "ND", + "county": "Ramsey" + }, + { + "zip_code": 58384, + "latitude": 48.660609, + "longitude": -100.352409, + "city": "Willow City", + "state": "ND", + "county": "Bottineau" + }, + { + "zip_code": 58385, + "latitude": 48.465282, + "longitude": -99.645681, + "city": "Wolford", + "state": "ND", + "county": "Pierce" + }, + { + "zip_code": 58386, + "latitude": 48.256479, + "longitude": -99.602542, + "city": "York", + "state": "ND", + "county": "Benson" + }, + { + "zip_code": 58401, + "latitude": 46.921005, + "longitude": -98.745485, + "city": "Jamestown", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58402, + "latitude": 46.97882, + "longitude": -98.960032, + "city": "Jamestown", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58405, + "latitude": 46.913344, + "longitude": -98.699553, + "city": "Jamestown", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58413, + "latitude": 46.056209, + "longitude": -99.285013, + "city": "Ashley", + "state": "ND", + "county": "Mcintosh" + }, + { + "zip_code": 58415, + "latitude": 46.362715, + "longitude": -98.473702, + "city": "Berlin", + "state": "ND", + "county": "Lamoure" + }, + { + "zip_code": 58416, + "latitude": 47.489506, + "longitude": -98.410133, + "city": "Binford", + "state": "ND", + "county": "Griggs" + }, + { + "zip_code": 58418, + "latitude": 47.457667, + "longitude": -99.649702, + "city": "Bowdon", + "state": "ND", + "county": "Wells" + }, + { + "zip_code": 58420, + "latitude": 47.005084, + "longitude": -98.900709, + "city": "Buchanan", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58421, + "latitude": 47.457278, + "longitude": -98.893314, + "city": "Carrington", + "state": "ND", + "county": "Foster" + }, + { + "zip_code": 58422, + "latitude": 47.628946, + "longitude": -99.404936, + "city": "Cathay", + "state": "ND", + "county": "Wells" + }, + { + "zip_code": 58423, + "latitude": 47.464366, + "longitude": -99.830601, + "city": "Chaseley", + "state": "ND", + "county": "Wells" + }, + { + "zip_code": 58424, + "latitude": 46.893112, + "longitude": -99.128846, + "city": "Cleveland", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58425, + "latitude": 47.366922, + "longitude": -98.295699, + "city": "Cooperstown", + "state": "ND", + "county": "Griggs" + }, + { + "zip_code": 58426, + "latitude": 47.196576, + "longitude": -98.594244, + "city": "Courtenay", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58428, + "latitude": 46.806728, + "longitude": -99.772396, + "city": "Dawson", + "state": "ND", + "county": "Kidder" + }, + { + "zip_code": 58429, + "latitude": 47.182819, + "longitude": -98.161621, + "city": "Dazey", + "state": "ND", + "county": "Barnes" + }, + { + "zip_code": 58430, + "latitude": 47.529679, + "longitude": -100.271687, + "city": "Denhoff", + "state": "ND", + "county": "Sheridan" + }, + { + "zip_code": 58431, + "latitude": 46.47261, + "longitude": -98.54261, + "city": "Dickey", + "state": "ND", + "county": "Lamoure" + }, + { + "zip_code": 58432, + "latitude": 46.892518, + "longitude": -98.375536, + "city": "Eckelson", + "state": "ND", + "county": "Barnes" + }, + { + "zip_code": 58433, + "latitude": 46.41198, + "longitude": -98.713086, + "city": "Edgeley", + "state": "ND", + "county": "Lamoure" + }, + { + "zip_code": 58436, + "latitude": 46.106141, + "longitude": -98.620707, + "city": "Ellendale", + "state": "ND", + "county": "Dickey" + }, + { + "zip_code": 58438, + "latitude": 47.625048, + "longitude": -99.564274, + "city": "Fessenden", + "state": "ND", + "county": "Wells" + }, + { + "zip_code": 58439, + "latitude": 46.011902, + "longitude": -98.848644, + "city": "Forbes", + "state": "ND", + "county": "Dickey" + }, + { + "zip_code": 58440, + "latitude": 46.37014, + "longitude": -99.173337, + "city": "Fredonia", + "state": "ND", + "county": "Logan" + }, + { + "zip_code": 58441, + "latitude": 46.175992, + "longitude": -98.379846, + "city": "Fullerton", + "state": "ND", + "county": "Dickey" + }, + { + "zip_code": 58442, + "latitude": 46.522452, + "longitude": -99.173063, + "city": "Gackle", + "state": "ND", + "county": "Logan" + }, + { + "zip_code": 58443, + "latitude": 47.456948, + "longitude": -98.691563, + "city": "Glenfield", + "state": "ND", + "county": "Foster" + }, + { + "zip_code": 58444, + "latitude": 47.479529, + "longitude": -100.14659, + "city": "Goodrich", + "state": "ND", + "county": "Sheridan" + }, + { + "zip_code": 58445, + "latitude": 47.457057, + "longitude": -98.702131, + "city": "Grace City", + "state": "ND", + "county": "Foster" + }, + { + "zip_code": 58448, + "latitude": 47.378619, + "longitude": -98.350201, + "city": "Hannaford", + "state": "ND", + "county": "Griggs" + }, + { + "zip_code": 58451, + "latitude": 47.472804, + "longitude": -99.937233, + "city": "Hurdsfield", + "state": "ND", + "county": "Wells" + }, + { + "zip_code": 58452, + "latitude": 47.456477, + "longitude": -98.230415, + "city": "Jessie", + "state": "ND", + "county": "Griggs" + }, + { + "zip_code": 58454, + "latitude": 46.551079, + "longitude": -98.86671, + "city": "Jud", + "state": "ND", + "county": "Lamoure" + }, + { + "zip_code": 58455, + "latitude": 47.240135, + "longitude": -98.753458, + "city": "Kensal", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58456, + "latitude": 46.391635, + "longitude": -98.603141, + "city": "Kulm", + "state": "ND", + "county": "Lamoure" + }, + { + "zip_code": 58458, + "latitude": 46.384379, + "longitude": -98.358671, + "city": "Lamoure", + "state": "ND", + "county": "Lamoure" + }, + { + "zip_code": 58460, + "latitude": 46.140661, + "longitude": -99.378147, + "city": "Lehr", + "state": "ND", + "county": "Mcintosh" + }, + { + "zip_code": 58461, + "latitude": 46.717981, + "longitude": -98.186443, + "city": "Litchville", + "state": "ND", + "county": "Barnes" + }, + { + "zip_code": 58463, + "latitude": 47.506755, + "longitude": -100.41715, + "city": "Mcclusky", + "state": "ND", + "county": "Sheridan" + }, + { + "zip_code": 58464, + "latitude": 47.507777, + "longitude": -98.627951, + "city": "Mchenry", + "state": "ND", + "county": "Foster" + }, + { + "zip_code": 58466, + "latitude": 46.551382, + "longitude": -98.368983, + "city": "Marion", + "state": "ND", + "county": "Lamoure" + }, + { + "zip_code": 58467, + "latitude": 46.899774, + "longitude": -99.316908, + "city": "Medina", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58472, + "latitude": 46.681609, + "longitude": -98.660404, + "city": "Montpelier", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58474, + "latitude": 46.109493, + "longitude": -98.225652, + "city": "Oakes", + "state": "ND", + "county": "Dickey" + }, + { + "zip_code": 58475, + "latitude": 47.153918, + "longitude": -99.584222, + "city": "Pettibone", + "state": "ND", + "county": "Kidder" + }, + { + "zip_code": 58476, + "latitude": 47.203846, + "longitude": -99.014385, + "city": "Pingree", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58477, + "latitude": 47.212951, + "longitude": -100.548434, + "city": "Regan", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58478, + "latitude": 46.979659, + "longitude": -99.689234, + "city": "Robinson", + "state": "ND", + "county": "Kidder" + }, + { + "zip_code": 58479, + "latitude": 47.074088, + "longitude": -98.213603, + "city": "Rogers", + "state": "ND", + "county": "Barnes" + }, + { + "zip_code": 58480, + "latitude": 46.892615, + "longitude": -98.258971, + "city": "Sanborn", + "state": "ND", + "county": "Barnes" + }, + { + "zip_code": 58481, + "latitude": 46.986518, + "longitude": -98.521889, + "city": "Spiritwood", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58482, + "latitude": 46.875966, + "longitude": -99.798975, + "city": "Steele", + "state": "ND", + "county": "Kidder" + }, + { + "zip_code": 58483, + "latitude": 46.718326, + "longitude": -99.344287, + "city": "Streeter", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58484, + "latitude": 47.39903, + "longitude": -98.403593, + "city": "Sutton", + "state": "ND", + "county": "Griggs" + }, + { + "zip_code": 58486, + "latitude": 47.421182, + "longitude": -99.404828, + "city": "Sykeston", + "state": "ND", + "county": "Wells" + }, + { + "zip_code": 58487, + "latitude": 46.806274, + "longitude": -99.594248, + "city": "Tappen", + "state": "ND", + "county": "Kidder" + }, + { + "zip_code": 58488, + "latitude": 47.132159, + "longitude": -99.970526, + "city": "Tuttle", + "state": "ND", + "county": "Kidder" + }, + { + "zip_code": 58489, + "latitude": 46.027975, + "longitude": -99.649774, + "city": "Venturia", + "state": "ND", + "county": "Mcintosh" + }, + { + "zip_code": 58490, + "latitude": 46.398713, + "longitude": -98.099446, + "city": "Verona", + "state": "ND", + "county": "Lamoure" + }, + { + "zip_code": 58492, + "latitude": 47.110075, + "longitude": -98.397443, + "city": "Wimbledon", + "state": "ND", + "county": "Barnes" + }, + { + "zip_code": 58494, + "latitude": 47.157924, + "longitude": -100.294569, + "city": "Wing", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58495, + "latitude": 46.191724, + "longitude": -99.613132, + "city": "Wishek", + "state": "ND", + "county": "Mcintosh" + }, + { + "zip_code": 58496, + "latitude": 47.153721, + "longitude": -99.259784, + "city": "Woodworth", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58497, + "latitude": 46.768695, + "longitude": -98.565136, + "city": "Ypsilanti", + "state": "ND", + "county": "Stutsman" + }, + { + "zip_code": 58501, + "latitude": 46.981207, + "longitude": -100.502724, + "city": "Bismarck", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58502, + "latitude": 46.8887, + "longitude": -100.681855, + "city": "Bismarck", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58503, + "latitude": "", + "longitude": "", + "city": "Bismarck", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58504, + "latitude": 46.829938, + "longitude": -100.45598, + "city": "Bismarck", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58505, + "latitude": 46.816543, + "longitude": -100.780505, + "city": "Bismarck", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58506, + "latitude": 46.980475, + "longitude": -100.520063, + "city": "Bismarck", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58507, + "latitude": 46.980475, + "longitude": -100.520063, + "city": "Bismarck", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58520, + "latitude": 46.720185, + "longitude": -101.498156, + "city": "Almont", + "state": "ND", + "county": "Morton" + }, + { + "zip_code": 58521, + "latitude": 47.016148, + "longitude": -100.693721, + "city": "Baldwin", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58523, + "latitude": 47.277895, + "longitude": -101.853161, + "city": "Beulah", + "state": "ND", + "county": "Mercer" + }, + { + "zip_code": 58524, + "latitude": 46.56035, + "longitude": -100.107546, + "city": "Braddock", + "state": "ND", + "county": "Emmons" + }, + { + "zip_code": 58528, + "latitude": 46.361639, + "longitude": -100.688991, + "city": "Cannon Ball", + "state": "ND", + "county": "Sioux" + }, + { + "zip_code": 58529, + "latitude": 46.300853, + "longitude": -101.673608, + "city": "Carson", + "state": "ND", + "county": "Grant" + }, + { + "zip_code": 58530, + "latitude": 47.145874, + "longitude": -101.159363, + "city": "Center", + "state": "ND", + "county": "Oliver" + }, + { + "zip_code": 58531, + "latitude": 47.581047, + "longitude": -101.143206, + "city": "Coleharbor", + "state": "ND", + "county": "Mclean" + }, + { + "zip_code": 58532, + "latitude": 46.851141, + "longitude": -100.18329, + "city": "Driscoll", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58533, + "latitude": 46.367859, + "longitude": -101.755819, + "city": "Elgin", + "state": "ND", + "county": "Grant" + }, + { + "zip_code": 58535, + "latitude": 46.599807, + "longitude": -101.316642, + "city": "Flasher", + "state": "ND", + "county": "Morton" + }, + { + "zip_code": 58538, + "latitude": 46.170605, + "longitude": -100.710536, + "city": "Fort Yates", + "state": "ND", + "county": "Sioux" + }, + { + "zip_code": 58540, + "latitude": 47.667515, + "longitude": -101.61418, + "city": "Garrison", + "state": "ND", + "county": "Mclean" + }, + { + "zip_code": 58541, + "latitude": 47.312542, + "longitude": -102.056796, + "city": "Golden Valley", + "state": "ND", + "county": "Mercer" + }, + { + "zip_code": 58542, + "latitude": 46.080221, + "longitude": -100.097715, + "city": "Hague", + "state": "ND", + "county": "Emmons" + }, + { + "zip_code": 58544, + "latitude": 46.517223, + "longitude": -100.337283, + "city": "Hazelton", + "state": "ND", + "county": "Emmons" + }, + { + "zip_code": 58545, + "latitude": 47.386092, + "longitude": -101.760142, + "city": "Hazen", + "state": "ND", + "county": "Mercer" + }, + { + "zip_code": 58549, + "latitude": 46.455044, + "longitude": -99.969631, + "city": "Kintyre", + "state": "ND", + "county": "Emmons" + }, + { + "zip_code": 58552, + "latitude": 46.185512, + "longitude": -100.233084, + "city": "Linton", + "state": "ND", + "county": "Emmons" + }, + { + "zip_code": 58553, + "latitude": 46.871308, + "longitude": -100.402135, + "city": "Mckenzie", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58554, + "latitude": 46.71312, + "longitude": -100.952585, + "city": "Mandan", + "state": "ND", + "county": "Morton" + }, + { + "zip_code": 58558, + "latitude": 46.808449, + "longitude": -100.45556, + "city": "Menoken", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58559, + "latitude": 47.501822, + "longitude": -100.758394, + "city": "Mercer", + "state": "ND", + "county": "Mclean" + }, + { + "zip_code": 58560, + "latitude": 46.673047, + "longitude": -100.300199, + "city": "Moffit", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58561, + "latitude": 46.464858, + "longitude": -99.65682, + "city": "Napoleon", + "state": "ND", + "county": "Logan" + }, + { + "zip_code": 58562, + "latitude": 46.382285, + "longitude": -101.961907, + "city": "New Leipzig", + "state": "ND", + "county": "Grant" + }, + { + "zip_code": 58563, + "latitude": 46.805999, + "longitude": -101.429122, + "city": "New Salem", + "state": "ND", + "county": "Morton" + }, + { + "zip_code": 58564, + "latitude": 46.267125, + "longitude": -101.372162, + "city": "Raleigh", + "state": "ND", + "county": "Grant" + }, + { + "zip_code": 58565, + "latitude": 47.396354, + "longitude": -101.203255, + "city": "Riverdale", + "state": "ND", + "county": "Mclean" + }, + { + "zip_code": 58566, + "latitude": 46.646616, + "longitude": -100.94428, + "city": "Saint Anthony", + "state": "ND", + "county": "Morton" + }, + { + "zip_code": 58568, + "latitude": 46.186442, + "longitude": -101.252738, + "city": "Selfridge", + "state": "ND", + "county": "Sioux" + }, + { + "zip_code": 58569, + "latitude": 46.244657, + "longitude": -101.218713, + "city": "Shields", + "state": "ND", + "county": "Grant" + }, + { + "zip_code": 58570, + "latitude": 46.365588, + "longitude": -100.783143, + "city": "Solen", + "state": "ND", + "county": "Sioux" + }, + { + "zip_code": 58571, + "latitude": 47.377264, + "longitude": -101.394939, + "city": "Stanton", + "state": "ND", + "county": "Mercer" + }, + { + "zip_code": 58572, + "latitude": 46.876069, + "longitude": -100.277434, + "city": "Sterling", + "state": "ND", + "county": "Burleigh" + }, + { + "zip_code": 58573, + "latitude": 46.080388, + "longitude": -100.223542, + "city": "Strasburg", + "state": "ND", + "county": "Emmons" + }, + { + "zip_code": 58575, + "latitude": 47.501425, + "longitude": -100.895863, + "city": "Turtle Lake", + "state": "ND", + "county": "Mclean" + }, + { + "zip_code": 58576, + "latitude": 47.445896, + "longitude": -101.21736, + "city": "Underwood", + "state": "ND", + "county": "Mclean" + }, + { + "zip_code": 58577, + "latitude": 47.380715, + "longitude": -101.095673, + "city": "Washburn", + "state": "ND", + "county": "Mclean" + }, + { + "zip_code": 58579, + "latitude": 47.488872, + "longitude": -101.085504, + "city": "Wilton", + "state": "ND", + "county": "Mclean" + }, + { + "zip_code": 58580, + "latitude": 47.263087, + "longitude": -101.929416, + "city": "Zap", + "state": "ND", + "county": "Mercer" + }, + { + "zip_code": 58581, + "latitude": 46.064366, + "longitude": -99.786023, + "city": "Zeeland", + "state": "ND", + "county": "Mcintosh" + }, + { + "zip_code": 58601, + "latitude": 46.805716, + "longitude": -102.756514, + "city": "Dickinson", + "state": "ND", + "county": "Stark" + }, + { + "zip_code": 58602, + "latitude": 46.820185, + "longitude": -102.663913, + "city": "Dickinson", + "state": "ND", + "county": "Stark" + }, + { + "zip_code": 58620, + "latitude": 46.454966, + "longitude": -103.485325, + "city": "Amidon", + "state": "ND", + "county": "Slope" + }, + { + "zip_code": 58621, + "latitude": 46.963728, + "longitude": -103.898766, + "city": "Beach", + "state": "ND", + "county": "Golden Valley" + }, + { + "zip_code": 58622, + "latitude": 46.819805, + "longitude": -103.126111, + "city": "Belfield", + "state": "ND", + "county": "Stark" + }, + { + "zip_code": 58623, + "latitude": 46.205537, + "longitude": -103.521263, + "city": "Bowman", + "state": "ND", + "county": "Bowman" + }, + { + "zip_code": 58625, + "latitude": 47.305726, + "longitude": -102.202834, + "city": "Dodge", + "state": "ND", + "county": "Dunn" + }, + { + "zip_code": 58626, + "latitude": 47.336337, + "longitude": -102.663492, + "city": "Dunn Center", + "state": "ND", + "county": "Dunn" + }, + { + "zip_code": 58627, + "latitude": 46.921188, + "longitude": -103.509564, + "city": "Fairfield", + "state": "ND", + "county": "Billings" + }, + { + "zip_code": 58630, + "latitude": 46.848918, + "longitude": -102.6399, + "city": "Gladstone", + "state": "ND", + "county": "Stark" + }, + { + "zip_code": 58631, + "latitude": 46.813372, + "longitude": -101.822672, + "city": "Glen Ullin", + "state": "ND", + "county": "Morton" + }, + { + "zip_code": 58632, + "latitude": 46.672225, + "longitude": -103.952158, + "city": "Golva", + "state": "ND", + "county": "Golden Valley" + }, + { + "zip_code": 58634, + "latitude": 47.737435, + "longitude": -103.298383, + "city": "Grassy Butte", + "state": "ND", + "county": "Mckenzie" + }, + { + "zip_code": 58636, + "latitude": 47.351748, + "longitude": -102.336761, + "city": "Halliday", + "state": "ND", + "county": "Dunn" + }, + { + "zip_code": 58638, + "latitude": 46.849592, + "longitude": -101.972303, + "city": "Hebron", + "state": "ND", + "county": "Morton" + }, + { + "zip_code": 58639, + "latitude": 46.057786, + "longitude": -102.785054, + "city": "Hettinger", + "state": "ND", + "county": "Adams" + }, + { + "zip_code": 58640, + "latitude": 47.526978, + "longitude": -102.703916, + "city": "Killdeer", + "state": "ND", + "county": "Dunn" + }, + { + "zip_code": 58641, + "latitude": 46.724077, + "longitude": -102.663709, + "city": "Lefor", + "state": "ND", + "county": "Stark" + }, + { + "zip_code": 58642, + "latitude": 47.402085, + "longitude": -102.622139, + "city": "Manning", + "state": "ND", + "county": "Dunn" + }, + { + "zip_code": 58643, + "latitude": 46.454966, + "longitude": -103.485325, + "city": "Marmarth", + "state": "ND", + "county": "Slope" + }, + { + "zip_code": 58644, + "latitude": 47.402085, + "longitude": -102.622139, + "city": "Marshall", + "state": "ND", + "county": "Dunn" + }, + { + "zip_code": 58645, + "latitude": 46.979437, + "longitude": -103.349989, + "city": "Medora", + "state": "ND", + "county": "Billings" + }, + { + "zip_code": 58646, + "latitude": 46.369616, + "longitude": -102.326958, + "city": "Mott", + "state": "ND", + "county": "Hettinger" + }, + { + "zip_code": 58647, + "latitude": 46.459446, + "longitude": -102.595864, + "city": "New England", + "state": "ND", + "county": "Hettinger" + }, + { + "zip_code": 58649, + "latitude": 46.113891, + "longitude": -102.496805, + "city": "Reeder", + "state": "ND", + "county": "Adams" + }, + { + "zip_code": 58650, + "latitude": 46.418659, + "longitude": -102.56228, + "city": "Regent", + "state": "ND", + "county": "Hettinger" + }, + { + "zip_code": 58651, + "latitude": 46.112755, + "longitude": -103.520928, + "city": "Rhame", + "state": "ND", + "county": "Bowman" + }, + { + "zip_code": 58652, + "latitude": 46.820533, + "longitude": -102.264513, + "city": "Richardton", + "state": "ND", + "county": "Stark" + }, + { + "zip_code": 58653, + "latitude": 46.112755, + "longitude": -103.520928, + "city": "Scranton", + "state": "ND", + "county": "Bowman" + }, + { + "zip_code": 58654, + "latitude": 46.847632, + "longitude": -103.874736, + "city": "Sentinel Butte", + "state": "ND", + "county": "Golden Valley" + }, + { + "zip_code": 58655, + "latitude": 46.767691, + "longitude": -103.072219, + "city": "South Heart", + "state": "ND", + "county": "Stark" + }, + { + "zip_code": 58656, + "latitude": 46.856469, + "longitude": -102.784581, + "city": "Taylor", + "state": "ND", + "county": "Stark" + }, + { + "zip_code": 58701, + "latitude": 48.084625, + "longitude": -101.419006, + "city": "Minot", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58702, + "latitude": 48.336898, + "longitude": -101.451285, + "city": "Minot", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58703, + "latitude": 48.299433, + "longitude": -101.606, + "city": "Minot", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58704, + "latitude": 48.42429, + "longitude": -101.319942, + "city": "Minot Afb", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58705, + "latitude": 48.234184, + "longitude": -101.297161, + "city": "Minot Afb", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58707, + "latitude": 48.245267, + "longitude": -101.301179, + "city": "Minot", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58710, + "latitude": 47.926998, + "longitude": -100.284856, + "city": "Anamoose", + "state": "ND", + "county": "Mchenry" + }, + { + "zip_code": 58711, + "latitude": 48.813251, + "longitude": -101.227611, + "city": "Antler", + "state": "ND", + "county": "Bottineau" + }, + { + "zip_code": 58712, + "latitude": 47.992915, + "longitude": -100.497516, + "city": "Balfour", + "state": "ND", + "county": "Mchenry" + }, + { + "zip_code": 58713, + "latitude": 48.528579, + "longitude": -100.635538, + "city": "Bantry", + "state": "ND", + "county": "Mchenry" + }, + { + "zip_code": 58716, + "latitude": 47.761315, + "longitude": -101.109594, + "city": "Benedict", + "state": "ND", + "county": "Mclean" + }, + { + "zip_code": 58718, + "latitude": 48.306397, + "longitude": -101.686644, + "city": "Berthold", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58721, + "latitude": 48.837753, + "longitude": -102.283897, + "city": "Bowbells", + "state": "ND", + "county": "Burke" + }, + { + "zip_code": 58722, + "latitude": 48.10469, + "longitude": -101.543429, + "city": "Burlington", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58723, + "latitude": 47.69365, + "longitude": -100.692443, + "city": "Butte", + "state": "ND", + "county": "Mclean" + }, + { + "zip_code": 58725, + "latitude": 48.417859, + "longitude": -101.705933, + "city": "Carpio", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58727, + "latitude": 48.852362, + "longitude": -102.592042, + "city": "Columbus", + "state": "ND", + "county": "Burke" + }, + { + "zip_code": 58730, + "latitude": 48.928166, + "longitude": -103.296728, + "city": "Crosby", + "state": "ND", + "county": "Divide" + }, + { + "zip_code": 58731, + "latitude": 48.490508, + "longitude": -100.961945, + "city": "Deering", + "state": "ND", + "county": "Mchenry" + }, + { + "zip_code": 58733, + "latitude": 48.187543, + "longitude": -101.668759, + "city": "Des Lacs", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58734, + "latitude": 48.495604, + "longitude": -102.006123, + "city": "Donnybrook", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58735, + "latitude": 47.952635, + "longitude": -101.464689, + "city": "Douglas", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58736, + "latitude": 47.978309, + "longitude": -100.384482, + "city": "Drake", + "state": "ND", + "county": "Mchenry" + }, + { + "zip_code": 58737, + "latitude": 48.877183, + "longitude": -102.382327, + "city": "Flaxton", + "state": "ND", + "county": "Burke" + }, + { + "zip_code": 58740, + "latitude": 48.647206, + "longitude": -101.540749, + "city": "Glenburn", + "state": "ND", + "county": "Renville" + }, + { + "zip_code": 58741, + "latitude": 48.305738, + "longitude": -100.67856, + "city": "Granville", + "state": "ND", + "county": "Mchenry" + }, + { + "zip_code": 58744, + "latitude": 48.194146, + "longitude": -100.591093, + "city": "Karlsruhe", + "state": "ND", + "county": "Mchenry" + }, + { + "zip_code": 58746, + "latitude": 48.523046, + "longitude": -101.670989, + "city": "Kenmare", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58747, + "latitude": 47.876848, + "longitude": -100.660544, + "city": "Kief", + "state": "ND", + "county": "Mchenry" + }, + { + "zip_code": 58748, + "latitude": 48.697742, + "longitude": -100.634566, + "city": "Kramer", + "state": "ND", + "county": "Bottineau" + }, + { + "zip_code": 58750, + "latitude": 48.634598, + "longitude": -101.297326, + "city": "Lansford", + "state": "ND", + "county": "Bottineau" + }, + { + "zip_code": 58752, + "latitude": 48.821804, + "longitude": -102.611948, + "city": "Lignite", + "state": "ND", + "county": "Burke" + }, + { + "zip_code": 58755, + "latitude": 48.405038, + "longitude": -103.407189, + "city": "Mcgregor", + "state": "ND", + "county": "Williams" + }, + { + "zip_code": 58756, + "latitude": 47.957203, + "longitude": -101.778246, + "city": "Makoti", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58757, + "latitude": 47.737435, + "longitude": -103.298383, + "city": "Mandaree", + "state": "ND", + "county": "Mckenzie" + }, + { + "zip_code": 58758, + "latitude": 47.717951, + "longitude": -100.21234, + "city": "Martin", + "state": "ND", + "county": "Sheridan" + }, + { + "zip_code": 58759, + "latitude": 47.567805, + "longitude": -101.164109, + "city": "Max", + "state": "ND", + "county": "Mclean" + }, + { + "zip_code": 58760, + "latitude": 48.736656, + "longitude": -101.197701, + "city": "Maxbass", + "state": "ND", + "county": "Bottineau" + }, + { + "zip_code": 58761, + "latitude": 48.726868, + "longitude": -101.605847, + "city": "Mohall", + "state": "ND", + "county": "Renville" + }, + { + "zip_code": 58762, + "latitude": 48.770759, + "longitude": -101.067192, + "city": "Newburg", + "state": "ND", + "county": "Bottineau" + }, + { + "zip_code": 58763, + "latitude": 47.971759, + "longitude": -102.471636, + "city": "New Town", + "state": "ND", + "county": "Mountrail" + }, + { + "zip_code": 58765, + "latitude": 48.925358, + "longitude": -103.071081, + "city": "Noonan", + "state": "ND", + "county": "Divide" + }, + { + "zip_code": 58768, + "latitude": 48.269539, + "longitude": -100.950246, + "city": "Norwich", + "state": "ND", + "county": "Mchenry" + }, + { + "zip_code": 58769, + "latitude": 48.284698, + "longitude": -102.257478, + "city": "Palermo", + "state": "ND", + "county": "Mountrail" + }, + { + "zip_code": 58770, + "latitude": 47.946158, + "longitude": -102.103378, + "city": "Parshall", + "state": "ND", + "county": "Mountrail" + }, + { + "zip_code": 58771, + "latitude": 48.065743, + "longitude": -102.030195, + "city": "Plaza", + "state": "ND", + "county": "Mountrail" + }, + { + "zip_code": 58772, + "latitude": 48.953774, + "longitude": -102.622651, + "city": "Portal", + "state": "ND", + "county": "Burke" + }, + { + "zip_code": 58773, + "latitude": 48.655093, + "longitude": -102.679499, + "city": "Powers Lake", + "state": "ND", + "county": "Burke" + }, + { + "zip_code": 58775, + "latitude": 47.681855, + "longitude": -101.866895, + "city": "Roseglen", + "state": "ND", + "county": "Mclean" + }, + { + "zip_code": 58776, + "latitude": 48.272077, + "longitude": -102.547886, + "city": "Ross", + "state": "ND", + "county": "Mountrail" + }, + { + "zip_code": 58778, + "latitude": 47.746583, + "longitude": -100.931173, + "city": "Ruso", + "state": "ND", + "county": "Mclean" + }, + { + "zip_code": 58779, + "latitude": 47.978815, + "longitude": -101.668252, + "city": "Ryder", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58781, + "latitude": 48.181645, + "longitude": -101.340912, + "city": "Sawyer", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58782, + "latitude": 48.863353, + "longitude": -101.770037, + "city": "Sherwood", + "state": "ND", + "county": "Renville" + }, + { + "zip_code": 58783, + "latitude": 48.87384, + "longitude": -100.735863, + "city": "Souris", + "state": "ND", + "county": "Bottineau" + }, + { + "zip_code": 58784, + "latitude": 48.345765, + "longitude": -102.418466, + "city": "Stanley", + "state": "ND", + "county": "Mountrail" + }, + { + "zip_code": 58785, + "latitude": 48.290933, + "longitude": -101.111794, + "city": "Surrey", + "state": "ND", + "county": "Ward" + }, + { + "zip_code": 58787, + "latitude": 48.759404, + "longitude": -101.862477, + "city": "Tolley", + "state": "ND", + "county": "Renville" + }, + { + "zip_code": 58788, + "latitude": 48.363638, + "longitude": -100.4854, + "city": "Towner", + "state": "ND", + "county": "Mchenry" + }, + { + "zip_code": 58789, + "latitude": 48.348495, + "longitude": -100.831317, + "city": "Upham", + "state": "ND", + "county": "Mchenry" + }, + { + "zip_code": 58790, + "latitude": 48.021268, + "longitude": -100.629723, + "city": "Velva", + "state": "ND", + "county": "Mchenry" + }, + { + "zip_code": 58792, + "latitude": 47.98605, + "longitude": -100.798821, + "city": "Voltaire", + "state": "ND", + "county": "Mchenry" + }, + { + "zip_code": 58793, + "latitude": 48.86655, + "longitude": -100.836782, + "city": "Westhope", + "state": "ND", + "county": "Bottineau" + }, + { + "zip_code": 58794, + "latitude": 48.299352, + "longitude": -102.770085, + "city": "White Earth", + "state": "ND", + "county": "Mountrail" + }, + { + "zip_code": 58795, + "latitude": 48.567814, + "longitude": -103.153622, + "city": "Wildrose", + "state": "ND", + "county": "Williams" + }, + { + "zip_code": 58801, + "latitude": 48.225729, + "longitude": -103.649047, + "city": "Williston", + "state": "ND", + "county": "Williams" + }, + { + "zip_code": 58802, + "latitude": 48.168836, + "longitude": -103.614824, + "city": "Williston", + "state": "ND", + "county": "Williams" + }, + { + "zip_code": 58830, + "latitude": 48.538749, + "longitude": -103.47341, + "city": "Alamo", + "state": "ND", + "county": "Williams" + }, + { + "zip_code": 58831, + "latitude": 47.737435, + "longitude": -103.298383, + "city": "Alexander", + "state": "ND", + "county": "Mckenzie" + }, + { + "zip_code": 58833, + "latitude": 48.816502, + "longitude": -103.467251, + "city": "Ambrose", + "state": "ND", + "county": "Divide" + }, + { + "zip_code": 58835, + "latitude": 47.807748, + "longitude": -103.438887, + "city": "Arnegard", + "state": "ND", + "county": "Mckenzie" + }, + { + "zip_code": 58838, + "latitude": 47.737435, + "longitude": -103.298383, + "city": "Cartwright", + "state": "ND", + "county": "Mckenzie" + }, + { + "zip_code": 58843, + "latitude": 48.276356, + "longitude": -103.376284, + "city": "Epping", + "state": "ND", + "county": "Williams" + }, + { + "zip_code": 58844, + "latitude": 48.816502, + "longitude": -103.467251, + "city": "Fortuna", + "state": "ND", + "county": "Divide" + }, + { + "zip_code": 58845, + "latitude": 48.5252, + "longitude": -103.917588, + "city": "Grenora", + "state": "ND", + "county": "Williams" + }, + { + "zip_code": 58847, + "latitude": 47.737435, + "longitude": -103.298383, + "city": "Keene", + "state": "ND", + "county": "Mckenzie" + }, + { + "zip_code": 58849, + "latitude": 48.321696, + "longitude": -103.165391, + "city": "Ray", + "state": "ND", + "county": "Williams" + }, + { + "zip_code": 58852, + "latitude": 48.364623, + "longitude": -102.957597, + "city": "Tioga", + "state": "ND", + "county": "Williams" + }, + { + "zip_code": 58853, + "latitude": 48.295057, + "longitude": -103.438083, + "city": "Trenton", + "state": "ND", + "county": "Williams" + }, + { + "zip_code": 58854, + "latitude": 47.802905, + "longitude": -103.2667, + "city": "Watford City", + "state": "ND", + "county": "Mckenzie" + }, + { + "zip_code": 58856, + "latitude": 48.532242, + "longitude": -103.772098, + "city": "Zahl", + "state": "ND", + "county": "Williams" + }, + { + "zip_code": 59001, + "latitude": 45.515571, + "longitude": -109.455156, + "city": "Absarokee", + "state": "MT", + "county": "Stillwater" + }, + { + "zip_code": 59002, + "latitude": 45.929056, + "longitude": -108.688831, + "city": "Acton", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59003, + "latitude": 45.605673, + "longitude": -106.278272, + "city": "Ashland", + "state": "MT", + "county": "Rosebud" + }, + { + "zip_code": 59004, + "latitude": 46.017965, + "longitude": -106.99199, + "city": "Ashland", + "state": "MT", + "county": "Rosebud" + }, + { + "zip_code": 59006, + "latitude": 45.892314, + "longitude": -108.098389, + "city": "Ballantine", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59007, + "latitude": 45.161913, + "longitude": -109.158349, + "city": "Bearcreek", + "state": "MT", + "county": "Carbon" + }, + { + "zip_code": 59008, + "latitude": 45.091835, + "longitude": -109.034212, + "city": "Belfry", + "state": "MT", + "county": "Carbon" + }, + { + "zip_code": 59010, + "latitude": 46.176296, + "longitude": -107.33875, + "city": "Bighorn", + "state": "MT", + "county": "Treasure" + }, + { + "zip_code": 59011, + "latitude": 45.834206, + "longitude": -109.950025, + "city": "Big Timber", + "state": "MT", + "county": "Sweet Grass" + }, + { + "zip_code": 59012, + "latitude": 46.017965, + "longitude": -106.99199, + "city": "Birney", + "state": "MT", + "county": "Rosebud" + }, + { + "zip_code": 59013, + "latitude": 45.410149, + "longitude": -109.136458, + "city": "Boyd", + "state": "MT", + "county": "Carbon" + }, + { + "zip_code": 59014, + "latitude": 45.335953, + "longitude": -108.920853, + "city": "Bridger", + "state": "MT", + "county": "Carbon" + }, + { + "zip_code": 59015, + "latitude": 46.041717, + "longitude": -108.759561, + "city": "Broadview", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59016, + "latitude": 45.536218, + "longitude": -106.961213, + "city": "Busby", + "state": "MT", + "county": "Big Horn" + }, + { + "zip_code": 59018, + "latitude": 45.834082, + "longitude": -110.622234, + "city": "Clyde Park", + "state": "MT", + "county": "Park" + }, + { + "zip_code": 59019, + "latitude": 45.657453, + "longitude": -109.206617, + "city": "Columbus", + "state": "MT", + "county": "Stillwater" + }, + { + "zip_code": 59020, + "latitude": 45.023373, + "longitude": -109.90697, + "city": "Cooke City", + "state": "MT", + "county": "Park" + }, + { + "zip_code": 59022, + "latitude": 45.608203, + "longitude": -107.469868, + "city": "Crow Agency", + "state": "MT", + "county": "Big Horn" + }, + { + "zip_code": 59024, + "latitude": 46.212579, + "longitude": -107.693279, + "city": "Custer", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59025, + "latitude": 45.518708, + "longitude": -107.481697, + "city": "Decker", + "state": "MT", + "county": "Big Horn" + }, + { + "zip_code": 59026, + "latitude": 45.444257, + "longitude": -108.848692, + "city": "Edgar", + "state": "MT", + "county": "Carbon" + }, + { + "zip_code": 59027, + "latitude": 45.270789, + "longitude": -110.792071, + "city": "Emigrant", + "state": "MT", + "county": "Park" + }, + { + "zip_code": 59028, + "latitude": 45.410217, + "longitude": -109.771658, + "city": "Fishtail", + "state": "MT", + "county": "Stillwater" + }, + { + "zip_code": 59029, + "latitude": 45.398686, + "longitude": -108.817298, + "city": "Fromberg", + "state": "MT", + "county": "Carbon" + }, + { + "zip_code": 59030, + "latitude": 45.114735, + "longitude": -110.809991, + "city": "Gardiner", + "state": "MT", + "county": "Park" + }, + { + "zip_code": 59031, + "latitude": 45.518708, + "longitude": -107.481697, + "city": "Garryowen", + "state": "MT", + "county": "Big Horn" + }, + { + "zip_code": 59032, + "latitude": 47.286641, + "longitude": -108.763415, + "city": "Grass Range", + "state": "MT", + "county": "Fergus" + }, + { + "zip_code": 59033, + "latitude": 45.696301, + "longitude": -109.855062, + "city": "Greycliff", + "state": "MT", + "county": "Sweet Grass" + }, + { + "zip_code": 59034, + "latitude": 45.52731, + "longitude": -107.6963, + "city": "Hardin", + "state": "MT", + "county": "Big Horn" + }, + { + "zip_code": 59035, + "latitude": 45.308898, + "longitude": -107.925665, + "city": "Yellowtail", + "state": "MT", + "county": "Big Horn" + }, + { + "zip_code": 59036, + "latitude": 46.447745, + "longitude": -109.843492, + "city": "Harlowton", + "state": "MT", + "county": "Wheatland" + }, + { + "zip_code": 59037, + "latitude": 45.876735, + "longitude": -108.211535, + "city": "Huntley", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59038, + "latitude": 46.290753, + "longitude": -107.228948, + "city": "Hysham", + "state": "MT", + "county": "Treasure" + }, + { + "zip_code": 59039, + "latitude": 46.017965, + "longitude": -106.99199, + "city": "Ingomar", + "state": "MT", + "county": "Rosebud" + }, + { + "zip_code": 59041, + "latitude": 45.494126, + "longitude": -108.992234, + "city": "Joliet", + "state": "MT", + "county": "Carbon" + }, + { + "zip_code": 59043, + "latitude": 45.620185, + "longitude": -106.678901, + "city": "Lame Deer", + "state": "MT", + "county": "Rosebud" + }, + { + "zip_code": 59044, + "latitude": 45.80418, + "longitude": -108.227571, + "city": "Laurel", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59046, + "latitude": 46.383858, + "longitude": -109.003382, + "city": "Lavina", + "state": "MT", + "county": "Golden Valley" + }, + { + "zip_code": 59047, + "latitude": 45.530664, + "longitude": -110.369054, + "city": "Livingston", + "state": "MT", + "county": "Park" + }, + { + "zip_code": 59050, + "latitude": 45.316565, + "longitude": -107.367494, + "city": "Lodge Grass", + "state": "MT", + "county": "Big Horn" + }, + { + "zip_code": 59052, + "latitude": 45.832835, + "longitude": -109.955671, + "city": "Mc Leod", + "state": "MT", + "county": "Sweet Grass" + }, + { + "zip_code": 59053, + "latitude": 46.619039, + "longitude": -110.845396, + "city": "Martinsdale", + "state": "MT", + "county": "Meagher" + }, + { + "zip_code": 59054, + "latitude": 46.598623, + "longitude": -107.869188, + "city": "Melstone", + "state": "MT", + "county": "Musselshell" + }, + { + "zip_code": 59055, + "latitude": 45.696301, + "longitude": -109.855062, + "city": "Melville", + "state": "MT", + "county": "Sweet Grass" + }, + { + "zip_code": 59057, + "latitude": 45.944684, + "longitude": -108.911917, + "city": "Molt", + "state": "MT", + "county": "Stillwater" + }, + { + "zip_code": 59058, + "latitude": 47.414133, + "longitude": -107.027417, + "city": "Mosby", + "state": "MT", + "county": "Garfield" + }, + { + "zip_code": 59059, + "latitude": 46.515315, + "longitude": -108.089742, + "city": "Musselshell", + "state": "MT", + "county": "Musselshell" + }, + { + "zip_code": 59061, + "latitude": 45.475459, + "longitude": -109.595984, + "city": "Nye", + "state": "MT", + "county": "Stillwater" + }, + { + "zip_code": 59062, + "latitude": 45.391078, + "longitude": -105.630461, + "city": "Otter", + "state": "MT", + "county": "Powder River" + }, + { + "zip_code": 59063, + "latitude": 45.657911, + "longitude": -109.047266, + "city": "Park City", + "state": "MT", + "county": "Stillwater" + }, + { + "zip_code": 59064, + "latitude": 45.964417, + "longitude": -107.938592, + "city": "Pompeys Pillar", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59065, + "latitude": 45.333104, + "longitude": -110.713691, + "city": "Pray", + "state": "MT", + "county": "Park" + }, + { + "zip_code": 59066, + "latitude": 45.518708, + "longitude": -107.481697, + "city": "Pryor", + "state": "MT", + "county": "Big Horn" + }, + { + "zip_code": 59067, + "latitude": 45.948864, + "longitude": -109.230246, + "city": "Rapelje", + "state": "MT", + "county": "Stillwater" + }, + { + "zip_code": 59068, + "latitude": 45.241262, + "longitude": -109.323626, + "city": "Red Lodge", + "state": "MT", + "county": "Carbon" + }, + { + "zip_code": 59069, + "latitude": 45.743871, + "longitude": -109.522372, + "city": "Reed Point", + "state": "MT", + "county": "Stillwater" + }, + { + "zip_code": 59070, + "latitude": 45.354073, + "longitude": -109.207199, + "city": "Roberts", + "state": "MT", + "county": "Carbon" + }, + { + "zip_code": 59071, + "latitude": 45.319054, + "longitude": -108.948445, + "city": "Roscoe", + "state": "MT", + "county": "Carbon" + }, + { + "zip_code": 59072, + "latitude": 46.440929, + "longitude": -108.427325, + "city": "Roundup", + "state": "MT", + "county": "Musselshell" + }, + { + "zip_code": 59073, + "latitude": 46.444224, + "longitude": -108.395473, + "city": "Roundup", + "state": "MT", + "county": "Musselshell" + }, + { + "zip_code": 59074, + "latitude": 46.378527, + "longitude": -109.257354, + "city": "Ryegate", + "state": "MT", + "county": "Golden Valley" + }, + { + "zip_code": 59075, + "latitude": 45.518708, + "longitude": -107.481697, + "city": "Saint Xavier", + "state": "MT", + "county": "Big Horn" + }, + { + "zip_code": 59076, + "latitude": 46.176296, + "longitude": -107.33875, + "city": "Sanders", + "state": "MT", + "county": "Treasure" + }, + { + "zip_code": 59077, + "latitude": 47.414133, + "longitude": -107.027417, + "city": "Sand Springs", + "state": "MT", + "county": "Garfield" + }, + { + "zip_code": 59078, + "latitude": 46.485721, + "longitude": -109.834856, + "city": "Shawmut", + "state": "MT", + "county": "Wheatland" + }, + { + "zip_code": 59079, + "latitude": 46.082782, + "longitude": -108.435851, + "city": "Shepherd", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59081, + "latitude": 45.004618, + "longitude": -109.98539, + "city": "Silver Gate", + "state": "MT", + "county": "Park" + }, + { + "zip_code": 59082, + "latitude": 45.33333, + "longitude": -110.477384, + "city": "Springdale", + "state": "MT", + "county": "Park" + }, + { + "zip_code": 59083, + "latitude": 46.017965, + "longitude": -106.99199, + "city": "Sumatra", + "state": "MT", + "county": "Rosebud" + }, + { + "zip_code": 59084, + "latitude": 47.173641, + "longitude": -108.281168, + "city": "Teigen", + "state": "MT", + "county": "Petroleum" + }, + { + "zip_code": 59085, + "latitude": 46.424187, + "longitude": -110.071194, + "city": "Two Dot", + "state": "MT", + "county": "Wheatland" + }, + { + "zip_code": 59086, + "latitude": 46.016146, + "longitude": -110.599503, + "city": "Wilsall", + "state": "MT", + "county": "Park" + }, + { + "zip_code": 59087, + "latitude": 47.002053, + "longitude": -108.122735, + "city": "Winnett", + "state": "MT", + "county": "Petroleum" + }, + { + "zip_code": 59088, + "latitude": 46.091269, + "longitude": -108.011128, + "city": "Worden", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59089, + "latitude": 45.518708, + "longitude": -107.481697, + "city": "Wyola", + "state": "MT", + "county": "Big Horn" + }, + { + "zip_code": 59101, + "latitude": 45.686966, + "longitude": -108.387392, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59102, + "latitude": 45.790379, + "longitude": -108.588144, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59103, + "latitude": 45.978288, + "longitude": -108.194508, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59104, + "latitude": 45.978288, + "longitude": -108.194508, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59105, + "latitude": 45.949726, + "longitude": -108.599037, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59106, + "latitude": 45.799217, + "longitude": -108.568842, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59107, + "latitude": 45.825204, + "longitude": -108.393388, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59108, + "latitude": 45.978288, + "longitude": -108.194508, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59111, + "latitude": 45.978288, + "longitude": -108.194508, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59112, + "latitude": 45.978288, + "longitude": -108.194508, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59114, + "latitude": 45.978288, + "longitude": -108.194508, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59115, + "latitude": 45.978288, + "longitude": -108.194508, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59116, + "latitude": 45.978288, + "longitude": -108.194508, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59117, + "latitude": 45.978288, + "longitude": -108.194508, + "city": "Billings", + "state": "MT", + "county": "Yellowstone" + }, + { + "zip_code": 59201, + "latitude": 48.2088, + "longitude": -105.072426, + "city": "Wolf Point", + "state": "MT", + "county": "Roosevelt" + }, + { + "zip_code": 59211, + "latitude": 48.700718, + "longitude": -104.360729, + "city": "Antelope", + "state": "MT", + "county": "Sheridan" + }, + { + "zip_code": 59212, + "latitude": 48.139784, + "longitude": -104.219188, + "city": "Bainville", + "state": "MT", + "county": "Roosevelt" + }, + { + "zip_code": 59213, + "latitude": 48.280119, + "longitude": -104.94413, + "city": "Brockton", + "state": "MT", + "county": "Roosevelt" + }, + { + "zip_code": 59214, + "latitude": 47.24993, + "longitude": -105.906002, + "city": "Brockway", + "state": "MT", + "county": "Mccone" + }, + { + "zip_code": 59215, + "latitude": 47.484243, + "longitude": -105.758852, + "city": "Circle", + "state": "MT", + "county": "Mccone" + }, + { + "zip_code": 59217, + "latitude": 47.711026, + "longitude": -104.183625, + "city": "Crane", + "state": "MT", + "county": "Richland" + }, + { + "zip_code": 59218, + "latitude": 48.150238, + "longitude": -104.517106, + "city": "Culbertson", + "state": "MT", + "county": "Roosevelt" + }, + { + "zip_code": 59219, + "latitude": 48.558851, + "longitude": -104.294475, + "city": "Dagmar", + "state": "MT", + "county": "Sheridan" + }, + { + "zip_code": 59221, + "latitude": 47.853542, + "longitude": -104.061953, + "city": "Fairview", + "state": "MT", + "county": "Richland" + }, + { + "zip_code": 59222, + "latitude": 48.781396, + "longitude": -105.562544, + "city": "Flaxville", + "state": "MT", + "county": "Daniels" + }, + { + "zip_code": 59223, + "latitude": 48.019588, + "longitude": -106.446962, + "city": "Fort Peck", + "state": "MT", + "county": "Valley" + }, + { + "zip_code": 59225, + "latitude": 48.295916, + "longitude": -106.032354, + "city": "Frazer", + "state": "MT", + "county": "Valley" + }, + { + "zip_code": 59226, + "latitude": 48.335745, + "longitude": -104.492637, + "city": "Froid", + "state": "MT", + "county": "Roosevelt" + }, + { + "zip_code": 59230, + "latitude": 48.43923, + "longitude": -106.474987, + "city": "Glasgow", + "state": "MT", + "county": "Valley" + }, + { + "zip_code": 59231, + "latitude": 48.403894, + "longitude": -106.542815, + "city": "Saint Marie", + "state": "MT", + "county": "Valley" + }, + { + "zip_code": 59240, + "latitude": 48.330241, + "longitude": -106.609665, + "city": "Glentana", + "state": "MT", + "county": "Valley" + }, + { + "zip_code": 59241, + "latitude": 48.342617, + "longitude": -106.854457, + "city": "Hinsdale", + "state": "MT", + "county": "Valley" + }, + { + "zip_code": 59242, + "latitude": 48.292043, + "longitude": -104.813996, + "city": "Homestead", + "state": "MT", + "county": "Roosevelt" + }, + { + "zip_code": 59243, + "latitude": 47.752074, + "longitude": -104.638367, + "city": "Lambert", + "state": "MT", + "county": "Richland" + }, + { + "zip_code": 59244, + "latitude": 48.678589, + "longitude": -106.357152, + "city": "Larslan", + "state": "MT", + "county": "Valley" + }, + { + "zip_code": 59245, + "latitude": 48.280119, + "longitude": -104.94413, + "city": "Mc Cabe", + "state": "MT", + "county": "Roosevelt" + }, + { + "zip_code": 59247, + "latitude": 48.544896, + "longitude": -104.418145, + "city": "Medicine Lake", + "state": "MT", + "county": "Sheridan" + }, + { + "zip_code": 59248, + "latitude": 48.216068, + "longitude": -106.320808, + "city": "Nashua", + "state": "MT", + "county": "Valley" + }, + { + "zip_code": 59250, + "latitude": 48.912477, + "longitude": -106.272664, + "city": "Opheim", + "state": "MT", + "county": "Valley" + }, + { + "zip_code": 59252, + "latitude": 48.899627, + "longitude": -104.793406, + "city": "Outlook", + "state": "MT", + "county": "Sheridan" + }, + { + "zip_code": 59253, + "latitude": 48.72942, + "longitude": -105.885542, + "city": "Peerless", + "state": "MT", + "county": "Daniels" + }, + { + "zip_code": 59254, + "latitude": 48.747919, + "longitude": -104.468029, + "city": "Plentywood", + "state": "MT", + "county": "Sheridan" + }, + { + "zip_code": 59255, + "latitude": 48.115522, + "longitude": -105.189701, + "city": "Poplar", + "state": "MT", + "county": "Roosevelt" + }, + { + "zip_code": 59256, + "latitude": 48.694565, + "longitude": -104.552352, + "city": "Raymond", + "state": "MT", + "county": "Sheridan" + }, + { + "zip_code": 59257, + "latitude": 48.728018, + "longitude": -104.940164, + "city": "Redstone", + "state": "MT", + "county": "Sheridan" + }, + { + "zip_code": 59258, + "latitude": 48.569892, + "longitude": -104.570289, + "city": "Reserve", + "state": "MT", + "county": "Sheridan" + }, + { + "zip_code": 59259, + "latitude": 47.463408, + "longitude": -104.988111, + "city": "Richey", + "state": "MT", + "county": "Dawson" + }, + { + "zip_code": 59260, + "latitude": 48.650714, + "longitude": -106.119229, + "city": "Richland", + "state": "MT", + "county": "Valley" + }, + { + "zip_code": 59261, + "latitude": 48.457237, + "longitude": -107.342553, + "city": "Saco", + "state": "MT", + "county": "Phillips" + }, + { + "zip_code": 59262, + "latitude": 47.452578, + "longitude": -104.342955, + "city": "Savage", + "state": "MT", + "county": "Richland" + }, + { + "zip_code": 59263, + "latitude": 48.712594, + "longitude": -105.535656, + "city": "Scobey", + "state": "MT", + "county": "Daniels" + }, + { + "zip_code": 59270, + "latitude": 47.655825, + "longitude": -104.195206, + "city": "Sidney", + "state": "MT", + "county": "Richland" + }, + { + "zip_code": 59273, + "latitude": 48.330241, + "longitude": -106.609665, + "city": "Vandalia", + "state": "MT", + "county": "Valley" + }, + { + "zip_code": 59274, + "latitude": 47.874088, + "longitude": -105.535752, + "city": "Vida", + "state": "MT", + "county": "Mccone" + }, + { + "zip_code": 59275, + "latitude": 48.868265, + "longitude": -104.314372, + "city": "Westby", + "state": "MT", + "county": "Sheridan" + }, + { + "zip_code": 59276, + "latitude": 48.8956, + "longitude": -105.161657, + "city": "Whitetail", + "state": "MT", + "county": "Daniels" + }, + { + "zip_code": 59301, + "latitude": 46.447808, + "longitude": -105.795343, + "city": "Miles City", + "state": "MT", + "county": "Custer" + }, + { + "zip_code": 59311, + "latitude": 45.567085, + "longitude": -104.539066, + "city": "Alzada", + "state": "MT", + "county": "Carter" + }, + { + "zip_code": 59312, + "latitude": 46.017965, + "longitude": -106.99199, + "city": "Angela", + "state": "MT", + "county": "Rosebud" + }, + { + "zip_code": 59313, + "latitude": 46.351496, + "longitude": -104.273377, + "city": "Baker", + "state": "MT", + "county": "Fallon" + }, + { + "zip_code": 59314, + "latitude": 45.391078, + "longitude": -105.630461, + "city": "Biddle", + "state": "MT", + "county": "Powder River" + }, + { + "zip_code": 59315, + "latitude": 47.409962, + "longitude": -104.959584, + "city": "Bloomfield", + "state": "MT", + "county": "Dawson" + }, + { + "zip_code": 59316, + "latitude": 45.567085, + "longitude": -104.539066, + "city": "Boyes", + "state": "MT", + "county": "Carter" + }, + { + "zip_code": 59317, + "latitude": 45.25719, + "longitude": -105.256813, + "city": "Broadus", + "state": "MT", + "county": "Powder River" + }, + { + "zip_code": 59318, + "latitude": 47.414133, + "longitude": -107.027417, + "city": "Brusett", + "state": "MT", + "county": "Garfield" + }, + { + "zip_code": 59319, + "latitude": 45.567085, + "longitude": -104.539066, + "city": "Capitol", + "state": "MT", + "county": "Carter" + }, + { + "zip_code": 59322, + "latitude": 47.414133, + "longitude": -107.027417, + "city": "Cohagen", + "state": "MT", + "county": "Garfield" + }, + { + "zip_code": 59323, + "latitude": 45.934423, + "longitude": -106.636783, + "city": "Colstrip", + "state": "MT", + "county": "Rosebud" + }, + { + "zip_code": 59324, + "latitude": 45.897576, + "longitude": -104.640001, + "city": "Ekalaka", + "state": "MT", + "county": "Carter" + }, + { + "zip_code": 59326, + "latitude": 46.860997, + "longitude": -105.345182, + "city": "Fallon", + "state": "MT", + "county": "Prairie" + }, + { + "zip_code": 59327, + "latitude": 46.174223, + "longitude": -106.6303, + "city": "Forsyth", + "state": "MT", + "county": "Rosebud" + }, + { + "zip_code": 59330, + "latitude": 47.180623, + "longitude": -104.774873, + "city": "Glendive", + "state": "MT", + "county": "Dawson" + }, + { + "zip_code": 59332, + "latitude": 45.567085, + "longitude": -104.539066, + "city": "Hammond", + "state": "MT", + "county": "Carter" + }, + { + "zip_code": 59333, + "latitude": 46.017965, + "longitude": -106.99199, + "city": "Hathaway", + "state": "MT", + "county": "Rosebud" + }, + { + "zip_code": 59336, + "latitude": 46.323967, + "longitude": -105.462341, + "city": "Ismay", + "state": "MT", + "county": "Custer" + }, + { + "zip_code": 59337, + "latitude": 47.325641, + "longitude": -106.943963, + "city": "Jordan", + "state": "MT", + "county": "Garfield" + }, + { + "zip_code": 59338, + "latitude": 46.323967, + "longitude": -105.462341, + "city": "Kinsey", + "state": "MT", + "county": "Custer" + }, + { + "zip_code": 59339, + "latitude": 47.254164, + "longitude": -105.172545, + "city": "Lindsay", + "state": "MT", + "county": "Dawson" + }, + { + "zip_code": 59341, + "latitude": 46.860997, + "longitude": -105.345182, + "city": "Mildred", + "state": "MT", + "county": "Prairie" + }, + { + "zip_code": 59343, + "latitude": 45.391078, + "longitude": -105.630461, + "city": "Olive", + "state": "MT", + "county": "Powder River" + }, + { + "zip_code": 59344, + "latitude": 46.283486, + "longitude": -104.475079, + "city": "Plevna", + "state": "MT", + "county": "Fallon" + }, + { + "zip_code": 59345, + "latitude": 45.391078, + "longitude": -105.630461, + "city": "Powderville", + "state": "MT", + "county": "Powder River" + }, + { + "zip_code": 59347, + "latitude": 46.267953, + "longitude": -106.666959, + "city": "Rosebud", + "state": "MT", + "county": "Rosebud" + }, + { + "zip_code": 59348, + "latitude": 45.391078, + "longitude": -105.630461, + "city": "Sonnette", + "state": "MT", + "county": "Powder River" + }, + { + "zip_code": 59349, + "latitude": 46.789256, + "longitude": -105.312757, + "city": "Terry", + "state": "MT", + "county": "Prairie" + }, + { + "zip_code": 59351, + "latitude": 46.323967, + "longitude": -105.462341, + "city": "Volborg", + "state": "MT", + "county": "Custer" + }, + { + "zip_code": 59353, + "latitude": 46.824454, + "longitude": -104.122311, + "city": "Wibaux", + "state": "MT", + "county": "Wibaux" + }, + { + "zip_code": 59354, + "latitude": 46.283486, + "longitude": -104.475079, + "city": "Willard", + "state": "MT", + "county": "Fallon" + }, + { + "zip_code": 59401, + "latitude": 47.402024, + "longitude": -111.422948, + "city": "Great Falls", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59402, + "latitude": 47.510209, + "longitude": -111.195906, + "city": "Malmstrom A F B", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59403, + "latitude": 47.258392, + "longitude": -111.341975, + "city": "Great Falls", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59404, + "latitude": 47.554109, + "longitude": -111.391407, + "city": "Great Falls", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59405, + "latitude": 47.277623, + "longitude": -111.290803, + "city": "Great Falls", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59406, + "latitude": 47.619998, + "longitude": -111.239305, + "city": "Great Falls", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59410, + "latitude": 47.444053, + "longitude": -112.513362, + "city": "Augusta", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59411, + "latitude": 48.904169, + "longitude": -113.298384, + "city": "Babb", + "state": "MT", + "county": "Glacier" + }, + { + "zip_code": 59412, + "latitude": 47.319621, + "longitude": -110.884712, + "city": "Belt", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59414, + "latitude": 47.533156, + "longitude": -111.234986, + "city": "Black Eagle", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59416, + "latitude": 48.065733, + "longitude": -111.715365, + "city": "Brady", + "state": "MT", + "county": "Pondera" + }, + { + "zip_code": 59417, + "latitude": 48.649105, + "longitude": -112.793626, + "city": "Browning", + "state": "MT", + "county": "Glacier" + }, + { + "zip_code": 59418, + "latitude": 47.248497, + "longitude": -109.26308, + "city": "Buffalo", + "state": "MT", + "county": "Fergus" + }, + { + "zip_code": 59419, + "latitude": 48.052324, + "longitude": -112.457343, + "city": "Bynum", + "state": "MT", + "county": "Teton" + }, + { + "zip_code": 59420, + "latitude": 47.861021, + "longitude": -110.471075, + "city": "Carter", + "state": "MT", + "county": "Chouteau" + }, + { + "zip_code": 59421, + "latitude": 47.276562, + "longitude": -111.730457, + "city": "Cascade", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59422, + "latitude": 47.824102, + "longitude": -112.266872, + "city": "Choteau", + "state": "MT", + "county": "Teton" + }, + { + "zip_code": 59424, + "latitude": 47.248497, + "longitude": -109.26308, + "city": "Coffee Creek", + "state": "MT", + "county": "Fergus" + }, + { + "zip_code": 59425, + "latitude": 48.182782, + "longitude": -111.845931, + "city": "Conrad", + "state": "MT", + "county": "Pondera" + }, + { + "zip_code": 59427, + "latitude": 48.654298, + "longitude": -112.93062, + "city": "Cut Bank", + "state": "MT", + "county": "Glacier" + }, + { + "zip_code": 59430, + "latitude": 47.432933, + "longitude": -109.973645, + "city": "Denton", + "state": "MT", + "county": "Fergus" + }, + { + "zip_code": 59432, + "latitude": 48.181533, + "longitude": -112.594329, + "city": "Dupuyer", + "state": "MT", + "county": "Pondera" + }, + { + "zip_code": 59433, + "latitude": 47.842372, + "longitude": -111.795709, + "city": "Dutton", + "state": "MT", + "county": "Teton" + }, + { + "zip_code": 59434, + "latitude": 48.445686, + "longitude": -113.218976, + "city": "East Glacier Park", + "state": "MT", + "county": "Glacier" + }, + { + "zip_code": 59435, + "latitude": 48.609072, + "longitude": -111.731852, + "city": "Ethridge", + "state": "MT", + "county": "Toole" + }, + { + "zip_code": 59436, + "latitude": 47.61386, + "longitude": -112.207191, + "city": "Fairfield", + "state": "MT", + "county": "Teton" + }, + { + "zip_code": 59440, + "latitude": 47.861021, + "longitude": -110.471075, + "city": "Floweree", + "state": "MT", + "county": "Chouteau" + }, + { + "zip_code": 59441, + "latitude": 47.248497, + "longitude": -109.26308, + "city": "Forestgrove", + "state": "MT", + "county": "Fergus" + }, + { + "zip_code": 59442, + "latitude": 47.67977, + "longitude": -110.44038, + "city": "Fort Benton", + "state": "MT", + "county": "Chouteau" + }, + { + "zip_code": 59443, + "latitude": 47.545978, + "longitude": -111.875624, + "city": "Fort Shaw", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59444, + "latitude": 48.811061, + "longitude": -111.470386, + "city": "Galata", + "state": "MT", + "county": "Toole" + }, + { + "zip_code": 59445, + "latitude": 47.055715, + "longitude": -109.468299, + "city": "Garneill", + "state": "MT", + "county": "Fergus" + }, + { + "zip_code": 59446, + "latitude": 47.600099, + "longitude": -110.26891, + "city": "Geraldine", + "state": "MT", + "county": "Chouteau" + }, + { + "zip_code": 59447, + "latitude": 47.258941, + "longitude": -110.494703, + "city": "Geyser", + "state": "MT", + "county": "Judith Basin" + }, + { + "zip_code": 59448, + "latitude": 48.297291, + "longitude": -112.845587, + "city": "Heart Butte", + "state": "MT", + "county": "Pondera" + }, + { + "zip_code": 59450, + "latitude": 47.861021, + "longitude": -110.471075, + "city": "Highwood", + "state": "MT", + "county": "Chouteau" + }, + { + "zip_code": 59451, + "latitude": 47.415174, + "longitude": -109.395158, + "city": "Hilger", + "state": "MT", + "county": "Fergus" + }, + { + "zip_code": 59452, + "latitude": 46.996773, + "longitude": -109.875615, + "city": "Hobson", + "state": "MT", + "county": "Judith Basin" + }, + { + "zip_code": 59453, + "latitude": 46.485721, + "longitude": -109.834856, + "city": "Judith Gap", + "state": "MT", + "county": "Wheatland" + }, + { + "zip_code": 59454, + "latitude": 48.750313, + "longitude": -111.579092, + "city": "Kevin", + "state": "MT", + "county": "Toole" + }, + { + "zip_code": 59456, + "latitude": 48.27717, + "longitude": -111.828592, + "city": "Ledger", + "state": "MT", + "county": "Pondera" + }, + { + "zip_code": 59457, + "latitude": 47.250047, + "longitude": -109.381996, + "city": "Lewistown", + "state": "MT", + "county": "Fergus" + }, + { + "zip_code": 59460, + "latitude": 47.936513, + "longitude": -110.502597, + "city": "Loma", + "state": "MT", + "county": "Chouteau" + }, + { + "zip_code": 59461, + "latitude": 48.609072, + "longitude": -111.731852, + "city": "Lothair", + "state": "MT", + "county": "Liberty" + }, + { + "zip_code": 59462, + "latitude": 47.051079, + "longitude": -109.910548, + "city": "Moccasin", + "state": "MT", + "county": "Judith Basin" + }, + { + "zip_code": 59463, + "latitude": 47.05149, + "longitude": -110.883026, + "city": "Monarch", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59464, + "latitude": 46.974485, + "longitude": -109.693316, + "city": "Moore", + "state": "MT", + "county": "Fergus" + }, + { + "zip_code": 59465, + "latitude": 47.293879, + "longitude": -111.153717, + "city": "Neihart", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59466, + "latitude": 48.825895, + "longitude": -111.691145, + "city": "Oilmont", + "state": "MT", + "county": "Toole" + }, + { + "zip_code": 59467, + "latitude": 48.042871, + "longitude": -112.316655, + "city": "Pendroy", + "state": "MT", + "county": "Teton" + }, + { + "zip_code": 59468, + "latitude": 47.726972, + "longitude": -111.6938, + "city": "Power", + "state": "MT", + "county": "Teton" + }, + { + "zip_code": 59469, + "latitude": 47.044583, + "longitude": -110.267003, + "city": "Raynesford", + "state": "MT", + "county": "Judith Basin" + }, + { + "zip_code": 59471, + "latitude": 47.308278, + "longitude": -109.085342, + "city": "Roy", + "state": "MT", + "county": "Fergus" + }, + { + "zip_code": 59472, + "latitude": 47.408651, + "longitude": -111.136243, + "city": "Sand Coulee", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59473, + "latitude": 48.65417, + "longitude": -113.126262, + "city": "Santa Rita", + "state": "MT", + "county": "Glacier" + }, + { + "zip_code": 59474, + "latitude": 48.610551, + "longitude": -111.73233, + "city": "Shelby", + "state": "MT", + "county": "Toole" + }, + { + "zip_code": 59477, + "latitude": 47.495784, + "longitude": -111.886092, + "city": "Simms", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59479, + "latitude": 47.151357, + "longitude": -110.222384, + "city": "Stanford", + "state": "MT", + "county": "Judith Basin" + }, + { + "zip_code": 59480, + "latitude": 47.25466, + "longitude": -111.083851, + "city": "Stockett", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59482, + "latitude": 48.879199, + "longitude": -111.735136, + "city": "Sunburst", + "state": "MT", + "county": "Toole" + }, + { + "zip_code": 59483, + "latitude": 47.4808, + "longitude": -111.753303, + "city": "Sun River", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59484, + "latitude": 48.940067, + "longitude": -111.849008, + "city": "Sweet Grass", + "state": "MT", + "county": "Toole" + }, + { + "zip_code": 59485, + "latitude": 47.353925, + "longitude": -111.595425, + "city": "Ulm", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59486, + "latitude": 48.270833, + "longitude": -112.311973, + "city": "Valier", + "state": "MT", + "county": "Pondera" + }, + { + "zip_code": 59487, + "latitude": 47.580761, + "longitude": -111.637014, + "city": "Vaughn", + "state": "MT", + "county": "Cascade" + }, + { + "zip_code": 59489, + "latitude": 47.065531, + "longitude": -109.430106, + "city": "Winifred", + "state": "MT", + "county": "Fergus" + }, + { + "zip_code": 59501, + "latitude": 48.663002, + "longitude": -110.09437, + "city": "Havre", + "state": "MT", + "county": "Hill" + }, + { + "zip_code": 59520, + "latitude": 48.17641, + "longitude": -110.311201, + "city": "Big Sandy", + "state": "MT", + "county": "Chouteau" + }, + { + "zip_code": 59521, + "latitude": 48.320405, + "longitude": -110.215299, + "city": "Box Elder", + "state": "MT", + "county": "Hill" + }, + { + "zip_code": 59522, + "latitude": 48.510659, + "longitude": -110.967372, + "city": "Chester", + "state": "MT", + "county": "Liberty" + }, + { + "zip_code": 59523, + "latitude": 48.487741, + "longitude": -109.261678, + "city": "Chinook", + "state": "MT", + "county": "Blaine" + }, + { + "zip_code": 59524, + "latitude": 48.394962, + "longitude": -108.246539, + "city": "Dodson", + "state": "MT", + "county": "Phillips" + }, + { + "zip_code": 59525, + "latitude": 48.571498, + "longitude": -110.301301, + "city": "Gildford", + "state": "MT", + "county": "Hill" + }, + { + "zip_code": 59526, + "latitude": 48.655123, + "longitude": -108.818157, + "city": "Harlem", + "state": "MT", + "county": "Blaine" + }, + { + "zip_code": 59527, + "latitude": 48.360516, + "longitude": -108.89392, + "city": "Hays", + "state": "MT", + "county": "Blaine" + }, + { + "zip_code": 59528, + "latitude": 48.571498, + "longitude": -110.301301, + "city": "Hingham", + "state": "MT", + "county": "Hill" + }, + { + "zip_code": 59529, + "latitude": 48.360516, + "longitude": -108.89392, + "city": "Hogeland", + "state": "MT", + "county": "Blaine" + }, + { + "zip_code": 59530, + "latitude": 48.566602, + "longitude": -110.110287, + "city": "Inverness", + "state": "MT", + "county": "Hill" + }, + { + "zip_code": 59531, + "latitude": 48.565402, + "longitude": -111.075884, + "city": "Joplin", + "state": "MT", + "county": "Liberty" + }, + { + "zip_code": 59532, + "latitude": 48.449359, + "longitude": -110.106003, + "city": "Kremlin", + "state": "MT", + "county": "Hill" + }, + { + "zip_code": 59535, + "latitude": 48.360516, + "longitude": -108.89392, + "city": "Lloyd", + "state": "MT", + "county": "Blaine" + }, + { + "zip_code": 59537, + "latitude": 48.224749, + "longitude": -108.035444, + "city": "Loring", + "state": "MT", + "county": "Phillips" + }, + { + "zip_code": 59538, + "latitude": 48.124479, + "longitude": -107.783145, + "city": "Malta", + "state": "MT", + "county": "Phillips" + }, + { + "zip_code": 59540, + "latitude": 48.566602, + "longitude": -110.110287, + "city": "Rudyard", + "state": "MT", + "county": "Hill" + }, + { + "zip_code": 59542, + "latitude": 48.360516, + "longitude": -108.89392, + "city": "Turner", + "state": "MT", + "county": "Blaine" + }, + { + "zip_code": 59544, + "latitude": 48.224749, + "longitude": -108.035444, + "city": "Whitewater", + "state": "MT", + "county": "Phillips" + }, + { + "zip_code": 59545, + "latitude": 48.50968, + "longitude": -110.966631, + "city": "Whitlash", + "state": "MT", + "county": "Liberty" + }, + { + "zip_code": 59546, + "latitude": 48.224749, + "longitude": -108.035444, + "city": "Zortman", + "state": "MT", + "county": "Phillips" + }, + { + "zip_code": 59547, + "latitude": 48.360516, + "longitude": -108.89392, + "city": "Zurich", + "state": "MT", + "county": "Blaine" + }, + { + "zip_code": 59601, + "latitude": 46.70934, + "longitude": -112.197616, + "city": "Helena", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59602, + "latitude": 46.707449, + "longitude": -111.957961, + "city": "Helena", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59604, + "latitude": 46.6672, + "longitude": -111.968877, + "city": "Helena", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59620, + "latitude": 47.184233, + "longitude": -112.330214, + "city": "Helena", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59623, + "latitude": 46.590083, + "longitude": -112.040173, + "city": "Helena", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59624, + "latitude": 46.610002, + "longitude": -112.062393, + "city": "Helena", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59625, + "latitude": 46.601832, + "longitude": -112.041346, + "city": "Helena", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59626, + "latitude": 47.184233, + "longitude": -112.330214, + "city": "Helena", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59631, + "latitude": 46.329577, + "longitude": -112.196662, + "city": "Basin", + "state": "MT", + "county": "Jefferson" + }, + { + "zip_code": 59632, + "latitude": 46.141948, + "longitude": -111.942989, + "city": "Boulder", + "state": "MT", + "county": "Jefferson" + }, + { + "zip_code": 59633, + "latitude": 47.184233, + "longitude": -112.330214, + "city": "Canyon Creek", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59634, + "latitude": 46.388739, + "longitude": -112.07162, + "city": "Clancy", + "state": "MT", + "county": "Jefferson" + }, + { + "zip_code": 59635, + "latitude": 46.633769, + "longitude": -111.852594, + "city": "East Helena", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59636, + "latitude": 46.609677, + "longitude": -112.121494, + "city": "Fort Harrison", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59638, + "latitude": 46.367883, + "longitude": -112.023155, + "city": "Jefferson City", + "state": "MT", + "county": "Jefferson" + }, + { + "zip_code": 59639, + "latitude": 46.958253, + "longitude": -112.623833, + "city": "Lincoln", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59640, + "latitude": 46.749945, + "longitude": -112.299402, + "city": "Marysville", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59641, + "latitude": 46.206922, + "longitude": -111.634364, + "city": "Radersburg", + "state": "MT", + "county": "Broadwater" + }, + { + "zip_code": 59642, + "latitude": 46.636196, + "longitude": -110.965623, + "city": "Ringling", + "state": "MT", + "county": "Meagher" + }, + { + "zip_code": 59643, + "latitude": 46.285118, + "longitude": -111.526373, + "city": "Toston", + "state": "MT", + "county": "Broadwater" + }, + { + "zip_code": 59644, + "latitude": 46.406137, + "longitude": -111.399649, + "city": "Townsend", + "state": "MT", + "county": "Broadwater" + }, + { + "zip_code": 59645, + "latitude": 46.63316, + "longitude": -111.050627, + "city": "White Sulphur Springs", + "state": "MT", + "county": "Meagher" + }, + { + "zip_code": 59647, + "latitude": 46.45447, + "longitude": -111.650954, + "city": "Winston", + "state": "MT", + "county": "Broadwater" + }, + { + "zip_code": 59648, + "latitude": 47.085616, + "longitude": -112.147602, + "city": "Wolf Creek", + "state": "MT", + "county": "Lewis And Clark" + }, + { + "zip_code": 59701, + "latitude": 45.997895, + "longitude": -112.598765, + "city": "Butte", + "state": "MT", + "county": "Silver Bow" + }, + { + "zip_code": 59702, + "latitude": 45.905345, + "longitude": -112.637705, + "city": "Butte", + "state": "MT", + "county": "Silver Bow" + }, + { + "zip_code": 59703, + "latitude": 45.905345, + "longitude": -112.637705, + "city": "Butte", + "state": "MT", + "county": "Silver Bow" + }, + { + "zip_code": 59707, + "latitude": 45.905345, + "longitude": -112.637705, + "city": "Butte", + "state": "MT", + "county": "Silver Bow" + }, + { + "zip_code": 59710, + "latitude": 45.193898, + "longitude": -112.056807, + "city": "Alder", + "state": "MT", + "county": "Madison" + }, + { + "zip_code": 59711, + "latitude": 46.15821, + "longitude": -113.009421, + "city": "Anaconda", + "state": "MT", + "county": "Deer Lodge" + }, + { + "zip_code": 59713, + "latitude": 46.565725, + "longitude": -112.649859, + "city": "Avon", + "state": "MT", + "county": "Powell" + }, + { + "zip_code": 59714, + "latitude": 45.426786, + "longitude": -111.099517, + "city": "Belgrade", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59715, + "latitude": 45.809998, + "longitude": -111.168212, + "city": "Bozeman", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59716, + "latitude": 45.27826, + "longitude": -111.270773, + "city": "Big Sky", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59717, + "latitude": 45.627982, + "longitude": -110.90128, + "city": "Bozeman", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59718, + "latitude": 45.66812, + "longitude": -111.240393, + "city": "Bozeman", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59719, + "latitude": 45.627982, + "longitude": -110.90128, + "city": "Bozeman", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59720, + "latitude": 44.992962, + "longitude": -111.528472, + "city": "Cameron", + "state": "MT", + "county": "Madison" + }, + { + "zip_code": 59721, + "latitude": 45.870517, + "longitude": -111.889682, + "city": "Cardwell", + "state": "MT", + "county": "Jefferson" + }, + { + "zip_code": 59722, + "latitude": 46.401859, + "longitude": -112.642136, + "city": "Deer Lodge", + "state": "MT", + "county": "Powell" + }, + { + "zip_code": 59724, + "latitude": 45.149805, + "longitude": -112.70073, + "city": "Dell", + "state": "MT", + "county": "Beaverhead" + }, + { + "zip_code": 59725, + "latitude": 45.244373, + "longitude": -112.99687, + "city": "Dillon", + "state": "MT", + "county": "Beaverhead" + }, + { + "zip_code": 59727, + "latitude": 45.905345, + "longitude": -112.637705, + "city": "Divide", + "state": "MT", + "county": "Silver Bow" + }, + { + "zip_code": 59728, + "latitude": 46.503396, + "longitude": -112.400742, + "city": "Elliston", + "state": "MT", + "county": "Powell" + }, + { + "zip_code": 59729, + "latitude": 45.289586, + "longitude": -111.665136, + "city": "Ennis", + "state": "MT", + "county": "Madison" + }, + { + "zip_code": 59730, + "latitude": 45.338987, + "longitude": -111.24848, + "city": "Gallatin Gateway", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59731, + "latitude": 46.594845, + "longitude": -112.775572, + "city": "Garrison", + "state": "MT", + "county": "Powell" + }, + { + "zip_code": 59732, + "latitude": 45.149805, + "longitude": -112.70073, + "city": "Glen", + "state": "MT", + "county": "Beaverhead" + }, + { + "zip_code": 59733, + "latitude": 46.58791, + "longitude": -112.936757, + "city": "Gold Creek", + "state": "MT", + "county": "Powell" + }, + { + "zip_code": 59735, + "latitude": 45.283594, + "longitude": -112.027561, + "city": "Harrison", + "state": "MT", + "county": "Madison" + }, + { + "zip_code": 59736, + "latitude": 45.368653, + "longitude": -113.359826, + "city": "Jackson", + "state": "MT", + "county": "Beaverhead" + }, + { + "zip_code": 59739, + "latitude": 44.699033, + "longitude": -112.663633, + "city": "Lima", + "state": "MT", + "county": "Beaverhead" + }, + { + "zip_code": 59740, + "latitude": 45.408045, + "longitude": -111.776123, + "city": "Mc Allister", + "state": "MT", + "county": "Madison" + }, + { + "zip_code": 59741, + "latitude": 45.771228, + "longitude": -111.374118, + "city": "Manhattan", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59743, + "latitude": 45.905345, + "longitude": -112.637705, + "city": "Melrose", + "state": "MT", + "county": "Silver Bow" + }, + { + "zip_code": 59745, + "latitude": 45.566095, + "longitude": -111.721631, + "city": "Norris", + "state": "MT", + "county": "Madison" + }, + { + "zip_code": 59746, + "latitude": 45.56265, + "longitude": -113.018805, + "city": "Polaris", + "state": "MT", + "county": "Beaverhead" + }, + { + "zip_code": 59747, + "latitude": 45.283594, + "longitude": -112.027561, + "city": "Pony", + "state": "MT", + "county": "Madison" + }, + { + "zip_code": 59748, + "latitude": 46.028844, + "longitude": -112.758914, + "city": "Ramsay", + "state": "MT", + "county": "Silver Bow" + }, + { + "zip_code": 59749, + "latitude": 45.309586, + "longitude": -111.932378, + "city": "Sheridan", + "state": "MT", + "county": "Madison" + }, + { + "zip_code": 59750, + "latitude": 45.939758, + "longitude": -112.736528, + "city": "Butte", + "state": "MT", + "county": "Silver Bow" + }, + { + "zip_code": 59751, + "latitude": 45.700002, + "longitude": -112.253501, + "city": "Silver Star", + "state": "MT", + "county": "Madison" + }, + { + "zip_code": 59752, + "latitude": 45.375515, + "longitude": -111.45624, + "city": "Three Forks", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59754, + "latitude": 45.492611, + "longitude": -112.416508, + "city": "Twin Bridges", + "state": "MT", + "county": "Madison" + }, + { + "zip_code": 59755, + "latitude": 45.325565, + "longitude": -111.868085, + "city": "Virginia City", + "state": "MT", + "county": "Madison" + }, + { + "zip_code": 59756, + "latitude": 46.218279, + "longitude": -112.811742, + "city": "Warm Springs", + "state": "MT", + "county": "Deer Lodge" + }, + { + "zip_code": 59758, + "latitude": 44.763016, + "longitude": -111.237705, + "city": "West Yellowstone", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59759, + "latitude": 45.996345, + "longitude": -112.088845, + "city": "Whitehall", + "state": "MT", + "county": "Jefferson" + }, + { + "zip_code": 59760, + "latitude": 45.782744, + "longitude": -111.634532, + "city": "Willow Creek", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59761, + "latitude": 45.542434, + "longitude": -113.473541, + "city": "Wisdom", + "state": "MT", + "county": "Beaverhead" + }, + { + "zip_code": 59762, + "latitude": 45.720048, + "longitude": -113.250784, + "city": "Wise River", + "state": "MT", + "county": "Beaverhead" + }, + { + "zip_code": 59771, + "latitude": 45.72465, + "longitude": -111.123775, + "city": "Bozeman", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59772, + "latitude": 45.636149, + "longitude": -111.064676, + "city": "Bozeman", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59773, + "latitude": 45.627982, + "longitude": -110.90128, + "city": "Bozeman", + "state": "MT", + "county": "Gallatin" + }, + { + "zip_code": 59801, + "latitude": 46.853606, + "longitude": -113.909123, + "city": "Missoula", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59802, + "latitude": 46.989689, + "longitude": -113.954788, + "city": "Missoula", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59803, + "latitude": 46.811758, + "longitude": -113.987645, + "city": "Missoula", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59804, + "latitude": 46.846708, + "longitude": -114.169784, + "city": "Missoula", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59806, + "latitude": 47.116034, + "longitude": -114.049824, + "city": "Missoula", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59807, + "latitude": 46.910342, + "longitude": -113.958686, + "city": "Missoula", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59808, + "latitude": 46.977603, + "longitude": -114.061856, + "city": "Missoula", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59812, + "latitude": 47.116034, + "longitude": -114.049824, + "city": "Missoula", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59820, + "latitude": 46.989275, + "longitude": -114.558456, + "city": "Alberton", + "state": "MT", + "county": "Mineral" + }, + { + "zip_code": 59821, + "latitude": 47.220055, + "longitude": -114.024625, + "city": "Arlee", + "state": "MT", + "county": "Lake" + }, + { + "zip_code": 59823, + "latitude": 46.870183, + "longitude": -113.727871, + "city": "Bonner", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59824, + "latitude": 47.312398, + "longitude": -114.176098, + "city": "Charlo", + "state": "MT", + "county": "Lake" + }, + { + "zip_code": 59825, + "latitude": 46.778468, + "longitude": -113.683052, + "city": "Clinton", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59826, + "latitude": 47.479334, + "longitude": -113.677639, + "city": "Condon", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59827, + "latitude": 45.918972, + "longitude": -114.05904, + "city": "Conner", + "state": "MT", + "county": "Ravalli" + }, + { + "zip_code": 59828, + "latitude": 46.446801, + "longitude": -114.117918, + "city": "Corvallis", + "state": "MT", + "county": "Ravalli" + }, + { + "zip_code": 59829, + "latitude": 46.086434, + "longitude": -114.176841, + "city": "Darby", + "state": "MT", + "county": "Ravalli" + }, + { + "zip_code": 59830, + "latitude": 47.388827, + "longitude": -115.347934, + "city": "De Borgia", + "state": "MT", + "county": "Mineral" + }, + { + "zip_code": 59831, + "latitude": 47.306957, + "longitude": -114.328588, + "city": "Dixon", + "state": "MT", + "county": "Sanders" + }, + { + "zip_code": 59832, + "latitude": 46.687633, + "longitude": -113.215445, + "city": "Drummond", + "state": "MT", + "county": "Granite" + }, + { + "zip_code": 59833, + "latitude": 46.617296, + "longitude": -114.04192, + "city": "Florence", + "state": "MT", + "county": "Ravalli" + }, + { + "zip_code": 59834, + "latitude": 47.065558, + "longitude": -114.251384, + "city": "Frenchtown", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59835, + "latitude": 46.060169, + "longitude": -114.040777, + "city": "Grantsdale", + "state": "MT", + "county": "Ravalli" + }, + { + "zip_code": 59836, + "latitude": 47.013278, + "longitude": -113.444116, + "city": "Greenough", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59837, + "latitude": 46.466704, + "longitude": -113.23873, + "city": "Hall", + "state": "MT", + "county": "Granite" + }, + { + "zip_code": 59840, + "latitude": 46.234189, + "longitude": -114.165774, + "city": "Hamilton", + "state": "MT", + "county": "Ravalli" + }, + { + "zip_code": 59841, + "latitude": 46.332893, + "longitude": -114.223493, + "city": "Pinesdale", + "state": "MT", + "county": "Ravalli" + }, + { + "zip_code": 59842, + "latitude": 47.402824, + "longitude": -115.516347, + "city": "Haugan", + "state": "MT", + "county": "Mineral" + }, + { + "zip_code": 59843, + "latitude": 46.863363, + "longitude": -112.931166, + "city": "Helmville", + "state": "MT", + "county": "Powell" + }, + { + "zip_code": 59844, + "latitude": 48.047863, + "longitude": -115.969619, + "city": "Heron", + "state": "MT", + "county": "Sanders" + }, + { + "zip_code": 59845, + "latitude": 47.633565, + "longitude": -114.553693, + "city": "Hot Springs", + "state": "MT", + "county": "Sanders" + }, + { + "zip_code": 59846, + "latitude": 47.067886, + "longitude": -114.398643, + "city": "Huson", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59847, + "latitude": 46.7454, + "longitude": -114.299241, + "city": "Lolo", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59848, + "latitude": 47.725065, + "longitude": -114.657042, + "city": "Lonepine", + "state": "MT", + "county": "Sanders" + }, + { + "zip_code": 59851, + "latitude": 46.873695, + "longitude": -113.878294, + "city": "Milltown", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59853, + "latitude": 48.076781, + "longitude": -115.858153, + "city": "Noxon", + "state": "MT", + "county": "Sanders" + }, + { + "zip_code": 59854, + "latitude": 47.035882, + "longitude": -113.097461, + "city": "Ovando", + "state": "MT", + "county": "Powell" + }, + { + "zip_code": 59855, + "latitude": 47.651275, + "longitude": -114.212413, + "city": "Pablo", + "state": "MT", + "county": "Lake" + }, + { + "zip_code": 59856, + "latitude": 47.387824, + "longitude": -114.799, + "city": "Paradise", + "state": "MT", + "county": "Sanders" + }, + { + "zip_code": 59858, + "latitude": 46.272241, + "longitude": -113.435709, + "city": "Philipsburg", + "state": "MT", + "county": "Granite" + }, + { + "zip_code": 59859, + "latitude": 47.603143, + "longitude": -115.083253, + "city": "Plains", + "state": "MT", + "county": "Sanders" + }, + { + "zip_code": 59860, + "latitude": 47.737279, + "longitude": -114.230256, + "city": "Polson", + "state": "MT", + "county": "Lake" + }, + { + "zip_code": 59863, + "latitude": 47.594957, + "longitude": -114.101443, + "city": "Ravalli", + "state": "MT", + "county": "Lake" + }, + { + "zip_code": 59864, + "latitude": 47.507347, + "longitude": -114.178287, + "city": "Ronan", + "state": "MT", + "county": "Lake" + }, + { + "zip_code": 59865, + "latitude": 47.37245, + "longitude": -114.064086, + "city": "Saint Ignatius", + "state": "MT", + "county": "Lake" + }, + { + "zip_code": 59866, + "latitude": 47.311106, + "longitude": -115.140511, + "city": "Saint Regis", + "state": "MT", + "county": "Mineral" + }, + { + "zip_code": 59867, + "latitude": 47.399653, + "longitude": -115.422358, + "city": "Saltese", + "state": "MT", + "county": "Mineral" + }, + { + "zip_code": 59868, + "latitude": 47.300776, + "longitude": -113.548481, + "city": "Seeley Lake", + "state": "MT", + "county": "Missoula" + }, + { + "zip_code": 59870, + "latitude": 46.320508, + "longitude": -114.047154, + "city": "Stevensville", + "state": "MT", + "county": "Ravalli" + }, + { + "zip_code": 59871, + "latitude": 45.843266, + "longitude": -113.874776, + "city": "Sula", + "state": "MT", + "county": "Ravalli" + }, + { + "zip_code": 59872, + "latitude": 47.137198, + "longitude": -114.747599, + "city": "Superior", + "state": "MT", + "county": "Mineral" + }, + { + "zip_code": 59873, + "latitude": 47.744885, + "longitude": -115.407291, + "city": "Thompson Falls", + "state": "MT", + "county": "Sanders" + }, + { + "zip_code": 59874, + "latitude": 47.794472, + "longitude": -115.538422, + "city": "Trout Creek", + "state": "MT", + "county": "Sanders" + }, + { + "zip_code": 59875, + "latitude": 46.395224, + "longitude": -114.160159, + "city": "Victor", + "state": "MT", + "county": "Ravalli" + }, + { + "zip_code": 59901, + "latitude": 48.202765, + "longitude": -114.303919, + "city": "Kalispell", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59902, + "latitude": 48.189424, + "longitude": -114.143531, + "city": "Kalispell", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59903, + "latitude": 48.22372, + "longitude": -114.429648, + "city": "Kalispell", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59904, + "latitude": 48.240382, + "longitude": -114.256123, + "city": "Kalispell", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59910, + "latitude": 47.76942, + "longitude": -114.281296, + "city": "Big Arm", + "state": "MT", + "county": "Lake" + }, + { + "zip_code": 59911, + "latitude": 48.145854, + "longitude": -113.921121, + "city": "Bigfork", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59912, + "latitude": 48.358322, + "longitude": -114.345902, + "city": "Columbia Falls", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59913, + "latitude": 48.434243, + "longitude": -114.058384, + "city": "Coram", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59914, + "latitude": 47.854921, + "longitude": -114.281873, + "city": "Dayton", + "state": "MT", + "county": "Lake" + }, + { + "zip_code": 59915, + "latitude": 47.696598, + "longitude": -114.214962, + "city": "Elmo", + "state": "MT", + "county": "Lake" + }, + { + "zip_code": 59916, + "latitude": 48.324238, + "longitude": -113.893384, + "city": "Essex", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59917, + "latitude": 48.729135, + "longitude": -115.345992, + "city": "Eureka", + "state": "MT", + "county": "Lincoln" + }, + { + "zip_code": 59918, + "latitude": 48.758601, + "longitude": -114.880925, + "city": "Fortine", + "state": "MT", + "county": "Lincoln" + }, + { + "zip_code": 59919, + "latitude": 48.279332, + "longitude": -113.910545, + "city": "Hungry Horse", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59920, + "latitude": 48.047758, + "longitude": -114.513752, + "city": "Kila", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59921, + "latitude": 48.298875, + "longitude": -113.949739, + "city": "Lake Mc Donald", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59922, + "latitude": 48.17669, + "longitude": -114.234902, + "city": "Lakeside", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59923, + "latitude": 48.380992, + "longitude": -115.394062, + "city": "Libby", + "state": "MT", + "county": "Lincoln" + }, + { + "zip_code": 59925, + "latitude": 48.09368, + "longitude": -114.727422, + "city": "Marion", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59926, + "latitude": 48.400447, + "longitude": -114.087311, + "city": "Martin City", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59927, + "latitude": 48.545453, + "longitude": -114.591981, + "city": "Olney", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59928, + "latitude": 48.77808, + "longitude": -114.338774, + "city": "Polebridge", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59929, + "latitude": 47.907058, + "longitude": -114.341333, + "city": "Proctor", + "state": "MT", + "county": "Lake" + }, + { + "zip_code": 59930, + "latitude": 48.867183, + "longitude": -115.118207, + "city": "Rexford", + "state": "MT", + "county": "Lincoln" + }, + { + "zip_code": 59931, + "latitude": 47.899392, + "longitude": -114.206827, + "city": "Rollins", + "state": "MT", + "county": "Lake" + }, + { + "zip_code": 59932, + "latitude": 48.06771, + "longitude": -114.2017, + "city": "Somers", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59933, + "latitude": 48.44572, + "longitude": -115.330964, + "city": "Stryker", + "state": "MT", + "county": "Lincoln" + }, + { + "zip_code": 59934, + "latitude": 48.44572, + "longitude": -115.330964, + "city": "Trego", + "state": "MT", + "county": "Lincoln" + }, + { + "zip_code": 59935, + "latitude": 48.580494, + "longitude": -115.816915, + "city": "Troy", + "state": "MT", + "county": "Lincoln" + }, + { + "zip_code": 59936, + "latitude": 48.432962, + "longitude": -114.062198, + "city": "West Glacier", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 59937, + "latitude": 48.274564, + "longitude": -114.365126, + "city": "Whitefish", + "state": "MT", + "county": "Flathead" + }, + { + "zip_code": 60001, + "latitude": 42.324761, + "longitude": -88.452481, + "city": "Alden", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60002, + "latitude": 42.451419, + "longitude": -88.075733, + "city": "Antioch", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60004, + "latitude": 42.085626, + "longitude": -87.99822, + "city": "Arlington Heights", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60005, + "latitude": 42.060928, + "longitude": -87.883073, + "city": "Arlington Heights", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60006, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Arlington Heights", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60007, + "latitude": 42.020278, + "longitude": -87.905866, + "city": "Elk Grove Village", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60008, + "latitude": 42.074226, + "longitude": -88.026871, + "city": "Rolling Meadows", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60009, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Elk Grove Village", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60010, + "latitude": 42.2735, + "longitude": -88.072583, + "city": "Barrington", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60011, + "latitude": 42.322814, + "longitude": -87.610053, + "city": "Barrington", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60012, + "latitude": 42.232096, + "longitude": -88.305292, + "city": "Crystal Lake", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60013, + "latitude": 42.204626, + "longitude": -88.250783, + "city": "Cary", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60014, + "latitude": 42.243772, + "longitude": -88.323986, + "city": "Crystal Lake", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60015, + "latitude": 42.178175, + "longitude": -87.866818, + "city": "Deerfield", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60016, + "latitude": 42.048278, + "longitude": -87.890466, + "city": "Des Plaines", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60017, + "latitude": 42.028779, + "longitude": -87.894366, + "city": "Des Plaines", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60018, + "latitude": 42.015479, + "longitude": -87.868714, + "city": "Des Plaines", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60019, + "latitude": 42.024278, + "longitude": -87.907066, + "city": "Des Plaines", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60020, + "latitude": 42.40247, + "longitude": -88.170234, + "city": "Fox Lake", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60021, + "latitude": 42.213058, + "longitude": -88.250406, + "city": "Fox River Grove", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60022, + "latitude": 42.102927, + "longitude": -87.815914, + "city": "Glencoe", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60025, + "latitude": 42.082715, + "longitude": -87.819714, + "city": "Glenview", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60026, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Glenview Nas", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60029, + "latitude": 42.058029, + "longitude": -87.791636, + "city": "Golf", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60030, + "latitude": 42.352423, + "longitude": -88.054502, + "city": "Grayslake", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60031, + "latitude": 42.375121, + "longitude": -87.939683, + "city": "Gurnee", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60033, + "latitude": 42.362962, + "longitude": -88.495375, + "city": "Harvard", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60034, + "latitude": 42.455151, + "longitude": -88.430802, + "city": "Hebron", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60035, + "latitude": 42.187424, + "longitude": -87.811865, + "city": "Highland Park", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60037, + "latitude": 42.255073, + "longitude": -87.818268, + "city": "Fort Sheridan", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60038, + "latitude": 42.097976, + "longitude": -88.014072, + "city": "Palatine", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60039, + "latitude": 42.324761, + "longitude": -88.452481, + "city": "Crystal Lake", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60040, + "latitude": 42.207374, + "longitude": -87.814666, + "city": "Highwood", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60041, + "latitude": 42.366521, + "longitude": -88.145683, + "city": "Ingleside", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60042, + "latitude": 42.27179, + "longitude": -88.188464, + "city": "Island Lake", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60043, + "latitude": 42.088428, + "longitude": -87.71456, + "city": "Kenilworth", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60044, + "latitude": 42.294172, + "longitude": -87.86767, + "city": "Lake Bluff", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60045, + "latitude": 42.240027, + "longitude": -87.877569, + "city": "Lake Forest", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60046, + "latitude": 42.381271, + "longitude": -87.999077, + "city": "Lake Villa", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60047, + "latitude": 42.216543, + "longitude": -88.076942, + "city": "Lake Zurich", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60048, + "latitude": 42.28947, + "longitude": -87.957724, + "city": "Libertyville", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60049, + "latitude": 42.198674, + "longitude": -88.041875, + "city": "Long Grove", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60050, + "latitude": 42.296671, + "longitude": -88.320886, + "city": "Mchenry", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60051, + "latitude": 42.324761, + "longitude": -88.452481, + "city": "Mchenry", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60053, + "latitude": 42.039329, + "longitude": -87.793815, + "city": "Morton Grove", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60055, + "latitude": 42.097976, + "longitude": -88.014072, + "city": "Palatine", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60056, + "latitude": 42.062377, + "longitude": -87.931797, + "city": "Mount Prospect", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60060, + "latitude": 42.252523, + "longitude": -88.027327, + "city": "Mundelein", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60061, + "latitude": 42.231183, + "longitude": -87.962973, + "city": "Vernon Hills", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60062, + "latitude": 42.120176, + "longitude": -87.838815, + "city": "Northbrook", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60064, + "latitude": 42.347324, + "longitude": -87.962976, + "city": "North Chicago", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60065, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Northbrook", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60067, + "latitude": 42.101977, + "longitude": -88.055804, + "city": "Palatine", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60068, + "latitude": 42.037228, + "longitude": -87.843714, + "city": "Park Ridge", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60069, + "latitude": 42.309143, + "longitude": -87.987213, + "city": "Lincolnshire", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60070, + "latitude": 42.105805, + "longitude": -87.939519, + "city": "Prospect Heights", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60071, + "latitude": 42.328463, + "longitude": -88.429864, + "city": "Richmond", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60072, + "latitude": 42.404829, + "longitude": -88.305439, + "city": "Ringwood", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60073, + "latitude": 42.279215, + "longitude": -88.050226, + "city": "Round Lake", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60074, + "latitude": 42.129875, + "longitude": -88.049424, + "city": "Palatine", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60075, + "latitude": 42.322814, + "longitude": -87.610053, + "city": "Russell", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60076, + "latitude": 42.057878, + "longitude": -87.883566, + "city": "Skokie", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60077, + "latitude": 42.03468, + "longitude": -87.76266, + "city": "Skokie", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60078, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Palatine", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60079, + "latitude": 42.322814, + "longitude": -87.610053, + "city": "Waukegan", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60080, + "latitude": 42.442519, + "longitude": -88.276047, + "city": "Solon Mills", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60081, + "latitude": 42.367273, + "longitude": -88.252639, + "city": "Spring Grove", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60082, + "latitude": 42.116377, + "longitude": -87.812064, + "city": "Techny", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60083, + "latitude": 42.440139, + "longitude": -87.940027, + "city": "Wadsworth", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60084, + "latitude": 42.249873, + "longitude": -88.073127, + "city": "Wauconda", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60085, + "latitude": 42.327366, + "longitude": -87.982025, + "city": "Waukegan", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60086, + "latitude": 42.43335, + "longitude": -87.776595, + "city": "North Chicago", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60087, + "latitude": 42.372921, + "longitude": -87.868471, + "city": "Waukegan", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60088, + "latitude": 42.309272, + "longitude": -87.85427, + "city": "Great Lakes", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60089, + "latitude": 42.180411, + "longitude": -87.960771, + "city": "Buffalo Grove", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60090, + "latitude": 42.124176, + "longitude": -87.933819, + "city": "Wheeling", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60091, + "latitude": 42.079228, + "longitude": -87.72836, + "city": "Wilmette", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60092, + "latitude": 42.322814, + "longitude": -87.610053, + "city": "Libertyville", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60093, + "latitude": 42.112176, + "longitude": -87.940168, + "city": "Winnetka", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60094, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Palatine", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60095, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Palatine", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60096, + "latitude": 42.47832, + "longitude": -87.834222, + "city": "Winthrop Harbor", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60097, + "latitude": 42.355165, + "longitude": -88.332794, + "city": "Wonder Lake", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60098, + "latitude": 42.320271, + "longitude": -88.462832, + "city": "Woodstock", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60099, + "latitude": 42.45577, + "longitude": -87.884975, + "city": "Zion", + "state": "IL", + "county": "Lake" + }, + { + "zip_code": 60101, + "latitude": 41.887579, + "longitude": -88.022516, + "city": "Addison", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60102, + "latitude": 42.280715, + "longitude": -88.461937, + "city": "Algonquin", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60103, + "latitude": 42.033376, + "longitude": -88.157756, + "city": "Bartlett", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60104, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Bellwood", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60105, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Bensenville", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60106, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Bensenville", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60107, + "latitude": 42.019093, + "longitude": -88.178475, + "city": "Streamwood", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60108, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Bloomingdale", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60109, + "latitude": 42.045792, + "longitude": -88.539027, + "city": "Burlington", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60110, + "latitude": 42.125008, + "longitude": -88.297238, + "city": "Carpentersville", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60111, + "latitude": 42.008626, + "longitude": -88.83055, + "city": "Clare", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60112, + "latitude": 41.926177, + "longitude": -88.684007, + "city": "Cortland", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60113, + "latitude": 41.931158, + "longitude": -88.956564, + "city": "Creston", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 60115, + "latitude": 41.816826, + "longitude": -88.79101, + "city": "Dekalb", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60116, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Carol Stream", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60117, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Bloomingdale", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60118, + "latitude": 42.022867, + "longitude": -88.417789, + "city": "Dundee", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60119, + "latitude": 41.834928, + "longitude": -88.469931, + "city": "Elburn", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60120, + "latitude": 41.990689, + "longitude": -88.429777, + "city": "Elgin", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60121, + "latitude": 42.04133, + "longitude": -88.3126, + "city": "Elgin", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60122, + "latitude": 42.067101, + "longitude": -88.304994, + "city": "Elgin", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60123, + "latitude": 42.036325, + "longitude": -88.371044, + "city": "Elgin", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60125, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Carol Stream", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60126, + "latitude": 41.88353, + "longitude": -87.946413, + "city": "Elmhurst", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60128, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Carol Stream", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60129, + "latitude": 42.042932, + "longitude": -88.919791, + "city": "Esmond", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60130, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Forest Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60131, + "latitude": 41.93598, + "longitude": -87.884962, + "city": "Franklin Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60132, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Carol Stream", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60133, + "latitude": "", + "longitude": "", + "city": "Hanover Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60134, + "latitude": 41.97974, + "longitude": -88.406165, + "city": "Geneva", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60135, + "latitude": 42.10153, + "longitude": -88.718101, + "city": "Genoa", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60136, + "latitude": 42.102524, + "longitude": -88.379932, + "city": "Gilberts", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60137, + "latitude": 41.872034, + "longitude": -88.029385, + "city": "Glen Ellyn", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60138, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Glen Ellyn", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60139, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Glendale Heights", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60140, + "latitude": 42.027886, + "longitude": -88.454812, + "city": "Hampshire", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60141, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Hines", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60142, + "latitude": 42.197379, + "longitude": -88.450815, + "city": "Huntley", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60143, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Itasca", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60144, + "latitude": 41.936977, + "longitude": -88.420178, + "city": "Kaneville", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60145, + "latitude": 42.090787, + "longitude": -88.762765, + "city": "Kingston", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60146, + "latitude": 42.087039, + "longitude": -88.871153, + "city": "Kirkland", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60147, + "latitude": 41.936977, + "longitude": -88.420178, + "city": "Lafox", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60148, + "latitude": 41.869829, + "longitude": -88.003864, + "city": "Lombard", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60150, + "latitude": 41.931731, + "longitude": -88.88516, + "city": "Malta", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60151, + "latitude": 41.922915, + "longitude": -88.507929, + "city": "Maple Park", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60152, + "latitude": 42.255176, + "longitude": -88.607897, + "city": "Marengo", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60153, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Maywood", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60154, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Westchester", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60155, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Broadview", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60156, + "latitude": "", + "longitude": "", + "city": "Lake In The Hills", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60157, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Medinah", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60159, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Schaumburg", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60160, + "latitude": 41.91488, + "longitude": -87.858707, + "city": "Melrose Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60161, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Melrose Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60162, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Hillside", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60163, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Berkeley", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60164, + "latitude": 41.92138, + "longitude": -87.892412, + "city": "Melrose Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60165, + "latitude": 41.90743, + "longitude": -87.878011, + "city": "Stone Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60168, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Schaumburg", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60170, + "latitude": 42.025776, + "longitude": -88.425931, + "city": "Plato Center", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60171, + "latitude": 41.923168, + "longitude": -87.83931, + "city": "River Grove", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60172, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Roselle", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60173, + "latitude": 42.079837, + "longitude": -88.046403, + "city": "Schaumburg", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60174, + "latitude": 41.937151, + "longitude": -88.430167, + "city": "Saint Charles", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60175, + "latitude": 41.943171, + "longitude": -88.386905, + "city": "Saint Charles", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60176, + "latitude": 41.95918, + "longitude": -87.873412, + "city": "Schiller Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60177, + "latitude": 42.007476, + "longitude": -88.405895, + "city": "South Elgin", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60178, + "latitude": 41.893687, + "longitude": -88.68562, + "city": "Sycamore", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60179, + "latitude": 42.079336, + "longitude": -88.223655, + "city": "Hoffman Estates", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60180, + "latitude": 42.222569, + "longitude": -88.525091, + "city": "Union", + "state": "IL", + "county": "Mchenry" + }, + { + "zip_code": 60181, + "latitude": 41.875379, + "longitude": -87.97643, + "city": "Villa Park", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60182, + "latitude": 41.908736, + "longitude": -88.59915, + "city": "Virgil", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60183, + "latitude": 41.936977, + "longitude": -88.420178, + "city": "Wasco", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60184, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Wayne", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60185, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "West Chicago", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60186, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "West Chicago", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60187, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Wheaton", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60188, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Carol Stream", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60189, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Wheaton", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60190, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Winfield", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60191, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Wood Dale", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60192, + "latitude": 42.092487, + "longitude": -88.116129, + "city": "Schaumburg", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60193, + "latitude": 42.016827, + "longitude": -88.117844, + "city": "Schaumburg", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60194, + "latitude": 42.028926, + "longitude": -88.116655, + "city": "Schaumburg", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60195, + "latitude": 42.076376, + "longitude": -88.109263, + "city": "Schaumburg", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60196, + "latitude": 42.056376, + "longitude": -88.072522, + "city": "Schaumburg", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60197, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Carol Stream", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60199, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Carol Stream", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60201, + "latitude": 42.049148, + "longitude": -87.702155, + "city": "Evanston", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60202, + "latitude": 42.044529, + "longitude": -87.687969, + "city": "Evanston", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60203, + "latitude": 42.047928, + "longitude": -87.718159, + "city": "Evanston", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60204, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Evanston", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60208, + "latitude": 42.058629, + "longitude": -87.684506, + "city": "Evanston", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60209, + "latitude": 42.04973, + "longitude": -87.679408, + "city": "Evanston", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60301, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Oak Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60302, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Oak Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60303, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Oak Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60304, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Oak Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60305, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "River Forest", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60399, + "latitude": "", + "longitude": "", + "city": "Bensenville", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60401, + "latitude": 41.356872, + "longitude": -87.626723, + "city": "Beecher", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60402, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Berwyn", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60406, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Blue Island", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60407, + "latitude": 41.238676, + "longitude": -88.278834, + "city": "Braceville", + "state": "IL", + "county": "Grundy" + }, + { + "zip_code": 60408, + "latitude": 41.285878, + "longitude": -88.017171, + "city": "Braidwood", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60409, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Calumet City", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60410, + "latitude": 41.43313, + "longitude": -88.199325, + "city": "Channahon", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60411, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago Heights", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60412, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago Heights", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60415, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago Ridge", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60416, + "latitude": 41.284033, + "longitude": -88.374819, + "city": "Coal City", + "state": "IL", + "county": "Grundy" + }, + { + "zip_code": 60417, + "latitude": 41.426684, + "longitude": -87.621223, + "city": "Crete", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60419, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Dolton", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60420, + "latitude": 41.059551, + "longitude": -88.417086, + "city": "Dwight", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 60421, + "latitude": 41.44288, + "longitude": -88.090588, + "city": "Elwood", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60422, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Flossmoor", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60423, + "latitude": 41.451744, + "longitude": -87.896109, + "city": "Frankfort", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60424, + "latitude": 41.1775, + "longitude": -88.338018, + "city": "Gardner", + "state": "IL", + "county": "Grundy" + }, + { + "zip_code": 60425, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Glenwood", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60426, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Harvey", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60429, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Hazel Crest", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60430, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Homewood", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60431, + "latitude": 41.471206, + "longitude": -87.93909, + "city": "Joliet", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60432, + "latitude": 41.54273, + "longitude": -88.045146, + "city": "Joliet", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60433, + "latitude": 41.476265, + "longitude": -87.882249, + "city": "Joliet", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60434, + "latitude": 41.52543, + "longitude": -88.084208, + "city": "Joliet", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60435, + "latitude": 41.468729, + "longitude": -87.938034, + "city": "Joliet", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60436, + "latitude": 41.48843, + "longitude": -88.15716, + "city": "Joliet", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60437, + "latitude": 41.188078, + "longitude": -88.472407, + "city": "Kinsman", + "state": "IL", + "county": "Grundy" + }, + { + "zip_code": 60438, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Lansing", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60439, + "latitude": 41.707431, + "longitude": -87.975568, + "city": "Lemont", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60440, + "latitude": 41.623336, + "longitude": -88.022464, + "city": "Bolingbrook", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60441, + "latitude": 41.552615, + "longitude": -88.031268, + "city": "Lockport", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60442, + "latitude": 41.491903, + "longitude": -87.979113, + "city": "Manhattan", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60443, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Matteson", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60444, + "latitude": 41.226425, + "longitude": -88.421748, + "city": "Mazon", + "state": "IL", + "county": "Grundy" + }, + { + "zip_code": 60445, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Midlothian", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60446, + "latitude": 41.64038, + "longitude": -88.069621, + "city": "Romeoville", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60447, + "latitude": 41.429869, + "longitude": -88.422884, + "city": "Minooka", + "state": "IL", + "county": "Grundy" + }, + { + "zip_code": 60448, + "latitude": 41.426002, + "longitude": -88.006767, + "city": "Mokena", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60449, + "latitude": 41.412269, + "longitude": -87.786645, + "city": "Monee", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60450, + "latitude": 41.337433, + "longitude": -88.430183, + "city": "Morris", + "state": "IL", + "county": "Grundy" + }, + { + "zip_code": 60451, + "latitude": 41.510802, + "longitude": -87.961808, + "city": "New Lenox", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60452, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Oak Forest", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60453, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Oak Lawn", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60454, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Oak Lawn", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60455, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Bridgeview", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60456, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Hometown", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60457, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Hickory Hills", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60458, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Justice", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60459, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Burbank", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60460, + "latitude": 40.998811, + "longitude": -88.538538, + "city": "Odell", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 60461, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Olympia Fields", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60462, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Orland Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60463, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Palos Heights", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60464, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Palos Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60465, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Palos Hills", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60466, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Park Forest", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60467, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Orland Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60468, + "latitude": 41.346316, + "longitude": -87.772133, + "city": "Peotone", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60469, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Posen", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60470, + "latitude": 41.172532, + "longitude": -88.663755, + "city": "Ransom", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 60471, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Richton Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60472, + "latitude": 41.95273, + "longitude": -87.878888, + "city": "Robbins", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60473, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "South Holland", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60474, + "latitude": 41.171883, + "longitude": -88.267338, + "city": "South Wilmington", + "state": "IL", + "county": "Grundy" + }, + { + "zip_code": 60475, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Steger", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60476, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Thornton", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60477, + "latitude": 42.143475, + "longitude": -88.026517, + "city": "Tinley Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60478, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Country Club Hills", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60479, + "latitude": 41.247346, + "longitude": -88.505582, + "city": "Verona", + "state": "IL", + "county": "Grundy" + }, + { + "zip_code": 60480, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Willow Springs", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60481, + "latitude": 41.35934, + "longitude": -88.084716, + "city": "Wilmington", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60482, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Worth", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60490, + "latitude": 41.679041, + "longitude": -88.140332, + "city": "Bolingbrook", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60499, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Bedford Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60501, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Summit Argo", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60504, + "latitude": 41.768399, + "longitude": -88.136616, + "city": "Aurora", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60505, + "latitude": 41.765478, + "longitude": -88.405446, + "city": "Aurora", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60506, + "latitude": 41.79083, + "longitude": -88.416837, + "city": "Aurora", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60507, + "latitude": 41.936977, + "longitude": -88.420178, + "city": "Aurora", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60510, + "latitude": 41.828292, + "longitude": -88.407334, + "city": "Batavia", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60511, + "latitude": 41.764324, + "longitude": -88.54574, + "city": "Big Rock", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60512, + "latitude": 41.698414, + "longitude": -88.427873, + "city": "Bristol", + "state": "IL", + "county": "Kendall" + }, + { + "zip_code": 60513, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Brookfield", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60514, + "latitude": 41.774295, + "longitude": -87.966094, + "city": "Clarendon Hills", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60515, + "latitude": 41.796279, + "longitude": -88.012267, + "city": "Downers Grove", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60516, + "latitude": 41.75231, + "longitude": -88.021797, + "city": "Downers Grove", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60517, + "latitude": 41.736788, + "longitude": -88.041731, + "city": "Woodridge", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60518, + "latitude": 41.549922, + "longitude": -88.935981, + "city": "Earlville", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 60519, + "latitude": 41.777235, + "longitude": -88.246193, + "city": "Eola", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60520, + "latitude": 41.740713, + "longitude": -88.686052, + "city": "Hinckley", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60521, + "latitude": 41.78213, + "longitude": -87.966845, + "city": "Hinsdale", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60522, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Hinsdale", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60523, + "latitude": 41.83713, + "longitude": -87.963759, + "city": "Oak Brook", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60525, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "La Grange", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60526, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "La Grange Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60527, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Willowbrook", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60530, + "latitude": 41.784398, + "longitude": -88.97506, + "city": "Lee", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 60531, + "latitude": 41.47805, + "longitude": -88.7265, + "city": "Leland", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 60532, + "latitude": 41.79818, + "longitude": -88.037714, + "city": "Lisle", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60534, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Lyons", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60536, + "latitude": 41.590315, + "longitude": -88.562023, + "city": "Millbrook", + "state": "IL", + "county": "Kendall" + }, + { + "zip_code": 60537, + "latitude": 41.561386, + "longitude": -88.59747, + "city": "Millington", + "state": "IL", + "county": "Kendall" + }, + { + "zip_code": 60538, + "latitude": 41.643752, + "longitude": -88.457951, + "city": "Montgomery", + "state": "IL", + "county": "Kendall" + }, + { + "zip_code": 60539, + "latitude": 41.823928, + "longitude": -88.334023, + "city": "Mooseheart", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60540, + "latitude": 41.759029, + "longitude": -88.152381, + "city": "Naperville", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60541, + "latitude": 41.540661, + "longitude": -88.492909, + "city": "Newark", + "state": "IL", + "county": "Kendall" + }, + { + "zip_code": 60542, + "latitude": 41.807369, + "longitude": -88.335182, + "city": "North Aurora", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60543, + "latitude": 41.631012, + "longitude": -88.420476, + "city": "Oswego", + "state": "IL", + "county": "Kendall" + }, + { + "zip_code": 60544, + "latitude": 41.632457, + "longitude": -88.169698, + "city": "Plainfield", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60545, + "latitude": 41.628567, + "longitude": -88.513814, + "city": "Plano", + "state": "IL", + "county": "Kendall" + }, + { + "zip_code": 60546, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Riverside", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60548, + "latitude": 41.702091, + "longitude": -88.688906, + "city": "Sandwich", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60549, + "latitude": 41.48974, + "longitude": -88.752495, + "city": "Serena", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 60550, + "latitude": 41.746774, + "longitude": -88.836821, + "city": "Shabbona", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60551, + "latitude": 41.521219, + "longitude": -88.710974, + "city": "Sheridan", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 60552, + "latitude": 41.860645, + "longitude": -88.783041, + "city": "Somonauk", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60553, + "latitude": 41.796742, + "longitude": -89.086129, + "city": "Steward", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 60554, + "latitude": 41.776787, + "longitude": -88.451655, + "city": "Sugar Grove", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60555, + "latitude": 41.805422, + "longitude": -88.171551, + "city": "Warrenville", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60556, + "latitude": 41.755215, + "longitude": -88.778554, + "city": "Waterman", + "state": "IL", + "county": "De Kalb" + }, + { + "zip_code": 60557, + "latitude": 41.44088, + "longitude": -88.770327, + "city": "Wedron", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 60558, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Western Springs", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60559, + "latitude": 41.799876, + "longitude": -87.970713, + "city": "Westmont", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60560, + "latitude": 41.601679, + "longitude": -88.437533, + "city": "Yorkville", + "state": "IL", + "county": "Kendall" + }, + { + "zip_code": 60561, + "latitude": 41.743437, + "longitude": -87.98046, + "city": "Darien", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60563, + "latitude": 41.782455, + "longitude": -88.149884, + "city": "Naperville", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60564, + "latitude": 41.681479, + "longitude": -88.201424, + "city": "Naperville", + "state": "IL", + "county": "Will" + }, + { + "zip_code": 60565, + "latitude": 41.737929, + "longitude": -88.112714, + "city": "Naperville", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60566, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Naperville", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60567, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Naperville", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60568, + "latitude": 41.935616, + "longitude": -88.43238, + "city": "Aurora", + "state": "IL", + "county": "Kane" + }, + { + "zip_code": 60570, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Hinsdale", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60572, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Aurora", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60597, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Fox Valley", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60598, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Aurora", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60599, + "latitude": 41.839679, + "longitude": -88.088716, + "city": "Fox Valley", + "state": "IL", + "county": "Du Page" + }, + { + "zip_code": 60601, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60602, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60603, + "latitude": 42.055179, + "longitude": -87.72596, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60604, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60605, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60606, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60607, + "latitude": 41.928881, + "longitude": -87.81381, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60608, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60609, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60610, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60611, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60612, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60613, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60614, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60615, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60616, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60617, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60618, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60619, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60620, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60621, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60622, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60623, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60624, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60625, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60626, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60628, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60629, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60630, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60631, + "latitude": 42.00583, + "longitude": -87.808611, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60632, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60633, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60634, + "latitude": 41.933355, + "longitude": -87.816309, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60636, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60637, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60638, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60639, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60640, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60641, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60643, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60644, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60645, + "latitude": 42.00808, + "longitude": -87.721458, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60646, + "latitude": 42.00663, + "longitude": -87.75901, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60647, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60649, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60651, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60652, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60653, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60654, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60655, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60656, + "latitude": 41.97353, + "longitude": -87.865763, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60657, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60659, + "latitude": 41.997247, + "longitude": -87.716621, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60660, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60661, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60663, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60664, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60665, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60666, + "latitude": 41.968029, + "longitude": -87.891214, + "city": "Amf Ohare", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60667, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60668, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60669, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60670, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60671, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60672, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60673, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60674, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60675, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60677, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60678, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60679, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60680, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60681, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60683, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60684, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60685, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60687, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60688, + "latitude": "", + "longitude": "", + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60690, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60691, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60693, + "latitude": 42.096428, + "longitude": -87.71791, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60694, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60696, + "latitude": "", + "longitude": "", + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60697, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60699, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60701, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Chicago", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60706, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Harwood Heights", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60707, + "latitude": 41.923181, + "longitude": -87.818509, + "city": "Elmwood Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60712, + "latitude": 42.00798, + "longitude": -87.736135, + "city": "Lincolnwood", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60714, + "latitude": 42.031179, + "longitude": -87.811163, + "city": "Niles", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60803, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Alsip", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60804, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Cicero", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60805, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Evergreen Park", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60827, + "latitude": 41.811929, + "longitude": -87.68732, + "city": "Riverdale", + "state": "IL", + "county": "Cook" + }, + { + "zip_code": 60901, + "latitude": 41.111151, + "longitude": -87.874618, + "city": "Kankakee", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60902, + "latitude": 41.146464, + "longitude": -87.888971, + "city": "Kankakee", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60910, + "latitude": 41.091582, + "longitude": -87.684284, + "city": "Aroma Park", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60911, + "latitude": 40.876259, + "longitude": -87.973929, + "city": "Ashkum", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60912, + "latitude": 40.963099, + "longitude": -87.625942, + "city": "Beaverville", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60913, + "latitude": 41.1388, + "longitude": -88.053534, + "city": "Bonfield", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60914, + "latitude": 41.180968, + "longitude": -87.847038, + "city": "Bourbonnais", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60915, + "latitude": 41.207762, + "longitude": -87.842583, + "city": "Bradley", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60917, + "latitude": 41.056333, + "longitude": -88.073844, + "city": "Buckingham", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60918, + "latitude": 40.600817, + "longitude": -88.023748, + "city": "Buckley", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60919, + "latitude": 40.967141, + "longitude": -88.188841, + "city": "Cabery", + "state": "IL", + "county": "Ford" + }, + { + "zip_code": 60920, + "latitude": 41.024755, + "longitude": -88.307221, + "city": "Campus", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 60921, + "latitude": 40.736954, + "longitude": -88.294923, + "city": "Chatsworth", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 60922, + "latitude": 40.968795, + "longitude": -87.951233, + "city": "Chebanse", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60924, + "latitude": 40.738175, + "longitude": -87.907874, + "city": "Cissna Park", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60926, + "latitude": 40.567574, + "longitude": -87.804046, + "city": "Claytonville", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60927, + "latitude": 40.929595, + "longitude": -87.945327, + "city": "Clifton", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60928, + "latitude": 40.66202, + "longitude": -87.95062, + "city": "Crescent City", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60929, + "latitude": 40.882509, + "longitude": -88.30019, + "city": "Cullom", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 60930, + "latitude": 40.811396, + "longitude": -87.967134, + "city": "Danforth", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60931, + "latitude": 40.880529, + "longitude": -87.598831, + "city": "Donovan", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60932, + "latitude": 40.344417, + "longitude": -87.701583, + "city": "East Lynn", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 60933, + "latitude": 40.46483, + "longitude": -88.271245, + "city": "Elliott", + "state": "IL", + "county": "Ford" + }, + { + "zip_code": 60934, + "latitude": 40.969209, + "longitude": -88.358928, + "city": "Emington", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 60935, + "latitude": 41.155397, + "longitude": -88.157189, + "city": "Essex", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60936, + "latitude": 40.696479, + "longitude": -88.318387, + "city": "Gibson City", + "state": "IL", + "county": "Ford" + }, + { + "zip_code": 60938, + "latitude": 40.765951, + "longitude": -87.834645, + "city": "Gilman", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60939, + "latitude": 40.748087, + "longitude": -87.82876, + "city": "Goodwine", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60940, + "latitude": 41.204947, + "longitude": -87.644151, + "city": "Grant Park", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60941, + "latitude": 41.12077, + "longitude": -87.899733, + "city": "Herscher", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60942, + "latitude": 40.442138, + "longitude": -87.672943, + "city": "Hoopeston", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 60944, + "latitude": 41.146464, + "longitude": -87.888971, + "city": "Hopkins Park", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60945, + "latitude": 40.826919, + "longitude": -87.584668, + "city": "Iroquois", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60946, + "latitude": 40.897321, + "longitude": -88.186897, + "city": "Kempton", + "state": "IL", + "county": "Ford" + }, + { + "zip_code": 60948, + "latitude": 40.537227, + "longitude": -87.9663, + "city": "Loda", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60949, + "latitude": 40.370897, + "longitude": -88.152546, + "city": "Ludlow", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 60950, + "latitude": 41.173292, + "longitude": -87.87675, + "city": "Manteno", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60951, + "latitude": 40.931202, + "longitude": -87.747179, + "city": "Martinton", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60952, + "latitude": 40.537915, + "longitude": -88.299338, + "city": "Melvin", + "state": "IL", + "county": "Ford" + }, + { + "zip_code": 60953, + "latitude": 40.75071, + "longitude": -87.695039, + "city": "Milford", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60954, + "latitude": 41.116572, + "longitude": -87.868519, + "city": "Momence", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60955, + "latitude": 40.758445, + "longitude": -87.852046, + "city": "Onarga", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60956, + "latitude": 40.966993, + "longitude": -87.716074, + "city": "Papineau", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60957, + "latitude": 40.660905, + "longitude": -88.197834, + "city": "Paxton", + "state": "IL", + "county": "Ford" + }, + { + "zip_code": 60959, + "latitude": 40.720981, + "longitude": -88.186732, + "city": "Piper City", + "state": "IL", + "county": "Ford" + }, + { + "zip_code": 60960, + "latitude": 40.422456, + "longitude": -87.858213, + "city": "Rankin", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 60961, + "latitude": 41.099001, + "longitude": -88.198405, + "city": "Reddick", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60962, + "latitude": 40.57087, + "longitude": -88.234682, + "city": "Roberts", + "state": "IL", + "county": "Ford" + }, + { + "zip_code": 60963, + "latitude": 40.363126, + "longitude": -87.682897, + "city": "Rossville", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 60964, + "latitude": 41.068206, + "longitude": -87.687329, + "city": "Saint Anne", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60966, + "latitude": 40.75308, + "longitude": -87.58941, + "city": "Sheldon", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60967, + "latitude": 40.748087, + "longitude": -87.82876, + "city": "Stockland", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60968, + "latitude": 40.673257, + "longitude": -88.099724, + "city": "Thawville", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60969, + "latitude": 41.108802, + "longitude": -88.146523, + "city": "Union Hill", + "state": "IL", + "county": "Kankakee" + }, + { + "zip_code": 60970, + "latitude": 40.749938, + "longitude": -87.798478, + "city": "Watseka", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60973, + "latitude": 40.633196, + "longitude": -87.658329, + "city": "Wellington", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 60974, + "latitude": 40.715072, + "longitude": -87.730743, + "city": "Woodland", + "state": "IL", + "county": "Iroquois" + }, + { + "zip_code": 61001, + "latitude": 42.454161, + "longitude": -90.118471, + "city": "Apple River", + "state": "IL", + "county": "Jo Daviess" + }, + { + "zip_code": 61006, + "latitude": 41.838351, + "longitude": -89.193176, + "city": "Ashton", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 61007, + "latitude": 42.178584, + "longitude": -89.595377, + "city": "Baileyville", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61008, + "latitude": 42.276381, + "longitude": -88.823215, + "city": "Belvidere", + "state": "IL", + "county": "Boone" + }, + { + "zip_code": 61010, + "latitude": 42.091976, + "longitude": -89.322625, + "city": "Byron", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61011, + "latitude": 42.397024, + "longitude": -88.843027, + "city": "Caledonia", + "state": "IL", + "county": "Boone" + }, + { + "zip_code": 61012, + "latitude": 42.41042, + "longitude": -88.759953, + "city": "Capron", + "state": "IL", + "county": "Boone" + }, + { + "zip_code": 61013, + "latitude": 42.376127, + "longitude": -89.636483, + "city": "Cedarville", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61014, + "latitude": 41.994827, + "longitude": -89.877636, + "city": "Chadwick", + "state": "IL", + "county": "Carroll" + }, + { + "zip_code": 61015, + "latitude": 41.99742, + "longitude": -89.19964, + "city": "Chana", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61016, + "latitude": 42.240704, + "longitude": -88.983748, + "city": "Cherry Valley", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61018, + "latitude": 42.410796, + "longitude": -89.583179, + "city": "Dakota", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61019, + "latitude": 42.398148, + "longitude": -89.611026, + "city": "Davis", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61020, + "latitude": 42.106337, + "longitude": -89.099201, + "city": "Davis Junction", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61021, + "latitude": 41.809229, + "longitude": -89.417156, + "city": "Dixon", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 61024, + "latitude": 42.434686, + "longitude": -89.213377, + "city": "Durand", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61025, + "latitude": 42.46626, + "longitude": -90.540556, + "city": "East Dubuque", + "state": "IL", + "county": "Jo Daviess" + }, + { + "zip_code": 61027, + "latitude": 42.332038, + "longitude": -89.761171, + "city": "Eleroy", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61028, + "latitude": 42.309263, + "longitude": -90.181064, + "city": "Elizabeth", + "state": "IL", + "county": "Jo Daviess" + }, + { + "zip_code": 61030, + "latitude": 42.120046, + "longitude": -89.312592, + "city": "Forreston", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61031, + "latitude": 41.816006, + "longitude": -89.311037, + "city": "Franklin Grove", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 61032, + "latitude": 42.323529, + "longitude": -89.591606, + "city": "Freeport", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61036, + "latitude": 42.382277, + "longitude": -90.312588, + "city": "Galena", + "state": "IL", + "county": "Jo Daviess" + }, + { + "zip_code": 61037, + "latitude": 41.786534, + "longitude": -89.761042, + "city": "Galt", + "state": "IL", + "county": "Whiteside" + }, + { + "zip_code": 61038, + "latitude": 42.261184, + "longitude": -88.761434, + "city": "Garden Prairie", + "state": "IL", + "county": "Boone" + }, + { + "zip_code": 61039, + "latitude": 42.238319, + "longitude": -89.459521, + "city": "German Valley", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61041, + "latitude": 42.274653, + "longitude": -90.295132, + "city": "Hanover", + "state": "IL", + "county": "Jo Daviess" + }, + { + "zip_code": 61042, + "latitude": 41.689533, + "longitude": -89.545604, + "city": "Harmon", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 61043, + "latitude": 42.045123, + "longitude": -89.313593, + "city": "Holcomb", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61044, + "latitude": 42.282256, + "longitude": -89.891281, + "city": "Kent", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61046, + "latitude": 42.078942, + "longitude": -89.814738, + "city": "Lanark", + "state": "IL", + "county": "Carroll" + }, + { + "zip_code": 61047, + "latitude": 42.147816, + "longitude": -89.278387, + "city": "Leaf River", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61048, + "latitude": 42.386301, + "longitude": -89.816756, + "city": "Lena", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61049, + "latitude": 42.024619, + "longitude": -89.004111, + "city": "Lindenwood", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61050, + "latitude": 42.428135, + "longitude": -89.7643, + "city": "Mc Connell", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61051, + "latitude": 41.991827, + "longitude": -89.764016, + "city": "Milledgeville", + "state": "IL", + "county": "Carroll" + }, + { + "zip_code": 61052, + "latitude": 42.108224, + "longitude": -88.998128, + "city": "Monroe Center", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61053, + "latitude": 42.093181, + "longitude": -89.968127, + "city": "Mount Carroll", + "state": "IL", + "county": "Carroll" + }, + { + "zip_code": 61054, + "latitude": 42.058183, + "longitude": -89.352968, + "city": "Mount Morris", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61057, + "latitude": 41.831577, + "longitude": -89.38957, + "city": "Nachusa", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 61058, + "latitude": 41.797256, + "longitude": -89.599529, + "city": "Nelson", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 61059, + "latitude": 42.463658, + "longitude": -89.941363, + "city": "Nora", + "state": "IL", + "county": "Jo Daviess" + }, + { + "zip_code": 61060, + "latitude": 42.473576, + "longitude": -89.60519, + "city": "Orangeville", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61061, + "latitude": 42.011025, + "longitude": -89.253887, + "city": "Oregon", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61062, + "latitude": 42.332702, + "longitude": -89.782606, + "city": "Pearl City", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61063, + "latitude": 42.3104, + "longitude": -89.311162, + "city": "Pecatonica", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61064, + "latitude": 41.989578, + "longitude": -89.323812, + "city": "Polo", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61065, + "latitude": 42.392537, + "longitude": -88.811894, + "city": "Poplar Grove", + "state": "IL", + "county": "Boone" + }, + { + "zip_code": 61067, + "latitude": 42.334675, + "longitude": -89.559845, + "city": "Ridott", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61068, + "latitude": 42.007405, + "longitude": -89.100359, + "city": "Rochelle", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61070, + "latitude": 42.418515, + "longitude": -89.470711, + "city": "Rock City", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61071, + "latitude": 41.687083, + "longitude": -89.728269, + "city": "Rock Falls", + "state": "IL", + "county": "Whiteside" + }, + { + "zip_code": 61072, + "latitude": 42.381926, + "longitude": -89.142856, + "city": "Rockton", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61073, + "latitude": 42.416908, + "longitude": -89.000227, + "city": "Roscoe", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61074, + "latitude": 42.077282, + "longitude": -90.005039, + "city": "Savanna", + "state": "IL", + "county": "Carroll" + }, + { + "zip_code": 61075, + "latitude": 42.452479, + "longitude": -90.26684, + "city": "Scales Mound", + "state": "IL", + "county": "Jo Daviess" + }, + { + "zip_code": 61076, + "latitude": 42.355422, + "longitude": -89.667939, + "city": "Scioto Mills", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61077, + "latitude": 42.236834, + "longitude": -89.357998, + "city": "Seward", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61078, + "latitude": 42.154795, + "longitude": -89.764627, + "city": "Shannon", + "state": "IL", + "county": "Carroll" + }, + { + "zip_code": 61079, + "latitude": 42.325364, + "longitude": -89.170527, + "city": "Shirland", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61080, + "latitude": 42.38648, + "longitude": -89.090975, + "city": "South Beloit", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61081, + "latitude": 41.835669, + "longitude": -89.745941, + "city": "Sterling", + "state": "IL", + "county": "Whiteside" + }, + { + "zip_code": 61084, + "latitude": 42.1133, + "longitude": -89.186271, + "city": "Stillman Valley", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61085, + "latitude": 42.349517, + "longitude": -90.085356, + "city": "Stockton", + "state": "IL", + "county": "Jo Daviess" + }, + { + "zip_code": 61087, + "latitude": 42.470405, + "longitude": -90.087359, + "city": "Warren", + "state": "IL", + "county": "Jo Daviess" + }, + { + "zip_code": 61088, + "latitude": 42.347321, + "longitude": -89.194327, + "city": "Winnebago", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61089, + "latitude": 42.460658, + "longitude": -89.814639, + "city": "Winslow", + "state": "IL", + "county": "Stephenson" + }, + { + "zip_code": 61091, + "latitude": 41.903068, + "longitude": -89.540365, + "city": "Woosung", + "state": "IL", + "county": "Ogle" + }, + { + "zip_code": 61101, + "latitude": 42.33342, + "longitude": -89.157198, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61102, + "latitude": 42.22974, + "longitude": -89.155825, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61103, + "latitude": 42.341983, + "longitude": -89.078829, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61104, + "latitude": 42.25012, + "longitude": -89.080254, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61105, + "latitude": 42.325364, + "longitude": -89.170527, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61106, + "latitude": 42.325364, + "longitude": -89.170527, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61107, + "latitude": 42.284055, + "longitude": -89.01621, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61108, + "latitude": 42.247643, + "longitude": -88.999892, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61109, + "latitude": 42.196681, + "longitude": -89.065539, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61110, + "latitude": 42.325364, + "longitude": -89.170527, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61111, + "latitude": 42.341767, + "longitude": -89.004716, + "city": "Loves Park", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61112, + "latitude": 42.246231, + "longitude": -88.97517, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61114, + "latitude": 42.318492, + "longitude": -88.997248, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61115, + "latitude": 42.354546, + "longitude": -89.039675, + "city": "Machesney Park", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61125, + "latitude": 42.325364, + "longitude": -89.170527, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61126, + "latitude": 42.325364, + "longitude": -89.170527, + "city": "Rockford", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61130, + "latitude": 42.325364, + "longitude": -89.170527, + "city": "Loves Park", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61131, + "latitude": 42.325364, + "longitude": -89.170527, + "city": "Loves Park", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61132, + "latitude": 42.325364, + "longitude": -89.170527, + "city": "Loves Park", + "state": "IL", + "county": "Winnebago" + }, + { + "zip_code": 61201, + "latitude": 41.495083, + "longitude": -90.604899, + "city": "Rock Island", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61204, + "latitude": 41.554901, + "longitude": -90.615975, + "city": "Rock Island", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61230, + "latitude": 41.729562, + "longitude": -90.159676, + "city": "Albany", + "state": "IL", + "county": "Whiteside" + }, + { + "zip_code": 61231, + "latitude": 41.197762, + "longitude": -90.730944, + "city": "Aledo", + "state": "IL", + "county": "Mercer" + }, + { + "zip_code": 61232, + "latitude": 41.440131, + "longitude": -90.742806, + "city": "Andalusia", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61233, + "latitude": 41.295367, + "longitude": -90.290476, + "city": "Andover", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61234, + "latitude": 41.425519, + "longitude": -89.924636, + "city": "Annawan", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61235, + "latitude": 41.405502, + "longitude": -89.998274, + "city": "Atkinson", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61236, + "latitude": 41.51469, + "longitude": -90.357727, + "city": "Barstow", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61237, + "latitude": 41.336752, + "longitude": -90.852226, + "city": "Buffalo Prairie", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61238, + "latitude": 41.285666, + "longitude": -90.104144, + "city": "Cambridge", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61239, + "latitude": 41.495034, + "longitude": -90.393778, + "city": "Carbon Cliff", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61240, + "latitude": 41.401019, + "longitude": -90.575785, + "city": "Coal Valley", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61241, + "latitude": 41.437419, + "longitude": -90.166719, + "city": "Colona", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61242, + "latitude": 41.702549, + "longitude": -90.27691, + "city": "Cordova", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61243, + "latitude": 41.620757, + "longitude": -89.710301, + "city": "Deer Grove", + "state": "IL", + "county": "Whiteside" + }, + { + "zip_code": 61244, + "latitude": 41.562693, + "longitude": -90.512483, + "city": "East Moline", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61250, + "latitude": 41.667507, + "longitude": -90.098292, + "city": "Erie", + "state": "IL", + "county": "Whiteside" + }, + { + "zip_code": 61251, + "latitude": 41.737836, + "longitude": -90.078132, + "city": "Fenton", + "state": "IL", + "county": "Whiteside" + }, + { + "zip_code": 61252, + "latitude": 41.79088, + "longitude": -90.112432, + "city": "Fulton", + "state": "IL", + "county": "Whiteside" + }, + { + "zip_code": 61254, + "latitude": 41.437746, + "longitude": -90.158163, + "city": "Geneseo", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61256, + "latitude": 41.527582, + "longitude": -90.446341, + "city": "Hampton", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61257, + "latitude": 41.501771, + "longitude": -90.606468, + "city": "Hillsdale", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61258, + "latitude": 41.522044, + "longitude": -89.91216, + "city": "Hooppole", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61259, + "latitude": 41.384813, + "longitude": -90.835558, + "city": "Illinois City", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61260, + "latitude": 41.237259, + "longitude": -90.688648, + "city": "Joy", + "state": "IL", + "county": "Mercer" + }, + { + "zip_code": 61261, + "latitude": 41.73562, + "longitude": -89.910699, + "city": "Lyndon", + "state": "IL", + "county": "Whiteside" + }, + { + "zip_code": 61262, + "latitude": 41.285461, + "longitude": -90.319658, + "city": "Lynn Center", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61263, + "latitude": 41.259938, + "longitude": -90.612757, + "city": "Matherville", + "state": "IL", + "county": "Mercer" + }, + { + "zip_code": 61264, + "latitude": 41.420305, + "longitude": -90.595736, + "city": "Milan", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61265, + "latitude": 41.529431, + "longitude": -90.528972, + "city": "Moline", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61266, + "latitude": 41.554901, + "longitude": -90.615975, + "city": "Moline", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61270, + "latitude": 41.781381, + "longitude": -90.002217, + "city": "Morrison", + "state": "IL", + "county": "Whiteside" + }, + { + "zip_code": 61272, + "latitude": 41.238072, + "longitude": -90.987063, + "city": "New Boston", + "state": "IL", + "county": "Mercer" + }, + { + "zip_code": 61273, + "latitude": 41.36211, + "longitude": -90.376529, + "city": "Orion", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61274, + "latitude": 41.371081, + "longitude": -90.194276, + "city": "Osco", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61275, + "latitude": 41.545132, + "longitude": -90.41449, + "city": "Port Byron", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61276, + "latitude": 41.299563, + "longitude": -90.586643, + "city": "Preemption", + "state": "IL", + "county": "Mercer" + }, + { + "zip_code": 61277, + "latitude": 41.654462, + "longitude": -89.924411, + "city": "Prophetstown", + "state": "IL", + "county": "Whiteside" + }, + { + "zip_code": 61278, + "latitude": 41.585883, + "longitude": -90.343228, + "city": "Rapids City", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61279, + "latitude": 41.472195, + "longitude": -90.595329, + "city": "Reynolds", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61281, + "latitude": 41.280317, + "longitude": -90.520183, + "city": "Sherrard", + "state": "IL", + "county": "Mercer" + }, + { + "zip_code": 61282, + "latitude": 41.560381, + "longitude": -90.51753, + "city": "Silvis", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61283, + "latitude": 41.637929, + "longitude": -89.756769, + "city": "Tampico", + "state": "IL", + "county": "Whiteside" + }, + { + "zip_code": 61284, + "latitude": 41.391078, + "longitude": -90.714746, + "city": "Taylor Ridge", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61285, + "latitude": 41.986802, + "longitude": -89.917167, + "city": "Thomson", + "state": "IL", + "county": "Carroll" + }, + { + "zip_code": 61299, + "latitude": 41.520333, + "longitude": -90.541585, + "city": "Rock Island", + "state": "IL", + "county": "Rock Island" + }, + { + "zip_code": 61301, + "latitude": 41.365092, + "longitude": -89.0866, + "city": "La Salle", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61310, + "latitude": 41.721016, + "longitude": -89.299671, + "city": "Amboy", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 61311, + "latitude": 41.042631, + "longitude": -88.864211, + "city": "Ancona", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 61312, + "latitude": 41.43043, + "longitude": -89.240006, + "city": "Arlington", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61313, + "latitude": 41.063241, + "longitude": -88.680876, + "city": "Blackstone", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 61314, + "latitude": 41.306814, + "longitude": -89.653036, + "city": "Buda", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61315, + "latitude": 41.289394, + "longitude": -89.368617, + "city": "Bureau", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61316, + "latitude": 41.261714, + "longitude": -89.123735, + "city": "Cedar Point", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61317, + "latitude": 41.426433, + "longitude": -89.212609, + "city": "Cherry", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61318, + "latitude": 41.713223, + "longitude": -89.091458, + "city": "Compton", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 61319, + "latitude": 41.03103, + "longitude": -88.766797, + "city": "Cornell", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 61320, + "latitude": 41.366748, + "longitude": -89.479804, + "city": "Dalzell", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61321, + "latitude": 40.999418, + "longitude": -88.989269, + "city": "Dana", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61322, + "latitude": 41.309194, + "longitude": -89.325221, + "city": "Depue", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61323, + "latitude": 41.436173, + "longitude": -89.396006, + "city": "Dover", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61324, + "latitude": 41.771078, + "longitude": -89.412282, + "city": "Eldena", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 61325, + "latitude": 41.237122, + "longitude": -88.817458, + "city": "Grand Ridge", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61326, + "latitude": 41.250055, + "longitude": -89.24284, + "city": "Granville", + "state": "IL", + "county": "Putnam" + }, + { + "zip_code": 61327, + "latitude": 41.252096, + "longitude": -89.338005, + "city": "Hennepin", + "state": "IL", + "county": "Putnam" + }, + { + "zip_code": 61328, + "latitude": 41.366883, + "longitude": -89.513065, + "city": "Kasbeer", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61329, + "latitude": 41.37951, + "longitude": -89.203827, + "city": "Ladd", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61330, + "latitude": 41.454193, + "longitude": -89.448445, + "city": "La Moille", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61331, + "latitude": 41.74885, + "longitude": -89.282726, + "city": "Lee Center", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 61332, + "latitude": 41.148788, + "longitude": -89.009131, + "city": "Leonore", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61333, + "latitude": 40.980115, + "longitude": -88.873628, + "city": "Long Point", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 61334, + "latitude": 41.148202, + "longitude": -89.076145, + "city": "Lostant", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61335, + "latitude": 41.146046, + "longitude": -89.225915, + "city": "Mc Nabb", + "state": "IL", + "county": "Putnam" + }, + { + "zip_code": 61336, + "latitude": 41.213097, + "longitude": -89.314316, + "city": "Magnolia", + "state": "IL", + "county": "Putnam" + }, + { + "zip_code": 61337, + "latitude": 41.422315, + "longitude": -89.335467, + "city": "Malden", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61338, + "latitude": 41.455508, + "longitude": -89.669712, + "city": "Manlius", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61340, + "latitude": 41.265997, + "longitude": -89.249143, + "city": "Mark", + "state": "IL", + "county": "Putnam" + }, + { + "zip_code": 61341, + "latitude": 41.212787, + "longitude": -88.833689, + "city": "Marseilles", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61342, + "latitude": 41.385519, + "longitude": -89.051012, + "city": "Mendota", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61344, + "latitude": 41.379654, + "longitude": -89.828368, + "city": "Mineral", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61345, + "latitude": 41.338444, + "longitude": -89.796313, + "city": "Neponset", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61346, + "latitude": 41.512158, + "longitude": -89.719934, + "city": "New Bedford", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61348, + "latitude": 41.225813, + "longitude": -89.040428, + "city": "Oglesby", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61349, + "latitude": 41.459337, + "longitude": -89.596261, + "city": "Ohio", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61350, + "latitude": 41.248925, + "longitude": -88.833337, + "city": "Ottawa", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61353, + "latitude": 41.69376, + "longitude": -88.995749, + "city": "Paw Paw", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 61354, + "latitude": 41.326408, + "longitude": -89.08578, + "city": "Peru", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61356, + "latitude": 41.424736, + "longitude": -89.452044, + "city": "Princeton", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61358, + "latitude": 40.985846, + "longitude": -88.989048, + "city": "Rutland", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61359, + "latitude": 41.361251, + "longitude": -89.269125, + "city": "Seatonville", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61360, + "latitude": 41.221524, + "longitude": -88.835029, + "city": "Seneca", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61361, + "latitude": 41.404427, + "longitude": -89.530149, + "city": "Sheffield", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61362, + "latitude": 41.423455, + "longitude": -89.506797, + "city": "Spring Valley", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61363, + "latitude": 41.256668, + "longitude": -89.17784, + "city": "Standard", + "state": "IL", + "county": "Putnam" + }, + { + "zip_code": 61364, + "latitude": 41.164177, + "longitude": -88.85632, + "city": "Streator", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61367, + "latitude": 41.628086, + "longitude": -89.274356, + "city": "Sublette", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 61368, + "latitude": 41.248455, + "longitude": -89.521465, + "city": "Tiskilwa", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61369, + "latitude": 41.006568, + "longitude": -89.134078, + "city": "Toluca", + "state": "IL", + "county": "Marshall" + }, + { + "zip_code": 61370, + "latitude": 41.222005, + "longitude": -88.989972, + "city": "Tonica", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61371, + "latitude": 41.499089, + "longitude": -89.021881, + "city": "Triumph", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61372, + "latitude": 41.451786, + "longitude": -89.070516, + "city": "Troy Grove", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61373, + "latitude": 41.411759, + "longitude": -89.008197, + "city": "Utica", + "state": "IL", + "county": "La Salle" + }, + { + "zip_code": 61374, + "latitude": 41.366883, + "longitude": -89.513065, + "city": "Van Orin", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61375, + "latitude": 41.033886, + "longitude": -89.255983, + "city": "Varna", + "state": "IL", + "county": "Marshall" + }, + { + "zip_code": 61376, + "latitude": 41.453979, + "longitude": -89.478453, + "city": "Walnut", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61377, + "latitude": 41.029236, + "longitude": -89.134955, + "city": "Wenona", + "state": "IL", + "county": "Marshall" + }, + { + "zip_code": 61378, + "latitude": 41.722648, + "longitude": -89.193026, + "city": "West Brooklyn", + "state": "IL", + "county": "Lee" + }, + { + "zip_code": 61379, + "latitude": 41.442109, + "longitude": -89.44646, + "city": "Wyanet", + "state": "IL", + "county": "Bureau" + }, + { + "zip_code": 61401, + "latitude": 40.964613, + "longitude": -90.213654, + "city": "Galesburg", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61402, + "latitude": 40.932207, + "longitude": -90.214412, + "city": "Galesburg", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61410, + "latitude": 40.927973, + "longitude": -90.304039, + "city": "Abingdon", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61411, + "latitude": 40.387329, + "longitude": -90.506582, + "city": "Adair", + "state": "IL", + "county": "Mcdonough" + }, + { + "zip_code": 61412, + "latitude": 41.136994, + "longitude": -90.631224, + "city": "Alexis", + "state": "IL", + "county": "Mercer" + }, + { + "zip_code": 61413, + "latitude": 41.20188, + "longitude": -90.245619, + "city": "Alpha", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61414, + "latitude": 41.096307, + "longitude": -90.138335, + "city": "Altona", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61415, + "latitude": 40.608139, + "longitude": -90.362984, + "city": "Avon", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61416, + "latitude": 40.497896, + "longitude": -90.508816, + "city": "Bardolph", + "state": "IL", + "county": "Mcdonough" + }, + { + "zip_code": 61417, + "latitude": 40.769783, + "longitude": -90.534172, + "city": "Berwick", + "state": "IL", + "county": "Warren" + }, + { + "zip_code": 61418, + "latitude": 40.853583, + "longitude": -90.864536, + "city": "Biggsville", + "state": "IL", + "county": "Henderson" + }, + { + "zip_code": 61419, + "latitude": 41.197682, + "longitude": -90.118344, + "city": "Bishop Hill", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61420, + "latitude": 40.547789, + "longitude": -90.762736, + "city": "Blandinsville", + "state": "IL", + "county": "Mcdonough" + }, + { + "zip_code": 61421, + "latitude": 41.176471, + "longitude": -89.657789, + "city": "Bradford", + "state": "IL", + "county": "Stark" + }, + { + "zip_code": 61422, + "latitude": 40.548189, + "longitude": -90.657031, + "city": "Bushnell", + "state": "IL", + "county": "Mcdonough" + }, + { + "zip_code": 61423, + "latitude": 40.904171, + "longitude": -90.556645, + "city": "Cameron", + "state": "IL", + "county": "Warren" + }, + { + "zip_code": 61424, + "latitude": 41.077977, + "longitude": -89.633233, + "city": "Camp Grove", + "state": "IL", + "county": "Marshall" + }, + { + "zip_code": 61425, + "latitude": 40.852582, + "longitude": -90.985293, + "city": "Carman", + "state": "IL", + "county": "Henderson" + }, + { + "zip_code": 61426, + "latitude": 41.118265, + "longitude": -89.70715, + "city": "Castleton", + "state": "IL", + "county": "Stark" + }, + { + "zip_code": 61427, + "latitude": 40.501446, + "longitude": -90.201152, + "city": "Cuba", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61428, + "latitude": 41.007962, + "longitude": -90.102455, + "city": "Dahinda", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61430, + "latitude": 40.980167, + "longitude": -90.329573, + "city": "East Galesburg", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61431, + "latitude": 40.577403, + "longitude": -90.305162, + "city": "Ellisville", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61432, + "latitude": 40.645183, + "longitude": -90.158064, + "city": "Fairview", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61433, + "latitude": 40.449305, + "longitude": -90.161761, + "city": "Fiatt", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61434, + "latitude": 41.212281, + "longitude": -90.091976, + "city": "Galva", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61435, + "latitude": 40.986267, + "longitude": -90.549089, + "city": "Gerlaw", + "state": "IL", + "county": "Warren" + }, + { + "zip_code": 61436, + "latitude": 40.968763, + "longitude": -90.201205, + "city": "Gilson", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61437, + "latitude": 40.852582, + "longitude": -90.985293, + "city": "Gladstone", + "state": "IL", + "county": "Henderson" + }, + { + "zip_code": 61438, + "latitude": 40.57311, + "longitude": -90.646976, + "city": "Good Hope", + "state": "IL", + "county": "Mcdonough" + }, + { + "zip_code": 61439, + "latitude": 41.027582, + "longitude": -90.357532, + "city": "Henderson", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61440, + "latitude": 40.41622, + "longitude": -90.648351, + "city": "Industry", + "state": "IL", + "county": "Mcdonough" + }, + { + "zip_code": 61441, + "latitude": 40.333536, + "longitude": -90.307389, + "city": "Ipava", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61442, + "latitude": 41.133733, + "longitude": -90.711121, + "city": "Keithsburg", + "state": "IL", + "county": "Mercer" + }, + { + "zip_code": 61443, + "latitude": 41.257262, + "longitude": -90.118355, + "city": "Kewanee", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61447, + "latitude": 40.871331, + "longitude": -90.656439, + "city": "Kirkwood", + "state": "IL", + "county": "Warren" + }, + { + "zip_code": 61448, + "latitude": 40.972611, + "longitude": -90.168778, + "city": "Knoxville", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61449, + "latitude": 41.109823, + "longitude": -89.97363, + "city": "La Fayette", + "state": "IL", + "county": "Stark" + }, + { + "zip_code": 61450, + "latitude": 40.549636, + "longitude": -90.997312, + "city": "La Harpe", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 61451, + "latitude": 40.938808, + "longitude": -89.889949, + "city": "Laura", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61452, + "latitude": 40.20621, + "longitude": -90.652911, + "city": "Littleton", + "state": "IL", + "county": "Schuyler" + }, + { + "zip_code": 61453, + "latitude": 40.991276, + "longitude": -90.707712, + "city": "Little York", + "state": "IL", + "county": "Warren" + }, + { + "zip_code": 61454, + "latitude": 40.852582, + "longitude": -90.985293, + "city": "Lomax", + "state": "IL", + "county": "Henderson" + }, + { + "zip_code": 61455, + "latitude": 40.459904, + "longitude": -90.660675, + "city": "Macomb", + "state": "IL", + "county": "Mcdonough" + }, + { + "zip_code": 61458, + "latitude": 40.802776, + "longitude": -90.213566, + "city": "Maquon", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61459, + "latitude": 40.510851, + "longitude": -90.393855, + "city": "Marietta", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61460, + "latitude": 40.852582, + "longitude": -90.985293, + "city": "Media", + "state": "IL", + "county": "Henderson" + }, + { + "zip_code": 61462, + "latitude": 40.924563, + "longitude": -90.618313, + "city": "Monmouth", + "state": "IL", + "county": "Warren" + }, + { + "zip_code": 61465, + "latitude": 41.176867, + "longitude": -90.687247, + "city": "New Windsor", + "state": "IL", + "county": "Mercer" + }, + { + "zip_code": 61466, + "latitude": 41.107653, + "longitude": -90.485206, + "city": "North Henderson", + "state": "IL", + "county": "Mercer" + }, + { + "zip_code": 61467, + "latitude": 41.076845, + "longitude": -90.242298, + "city": "Oneida", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61468, + "latitude": 41.257228, + "longitude": -90.400667, + "city": "Opheim", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61469, + "latitude": 40.937485, + "longitude": -90.948392, + "city": "Oquawka", + "state": "IL", + "county": "Henderson" + }, + { + "zip_code": 61470, + "latitude": 40.591144, + "longitude": -90.512266, + "city": "Prairie City", + "state": "IL", + "county": "Mcdonough" + }, + { + "zip_code": 61471, + "latitude": 40.852582, + "longitude": -90.985293, + "city": "Raritan", + "state": "IL", + "county": "Henderson" + }, + { + "zip_code": 61472, + "latitude": 41.100464, + "longitude": -90.38161, + "city": "Rio", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61473, + "latitude": 40.747768, + "longitude": -90.654131, + "city": "Roseville", + "state": "IL", + "county": "Warren" + }, + { + "zip_code": 61474, + "latitude": 40.739649, + "longitude": -90.358419, + "city": "Saint Augustine", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61475, + "latitude": 40.583158, + "longitude": -90.731564, + "city": "Sciota", + "state": "IL", + "county": "Mcdonough" + }, + { + "zip_code": 61476, + "latitude": 41.136652, + "longitude": -90.760811, + "city": "Seaton", + "state": "IL", + "county": "Mercer" + }, + { + "zip_code": 61477, + "latitude": 40.495137, + "longitude": -90.345369, + "city": "Smithfield", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61478, + "latitude": 40.749815, + "longitude": -90.750256, + "city": "Smithshire", + "state": "IL", + "county": "Warren" + }, + { + "zip_code": 61479, + "latitude": 40.987171, + "longitude": -89.651961, + "city": "Speer", + "state": "IL", + "county": "Stark" + }, + { + "zip_code": 61480, + "latitude": 40.719278, + "longitude": -90.894204, + "city": "Stronghurst", + "state": "IL", + "county": "Henderson" + }, + { + "zip_code": 61482, + "latitude": 40.376602, + "longitude": -90.408961, + "city": "Table Grove", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61483, + "latitude": 41.09404, + "longitude": -89.864391, + "city": "Toulon", + "state": "IL", + "county": "Stark" + }, + { + "zip_code": 61484, + "latitude": 40.285383, + "longitude": -90.393432, + "city": "Vermont", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61485, + "latitude": 41.00733, + "longitude": -90.085007, + "city": "Victoria", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61486, + "latitude": 41.208497, + "longitude": -90.575522, + "city": "Viola", + "state": "IL", + "county": "Mercer" + }, + { + "zip_code": 61488, + "latitude": 41.016591, + "longitude": -90.251635, + "city": "Wataga", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61489, + "latitude": 40.94837, + "longitude": -90.042908, + "city": "Williamsfield", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61490, + "latitude": 41.208513, + "longitude": -90.230506, + "city": "Woodhull", + "state": "IL", + "county": "Henry" + }, + { + "zip_code": 61491, + "latitude": 41.085606, + "longitude": -89.788462, + "city": "Wyoming", + "state": "IL", + "county": "Stark" + }, + { + "zip_code": 61501, + "latitude": 40.243173, + "longitude": -90.324653, + "city": "Astoria", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61516, + "latitude": 40.853248, + "longitude": -89.131937, + "city": "Benson", + "state": "IL", + "county": "Woodford" + }, + { + "zip_code": 61517, + "latitude": 40.814233, + "longitude": -89.859603, + "city": "Brimfield", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61519, + "latitude": 40.466267, + "longitude": -90.091027, + "city": "Bryant", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61520, + "latitude": 40.445611, + "longitude": -90.151535, + "city": "Canton", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61523, + "latitude": 40.831823, + "longitude": -89.636673, + "city": "Chillicothe", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61524, + "latitude": 40.491606, + "longitude": -90.041936, + "city": "Dunfermline", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61525, + "latitude": 40.84674, + "longitude": -89.678884, + "city": "Dunlap", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61526, + "latitude": 40.911838, + "longitude": -89.644497, + "city": "Edelstein", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61528, + "latitude": 40.836603, + "longitude": -89.726242, + "city": "Edwards", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61529, + "latitude": 40.778516, + "longitude": -89.910219, + "city": "Elmwood", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61530, + "latitude": 40.705084, + "longitude": -89.376702, + "city": "Eureka", + "state": "IL", + "county": "Woodford" + }, + { + "zip_code": 61531, + "latitude": 40.471426, + "longitude": -90.170475, + "city": "Farmington", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61532, + "latitude": 40.305929, + "longitude": -89.8716, + "city": "Forest City", + "state": "IL", + "county": "Mason" + }, + { + "zip_code": 61533, + "latitude": 40.589183, + "longitude": -89.815144, + "city": "Glasford", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61534, + "latitude": 40.425189, + "longitude": -89.62064, + "city": "Green Valley", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61535, + "latitude": 40.600997, + "longitude": -89.557074, + "city": "Groveland", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61536, + "latitude": 40.685646, + "longitude": -89.781809, + "city": "Hanna City", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61537, + "latitude": 41.053004, + "longitude": -89.339283, + "city": "Henry", + "state": "IL", + "county": "Marshall" + }, + { + "zip_code": 61539, + "latitude": 40.557119, + "longitude": -89.768481, + "city": "Kingston Mines", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61540, + "latitude": 41.007987, + "longitude": -89.337636, + "city": "Lacon", + "state": "IL", + "county": "Marshall" + }, + { + "zip_code": 61541, + "latitude": 41.006325, + "longitude": -89.22692, + "city": "La Rose", + "state": "IL", + "county": "Marshall" + }, + { + "zip_code": 61542, + "latitude": 40.463185, + "longitude": -90.166942, + "city": "Lewistown", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61543, + "latitude": 40.390243, + "longitude": -90.002625, + "city": "Liverpool", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61544, + "latitude": 40.672692, + "longitude": -90.291576, + "city": "London Mills", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61545, + "latitude": 40.879257, + "longitude": -89.370304, + "city": "Lowpoint", + "state": "IL", + "county": "Woodford" + }, + { + "zip_code": 61546, + "latitude": 40.366447, + "longitude": -89.880969, + "city": "Manito", + "state": "IL", + "county": "Mason" + }, + { + "zip_code": 61547, + "latitude": 40.60896, + "longitude": -89.742265, + "city": "Mapleton", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61548, + "latitude": 40.833004, + "longitude": -89.358019, + "city": "Metamora", + "state": "IL", + "county": "Woodford" + }, + { + "zip_code": 61550, + "latitude": 40.591322, + "longitude": -89.425339, + "city": "Morton", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61552, + "latitude": 40.817987, + "longitude": -89.567996, + "city": "Mossville", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61553, + "latitude": 40.449305, + "longitude": -90.161761, + "city": "Norris", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61554, + "latitude": 40.548928, + "longitude": -89.638839, + "city": "Pekin", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61555, + "latitude": 40.56071, + "longitude": -89.650232, + "city": "Pekin", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61558, + "latitude": 40.554538, + "longitude": -89.609951, + "city": "Pekin", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61559, + "latitude": 40.99564, + "longitude": -89.747439, + "city": "Princeville", + "state": "IL", + "county": "Stark" + }, + { + "zip_code": 61560, + "latitude": 41.205454, + "longitude": -89.430236, + "city": "Putnam", + "state": "IL", + "county": "Putnam" + }, + { + "zip_code": 61561, + "latitude": 40.793501, + "longitude": -89.238985, + "city": "Roanoke", + "state": "IL", + "county": "Woodford" + }, + { + "zip_code": 61562, + "latitude": 40.874269, + "longitude": -89.506695, + "city": "Rome", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61563, + "latitude": 40.491232, + "longitude": -90.050499, + "city": "Saint David", + "state": "IL", + "county": "Fulton" + }, + { + "zip_code": 61564, + "latitude": 40.494804, + "longitude": -89.654598, + "city": "South Pekin", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61565, + "latitude": 41.006602, + "longitude": -89.34804, + "city": "Sparland", + "state": "IL", + "county": "Marshall" + }, + { + "zip_code": 61567, + "latitude": 40.344336, + "longitude": -89.885895, + "city": "Topeka", + "state": "IL", + "county": "Mason" + }, + { + "zip_code": 61568, + "latitude": 40.456128, + "longitude": -89.542656, + "city": "Tremont", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61569, + "latitude": 40.677626, + "longitude": -89.909859, + "city": "Trivoli", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61570, + "latitude": 40.935265, + "longitude": -89.33833, + "city": "Washburn", + "state": "IL", + "county": "Marshall" + }, + { + "zip_code": 61571, + "latitude": 40.575996, + "longitude": -89.487463, + "city": "Washington", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61572, + "latitude": 40.785753, + "longitude": -90.042993, + "city": "Yates City", + "state": "IL", + "county": "Knox" + }, + { + "zip_code": 61601, + "latitude": 40.693137, + "longitude": -89.589847, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61602, + "latitude": 40.683283, + "longitude": -89.604898, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61603, + "latitude": 40.779845, + "longitude": -89.554055, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61604, + "latitude": 40.779003, + "longitude": -89.617464, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61605, + "latitude": 40.676637, + "longitude": -89.633787, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61606, + "latitude": 40.698087, + "longitude": -89.608697, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61607, + "latitude": 40.632085, + "longitude": -89.690349, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61610, + "latitude": 40.654065, + "longitude": -89.571837, + "city": "Creve Coeur", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61611, + "latitude": 40.563589, + "longitude": -89.543319, + "city": "East Peoria", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61612, + "latitude": 40.744179, + "longitude": -89.718401, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61613, + "latitude": 40.742537, + "longitude": -89.627948, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61614, + "latitude": 40.768117, + "longitude": -89.602647, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61615, + "latitude": 40.766087, + "longitude": -89.644982, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61616, + "latitude": "", + "longitude": "", + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61625, + "latitude": 40.696287, + "longitude": -89.616648, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61628, + "latitude": 40.744179, + "longitude": -89.718401, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61629, + "latitude": 40.692037, + "longitude": -89.588747, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61630, + "latitude": 40.744179, + "longitude": -89.718401, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61632, + "latitude": 40.765301, + "longitude": -89.569207, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61633, + "latitude": 40.731165, + "longitude": -89.603081, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61634, + "latitude": 40.689637, + "longitude": -89.592597, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61635, + "latitude": 40.744179, + "longitude": -89.718401, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61636, + "latitude": 40.699937, + "longitude": -89.595147, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61637, + "latitude": 40.702487, + "longitude": -89.589797, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61638, + "latitude": 40.796887, + "longitude": -89.611146, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61639, + "latitude": 40.709837, + "longitude": -89.563646, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61640, + "latitude": 40.785653, + "longitude": -89.617657, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61641, + "latitude": 40.640002, + "longitude": -89.651987, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61643, + "latitude": 40.744179, + "longitude": -89.718401, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61644, + "latitude": 40.765301, + "longitude": -89.569207, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61650, + "latitude": 40.744179, + "longitude": -89.718401, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61651, + "latitude": 40.744179, + "longitude": -89.718401, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61652, + "latitude": 40.87671, + "longitude": -89.509113, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61653, + "latitude": 40.744179, + "longitude": -89.718401, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61654, + "latitude": 40.744179, + "longitude": -89.718401, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61655, + "latitude": 40.744179, + "longitude": -89.718401, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61656, + "latitude": 40.744179, + "longitude": -89.718401, + "city": "Peoria", + "state": "IL", + "county": "Peoria" + }, + { + "zip_code": 61701, + "latitude": 40.462041, + "longitude": -88.850396, + "city": "Bloomington", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61702, + "latitude": 40.519236, + "longitude": -88.864303, + "city": "Bloomington", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61704, + "latitude": 40.491715, + "longitude": -88.982373, + "city": "Bloomington", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61709, + "latitude": 40.461431, + "longitude": -88.953015, + "city": "Bloomington", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61710, + "latitude": 40.477735, + "longitude": -88.954174, + "city": "Bloomington", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61720, + "latitude": 40.568549, + "longitude": -88.722113, + "city": "Anchor", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61721, + "latitude": 40.36129, + "longitude": -89.323143, + "city": "Armington", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61722, + "latitude": 40.447857, + "longitude": -88.632584, + "city": "Arrowsmith", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61723, + "latitude": 40.233769, + "longitude": -89.257602, + "city": "Atlanta", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 61724, + "latitude": 40.332543, + "longitude": -88.549114, + "city": "Bellflower", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61725, + "latitude": 40.580974, + "longitude": -89.178681, + "city": "Carlock", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61726, + "latitude": 40.535221, + "longitude": -88.895001, + "city": "Chenoa", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61727, + "latitude": 40.152822, + "longitude": -88.947118, + "city": "Clinton", + "state": "IL", + "county": "Dewitt" + }, + { + "zip_code": 61728, + "latitude": 40.566345, + "longitude": -88.614116, + "city": "Colfax", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61729, + "latitude": 40.617077, + "longitude": -89.183981, + "city": "Congerville", + "state": "IL", + "county": "Woodford" + }, + { + "zip_code": 61730, + "latitude": 40.54215, + "longitude": -88.716816, + "city": "Cooksville", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61731, + "latitude": 40.608711, + "longitude": -88.480229, + "city": "Cropsey", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61732, + "latitude": 40.43644, + "longitude": -88.882841, + "city": "Danvers", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61733, + "latitude": 40.561464, + "longitude": -89.406261, + "city": "Deer Creek", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61734, + "latitude": 40.424081, + "longitude": -89.600252, + "city": "Delavan", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61735, + "latitude": 40.208276, + "longitude": -88.808015, + "city": "Dewitt", + "state": "IL", + "county": "Dewitt" + }, + { + "zip_code": 61736, + "latitude": 40.398907, + "longitude": -88.868647, + "city": "Downs", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61737, + "latitude": 40.44998, + "longitude": -88.717168, + "city": "Ellsworth", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61738, + "latitude": 40.684846, + "longitude": -89.106751, + "city": "El Paso", + "state": "IL", + "county": "Woodford" + }, + { + "zip_code": 61739, + "latitude": 40.76723, + "longitude": -88.627756, + "city": "Fairbury", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 61740, + "latitude": 40.882185, + "longitude": -88.844393, + "city": "Flanagan", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 61741, + "latitude": 40.754176, + "longitude": -88.393085, + "city": "Forrest", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 61742, + "latitude": 40.661248, + "longitude": -89.289652, + "city": "Goodfield", + "state": "IL", + "county": "Woodford" + }, + { + "zip_code": 61743, + "latitude": 40.879417, + "longitude": -88.608644, + "city": "Graymont", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 61744, + "latitude": 40.744776, + "longitude": -88.881354, + "city": "Gridley", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61745, + "latitude": 40.458782, + "longitude": -88.985385, + "city": "Heyworth", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61747, + "latitude": 40.535696, + "longitude": -89.445054, + "city": "Hopedale", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61748, + "latitude": 40.62502, + "longitude": -88.989005, + "city": "Hudson", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61749, + "latitude": 40.111484, + "longitude": -89.062222, + "city": "Kenney", + "state": "IL", + "county": "Dewitt" + }, + { + "zip_code": 61750, + "latitude": 40.098291, + "longitude": -88.841501, + "city": "Lane", + "state": "IL", + "county": "Dewitt" + }, + { + "zip_code": 61751, + "latitude": 40.21927, + "longitude": -89.285172, + "city": "Lawndale", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 61752, + "latitude": 40.459553, + "longitude": -88.849599, + "city": "Le Roy", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61753, + "latitude": 40.483327, + "longitude": -88.874304, + "city": "Lexington", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61754, + "latitude": 40.31522, + "longitude": -89.194639, + "city": "Mc Lean", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61755, + "latitude": 40.530344, + "longitude": -89.369718, + "city": "Mackinaw", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61756, + "latitude": 40.037523, + "longitude": -88.961338, + "city": "Maroa", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 61758, + "latitude": 40.519236, + "longitude": -88.864303, + "city": "Merna", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61759, + "latitude": 40.447572, + "longitude": -89.334398, + "city": "Minier", + "state": "IL", + "county": "Tazewell" + }, + { + "zip_code": 61760, + "latitude": 40.838957, + "longitude": -89.066126, + "city": "Minonk", + "state": "IL", + "county": "Woodford" + }, + { + "zip_code": 61761, + "latitude": 40.530375, + "longitude": -88.7989, + "city": "Normal", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61764, + "latitude": 40.87479, + "longitude": -88.630826, + "city": "Pontiac", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 61769, + "latitude": 40.883768, + "longitude": -88.394974, + "city": "Saunemin", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 61770, + "latitude": 40.454332, + "longitude": -88.865256, + "city": "Saybrook", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61771, + "latitude": 40.742182, + "longitude": -89.134822, + "city": "Secor", + "state": "IL", + "county": "Woodford" + }, + { + "zip_code": 61772, + "latitude": 40.519236, + "longitude": -88.864303, + "city": "Shirley", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61773, + "latitude": 40.57361, + "longitude": -88.384737, + "city": "Sibley", + "state": "IL", + "county": "Ford" + }, + { + "zip_code": 61774, + "latitude": 40.435192, + "longitude": -89.220679, + "city": "Stanford", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61775, + "latitude": 40.652662, + "longitude": -88.39463, + "city": "Strawn", + "state": "IL", + "county": "Livingston" + }, + { + "zip_code": 61776, + "latitude": 40.562341, + "longitude": -88.897711, + "city": "Towanda", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61777, + "latitude": 40.223337, + "longitude": -88.943985, + "city": "Wapella", + "state": "IL", + "county": "Dewitt" + }, + { + "zip_code": 61778, + "latitude": 40.241747, + "longitude": -89.092664, + "city": "Waynesville", + "state": "IL", + "county": "Dewitt" + }, + { + "zip_code": 61790, + "latitude": 40.51032, + "longitude": -88.99803, + "city": "Normal", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61791, + "latitude": 40.519236, + "longitude": -88.864303, + "city": "Bloomington", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61799, + "latitude": 40.488468, + "longitude": -88.939637, + "city": "Bloomington", + "state": "IL", + "county": "Mclean" + }, + { + "zip_code": 61801, + "latitude": 40.133657, + "longitude": -88.182071, + "city": "Urbana", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61802, + "latitude": 40.074573, + "longitude": -88.169093, + "city": "Urbana", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61803, + "latitude": 40.10593, + "longitude": -88.224669, + "city": "Urbana", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61810, + "latitude": 39.923693, + "longitude": -87.899719, + "city": "Allerton", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61811, + "latitude": 40.285456, + "longitude": -87.632675, + "city": "Alvin", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61812, + "latitude": 40.258038, + "longitude": -87.874221, + "city": "Armstrong", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61813, + "latitude": 39.908567, + "longitude": -88.599987, + "city": "Bement", + "state": "IL", + "county": "Piatt" + }, + { + "zip_code": 61814, + "latitude": 40.24097, + "longitude": -87.576801, + "city": "Bismarck", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61815, + "latitude": 40.10838, + "longitude": -88.378167, + "city": "Bondville", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61816, + "latitude": 39.923208, + "longitude": -87.992677, + "city": "Broadlands", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61817, + "latitude": 40.015467, + "longitude": -87.804585, + "city": "Catlin", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61818, + "latitude": 39.88603, + "longitude": -88.68207, + "city": "Cerro Gordo", + "state": "IL", + "county": "Piatt" + }, + { + "zip_code": 61820, + "latitude": 40.101777, + "longitude": -88.197166, + "city": "Champaign", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61821, + "latitude": 40.117337, + "longitude": -88.312996, + "city": "Champaign", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61822, + "latitude": 40.131682, + "longitude": -88.28541, + "city": "Champaign", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61824, + "latitude": 40.139946, + "longitude": -88.196102, + "city": "Champaign", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61825, + "latitude": 40.139946, + "longitude": -88.196102, + "city": "Champaign", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61826, + "latitude": 40.113139, + "longitude": -88.361251, + "city": "Champaign", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61830, + "latitude": 40.028868, + "longitude": -88.69568, + "city": "Cisco", + "state": "IL", + "county": "Piatt" + }, + { + "zip_code": 61831, + "latitude": 40.227338, + "longitude": -87.80397, + "city": "Collison", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61832, + "latitude": 40.10398, + "longitude": -87.757792, + "city": "Danville", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61833, + "latitude": 40.064586, + "longitude": -87.637493, + "city": "Tilton", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61834, + "latitude": 40.160162, + "longitude": -87.67293, + "city": "Danville", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61839, + "latitude": 40.124321, + "longitude": -88.623262, + "city": "De Land", + "state": "IL", + "county": "Piatt" + }, + { + "zip_code": 61840, + "latitude": 40.307054, + "longitude": -88.301259, + "city": "Dewey", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61841, + "latitude": 40.135318, + "longitude": -87.808538, + "city": "Fairmount", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61842, + "latitude": 40.18631, + "longitude": -88.69107, + "city": "Farmer City", + "state": "IL", + "county": "Dewitt" + }, + { + "zip_code": 61843, + "latitude": 40.137239, + "longitude": -88.208104, + "city": "Fisher", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61844, + "latitude": 40.139763, + "longitude": -87.86895, + "city": "Fithian", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61845, + "latitude": 40.347405, + "longitude": -88.384648, + "city": "Foosland", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61846, + "latitude": 39.979714, + "longitude": -87.734359, + "city": "Georgetown", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61847, + "latitude": 40.278553, + "longitude": -88.011017, + "city": "Gifford", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61848, + "latitude": 40.304034, + "longitude": -87.700689, + "city": "Henning", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61849, + "latitude": 40.110684, + "longitude": -88.154018, + "city": "Homer", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61850, + "latitude": 39.939685, + "longitude": -87.730068, + "city": "Indianola", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61851, + "latitude": 39.959789, + "longitude": -88.25522, + "city": "Ivesdale", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61852, + "latitude": 39.91593, + "longitude": -88.034929, + "city": "Longview", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61853, + "latitude": 40.111848, + "longitude": -88.20431, + "city": "Mahomet", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61854, + "latitude": 40.193243, + "longitude": -88.545144, + "city": "Mansfield", + "state": "IL", + "county": "Piatt" + }, + { + "zip_code": 61855, + "latitude": 39.923765, + "longitude": -88.659875, + "city": "Milmine", + "state": "IL", + "county": "Piatt" + }, + { + "zip_code": 61856, + "latitude": 40.050289, + "longitude": -88.597923, + "city": "Monticello", + "state": "IL", + "county": "Piatt" + }, + { + "zip_code": 61857, + "latitude": 40.116478, + "longitude": -87.844689, + "city": "Muncie", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61858, + "latitude": 40.133222, + "longitude": -87.756376, + "city": "Oakwood", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61859, + "latitude": 40.069274, + "longitude": -88.105359, + "city": "Ogden", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61862, + "latitude": 40.305199, + "longitude": -87.966332, + "city": "Penfield", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61863, + "latitude": 40.090766, + "longitude": -88.1675, + "city": "Pesotum", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61864, + "latitude": 40.011073, + "longitude": -88.151394, + "city": "Philo", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61865, + "latitude": 40.211734, + "longitude": -87.785617, + "city": "Potomac", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61866, + "latitude": 40.249954, + "longitude": -88.113686, + "city": "Rantoul", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61870, + "latitude": 39.910953, + "longitude": -87.615286, + "city": "Ridge Farm", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61871, + "latitude": 40.192376, + "longitude": -87.974197, + "city": "Royal", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61872, + "latitude": 39.945436, + "longitude": -88.359609, + "city": "Sadorus", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61873, + "latitude": 40.144962, + "longitude": -88.072851, + "city": "Saint Joseph", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61874, + "latitude": 40.068677, + "longitude": -88.253105, + "city": "Savoy", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61875, + "latitude": 40.092808, + "longitude": -88.406344, + "city": "Seymour", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61876, + "latitude": 39.935302, + "longitude": -87.83913, + "city": "Sidell", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61877, + "latitude": 39.98922, + "longitude": -88.076343, + "city": "Sidney", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61878, + "latitude": 40.241697, + "longitude": -88.155556, + "city": "Thomasboro", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61880, + "latitude": 40.03821, + "longitude": -88.174757, + "city": "Tolono", + "state": "IL", + "county": "Champaign" + }, + { + "zip_code": 61882, + "latitude": 40.134768, + "longitude": -88.745542, + "city": "Weldon", + "state": "IL", + "county": "Dewitt" + }, + { + "zip_code": 61883, + "latitude": 40.103625, + "longitude": -87.744819, + "city": "Westville", + "state": "IL", + "county": "Vermilion" + }, + { + "zip_code": 61884, + "latitude": 40.091056, + "longitude": -88.503949, + "city": "White Heath", + "state": "IL", + "county": "Piatt" + }, + { + "zip_code": 61910, + "latitude": 39.725828, + "longitude": -88.305182, + "city": "Arcola", + "state": "IL", + "county": "Douglas" + }, + { + "zip_code": 61911, + "latitude": 39.728925, + "longitude": -88.249344, + "city": "Arthur", + "state": "IL", + "county": "Douglas" + }, + { + "zip_code": 61912, + "latitude": 39.531041, + "longitude": -88.040616, + "city": "Ashmore", + "state": "IL", + "county": "Coles" + }, + { + "zip_code": 61913, + "latitude": 39.766094, + "longitude": -88.273085, + "city": "Atwood", + "state": "IL", + "county": "Douglas" + }, + { + "zip_code": 61914, + "latitude": 39.638, + "longitude": -88.75367, + "city": "Bethany", + "state": "IL", + "county": "Moultrie" + }, + { + "zip_code": 61917, + "latitude": 39.713401, + "longitude": -87.818005, + "city": "Brocton", + "state": "IL", + "county": "Edgar" + }, + { + "zip_code": 61919, + "latitude": 39.752952, + "longitude": -88.149912, + "city": "Camargo", + "state": "IL", + "county": "Douglas" + }, + { + "zip_code": 61920, + "latitude": 39.499622, + "longitude": -88.160348, + "city": "Charleston", + "state": "IL", + "county": "Coles" + }, + { + "zip_code": 61924, + "latitude": 39.77859, + "longitude": -87.687638, + "city": "Chrisman", + "state": "IL", + "county": "Edgar" + }, + { + "zip_code": 61925, + "latitude": 39.679871, + "longitude": -88.774951, + "city": "Dalton City", + "state": "IL", + "county": "Moultrie" + }, + { + "zip_code": 61928, + "latitude": 39.585282, + "longitude": -88.639372, + "city": "Gays", + "state": "IL", + "county": "Moultrie" + }, + { + "zip_code": 61929, + "latitude": 39.843006, + "longitude": -88.585389, + "city": "Hammond", + "state": "IL", + "county": "Piatt" + }, + { + "zip_code": 61930, + "latitude": 39.695357, + "longitude": -88.127173, + "city": "Hindsboro", + "state": "IL", + "county": "Douglas" + }, + { + "zip_code": 61931, + "latitude": 39.586199, + "longitude": -88.347315, + "city": "Humboldt", + "state": "IL", + "county": "Coles" + }, + { + "zip_code": 61932, + "latitude": 39.718148, + "longitude": -87.873472, + "city": "Hume", + "state": "IL", + "county": "Edgar" + }, + { + "zip_code": 61933, + "latitude": 39.637094, + "longitude": -87.896219, + "city": "Kansas", + "state": "IL", + "county": "Edgar" + }, + { + "zip_code": 61936, + "latitude": 39.798287, + "longitude": -88.727157, + "city": "La Place", + "state": "IL", + "county": "Piatt" + }, + { + "zip_code": 61937, + "latitude": 39.701633, + "longitude": -88.606722, + "city": "Lovington", + "state": "IL", + "county": "Moultrie" + }, + { + "zip_code": 61938, + "latitude": 39.505679, + "longitude": -88.247012, + "city": "Mattoon", + "state": "IL", + "county": "Coles" + }, + { + "zip_code": 61940, + "latitude": 39.80461, + "longitude": -87.780032, + "city": "Metcalf", + "state": "IL", + "county": "Edgar" + }, + { + "zip_code": 61941, + "latitude": 39.800028, + "longitude": -88.183049, + "city": "Murdock", + "state": "IL", + "county": "Douglas" + }, + { + "zip_code": 61942, + "latitude": 39.800771, + "longitude": -88.029696, + "city": "Newman", + "state": "IL", + "county": "Douglas" + }, + { + "zip_code": 61943, + "latitude": 39.62812, + "longitude": -88.217663, + "city": "Oakland", + "state": "IL", + "county": "Coles" + }, + { + "zip_code": 61944, + "latitude": 39.638496, + "longitude": -87.740488, + "city": "Paris", + "state": "IL", + "county": "Edgar" + }, + { + "zip_code": 61949, + "latitude": 39.660054, + "longitude": -87.863306, + "city": "Redmon", + "state": "IL", + "county": "Edgar" + }, + { + "zip_code": 61951, + "latitude": 39.588093, + "longitude": -88.633539, + "city": "Sullivan", + "state": "IL", + "county": "Moultrie" + }, + { + "zip_code": 61953, + "latitude": 39.787385, + "longitude": -88.274137, + "city": "Tuscola", + "state": "IL", + "county": "Douglas" + }, + { + "zip_code": 61955, + "latitude": 39.679882, + "longitude": -87.750216, + "city": "Vermilion", + "state": "IL", + "county": "Edgar" + }, + { + "zip_code": 61956, + "latitude": 39.766275, + "longitude": -88.091437, + "city": "Villa Grove", + "state": "IL", + "county": "Douglas" + }, + { + "zip_code": 61957, + "latitude": 39.425509, + "longitude": -88.714896, + "city": "Windsor", + "state": "IL", + "county": "Shelby" + }, + { + "zip_code": 62001, + "latitude": 38.882109, + "longitude": -89.739366, + "city": "Alhambra", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62002, + "latitude": 38.929065, + "longitude": -89.968862, + "city": "Alton", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62006, + "latitude": 39.004588, + "longitude": -90.653455, + "city": "Batchtown", + "state": "IL", + "county": "Calhoun" + }, + { + "zip_code": 62009, + "latitude": 39.120709, + "longitude": -89.940021, + "city": "Benld", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62010, + "latitude": 38.923994, + "longitude": -90.054615, + "city": "Bethalto", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62011, + "latitude": 39.112821, + "longitude": -89.212452, + "city": "Bingham", + "state": "IL", + "county": "Fayette" + }, + { + "zip_code": 62012, + "latitude": 39.07267, + "longitude": -90.254596, + "city": "Brighton", + "state": "IL", + "county": "Jersey" + }, + { + "zip_code": 62013, + "latitude": 38.925543, + "longitude": -90.596798, + "city": "Brussels", + "state": "IL", + "county": "Calhoun" + }, + { + "zip_code": 62014, + "latitude": 39.049428, + "longitude": -89.980834, + "city": "Bunker Hill", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62015, + "latitude": 39.210135, + "longitude": -89.532057, + "city": "Butler", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62016, + "latitude": 39.380638, + "longitude": -90.399251, + "city": "Carrollton", + "state": "IL", + "county": "Greene" + }, + { + "zip_code": 62017, + "latitude": 39.070254, + "longitude": -89.380042, + "city": "Coffeen", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62018, + "latitude": 38.909971, + "longitude": -90.064279, + "city": "Cottage Hills", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62019, + "latitude": 39.004543, + "longitude": -89.464108, + "city": "Donnellson", + "state": "IL", + "county": "Bond" + }, + { + "zip_code": 62021, + "latitude": 38.964212, + "longitude": -89.97814, + "city": "Dorsey", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62022, + "latitude": 38.992751, + "longitude": -90.316504, + "city": "Dow", + "state": "IL", + "county": "Jersey" + }, + { + "zip_code": 62023, + "latitude": 39.111806, + "longitude": -89.785514, + "city": "Eagarville", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62024, + "latitude": 38.831578, + "longitude": -89.99119, + "city": "East Alton", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62025, + "latitude": 38.841819, + "longitude": -89.877841, + "city": "Edwardsville", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62026, + "latitude": 38.733748, + "longitude": -89.94305, + "city": "Edwardsville", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62027, + "latitude": 39.286993, + "longitude": -90.553924, + "city": "Eldred", + "state": "IL", + "county": "Greene" + }, + { + "zip_code": 62028, + "latitude": 38.959647, + "longitude": -90.338648, + "city": "Elsah", + "state": "IL", + "county": "Jersey" + }, + { + "zip_code": 62030, + "latitude": 39.092772, + "longitude": -90.374651, + "city": "Fidelity", + "state": "IL", + "county": "Jersey" + }, + { + "zip_code": 62031, + "latitude": 39.107914, + "longitude": -90.501701, + "city": "Fieldon", + "state": "IL", + "county": "Jersey" + }, + { + "zip_code": 62032, + "latitude": 39.11551, + "longitude": -89.362709, + "city": "Fillmore", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62033, + "latitude": 39.25627, + "longitude": -89.888832, + "city": "Gillespie", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62034, + "latitude": 38.810731, + "longitude": -90.023867, + "city": "Glen Carbon", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62035, + "latitude": 38.884108, + "longitude": -90.110532, + "city": "Godfrey", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62036, + "latitude": 38.966585, + "longitude": -90.660769, + "city": "Golden Eagle", + "state": "IL", + "county": "Calhoun" + }, + { + "zip_code": 62037, + "latitude": 38.98414, + "longitude": -90.43136, + "city": "Grafton", + "state": "IL", + "county": "Jersey" + }, + { + "zip_code": 62040, + "latitude": 38.802398, + "longitude": -90.1289, + "city": "Granite City", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62044, + "latitude": 39.355962, + "longitude": -90.244338, + "city": "Greenfield", + "state": "IL", + "county": "Greene" + }, + { + "zip_code": 62045, + "latitude": 39.13427, + "longitude": -90.69376, + "city": "Hamburg", + "state": "IL", + "county": "Calhoun" + }, + { + "zip_code": 62046, + "latitude": 38.880823, + "longitude": -89.860115, + "city": "Hamel", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62047, + "latitude": 39.149443, + "longitude": -90.622789, + "city": "Hardin", + "state": "IL", + "county": "Calhoun" + }, + { + "zip_code": 62048, + "latitude": 38.827848, + "longitude": -90.092606, + "city": "Hartford", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62049, + "latitude": 39.139201, + "longitude": -89.471754, + "city": "Hillsboro", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62050, + "latitude": 39.319696, + "longitude": -90.385171, + "city": "Hillview", + "state": "IL", + "county": "Greene" + }, + { + "zip_code": 62051, + "latitude": 39.199223, + "longitude": -89.371698, + "city": "Irving", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62052, + "latitude": 39.101894, + "longitude": -90.304917, + "city": "Jerseyville", + "state": "IL", + "county": "Jersey" + }, + { + "zip_code": 62053, + "latitude": 39.311587, + "longitude": -90.636915, + "city": "Kampsville", + "state": "IL", + "county": "Calhoun" + }, + { + "zip_code": 62054, + "latitude": 39.191892, + "longitude": -90.352339, + "city": "Kane", + "state": "IL", + "county": "Greene" + }, + { + "zip_code": 62056, + "latitude": 39.169422, + "longitude": -89.552405, + "city": "Litchfield", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62058, + "latitude": 38.968616, + "longitude": -89.794284, + "city": "Livingston", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62059, + "latitude": 38.439983, + "longitude": -89.983521, + "city": "Lovejoy", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62060, + "latitude": 38.683349, + "longitude": -90.149108, + "city": "Madison", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62061, + "latitude": 38.779256, + "longitude": -89.778648, + "city": "Marine", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62062, + "latitude": 38.713829, + "longitude": -89.965751, + "city": "Maryville", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62063, + "latitude": 39.092772, + "longitude": -90.374651, + "city": "Medora", + "state": "IL", + "county": "Jersey" + }, + { + "zip_code": 62065, + "latitude": 39.13427, + "longitude": -90.69376, + "city": "Michael", + "state": "IL", + "county": "Calhoun" + }, + { + "zip_code": 62067, + "latitude": 38.928421, + "longitude": -89.984339, + "city": "Moro", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62069, + "latitude": 39.265646, + "longitude": -89.922605, + "city": "Mount Olive", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62070, + "latitude": 39.13427, + "longitude": -90.69376, + "city": "Mozier", + "state": "IL", + "county": "Calhoun" + }, + { + "zip_code": 62071, + "latitude": 38.6516, + "longitude": -90.163909, + "city": "National Stock Yards", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62074, + "latitude": 38.892137, + "longitude": -89.714645, + "city": "New Douglas", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62075, + "latitude": 39.241367, + "longitude": -89.322889, + "city": "Nokomis", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62076, + "latitude": 39.261791, + "longitude": -89.421584, + "city": "Ohlman", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62077, + "latitude": 39.031684, + "longitude": -89.52368, + "city": "Panama", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62078, + "latitude": 39.319696, + "longitude": -90.385171, + "city": "Patterson", + "state": "IL", + "county": "Greene" + }, + { + "zip_code": 62079, + "latitude": 39.112843, + "longitude": -90.11977, + "city": "Piasa", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62080, + "latitude": 39.144177, + "longitude": -89.110549, + "city": "Ramsey", + "state": "IL", + "county": "Fayette" + }, + { + "zip_code": 62081, + "latitude": 39.319696, + "longitude": -90.385171, + "city": "Rockbridge", + "state": "IL", + "county": "Greene" + }, + { + "zip_code": 62082, + "latitude": 39.483354, + "longitude": -90.373258, + "city": "Roodhouse", + "state": "IL", + "county": "Greene" + }, + { + "zip_code": 62083, + "latitude": 39.37433, + "longitude": -89.198256, + "city": "Rosamond", + "state": "IL", + "county": "Christian" + }, + { + "zip_code": 62084, + "latitude": 38.846947, + "longitude": -90.080752, + "city": "Roxana", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62085, + "latitude": 39.082793, + "longitude": -89.804349, + "city": "Sawyerville", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62086, + "latitude": 38.961617, + "longitude": -89.554727, + "city": "Sorento", + "state": "IL", + "county": "Bond" + }, + { + "zip_code": 62087, + "latitude": 38.822547, + "longitude": -90.058255, + "city": "South Roxana", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62088, + "latitude": 39.038526, + "longitude": -89.784732, + "city": "Staunton", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62089, + "latitude": 39.121757, + "longitude": -89.494172, + "city": "Taylor Springs", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62090, + "latitude": 38.67025, + "longitude": -90.168859, + "city": "Venice", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62091, + "latitude": 39.061381, + "longitude": -89.61133, + "city": "Walshville", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62092, + "latitude": 39.43886, + "longitude": -90.402937, + "city": "White Hall", + "state": "IL", + "county": "Greene" + }, + { + "zip_code": 62093, + "latitude": 39.069484, + "longitude": -89.856534, + "city": "Wilsonville", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62094, + "latitude": 39.162463, + "longitude": -89.40593, + "city": "Witt", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62095, + "latitude": 38.861597, + "longitude": -90.085657, + "city": "Wood River", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62097, + "latitude": 38.921075, + "longitude": -89.922418, + "city": "Worden", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62098, + "latitude": 39.376153, + "longitude": -90.293302, + "city": "Wrights", + "state": "IL", + "county": "Greene" + }, + { + "zip_code": 62201, + "latitude": 38.612317, + "longitude": -90.115857, + "city": "East Saint Louis", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62202, + "latitude": 38.6163, + "longitude": -90.159059, + "city": "East Saint Louis", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62203, + "latitude": 38.595757, + "longitude": -90.077007, + "city": "East Saint Louis", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62204, + "latitude": 38.6308, + "longitude": -90.095007, + "city": "East Saint Louis", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62205, + "latitude": 38.6123, + "longitude": -90.124308, + "city": "East Saint Louis", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62206, + "latitude": 38.551401, + "longitude": -90.15441, + "city": "East Saint Louis", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62207, + "latitude": 38.58705, + "longitude": -90.127808, + "city": "East Saint Louis", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62208, + "latitude": 38.59666, + "longitude": -90.006304, + "city": "Fairview Heights", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62214, + "latitude": 38.381545, + "longitude": -89.579449, + "city": "Addieville", + "state": "IL", + "county": "Washington" + }, + { + "zip_code": 62215, + "latitude": 38.514316, + "longitude": -89.627154, + "city": "Albers", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62216, + "latitude": 38.608924, + "longitude": -89.603386, + "city": "Aviston", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62217, + "latitude": 38.155348, + "longitude": -89.752849, + "city": "Baldwin", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62218, + "latitude": 38.542321, + "longitude": -89.462267, + "city": "Bartelso", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62219, + "latitude": 38.601825, + "longitude": -89.427944, + "city": "Beckemeyer", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62220, + "latitude": 38.46435, + "longitude": -89.973877, + "city": "Belleville", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62221, + "latitude": 38.523569, + "longitude": -89.911601, + "city": "Belleville", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62222, + "latitude": 38.439983, + "longitude": -89.983521, + "city": "Belleville", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62223, + "latitude": 38.55025, + "longitude": -90.076357, + "city": "Belleville", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62224, + "latitude": 38.439983, + "longitude": -89.983521, + "city": "Mascoutah", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62225, + "latitude": 38.543201, + "longitude": -89.85902, + "city": "Scott Air Force Base", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62226, + "latitude": 38.509999, + "longitude": -89.998685, + "city": "Belleville", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62230, + "latitude": 38.640028, + "longitude": -89.52961, + "city": "Breese", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62231, + "latitude": 38.620776, + "longitude": -89.402155, + "city": "Carlyle", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62232, + "latitude": 38.630199, + "longitude": -90.012477, + "city": "Caseyville", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62233, + "latitude": 38.048847, + "longitude": -89.815308, + "city": "Chester", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62234, + "latitude": 38.733747, + "longitude": -89.908644, + "city": "Collinsville", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62236, + "latitude": 38.409442, + "longitude": -90.16382, + "city": "Columbia", + "state": "IL", + "county": "Monroe" + }, + { + "zip_code": 62237, + "latitude": 38.175298, + "longitude": -89.647936, + "city": "Coulterville", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62238, + "latitude": 38.046458, + "longitude": -89.478358, + "city": "Cutler", + "state": "IL", + "county": "Perry" + }, + { + "zip_code": 62239, + "latitude": 38.519424, + "longitude": -90.181561, + "city": "Dupo", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62240, + "latitude": 38.524005, + "longitude": -90.200514, + "city": "East Carondelet", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62241, + "latitude": 38.041586, + "longitude": -89.893045, + "city": "Ellis Grove", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62242, + "latitude": 38.10828, + "longitude": -89.943684, + "city": "Evansville", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62243, + "latitude": 38.428067, + "longitude": -89.895886, + "city": "Freeburg", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62244, + "latitude": 38.187143, + "longitude": -90.194704, + "city": "Fults", + "state": "IL", + "county": "Monroe" + }, + { + "zip_code": 62245, + "latitude": 38.560662, + "longitude": -89.559413, + "city": "Germantown", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62246, + "latitude": 38.884421, + "longitude": -89.423032, + "city": "Greenville", + "state": "IL", + "county": "Bond" + }, + { + "zip_code": 62247, + "latitude": 38.977111, + "longitude": -88.975507, + "city": "Hagarstown", + "state": "IL", + "county": "Fayette" + }, + { + "zip_code": 62248, + "latitude": 38.299507, + "longitude": -89.961825, + "city": "Hecker", + "state": "IL", + "county": "Monroe" + }, + { + "zip_code": 62249, + "latitude": 38.758429, + "longitude": -89.741694, + "city": "Highland", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62250, + "latitude": 38.540877, + "longitude": -89.436298, + "city": "Hoffman", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62252, + "latitude": 38.601768, + "longitude": -89.291549, + "city": "Huey", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62253, + "latitude": 38.588112, + "longitude": -89.472555, + "city": "Keyesport", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62254, + "latitude": 38.605448, + "longitude": -89.82823, + "city": "Lebanon", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62255, + "latitude": 38.30606, + "longitude": -89.782156, + "city": "Lenzburg", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62256, + "latitude": 38.30426, + "longitude": -90.135645, + "city": "Maeystown", + "state": "IL", + "county": "Monroe" + }, + { + "zip_code": 62257, + "latitude": 38.311672, + "longitude": -89.778855, + "city": "Marissa", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62258, + "latitude": 38.421239, + "longitude": -89.769993, + "city": "Mascoutah", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62259, + "latitude": 38.013132, + "longitude": -89.899569, + "city": "Menard", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62260, + "latitude": 38.471651, + "longitude": -90.092336, + "city": "Millstadt", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62261, + "latitude": 38.01529, + "longitude": -90.00377, + "city": "Modoc", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62262, + "latitude": 38.93611, + "longitude": -89.313739, + "city": "Mulberry Grove", + "state": "IL", + "county": "Bond" + }, + { + "zip_code": 62263, + "latitude": 38.331439, + "longitude": -89.3674, + "city": "Nashville", + "state": "IL", + "county": "Washington" + }, + { + "zip_code": 62264, + "latitude": 38.30799, + "longitude": -89.921695, + "city": "New Athens", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62265, + "latitude": 38.513254, + "longitude": -89.587348, + "city": "New Baden", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62266, + "latitude": 38.485708, + "longitude": -89.681587, + "city": "New Memphis", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62268, + "latitude": 38.274439, + "longitude": -89.553239, + "city": "Oakdale", + "state": "IL", + "county": "Washington" + }, + { + "zip_code": 62269, + "latitude": 38.571835, + "longitude": -89.89568, + "city": "O Fallon", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62271, + "latitude": 38.433952, + "longitude": -89.511013, + "city": "Okawville", + "state": "IL", + "county": "Washington" + }, + { + "zip_code": 62272, + "latitude": 37.997145, + "longitude": -89.626074, + "city": "Percy", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62273, + "latitude": 38.884459, + "longitude": -89.444898, + "city": "Pierron", + "state": "IL", + "county": "Bond" + }, + { + "zip_code": 62274, + "latitude": 38.083297, + "longitude": -89.386589, + "city": "Pinckneyville", + "state": "IL", + "county": "Perry" + }, + { + "zip_code": 62275, + "latitude": 38.822283, + "longitude": -89.525591, + "city": "Pocahontas", + "state": "IL", + "county": "Bond" + }, + { + "zip_code": 62277, + "latitude": 38.114151, + "longitude": -90.034123, + "city": "Prairie Du Rocher", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62278, + "latitude": 38.119605, + "longitude": -89.818578, + "city": "Red Bud", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62279, + "latitude": 38.152057, + "longitude": -90.134596, + "city": "Renault", + "state": "IL", + "county": "Monroe" + }, + { + "zip_code": 62280, + "latitude": 37.861143, + "longitude": -89.698387, + "city": "Rockwood", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62281, + "latitude": 38.705928, + "longitude": -89.792463, + "city": "Saint Jacob", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62282, + "latitude": 38.363228, + "longitude": -89.713921, + "city": "Saint Libory", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62283, + "latitude": 38.652071, + "longitude": -89.214562, + "city": "Shattuc", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62284, + "latitude": 38.890378, + "longitude": -89.314242, + "city": "Smithboro", + "state": "IL", + "county": "Bond" + }, + { + "zip_code": 62285, + "latitude": 38.475288, + "longitude": -89.898651, + "city": "Smithton", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62286, + "latitude": 38.108083, + "longitude": -89.726486, + "city": "Sparta", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62288, + "latitude": 38.004698, + "longitude": -89.676103, + "city": "Steeleville", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62289, + "latitude": 38.596698, + "longitude": -89.751194, + "city": "Summerfield", + "state": "IL", + "county": "Saint Clair" + }, + { + "zip_code": 62292, + "latitude": 38.212224, + "longitude": -89.689539, + "city": "Tilden", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62293, + "latitude": 38.620028, + "longitude": -89.569004, + "city": "Trenton", + "state": "IL", + "county": "Clinton" + }, + { + "zip_code": 62294, + "latitude": 38.721612, + "longitude": -89.895817, + "city": "Troy", + "state": "IL", + "county": "Madison" + }, + { + "zip_code": 62295, + "latitude": 38.280514, + "longitude": -90.312208, + "city": "Valmeyer", + "state": "IL", + "county": "Monroe" + }, + { + "zip_code": 62297, + "latitude": 38.036046, + "longitude": -89.83918, + "city": "Walsh", + "state": "IL", + "county": "Randolph" + }, + { + "zip_code": 62298, + "latitude": 38.327408, + "longitude": -90.155869, + "city": "Waterloo", + "state": "IL", + "county": "Monroe" + }, + { + "zip_code": 62301, + "latitude": 39.952413, + "longitude": -91.200676, + "city": "Quincy", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62305, + "latitude": 39.96008, + "longitude": -91.302633, + "city": "Quincy", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62306, + "latitude": 39.97863, + "longitude": -91.21256, + "city": "Quincy", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62310, + "latitude": 40.416145, + "longitude": -91.205805, + "city": "Adrian", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62311, + "latitude": 40.330707, + "longitude": -91.045874, + "city": "Augusta", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62312, + "latitude": 39.611334, + "longitude": -90.894104, + "city": "Barry", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62313, + "latitude": 40.31943, + "longitude": -91.240855, + "city": "Basco", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62314, + "latitude": 39.729666, + "longitude": -90.90981, + "city": "Baylis", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62316, + "latitude": 40.376123, + "longitude": -91.17718, + "city": "Bowen", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62318, + "latitude": 40.488126, + "longitude": -91.135819, + "city": "Burnside", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62319, + "latitude": 40.131603, + "longitude": -90.556586, + "city": "Camden", + "state": "IL", + "county": "Schuyler" + }, + { + "zip_code": 62320, + "latitude": 40.018202, + "longitude": -91.060449, + "city": "Camp Point", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62321, + "latitude": 40.432148, + "longitude": -91.135365, + "city": "Carthage", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62323, + "latitude": 39.782477, + "longitude": -90.749883, + "city": "Chambersburg", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62324, + "latitude": 39.982894, + "longitude": -90.949268, + "city": "Clayton", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62325, + "latitude": 40.012663, + "longitude": -91.152206, + "city": "Coatsburg", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62326, + "latitude": 40.400892, + "longitude": -90.734536, + "city": "Colchester", + "state": "IL", + "county": "Mcdonough" + }, + { + "zip_code": 62329, + "latitude": 40.571353, + "longitude": -91.168221, + "city": "Colusa", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62330, + "latitude": 40.435191, + "longitude": -91.077508, + "city": "Dallas City", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62334, + "latitude": 40.41707, + "longitude": -91.221434, + "city": "Elvaston", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62336, + "latitude": 40.468178, + "longitude": -91.170959, + "city": "Ferris", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62338, + "latitude": 39.960187, + "longitude": -91.282143, + "city": "Fowler", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62339, + "latitude": 40.110022, + "longitude": -91.027961, + "city": "Golden", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62340, + "latitude": 39.741573, + "longitude": -90.749386, + "city": "Griggsville", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62341, + "latitude": 40.475714, + "longitude": -91.271002, + "city": "Hamilton", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62343, + "latitude": 39.620372, + "longitude": -90.967919, + "city": "Hull", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62344, + "latitude": 40.131603, + "longitude": -90.556586, + "city": "Huntsville", + "state": "IL", + "county": "Schuyler" + }, + { + "zip_code": 62345, + "latitude": 39.620372, + "longitude": -90.967919, + "city": "Kinderhook", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62346, + "latitude": 40.148051, + "longitude": -91.004209, + "city": "La Prairie", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62347, + "latitude": 39.887579, + "longitude": -91.106747, + "city": "Liberty", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62348, + "latitude": 40.165558, + "longitude": -91.387504, + "city": "Lima", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62349, + "latitude": 40.154457, + "longitude": -91.210203, + "city": "Loraine", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62351, + "latitude": 40.074962, + "longitude": -91.283098, + "city": "Mendon", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62352, + "latitude": 39.563497, + "longitude": -90.650336, + "city": "Milton", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62353, + "latitude": 39.978147, + "longitude": -90.756924, + "city": "Mount Sterling", + "state": "IL", + "county": "Brown" + }, + { + "zip_code": 62354, + "latitude": 40.432598, + "longitude": -91.208266, + "city": "Nauvoo", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62355, + "latitude": 39.442983, + "longitude": -90.787696, + "city": "Nebo", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62356, + "latitude": 39.620372, + "longitude": -90.967919, + "city": "New Canton", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62357, + "latitude": 39.705209, + "longitude": -90.845884, + "city": "New Salem", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62358, + "latitude": 40.49093, + "longitude": -91.247972, + "city": "Niota", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62359, + "latitude": 39.97863, + "longitude": -91.21256, + "city": "Paloma", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62360, + "latitude": 39.829819, + "longitude": -91.286815, + "city": "Payson", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62361, + "latitude": 39.460514, + "longitude": -90.627114, + "city": "Pearl", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62362, + "latitude": 39.78247, + "longitude": -90.747978, + "city": "Perry", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62363, + "latitude": 39.615433, + "longitude": -90.798482, + "city": "Pittsfield", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62365, + "latitude": 39.935995, + "longitude": -91.232952, + "city": "Plainville", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62366, + "latitude": 39.447008, + "longitude": -90.87168, + "city": "Pleasant Hill", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62367, + "latitude": 40.323553, + "longitude": -90.967177, + "city": "Plymouth", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62370, + "latitude": 39.620372, + "longitude": -90.967919, + "city": "Rockport", + "state": "IL", + "county": "Pike" + }, + { + "zip_code": 62373, + "latitude": 40.286511, + "longitude": -91.372569, + "city": "Sutter", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62374, + "latitude": 40.388444, + "longitude": -90.764268, + "city": "Tennessee", + "state": "IL", + "county": "Mcdonough" + }, + { + "zip_code": 62375, + "latitude": 40.007601, + "longitude": -90.874657, + "city": "Timewell", + "state": "IL", + "county": "Brown" + }, + { + "zip_code": 62376, + "latitude": 40.073445, + "longitude": -91.206586, + "city": "Ursa", + "state": "IL", + "county": "Adams" + }, + { + "zip_code": 62378, + "latitude": 39.944465, + "longitude": -90.737957, + "city": "Versailles", + "state": "IL", + "county": "Brown" + }, + { + "zip_code": 62379, + "latitude": 40.297801, + "longitude": -91.198818, + "city": "Warsaw", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62380, + "latitude": 40.241584, + "longitude": -91.240017, + "city": "West Point", + "state": "IL", + "county": "Hancock" + }, + { + "zip_code": 62401, + "latitude": 39.116649, + "longitude": -88.545705, + "city": "Effingham", + "state": "IL", + "county": "Effingham" + }, + { + "zip_code": 62410, + "latitude": 38.527638, + "longitude": -87.706344, + "city": "Allendale", + "state": "IL", + "county": "Wabash" + }, + { + "zip_code": 62411, + "latitude": 39.053436, + "longitude": -88.719754, + "city": "Altamont", + "state": "IL", + "county": "Effingham" + }, + { + "zip_code": 62413, + "latitude": 39.134986, + "longitude": -87.838419, + "city": "Annapolis", + "state": "IL", + "county": "Crawford" + }, + { + "zip_code": 62414, + "latitude": 39.194098, + "longitude": -88.760126, + "city": "Beecher City", + "state": "IL", + "county": "Effingham" + }, + { + "zip_code": 62415, + "latitude": 38.710336, + "longitude": -87.703639, + "city": "Birds", + "state": "IL", + "county": "Lawrence" + }, + { + "zip_code": 62417, + "latitude": 38.654076, + "longitude": -87.706902, + "city": "Bridgeport", + "state": "IL", + "county": "Lawrence" + }, + { + "zip_code": 62418, + "latitude": 38.994303, + "longitude": -88.955042, + "city": "Brownstown", + "state": "IL", + "county": "Fayette" + }, + { + "zip_code": 62419, + "latitude": 38.65, + "longitude": -88.047886, + "city": "Calhoun", + "state": "IL", + "county": "Richland" + }, + { + "zip_code": 62420, + "latitude": 39.293482, + "longitude": -87.954456, + "city": "Casey", + "state": "IL", + "county": "Clark" + }, + { + "zip_code": 62421, + "latitude": 38.743413, + "longitude": -87.966843, + "city": "Claremont", + "state": "IL", + "county": "Richland" + }, + { + "zip_code": 62422, + "latitude": 39.250015, + "longitude": -88.862961, + "city": "Cowden", + "state": "IL", + "county": "Shelby" + }, + { + "zip_code": 62423, + "latitude": 39.411823, + "longitude": -87.573146, + "city": "Dennison", + "state": "IL", + "county": "Clark" + }, + { + "zip_code": 62424, + "latitude": 39.049843, + "longitude": -88.576045, + "city": "Dieterich", + "state": "IL", + "county": "Effingham" + }, + { + "zip_code": 62425, + "latitude": 38.819798, + "longitude": -88.090524, + "city": "Dundas", + "state": "IL", + "county": "Richland" + }, + { + "zip_code": 62426, + "latitude": 38.988768, + "longitude": -88.524406, + "city": "Edgewood", + "state": "IL", + "county": "Effingham" + }, + { + "zip_code": 62427, + "latitude": 38.895585, + "longitude": -87.672672, + "city": "Flat Rock", + "state": "IL", + "county": "Crawford" + }, + { + "zip_code": 62428, + "latitude": 39.274017, + "longitude": -88.124598, + "city": "Greenup", + "state": "IL", + "county": "Cumberland" + }, + { + "zip_code": 62431, + "latitude": 39.219603, + "longitude": -88.981896, + "city": "Herrick", + "state": "IL", + "county": "Shelby" + }, + { + "zip_code": 62432, + "latitude": 39.127107, + "longitude": -88.117007, + "city": "Hidalgo", + "state": "IL", + "county": "Jasper" + }, + { + "zip_code": 62433, + "latitude": 39.085312, + "longitude": -87.707636, + "city": "Hutsonville", + "state": "IL", + "county": "Crawford" + }, + { + "zip_code": 62434, + "latitude": 38.757302, + "longitude": -88.473594, + "city": "Ingraham", + "state": "IL", + "county": "Clay" + }, + { + "zip_code": 62435, + "latitude": 39.374287, + "longitude": -88.244487, + "city": "Janesville", + "state": "IL", + "county": "Cumberland" + }, + { + "zip_code": 62436, + "latitude": 39.207405, + "longitude": -88.273197, + "city": "Jewett", + "state": "IL", + "county": "Cumberland" + }, + { + "zip_code": 62438, + "latitude": 39.434607, + "longitude": -88.805278, + "city": "Lakewood", + "state": "IL", + "county": "Shelby" + }, + { + "zip_code": 62439, + "latitude": 38.685176, + "longitude": -87.634235, + "city": "Lawrenceville", + "state": "IL", + "county": "Lawrence" + }, + { + "zip_code": 62440, + "latitude": 39.418401, + "longitude": -88.270006, + "city": "Lerna", + "state": "IL", + "county": "Coles" + }, + { + "zip_code": 62441, + "latitude": 39.331139, + "longitude": -87.747363, + "city": "Marshall", + "state": "IL", + "county": "Clark" + }, + { + "zip_code": 62442, + "latitude": 39.325782, + "longitude": -87.850086, + "city": "Martinsville", + "state": "IL", + "county": "Clark" + }, + { + "zip_code": 62443, + "latitude": 38.95267, + "longitude": -88.635111, + "city": "Mason", + "state": "IL", + "county": "Effingham" + }, + { + "zip_code": 62444, + "latitude": 39.434607, + "longitude": -88.805278, + "city": "Mode", + "state": "IL", + "county": "Shelby" + }, + { + "zip_code": 62445, + "latitude": 39.163869, + "longitude": -88.37756, + "city": "Montrose", + "state": "IL", + "county": "Effingham" + }, + { + "zip_code": 62446, + "latitude": 38.381926, + "longitude": -88.405596, + "city": "Mount Erie", + "state": "IL", + "county": "Wayne" + }, + { + "zip_code": 62447, + "latitude": 39.290276, + "longitude": -88.241333, + "city": "Neoga", + "state": "IL", + "county": "Cumberland" + }, + { + "zip_code": 62448, + "latitude": 38.980049, + "longitude": -88.184675, + "city": "Newton", + "state": "IL", + "county": "Jasper" + }, + { + "zip_code": 62449, + "latitude": 39.029652, + "longitude": -87.782569, + "city": "Oblong", + "state": "IL", + "county": "Crawford" + }, + { + "zip_code": 62450, + "latitude": 38.709154, + "longitude": -88.085204, + "city": "Olney", + "state": "IL", + "county": "Richland" + }, + { + "zip_code": 62451, + "latitude": 39.000528, + "longitude": -87.604191, + "city": "Palestine", + "state": "IL", + "county": "Crawford" + }, + { + "zip_code": 62452, + "latitude": 38.587985, + "longitude": -88.011149, + "city": "Parkersburg", + "state": "IL", + "county": "Richland" + }, + { + "zip_code": 62454, + "latitude": 39.004559, + "longitude": -87.751776, + "city": "Robinson", + "state": "IL", + "county": "Crawford" + }, + { + "zip_code": 62458, + "latitude": 39.025319, + "longitude": -88.852372, + "city": "Saint Elmo", + "state": "IL", + "county": "Fayette" + }, + { + "zip_code": 62459, + "latitude": 38.927986, + "longitude": -88.029084, + "city": "Sainte Marie", + "state": "IL", + "county": "Jasper" + }, + { + "zip_code": 62460, + "latitude": 38.592132, + "longitude": -87.648661, + "city": "Saint Francisville", + "state": "IL", + "county": "Lawrence" + }, + { + "zip_code": 62461, + "latitude": 39.112465, + "longitude": -88.670484, + "city": "Shumway", + "state": "IL", + "county": "Effingham" + }, + { + "zip_code": 62462, + "latitude": 39.251684, + "longitude": -88.510776, + "city": "Sigel", + "state": "IL", + "county": "Shelby" + }, + { + "zip_code": 62463, + "latitude": 39.273518, + "longitude": -88.80134, + "city": "Stewardson", + "state": "IL", + "county": "Shelby" + }, + { + "zip_code": 62464, + "latitude": 38.98981, + "longitude": -87.839627, + "city": "Stoy", + "state": "IL", + "county": "Crawford" + }, + { + "zip_code": 62465, + "latitude": 39.349589, + "longitude": -88.616381, + "city": "Strasburg", + "state": "IL", + "county": "Shelby" + }, + { + "zip_code": 62466, + "latitude": 38.717105, + "longitude": -87.863812, + "city": "Sumner", + "state": "IL", + "county": "Lawrence" + }, + { + "zip_code": 62467, + "latitude": 39.132706, + "longitude": -88.450793, + "city": "Teutopolis", + "state": "IL", + "county": "Effingham" + }, + { + "zip_code": 62468, + "latitude": 39.282208, + "longitude": -88.272657, + "city": "Toledo", + "state": "IL", + "county": "Cumberland" + }, + { + "zip_code": 62469, + "latitude": 39.393753, + "longitude": -88.348819, + "city": "Trilla", + "state": "IL", + "county": "Coles" + }, + { + "zip_code": 62471, + "latitude": 38.982404, + "longitude": -89.051628, + "city": "Vandalia", + "state": "IL", + "county": "Fayette" + }, + { + "zip_code": 62473, + "latitude": 38.990551, + "longitude": -88.558435, + "city": "Watson", + "state": "IL", + "county": "Effingham" + }, + { + "zip_code": 62474, + "latitude": 39.407315, + "longitude": -87.949053, + "city": "Westfield", + "state": "IL", + "county": "Clark" + }, + { + "zip_code": 62475, + "latitude": 39.003369, + "longitude": -88.067535, + "city": "West Liberty", + "state": "IL", + "county": "Jasper" + }, + { + "zip_code": 62476, + "latitude": 38.519678, + "longitude": -88.009457, + "city": "West Salem", + "state": "IL", + "county": "Edwards" + }, + { + "zip_code": 62477, + "latitude": 39.236906, + "longitude": -87.674977, + "city": "West Union", + "state": "IL", + "county": "Clark" + }, + { + "zip_code": 62478, + "latitude": 39.158846, + "longitude": -87.723392, + "city": "West York", + "state": "IL", + "county": "Crawford" + }, + { + "zip_code": 62479, + "latitude": 39.028977, + "longitude": -88.299931, + "city": "Wheeler", + "state": "IL", + "county": "Jasper" + }, + { + "zip_code": 62480, + "latitude": 38.992322, + "longitude": -88.031057, + "city": "Willow Hill", + "state": "IL", + "county": "Jasper" + }, + { + "zip_code": 62481, + "latitude": 39.121515, + "longitude": -88.157258, + "city": "Yale", + "state": "IL", + "county": "Jasper" + }, + { + "zip_code": 62501, + "latitude": 39.965322, + "longitude": -88.848695, + "city": "Argenta", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62510, + "latitude": 39.527214, + "longitude": -89.249643, + "city": "Assumption", + "state": "IL", + "county": "Christian" + }, + { + "zip_code": 62511, + "latitude": 39.339104, + "longitude": -89.735704, + "city": "Atwater", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62512, + "latitude": 40.150457, + "longitude": -89.228483, + "city": "Beason", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 62513, + "latitude": 39.76891, + "longitude": -89.044099, + "city": "Blue Mound", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62514, + "latitude": 39.764726, + "longitude": -89.039766, + "city": "Boody", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62515, + "latitude": 39.849893, + "longitude": -89.387944, + "city": "Buffalo", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62517, + "latitude": 39.588232, + "longitude": -89.417117, + "city": "Bulpitt", + "state": "IL", + "county": "Christian" + }, + { + "zip_code": 62518, + "latitude": 40.05335, + "longitude": -89.19891, + "city": "Chestnut", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 62519, + "latitude": 39.937364, + "longitude": -89.40234, + "city": "Cornland", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 62520, + "latitude": 39.826185, + "longitude": -89.43989, + "city": "Dawson", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62521, + "latitude": 39.839477, + "longitude": -88.946486, + "city": "Decatur", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62522, + "latitude": 39.865621, + "longitude": -89.018696, + "city": "Decatur", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62523, + "latitude": 39.911662, + "longitude": -88.890104, + "city": "Decatur", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62524, + "latitude": 39.853981, + "longitude": -88.981511, + "city": "Decatur", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62525, + "latitude": 39.853981, + "longitude": -88.981511, + "city": "Decatur", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62526, + "latitude": 39.858284, + "longitude": -88.938244, + "city": "Decatur", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62527, + "latitude": 39.853981, + "longitude": -88.981511, + "city": "Decatur", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62530, + "latitude": 39.569165, + "longitude": -89.662571, + "city": "Divernon", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62531, + "latitude": 39.612132, + "longitude": -89.311109, + "city": "Edinburg", + "state": "IL", + "county": "Christian" + }, + { + "zip_code": 62532, + "latitude": 39.780021, + "longitude": -88.980838, + "city": "Elwin", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62533, + "latitude": 39.440138, + "longitude": -89.617023, + "city": "Farmersville", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62534, + "latitude": 39.519283, + "longitude": -88.746756, + "city": "Findlay", + "state": "IL", + "county": "Shelby" + }, + { + "zip_code": 62535, + "latitude": 39.884409, + "longitude": -89.001417, + "city": "Forsyth", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62536, + "latitude": 39.641606, + "longitude": -89.650041, + "city": "Glenarm", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62537, + "latitude": 39.856678, + "longitude": -89.085041, + "city": "Harristown", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62538, + "latitude": 39.367208, + "longitude": -89.522401, + "city": "Harvel", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62539, + "latitude": 39.860619, + "longitude": -89.378449, + "city": "Illiopolis", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62540, + "latitude": 39.500009, + "longitude": -89.416708, + "city": "Kincaid", + "state": "IL", + "county": "Christian" + }, + { + "zip_code": 62541, + "latitude": 39.970619, + "longitude": -89.350528, + "city": "Lake Fork", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 62543, + "latitude": 40.075633, + "longitude": -89.315464, + "city": "Latham", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 62544, + "latitude": 39.700267, + "longitude": -89.022026, + "city": "Macon", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62545, + "latitude": 39.777807, + "longitude": -89.406447, + "city": "Mechanicsburg", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62546, + "latitude": 39.469098, + "longitude": -89.396732, + "city": "Morrisonville", + "state": "IL", + "county": "Christian" + }, + { + "zip_code": 62547, + "latitude": 39.702903, + "longitude": -89.282367, + "city": "Mount Auburn", + "state": "IL", + "county": "Christian" + }, + { + "zip_code": 62548, + "latitude": 39.989734, + "longitude": -89.294027, + "city": "Mount Pulaski", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 62549, + "latitude": 39.825599, + "longitude": -88.907654, + "city": "Mt Zion", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62550, + "latitude": 39.575086, + "longitude": -88.889483, + "city": "Moweaqua", + "state": "IL", + "county": "Shelby" + }, + { + "zip_code": 62551, + "latitude": 39.91497, + "longitude": -88.997459, + "city": "Niantic", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62552, + "latitude": 39.883505, + "longitude": -88.8048, + "city": "Oakley", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62553, + "latitude": 39.434607, + "longitude": -88.805278, + "city": "Oconee", + "state": "IL", + "county": "Shelby" + }, + { + "zip_code": 62554, + "latitude": 39.927262, + "longitude": -88.850218, + "city": "Oreana", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62555, + "latitude": 39.458365, + "longitude": -89.217453, + "city": "Owaneco", + "state": "IL", + "county": "Christian" + }, + { + "zip_code": 62556, + "latitude": 39.429374, + "longitude": -89.30808, + "city": "Palmer", + "state": "IL", + "county": "Christian" + }, + { + "zip_code": 62557, + "latitude": 39.503638, + "longitude": -89.243695, + "city": "Pana", + "state": "IL", + "county": "Christian" + }, + { + "zip_code": 62558, + "latitude": 39.60855, + "longitude": -89.567791, + "city": "Pawnee", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62560, + "latitude": 39.311814, + "longitude": -89.580236, + "city": "Raymond", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62561, + "latitude": 39.750415, + "longitude": -89.542678, + "city": "Riverton", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62563, + "latitude": 39.718237, + "longitude": -89.564891, + "city": "Rochester", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62565, + "latitude": 39.458013, + "longitude": -88.805788, + "city": "Shelbyville", + "state": "IL", + "county": "Shelby" + }, + { + "zip_code": 62567, + "latitude": 39.646379, + "longitude": -89.218939, + "city": "Stonington", + "state": "IL", + "county": "Christian" + }, + { + "zip_code": 62568, + "latitude": 39.559092, + "longitude": -89.34063, + "city": "Taylorville", + "state": "IL", + "county": "Christian" + }, + { + "zip_code": 62570, + "latitude": 39.588002, + "longitude": -89.449507, + "city": "Tovey", + "state": "IL", + "county": "Christian" + }, + { + "zip_code": 62571, + "latitude": 39.38996, + "longitude": -88.959746, + "city": "Tower Hill", + "state": "IL", + "county": "Shelby" + }, + { + "zip_code": 62572, + "latitude": 39.368777, + "longitude": -89.654507, + "city": "Waggoner", + "state": "IL", + "county": "Montgomery" + }, + { + "zip_code": 62573, + "latitude": 39.917841, + "longitude": -89.017515, + "city": "Warrensburg", + "state": "IL", + "county": "Macon" + }, + { + "zip_code": 62601, + "latitude": 39.751657, + "longitude": -90.045839, + "city": "Alexander", + "state": "IL", + "county": "Morgan" + }, + { + "zip_code": 62610, + "latitude": 39.551987, + "longitude": -90.386156, + "city": "Alsey", + "state": "IL", + "county": "Scott" + }, + { + "zip_code": 62611, + "latitude": 39.913938, + "longitude": -90.370736, + "city": "Arenzville", + "state": "IL", + "county": "Cass" + }, + { + "zip_code": 62612, + "latitude": 39.938647, + "longitude": -90.079241, + "city": "Ashland", + "state": "IL", + "county": "Cass" + }, + { + "zip_code": 62613, + "latitude": 39.950205, + "longitude": -89.683294, + "city": "Athens", + "state": "IL", + "county": "Menard" + }, + { + "zip_code": 62615, + "latitude": 39.588654, + "longitude": -89.749692, + "city": "Auburn", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62617, + "latitude": 40.153626, + "longitude": -90.166065, + "city": "Bath", + "state": "IL", + "county": "Mason" + }, + { + "zip_code": 62618, + "latitude": 39.962623, + "longitude": -90.265277, + "city": "Beardstown", + "state": "IL", + "county": "Cass" + }, + { + "zip_code": 62621, + "latitude": 39.729634, + "longitude": -90.531307, + "city": "Bluffs", + "state": "IL", + "county": "Scott" + }, + { + "zip_code": 62622, + "latitude": 39.979614, + "longitude": -90.352444, + "city": "Bluff Springs", + "state": "IL", + "county": "Cass" + }, + { + "zip_code": 62624, + "latitude": 40.131603, + "longitude": -90.556586, + "city": "Browning", + "state": "IL", + "county": "Schuyler" + }, + { + "zip_code": 62625, + "latitude": 39.916942, + "longitude": -89.689148, + "city": "Cantrall", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62626, + "latitude": 39.288546, + "longitude": -89.866054, + "city": "Carlinville", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62627, + "latitude": 40.037402, + "longitude": -90.116282, + "city": "Chandlerville", + "state": "IL", + "county": "Cass" + }, + { + "zip_code": 62628, + "latitude": 39.80547, + "longitude": -90.375324, + "city": "Chapin", + "state": "IL", + "county": "Morgan" + }, + { + "zip_code": 62629, + "latitude": 39.793982, + "longitude": -89.695888, + "city": "Chatham", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62630, + "latitude": 39.337165, + "longitude": -90.070475, + "city": "Chesterfield", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62631, + "latitude": 39.825847, + "longitude": -90.37469, + "city": "Concord", + "state": "IL", + "county": "Morgan" + }, + { + "zip_code": 62633, + "latitude": 40.227887, + "longitude": -89.890271, + "city": "Easton", + "state": "IL", + "county": "Mason" + }, + { + "zip_code": 62634, + "latitude": 40.109099, + "longitude": -89.471352, + "city": "Elkhart", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 62635, + "latitude": 40.195101, + "longitude": -89.483718, + "city": "Emden", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 62638, + "latitude": 39.622203, + "longitude": -90.088945, + "city": "Franklin", + "state": "IL", + "county": "Morgan" + }, + { + "zip_code": 62639, + "latitude": 40.131603, + "longitude": -90.556586, + "city": "Frederick", + "state": "IL", + "county": "Schuyler" + }, + { + "zip_code": 62640, + "latitude": 39.383843, + "longitude": -89.85006, + "city": "Girard", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62642, + "latitude": 40.101722, + "longitude": -89.746851, + "city": "Greenview", + "state": "IL", + "county": "Menard" + }, + { + "zip_code": 62643, + "latitude": 40.251211, + "longitude": -89.47409, + "city": "Hartsburg", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 62644, + "latitude": 40.308441, + "longitude": -89.938334, + "city": "Havana", + "state": "IL", + "county": "Mason" + }, + { + "zip_code": 62649, + "latitude": 39.34792, + "longitude": -90.071437, + "city": "Hettick", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62650, + "latitude": 39.737044, + "longitude": -90.301388, + "city": "Jacksonville", + "state": "IL", + "county": "Morgan" + }, + { + "zip_code": 62651, + "latitude": 39.698311, + "longitude": -90.26153, + "city": "Jacksonville", + "state": "IL", + "county": "Morgan" + }, + { + "zip_code": 62655, + "latitude": 40.214332, + "longitude": -89.855105, + "city": "Kilbourne", + "state": "IL", + "county": "Mason" + }, + { + "zip_code": 62656, + "latitude": 40.162779, + "longitude": -89.398361, + "city": "Lincoln", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 62659, + "latitude": 40.031115, + "longitude": -89.786723, + "city": "Lincoln's New Salem", + "state": "IL", + "county": "Menard" + }, + { + "zip_code": 62660, + "latitude": 39.858933, + "longitude": -90.200747, + "city": "Literberry", + "state": "IL", + "county": "Morgan" + }, + { + "zip_code": 62661, + "latitude": 39.671039, + "longitude": -89.845401, + "city": "Loami", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62662, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Lowder", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62663, + "latitude": 39.540479, + "longitude": -90.331705, + "city": "Manchester", + "state": "IL", + "county": "Scott" + }, + { + "zip_code": 62664, + "latitude": 40.226923, + "longitude": -89.731758, + "city": "Mason City", + "state": "IL", + "county": "Mason" + }, + { + "zip_code": 62665, + "latitude": 39.724007, + "longitude": -90.426529, + "city": "Meredosia", + "state": "IL", + "county": "Morgan" + }, + { + "zip_code": 62666, + "latitude": 40.085044, + "longitude": -89.522027, + "city": "Middletown", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 62667, + "latitude": 39.480647, + "longitude": -89.982149, + "city": "Modesto", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62668, + "latitude": 39.675739, + "longitude": -90.323925, + "city": "Murrayville", + "state": "IL", + "county": "Morgan" + }, + { + "zip_code": 62670, + "latitude": 39.768067, + "longitude": -89.854952, + "city": "New Berlin", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62671, + "latitude": 40.16912, + "longitude": -89.542183, + "city": "New Holland", + "state": "IL", + "county": "Logan" + }, + { + "zip_code": 62672, + "latitude": 39.397082, + "longitude": -89.89125, + "city": "Nilwood", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62673, + "latitude": 40.100737, + "longitude": -89.966028, + "city": "Oakford", + "state": "IL", + "county": "Menard" + }, + { + "zip_code": 62674, + "latitude": 39.422719, + "longitude": -90.031093, + "city": "Palmyra", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62675, + "latitude": 39.972828, + "longitude": -89.807192, + "city": "Petersburg", + "state": "IL", + "county": "Menard" + }, + { + "zip_code": 62677, + "latitude": 39.83314, + "longitude": -89.868578, + "city": "Pleasant Plains", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62681, + "latitude": 40.113259, + "longitude": -90.543205, + "city": "Rushville", + "state": "IL", + "county": "Schuyler" + }, + { + "zip_code": 62682, + "latitude": 40.301103, + "longitude": -89.687211, + "city": "San Jose", + "state": "IL", + "county": "Mason" + }, + { + "zip_code": 62683, + "latitude": 39.260862, + "longitude": -89.926068, + "city": "Scottville", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62684, + "latitude": 39.912115, + "longitude": -89.587697, + "city": "Sherman", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62685, + "latitude": 39.195161, + "longitude": -89.960661, + "city": "Shipman", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62686, + "latitude": 39.23868, + "longitude": -89.889363, + "city": "Standard City", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62688, + "latitude": 39.938136, + "longitude": -89.943256, + "city": "Tallula", + "state": "IL", + "county": "Menard" + }, + { + "zip_code": 62689, + "latitude": 39.539389, + "longitude": -89.762086, + "city": "Thayer", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62690, + "latitude": 39.480838, + "longitude": -89.903356, + "city": "Virden", + "state": "IL", + "county": "Macoupin" + }, + { + "zip_code": 62691, + "latitude": 39.958003, + "longitude": -90.176415, + "city": "Virginia", + "state": "IL", + "county": "Cass" + }, + { + "zip_code": 62692, + "latitude": 39.622723, + "longitude": -90.003569, + "city": "Waverly", + "state": "IL", + "county": "Morgan" + }, + { + "zip_code": 62693, + "latitude": 39.920091, + "longitude": -89.570001, + "city": "Williamsville", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62694, + "latitude": 39.62663, + "longitude": -90.466389, + "city": "Winchester", + "state": "IL", + "county": "Scott" + }, + { + "zip_code": 62695, + "latitude": 39.618903, + "longitude": -90.225738, + "city": "Woodson", + "state": "IL", + "county": "Morgan" + }, + { + "zip_code": 62701, + "latitude": 39.820839, + "longitude": -89.598978, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62702, + "latitude": 39.831699, + "longitude": -89.646507, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62703, + "latitude": 39.762206, + "longitude": -89.627547, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62704, + "latitude": 39.772463, + "longitude": -89.688924, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62705, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62706, + "latitude": 39.79885, + "longitude": -89.653399, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62707, + "latitude": 39.785116, + "longitude": -89.632205, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62708, + "latitude": 39.806089, + "longitude": -89.586356, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62709, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62713, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62715, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62716, + "latitude": 39.848201, + "longitude": -89.536369, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62718, + "latitude": 39.778044, + "longitude": -89.646555, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62719, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62720, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62721, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62722, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62723, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62726, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62736, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62739, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62746, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62756, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62757, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62761, + "latitude": 39.852361, + "longitude": -89.541017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62762, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62763, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62764, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62765, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62766, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62767, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62769, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62776, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62777, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62781, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62786, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62791, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62794, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62796, + "latitude": 39.749457, + "longitude": -89.606017, + "city": "Springfield", + "state": "IL", + "county": "Sangamon" + }, + { + "zip_code": 62801, + "latitude": 38.63831, + "longitude": -88.957758, + "city": "Centralia", + "state": "IL", + "county": "Marion" + }, + { + "zip_code": 62803, + "latitude": 38.371071, + "longitude": -89.300072, + "city": "Hoyleton", + "state": "IL", + "county": "Washington" + }, + { + "zip_code": 62805, + "latitude": 37.994296, + "longitude": -88.941665, + "city": "Akin", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62806, + "latitude": 38.328816, + "longitude": -88.064182, + "city": "Albion", + "state": "IL", + "county": "Edwards" + }, + { + "zip_code": 62807, + "latitude": 38.758394, + "longitude": -88.929039, + "city": "Alma", + "state": "IL", + "county": "Marion" + }, + { + "zip_code": 62808, + "latitude": 38.290049, + "longitude": -89.232163, + "city": "Ashley", + "state": "IL", + "county": "Washington" + }, + { + "zip_code": 62809, + "latitude": 38.431273, + "longitude": -88.424978, + "city": "Barnhill", + "state": "IL", + "county": "Wayne" + }, + { + "zip_code": 62810, + "latitude": 38.202361, + "longitude": -88.774226, + "city": "Belle Rive", + "state": "IL", + "county": "Jefferson" + }, + { + "zip_code": 62811, + "latitude": 38.384525, + "longitude": -87.908101, + "city": "Bellmont", + "state": "IL", + "county": "Wabash" + }, + { + "zip_code": 62812, + "latitude": 37.994423, + "longitude": -88.907464, + "city": "Benton", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62814, + "latitude": 38.384549, + "longitude": -88.746322, + "city": "Bluford", + "state": "IL", + "county": "Jefferson" + }, + { + "zip_code": 62815, + "latitude": 38.413149, + "longitude": -88.043941, + "city": "Bone Gap", + "state": "IL", + "county": "Edwards" + }, + { + "zip_code": 62816, + "latitude": 38.20359, + "longitude": -88.936697, + "city": "Bonnie", + "state": "IL", + "county": "Jefferson" + }, + { + "zip_code": 62817, + "latitude": 37.921925, + "longitude": -88.468436, + "city": "Broughton", + "state": "IL", + "county": "Hamilton" + }, + { + "zip_code": 62818, + "latitude": 38.413149, + "longitude": -88.043941, + "city": "Browns", + "state": "IL", + "county": "Edwards" + }, + { + "zip_code": 62819, + "latitude": 37.976448, + "longitude": -89.020912, + "city": "Buckner", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62820, + "latitude": 38.220716, + "longitude": -88.222704, + "city": "Burnt Prairie", + "state": "IL", + "county": "White" + }, + { + "zip_code": 62821, + "latitude": 38.089387, + "longitude": -88.175742, + "city": "Carmi", + "state": "IL", + "county": "White" + }, + { + "zip_code": 62822, + "latitude": 38.028648, + "longitude": -89.07209, + "city": "Christopher", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62823, + "latitude": 38.431273, + "longitude": -88.424978, + "city": "Cisne", + "state": "IL", + "county": "Wayne" + }, + { + "zip_code": 62824, + "latitude": 38.725325, + "longitude": -88.417422, + "city": "Clay City", + "state": "IL", + "county": "Clay" + }, + { + "zip_code": 62825, + "latitude": 37.994633, + "longitude": -89.067228, + "city": "Coello", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62827, + "latitude": 38.163144, + "longitude": -88.03546, + "city": "Crossville", + "state": "IL", + "county": "White" + }, + { + "zip_code": 62828, + "latitude": 38.168641, + "longitude": -88.629728, + "city": "Dahlgren", + "state": "IL", + "county": "Hamilton" + }, + { + "zip_code": 62829, + "latitude": 38.081592, + "longitude": -88.538609, + "city": "Dale", + "state": "IL", + "county": "Hamilton" + }, + { + "zip_code": 62830, + "latitude": 38.357503, + "longitude": -88.910561, + "city": "Dix", + "state": "IL", + "county": "Jefferson" + }, + { + "zip_code": 62831, + "latitude": 38.249974, + "longitude": -89.230396, + "city": "Du Bois", + "state": "IL", + "county": "Washington" + }, + { + "zip_code": 62832, + "latitude": 38.044645, + "longitude": -89.253006, + "city": "Du Quoin", + "state": "IL", + "county": "Perry" + }, + { + "zip_code": 62833, + "latitude": 38.413149, + "longitude": -88.043941, + "city": "Ellery", + "state": "IL", + "county": "Edwards" + }, + { + "zip_code": 62834, + "latitude": 37.97622, + "longitude": -88.120182, + "city": "Emma", + "state": "IL", + "county": "White" + }, + { + "zip_code": 62835, + "latitude": 38.100523, + "longitude": -88.29927, + "city": "Enfield", + "state": "IL", + "county": "White" + }, + { + "zip_code": 62836, + "latitude": 38.082002, + "longitude": -88.790486, + "city": "Ewing", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62837, + "latitude": 38.389091, + "longitude": -88.367146, + "city": "Fairfield", + "state": "IL", + "county": "Wayne" + }, + { + "zip_code": 62838, + "latitude": 38.832201, + "longitude": -88.776244, + "city": "Farina", + "state": "IL", + "county": "Fayette" + }, + { + "zip_code": 62839, + "latitude": 38.710797, + "longitude": -88.493686, + "city": "Flora", + "state": "IL", + "county": "Clay" + }, + { + "zip_code": 62840, + "latitude": 37.994296, + "longitude": -88.941665, + "city": "Frankfort Heights", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62841, + "latitude": 37.80308, + "longitude": -89.009201, + "city": "Freeman Spur", + "state": "IL", + "county": "Williamson" + }, + { + "zip_code": 62842, + "latitude": 38.441055, + "longitude": -88.409905, + "city": "Geff", + "state": "IL", + "county": "Wayne" + }, + { + "zip_code": 62843, + "latitude": 38.357551, + "longitude": -88.206145, + "city": "Golden Gate", + "state": "IL", + "county": "Wayne" + }, + { + "zip_code": 62844, + "latitude": 38.147618, + "longitude": -88.122963, + "city": "Grayville", + "state": "IL", + "county": "White" + }, + { + "zip_code": 62845, + "latitude": 38.073931, + "longitude": -88.142657, + "city": "Herald", + "state": "IL", + "county": "White" + }, + { + "zip_code": 62846, + "latitude": 38.155485, + "longitude": -88.819501, + "city": "Ina", + "state": "IL", + "county": "Jefferson" + }, + { + "zip_code": 62847, + "latitude": 38.757302, + "longitude": -88.473594, + "city": "Iola", + "state": "IL", + "county": "Clay" + }, + { + "zip_code": 62848, + "latitude": 38.413658, + "longitude": -89.167834, + "city": "Irvington", + "state": "IL", + "county": "Washington" + }, + { + "zip_code": 62849, + "latitude": 38.595441, + "longitude": -88.809517, + "city": "Iuka", + "state": "IL", + "county": "Marion" + }, + { + "zip_code": 62850, + "latitude": 38.519401, + "longitude": -88.536564, + "city": "Johnsonville", + "state": "IL", + "county": "Wayne" + }, + { + "zip_code": 62851, + "latitude": 38.431273, + "longitude": -88.424978, + "city": "Keenes", + "state": "IL", + "county": "Wayne" + }, + { + "zip_code": 62852, + "latitude": 38.351408, + "longitude": -87.86607, + "city": "Keensburg", + "state": "IL", + "county": "Wabash" + }, + { + "zip_code": 62853, + "latitude": 38.59718, + "longitude": -88.901043, + "city": "Kell", + "state": "IL", + "county": "Marion" + }, + { + "zip_code": 62854, + "latitude": 38.657892, + "longitude": -88.91335, + "city": "Kinmundy", + "state": "IL", + "county": "Marion" + }, + { + "zip_code": 62855, + "latitude": 38.403424, + "longitude": -87.818672, + "city": "Lancaster", + "state": "IL", + "county": "Wabash" + }, + { + "zip_code": 62856, + "latitude": 37.994296, + "longitude": -88.941665, + "city": "Logan", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62857, + "latitude": 38.977111, + "longitude": -88.975507, + "city": "Loogootee", + "state": "IL", + "county": "Fayette" + }, + { + "zip_code": 62858, + "latitude": 38.771768, + "longitude": -88.506465, + "city": "Louisville", + "state": "IL", + "county": "Clay" + }, + { + "zip_code": 62859, + "latitude": 38.08963, + "longitude": -88.53653, + "city": "Mc Leansboro", + "state": "IL", + "county": "Hamilton" + }, + { + "zip_code": 62860, + "latitude": 38.081592, + "longitude": -88.538609, + "city": "Macedonia", + "state": "IL", + "county": "Hamilton" + }, + { + "zip_code": 62861, + "latitude": 38.036393, + "longitude": -88.075864, + "city": "Maunie", + "state": "IL", + "county": "White" + }, + { + "zip_code": 62862, + "latitude": 38.164114, + "longitude": -88.258325, + "city": "Mill Shoals", + "state": "IL", + "county": "White" + }, + { + "zip_code": 62863, + "latitude": 38.441814, + "longitude": -87.828423, + "city": "Mount Carmel", + "state": "IL", + "county": "Wabash" + }, + { + "zip_code": 62864, + "latitude": 38.293269, + "longitude": -88.892273, + "city": "Mount Vernon", + "state": "IL", + "county": "Jefferson" + }, + { + "zip_code": 62865, + "latitude": 37.97746, + "longitude": -89.081507, + "city": "Mulkeytown", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62866, + "latitude": 38.16542, + "longitude": -88.967551, + "city": "Nason", + "state": "IL", + "county": "Jefferson" + }, + { + "zip_code": 62867, + "latitude": 37.887676, + "longitude": -88.146409, + "city": "New Haven", + "state": "IL", + "county": "Gallatin" + }, + { + "zip_code": 62868, + "latitude": 38.715532, + "longitude": -88.225831, + "city": "Noble", + "state": "IL", + "county": "Richland" + }, + { + "zip_code": 62869, + "latitude": 38.076688, + "longitude": -88.211579, + "city": "Norris City", + "state": "IL", + "county": "White" + }, + { + "zip_code": 62870, + "latitude": 38.636324, + "longitude": -88.946253, + "city": "Odin", + "state": "IL", + "county": "Marion" + }, + { + "zip_code": 62871, + "latitude": 37.845963, + "longitude": -88.240226, + "city": "Omaha", + "state": "IL", + "county": "Gallatin" + }, + { + "zip_code": 62872, + "latitude": 38.273854, + "longitude": -88.805414, + "city": "Opdyke", + "state": "IL", + "county": "Jefferson" + }, + { + "zip_code": 62874, + "latitude": 37.91819, + "longitude": -88.976706, + "city": "Orient", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62875, + "latitude": 38.701337, + "longitude": -88.962515, + "city": "Patoka", + "state": "IL", + "county": "Marion" + }, + { + "zip_code": 62876, + "latitude": 38.260696, + "longitude": -89.198858, + "city": "Radom", + "state": "IL", + "county": "Washington" + }, + { + "zip_code": 62877, + "latitude": 38.394883, + "longitude": -89.224511, + "city": "Richview", + "state": "IL", + "county": "Washington" + }, + { + "zip_code": 62878, + "latitude": 38.431273, + "longitude": -88.424978, + "city": "Rinard", + "state": "IL", + "county": "Wayne" + }, + { + "zip_code": 62879, + "latitude": 38.757302, + "longitude": -88.473594, + "city": "Sailor Springs", + "state": "IL", + "county": "Clay" + }, + { + "zip_code": 62880, + "latitude": 38.867965, + "longitude": -88.852749, + "city": "Saint Peter", + "state": "IL", + "county": "Fayette" + }, + { + "zip_code": 62881, + "latitude": 38.643793, + "longitude": -88.974839, + "city": "Salem", + "state": "IL", + "county": "Marion" + }, + { + "zip_code": 62882, + "latitude": 38.597, + "longitude": -88.968203, + "city": "Sandoval", + "state": "IL", + "county": "Marion" + }, + { + "zip_code": 62883, + "latitude": 38.176165, + "longitude": -89.094644, + "city": "Scheller", + "state": "IL", + "county": "Jefferson" + }, + { + "zip_code": 62884, + "latitude": 38.053351, + "longitude": -89.056638, + "city": "Sesser", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62885, + "latitude": 38.977111, + "longitude": -88.975507, + "city": "Shobonier", + "state": "IL", + "county": "Fayette" + }, + { + "zip_code": 62886, + "latitude": 38.362874, + "longitude": -88.533608, + "city": "Sims", + "state": "IL", + "county": "Wayne" + }, + { + "zip_code": 62887, + "latitude": 38.15015, + "longitude": -88.216053, + "city": "Springerton", + "state": "IL", + "county": "White" + }, + { + "zip_code": 62888, + "latitude": 38.133323, + "longitude": -89.217309, + "city": "Tamaroa", + "state": "IL", + "county": "Perry" + }, + { + "zip_code": 62889, + "latitude": 38.44683, + "longitude": -88.826247, + "city": "Texico", + "state": "IL", + "county": "Jefferson" + }, + { + "zip_code": 62890, + "latitude": 37.936421, + "longitude": -88.770913, + "city": "Thompsonville", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62891, + "latitude": 38.022241, + "longitude": -89.035053, + "city": "Valier", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62892, + "latitude": 38.787524, + "longitude": -89.040989, + "city": "Vernon", + "state": "IL", + "county": "Marion" + }, + { + "zip_code": 62893, + "latitude": 38.547927, + "longitude": -88.929247, + "city": "Walnut Hill", + "state": "IL", + "county": "Marion" + }, + { + "zip_code": 62894, + "latitude": 38.212153, + "longitude": -89.043552, + "city": "Waltonville", + "state": "IL", + "county": "Jefferson" + }, + { + "zip_code": 62895, + "latitude": 38.350936, + "longitude": -88.566951, + "city": "Wayne City", + "state": "IL", + "county": "Wayne" + }, + { + "zip_code": 62896, + "latitude": 37.976856, + "longitude": -88.910164, + "city": "West Frankfort", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62897, + "latitude": 38.087223, + "longitude": -88.901443, + "city": "Whittington", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62898, + "latitude": 38.314373, + "longitude": -89.050259, + "city": "Woodlawn", + "state": "IL", + "county": "Jefferson" + }, + { + "zip_code": 62899, + "latitude": 38.710776, + "longitude": -88.664186, + "city": "Xenia", + "state": "IL", + "county": "Clay" + }, + { + "zip_code": 62901, + "latitude": 37.77452, + "longitude": -89.387286, + "city": "Carbondale", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62902, + "latitude": 37.758646, + "longitude": -89.415831, + "city": "Carbondale", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62903, + "latitude": 37.758646, + "longitude": -89.415831, + "city": "Carbondale", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62905, + "latitude": 37.546479, + "longitude": -89.357896, + "city": "Alto Pass", + "state": "IL", + "county": "Union" + }, + { + "zip_code": 62906, + "latitude": 37.474268, + "longitude": -89.163042, + "city": "Anna", + "state": "IL", + "county": "Union" + }, + { + "zip_code": 62907, + "latitude": 37.832038, + "longitude": -89.43068, + "city": "Ava", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62908, + "latitude": 37.335571, + "longitude": -88.909205, + "city": "Belknap", + "state": "IL", + "county": "Johnson" + }, + { + "zip_code": 62909, + "latitude": 37.44725, + "longitude": -88.876792, + "city": "Boles", + "state": "IL", + "county": "Johnson" + }, + { + "zip_code": 62910, + "latitude": 37.212897, + "longitude": -88.605104, + "city": "Brookport", + "state": "IL", + "county": "Massac" + }, + { + "zip_code": 62912, + "latitude": 37.467463, + "longitude": -89.000586, + "city": "Buncombe", + "state": "IL", + "county": "Johnson" + }, + { + "zip_code": 62913, + "latitude": 37.152775, + "longitude": -89.325581, + "city": "Cache", + "state": "IL", + "county": "Alexander" + }, + { + "zip_code": 62914, + "latitude": 37.028797, + "longitude": -89.192754, + "city": "Cairo", + "state": "IL", + "county": "Alexander" + }, + { + "zip_code": 62915, + "latitude": 37.784657, + "longitude": -89.118111, + "city": "Cambria", + "state": "IL", + "county": "Williamson" + }, + { + "zip_code": 62916, + "latitude": 37.883589, + "longitude": -89.557933, + "city": "Campbell Hill", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62917, + "latitude": 37.680285, + "longitude": -88.619902, + "city": "Carrier Mills", + "state": "IL", + "county": "Saline" + }, + { + "zip_code": 62918, + "latitude": 37.730777, + "longitude": -88.931157, + "city": "Carterville", + "state": "IL", + "county": "Williamson" + }, + { + "zip_code": 62919, + "latitude": 37.500757, + "longitude": -88.238292, + "city": "Cave In Rock", + "state": "IL", + "county": "Hardin" + }, + { + "zip_code": 62920, + "latitude": 37.526817, + "longitude": -89.219012, + "city": "Cobden", + "state": "IL", + "county": "Union" + }, + { + "zip_code": 62921, + "latitude": 37.805677, + "longitude": -89.075999, + "city": "Colp", + "state": "IL", + "county": "Williamson" + }, + { + "zip_code": 62922, + "latitude": 37.682, + "longitude": -88.817787, + "city": "Creal Springs", + "state": "IL", + "county": "Williamson" + }, + { + "zip_code": 62923, + "latitude": 37.365007, + "longitude": -88.974743, + "city": "Cypress", + "state": "IL", + "county": "Johnson" + }, + { + "zip_code": 62924, + "latitude": 37.837009, + "longitude": -89.350508, + "city": "De Soto", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62926, + "latitude": 37.42204, + "longitude": -89.225572, + "city": "Dongola", + "state": "IL", + "county": "Union" + }, + { + "zip_code": 62927, + "latitude": 37.939205, + "longitude": -89.231786, + "city": "Dowell", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62928, + "latitude": 37.333591, + "longitude": -88.561428, + "city": "Eddyville", + "state": "IL", + "county": "Pope" + }, + { + "zip_code": 62930, + "latitude": 37.810121, + "longitude": -88.452662, + "city": "Eldorado", + "state": "IL", + "county": "Saline" + }, + { + "zip_code": 62931, + "latitude": 37.500757, + "longitude": -88.238292, + "city": "Elizabethtown", + "state": "IL", + "county": "Hardin" + }, + { + "zip_code": 62932, + "latitude": 37.894281, + "longitude": -89.217138, + "city": "Elkville", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62933, + "latitude": 37.77783, + "longitude": -89.063381, + "city": "Energy", + "state": "IL", + "county": "Williamson" + }, + { + "zip_code": 62934, + "latitude": 37.706289, + "longitude": -88.330839, + "city": "Equality", + "state": "IL", + "county": "Gallatin" + }, + { + "zip_code": 62935, + "latitude": 37.823001, + "longitude": -88.596123, + "city": "Galatia", + "state": "IL", + "county": "Saline" + }, + { + "zip_code": 62938, + "latitude": 37.360193, + "longitude": -88.488571, + "city": "Golconda", + "state": "IL", + "county": "Pope" + }, + { + "zip_code": 62939, + "latitude": 37.534099, + "longitude": -88.971292, + "city": "Goreville", + "state": "IL", + "county": "Johnson" + }, + { + "zip_code": 62940, + "latitude": 37.736732, + "longitude": -89.469534, + "city": "Gorham", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62941, + "latitude": 37.240291, + "longitude": -88.995404, + "city": "Grand Chain", + "state": "IL", + "county": "Pulaski" + }, + { + "zip_code": 62942, + "latitude": 37.634633, + "longitude": -89.479836, + "city": "Grand Tower", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62943, + "latitude": 37.379384, + "longitude": -88.758329, + "city": "Grantsburg", + "state": "IL", + "county": "Johnson" + }, + { + "zip_code": 62944, + "latitude": 37.333591, + "longitude": -88.561428, + "city": "Hamletsburg", + "state": "IL", + "county": "Pope" + }, + { + "zip_code": 62946, + "latitude": 37.720129, + "longitude": -88.536736, + "city": "Harrisburg", + "state": "IL", + "county": "Saline" + }, + { + "zip_code": 62947, + "latitude": 37.333591, + "longitude": -88.561428, + "city": "Herod", + "state": "IL", + "county": "Pope" + }, + { + "zip_code": 62948, + "latitude": 37.740444, + "longitude": -88.992312, + "city": "Herrin", + "state": "IL", + "county": "Williamson" + }, + { + "zip_code": 62949, + "latitude": 37.836584, + "longitude": -89.142415, + "city": "Hurst", + "state": "IL", + "county": "Williamson" + }, + { + "zip_code": 62950, + "latitude": 37.764248, + "longitude": -89.584575, + "city": "Jacob", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62951, + "latitude": 37.802518, + "longitude": -88.961656, + "city": "Johnston City", + "state": "IL", + "county": "Williamson" + }, + { + "zip_code": 62952, + "latitude": 37.422793, + "longitude": -89.266574, + "city": "Jonesboro", + "state": "IL", + "county": "Union" + }, + { + "zip_code": 62953, + "latitude": 37.209231, + "longitude": -88.844181, + "city": "Joppa", + "state": "IL", + "county": "Massac" + }, + { + "zip_code": 62954, + "latitude": 37.695153, + "longitude": -88.260046, + "city": "Junction", + "state": "IL", + "county": "Gallatin" + }, + { + "zip_code": 62955, + "latitude": 37.500757, + "longitude": -88.238292, + "city": "Karbers Ridge", + "state": "IL", + "county": "Hardin" + }, + { + "zip_code": 62956, + "latitude": 37.262019, + "longitude": -89.005155, + "city": "Karnak", + "state": "IL", + "county": "Pulaski" + }, + { + "zip_code": 62957, + "latitude": 37.295842, + "longitude": -89.46653, + "city": "Mc Clure", + "state": "IL", + "county": "Alexander" + }, + { + "zip_code": 62958, + "latitude": 37.687072, + "longitude": -89.250933, + "city": "Makanda", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62959, + "latitude": 37.729571, + "longitude": -88.912852, + "city": "Marion", + "state": "IL", + "county": "Williamson" + }, + { + "zip_code": 62960, + "latitude": 37.228995, + "longitude": -88.714524, + "city": "Metropolis", + "state": "IL", + "county": "Massac" + }, + { + "zip_code": 62961, + "latitude": 37.340918, + "longitude": -89.254203, + "city": "Millcreek", + "state": "IL", + "county": "Union" + }, + { + "zip_code": 62962, + "latitude": 37.152775, + "longitude": -89.325581, + "city": "Miller City", + "state": "IL", + "county": "Alexander" + }, + { + "zip_code": 62963, + "latitude": 37.178242, + "longitude": -89.179333, + "city": "Mound City", + "state": "IL", + "county": "Pulaski" + }, + { + "zip_code": 62964, + "latitude": 37.198411, + "longitude": -89.124001, + "city": "Mounds", + "state": "IL", + "county": "Pulaski" + }, + { + "zip_code": 62965, + "latitude": 37.801972, + "longitude": -88.548695, + "city": "Muddy", + "state": "IL", + "county": "Saline" + }, + { + "zip_code": 62966, + "latitude": 37.782223, + "longitude": -89.396839, + "city": "Murphysboro", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62967, + "latitude": 37.577998, + "longitude": -88.745405, + "city": "New Burnside", + "state": "IL", + "county": "Johnson" + }, + { + "zip_code": 62969, + "latitude": 37.167445, + "longitude": -89.353662, + "city": "Olive Branch", + "state": "IL", + "county": "Alexander" + }, + { + "zip_code": 62970, + "latitude": 37.210643, + "longitude": -89.104341, + "city": "Olmsted", + "state": "IL", + "county": "Pulaski" + }, + { + "zip_code": 62971, + "latitude": 37.758646, + "longitude": -89.415831, + "city": "Oraville", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62972, + "latitude": 37.54725, + "longitude": -88.770166, + "city": "Ozark", + "state": "IL", + "county": "Johnson" + }, + { + "zip_code": 62973, + "latitude": 37.311333, + "longitude": -89.083056, + "city": "Perks", + "state": "IL", + "county": "Pulaski" + }, + { + "zip_code": 62974, + "latitude": 37.804734, + "longitude": -88.808056, + "city": "Pittsburg", + "state": "IL", + "county": "Williamson" + }, + { + "zip_code": 62975, + "latitude": 37.650115, + "longitude": -89.369308, + "city": "Pomona", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62976, + "latitude": 37.212957, + "longitude": -89.136274, + "city": "Pulaski", + "state": "IL", + "county": "Pulaski" + }, + { + "zip_code": 62977, + "latitude": 37.822856, + "longitude": -88.549793, + "city": "Raleigh", + "state": "IL", + "county": "Saline" + }, + { + "zip_code": 62979, + "latitude": 37.796978, + "longitude": -88.243498, + "city": "Ridgway", + "state": "IL", + "county": "Gallatin" + }, + { + "zip_code": 62982, + "latitude": 37.417713, + "longitude": -88.354451, + "city": "Rosiclare", + "state": "IL", + "county": "Hardin" + }, + { + "zip_code": 62983, + "latitude": 37.910274, + "longitude": -89.100865, + "city": "Royalton", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 62984, + "latitude": 37.710189, + "longitude": -88.183169, + "city": "Shawneetown", + "state": "IL", + "county": "Gallatin" + }, + { + "zip_code": 62985, + "latitude": 37.451868, + "longitude": -88.801413, + "city": "Simpson", + "state": "IL", + "county": "Johnson" + }, + { + "zip_code": 62987, + "latitude": 37.643233, + "longitude": -88.622821, + "city": "Stonefort", + "state": "IL", + "county": "Saline" + }, + { + "zip_code": 62988, + "latitude": 37.239072, + "longitude": -89.269752, + "city": "Tamms", + "state": "IL", + "county": "Alexander" + }, + { + "zip_code": 62990, + "latitude": 37.221042, + "longitude": -89.459863, + "city": "Thebes", + "state": "IL", + "county": "Alexander" + }, + { + "zip_code": 62991, + "latitude": 37.503628, + "longitude": -88.847731, + "city": "Tunnel Hill", + "state": "IL", + "county": "Johnson" + }, + { + "zip_code": 62992, + "latitude": 37.28344, + "longitude": -89.13646, + "city": "Ullin", + "state": "IL", + "county": "Pulaski" + }, + { + "zip_code": 62993, + "latitude": 37.152775, + "longitude": -89.325581, + "city": "Unity", + "state": "IL", + "county": "Alexander" + }, + { + "zip_code": 62994, + "latitude": 37.907239, + "longitude": -89.410304, + "city": "Vergennes", + "state": "IL", + "county": "Jackson" + }, + { + "zip_code": 62995, + "latitude": 37.42417, + "longitude": -88.898049, + "city": "Vienna", + "state": "IL", + "county": "Johnson" + }, + { + "zip_code": 62996, + "latitude": 37.164229, + "longitude": -89.170924, + "city": "Villa Ridge", + "state": "IL", + "county": "Pulaski" + }, + { + "zip_code": 62997, + "latitude": 37.984776, + "longitude": -89.589862, + "city": "Willisville", + "state": "IL", + "county": "Perry" + }, + { + "zip_code": 62998, + "latitude": 37.509618, + "longitude": -89.424913, + "city": "Wolf Lake", + "state": "IL", + "county": "Union" + }, + { + "zip_code": 62999, + "latitude": 37.899054, + "longitude": -89.052317, + "city": "Zeigler", + "state": "IL", + "county": "Franklin" + }, + { + "zip_code": 63001, + "latitude": 38.638318, + "longitude": -90.427118, + "city": "Allenton", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63005, + "latitude": 38.637002, + "longitude": -90.650024, + "city": "Chesterfield", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63006, + "latitude": 38.638318, + "longitude": -90.427118, + "city": "Chesterfield", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63010, + "latitude": 38.341665, + "longitude": -90.410219, + "city": "Arnold", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63011, + "latitude": 38.609102, + "longitude": -90.559763, + "city": "Ballwin", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63012, + "latitude": 38.334232, + "longitude": -90.453027, + "city": "Barnhart", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63013, + "latitude": 38.416838, + "longitude": -91.142077, + "city": "Beaufort", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63014, + "latitude": 38.632726, + "longitude": -91.321404, + "city": "Berger", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63015, + "latitude": 38.404667, + "longitude": -90.780631, + "city": "Catawissa", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63016, + "latitude": 38.352262, + "longitude": -90.62569, + "city": "Cedar Hill", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63017, + "latitude": 38.649052, + "longitude": -90.535804, + "city": "Chesterfield", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63019, + "latitude": 38.225684, + "longitude": -90.384036, + "city": "Crystal City", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63020, + "latitude": 38.139054, + "longitude": -90.559045, + "city": "De Soto", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63021, + "latitude": 38.566653, + "longitude": -90.535646, + "city": "Ballwin", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63022, + "latitude": 38.638318, + "longitude": -90.427118, + "city": "Ballwin", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63023, + "latitude": 38.26891, + "longitude": -90.705561, + "city": "Dittmer", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63024, + "latitude": 38.638318, + "longitude": -90.427118, + "city": "Ballwin", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63025, + "latitude": 38.512803, + "longitude": -90.630576, + "city": "Eureka", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63026, + "latitude": 38.529903, + "longitude": -90.46737, + "city": "Fenton", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63028, + "latitude": 38.270941, + "longitude": -90.413534, + "city": "Festus", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63030, + "latitude": 38.170261, + "longitude": -90.718536, + "city": "Fletcher", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63031, + "latitude": 38.805499, + "longitude": -90.351314, + "city": "Florissant", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63032, + "latitude": 38.638318, + "longitude": -90.427118, + "city": "Florissant", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63033, + "latitude": 38.796049, + "longitude": -90.274512, + "city": "Florissant", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63034, + "latitude": 38.838382, + "longitude": -90.284174, + "city": "Florissant", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63036, + "latitude": 37.89192, + "longitude": -90.38, + "city": "French Village", + "state": "MO", + "county": "Saint Francois" + }, + { + "zip_code": 63037, + "latitude": 38.417801, + "longitude": -91.313644, + "city": "Gerald", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63038, + "latitude": 38.587752, + "longitude": -90.663876, + "city": "Glencoe", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63039, + "latitude": 38.474458, + "longitude": -90.824377, + "city": "Gray Summit", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63040, + "latitude": 38.566718, + "longitude": -90.630975, + "city": "Grover", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63041, + "latitude": 38.283477, + "longitude": -90.761238, + "city": "Grubville", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63042, + "latitude": 38.7844, + "longitude": -90.399166, + "city": "Hazelwood", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63043, + "latitude": 38.723951, + "longitude": -90.447418, + "city": "Maryland Heights", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63044, + "latitude": 38.7514, + "longitude": -90.411542, + "city": "Bridgeton", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63045, + "latitude": 38.638318, + "longitude": -90.427118, + "city": "Earth City", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63047, + "latitude": 38.194104, + "longitude": -90.472495, + "city": "Hematite", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63048, + "latitude": 38.262482, + "longitude": -90.38961, + "city": "Herculaneum", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63049, + "latitude": 38.456203, + "longitude": -90.551323, + "city": "High Ridge", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63050, + "latitude": 38.308596, + "longitude": -90.524641, + "city": "Hillsboro", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63051, + "latitude": 38.250874, + "longitude": -90.603575, + "city": "House Springs", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63052, + "latitude": 38.406865, + "longitude": -90.438051, + "city": "Imperial", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63053, + "latitude": 38.252726, + "longitude": -90.514875, + "city": "Kimmswick", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63055, + "latitude": 38.483372, + "longitude": -91.006293, + "city": "Labadie", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63056, + "latitude": 38.455547, + "longitude": -91.232805, + "city": "Leslie", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63057, + "latitude": 38.341918, + "longitude": -90.408223, + "city": "Liguori", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63060, + "latitude": 38.274313, + "longitude": -90.890278, + "city": "Lonedell", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63061, + "latitude": 38.263227, + "longitude": -90.831198, + "city": "Luebbering", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63065, + "latitude": 38.252726, + "longitude": -90.514875, + "city": "Mapaville", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63066, + "latitude": 38.280943, + "longitude": -90.652057, + "city": "Morse Mill", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63068, + "latitude": 38.558487, + "longitude": -91.247283, + "city": "New Haven", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63069, + "latitude": 38.504462, + "longitude": -90.788981, + "city": "Pacific", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63070, + "latitude": 38.293157, + "longitude": -90.429283, + "city": "Pevely", + "state": "MO", + "county": "Jefferson" + }, + { + "zip_code": 63071, + "latitude": 38.062194, + "longitude": -90.809893, + "city": "Richwoods", + "state": "MO", + "county": "Washington" + }, + { + "zip_code": 63072, + "latitude": 38.353892, + "longitude": -90.931777, + "city": "Robertsville", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63073, + "latitude": 38.527729, + "longitude": -91.017274, + "city": "Saint Albans", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63074, + "latitude": 38.724651, + "longitude": -90.389516, + "city": "Saint Ann", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63077, + "latitude": 38.363431, + "longitude": -90.968672, + "city": "Saint Clair", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63079, + "latitude": 38.274398, + "longitude": -91.085533, + "city": "Stanton", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63080, + "latitude": 38.349197, + "longitude": -91.091755, + "city": "Sullivan", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63084, + "latitude": 38.36198, + "longitude": -90.96706, + "city": "Union", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63087, + "latitude": 37.999797, + "longitude": -90.440701, + "city": "Valles Mines", + "state": "MO", + "county": "Saint Francois" + }, + { + "zip_code": 63088, + "latitude": 38.553203, + "longitude": -90.488896, + "city": "Valley Park", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63089, + "latitude": 38.453668, + "longitude": -90.889121, + "city": "Villa Ridge", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63090, + "latitude": 38.523478, + "longitude": -91.023546, + "city": "Washington", + "state": "MO", + "county": "Franklin" + }, + { + "zip_code": 63091, + "latitude": 38.395272, + "longitude": -91.406851, + "city": "Rosebud", + "state": "MO", + "county": "Gasconade" + }, + { + "zip_code": 63099, + "latitude": 38.638318, + "longitude": -90.427118, + "city": "Fenton", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63101, + "latitude": 38.631501, + "longitude": -90.19231, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63102, + "latitude": 38.6336, + "longitude": -90.191221, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63103, + "latitude": 38.629901, + "longitude": -90.216411, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63104, + "latitude": 38.611401, + "longitude": -90.214461, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63105, + "latitude": 38.645901, + "longitude": -90.326365, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63106, + "latitude": 38.644501, + "longitude": -90.208361, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63107, + "latitude": 38.66535, + "longitude": -90.212561, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63108, + "latitude": 38.644801, + "longitude": -90.251962, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63109, + "latitude": 38.581652, + "longitude": -90.294714, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63110, + "latitude": 38.625401, + "longitude": -90.268132, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63111, + "latitude": 38.559551, + "longitude": -90.249744, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63112, + "latitude": 38.663851, + "longitude": -90.281813, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63113, + "latitude": 38.630051, + "longitude": -90.253212, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63114, + "latitude": 38.702301, + "longitude": -90.364365, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63115, + "latitude": 38.6772, + "longitude": -90.241962, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63116, + "latitude": 38.581401, + "longitude": -90.268563, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63117, + "latitude": 38.629452, + "longitude": -90.334215, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63118, + "latitude": 38.593751, + "longitude": -90.222012, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63119, + "latitude": 38.589302, + "longitude": -90.348116, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63120, + "latitude": 38.6901, + "longitude": -90.259212, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63121, + "latitude": 38.70715, + "longitude": -90.305463, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63122, + "latitude": 38.578052, + "longitude": -90.42563, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63123, + "latitude": 38.547552, + "longitude": -90.324115, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63124, + "latitude": 38.637201, + "longitude": -90.377566, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63125, + "latitude": 38.522152, + "longitude": -90.302115, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63126, + "latitude": 38.549452, + "longitude": -90.381069, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63127, + "latitude": 38.535503, + "longitude": -90.407018, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63128, + "latitude": 38.491503, + "longitude": -90.377167, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63129, + "latitude": 38.456553, + "longitude": -90.328212, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63130, + "latitude": 38.666851, + "longitude": -90.322514, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63131, + "latitude": 38.617102, + "longitude": -90.450368, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63132, + "latitude": 38.674601, + "longitude": -90.374716, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63133, + "latitude": 38.678651, + "longitude": -90.305113, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63134, + "latitude": 38.74355, + "longitude": -90.340964, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63135, + "latitude": 38.74965, + "longitude": -90.301213, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63136, + "latitude": 38.7196, + "longitude": -90.269962, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63137, + "latitude": 38.746799, + "longitude": -90.213103, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63138, + "latitude": 38.803299, + "longitude": -90.20651, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63139, + "latitude": 38.613501, + "longitude": -90.291814, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63140, + "latitude": 38.73745, + "longitude": -90.326464, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63141, + "latitude": 38.656502, + "longitude": -90.454219, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63143, + "latitude": 38.611099, + "longitude": -90.322475, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63144, + "latitude": 38.618152, + "longitude": -90.348865, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63145, + "latitude": 38.638318, + "longitude": -90.427118, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63146, + "latitude": 38.703251, + "longitude": -90.461818, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63147, + "latitude": 38.6774, + "longitude": -90.21968, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63150, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63151, + "latitude": 38.638318, + "longitude": -90.427118, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63155, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63156, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63157, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63158, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63160, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63163, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63164, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63166, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63167, + "latitude": 38.638318, + "longitude": -90.427118, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63169, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63171, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63177, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63178, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63179, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63180, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63182, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63188, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63190, + "latitude": "", + "longitude": "", + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63195, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63196, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63197, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63198, + "latitude": 38.638318, + "longitude": -90.427118, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis" + }, + { + "zip_code": 63199, + "latitude": 38.6531, + "longitude": -90.243462, + "city": "Saint Louis", + "state": "MO", + "county": "Saint Louis City" + }, + { + "zip_code": 63301, + "latitude": 38.754788, + "longitude": -90.613131, + "city": "Saint Charles", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63302, + "latitude": 38.581299, + "longitude": -90.872987, + "city": "Saint Charles", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63303, + "latitude": 38.759034, + "longitude": -90.595151, + "city": "Saint Charles", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63304, + "latitude": 38.731527, + "longitude": -90.704616, + "city": "Saint Charles", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63330, + "latitude": 39.253624, + "longitude": -90.814756, + "city": "Annada", + "state": "MO", + "county": "Pike" + }, + { + "zip_code": 63332, + "latitude": 38.619089, + "longitude": -90.880321, + "city": "Augusta", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63333, + "latitude": 39.03433, + "longitude": -91.33188, + "city": "Bellflower", + "state": "MO", + "county": "Montgomery" + }, + { + "zip_code": 63334, + "latitude": 39.316369, + "longitude": -91.174859, + "city": "Bowling Green", + "state": "MO", + "county": "Pike" + }, + { + "zip_code": 63336, + "latitude": 39.331503, + "longitude": -90.950068, + "city": "Clarksville", + "state": "MO", + "county": "Pike" + }, + { + "zip_code": 63338, + "latitude": 38.750949, + "longitude": -90.536784, + "city": "Cottleville", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63339, + "latitude": 39.333342, + "longitude": -91.197593, + "city": "Curryville", + "state": "MO", + "county": "Pike" + }, + { + "zip_code": 63341, + "latitude": 38.663411, + "longitude": -90.841195, + "city": "Defiance", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63342, + "latitude": 38.605967, + "longitude": -90.996216, + "city": "Dutzow", + "state": "MO", + "county": "Warren" + }, + { + "zip_code": 63343, + "latitude": 39.121393, + "longitude": -90.848269, + "city": "Elsberry", + "state": "MO", + "county": "Lincoln" + }, + { + "zip_code": 63344, + "latitude": 39.280278, + "longitude": -90.980854, + "city": "Eolia", + "state": "MO", + "county": "Pike" + }, + { + "zip_code": 63345, + "latitude": 39.270895, + "longitude": -91.557429, + "city": "Farber", + "state": "MO", + "county": "Audrain" + }, + { + "zip_code": 63346, + "latitude": 38.750949, + "longitude": -90.536784, + "city": "Flinthill", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63347, + "latitude": 39.081579, + "longitude": -90.795683, + "city": "Foley", + "state": "MO", + "county": "Lincoln" + }, + { + "zip_code": 63348, + "latitude": 38.777039, + "longitude": -90.916101, + "city": "Foristell", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63349, + "latitude": 38.980781, + "longitude": -91.127211, + "city": "Hawk Point", + "state": "MO", + "county": "Lincoln" + }, + { + "zip_code": 63350, + "latitude": 38.909013, + "longitude": -91.372292, + "city": "High Hill", + "state": "MO", + "county": "Montgomery" + }, + { + "zip_code": 63351, + "latitude": 38.896897, + "longitude": -91.326207, + "city": "Jonesburg", + "state": "MO", + "county": "Montgomery" + }, + { + "zip_code": 63352, + "latitude": 39.243096, + "longitude": -91.66077, + "city": "Laddonia", + "state": "MO", + "county": "Audrain" + }, + { + "zip_code": 63353, + "latitude": 39.440073, + "longitude": -91.088401, + "city": "Louisiana", + "state": "MO", + "county": "Pike" + }, + { + "zip_code": 63357, + "latitude": 38.651157, + "longitude": -91.151576, + "city": "Marthasville", + "state": "MO", + "county": "Warren" + }, + { + "zip_code": 63359, + "latitude": 39.104548, + "longitude": -91.382863, + "city": "Middletown", + "state": "MO", + "county": "Montgomery" + }, + { + "zip_code": 63361, + "latitude": 38.94604, + "longitude": -91.472754, + "city": "Montgomery City", + "state": "MO", + "county": "Montgomery" + }, + { + "zip_code": 63362, + "latitude": 38.948248, + "longitude": -90.913818, + "city": "Moscow Mills", + "state": "MO", + "county": "Lincoln" + }, + { + "zip_code": 63363, + "latitude": 38.892612, + "longitude": -91.453372, + "city": "New Florence", + "state": "MO", + "county": "Montgomery" + }, + { + "zip_code": 63365, + "latitude": 38.716287, + "longitude": -90.875127, + "city": "New Melle", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63366, + "latitude": 38.823944, + "longitude": -90.742745, + "city": "O Fallon", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63367, + "latitude": 38.791341, + "longitude": -90.74284, + "city": "Lake Saint Louis", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63369, + "latitude": 38.94773, + "longitude": -90.8106, + "city": "Old Monroe", + "state": "MO", + "county": "Lincoln" + }, + { + "zip_code": 63370, + "latitude": 39.077584, + "longitude": -91.231719, + "city": "Olney", + "state": "MO", + "county": "Lincoln" + }, + { + "zip_code": 63373, + "latitude": 38.92592, + "longitude": -90.38632, + "city": "Portage Des Sioux", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63376, + "latitude": 38.798819, + "longitude": -90.623673, + "city": "Saint Peters", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63377, + "latitude": 39.076463, + "longitude": -90.996268, + "city": "Silex", + "state": "MO", + "county": "Lincoln" + }, + { + "zip_code": 63378, + "latitude": 38.770187, + "longitude": -91.188586, + "city": "Treloar", + "state": "MO", + "county": "Warren" + }, + { + "zip_code": 63379, + "latitude": 39.016299, + "longitude": -90.940268, + "city": "Troy", + "state": "MO", + "county": "Lincoln" + }, + { + "zip_code": 63381, + "latitude": 39.022137, + "longitude": -90.996785, + "city": "Truxton", + "state": "MO", + "county": "Lincoln" + }, + { + "zip_code": 63382, + "latitude": 39.251403, + "longitude": -91.530807, + "city": "Vandalia", + "state": "MO", + "county": "Audrain" + }, + { + "zip_code": 63383, + "latitude": 38.808454, + "longitude": -91.2166, + "city": "Warrenton", + "state": "MO", + "county": "Warren" + }, + { + "zip_code": 63384, + "latitude": 39.073061, + "longitude": -91.533545, + "city": "Wellsville", + "state": "MO", + "county": "Montgomery" + }, + { + "zip_code": 63385, + "latitude": 38.79067, + "longitude": -90.852228, + "city": "Wentzville", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63386, + "latitude": 38.83275, + "longitude": -90.403416, + "city": "West Alton", + "state": "MO", + "county": "Saint Charles" + }, + { + "zip_code": 63387, + "latitude": 39.185508, + "longitude": -91.022733, + "city": "Whiteside", + "state": "MO", + "county": "Lincoln" + }, + { + "zip_code": 63388, + "latitude": 38.887421, + "longitude": -91.768887, + "city": "Williamsburg", + "state": "MO", + "county": "Callaway" + }, + { + "zip_code": 63389, + "latitude": 39.058354, + "longitude": -90.850945, + "city": "Winfield", + "state": "MO", + "county": "Lincoln" + }, + { + "zip_code": 63390, + "latitude": 38.797733, + "longitude": -91.048471, + "city": "Wright City", + "state": "MO", + "county": "Warren" + }, + { + "zip_code": 63401, + "latitude": 39.736986, + "longitude": -91.45683, + "city": "Hannibal", + "state": "MO", + "county": "Marion" + }, + { + "zip_code": 63430, + "latitude": 40.357643, + "longitude": -91.45886, + "city": "Alexandria", + "state": "MO", + "county": "Clark" + }, + { + "zip_code": 63431, + "latitude": 39.742779, + "longitude": -92.327977, + "city": "Anabel", + "state": "MO", + "county": "Macon" + }, + { + "zip_code": 63432, + "latitude": 40.453333, + "longitude": -92.1474, + "city": "Arbela", + "state": "MO", + "county": "Scotland" + }, + { + "zip_code": 63433, + "latitude": 39.56103, + "longitude": -91.184425, + "city": "Ashburn", + "state": "MO", + "county": "Pike" + }, + { + "zip_code": 63434, + "latitude": 39.779288, + "longitude": -92.069741, + "city": "Bethel", + "state": "MO", + "county": "Shelby" + }, + { + "zip_code": 63435, + "latitude": 40.107512, + "longitude": -91.705811, + "city": "Canton", + "state": "MO", + "county": "Lewis" + }, + { + "zip_code": 63436, + "latitude": 39.508451, + "longitude": -91.53793, + "city": "Center", + "state": "MO", + "county": "Ralls" + }, + { + "zip_code": 63437, + "latitude": 39.74294, + "longitude": -92.26344, + "city": "Clarence", + "state": "MO", + "county": "Shelby" + }, + { + "zip_code": 63438, + "latitude": 39.975702, + "longitude": -91.665056, + "city": "Durham", + "state": "MO", + "county": "Lewis" + }, + { + "zip_code": 63439, + "latitude": 39.779288, + "longitude": -92.069741, + "city": "Emden", + "state": "MO", + "county": "Shelby" + }, + { + "zip_code": 63440, + "latitude": 40.008146, + "longitude": -91.710266, + "city": "Ewing", + "state": "MO", + "county": "Lewis" + }, + { + "zip_code": 63441, + "latitude": 39.466564, + "longitude": -91.332846, + "city": "Frankford", + "state": "MO", + "county": "Pike" + }, + { + "zip_code": 63442, + "latitude": 40.453333, + "longitude": -92.1474, + "city": "Granger", + "state": "MO", + "county": "Scotland" + }, + { + "zip_code": 63443, + "latitude": 39.667948, + "longitude": -91.858547, + "city": "Hunnewell", + "state": "MO", + "county": "Shelby" + }, + { + "zip_code": 63445, + "latitude": 40.41361, + "longitude": -91.659318, + "city": "Kahoka", + "state": "MO", + "county": "Clark" + }, + { + "zip_code": 63446, + "latitude": 40.126767, + "longitude": -92.147994, + "city": "Knox City", + "state": "MO", + "county": "Knox" + }, + { + "zip_code": 63447, + "latitude": 40.114981, + "longitude": -91.915396, + "city": "La Belle", + "state": "MO", + "county": "Lewis" + }, + { + "zip_code": 63448, + "latitude": 40.059903, + "longitude": -91.705042, + "city": "La Grange", + "state": "MO", + "county": "Lewis" + }, + { + "zip_code": 63450, + "latitude": 39.779288, + "longitude": -92.069741, + "city": "Lentner", + "state": "MO", + "county": "Shelby" + }, + { + "zip_code": 63451, + "latitude": 39.90938, + "longitude": -92.206724, + "city": "Leonard", + "state": "MO", + "county": "Shelby" + }, + { + "zip_code": 63452, + "latitude": 40.084114, + "longitude": -91.813451, + "city": "Lewistown", + "state": "MO", + "county": "Lewis" + }, + { + "zip_code": 63453, + "latitude": 40.431201, + "longitude": -91.685103, + "city": "Luray", + "state": "MO", + "county": "Clark" + }, + { + "zip_code": 63454, + "latitude": 39.903389, + "longitude": -91.654578, + "city": "Maywood", + "state": "MO", + "county": "Marion" + }, + { + "zip_code": 63456, + "latitude": 39.624018, + "longitude": -91.762318, + "city": "Monroe City", + "state": "MO", + "county": "Monroe" + }, + { + "zip_code": 63457, + "latitude": 40.090883, + "longitude": -91.68774, + "city": "Monticello", + "state": "MO", + "county": "Lewis" + }, + { + "zip_code": 63458, + "latitude": 40.126767, + "longitude": -92.147994, + "city": "Newark", + "state": "MO", + "county": "Knox" + }, + { + "zip_code": 63459, + "latitude": 39.582974, + "longitude": -91.382389, + "city": "New London", + "state": "MO", + "county": "Ralls" + }, + { + "zip_code": 63460, + "latitude": 40.126767, + "longitude": -92.147994, + "city": "Novelty", + "state": "MO", + "county": "Knox" + }, + { + "zip_code": 63461, + "latitude": 39.794531, + "longitude": -91.609424, + "city": "Palmyra", + "state": "MO", + "county": "Marion" + }, + { + "zip_code": 63462, + "latitude": 39.422833, + "longitude": -91.623364, + "city": "Perry", + "state": "MO", + "county": "Ralls" + }, + { + "zip_code": 63463, + "latitude": 39.82473, + "longitude": -91.738022, + "city": "Philadelphia", + "state": "MO", + "county": "Marion" + }, + { + "zip_code": 63464, + "latitude": 40.126767, + "longitude": -92.147994, + "city": "Plevna", + "state": "MO", + "county": "Knox" + }, + { + "zip_code": 63465, + "latitude": 40.45696, + "longitude": -91.695843, + "city": "Revere", + "state": "MO", + "county": "Clark" + }, + { + "zip_code": 63466, + "latitude": 40.431201, + "longitude": -91.685103, + "city": "Saint Patrick", + "state": "MO", + "county": "Clark" + }, + { + "zip_code": 63467, + "latitude": 39.650045, + "longitude": -91.270502, + "city": "Saverton", + "state": "MO", + "county": "Ralls" + }, + { + "zip_code": 63468, + "latitude": 39.739181, + "longitude": -92.067449, + "city": "Shelbina", + "state": "MO", + "county": "Shelby" + }, + { + "zip_code": 63469, + "latitude": 39.778816, + "longitude": -92.075059, + "city": "Shelbyville", + "state": "MO", + "county": "Shelby" + }, + { + "zip_code": 63471, + "latitude": 39.913861, + "longitude": -91.541024, + "city": "Taylor", + "state": "MO", + "county": "Marion" + }, + { + "zip_code": 63472, + "latitude": 40.372995, + "longitude": -91.61903, + "city": "Wayland", + "state": "MO", + "county": "Clark" + }, + { + "zip_code": 63473, + "latitude": 40.101236, + "longitude": -91.694121, + "city": "Williamstown", + "state": "MO", + "county": "Lewis" + }, + { + "zip_code": 63474, + "latitude": 40.392193, + "longitude": -91.925945, + "city": "Wyaconda", + "state": "MO", + "county": "Clark" + }, + { + "zip_code": 63501, + "latitude": 40.165717, + "longitude": -92.609514, + "city": "Kirksville", + "state": "MO", + "county": "Adair" + }, + { + "zip_code": 63530, + "latitude": 39.896469, + "longitude": -92.46348, + "city": "Atlanta", + "state": "MO", + "county": "Macon" + }, + { + "zip_code": 63531, + "latitude": 40.149624, + "longitude": -92.303293, + "city": "Baring", + "state": "MO", + "county": "Knox" + }, + { + "zip_code": 63532, + "latitude": 39.752572, + "longitude": -92.576944, + "city": "Bevier", + "state": "MO", + "county": "Macon" + }, + { + "zip_code": 63533, + "latitude": 40.149263, + "longitude": -92.378005, + "city": "Brashear", + "state": "MO", + "county": "Adair" + }, + { + "zip_code": 63534, + "latitude": 39.740612, + "longitude": -92.644013, + "city": "Callao", + "state": "MO", + "county": "Macon" + }, + { + "zip_code": 63535, + "latitude": 40.47037, + "longitude": -92.535566, + "city": "Coatsville", + "state": "MO", + "county": "Schuyler" + }, + { + "zip_code": 63536, + "latitude": 40.47037, + "longitude": -92.535566, + "city": "Downing", + "state": "MO", + "county": "Schuyler" + }, + { + "zip_code": 63537, + "latitude": 40.161431, + "longitude": -92.233699, + "city": "Edina", + "state": "MO", + "county": "Knox" + }, + { + "zip_code": 63538, + "latitude": 39.96045, + "longitude": -92.684957, + "city": "Elmer", + "state": "MO", + "county": "Macon" + }, + { + "zip_code": 63539, + "latitude": 39.934265, + "longitude": -92.768069, + "city": "Ethel", + "state": "MO", + "county": "Macon" + }, + { + "zip_code": 63540, + "latitude": 40.191837, + "longitude": -92.600838, + "city": "Gibbs", + "state": "MO", + "county": "Adair" + }, + { + "zip_code": 63541, + "latitude": 40.47037, + "longitude": -92.535566, + "city": "Glenwood", + "state": "MO", + "county": "Schuyler" + }, + { + "zip_code": 63543, + "latitude": 40.453333, + "longitude": -92.1474, + "city": "Gorin", + "state": "MO", + "county": "Scotland" + }, + { + "zip_code": 63544, + "latitude": 40.245907, + "longitude": -92.872023, + "city": "Green Castle", + "state": "MO", + "county": "Sullivan" + }, + { + "zip_code": 63545, + "latitude": 40.218108, + "longitude": -92.945787, + "city": "Green City", + "state": "MO", + "county": "Sullivan" + }, + { + "zip_code": 63546, + "latitude": 40.271035, + "longitude": -92.438547, + "city": "Greentop", + "state": "MO", + "county": "Adair" + }, + { + "zip_code": 63547, + "latitude": 40.155779, + "longitude": -92.23384, + "city": "Hurdland", + "state": "MO", + "county": "Knox" + }, + { + "zip_code": 63548, + "latitude": 40.47037, + "longitude": -92.535566, + "city": "Lancaster", + "state": "MO", + "county": "Schuyler" + }, + { + "zip_code": 63549, + "latitude": 39.988763, + "longitude": -92.531207, + "city": "La Plata", + "state": "MO", + "county": "Macon" + }, + { + "zip_code": 63551, + "latitude": 40.465883, + "longitude": -93.019815, + "city": "Livonia", + "state": "MO", + "county": "Putnam" + }, + { + "zip_code": 63552, + "latitude": 39.773979, + "longitude": -92.451742, + "city": "Macon", + "state": "MO", + "county": "Macon" + }, + { + "zip_code": 63555, + "latitude": 40.460129, + "longitude": -92.198203, + "city": "Memphis", + "state": "MO", + "county": "Scotland" + }, + { + "zip_code": 63556, + "latitude": 40.166282, + "longitude": -93.120132, + "city": "Milan", + "state": "MO", + "county": "Sullivan" + }, + { + "zip_code": 63557, + "latitude": 39.897218, + "longitude": -92.983838, + "city": "New Boston", + "state": "MO", + "county": "Linn" + }, + { + "zip_code": 63558, + "latitude": 39.779466, + "longitude": -92.757639, + "city": "New Cambria", + "state": "MO", + "county": "Macon" + }, + { + "zip_code": 63559, + "latitude": 40.254906, + "longitude": -92.705779, + "city": "Novinger", + "state": "MO", + "county": "Adair" + }, + { + "zip_code": 63560, + "latitude": 40.358563, + "longitude": -93.080651, + "city": "Pollock", + "state": "MO", + "county": "Sullivan" + }, + { + "zip_code": 63561, + "latitude": 40.409719, + "longitude": -92.569221, + "city": "Queen City", + "state": "MO", + "county": "Schuyler" + }, + { + "zip_code": 63563, + "latitude": 40.306854, + "longitude": -92.085363, + "city": "Rutledge", + "state": "MO", + "county": "Scotland" + }, + { + "zip_code": 63565, + "latitude": 40.50952, + "longitude": -93.012329, + "city": "Unionville", + "state": "MO", + "county": "Putnam" + }, + { + "zip_code": 63566, + "latitude": 40.209765, + "longitude": -93.111314, + "city": "Winigan", + "state": "MO", + "county": "Sullivan" + }, + { + "zip_code": 63567, + "latitude": 40.465883, + "longitude": -93.019815, + "city": "Worthington", + "state": "MO", + "county": "Putnam" + }, + { + "zip_code": 63601, + "latitude": 37.849808, + "longitude": -90.488486, + "city": "Park Hills", + "state": "MO", + "county": "Saint Francois" + }, + { + "zip_code": 63620, + "latitude": 37.4913, + "longitude": -90.6646, + "city": "Annapolis", + "state": "MO", + "county": "Iron" + }, + { + "zip_code": 63621, + "latitude": 37.60362, + "longitude": -90.634928, + "city": "Arcadia", + "state": "MO", + "county": "Iron" + }, + { + "zip_code": 63622, + "latitude": 37.789859, + "longitude": -90.846322, + "city": "Belgrade", + "state": "MO", + "county": "Washington" + }, + { + "zip_code": 63623, + "latitude": 37.665689, + "longitude": -90.898189, + "city": "Belleview", + "state": "MO", + "county": "Iron" + }, + { + "zip_code": 63624, + "latitude": 37.753919, + "longitude": -90.59839, + "city": "Bismarck", + "state": "MO", + "county": "Saint Francois" + }, + { + "zip_code": 63625, + "latitude": 37.327153, + "longitude": -91.024337, + "city": "Black", + "state": "MO", + "county": "Reynolds" + }, + { + "zip_code": 63626, + "latitude": 38.054424, + "longitude": -90.627911, + "city": "Blackwell", + "state": "MO", + "county": "Saint Francois" + }, + { + "zip_code": 63627, + "latitude": 38.023217, + "longitude": -90.252806, + "city": "Bloomsdale", + "state": "MO", + "county": "Sainte Genevieve" + }, + { + "zip_code": 63628, + "latitude": 37.879195, + "longitude": -90.487988, + "city": "Bonne Terre", + "state": "MO", + "county": "Saint Francois" + }, + { + "zip_code": 63629, + "latitude": 37.45584, + "longitude": -91.207476, + "city": "Bunker", + "state": "MO", + "county": "Reynolds" + }, + { + "zip_code": 63630, + "latitude": 38.018265, + "longitude": -90.728895, + "city": "Cadet", + "state": "MO", + "county": "Washington" + }, + { + "zip_code": 63631, + "latitude": 37.77726, + "longitude": -90.809566, + "city": "Caledonia", + "state": "MO", + "county": "Washington" + }, + { + "zip_code": 63632, + "latitude": 37.119566, + "longitude": -90.444953, + "city": "Cascade", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 63633, + "latitude": 37.240134, + "longitude": -90.966089, + "city": "Centerville", + "state": "MO", + "county": "Reynolds" + }, + { + "zip_code": 63636, + "latitude": 37.505462, + "longitude": -90.845047, + "city": "Des Arc", + "state": "MO", + "county": "Iron" + }, + { + "zip_code": 63637, + "latitude": 37.718886, + "longitude": -90.529447, + "city": "Doe Run", + "state": "MO", + "county": "Saint Francois" + }, + { + "zip_code": 63638, + "latitude": 37.232968, + "longitude": -90.969767, + "city": "Ellington", + "state": "MO", + "county": "Reynolds" + }, + { + "zip_code": 63640, + "latitude": 37.785545, + "longitude": -90.443298, + "city": "Farmington", + "state": "MO", + "county": "Saint Francois" + }, + { + "zip_code": 63645, + "latitude": 37.490565, + "longitude": -90.336244, + "city": "Fredericktown", + "state": "MO", + "county": "Madison" + }, + { + "zip_code": 63646, + "latitude": 37.505462, + "longitude": -90.845047, + "city": "Glover", + "state": "MO", + "county": "Iron" + }, + { + "zip_code": 63648, + "latitude": 37.82135, + "longitude": -90.692287, + "city": "Irondale", + "state": "MO", + "county": "Washington" + }, + { + "zip_code": 63650, + "latitude": 37.616808, + "longitude": -90.598469, + "city": "Ironton", + "state": "MO", + "county": "Iron" + }, + { + "zip_code": 63651, + "latitude": 37.675442, + "longitude": -90.367713, + "city": "Knob Lick", + "state": "MO", + "county": "Saint Francois" + }, + { + "zip_code": 63653, + "latitude": 37.857721, + "longitude": -90.587889, + "city": "Leadwood", + "state": "MO", + "county": "Saint Francois" + }, + { + "zip_code": 63654, + "latitude": 37.327153, + "longitude": -91.024337, + "city": "Lesterville", + "state": "MO", + "county": "Reynolds" + }, + { + "zip_code": 63655, + "latitude": 37.413591, + "longitude": -90.236118, + "city": "Marquand", + "state": "MO", + "county": "Madison" + }, + { + "zip_code": 63656, + "latitude": 37.505462, + "longitude": -90.845047, + "city": "Middle Brook", + "state": "MO", + "county": "Iron" + }, + { + "zip_code": 63660, + "latitude": 37.936112, + "longitude": -90.742423, + "city": "Mineral Point", + "state": "MO", + "county": "Washington" + }, + { + "zip_code": 63661, + "latitude": 37.89872, + "longitude": -90.191972, + "city": "New Offenburg", + "state": "MO", + "county": "Sainte Genevieve" + }, + { + "zip_code": 63662, + "latitude": 37.319652, + "longitude": -90.04218, + "city": "Patton", + "state": "MO", + "county": "Bollinger" + }, + { + "zip_code": 63663, + "latitude": 37.617092, + "longitude": -90.612259, + "city": "Pilot Knob", + "state": "MO", + "county": "Iron" + }, + { + "zip_code": 63664, + "latitude": 37.98535, + "longitude": -90.820073, + "city": "Potosi", + "state": "MO", + "county": "Washington" + }, + { + "zip_code": 63665, + "latitude": 37.327153, + "longitude": -91.024337, + "city": "Redford", + "state": "MO", + "county": "Reynolds" + }, + { + "zip_code": 63666, + "latitude": 37.327153, + "longitude": -91.024337, + "city": "Reynolds", + "state": "MO", + "county": "Reynolds" + }, + { + "zip_code": 63670, + "latitude": 37.865528, + "longitude": -90.175244, + "city": "Sainte Genevieve", + "state": "MO", + "county": "Sainte Genevieve" + }, + { + "zip_code": 63673, + "latitude": 37.819949, + "longitude": -90.016922, + "city": "Saint Mary", + "state": "MO", + "county": "Sainte Genevieve" + }, + { + "zip_code": 63674, + "latitude": 37.970441, + "longitude": -90.870001, + "city": "Tiff", + "state": "MO", + "county": "Washington" + }, + { + "zip_code": 63675, + "latitude": 37.505462, + "longitude": -90.845047, + "city": "Vulcan", + "state": "MO", + "county": "Iron" + }, + { + "zip_code": 63701, + "latitude": 37.341398, + "longitude": -89.611016, + "city": "Cape Girardeau", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63702, + "latitude": 37.350624, + "longitude": -89.509405, + "city": "Cape Girardeau", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63703, + "latitude": 37.284366, + "longitude": -89.571485, + "city": "Cape Girardeau", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63705, + "latitude": 37.366166, + "longitude": -89.643941, + "city": "Cape Girardeau", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63730, + "latitude": 37.001191, + "longitude": -90.033351, + "city": "Advance", + "state": "MO", + "county": "Stoddard" + }, + { + "zip_code": 63732, + "latitude": 37.627908, + "longitude": -89.574503, + "city": "Altenburg", + "state": "MO", + "county": "Perry" + }, + { + "zip_code": 63735, + "latitude": 36.992886, + "longitude": -89.789402, + "city": "Bell City", + "state": "MO", + "county": "Stoddard" + }, + { + "zip_code": 63736, + "latitude": 37.025936, + "longitude": -89.538588, + "city": "Benton", + "state": "MO", + "county": "Scott" + }, + { + "zip_code": 63737, + "latitude": 37.663253, + "longitude": -89.652912, + "city": "Brazeau", + "state": "MO", + "county": "Perry" + }, + { + "zip_code": 63738, + "latitude": 37.082824, + "longitude": -89.952257, + "city": "Brownwood", + "state": "MO", + "county": "Stoddard" + }, + { + "zip_code": 63739, + "latitude": 37.353526, + "longitude": -89.793056, + "city": "Burfordville", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63740, + "latitude": 37.151512, + "longitude": -89.610468, + "city": "Chaffee", + "state": "MO", + "county": "Scott" + }, + { + "zip_code": 63742, + "latitude": 37.156982, + "longitude": -89.448389, + "city": "Commerce", + "state": "MO", + "county": "Scott" + }, + { + "zip_code": 63743, + "latitude": 37.515722, + "longitude": -89.826775, + "city": "Daisy", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63744, + "latitude": 37.197279, + "longitude": -89.739429, + "city": "Delta", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63745, + "latitude": 37.24237, + "longitude": -89.69768, + "city": "Dutchtown", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63746, + "latitude": 37.734776, + "longitude": -89.811616, + "city": "Farrar", + "state": "MO", + "county": "Perry" + }, + { + "zip_code": 63747, + "latitude": 37.516792, + "longitude": -89.815114, + "city": "Friedheim", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63748, + "latitude": 37.66, + "longitude": -89.616248, + "city": "Frohna", + "state": "MO", + "county": "Perry" + }, + { + "zip_code": 63750, + "latitude": 37.319652, + "longitude": -90.04218, + "city": "Gipsy", + "state": "MO", + "county": "Bollinger" + }, + { + "zip_code": 63751, + "latitude": 37.319652, + "longitude": -90.04218, + "city": "Glenallen", + "state": "MO", + "county": "Bollinger" + }, + { + "zip_code": 63752, + "latitude": 37.30925, + "longitude": -89.69889, + "city": "Gordonville", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63753, + "latitude": 37.319652, + "longitude": -90.04218, + "city": "Grassy", + "state": "MO", + "county": "Bollinger" + }, + { + "zip_code": 63755, + "latitude": 37.434218, + "longitude": -89.634617, + "city": "Jackson", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63758, + "latitude": 37.185801, + "longitude": -89.557524, + "city": "Kelso", + "state": "MO", + "county": "Scott" + }, + { + "zip_code": 63760, + "latitude": 37.319652, + "longitude": -90.04218, + "city": "Leopold", + "state": "MO", + "county": "Bollinger" + }, + { + "zip_code": 63763, + "latitude": 37.119566, + "longitude": -90.444953, + "city": "Mc Gee", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 63764, + "latitude": 37.306063, + "longitude": -89.982306, + "city": "Marble Hill", + "state": "MO", + "county": "Bollinger" + }, + { + "zip_code": 63766, + "latitude": 37.437333, + "longitude": -89.810954, + "city": "Millersville", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63767, + "latitude": 37.041104, + "longitude": -89.607642, + "city": "Morley", + "state": "MO", + "county": "Scott" + }, + { + "zip_code": 63769, + "latitude": 37.514047, + "longitude": -89.752719, + "city": "Oak Ridge", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63770, + "latitude": 37.589021, + "longitude": -89.679373, + "city": "Old Appleton", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63771, + "latitude": 37.056528, + "longitude": -89.670685, + "city": "Oran", + "state": "MO", + "county": "Scott" + }, + { + "zip_code": 63772, + "latitude": 37.04613, + "longitude": -89.779248, + "city": "Painton", + "state": "MO", + "county": "Stoddard" + }, + { + "zip_code": 63774, + "latitude": 37.056383, + "longitude": -89.549853, + "city": "Perkins", + "state": "MO", + "county": "Scott" + }, + { + "zip_code": 63775, + "latitude": 37.727156, + "longitude": -89.862749, + "city": "Perryville", + "state": "MO", + "county": "Perry" + }, + { + "zip_code": 63776, + "latitude": 37.734776, + "longitude": -89.811616, + "city": "Mc Bride", + "state": "MO", + "county": "Perry" + }, + { + "zip_code": 63779, + "latitude": 37.500656, + "longitude": -89.639595, + "city": "Pocahontas", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63780, + "latitude": 37.060767, + "longitude": -89.55001, + "city": "Scott City", + "state": "MO", + "county": "Scott" + }, + { + "zip_code": 63781, + "latitude": 37.319652, + "longitude": -90.04218, + "city": "Sedgewickville", + "state": "MO", + "county": "Bollinger" + }, + { + "zip_code": 63782, + "latitude": 37.319652, + "longitude": -90.04218, + "city": "Sturdivant", + "state": "MO", + "county": "Bollinger" + }, + { + "zip_code": 63783, + "latitude": 37.628496, + "longitude": -89.688532, + "city": "Uniontown", + "state": "MO", + "county": "Perry" + }, + { + "zip_code": 63784, + "latitude": 36.991187, + "longitude": -89.688469, + "city": "Vanduser", + "state": "MO", + "county": "Scott" + }, + { + "zip_code": 63785, + "latitude": 37.278096, + "longitude": -89.806091, + "city": "Whitewater", + "state": "MO", + "county": "Cape Girardeau" + }, + { + "zip_code": 63787, + "latitude": 37.119918, + "longitude": -90.088925, + "city": "Zalma", + "state": "MO", + "county": "Bollinger" + }, + { + "zip_code": 63801, + "latitude": 37.027479, + "longitude": -89.563988, + "city": "Sikeston", + "state": "MO", + "county": "Scott" + }, + { + "zip_code": 63820, + "latitude": 36.822596, + "longitude": -89.346154, + "city": "Anniston", + "state": "MO", + "county": "Mississippi" + }, + { + "zip_code": 63821, + "latitude": 36.064878, + "longitude": -90.229246, + "city": "Arbyrd", + "state": "MO", + "county": "Dunklin" + }, + { + "zip_code": 63822, + "latitude": 36.67072, + "longitude": -89.996555, + "city": "Bernie", + "state": "MO", + "county": "Stoddard" + }, + { + "zip_code": 63823, + "latitude": 36.879394, + "longitude": -89.369007, + "city": "Bertrand", + "state": "MO", + "county": "Mississippi" + }, + { + "zip_code": 63824, + "latitude": 37.004204, + "longitude": -89.526567, + "city": "Blodgett", + "state": "MO", + "county": "Scott" + }, + { + "zip_code": 63825, + "latitude": 36.917174, + "longitude": -89.920641, + "city": "Bloomfield", + "state": "MO", + "county": "Stoddard" + }, + { + "zip_code": 63826, + "latitude": 36.178122, + "longitude": -89.671646, + "city": "Braggadocio", + "state": "MO", + "county": "Pemiscot" + }, + { + "zip_code": 63827, + "latitude": 36.269702, + "longitude": -89.872827, + "city": "Bragg City", + "state": "MO", + "county": "Pemiscot" + }, + { + "zip_code": 63828, + "latitude": 36.685031, + "longitude": -89.748273, + "city": "Canalou", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63829, + "latitude": 36.066896, + "longitude": -90.257353, + "city": "Cardwell", + "state": "MO", + "county": "Dunklin" + }, + { + "zip_code": 63830, + "latitude": 36.145823, + "longitude": -89.699719, + "city": "Caruthersville", + "state": "MO", + "county": "Pemiscot" + }, + { + "zip_code": 63833, + "latitude": 36.62761, + "longitude": -89.74355, + "city": "Catron", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63834, + "latitude": 36.885612, + "longitude": -89.296639, + "city": "Charleston", + "state": "MO", + "county": "Mississippi" + }, + { + "zip_code": 63837, + "latitude": 36.297884, + "longitude": -90.058362, + "city": "Clarkton", + "state": "MO", + "county": "Dunklin" + }, + { + "zip_code": 63838, + "latitude": 36.603844, + "longitude": -89.650005, + "city": "Conran", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63839, + "latitude": 36.047566, + "longitude": -89.809116, + "city": "Cooter", + "state": "MO", + "county": "Pemiscot" + }, + { + "zip_code": 63840, + "latitude": 36.213318, + "longitude": -89.748102, + "city": "Deering", + "state": "MO", + "county": "Pemiscot" + }, + { + "zip_code": 63841, + "latitude": 36.882467, + "longitude": -89.98146, + "city": "Dexter", + "state": "MO", + "county": "Stoddard" + }, + { + "zip_code": 63845, + "latitude": 36.758552, + "longitude": -89.334246, + "city": "East Prairie", + "state": "MO", + "county": "Mississippi" + }, + { + "zip_code": 63846, + "latitude": 36.809172, + "longitude": -89.815472, + "city": "Essex", + "state": "MO", + "county": "Stoddard" + }, + { + "zip_code": 63847, + "latitude": 36.441318, + "longitude": -90.029294, + "city": "Gibson", + "state": "MO", + "county": "Dunklin" + }, + { + "zip_code": 63848, + "latitude": 36.489808, + "longitude": -89.774875, + "city": "Gideon", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63849, + "latitude": 36.153706, + "longitude": -89.954388, + "city": "Gobler", + "state": "MO", + "county": "Pemiscot" + }, + { + "zip_code": 63850, + "latitude": 36.828337, + "longitude": -89.756518, + "city": "Grayridge", + "state": "MO", + "county": "Stoddard" + }, + { + "zip_code": 63851, + "latitude": 36.257216, + "longitude": -89.798519, + "city": "Hayti", + "state": "MO", + "county": "Pemiscot" + }, + { + "zip_code": 63852, + "latitude": 36.383876, + "longitude": -89.998681, + "city": "Holcomb", + "state": "MO", + "county": "Dunklin" + }, + { + "zip_code": 63853, + "latitude": 36.092984, + "longitude": -89.831121, + "city": "Holland", + "state": "MO", + "county": "Pemiscot" + }, + { + "zip_code": 63855, + "latitude": 36.052985, + "longitude": -90.077133, + "city": "Hornersville", + "state": "MO", + "county": "Dunklin" + }, + { + "zip_code": 63857, + "latitude": 36.252946, + "longitude": -90.127039, + "city": "Kennett", + "state": "MO", + "county": "Dunklin" + }, + { + "zip_code": 63860, + "latitude": 36.672641, + "longitude": -89.563896, + "city": "Kewanee", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63862, + "latitude": 36.588189, + "longitude": -89.700138, + "city": "Lilbourn", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63863, + "latitude": 36.377184, + "longitude": -90.057096, + "city": "Malden", + "state": "MO", + "county": "Dunklin" + }, + { + "zip_code": 63866, + "latitude": 36.518643, + "longitude": -89.646396, + "city": "Marston", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63867, + "latitude": 36.715404, + "longitude": -89.628723, + "city": "Matthews", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63868, + "latitude": 36.850353, + "longitude": -89.68472, + "city": "Morehouse", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63869, + "latitude": 36.679465, + "longitude": -89.657159, + "city": "New Madrid", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63870, + "latitude": 36.568845, + "longitude": -89.85627, + "city": "Parma", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63871, + "latitude": 36.267825, + "longitude": -89.822514, + "city": "Pascola", + "state": "MO", + "county": "Pemiscot" + }, + { + "zip_code": 63873, + "latitude": 36.475274, + "longitude": -89.748064, + "city": "Portageville", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63874, + "latitude": 36.678325, + "longitude": -89.770008, + "city": "Risco", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63875, + "latitude": 36.313319, + "longitude": -90.165758, + "city": "Rives", + "state": "MO", + "county": "Dunklin" + }, + { + "zip_code": 63876, + "latitude": 36.127573, + "longitude": -90.18349, + "city": "Senath", + "state": "MO", + "county": "Dunklin" + }, + { + "zip_code": 63877, + "latitude": 36.177001, + "longitude": -89.860675, + "city": "Steele", + "state": "MO", + "county": "Pemiscot" + }, + { + "zip_code": 63878, + "latitude": 36.603844, + "longitude": -89.650005, + "city": "Tallapoosa", + "state": "MO", + "county": "New Madrid" + }, + { + "zip_code": 63879, + "latitude": 36.347807, + "longitude": -89.818059, + "city": "Wardell", + "state": "MO", + "county": "Pemiscot" + }, + { + "zip_code": 63880, + "latitude": 36.313319, + "longitude": -90.165758, + "city": "Whiteoak", + "state": "MO", + "county": "Dunklin" + }, + { + "zip_code": 63881, + "latitude": 36.779519, + "longitude": -89.206329, + "city": "Wolf Island", + "state": "MO", + "county": "Mississippi" + }, + { + "zip_code": 63882, + "latitude": 36.93603, + "longitude": -89.216333, + "city": "Wyatt", + "state": "MO", + "county": "Mississippi" + }, + { + "zip_code": 63901, + "latitude": 36.778764, + "longitude": -90.440688, + "city": "Poplar Bluff", + "state": "MO", + "county": "Butler" + }, + { + "zip_code": 63902, + "latitude": 36.712451, + "longitude": -90.407013, + "city": "Poplar Bluff", + "state": "MO", + "county": "Butler" + }, + { + "zip_code": 63931, + "latitude": 36.66101, + "longitude": -90.850785, + "city": "Briar", + "state": "MO", + "county": "Ripley" + }, + { + "zip_code": 63932, + "latitude": 36.712451, + "longitude": -90.407013, + "city": "Broseley", + "state": "MO", + "county": "Butler" + }, + { + "zip_code": 63933, + "latitude": 36.492269, + "longitude": -90.048069, + "city": "Campbell", + "state": "MO", + "county": "Dunklin" + }, + { + "zip_code": 63934, + "latitude": 37.119566, + "longitude": -90.444953, + "city": "Clubb", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 63935, + "latitude": 36.650121, + "longitude": -90.810644, + "city": "Doniphan", + "state": "MO", + "county": "Ripley" + }, + { + "zip_code": 63936, + "latitude": 36.824646, + "longitude": -90.12135, + "city": "Dudley", + "state": "MO", + "county": "Stoddard" + }, + { + "zip_code": 63937, + "latitude": 36.934404, + "longitude": -90.746313, + "city": "Ellsinore", + "state": "MO", + "county": "Carter" + }, + { + "zip_code": 63938, + "latitude": 36.712451, + "longitude": -90.407013, + "city": "Fagus", + "state": "MO", + "county": "Butler" + }, + { + "zip_code": 63939, + "latitude": 36.66101, + "longitude": -90.850785, + "city": "Fairdealing", + "state": "MO", + "county": "Ripley" + }, + { + "zip_code": 63940, + "latitude": 36.782328, + "longitude": -90.207712, + "city": "Fisk", + "state": "MO", + "county": "Butler" + }, + { + "zip_code": 63941, + "latitude": 36.920383, + "longitude": -91.099461, + "city": "Fremont", + "state": "MO", + "county": "Carter" + }, + { + "zip_code": 63942, + "latitude": 36.66101, + "longitude": -90.850785, + "city": "Gatewood", + "state": "MO", + "county": "Ripley" + }, + { + "zip_code": 63943, + "latitude": 36.955926, + "longitude": -90.943027, + "city": "Grandin", + "state": "MO", + "county": "Carter" + }, + { + "zip_code": 63944, + "latitude": 37.126875, + "longitude": -90.450586, + "city": "Greenville", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 63945, + "latitude": 36.712451, + "longitude": -90.407013, + "city": "Harviell", + "state": "MO", + "county": "Butler" + }, + { + "zip_code": 63947, + "latitude": 37.119566, + "longitude": -90.444953, + "city": "Hiram", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 63950, + "latitude": 37.119566, + "longitude": -90.444953, + "city": "Lodi", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 63951, + "latitude": 37.119566, + "longitude": -90.444953, + "city": "Lowndes", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 63952, + "latitude": 37.119566, + "longitude": -90.444953, + "city": "Mill Spring", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 63953, + "latitude": 36.66101, + "longitude": -90.850785, + "city": "Naylor", + "state": "MO", + "county": "Ripley" + }, + { + "zip_code": 63954, + "latitude": 36.712451, + "longitude": -90.407013, + "city": "Neelyville", + "state": "MO", + "county": "Butler" + }, + { + "zip_code": 63955, + "latitude": 36.66101, + "longitude": -90.850785, + "city": "Oxly", + "state": "MO", + "county": "Ripley" + }, + { + "zip_code": 63956, + "latitude": 37.119566, + "longitude": -90.444953, + "city": "Patterson", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 63957, + "latitude": 37.148461, + "longitude": -90.574279, + "city": "Piedmont", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 63960, + "latitude": 36.978223, + "longitude": -90.081609, + "city": "Puxico", + "state": "MO", + "county": "Stoddard" + }, + { + "zip_code": 63961, + "latitude": 36.588977, + "longitude": -90.264918, + "city": "Qulin", + "state": "MO", + "county": "Butler" + }, + { + "zip_code": 63962, + "latitude": 36.712451, + "longitude": -90.407013, + "city": "Rombauer", + "state": "MO", + "county": "Butler" + }, + { + "zip_code": 63963, + "latitude": 37.119566, + "longitude": -90.444953, + "city": "Shook", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 63964, + "latitude": 37.207287, + "longitude": -90.419576, + "city": "Silva", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 63965, + "latitude": 36.922108, + "longitude": -91.052088, + "city": "Van Buren", + "state": "MO", + "county": "Carter" + }, + { + "zip_code": 63966, + "latitude": 36.974454, + "longitude": -90.277511, + "city": "Wappapello", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 63967, + "latitude": 37.119566, + "longitude": -90.444953, + "city": "Williamsville", + "state": "MO", + "county": "Wayne" + }, + { + "zip_code": 64001, + "latitude": 39.105644, + "longitude": -93.590916, + "city": "Alma", + "state": "MO", + "county": "Lafayette" + }, + { + "zip_code": 64011, + "latitude": 38.974639, + "longitude": -94.063718, + "city": "Bates City", + "state": "MO", + "county": "Lafayette" + }, + { + "zip_code": 64012, + "latitude": 38.784041, + "longitude": -94.532397, + "city": "Belton", + "state": "MO", + "county": "Cass" + }, + { + "zip_code": 64013, + "latitude": 38.964518, + "longitude": -94.370275, + "city": "Blue Springs", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64014, + "latitude": 39.00569, + "longitude": -94.252933, + "city": "Blue Springs", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64015, + "latitude": 39.01504, + "longitude": -94.311776, + "city": "Blue Springs", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64016, + "latitude": 39.113263, + "longitude": -94.211568, + "city": "Buckner", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64017, + "latitude": 39.260591, + "longitude": -94.10539, + "city": "Camden", + "state": "MO", + "county": "Ray" + }, + { + "zip_code": 64018, + "latitude": 39.396278, + "longitude": -94.725832, + "city": "Camden Point", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64019, + "latitude": 38.77934, + "longitude": -93.928302, + "city": "Centerview", + "state": "MO", + "county": "Johnson" + }, + { + "zip_code": 64020, + "latitude": 39.015918, + "longitude": -93.59571, + "city": "Concordia", + "state": "MO", + "county": "Lafayette" + }, + { + "zip_code": 64021, + "latitude": 39.118071, + "longitude": -93.61919, + "city": "Corder", + "state": "MO", + "county": "Lafayette" + }, + { + "zip_code": 64022, + "latitude": 39.100752, + "longitude": -93.795752, + "city": "Dover", + "state": "MO", + "county": "Lafayette" + }, + { + "zip_code": 64024, + "latitude": 39.332601, + "longitude": -94.274632, + "city": "Excelsior Springs", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64028, + "latitude": 39.283928, + "longitude": -94.830159, + "city": "Farley", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64029, + "latitude": 38.984966, + "longitude": -94.193874, + "city": "Grain Valley", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64030, + "latitude": 38.876107, + "longitude": -94.527063, + "city": "Grandview", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64034, + "latitude": 38.86436, + "longitude": -94.281453, + "city": "Greenwood", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64035, + "latitude": 39.315365, + "longitude": -93.849333, + "city": "Hardin", + "state": "MO", + "county": "Ray" + }, + { + "zip_code": 64036, + "latitude": 39.221835, + "longitude": -93.938595, + "city": "Henrietta", + "state": "MO", + "county": "Ray" + }, + { + "zip_code": 64037, + "latitude": 39.063374, + "longitude": -93.74083, + "city": "Higginsville", + "state": "MO", + "county": "Lafayette" + }, + { + "zip_code": 64040, + "latitude": 38.74013, + "longitude": -93.995995, + "city": "Holden", + "state": "MO", + "county": "Johnson" + }, + { + "zip_code": 64048, + "latitude": 39.333967, + "longitude": -94.391095, + "city": "Holt", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64050, + "latitude": 39.107798, + "longitude": -94.409828, + "city": "Independence", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64051, + "latitude": 39.080369, + "longitude": -94.387956, + "city": "Independence", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64052, + "latitude": 39.075554, + "longitude": -94.451179, + "city": "Independence", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64053, + "latitude": 39.106204, + "longitude": -94.466479, + "city": "Independence", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64054, + "latitude": 39.124904, + "longitude": -94.427115, + "city": "Independence", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64055, + "latitude": 39.048523, + "longitude": -94.415628, + "city": "Independence", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64056, + "latitude": 39.103572, + "longitude": -94.32281, + "city": "Independence", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64057, + "latitude": 39.077509, + "longitude": -94.31505, + "city": "Independence", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64058, + "latitude": 39.165267, + "longitude": -94.317602, + "city": "Independence", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64060, + "latitude": 39.374073, + "longitude": -94.363191, + "city": "Kearney", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64061, + "latitude": 38.744077, + "longitude": -93.817661, + "city": "Kingsville", + "state": "MO", + "county": "Johnson" + }, + { + "zip_code": 64062, + "latitude": 39.443208, + "longitude": -94.142768, + "city": "Lawson", + "state": "MO", + "county": "Ray" + }, + { + "zip_code": 64063, + "latitude": 38.938517, + "longitude": -94.348739, + "city": "Lees Summit", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64064, + "latitude": 38.987374, + "longitude": -94.333116, + "city": "Lees Summit", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64065, + "latitude": 38.966641, + "longitude": -94.392885, + "city": "Lees Summit", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64066, + "latitude": 39.129238, + "longitude": -94.133715, + "city": "Levasy", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64067, + "latitude": 39.14086, + "longitude": -93.849284, + "city": "Lexington", + "state": "MO", + "county": "Lafayette" + }, + { + "zip_code": 64068, + "latitude": 39.298945, + "longitude": -94.436314, + "city": "Liberty", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64069, + "latitude": 39.282869, + "longitude": -94.408998, + "city": "Liberty", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64070, + "latitude": 38.894304, + "longitude": -94.168262, + "city": "Lone Jack", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64071, + "latitude": 39.020768, + "longitude": -93.758998, + "city": "Mayview", + "state": "MO", + "county": "Lafayette" + }, + { + "zip_code": 64072, + "latitude": 39.245755, + "longitude": -94.292406, + "city": "Missouri City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64073, + "latitude": 39.314899, + "longitude": -94.293888, + "city": "Mosby", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64074, + "latitude": 39.037902, + "longitude": -94.038529, + "city": "Napoleon", + "state": "MO", + "county": "Lafayette" + }, + { + "zip_code": 64075, + "latitude": 39.040656, + "longitude": -94.238045, + "city": "Oak Grove", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64076, + "latitude": 39.020995, + "longitude": -93.820021, + "city": "Odessa", + "state": "MO", + "county": "Lafayette" + }, + { + "zip_code": 64077, + "latitude": 39.234415, + "longitude": -94.024126, + "city": "Orrick", + "state": "MO", + "county": "Ray" + }, + { + "zip_code": 64078, + "latitude": 38.715254, + "longitude": -94.472568, + "city": "Peculiar", + "state": "MO", + "county": "Cass" + }, + { + "zip_code": 64079, + "latitude": 39.364716, + "longitude": -94.780639, + "city": "Platte City", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64080, + "latitude": 38.753028, + "longitude": -94.270505, + "city": "Pleasant Hill", + "state": "MO", + "county": "Cass" + }, + { + "zip_code": 64081, + "latitude": 38.914352, + "longitude": -94.400625, + "city": "Lees Summit", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64082, + "latitude": 38.865864, + "longitude": -94.405809, + "city": "Lees Summit", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64083, + "latitude": 38.79502, + "longitude": -94.435542, + "city": "Raymore", + "state": "MO", + "county": "Cass" + }, + { + "zip_code": 64084, + "latitude": 39.380157, + "longitude": -94.068581, + "city": "Rayville", + "state": "MO", + "county": "Ray" + }, + { + "zip_code": 64085, + "latitude": 39.341906, + "longitude": -93.984387, + "city": "Richmond", + "state": "MO", + "county": "Ray" + }, + { + "zip_code": 64086, + "latitude": 38.944006, + "longitude": -94.288086, + "city": "Lees Summit", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64087, + "latitude": 39.282869, + "longitude": -94.408998, + "city": "Liberty", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64088, + "latitude": 39.146285, + "longitude": -94.203996, + "city": "Sibley", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64089, + "latitude": 39.38706, + "longitude": -94.473232, + "city": "Smithville", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64090, + "latitude": 38.765833, + "longitude": -94.160854, + "city": "Strasburg", + "state": "MO", + "county": "Cass" + }, + { + "zip_code": 64092, + "latitude": 39.228875, + "longitude": -94.805673, + "city": "Waldron", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64093, + "latitude": 38.769906, + "longitude": -93.811697, + "city": "Warrensburg", + "state": "MO", + "county": "Johnson" + }, + { + "zip_code": 64096, + "latitude": 39.188917, + "longitude": -93.586904, + "city": "Waverly", + "state": "MO", + "county": "Lafayette" + }, + { + "zip_code": 64097, + "latitude": 39.131379, + "longitude": -93.992983, + "city": "Wellington", + "state": "MO", + "county": "Lafayette" + }, + { + "zip_code": 64098, + "latitude": 39.377692, + "longitude": -94.928011, + "city": "Weston", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64101, + "latitude": 39.102404, + "longitude": -94.598583, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64102, + "latitude": 39.091354, + "longitude": -94.603634, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64105, + "latitude": 39.102704, + "longitude": -94.595033, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64106, + "latitude": 39.105054, + "longitude": -94.571182, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64108, + "latitude": 39.083804, + "longitude": -94.584133, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64109, + "latitude": 39.066654, + "longitude": -94.575933, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64110, + "latitude": 39.032255, + "longitude": -94.573333, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64111, + "latitude": 39.057, + "longitude": -94.593783, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64112, + "latitude": 39.035705, + "longitude": -94.594981, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64113, + "latitude": 39.013805, + "longitude": -94.525243, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64114, + "latitude": 38.952273, + "longitude": -94.596233, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64116, + "latitude": 39.147932, + "longitude": -94.568032, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64117, + "latitude": 39.165103, + "longitude": -94.525581, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64118, + "latitude": 39.213348, + "longitude": -94.574313, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64119, + "latitude": 39.211552, + "longitude": -94.527381, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64120, + "latitude": 39.123203, + "longitude": -94.522231, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64121, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64123, + "latitude": 39.068154, + "longitude": -94.505231, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64124, + "latitude": 39.107504, + "longitude": -94.538531, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64125, + "latitude": 39.105836, + "longitude": -94.49598, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64126, + "latitude": 39.094904, + "longitude": -94.49278, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64127, + "latitude": 39.08833, + "longitude": -94.538131, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64128, + "latitude": 39.065454, + "longitude": -94.533731, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64129, + "latitude": 39.046404, + "longitude": -94.498325, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64130, + "latitude": 39.033712, + "longitude": -94.541868, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64131, + "latitude": 38.962543, + "longitude": -94.574582, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64132, + "latitude": 38.984205, + "longitude": -94.546556, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64133, + "latitude": 39.032319, + "longitude": -94.469977, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64134, + "latitude": 38.930506, + "longitude": -94.48358, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64136, + "latitude": 39.009602, + "longitude": -94.39896, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64137, + "latitude": 38.935256, + "longitude": -94.547178, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64138, + "latitude": 38.952842, + "longitude": -94.470494, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64139, + "latitude": 38.964815, + "longitude": -94.40798, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64141, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64142, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64144, + "latitude": 39.282869, + "longitude": -94.408998, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64145, + "latitude": 38.88057, + "longitude": -94.595958, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64146, + "latitude": 38.879006, + "longitude": -94.574296, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64147, + "latitude": 38.854895, + "longitude": -94.556782, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64148, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64149, + "latitude": 38.873543, + "longitude": -94.474229, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64150, + "latitude": 39.177602, + "longitude": -94.632084, + "city": "Riverside", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64151, + "latitude": 39.212702, + "longitude": -94.638334, + "city": "Kansas City", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64152, + "latitude": 39.217552, + "longitude": -94.723817, + "city": "Kansas City", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64153, + "latitude": 39.270474, + "longitude": -94.741617, + "city": "Kansas City", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64154, + "latitude": 39.278393, + "longitude": -94.641184, + "city": "Kansas City", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64155, + "latitude": 39.276001, + "longitude": -94.570132, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64156, + "latitude": 39.277706, + "longitude": -94.51824, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64157, + "latitude": 39.267855, + "longitude": -94.472963, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64158, + "latitude": 39.233302, + "longitude": -94.476143, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64160, + "latitude": 39.282869, + "longitude": -94.408998, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64161, + "latitude": 39.166079, + "longitude": -94.463954, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64163, + "latitude": 39.340159, + "longitude": -94.690802, + "city": "Kansas City", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64164, + "latitude": 39.33035, + "longitude": -94.636092, + "city": "Kansas City", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64165, + "latitude": 39.311252, + "longitude": -94.543075, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64166, + "latitude": 39.323206, + "longitude": -94.510714, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64167, + "latitude": 39.320008, + "longitude": -94.487679, + "city": "Kansas City", + "state": "MO", + "county": "Clay" + }, + { + "zip_code": 64168, + "latitude": 39.343225, + "longitude": -94.85161, + "city": "Kansas City", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64170, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64171, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64172, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64173, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64179, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64180, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64183, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64184, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64185, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64187, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64188, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64189, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64190, + "latitude": 39.343225, + "longitude": -94.85161, + "city": "Kansas City", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64191, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64192, + "latitude": 38.953106, + "longitude": -94.523731, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64193, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64194, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64195, + "latitude": 39.343225, + "longitude": -94.85161, + "city": "Kansas City", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64196, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64197, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64198, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64199, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64401, + "latitude": 39.631108, + "longitude": -94.714003, + "city": "Agency", + "state": "MO", + "county": "Buchanan" + }, + { + "zip_code": 64402, + "latitude": 40.256596, + "longitude": -94.330949, + "city": "Albany", + "state": "MO", + "county": "Gentry" + }, + { + "zip_code": 64420, + "latitude": 40.478118, + "longitude": -94.423294, + "city": "Allendale", + "state": "MO", + "county": "Worth" + }, + { + "zip_code": 64421, + "latitude": 39.908392, + "longitude": -94.923508, + "city": "Amazonia", + "state": "MO", + "county": "Andrew" + }, + { + "zip_code": 64422, + "latitude": 39.904361, + "longitude": -94.490744, + "city": "Amity", + "state": "MO", + "county": "Dekalb" + }, + { + "zip_code": 64423, + "latitude": 40.266817, + "longitude": -94.858117, + "city": "Barnard", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64424, + "latitude": 40.258215, + "longitude": -94.020972, + "city": "Bethany", + "state": "MO", + "county": "Harrison" + }, + { + "zip_code": 64426, + "latitude": 40.510552, + "longitude": -93.875682, + "city": "Blythedale", + "state": "MO", + "county": "Harrison" + }, + { + "zip_code": 64427, + "latitude": 40.095823, + "longitude": -94.855903, + "city": "Bolckow", + "state": "MO", + "county": "Andrew" + }, + { + "zip_code": 64428, + "latitude": 40.447528, + "longitude": -95.063022, + "city": "Burlington Junction", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64429, + "latitude": 39.649352, + "longitude": -94.383777, + "city": "Cameron", + "state": "MO", + "county": "Clinton" + }, + { + "zip_code": 64430, + "latitude": 39.827651, + "longitude": -94.556849, + "city": "Clarksdale", + "state": "MO", + "county": "Dekalb" + }, + { + "zip_code": 64431, + "latitude": 40.507079, + "longitude": -95.034077, + "city": "Clearmont", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64432, + "latitude": 40.352306, + "longitude": -94.900456, + "city": "Clyde", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64433, + "latitude": 40.352306, + "longitude": -94.900456, + "city": "Conception", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64434, + "latitude": 40.265859, + "longitude": -94.691489, + "city": "Conception Junction", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64436, + "latitude": 39.864915, + "longitude": -94.68387, + "city": "Cosby", + "state": "MO", + "county": "Andrew" + }, + { + "zip_code": 64437, + "latitude": 40.126706, + "longitude": -95.329064, + "city": "Craig", + "state": "MO", + "county": "Holt" + }, + { + "zip_code": 64438, + "latitude": 40.197663, + "longitude": -94.397811, + "city": "Darlington", + "state": "MO", + "county": "Gentry" + }, + { + "zip_code": 64439, + "latitude": 39.487839, + "longitude": -94.763263, + "city": "Dearborn", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64440, + "latitude": 39.628826, + "longitude": -94.807989, + "city": "De Kalb", + "state": "MO", + "county": "Buchanan" + }, + { + "zip_code": 64441, + "latitude": 40.478118, + "longitude": -94.423294, + "city": "Denver", + "state": "MO", + "county": "Worth" + }, + { + "zip_code": 64442, + "latitude": 40.50037, + "longitude": -94.013848, + "city": "Eagleville", + "state": "MO", + "county": "Harrison" + }, + { + "zip_code": 64443, + "latitude": 39.750787, + "longitude": -94.657139, + "city": "Easton", + "state": "MO", + "county": "Buchanan" + }, + { + "zip_code": 64444, + "latitude": 39.464918, + "longitude": -94.65705, + "city": "Edgerton", + "state": "MO", + "county": "Platte" + }, + { + "zip_code": 64445, + "latitude": 40.352306, + "longitude": -94.900456, + "city": "Elmo", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64446, + "latitude": 40.347147, + "longitude": -95.390747, + "city": "Fairfax", + "state": "MO", + "county": "Atchison" + }, + { + "zip_code": 64447, + "latitude": 39.892645, + "longitude": -94.404415, + "city": "Fairport", + "state": "MO", + "county": "Dekalb" + }, + { + "zip_code": 64448, + "latitude": 39.604946, + "longitude": -94.854124, + "city": "Faucett", + "state": "MO", + "county": "Buchanan" + }, + { + "zip_code": 64449, + "latitude": 40.041019, + "longitude": -94.971508, + "city": "Fillmore", + "state": "MO", + "county": "Andrew" + }, + { + "zip_code": 64451, + "latitude": 40.022472, + "longitude": -95.185611, + "city": "Forest City", + "state": "MO", + "county": "Holt" + }, + { + "zip_code": 64453, + "latitude": 40.210903, + "longitude": -94.410425, + "city": "Gentry", + "state": "MO", + "county": "Gentry" + }, + { + "zip_code": 64454, + "latitude": 39.640606, + "longitude": -94.552925, + "city": "Gower", + "state": "MO", + "county": "Clinton" + }, + { + "zip_code": 64455, + "latitude": 40.200798, + "longitude": -95.039961, + "city": "Graham", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64456, + "latitude": 40.516557, + "longitude": -94.386821, + "city": "Grant City", + "state": "MO", + "county": "Worth" + }, + { + "zip_code": 64457, + "latitude": 40.352306, + "longitude": -94.900456, + "city": "Guilford", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64458, + "latitude": 40.50452, + "longitude": -94.141837, + "city": "Hatfield", + "state": "MO", + "county": "Harrison" + }, + { + "zip_code": 64459, + "latitude": 39.912051, + "longitude": -94.698, + "city": "Helena", + "state": "MO", + "county": "Andrew" + }, + { + "zip_code": 64461, + "latitude": 40.365638, + "longitude": -94.815191, + "city": "Hopkins", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64463, + "latitude": 40.050583, + "longitude": -94.522013, + "city": "King City", + "state": "MO", + "county": "Gentry" + }, + { + "zip_code": 64465, + "latitude": 39.609693, + "longitude": -94.387584, + "city": "Lathrop", + "state": "MO", + "county": "Clinton" + }, + { + "zip_code": 64466, + "latitude": 40.153899, + "longitude": -95.127221, + "city": "Maitland", + "state": "MO", + "county": "Holt" + }, + { + "zip_code": 64467, + "latitude": 40.411357, + "longitude": -94.148382, + "city": "Martinsville", + "state": "MO", + "county": "Harrison" + }, + { + "zip_code": 64468, + "latitude": 40.277742, + "longitude": -94.860299, + "city": "Maryville", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64469, + "latitude": 39.932762, + "longitude": -94.357746, + "city": "Maysville", + "state": "MO", + "county": "Dekalb" + }, + { + "zip_code": 64470, + "latitude": 40.16754, + "longitude": -95.230117, + "city": "Mound City", + "state": "MO", + "county": "Holt" + }, + { + "zip_code": 64471, + "latitude": 40.260057, + "longitude": -94.178041, + "city": "New Hampton", + "state": "MO", + "county": "Harrison" + }, + { + "zip_code": 64473, + "latitude": 39.981457, + "longitude": -95.092325, + "city": "Oregon", + "state": "MO", + "county": "Holt" + }, + { + "zip_code": 64474, + "latitude": 39.791179, + "longitude": -94.397441, + "city": "Osborn", + "state": "MO", + "county": "Dekalb" + }, + { + "zip_code": 64475, + "latitude": 40.439298, + "longitude": -94.62247, + "city": "Parnell", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64476, + "latitude": 40.352306, + "longitude": -94.900456, + "city": "Pickering", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64477, + "latitude": 39.572431, + "longitude": -94.497237, + "city": "Plattsburg", + "state": "MO", + "county": "Clinton" + }, + { + "zip_code": 64478, + "latitude": 40.287996, + "longitude": -95.082241, + "city": "Quitman", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64479, + "latitude": 40.35257, + "longitude": -94.671958, + "city": "Ravenwood", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64480, + "latitude": 40.059384, + "longitude": -94.710629, + "city": "Rea", + "state": "MO", + "county": "Andrew" + }, + { + "zip_code": 64481, + "latitude": 40.366488, + "longitude": -93.935114, + "city": "Ridgeway", + "state": "MO", + "county": "Harrison" + }, + { + "zip_code": 64482, + "latitude": 40.411994, + "longitude": -95.507551, + "city": "Rock Port", + "state": "MO", + "county": "Atchison" + }, + { + "zip_code": 64483, + "latitude": 40.006832, + "longitude": -94.837165, + "city": "Rosendale", + "state": "MO", + "county": "Andrew" + }, + { + "zip_code": 64484, + "latitude": 39.592806, + "longitude": -95.037469, + "city": "Rushville", + "state": "MO", + "county": "Buchanan" + }, + { + "zip_code": 64485, + "latitude": 39.953094, + "longitude": -94.837827, + "city": "Savannah", + "state": "MO", + "county": "Andrew" + }, + { + "zip_code": 64486, + "latitude": 40.517058, + "longitude": -94.61484, + "city": "Sheridan", + "state": "MO", + "county": "Worth" + }, + { + "zip_code": 64487, + "latitude": 40.286914, + "longitude": -95.078313, + "city": "Skidmore", + "state": "MO", + "county": "Nodaway" + }, + { + "zip_code": 64489, + "latitude": 40.216886, + "longitude": -94.539859, + "city": "Stanberry", + "state": "MO", + "county": "Gentry" + }, + { + "zip_code": 64490, + "latitude": 39.798435, + "longitude": -94.517452, + "city": "Stewartsville", + "state": "MO", + "county": "Dekalb" + }, + { + "zip_code": 64491, + "latitude": 40.393783, + "longitude": -95.386166, + "city": "Tarkio", + "state": "MO", + "county": "Atchison" + }, + { + "zip_code": 64492, + "latitude": 39.503195, + "longitude": -94.525232, + "city": "Trimble", + "state": "MO", + "county": "Clinton" + }, + { + "zip_code": 64493, + "latitude": 39.656015, + "longitude": -94.385893, + "city": "Turney", + "state": "MO", + "county": "Clinton" + }, + { + "zip_code": 64494, + "latitude": 39.965872, + "longitude": -94.557711, + "city": "Union Star", + "state": "MO", + "county": "Dekalb" + }, + { + "zip_code": 64496, + "latitude": 40.423502, + "longitude": -95.476036, + "city": "Watson", + "state": "MO", + "county": "Atchison" + }, + { + "zip_code": 64497, + "latitude": 39.927682, + "longitude": -94.242906, + "city": "Weatherby", + "state": "MO", + "county": "Dekalb" + }, + { + "zip_code": 64498, + "latitude": 40.536073, + "longitude": -95.321135, + "city": "Westboro", + "state": "MO", + "county": "Atchison" + }, + { + "zip_code": 64499, + "latitude": 40.478118, + "longitude": -94.423294, + "city": "Worth", + "state": "MO", + "county": "Worth" + }, + { + "zip_code": 64501, + "latitude": 39.757494, + "longitude": -94.836598, + "city": "Saint Joseph", + "state": "MO", + "county": "Buchanan" + }, + { + "zip_code": 64502, + "latitude": 39.676333, + "longitude": -94.857364, + "city": "Saint Joseph", + "state": "MO", + "county": "Buchanan" + }, + { + "zip_code": 64503, + "latitude": 39.759092, + "longitude": -94.800879, + "city": "Saint Joseph", + "state": "MO", + "county": "Buchanan" + }, + { + "zip_code": 64504, + "latitude": 39.687683, + "longitude": -94.899901, + "city": "Saint Joseph", + "state": "MO", + "county": "Buchanan" + }, + { + "zip_code": 64505, + "latitude": 39.795418, + "longitude": -94.823192, + "city": "Saint Joseph", + "state": "MO", + "county": "Buchanan" + }, + { + "zip_code": 64506, + "latitude": 39.836488, + "longitude": -94.81526, + "city": "Saint Joseph", + "state": "MO", + "county": "Buchanan" + }, + { + "zip_code": 64507, + "latitude": 39.707229, + "longitude": -94.725917, + "city": "Saint Joseph", + "state": "MO", + "county": "Buchanan" + }, + { + "zip_code": 64508, + "latitude": 39.676333, + "longitude": -94.857364, + "city": "Saint Joseph", + "state": "MO", + "county": "Buchanan" + }, + { + "zip_code": 64601, + "latitude": 39.795225, + "longitude": -93.588876, + "city": "Chillicothe", + "state": "MO", + "county": "Livingston" + }, + { + "zip_code": 64620, + "latitude": 39.893337, + "longitude": -94.090928, + "city": "Altamont", + "state": "MO", + "county": "Daviess" + }, + { + "zip_code": 64622, + "latitude": 39.410971, + "longitude": -93.431928, + "city": "Bogard", + "state": "MO", + "county": "Carroll" + }, + { + "zip_code": 64623, + "latitude": 39.469659, + "longitude": -93.337526, + "city": "Bosworth", + "state": "MO", + "county": "Carroll" + }, + { + "zip_code": 64624, + "latitude": 39.598991, + "longitude": -93.828565, + "city": "Braymer", + "state": "MO", + "county": "Caldwell" + }, + { + "zip_code": 64625, + "latitude": 39.687628, + "longitude": -93.876612, + "city": "Breckenridge", + "state": "MO", + "county": "Caldwell" + }, + { + "zip_code": 64628, + "latitude": 39.822644, + "longitude": -93.116, + "city": "Brookfield", + "state": "MO", + "county": "Linn" + }, + { + "zip_code": 64630, + "latitude": 40.008344, + "longitude": -93.179382, + "city": "Browning", + "state": "MO", + "county": "Linn" + }, + { + "zip_code": 64631, + "latitude": 39.839738, + "longitude": -93.009571, + "city": "Bucklin", + "state": "MO", + "county": "Linn" + }, + { + "zip_code": 64632, + "latitude": 40.46136, + "longitude": -93.83198, + "city": "Cainsville", + "state": "MO", + "county": "Harrison" + }, + { + "zip_code": 64633, + "latitude": 39.405818, + "longitude": -93.425127, + "city": "Carrollton", + "state": "MO", + "county": "Carroll" + }, + { + "zip_code": 64635, + "latitude": 39.921825, + "longitude": -93.446294, + "city": "Chula", + "state": "MO", + "county": "Livingston" + }, + { + "zip_code": 64636, + "latitude": 40.104835, + "longitude": -93.990293, + "city": "Coffey", + "state": "MO", + "county": "Daviess" + }, + { + "zip_code": 64637, + "latitude": 39.590145, + "longitude": -93.941327, + "city": "Cowgill", + "state": "MO", + "county": "Caldwell" + }, + { + "zip_code": 64638, + "latitude": 39.666701, + "longitude": -93.603832, + "city": "Dawn", + "state": "MO", + "county": "Livingston" + }, + { + "zip_code": 64639, + "latitude": 39.383962, + "longitude": -93.223803, + "city": "De Witt", + "state": "MO", + "county": "Carroll" + }, + { + "zip_code": 64640, + "latitude": 39.897521, + "longitude": -93.934987, + "city": "Gallatin", + "state": "MO", + "county": "Daviess" + }, + { + "zip_code": 64641, + "latitude": 40.160044, + "longitude": -93.416387, + "city": "Galt", + "state": "MO", + "county": "Grundy" + }, + { + "zip_code": 64642, + "latitude": 40.010139, + "longitude": -93.927739, + "city": "Gilman City", + "state": "MO", + "county": "Daviess" + }, + { + "zip_code": 64643, + "latitude": 39.605442, + "longitude": -93.342669, + "city": "Hale", + "state": "MO", + "county": "Carroll" + }, + { + "zip_code": 64644, + "latitude": 39.719176, + "longitude": -94.002251, + "city": "Hamilton", + "state": "MO", + "county": "Caldwell" + }, + { + "zip_code": 64645, + "latitude": 40.209765, + "longitude": -93.111314, + "city": "Harris", + "state": "MO", + "county": "Sullivan" + }, + { + "zip_code": 64646, + "latitude": 40.209765, + "longitude": -93.111314, + "city": "Humphreys", + "state": "MO", + "county": "Sullivan" + }, + { + "zip_code": 64647, + "latitude": 40.023245, + "longitude": -93.93515, + "city": "Jameson", + "state": "MO", + "county": "Daviess" + }, + { + "zip_code": 64648, + "latitude": 39.988049, + "longitude": -93.838563, + "city": "Jamesport", + "state": "MO", + "county": "Daviess" + }, + { + "zip_code": 64649, + "latitude": 39.734774, + "longitude": -94.08478, + "city": "Kidder", + "state": "MO", + "county": "Caldwell" + }, + { + "zip_code": 64650, + "latitude": 39.633522, + "longitude": -94.078328, + "city": "Kingston", + "state": "MO", + "county": "Caldwell" + }, + { + "zip_code": 64651, + "latitude": 39.772169, + "longitude": -93.186626, + "city": "Laclede", + "state": "MO", + "county": "Linn" + }, + { + "zip_code": 64652, + "latitude": 40.036047, + "longitude": -93.446087, + "city": "Laredo", + "state": "MO", + "county": "Grundy" + }, + { + "zip_code": 64653, + "latitude": 39.886336, + "longitude": -93.205383, + "city": "Linneus", + "state": "MO", + "county": "Linn" + }, + { + "zip_code": 64654, + "latitude": 39.96054, + "longitude": -93.988865, + "city": "Lock Springs", + "state": "MO", + "county": "Daviess" + }, + { + "zip_code": 64655, + "latitude": 40.465883, + "longitude": -93.019815, + "city": "Lucerne", + "state": "MO", + "county": "Putnam" + }, + { + "zip_code": 64656, + "latitude": 39.654952, + "longitude": -93.686524, + "city": "Ludlow", + "state": "MO", + "county": "Livingston" + }, + { + "zip_code": 64657, + "latitude": 40.111077, + "longitude": -94.223134, + "city": "Mc Fall", + "state": "MO", + "county": "Gentry" + }, + { + "zip_code": 64658, + "latitude": 39.731085, + "longitude": -92.936247, + "city": "Marceline", + "state": "MO", + "county": "Linn" + }, + { + "zip_code": 64659, + "latitude": 39.795407, + "longitude": -93.295805, + "city": "Meadville", + "state": "MO", + "county": "Linn" + }, + { + "zip_code": 64660, + "latitude": 39.590245, + "longitude": -93.133852, + "city": "Mendon", + "state": "MO", + "county": "Chariton" + }, + { + "zip_code": 64661, + "latitude": 40.422119, + "longitude": -93.570687, + "city": "Mercer", + "state": "MO", + "county": "Mercer" + }, + { + "zip_code": 64664, + "latitude": 39.729002, + "longitude": -93.667032, + "city": "Mooresville", + "state": "MO", + "county": "Livingston" + }, + { + "zip_code": 64667, + "latitude": 40.23408, + "longitude": -93.288613, + "city": "Newtown", + "state": "MO", + "county": "Sullivan" + }, + { + "zip_code": 64668, + "latitude": 39.382851, + "longitude": -93.510329, + "city": "Norborne", + "state": "MO", + "county": "Carroll" + }, + { + "zip_code": 64670, + "latitude": 40.033605, + "longitude": -94.088967, + "city": "Pattonsburg", + "state": "MO", + "county": "Daviess" + }, + { + "zip_code": 64671, + "latitude": 39.579927, + "longitude": -94.050144, + "city": "Polo", + "state": "MO", + "county": "Caldwell" + }, + { + "zip_code": 64672, + "latitude": 40.465883, + "longitude": -93.019815, + "city": "Powersville", + "state": "MO", + "county": "Putnam" + }, + { + "zip_code": 64673, + "latitude": 40.406448, + "longitude": -93.584314, + "city": "Princeton", + "state": "MO", + "county": "Mercer" + }, + { + "zip_code": 64674, + "latitude": 39.964179, + "longitude": -93.152305, + "city": "Purdin", + "state": "MO", + "county": "Linn" + }, + { + "zip_code": 64676, + "latitude": 39.653615, + "longitude": -93.062349, + "city": "Rothville", + "state": "MO", + "county": "Chariton" + }, + { + "zip_code": 64679, + "latitude": 40.21786, + "longitude": -93.589114, + "city": "Spickard", + "state": "MO", + "county": "Grundy" + }, + { + "zip_code": 64680, + "latitude": 39.410971, + "longitude": -93.431928, + "city": "Stet", + "state": "MO", + "county": "Carroll" + }, + { + "zip_code": 64681, + "latitude": 39.656057, + "longitude": -93.243509, + "city": "Sumner", + "state": "MO", + "county": "Chariton" + }, + { + "zip_code": 64682, + "latitude": 39.410971, + "longitude": -93.431928, + "city": "Tina", + "state": "MO", + "county": "Carroll" + }, + { + "zip_code": 64683, + "latitude": 40.083658, + "longitude": -93.598888, + "city": "Trenton", + "state": "MO", + "county": "Grundy" + }, + { + "zip_code": 64686, + "latitude": 39.789418, + "longitude": -93.511055, + "city": "Utica", + "state": "MO", + "county": "Livingston" + }, + { + "zip_code": 64687, + "latitude": 39.315544, + "longitude": -93.377455, + "city": "Wakenda", + "state": "MO", + "county": "Carroll" + }, + { + "zip_code": 64688, + "latitude": 39.871946, + "longitude": -93.397106, + "city": "Wheeling", + "state": "MO", + "county": "Livingston" + }, + { + "zip_code": 64689, + "latitude": 39.874071, + "longitude": -94.153677, + "city": "Winston", + "state": "MO", + "county": "Daviess" + }, + { + "zip_code": 64701, + "latitude": 38.615239, + "longitude": -94.321556, + "city": "Harrisonville", + "state": "MO", + "county": "Cass" + }, + { + "zip_code": 64720, + "latitude": 38.397029, + "longitude": -94.380375, + "city": "Adrian", + "state": "MO", + "county": "Bates" + }, + { + "zip_code": 64722, + "latitude": 38.251879, + "longitude": -94.331993, + "city": "Amoret", + "state": "MO", + "county": "Bates" + }, + { + "zip_code": 64723, + "latitude": 38.251879, + "longitude": -94.331993, + "city": "Amsterdam", + "state": "MO", + "county": "Bates" + }, + { + "zip_code": 64724, + "latitude": 38.167943, + "longitude": -93.882831, + "city": "Appleton City", + "state": "MO", + "county": "Saint Clair" + }, + { + "zip_code": 64725, + "latitude": 38.521563, + "longitude": -94.352149, + "city": "Archie", + "state": "MO", + "county": "Cass" + }, + { + "zip_code": 64726, + "latitude": 38.388723, + "longitude": -93.924453, + "city": "Blairstown", + "state": "MO", + "county": "Henry" + }, + { + "zip_code": 64728, + "latitude": 37.693038, + "longitude": -94.466251, + "city": "Bronaugh", + "state": "MO", + "county": "Vernon" + }, + { + "zip_code": 64730, + "latitude": 38.241174, + "longitude": -94.3491, + "city": "Butler", + "state": "MO", + "county": "Bates" + }, + { + "zip_code": 64733, + "latitude": 38.621259, + "longitude": -93.8462, + "city": "Chilhowee", + "state": "MO", + "county": "Johnson" + }, + { + "zip_code": 64734, + "latitude": 38.655025, + "longitude": -94.559725, + "city": "Cleveland", + "state": "MO", + "county": "Cass" + }, + { + "zip_code": 64735, + "latitude": 38.401811, + "longitude": -93.785012, + "city": "Clinton", + "state": "MO", + "county": "Henry" + }, + { + "zip_code": 64738, + "latitude": 37.898354, + "longitude": -93.620259, + "city": "Collins", + "state": "MO", + "county": "Saint Clair" + }, + { + "zip_code": 64739, + "latitude": 38.510491, + "longitude": -94.130557, + "city": "Creighton", + "state": "MO", + "county": "Cass" + }, + { + "zip_code": 64740, + "latitude": 38.243827, + "longitude": -93.788188, + "city": "Deepwater", + "state": "MO", + "county": "Henry" + }, + { + "zip_code": 64741, + "latitude": 37.849889, + "longitude": -94.338133, + "city": "Deerfield", + "state": "MO", + "county": "Vernon" + }, + { + "zip_code": 64742, + "latitude": 38.476542, + "longitude": -94.580083, + "city": "Drexel", + "state": "MO", + "county": "Bates" + }, + { + "zip_code": 64743, + "latitude": 38.668158, + "longitude": -94.233336, + "city": "East Lynne", + "state": "MO", + "county": "Cass" + }, + { + "zip_code": 64744, + "latitude": 37.865205, + "longitude": -94.012373, + "city": "El Dorado Springs", + "state": "MO", + "county": "Cedar" + }, + { + "zip_code": 64745, + "latitude": 38.251879, + "longitude": -94.331993, + "city": "Foster", + "state": "MO", + "county": "Bates" + }, + { + "zip_code": 64746, + "latitude": 38.576898, + "longitude": -94.400181, + "city": "Freeman", + "state": "MO", + "county": "Cass" + }, + { + "zip_code": 64747, + "latitude": 38.57134, + "longitude": -94.360846, + "city": "Garden City", + "state": "MO", + "county": "Cass" + }, + { + "zip_code": 64748, + "latitude": 37.417327, + "longitude": -94.144032, + "city": "Golden City", + "state": "MO", + "county": "Barton" + }, + { + "zip_code": 64750, + "latitude": 37.849889, + "longitude": -94.338133, + "city": "Harwood", + "state": "MO", + "county": "Vernon" + }, + { + "zip_code": 64751, + "latitude": 37.849889, + "longitude": -94.338133, + "city": "Horton", + "state": "MO", + "county": "Vernon" + }, + { + "zip_code": 64752, + "latitude": 38.125999, + "longitude": -94.547035, + "city": "Hume", + "state": "MO", + "county": "Bates" + }, + { + "zip_code": 64755, + "latitude": 37.211097, + "longitude": -94.289465, + "city": "Jasper", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64756, + "latitude": 37.618851, + "longitude": -94.010074, + "city": "Jerico Springs", + "state": "MO", + "county": "Cedar" + }, + { + "zip_code": 64759, + "latitude": 37.519054, + "longitude": -94.336385, + "city": "Lamar", + "state": "MO", + "county": "Barton" + }, + { + "zip_code": 64761, + "latitude": 38.623836, + "longitude": -93.67341, + "city": "Leeton", + "state": "MO", + "county": "Johnson" + }, + { + "zip_code": 64762, + "latitude": 37.515295, + "longitude": -94.509371, + "city": "Liberal", + "state": "MO", + "county": "Barton" + }, + { + "zip_code": 64763, + "latitude": 38.141625, + "longitude": -93.725048, + "city": "Lowry City", + "state": "MO", + "county": "Saint Clair" + }, + { + "zip_code": 64765, + "latitude": 37.849889, + "longitude": -94.338133, + "city": "Metz", + "state": "MO", + "county": "Vernon" + }, + { + "zip_code": 64766, + "latitude": 37.501451, + "longitude": -94.345591, + "city": "Milford", + "state": "MO", + "county": "Barton" + }, + { + "zip_code": 64767, + "latitude": 37.849889, + "longitude": -94.338133, + "city": "Milo", + "state": "MO", + "county": "Vernon" + }, + { + "zip_code": 64769, + "latitude": 37.471409, + "longitude": -94.554307, + "city": "Mindenmines", + "state": "MO", + "county": "Barton" + }, + { + "zip_code": 64770, + "latitude": 38.283423, + "longitude": -93.972124, + "city": "Montrose", + "state": "MO", + "county": "Henry" + }, + { + "zip_code": 64771, + "latitude": 37.764889, + "longitude": -94.453255, + "city": "Moundville", + "state": "MO", + "county": "Vernon" + }, + { + "zip_code": 64772, + "latitude": 37.776465, + "longitude": -94.386553, + "city": "Nevada", + "state": "MO", + "county": "Vernon" + }, + { + "zip_code": 64776, + "latitude": 38.067372, + "longitude": -93.634122, + "city": "Osceola", + "state": "MO", + "county": "Saint Clair" + }, + { + "zip_code": 64777, + "latitude": 38.251879, + "longitude": -94.331993, + "city": "Passaic", + "state": "MO", + "county": "Bates" + }, + { + "zip_code": 64778, + "latitude": 37.693773, + "longitude": -94.46718, + "city": "Richards", + "state": "MO", + "county": "Vernon" + }, + { + "zip_code": 64779, + "latitude": 38.096228, + "longitude": -94.360832, + "city": "Rich Hill", + "state": "MO", + "county": "Bates" + }, + { + "zip_code": 64780, + "latitude": 38.251879, + "longitude": -94.331993, + "city": "Rockville", + "state": "MO", + "county": "Bates" + }, + { + "zip_code": 64781, + "latitude": 38.024133, + "longitude": -93.781478, + "city": "Roscoe", + "state": "MO", + "county": "Saint Clair" + }, + { + "zip_code": 64783, + "latitude": 37.849889, + "longitude": -94.338133, + "city": "Schell City", + "state": "MO", + "county": "Vernon" + }, + { + "zip_code": 64784, + "latitude": 37.658203, + "longitude": -94.295103, + "city": "Sheldon", + "state": "MO", + "county": "Vernon" + }, + { + "zip_code": 64788, + "latitude": 38.403809, + "longitude": -93.989228, + "city": "Urich", + "state": "MO", + "county": "Henry" + }, + { + "zip_code": 64789, + "latitude": 38.024133, + "longitude": -93.781478, + "city": "Vista", + "state": "MO", + "county": "Saint Clair" + }, + { + "zip_code": 64790, + "latitude": 37.898554, + "longitude": -94.229787, + "city": "Walker", + "state": "MO", + "county": "Vernon" + }, + { + "zip_code": 64801, + "latitude": 37.113343, + "longitude": -94.502663, + "city": "Joplin", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64802, + "latitude": 37.206219, + "longitude": -94.335453, + "city": "Joplin", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64803, + "latitude": 37.206219, + "longitude": -94.335453, + "city": "Joplin", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64804, + "latitude": 37.099335, + "longitude": -94.374452, + "city": "Joplin", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64830, + "latitude": 37.236677, + "longitude": -94.417984, + "city": "Alba", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64831, + "latitude": 36.666988, + "longitude": -94.419201, + "city": "Anderson", + "state": "MO", + "county": "Mcdonald" + }, + { + "zip_code": 64832, + "latitude": 37.266718, + "longitude": -94.517971, + "city": "Asbury", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64833, + "latitude": 37.194801, + "longitude": -94.145193, + "city": "Avilla", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64834, + "latitude": 37.188074, + "longitude": -94.337616, + "city": "Carl Junction", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64835, + "latitude": 37.146258, + "longitude": -94.43545, + "city": "Carterville", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64836, + "latitude": 37.182292, + "longitude": -94.314002, + "city": "Carthage", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64840, + "latitude": 36.930776, + "longitude": -94.248796, + "city": "Diamond", + "state": "MO", + "county": "Newton" + }, + { + "zip_code": 64841, + "latitude": 37.076045, + "longitude": -94.407063, + "city": "Duenweg", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64842, + "latitude": 36.878779, + "longitude": -94.190596, + "city": "Fairview", + "state": "MO", + "county": "Newton" + }, + { + "zip_code": 64843, + "latitude": 36.738049, + "longitude": -94.409579, + "city": "Goodman", + "state": "MO", + "county": "Mcdonald" + }, + { + "zip_code": 64844, + "latitude": 36.905518, + "longitude": -94.253163, + "city": "Granby", + "state": "MO", + "county": "Newton" + }, + { + "zip_code": 64847, + "latitude": 36.608799, + "longitude": -94.450609, + "city": "Lanagan", + "state": "MO", + "county": "Mcdonald" + }, + { + "zip_code": 64848, + "latitude": 37.164327, + "longitude": -94.073527, + "city": "La Russell", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64849, + "latitude": 37.252361, + "longitude": -94.431555, + "city": "Neck City", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64850, + "latitude": 36.904539, + "longitude": -94.372328, + "city": "Neosho", + "state": "MO", + "county": "Newton" + }, + { + "zip_code": 64853, + "latitude": 36.828416, + "longitude": -94.152072, + "city": "Newtonia", + "state": "MO", + "county": "Newton" + }, + { + "zip_code": 64854, + "latitude": 36.579739, + "longitude": -94.457864, + "city": "Noel", + "state": "MO", + "county": "Mcdonald" + }, + { + "zip_code": 64855, + "latitude": 37.271703, + "longitude": -94.486518, + "city": "Oronogo", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64856, + "latitude": 36.573955, + "longitude": -94.377022, + "city": "Pineville", + "state": "MO", + "county": "Mcdonald" + }, + { + "zip_code": 64857, + "latitude": 37.216855, + "longitude": -94.374764, + "city": "Purcell", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64858, + "latitude": 36.90103, + "longitude": -94.532109, + "city": "Racine", + "state": "MO", + "county": "Newton" + }, + { + "zip_code": 64859, + "latitude": 37.165311, + "longitude": -94.248598, + "city": "Reeds", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64861, + "latitude": 36.632573, + "longitude": -94.342802, + "city": "Rocky Comfort", + "state": "MO", + "county": "Mcdonald" + }, + { + "zip_code": 64862, + "latitude": 37.159934, + "longitude": -94.156371, + "city": "Sarcoxie", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64863, + "latitude": 36.621335, + "longitude": -94.512968, + "city": "South West City", + "state": "MO", + "county": "Mcdonald" + }, + { + "zip_code": 64864, + "latitude": 36.902332, + "longitude": -94.338957, + "city": "Saginaw", + "state": "MO", + "county": "Newton" + }, + { + "zip_code": 64865, + "latitude": 36.878572, + "longitude": -94.345348, + "city": "Seneca", + "state": "MO", + "county": "Newton" + }, + { + "zip_code": 64866, + "latitude": 36.868113, + "longitude": -94.137992, + "city": "Stark City", + "state": "MO", + "county": "Newton" + }, + { + "zip_code": 64867, + "latitude": 36.814525, + "longitude": -94.379315, + "city": "Stella", + "state": "MO", + "county": "Newton" + }, + { + "zip_code": 64868, + "latitude": 36.632573, + "longitude": -94.342802, + "city": "Tiff City", + "state": "MO", + "county": "Mcdonald" + }, + { + "zip_code": 64869, + "latitude": 37.206219, + "longitude": -94.335453, + "city": "Waco", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64870, + "latitude": 37.185063, + "longitude": -94.330289, + "city": "Webb City", + "state": "MO", + "county": "Jasper" + }, + { + "zip_code": 64873, + "latitude": 36.982951, + "longitude": -94.187929, + "city": "Wentworth", + "state": "MO", + "county": "Newton" + }, + { + "zip_code": 64874, + "latitude": 36.761726, + "longitude": -94.054723, + "city": "Wheaton", + "state": "MO", + "county": "Barry" + }, + { + "zip_code": 64944, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 64999, + "latitude": 39.035038, + "longitude": -94.356728, + "city": "Kansas City", + "state": "MO", + "county": "Jackson" + }, + { + "zip_code": 65001, + "latitude": 38.498027, + "longitude": -91.918023, + "city": "Argyle", + "state": "MO", + "county": "Osage" + }, + { + "zip_code": 65010, + "latitude": 38.781337, + "longitude": -92.265908, + "city": "Ashland", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65011, + "latitude": 38.373142, + "longitude": -92.715162, + "city": "Barnett", + "state": "MO", + "county": "Morgan" + }, + { + "zip_code": 65013, + "latitude": 38.204321, + "longitude": -91.756633, + "city": "Belle", + "state": "MO", + "county": "Maries" + }, + { + "zip_code": 65014, + "latitude": 38.393844, + "longitude": -91.520173, + "city": "Bland", + "state": "MO", + "county": "Gasconade" + }, + { + "zip_code": 65016, + "latitude": 38.498027, + "longitude": -91.918023, + "city": "Bonnots Mill", + "state": "MO", + "county": "Osage" + }, + { + "zip_code": 65017, + "latitude": 38.187229, + "longitude": -92.499823, + "city": "Brumley", + "state": "MO", + "county": "Miller" + }, + { + "zip_code": 65018, + "latitude": 38.625055, + "longitude": -92.550973, + "city": "California", + "state": "MO", + "county": "Moniteau" + }, + { + "zip_code": 65020, + "latitude": 38.024609, + "longitude": -92.744846, + "city": "Camdenton", + "state": "MO", + "county": "Camden" + }, + { + "zip_code": 65022, + "latitude": 38.599175, + "longitude": -92.178057, + "city": "Cedar City", + "state": "MO", + "county": "Callaway" + }, + { + "zip_code": 65023, + "latitude": 38.595556, + "longitude": -92.370285, + "city": "Centertown", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65024, + "latitude": 38.606181, + "longitude": -91.738215, + "city": "Chamois", + "state": "MO", + "county": "Osage" + }, + { + "zip_code": 65025, + "latitude": 38.635322, + "longitude": -92.584502, + "city": "Clarksburg", + "state": "MO", + "county": "Moniteau" + }, + { + "zip_code": 65026, + "latitude": 38.320057, + "longitude": -92.478035, + "city": "Eldon", + "state": "MO", + "county": "Miller" + }, + { + "zip_code": 65031, + "latitude": 38.223649, + "longitude": -92.438629, + "city": "Etterville", + "state": "MO", + "county": "Miller" + }, + { + "zip_code": 65032, + "latitude": 38.393423, + "longitude": -92.363038, + "city": "Eugene", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65034, + "latitude": 38.545388, + "longitude": -92.760087, + "city": "Fortuna", + "state": "MO", + "county": "Moniteau" + }, + { + "zip_code": 65035, + "latitude": 38.395172, + "longitude": -91.956786, + "city": "Freeburg", + "state": "MO", + "county": "Osage" + }, + { + "zip_code": 65036, + "latitude": 38.670303, + "longitude": -91.559163, + "city": "Gasconade", + "state": "MO", + "county": "Gasconade" + }, + { + "zip_code": 65037, + "latitude": 38.26795, + "longitude": -92.847886, + "city": "Gravois Mills", + "state": "MO", + "county": "Morgan" + }, + { + "zip_code": 65038, + "latitude": 38.196429, + "longitude": -92.867804, + "city": "Laurie", + "state": "MO", + "county": "Morgan" + }, + { + "zip_code": 65039, + "latitude": 38.72719, + "longitude": -92.301413, + "city": "Hartsburg", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65040, + "latitude": 38.390269, + "longitude": -92.312425, + "city": "Henley", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65041, + "latitude": 38.587608, + "longitude": -91.499131, + "city": "Hermann", + "state": "MO", + "county": "Gasconade" + }, + { + "zip_code": 65042, + "latitude": 38.674914, + "longitude": -92.610941, + "city": "High Point", + "state": "MO", + "county": "Moniteau" + }, + { + "zip_code": 65043, + "latitude": 38.658869, + "longitude": -92.110858, + "city": "Holts Summit", + "state": "MO", + "county": "Callaway" + }, + { + "zip_code": 65046, + "latitude": 38.771269, + "longitude": -92.481749, + "city": "Jamestown", + "state": "MO", + "county": "Moniteau" + }, + { + "zip_code": 65047, + "latitude": 38.172743, + "longitude": -92.557722, + "city": "Kaiser", + "state": "MO", + "county": "Miller" + }, + { + "zip_code": 65048, + "latitude": 38.498027, + "longitude": -91.918023, + "city": "Koeltztown", + "state": "MO", + "county": "Osage" + }, + { + "zip_code": 65049, + "latitude": 38.113071, + "longitude": -92.682496, + "city": "Lake Ozark", + "state": "MO", + "county": "Camden" + }, + { + "zip_code": 65050, + "latitude": 38.546636, + "longitude": -92.681747, + "city": "Latham", + "state": "MO", + "county": "Moniteau" + }, + { + "zip_code": 65051, + "latitude": 38.497711, + "longitude": -91.787954, + "city": "Linn", + "state": "MO", + "county": "Osage" + }, + { + "zip_code": 65052, + "latitude": 38.058544, + "longitude": -92.719289, + "city": "Linn Creek", + "state": "MO", + "county": "Camden" + }, + { + "zip_code": 65053, + "latitude": 38.54395, + "longitude": -92.375577, + "city": "Lohman", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65054, + "latitude": 38.498027, + "longitude": -91.918023, + "city": "Loose Creek", + "state": "MO", + "county": "Osage" + }, + { + "zip_code": 65055, + "latitude": 38.674914, + "longitude": -92.610941, + "city": "Mc Girk", + "state": "MO", + "county": "Moniteau" + }, + { + "zip_code": 65058, + "latitude": 38.314864, + "longitude": -92.127749, + "city": "Meta", + "state": "MO", + "county": "Osage" + }, + { + "zip_code": 65059, + "latitude": 38.705147, + "longitude": -91.89325, + "city": "Mokane", + "state": "MO", + "county": "Callaway" + }, + { + "zip_code": 65061, + "latitude": 38.488169, + "longitude": -91.599416, + "city": "Morrison", + "state": "MO", + "county": "Gasconade" + }, + { + "zip_code": 65062, + "latitude": 38.484502, + "longitude": -91.621808, + "city": "Mount Sterling", + "state": "MO", + "county": "Gasconade" + }, + { + "zip_code": 65063, + "latitude": 38.730467, + "longitude": -92.08044, + "city": "New Bloomfield", + "state": "MO", + "county": "Callaway" + }, + { + "zip_code": 65064, + "latitude": 38.397892, + "longitude": -92.488014, + "city": "Olean", + "state": "MO", + "county": "Miller" + }, + { + "zip_code": 65065, + "latitude": 38.131001, + "longitude": -92.671943, + "city": "Osage Beach", + "state": "MO", + "county": "Camden" + }, + { + "zip_code": 65066, + "latitude": 38.360691, + "longitude": -91.477511, + "city": "Owensville", + "state": "MO", + "county": "Gasconade" + }, + { + "zip_code": 65067, + "latitude": 38.770559, + "longitude": -91.713568, + "city": "Portland", + "state": "MO", + "county": "Callaway" + }, + { + "zip_code": 65068, + "latitude": 38.819678, + "longitude": -92.606295, + "city": "Prairie Home", + "state": "MO", + "county": "Cooper" + }, + { + "zip_code": 65069, + "latitude": 38.794225, + "longitude": -91.573653, + "city": "Rhineland", + "state": "MO", + "county": "Montgomery" + }, + { + "zip_code": 65072, + "latitude": 38.265465, + "longitude": -92.734795, + "city": "Rocky Mount", + "state": "MO", + "county": "Morgan" + }, + { + "zip_code": 65074, + "latitude": 38.485106, + "longitude": -92.409339, + "city": "Russellville", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65075, + "latitude": 38.251613, + "longitude": -92.254481, + "city": "Saint Elizabeth", + "state": "MO", + "county": "Miller" + }, + { + "zip_code": 65076, + "latitude": 38.421857, + "longitude": -92.317745, + "city": "Saint Thomas", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65077, + "latitude": 38.764377, + "longitude": -91.798654, + "city": "Steedman", + "state": "MO", + "county": "Callaway" + }, + { + "zip_code": 65078, + "latitude": 38.437941, + "longitude": -92.995989, + "city": "Stover", + "state": "MO", + "county": "Morgan" + }, + { + "zip_code": 65079, + "latitude": 38.164874, + "longitude": -92.720128, + "city": "Sunrise Beach", + "state": "MO", + "county": "Camden" + }, + { + "zip_code": 65080, + "latitude": 38.635304, + "longitude": -91.99659, + "city": "Tebbetts", + "state": "MO", + "county": "Callaway" + }, + { + "zip_code": 65081, + "latitude": 38.656781, + "longitude": -92.661396, + "city": "Tipton", + "state": "MO", + "county": "Moniteau" + }, + { + "zip_code": 65082, + "latitude": 38.21813, + "longitude": -92.446098, + "city": "Tuscumbia", + "state": "MO", + "county": "Miller" + }, + { + "zip_code": 65083, + "latitude": 38.150536, + "longitude": -92.43301, + "city": "Ulman", + "state": "MO", + "county": "Miller" + }, + { + "zip_code": 65084, + "latitude": 38.420142, + "longitude": -92.835322, + "city": "Versailles", + "state": "MO", + "county": "Morgan" + }, + { + "zip_code": 65085, + "latitude": 38.406348, + "longitude": -92.049397, + "city": "Westphalia", + "state": "MO", + "county": "Osage" + }, + { + "zip_code": 65101, + "latitude": 38.494029, + "longitude": -92.165194, + "city": "Jefferson City", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65102, + "latitude": 38.530921, + "longitude": -92.249342, + "city": "Jefferson City", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65103, + "latitude": 38.530921, + "longitude": -92.249342, + "city": "Jefferson City", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65104, + "latitude": 38.530921, + "longitude": -92.249342, + "city": "Jefferson City", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65105, + "latitude": 38.530921, + "longitude": -92.249342, + "city": "Jefferson City", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65106, + "latitude": 38.530921, + "longitude": -92.249342, + "city": "Jefferson City", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65107, + "latitude": 38.530921, + "longitude": -92.249342, + "city": "Jefferson City", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65108, + "latitude": 38.530921, + "longitude": -92.249342, + "city": "Jefferson City", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65109, + "latitude": 38.550219, + "longitude": -92.299267, + "city": "Jefferson City", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65110, + "latitude": 38.530921, + "longitude": -92.249342, + "city": "Jefferson City", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65111, + "latitude": 38.530921, + "longitude": -92.249342, + "city": "Jefferson City", + "state": "MO", + "county": "Cole" + }, + { + "zip_code": 65201, + "latitude": 38.894165, + "longitude": -92.274145, + "city": "Columbia", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65202, + "latitude": 39.015904, + "longitude": -92.311885, + "city": "Columbia", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65203, + "latitude": 38.88248, + "longitude": -92.397824, + "city": "Columbia", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65205, + "latitude": 39.044719, + "longitude": -92.349574, + "city": "Columbia", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65211, + "latitude": 38.903318, + "longitude": -92.102153, + "city": "Columbia", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65212, + "latitude": 38.937608, + "longitude": -92.33043, + "city": "Columbia", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65215, + "latitude": 38.953238, + "longitude": -92.320783, + "city": "Columbia", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65216, + "latitude": 38.903318, + "longitude": -92.102153, + "city": "Columbia", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65217, + "latitude": 38.903318, + "longitude": -92.102153, + "city": "Columbia", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65218, + "latitude": 38.903318, + "longitude": -92.102153, + "city": "Columbia", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65230, + "latitude": 39.242532, + "longitude": -92.69974, + "city": "Armstrong", + "state": "MO", + "county": "Howard" + }, + { + "zip_code": 65231, + "latitude": 39.008551, + "longitude": -91.911773, + "city": "Auxvasse", + "state": "MO", + "county": "Callaway" + }, + { + "zip_code": 65232, + "latitude": 39.156071, + "longitude": -91.755227, + "city": "Benton City", + "state": "MO", + "county": "Audrain" + }, + { + "zip_code": 65233, + "latitude": 38.884444, + "longitude": -92.733329, + "city": "Boonville", + "state": "MO", + "county": "Cooper" + }, + { + "zip_code": 65236, + "latitude": 39.425365, + "longitude": -93.128077, + "city": "Brunswick", + "state": "MO", + "county": "Chariton" + }, + { + "zip_code": 65237, + "latitude": 38.759637, + "longitude": -92.790412, + "city": "Bunceton", + "state": "MO", + "county": "Cooper" + }, + { + "zip_code": 65239, + "latitude": 39.534445, + "longitude": -92.470668, + "city": "Cairo", + "state": "MO", + "county": "Randolph" + }, + { + "zip_code": 65240, + "latitude": 39.143437, + "longitude": -92.179684, + "city": "Centralia", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65243, + "latitude": 39.295025, + "longitude": -92.374105, + "city": "Clark", + "state": "MO", + "county": "Randolph" + }, + { + "zip_code": 65244, + "latitude": 39.428482, + "longitude": -92.504195, + "city": "Clifton Hill", + "state": "MO", + "county": "Randolph" + }, + { + "zip_code": 65246, + "latitude": 39.464326, + "longitude": -92.988621, + "city": "Dalton", + "state": "MO", + "county": "Chariton" + }, + { + "zip_code": 65247, + "latitude": 39.638988, + "longitude": -92.46581, + "city": "Excello", + "state": "MO", + "county": "Macon" + }, + { + "zip_code": 65248, + "latitude": 39.149242, + "longitude": -92.673441, + "city": "Fayette", + "state": "MO", + "county": "Howard" + }, + { + "zip_code": 65250, + "latitude": 39.04337, + "longitude": -92.827618, + "city": "Franklin", + "state": "MO", + "county": "Howard" + }, + { + "zip_code": 65251, + "latitude": 38.830203, + "longitude": -91.966756, + "city": "Fulton", + "state": "MO", + "county": "Callaway" + }, + { + "zip_code": 65254, + "latitude": 39.159075, + "longitude": -92.826306, + "city": "Glasgow", + "state": "MO", + "county": "Howard" + }, + { + "zip_code": 65255, + "latitude": 39.102338, + "longitude": -92.240267, + "city": "Hallsville", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65256, + "latitude": 39.148359, + "longitude": -92.425698, + "city": "Harrisburg", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65257, + "latitude": 39.307179, + "longitude": -92.5135, + "city": "Higbee", + "state": "MO", + "county": "Randolph" + }, + { + "zip_code": 65258, + "latitude": 39.488707, + "longitude": -92.149089, + "city": "Holliday", + "state": "MO", + "county": "Monroe" + }, + { + "zip_code": 65259, + "latitude": 39.470411, + "longitude": -92.504087, + "city": "Huntsville", + "state": "MO", + "county": "Randolph" + }, + { + "zip_code": 65260, + "latitude": 39.60614, + "longitude": -92.361437, + "city": "Jacksonville", + "state": "MO", + "county": "Randolph" + }, + { + "zip_code": 65261, + "latitude": 39.425165, + "longitude": -92.908657, + "city": "Keytesville", + "state": "MO", + "county": "Chariton" + }, + { + "zip_code": 65262, + "latitude": 38.959176, + "longitude": -91.92418, + "city": "Kingdom City", + "state": "MO", + "county": "Callaway" + }, + { + "zip_code": 65263, + "latitude": 39.471942, + "longitude": -92.206875, + "city": "Madison", + "state": "MO", + "county": "Monroe" + }, + { + "zip_code": 65264, + "latitude": 39.11089, + "longitude": -91.702079, + "city": "Martinsburg", + "state": "MO", + "county": "Audrain" + }, + { + "zip_code": 65265, + "latitude": 39.201449, + "longitude": -91.838271, + "city": "Mexico", + "state": "MO", + "county": "Audrain" + }, + { + "zip_code": 65270, + "latitude": 39.425513, + "longitude": -92.428348, + "city": "Moberly", + "state": "MO", + "county": "Randolph" + }, + { + "zip_code": 65274, + "latitude": 39.095462, + "longitude": -92.705966, + "city": "New Franklin", + "state": "MO", + "county": "Howard" + }, + { + "zip_code": 65275, + "latitude": 39.467456, + "longitude": -92.017068, + "city": "Paris", + "state": "MO", + "county": "Monroe" + }, + { + "zip_code": 65276, + "latitude": 38.849273, + "longitude": -92.926931, + "city": "Pilot Grove", + "state": "MO", + "county": "Cooper" + }, + { + "zip_code": 65278, + "latitude": 39.341357, + "longitude": -92.410961, + "city": "Renick", + "state": "MO", + "county": "Randolph" + }, + { + "zip_code": 65279, + "latitude": 38.996588, + "longitude": -92.50403, + "city": "Rocheport", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65280, + "latitude": 39.211548, + "longitude": -91.708681, + "city": "Rush Hill", + "state": "MO", + "county": "Audrain" + }, + { + "zip_code": 65281, + "latitude": 39.425568, + "longitude": -92.802909, + "city": "Salisbury", + "state": "MO", + "county": "Chariton" + }, + { + "zip_code": 65282, + "latitude": 39.360312, + "longitude": -91.865315, + "city": "Santa Fe", + "state": "MO", + "county": "Monroe" + }, + { + "zip_code": 65283, + "latitude": 39.481463, + "longitude": -91.848796, + "city": "Stoutsville", + "state": "MO", + "county": "Monroe" + }, + { + "zip_code": 65284, + "latitude": 39.180874, + "longitude": -92.327183, + "city": "Sturgeon", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65285, + "latitude": 39.212787, + "longitude": -92.004617, + "city": "Thompson", + "state": "MO", + "county": "Audrain" + }, + { + "zip_code": 65286, + "latitude": 39.499974, + "longitude": -93.193552, + "city": "Triplett", + "state": "MO", + "county": "Chariton" + }, + { + "zip_code": 65287, + "latitude": 38.898275, + "longitude": -92.566685, + "city": "Wooldridge", + "state": "MO", + "county": "Cooper" + }, + { + "zip_code": 65299, + "latitude": 38.903318, + "longitude": -92.102153, + "city": "Columbia", + "state": "MO", + "county": "Boone" + }, + { + "zip_code": 65301, + "latitude": 38.703138, + "longitude": -93.240166, + "city": "Sedalia", + "state": "MO", + "county": "Pettis" + }, + { + "zip_code": 65302, + "latitude": 38.724577, + "longitude": -93.281672, + "city": "Sedalia", + "state": "MO", + "county": "Pettis" + }, + { + "zip_code": 65305, + "latitude": 38.731819, + "longitude": -93.573071, + "city": "Whiteman Air Force Base", + "state": "MO", + "county": "Johnson" + }, + { + "zip_code": 65320, + "latitude": 39.069352, + "longitude": -92.948668, + "city": "Arrow Rock", + "state": "MO", + "county": "Saline" + }, + { + "zip_code": 65321, + "latitude": 39.105316, + "longitude": -93.484742, + "city": "Blackburn", + "state": "MO", + "county": "Saline" + }, + { + "zip_code": 65322, + "latitude": 38.940391, + "longitude": -92.868132, + "city": "Blackwater", + "state": "MO", + "county": "Cooper" + }, + { + "zip_code": 65323, + "latitude": 38.454863, + "longitude": -93.608588, + "city": "Calhoun", + "state": "MO", + "county": "Henry" + }, + { + "zip_code": 65324, + "latitude": 38.101843, + "longitude": -93.053635, + "city": "Climax Springs", + "state": "MO", + "county": "Camden" + }, + { + "zip_code": 65325, + "latitude": 38.337832, + "longitude": -93.314592, + "city": "Cole Camp", + "state": "MO", + "county": "Benton" + }, + { + "zip_code": 65326, + "latitude": 38.298955, + "longitude": -93.291274, + "city": "Edwards", + "state": "MO", + "county": "Benton" + }, + { + "zip_code": 65327, + "latitude": 38.974573, + "longitude": -93.503803, + "city": "Emma", + "state": "MO", + "county": "Lafayette" + }, + { + "zip_code": 65329, + "latitude": 38.608009, + "longitude": -92.982845, + "city": "Florence", + "state": "MO", + "county": "Morgan" + }, + { + "zip_code": 65330, + "latitude": 39.232673, + "longitude": -93.004028, + "city": "Gilliam", + "state": "MO", + "county": "Saline" + }, + { + "zip_code": 65332, + "latitude": 38.605883, + "longitude": -93.40918, + "city": "Green Ridge", + "state": "MO", + "county": "Pettis" + }, + { + "zip_code": 65333, + "latitude": 38.854841, + "longitude": -93.313267, + "city": "Houstonia", + "state": "MO", + "county": "Pettis" + }, + { + "zip_code": 65334, + "latitude": 38.826683, + "longitude": -93.22994, + "city": "Hughesville", + "state": "MO", + "county": "Pettis" + }, + { + "zip_code": 65335, + "latitude": 38.503854, + "longitude": -93.323687, + "city": "Ionia", + "state": "MO", + "county": "Benton" + }, + { + "zip_code": 65336, + "latitude": 38.743365, + "longitude": -93.582884, + "city": "Knob Noster", + "state": "MO", + "county": "Johnson" + }, + { + "zip_code": 65337, + "latitude": 38.783542, + "longitude": -93.417093, + "city": "La Monte", + "state": "MO", + "county": "Pettis" + }, + { + "zip_code": 65338, + "latitude": 38.395302, + "longitude": -93.334544, + "city": "Lincoln", + "state": "MO", + "county": "Benton" + }, + { + "zip_code": 65339, + "latitude": 39.148119, + "longitude": -93.377596, + "city": "Malta Bend", + "state": "MO", + "county": "Saline" + }, + { + "zip_code": 65340, + "latitude": 39.161394, + "longitude": -93.244357, + "city": "Marshall", + "state": "MO", + "county": "Saline" + }, + { + "zip_code": 65344, + "latitude": 39.321402, + "longitude": -93.226114, + "city": "Miami", + "state": "MO", + "county": "Saline" + }, + { + "zip_code": 65345, + "latitude": 38.556891, + "longitude": -93.158732, + "city": "Mora", + "state": "MO", + "county": "Pettis" + }, + { + "zip_code": 65347, + "latitude": 39.029347, + "longitude": -92.992939, + "city": "Nelson", + "state": "MO", + "county": "Saline" + }, + { + "zip_code": 65348, + "latitude": 38.742077, + "longitude": -92.96287, + "city": "Otterville", + "state": "MO", + "county": "Cooper" + }, + { + "zip_code": 65349, + "latitude": 39.101211, + "longitude": -93.264214, + "city": "Slater", + "state": "MO", + "county": "Saline" + }, + { + "zip_code": 65350, + "latitude": 38.659963, + "longitude": -93.108757, + "city": "Smithton", + "state": "MO", + "county": "Pettis" + }, + { + "zip_code": 65351, + "latitude": 39.070204, + "longitude": -93.430344, + "city": "Sweet Springs", + "state": "MO", + "county": "Saline" + }, + { + "zip_code": 65354, + "latitude": 38.654746, + "longitude": -92.892923, + "city": "Syracuse", + "state": "MO", + "county": "Morgan" + }, + { + "zip_code": 65355, + "latitude": 38.31555, + "longitude": -93.327381, + "city": "Warsaw", + "state": "MO", + "county": "Benton" + }, + { + "zip_code": 65360, + "latitude": 38.488076, + "longitude": -93.588108, + "city": "Windsor", + "state": "MO", + "county": "Henry" + }, + { + "zip_code": 65401, + "latitude": 37.898204, + "longitude": -91.797641, + "city": "Rolla", + "state": "MO", + "county": "Phelps" + }, + { + "zip_code": 65402, + "latitude": 37.963208, + "longitude": -91.817936, + "city": "Rolla", + "state": "MO", + "county": "Phelps" + }, + { + "zip_code": 65409, + "latitude": 37.876191, + "longitude": -91.777182, + "city": "Rolla", + "state": "MO", + "county": "Phelps" + }, + { + "zip_code": 65433, + "latitude": 37.309426, + "longitude": -92.214372, + "city": "Bendavis", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65436, + "latitude": 37.615826, + "longitude": -91.906391, + "city": "Beulah", + "state": "MO", + "county": "Phelps" + }, + { + "zip_code": 65438, + "latitude": 36.997849, + "longitude": -91.494175, + "city": "Birch Tree", + "state": "MO", + "county": "Shannon" + }, + { + "zip_code": 65439, + "latitude": 37.505462, + "longitude": -90.845047, + "city": "Bixby", + "state": "MO", + "county": "Iron" + }, + { + "zip_code": 65440, + "latitude": 37.612779, + "longitude": -91.652493, + "city": "Boss", + "state": "MO", + "county": "Dent" + }, + { + "zip_code": 65441, + "latitude": 38.10595, + "longitude": -91.248694, + "city": "Bourbon", + "state": "MO", + "county": "Crawford" + }, + { + "zip_code": 65443, + "latitude": 38.148315, + "longitude": -92.101525, + "city": "Brinktown", + "state": "MO", + "county": "Maries" + }, + { + "zip_code": 65444, + "latitude": 37.384157, + "longitude": -92.077182, + "city": "Bucyrus", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65446, + "latitude": 37.866661, + "longitude": -91.279649, + "city": "Cherryville", + "state": "MO", + "county": "Crawford" + }, + { + "zip_code": 65449, + "latitude": 37.85671, + "longitude": -91.470109, + "city": "Cook Station", + "state": "MO", + "county": "Crawford" + }, + { + "zip_code": 65452, + "latitude": 37.944664, + "longitude": -92.26771, + "city": "Crocker", + "state": "MO", + "county": "Pulaski" + }, + { + "zip_code": 65453, + "latitude": 38.100081, + "longitude": -91.368908, + "city": "Cuba", + "state": "MO", + "county": "Crawford" + }, + { + "zip_code": 65456, + "latitude": 37.786953, + "longitude": -91.211555, + "city": "Davisville", + "state": "MO", + "county": "Crawford" + }, + { + "zip_code": 65457, + "latitude": 37.851231, + "longitude": -92.056898, + "city": "Devils Elbow", + "state": "MO", + "county": "Pulaski" + }, + { + "zip_code": 65459, + "latitude": 37.928603, + "longitude": -92.107438, + "city": "Dixon", + "state": "MO", + "county": "Pulaski" + }, + { + "zip_code": 65461, + "latitude": 37.705975, + "longitude": -92.006428, + "city": "Duke", + "state": "MO", + "county": "Phelps" + }, + { + "zip_code": 65462, + "latitude": 37.694596, + "longitude": -91.890325, + "city": "Edgar Springs", + "state": "MO", + "county": "Phelps" + }, + { + "zip_code": 65463, + "latitude": 37.769908, + "longitude": -92.74866, + "city": "Eldridge", + "state": "MO", + "county": "Laclede" + }, + { + "zip_code": 65464, + "latitude": 37.187845, + "longitude": -91.913367, + "city": "Elk Creek", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65466, + "latitude": 37.144556, + "longitude": -91.357626, + "city": "Eminence", + "state": "MO", + "county": "Shannon" + }, + { + "zip_code": 65468, + "latitude": 37.247968, + "longitude": -91.783379, + "city": "Eunice", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65470, + "latitude": 37.563472, + "longitude": -92.385957, + "city": "Falcon", + "state": "MO", + "county": "Laclede" + }, + { + "zip_code": 65473, + "latitude": 37.767687, + "longitude": -92.111975, + "city": "Fort Leonard Wood", + "state": "MO", + "county": "Pulaski" + }, + { + "zip_code": 65479, + "latitude": 37.307074, + "longitude": -91.73234, + "city": "Hartshorn", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65483, + "latitude": 37.305192, + "longitude": -91.946292, + "city": "Houston", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65484, + "latitude": 37.3599, + "longitude": -92.188628, + "city": "Huggins", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65486, + "latitude": 38.108574, + "longitude": -92.31017, + "city": "Iberia", + "state": "MO", + "county": "Miller" + }, + { + "zip_code": 65501, + "latitude": 37.603341, + "longitude": -91.481225, + "city": "Jadwin", + "state": "MO", + "county": "Dent" + }, + { + "zip_code": 65529, + "latitude": 37.924112, + "longitude": -91.983231, + "city": "Jerome", + "state": "MO", + "county": "Phelps" + }, + { + "zip_code": 65532, + "latitude": 37.603341, + "longitude": -91.481225, + "city": "Lake Spring", + "state": "MO", + "county": "Dent" + }, + { + "zip_code": 65534, + "latitude": 37.718409, + "longitude": -92.323916, + "city": "Laquey", + "state": "MO", + "county": "Pulaski" + }, + { + "zip_code": 65535, + "latitude": 38.074206, + "longitude": -91.265783, + "city": "Leasburg", + "state": "MO", + "county": "Crawford" + }, + { + "zip_code": 65536, + "latitude": 37.685459, + "longitude": -92.620542, + "city": "Lebanon", + "state": "MO", + "county": "Laclede" + }, + { + "zip_code": 65540, + "latitude": 37.603341, + "longitude": -91.481225, + "city": "Lecoma", + "state": "MO", + "county": "Dent" + }, + { + "zip_code": 65541, + "latitude": 37.603341, + "longitude": -91.481225, + "city": "Lenox", + "state": "MO", + "county": "Dent" + }, + { + "zip_code": 65542, + "latitude": 37.390505, + "longitude": -91.867049, + "city": "Licking", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65543, + "latitude": 37.522073, + "longitude": -92.30882, + "city": "Lynchburg", + "state": "MO", + "county": "Laclede" + }, + { + "zip_code": 65546, + "latitude": 37.153294, + "longitude": -91.337506, + "city": "Montier", + "state": "MO", + "county": "Shannon" + }, + { + "zip_code": 65548, + "latitude": 36.974825, + "longitude": -91.76979, + "city": "Mountain View", + "state": "MO", + "county": "Howell" + }, + { + "zip_code": 65550, + "latitude": 37.839291, + "longitude": -91.91236, + "city": "Newburg", + "state": "MO", + "county": "Phelps" + }, + { + "zip_code": 65552, + "latitude": 37.484252, + "longitude": -92.157003, + "city": "Plato", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65555, + "latitude": 37.366338, + "longitude": -91.748856, + "city": "Raymondville", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65556, + "latitude": 37.85021, + "longitude": -92.328289, + "city": "Richland", + "state": "MO", + "county": "Pulaski" + }, + { + "zip_code": 65557, + "latitude": 37.499376, + "longitude": -92.132343, + "city": "Roby", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65559, + "latitude": 37.971347, + "longitude": -91.636399, + "city": "Saint James", + "state": "MO", + "county": "Phelps" + }, + { + "zip_code": 65560, + "latitude": 37.640709, + "longitude": -91.53927, + "city": "Salem", + "state": "MO", + "county": "Dent" + }, + { + "zip_code": 65564, + "latitude": 37.242824, + "longitude": -91.962351, + "city": "Solo", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65565, + "latitude": 37.890403, + "longitude": -91.303229, + "city": "Steelville", + "state": "MO", + "county": "Crawford" + }, + { + "zip_code": 65566, + "latitude": 37.713211, + "longitude": -91.133384, + "city": "Viburnum", + "state": "MO", + "county": "Iron" + }, + { + "zip_code": 65567, + "latitude": 37.837263, + "longitude": -92.462635, + "city": "Stoutland", + "state": "MO", + "county": "Camden" + }, + { + "zip_code": 65570, + "latitude": 37.462582, + "longitude": -92.090859, + "city": "Success", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65571, + "latitude": 37.17649, + "longitude": -91.712763, + "city": "Summersville", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65572, + "latitude": 37.81186, + "longitude": -92.217391, + "city": "Swedeborg", + "state": "MO", + "county": "Pulaski" + }, + { + "zip_code": 65573, + "latitude": 37.153294, + "longitude": -91.337506, + "city": "Teresita", + "state": "MO", + "county": "Shannon" + }, + { + "zip_code": 65580, + "latitude": 38.130967, + "longitude": -91.794844, + "city": "Vichy", + "state": "MO", + "county": "Maries" + }, + { + "zip_code": 65582, + "latitude": 38.16992, + "longitude": -91.968002, + "city": "Vienna", + "state": "MO", + "county": "Maries" + }, + { + "zip_code": 65583, + "latitude": 37.767552, + "longitude": -92.210471, + "city": "Waynesville", + "state": "MO", + "county": "Pulaski" + }, + { + "zip_code": 65584, + "latitude": "", + "longitude": "", + "city": "Saint Robert", + "state": "MO", + "county": "Pulaski" + }, + { + "zip_code": 65586, + "latitude": 37.858464, + "longitude": -91.426693, + "city": "Wesco", + "state": "MO", + "county": "Crawford" + }, + { + "zip_code": 65588, + "latitude": 36.998455, + "longitude": -91.331701, + "city": "Winona", + "state": "MO", + "county": "Shannon" + }, + { + "zip_code": 65589, + "latitude": 37.23762, + "longitude": -91.82048, + "city": "Yukon", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65590, + "latitude": 37.6596, + "longitude": -93.018874, + "city": "Long Lane", + "state": "MO", + "county": "Dallas" + }, + { + "zip_code": 65591, + "latitude": 38.034962, + "longitude": -92.744219, + "city": "Montreal", + "state": "MO", + "county": "Camden" + }, + { + "zip_code": 65601, + "latitude": 37.534753, + "longitude": -93.543226, + "city": "Aldrich", + "state": "MO", + "county": "Polk" + }, + { + "zip_code": 65603, + "latitude": 37.431754, + "longitude": -93.849903, + "city": "Arcola", + "state": "MO", + "county": "Dade" + }, + { + "zip_code": 65604, + "latitude": 37.311381, + "longitude": -93.578642, + "city": "Ash Grove", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65605, + "latitude": 37.005666, + "longitude": -93.790376, + "city": "Aurora", + "state": "MO", + "county": "Lawrence" + }, + { + "zip_code": 65606, + "latitude": 36.692896, + "longitude": -91.397129, + "city": "Alton", + "state": "MO", + "county": "Oregon" + }, + { + "zip_code": 65607, + "latitude": 37.736871, + "longitude": -93.842468, + "city": "Caplinger Mills", + "state": "MO", + "county": "Cedar" + }, + { + "zip_code": 65608, + "latitude": 36.951914, + "longitude": -92.665499, + "city": "Ava", + "state": "MO", + "county": "Douglas" + }, + { + "zip_code": 65609, + "latitude": 36.52365, + "longitude": -92.144958, + "city": "Bakersfield", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65610, + "latitude": 37.046128, + "longitude": -93.405929, + "city": "Billings", + "state": "MO", + "county": "Christian" + }, + { + "zip_code": 65611, + "latitude": 36.549301, + "longitude": -93.338838, + "city": "Blue Eye", + "state": "MO", + "county": "Stone" + }, + { + "zip_code": 65612, + "latitude": 37.224385, + "longitude": -93.540803, + "city": "Bois D Arc", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65613, + "latitude": 37.626464, + "longitude": -93.413616, + "city": "Bolivar", + "state": "MO", + "county": "Polk" + }, + { + "zip_code": 65614, + "latitude": 36.722523, + "longitude": -92.914606, + "city": "Bradleyville", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65615, + "latitude": 36.660981, + "longitude": -93.235798, + "city": "Branson", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65616, + "latitude": 36.653256, + "longitude": -93.05634, + "city": "Branson", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65617, + "latitude": 37.462457, + "longitude": -93.347992, + "city": "Brighton", + "state": "MO", + "county": "Polk" + }, + { + "zip_code": 65618, + "latitude": 36.651607, + "longitude": -92.442341, + "city": "Brixey", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65619, + "latitude": 37.139291, + "longitude": -93.384921, + "city": "Brookline Station", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65620, + "latitude": 37.011657, + "longitude": -92.951702, + "city": "Bruner", + "state": "MO", + "county": "Christian" + }, + { + "zip_code": 65622, + "latitude": 37.642882, + "longitude": -93.090618, + "city": "Buffalo", + "state": "MO", + "county": "Dallas" + }, + { + "zip_code": 65623, + "latitude": 36.74901, + "longitude": -93.906436, + "city": "Butterfield", + "state": "MO", + "county": "Barry" + }, + { + "zip_code": 65624, + "latitude": 36.747083, + "longitude": -93.458626, + "city": "Cape Fair", + "state": "MO", + "county": "Stone" + }, + { + "zip_code": 65625, + "latitude": 36.683825, + "longitude": -93.875744, + "city": "Cassville", + "state": "MO", + "county": "Barry" + }, + { + "zip_code": 65626, + "latitude": 36.578961, + "longitude": -92.051654, + "city": "Caulfield", + "state": "MO", + "county": "Howell" + }, + { + "zip_code": 65627, + "latitude": 36.560345, + "longitude": -93.014906, + "city": "Cedarcreek", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65629, + "latitude": 36.885838, + "longitude": -93.040981, + "city": "Chadwick", + "state": "MO", + "county": "Christian" + }, + { + "zip_code": 65630, + "latitude": 36.83595, + "longitude": -93.229058, + "city": "Chestnutridge", + "state": "MO", + "county": "Christian" + }, + { + "zip_code": 65631, + "latitude": 37.044729, + "longitude": -93.438301, + "city": "Clever", + "state": "MO", + "county": "Christian" + }, + { + "zip_code": 65632, + "latitude": 37.532463, + "longitude": -92.72801, + "city": "Conway", + "state": "MO", + "county": "Laclede" + }, + { + "zip_code": 65633, + "latitude": 36.905731, + "longitude": -93.486809, + "city": "Crane", + "state": "MO", + "county": "Stone" + }, + { + "zip_code": 65634, + "latitude": 38.024206, + "longitude": -93.228867, + "city": "Cross Timbers", + "state": "MO", + "county": "Hickory" + }, + { + "zip_code": 65635, + "latitude": 37.431754, + "longitude": -93.849903, + "city": "Dadeville", + "state": "MO", + "county": "Dade" + }, + { + "zip_code": 65636, + "latitude": 37.277247, + "longitude": -92.877874, + "city": "Diggins", + "state": "MO", + "county": "Webster" + }, + { + "zip_code": 65637, + "latitude": 36.651607, + "longitude": -92.442341, + "city": "Dora", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65638, + "latitude": 36.932331, + "longitude": -92.499044, + "city": "Drury", + "state": "MO", + "county": "Douglas" + }, + { + "zip_code": 65640, + "latitude": 37.698301, + "longitude": -93.542218, + "city": "Dunnegan", + "state": "MO", + "county": "Polk" + }, + { + "zip_code": 65641, + "latitude": 36.715249, + "longitude": -93.825497, + "city": "Eagle Rock", + "state": "MO", + "county": "Barry" + }, + { + "zip_code": 65644, + "latitude": 37.277247, + "longitude": -92.877874, + "city": "Elkland", + "state": "MO", + "county": "Webster" + }, + { + "zip_code": 65645, + "latitude": 37.476695, + "longitude": -93.539707, + "city": "Eudora", + "state": "MO", + "county": "Polk" + }, + { + "zip_code": 65646, + "latitude": 37.34335, + "longitude": -93.702108, + "city": "Everton", + "state": "MO", + "county": "Dade" + }, + { + "zip_code": 65647, + "latitude": 36.677628, + "longitude": -93.927466, + "city": "Exeter", + "state": "MO", + "county": "Barry" + }, + { + "zip_code": 65648, + "latitude": 37.370209, + "longitude": -93.175093, + "city": "Fair Grove", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65649, + "latitude": 37.631792, + "longitude": -93.559197, + "city": "Fair Play", + "state": "MO", + "county": "Polk" + }, + { + "zip_code": 65650, + "latitude": 37.739853, + "longitude": -93.463116, + "city": "Flemington", + "state": "MO", + "county": "Polk" + }, + { + "zip_code": 65652, + "latitude": 37.165856, + "longitude": -92.958202, + "city": "Fordland", + "state": "MO", + "county": "Webster" + }, + { + "zip_code": 65653, + "latitude": 36.726771, + "longitude": -93.107824, + "city": "Forsyth", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65654, + "latitude": 37.021147, + "longitude": -93.897434, + "city": "Freistatt", + "state": "MO", + "county": "Lawrence" + }, + { + "zip_code": 65655, + "latitude": 36.605575, + "longitude": -92.415322, + "city": "Gainesville", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65656, + "latitude": 36.780532, + "longitude": -93.406941, + "city": "Galena", + "state": "MO", + "county": "Stone" + }, + { + "zip_code": 65657, + "latitude": 36.863017, + "longitude": -92.99999, + "city": "Garrison", + "state": "MO", + "county": "Christian" + }, + { + "zip_code": 65658, + "latitude": 36.715249, + "longitude": -93.825497, + "city": "Golden", + "state": "MO", + "county": "Barry" + }, + { + "zip_code": 65659, + "latitude": 37.750035, + "longitude": -93.246729, + "city": "Goodson", + "state": "MO", + "county": "Polk" + }, + { + "zip_code": 65660, + "latitude": 37.345392, + "longitude": -92.278799, + "city": "Graff", + "state": "MO", + "county": "Wright" + }, + { + "zip_code": 65661, + "latitude": 37.406208, + "longitude": -93.895184, + "city": "Greenfield", + "state": "MO", + "county": "Dade" + }, + { + "zip_code": 65662, + "latitude": 37.396509, + "longitude": -92.581914, + "city": "Grovespring", + "state": "MO", + "county": "Wright" + }, + { + "zip_code": 65663, + "latitude": 37.630967, + "longitude": -93.258038, + "city": "Half Way", + "state": "MO", + "county": "Polk" + }, + { + "zip_code": 65664, + "latitude": 37.194385, + "longitude": -93.627547, + "city": "Halltown", + "state": "MO", + "county": "Lawrence" + }, + { + "zip_code": 65666, + "latitude": 36.651607, + "longitude": -92.442341, + "city": "Hardenville", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65667, + "latitude": 37.319401, + "longitude": -92.512497, + "city": "Hartville", + "state": "MO", + "county": "Wright" + }, + { + "zip_code": 65668, + "latitude": 37.946659, + "longitude": -93.320033, + "city": "Hermitage", + "state": "MO", + "county": "Hickory" + }, + { + "zip_code": 65669, + "latitude": 36.921415, + "longitude": -93.280185, + "city": "Highlandville", + "state": "MO", + "county": "Christian" + }, + { + "zip_code": 65672, + "latitude": 36.630652, + "longitude": -93.17315, + "city": "Hollister", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65673, + "latitude": 36.617892, + "longitude": -93.216187, + "city": "Hollister", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65674, + "latitude": 37.729288, + "longitude": -93.554646, + "city": "Humansville", + "state": "MO", + "county": "Polk" + }, + { + "zip_code": 65675, + "latitude": 36.930494, + "longitude": -93.496491, + "city": "Hurley", + "state": "MO", + "county": "Stone" + }, + { + "zip_code": 65676, + "latitude": 36.651607, + "longitude": -92.442341, + "city": "Isabella", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65679, + "latitude": 36.579153, + "longitude": -93.126321, + "city": "Kirbyville", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65680, + "latitude": 36.69779, + "longitude": -92.985076, + "city": "Kissee Mills", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65681, + "latitude": 36.747083, + "longitude": -93.458626, + "city": "Lampe", + "state": "MO", + "county": "Stone" + }, + { + "zip_code": 65682, + "latitude": 37.38595, + "longitude": -93.954122, + "city": "Lockwood", + "state": "MO", + "county": "Dade" + }, + { + "zip_code": 65685, + "latitude": 37.6596, + "longitude": -93.018874, + "city": "Louisburg", + "state": "MO", + "county": "Dallas" + }, + { + "zip_code": 65686, + "latitude": 36.638577, + "longitude": -93.432117, + "city": "Kimberling City", + "state": "MO", + "county": "Stone" + }, + { + "zip_code": 65688, + "latitude": 36.648817, + "longitude": -91.697596, + "city": "Brandsville", + "state": "MO", + "county": "Howell" + }, + { + "zip_code": 65689, + "latitude": 37.193593, + "longitude": -92.078527, + "city": "Cabool", + "state": "MO", + "county": "Texas" + }, + { + "zip_code": 65690, + "latitude": 36.692896, + "longitude": -91.397129, + "city": "Couch", + "state": "MO", + "county": "Oregon" + }, + { + "zip_code": 65692, + "latitude": 36.596757, + "longitude": -91.645491, + "city": "Koshkonong", + "state": "MO", + "county": "Oregon" + }, + { + "zip_code": 65701, + "latitude": 36.702612, + "longitude": -92.781063, + "city": "Mc Clurg", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65702, + "latitude": 37.100803, + "longitude": -92.535335, + "city": "Macomb", + "state": "MO", + "county": "Wright" + }, + { + "zip_code": 65704, + "latitude": 37.168407, + "longitude": -92.573487, + "city": "Mansfield", + "state": "MO", + "county": "Wright" + }, + { + "zip_code": 65705, + "latitude": 37.065338, + "longitude": -93.628454, + "city": "Marionville", + "state": "MO", + "county": "Lawrence" + }, + { + "zip_code": 65706, + "latitude": 37.274421, + "longitude": -92.932494, + "city": "Marshfield", + "state": "MO", + "county": "Webster" + }, + { + "zip_code": 65707, + "latitude": 37.229699, + "longitude": -93.847381, + "city": "Miller", + "state": "MO", + "county": "Lawrence" + }, + { + "zip_code": 65708, + "latitude": 36.802435, + "longitude": -93.934986, + "city": "Monett", + "state": "MO", + "county": "Barry" + }, + { + "zip_code": 65710, + "latitude": 37.488021, + "longitude": -93.439073, + "city": "Morrisville", + "state": "MO", + "county": "Polk" + }, + { + "zip_code": 65711, + "latitude": 37.265652, + "longitude": -92.432734, + "city": "Mountain Grove", + "state": "MO", + "county": "Wright" + }, + { + "zip_code": 65712, + "latitude": 37.064637, + "longitude": -93.824061, + "city": "Mount Vernon", + "state": "MO", + "county": "Lawrence" + }, + { + "zip_code": 65713, + "latitude": 37.318077, + "longitude": -92.757673, + "city": "Niangua", + "state": "MO", + "county": "Webster" + }, + { + "zip_code": 65714, + "latitude": 36.961768, + "longitude": -93.237749, + "city": "Nixa", + "state": "MO", + "county": "Christian" + }, + { + "zip_code": 65715, + "latitude": 36.651607, + "longitude": -92.442341, + "city": "Noble", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65717, + "latitude": 37.160913, + "longitude": -92.415178, + "city": "Norwood", + "state": "MO", + "county": "Wright" + }, + { + "zip_code": 65720, + "latitude": 36.972932, + "longitude": -93.096909, + "city": "Oldfield", + "state": "MO", + "county": "Christian" + }, + { + "zip_code": 65721, + "latitude": 36.972577, + "longitude": -93.122301, + "city": "Ozark", + "state": "MO", + "county": "Christian" + }, + { + "zip_code": 65722, + "latitude": 37.577499, + "longitude": -92.759488, + "city": "Phillipsburg", + "state": "MO", + "county": "Laclede" + }, + { + "zip_code": 65723, + "latitude": 36.984539, + "longitude": -93.97419, + "city": "Pierce City", + "state": "MO", + "county": "Lawrence" + }, + { + "zip_code": 65724, + "latitude": 37.845874, + "longitude": -93.305582, + "city": "Pittsburg", + "state": "MO", + "county": "Hickory" + }, + { + "zip_code": 65725, + "latitude": 37.455661, + "longitude": -93.265019, + "city": "Pleasant Hope", + "state": "MO", + "county": "Polk" + }, + { + "zip_code": 65726, + "latitude": 36.616515, + "longitude": -93.241839, + "city": "Point Lookout", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65727, + "latitude": 37.743835, + "longitude": -93.320582, + "city": "Polk", + "state": "MO", + "county": "Polk" + }, + { + "zip_code": 65728, + "latitude": 36.747083, + "longitude": -93.458626, + "city": "Ponce De Leon", + "state": "MO", + "county": "Stone" + }, + { + "zip_code": 65729, + "latitude": 36.651607, + "longitude": -92.442341, + "city": "Pontiac", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65730, + "latitude": 36.632573, + "longitude": -94.342802, + "city": "Powell", + "state": "MO", + "county": "Mcdonald" + }, + { + "zip_code": 65731, + "latitude": 36.657825, + "longitude": -93.124271, + "city": "Powersite", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65732, + "latitude": 37.942744, + "longitude": -93.324817, + "city": "Preston", + "state": "MO", + "county": "Hickory" + }, + { + "zip_code": 65733, + "latitude": 36.546632, + "longitude": -93.02939, + "city": "Protem", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65734, + "latitude": 36.78885, + "longitude": -93.917312, + "city": "Purdy", + "state": "MO", + "county": "Barry" + }, + { + "zip_code": 65735, + "latitude": 37.937887, + "longitude": -93.319651, + "city": "Quincy", + "state": "MO", + "county": "Hickory" + }, + { + "zip_code": 65737, + "latitude": 36.690661, + "longitude": -93.344687, + "city": "Reeds Spring", + "state": "MO", + "county": "Stone" + }, + { + "zip_code": 65738, + "latitude": 37.256089, + "longitude": -93.501003, + "city": "Republic", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65739, + "latitude": 36.610226, + "longitude": -93.230334, + "city": "Ridgedale", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65740, + "latitude": 36.714583, + "longitude": -93.158501, + "city": "Rockaway Beach", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65741, + "latitude": 36.651607, + "longitude": -92.442341, + "city": "Rockbridge", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65742, + "latitude": 37.224224, + "longitude": -92.983202, + "city": "Rogersville", + "state": "MO", + "county": "Webster" + }, + { + "zip_code": 65744, + "latitude": 36.628353, + "longitude": -92.909254, + "city": "Rueter", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65745, + "latitude": 36.527016, + "longitude": -93.937458, + "city": "Seligman", + "state": "MO", + "county": "Barry" + }, + { + "zip_code": 65746, + "latitude": 37.17598, + "longitude": -92.820353, + "city": "Seymour", + "state": "MO", + "county": "Webster" + }, + { + "zip_code": 65747, + "latitude": 36.715249, + "longitude": -93.825497, + "city": "Shell Knob", + "state": "MO", + "county": "Barry" + }, + { + "zip_code": 65752, + "latitude": 37.431754, + "longitude": -93.849903, + "city": "South Greenfield", + "state": "MO", + "county": "Dade" + }, + { + "zip_code": 65753, + "latitude": 36.993376, + "longitude": -93.039554, + "city": "Sparta", + "state": "MO", + "county": "Christian" + }, + { + "zip_code": 65754, + "latitude": 36.854253, + "longitude": -93.292806, + "city": "Spokane", + "state": "MO", + "county": "Christian" + }, + { + "zip_code": 65755, + "latitude": 36.932331, + "longitude": -92.499044, + "city": "Squires", + "state": "MO", + "county": "Douglas" + }, + { + "zip_code": 65756, + "latitude": 37.104238, + "longitude": -93.995261, + "city": "Stotts City", + "state": "MO", + "county": "Lawrence" + }, + { + "zip_code": 65757, + "latitude": 37.310494, + "longitude": -93.307207, + "city": "Strafford", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65759, + "latitude": 36.750537, + "longitude": -93.016322, + "city": "Taneyville", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65760, + "latitude": 36.651607, + "longitude": -92.442341, + "city": "Tecumseh", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65761, + "latitude": 36.583048, + "longitude": -92.662803, + "city": "Theodosia", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65762, + "latitude": 36.651607, + "longitude": -92.442341, + "city": "Thornfield", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65764, + "latitude": 37.6596, + "longitude": -93.018874, + "city": "Tunas", + "state": "MO", + "county": "Dallas" + }, + { + "zip_code": 65765, + "latitude": 37.25807, + "longitude": -93.343673, + "city": "Turners", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65766, + "latitude": 36.651607, + "longitude": -92.442341, + "city": "Udall", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65767, + "latitude": 37.803727, + "longitude": -93.154651, + "city": "Urbana", + "state": "MO", + "county": "Dallas" + }, + { + "zip_code": 65768, + "latitude": 36.932331, + "longitude": -92.499044, + "city": "Vanzant", + "state": "MO", + "county": "Douglas" + }, + { + "zip_code": 65769, + "latitude": 36.985316, + "longitude": -93.809406, + "city": "Verona", + "state": "MO", + "county": "Lawrence" + }, + { + "zip_code": 65770, + "latitude": 37.369849, + "longitude": -93.343077, + "city": "Walnut Grove", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65771, + "latitude": 36.772257, + "longitude": -93.222445, + "city": "Walnut Shade", + "state": "MO", + "county": "Taney" + }, + { + "zip_code": 65772, + "latitude": 36.62333, + "longitude": -93.940707, + "city": "Washburn", + "state": "MO", + "county": "Barry" + }, + { + "zip_code": 65773, + "latitude": 36.651607, + "longitude": -92.442341, + "city": "Wasola", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65774, + "latitude": 37.891711, + "longitude": -93.540576, + "city": "Weaubleau", + "state": "MO", + "county": "Hickory" + }, + { + "zip_code": 65775, + "latitude": 36.74651, + "longitude": -91.882912, + "city": "West Plains", + "state": "MO", + "county": "Howell" + }, + { + "zip_code": 65776, + "latitude": 36.629135, + "longitude": -91.986785, + "city": "South Fork", + "state": "MO", + "county": "Howell" + }, + { + "zip_code": 65777, + "latitude": 36.581303, + "longitude": -91.989349, + "city": "Moody", + "state": "MO", + "county": "Howell" + }, + { + "zip_code": 65778, + "latitude": 36.692896, + "longitude": -91.397129, + "city": "Myrtle", + "state": "MO", + "county": "Oregon" + }, + { + "zip_code": 65779, + "latitude": 37.944587, + "longitude": -93.365137, + "city": "Wheatland", + "state": "MO", + "county": "Hickory" + }, + { + "zip_code": 65781, + "latitude": 37.348973, + "longitude": -93.315876, + "city": "Willard", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65783, + "latitude": 37.6596, + "longitude": -93.018874, + "city": "Windyville", + "state": "MO", + "county": "Dallas" + }, + { + "zip_code": 65784, + "latitude": 36.651607, + "longitude": -92.442341, + "city": "Zanoni", + "state": "MO", + "county": "Ozark" + }, + { + "zip_code": 65785, + "latitude": 37.681676, + "longitude": -93.797692, + "city": "Stockton", + "state": "MO", + "county": "Cedar" + }, + { + "zip_code": 65786, + "latitude": 38.034962, + "longitude": -92.744219, + "city": "Macks Creek", + "state": "MO", + "county": "Camden" + }, + { + "zip_code": 65787, + "latitude": 38.102482, + "longitude": -92.914785, + "city": "Roach", + "state": "MO", + "county": "Camden" + }, + { + "zip_code": 65788, + "latitude": 36.870043, + "longitude": -91.777528, + "city": "Peace Valley", + "state": "MO", + "county": "Howell" + }, + { + "zip_code": 65789, + "latitude": 36.876581, + "longitude": -91.895914, + "city": "Pomona", + "state": "MO", + "county": "Howell" + }, + { + "zip_code": 65790, + "latitude": 36.701608, + "longitude": -92.04286, + "city": "Pottersville", + "state": "MO", + "county": "Howell" + }, + { + "zip_code": 65791, + "latitude": 36.526267, + "longitude": -91.548742, + "city": "Thayer", + "state": "MO", + "county": "Oregon" + }, + { + "zip_code": 65793, + "latitude": 36.933184, + "longitude": -91.89891, + "city": "Willow Springs", + "state": "MO", + "county": "Howell" + }, + { + "zip_code": 65801, + "latitude": 37.25807, + "longitude": -93.343673, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65802, + "latitude": 37.18457, + "longitude": -93.31994, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65803, + "latitude": 37.299377, + "longitude": -93.324456, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65804, + "latitude": 37.151377, + "longitude": -93.238034, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65805, + "latitude": 37.25807, + "longitude": -93.343673, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65806, + "latitude": 37.177044, + "longitude": -93.303288, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65807, + "latitude": 37.158811, + "longitude": -93.348705, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65808, + "latitude": 37.25807, + "longitude": -93.343673, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65809, + "latitude": 37.150649, + "longitude": -93.21641, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65810, + "latitude": 37.122249, + "longitude": -93.31318, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65814, + "latitude": 37.25807, + "longitude": -93.343673, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65817, + "latitude": 37.25807, + "longitude": -93.343673, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65890, + "latitude": 37.25807, + "longitude": -93.343673, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65898, + "latitude": 37.180349, + "longitude": -93.295137, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 65899, + "latitude": 37.181498, + "longitude": -93.259586, + "city": "Springfield", + "state": "MO", + "county": "Greene" + }, + { + "zip_code": 66002, + "latitude": 39.535948, + "longitude": -95.225098, + "city": "Atchison", + "state": "KS", + "county": "Atchison" + }, + { + "zip_code": 66006, + "latitude": 38.821502, + "longitude": -95.223906, + "city": "Baldwin City", + "state": "KS", + "county": "Douglas" + }, + { + "zip_code": 66007, + "latitude": 39.133448, + "longitude": -94.947234, + "city": "Basehor", + "state": "KS", + "county": "Leavenworth" + }, + { + "zip_code": 66008, + "latitude": 39.712615, + "longitude": -95.186894, + "city": "Bendena", + "state": "KS", + "county": "Doniphan" + }, + { + "zip_code": 66010, + "latitude": 38.089756, + "longitude": -95.007693, + "city": "Blue Mound", + "state": "KS", + "county": "Linn" + }, + { + "zip_code": 66012, + "latitude": 39.068153, + "longitude": -94.763938, + "city": "Bonner Springs", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66013, + "latitude": 38.676056, + "longitude": -94.685052, + "city": "Bucyrus", + "state": "KS", + "county": "Miami" + }, + { + "zip_code": 66014, + "latitude": 38.282583, + "longitude": -94.890305, + "city": "Centerville", + "state": "KS", + "county": "Linn" + }, + { + "zip_code": 66015, + "latitude": 38.213685, + "longitude": -95.299014, + "city": "Colony", + "state": "KS", + "county": "Anderson" + }, + { + "zip_code": 66016, + "latitude": 39.483518, + "longitude": -95.240978, + "city": "Cummings", + "state": "KS", + "county": "Atchison" + }, + { + "zip_code": 66017, + "latitude": 39.70398, + "longitude": -95.103098, + "city": "Denton", + "state": "KS", + "county": "Doniphan" + }, + { + "zip_code": 66018, + "latitude": 38.946156, + "longitude": -94.97143, + "city": "De Soto", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66019, + "latitude": 38.946041, + "longitude": -95.003661, + "city": "Clearview City", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66020, + "latitude": 39.339141, + "longitude": -95.099858, + "city": "Easton", + "state": "KS", + "county": "Leavenworth" + }, + { + "zip_code": 66021, + "latitude": 38.817766, + "longitude": -94.94316, + "city": "Edgerton", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66023, + "latitude": 39.507561, + "longitude": -95.393716, + "city": "Effingham", + "state": "KS", + "county": "Atchison" + }, + { + "zip_code": 66024, + "latitude": 39.757262, + "longitude": -94.882439, + "city": "Elwood", + "state": "KS", + "county": "Doniphan" + }, + { + "zip_code": 66025, + "latitude": 38.879142, + "longitude": -95.125903, + "city": "Eudora", + "state": "KS", + "county": "Douglas" + }, + { + "zip_code": 66026, + "latitude": 38.417885, + "longitude": -94.88344, + "city": "Fontana", + "state": "KS", + "county": "Miami" + }, + { + "zip_code": 66027, + "latitude": 39.346798, + "longitude": -94.931329, + "city": "Fort Leavenworth", + "state": "KS", + "county": "Leavenworth" + }, + { + "zip_code": 66030, + "latitude": 38.814998, + "longitude": -94.94139, + "city": "Gardner", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66031, + "latitude": 38.824863, + "longitude": -94.899201, + "city": "New Century", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66032, + "latitude": 38.232767, + "longitude": -95.286458, + "city": "Garnett", + "state": "KS", + "county": "Anderson" + }, + { + "zip_code": 66033, + "latitude": 38.346417, + "longitude": -95.139231, + "city": "Greeley", + "state": "KS", + "county": "Anderson" + }, + { + "zip_code": 66035, + "latitude": 39.878677, + "longitude": -95.227692, + "city": "Highland", + "state": "KS", + "county": "Doniphan" + }, + { + "zip_code": 66036, + "latitude": 38.658068, + "longitude": -94.852061, + "city": "Hillsdale", + "state": "KS", + "county": "Miami" + }, + { + "zip_code": 66039, + "latitude": 38.110393, + "longitude": -95.188557, + "city": "Kincaid", + "state": "KS", + "county": "Anderson" + }, + { + "zip_code": 66040, + "latitude": 38.362869, + "longitude": -94.731773, + "city": "La Cygne", + "state": "KS", + "county": "Linn" + }, + { + "zip_code": 66041, + "latitude": 39.536445, + "longitude": -95.306304, + "city": "Lancaster", + "state": "KS", + "county": "Atchison" + }, + { + "zip_code": 66042, + "latitude": 38.550993, + "longitude": -95.263735, + "city": "Lane", + "state": "KS", + "county": "Franklin" + }, + { + "zip_code": 66043, + "latitude": 39.233204, + "longitude": -94.883026, + "city": "Lansing", + "state": "KS", + "county": "Leavenworth" + }, + { + "zip_code": 66044, + "latitude": 38.907518, + "longitude": -95.283982, + "city": "Lawrence", + "state": "KS", + "county": "Douglas" + }, + { + "zip_code": 66045, + "latitude": 38.952526, + "longitude": -95.275623, + "city": "Lawrence", + "state": "KS", + "county": "Douglas" + }, + { + "zip_code": 66046, + "latitude": 38.878682, + "longitude": -95.315453, + "city": "Lawrence", + "state": "KS", + "county": "Douglas" + }, + { + "zip_code": 66047, + "latitude": 38.88437, + "longitude": -95.338066, + "city": "Lawrence", + "state": "KS", + "county": "Douglas" + }, + { + "zip_code": 66048, + "latitude": 39.279656, + "longitude": -94.982216, + "city": "Leavenworth", + "state": "KS", + "county": "Leavenworth" + }, + { + "zip_code": 66049, + "latitude": 38.903685, + "longitude": -95.344647, + "city": "Lawrence", + "state": "KS", + "county": "Douglas" + }, + { + "zip_code": 66050, + "latitude": 39.004574, + "longitude": -95.417804, + "city": "Lecompton", + "state": "KS", + "county": "Douglas" + }, + { + "zip_code": 66051, + "latitude": 38.899901, + "longitude": -94.831991, + "city": "Olathe", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66052, + "latitude": 39.00755, + "longitude": -95.056044, + "city": "Linwood", + "state": "KS", + "county": "Leavenworth" + }, + { + "zip_code": 66053, + "latitude": 38.587195, + "longitude": -94.689876, + "city": "Louisburg", + "state": "KS", + "county": "Miami" + }, + { + "zip_code": 66054, + "latitude": 39.198095, + "longitude": -95.231788, + "city": "Mc Louth", + "state": "KS", + "county": "Jefferson" + }, + { + "zip_code": 66056, + "latitude": 38.243571, + "longitude": -94.766019, + "city": "Mound City", + "state": "KS", + "county": "Linn" + }, + { + "zip_code": 66058, + "latitude": 39.529523, + "longitude": -95.483992, + "city": "Muscotah", + "state": "KS", + "county": "Atchison" + }, + { + "zip_code": 66060, + "latitude": 39.383848, + "longitude": -95.319744, + "city": "Nortonville", + "state": "KS", + "county": "Jefferson" + }, + { + "zip_code": 66061, + "latitude": 38.891427, + "longitude": -94.881709, + "city": "Olathe", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66062, + "latitude": 38.847391, + "longitude": -94.778714, + "city": "Olathe", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66063, + "latitude": 38.899901, + "longitude": -94.831991, + "city": "Olathe", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66064, + "latitude": 38.558533, + "longitude": -94.891655, + "city": "Osawatomie", + "state": "KS", + "county": "Miami" + }, + { + "zip_code": 66066, + "latitude": 39.255747, + "longitude": -95.356589, + "city": "Oskaloosa", + "state": "KS", + "county": "Jefferson" + }, + { + "zip_code": 66067, + "latitude": 38.564337, + "longitude": -95.282668, + "city": "Ottawa", + "state": "KS", + "county": "Franklin" + }, + { + "zip_code": 66070, + "latitude": 39.17715, + "longitude": -95.456501, + "city": "Ozawkie", + "state": "KS", + "county": "Jefferson" + }, + { + "zip_code": 66071, + "latitude": 38.577932, + "longitude": -94.880328, + "city": "Paola", + "state": "KS", + "county": "Miami" + }, + { + "zip_code": 66072, + "latitude": 38.255903, + "longitude": -94.852908, + "city": "Parker", + "state": "KS", + "county": "Linn" + }, + { + "zip_code": 66073, + "latitude": 39.229717, + "longitude": -95.396681, + "city": "Perry", + "state": "KS", + "county": "Jefferson" + }, + { + "zip_code": 66075, + "latitude": 38.176349, + "longitude": -94.713323, + "city": "Pleasanton", + "state": "KS", + "county": "Linn" + }, + { + "zip_code": 66076, + "latitude": 38.61504, + "longitude": -95.3418, + "city": "Pomona", + "state": "KS", + "county": "Franklin" + }, + { + "zip_code": 66077, + "latitude": 39.423624, + "longitude": -95.140829, + "city": "Potter", + "state": "KS", + "county": "Atchison" + }, + { + "zip_code": 66078, + "latitude": 38.470428, + "longitude": -95.258362, + "city": "Princeton", + "state": "KS", + "county": "Franklin" + }, + { + "zip_code": 66079, + "latitude": 38.550188, + "longitude": -95.138748, + "city": "Rantoul", + "state": "KS", + "county": "Franklin" + }, + { + "zip_code": 66080, + "latitude": 38.436338, + "longitude": -95.312506, + "city": "Richmond", + "state": "KS", + "county": "Franklin" + }, + { + "zip_code": 66083, + "latitude": 38.789323, + "longitude": -94.788441, + "city": "Spring Hill", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66085, + "latitude": 38.81799, + "longitude": -94.656698, + "city": "Stilwell", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66086, + "latitude": 39.115489, + "longitude": -95.084717, + "city": "Tonganoxie", + "state": "KS", + "county": "Leavenworth" + }, + { + "zip_code": 66087, + "latitude": 39.790573, + "longitude": -95.143417, + "city": "Troy", + "state": "KS", + "county": "Doniphan" + }, + { + "zip_code": 66088, + "latitude": 39.248329, + "longitude": -95.428183, + "city": "Valley Falls", + "state": "KS", + "county": "Jefferson" + }, + { + "zip_code": 66090, + "latitude": 39.806075, + "longitude": -95.083528, + "city": "Wathena", + "state": "KS", + "county": "Doniphan" + }, + { + "zip_code": 66091, + "latitude": 38.150424, + "longitude": -95.343798, + "city": "Welda", + "state": "KS", + "county": "Anderson" + }, + { + "zip_code": 66092, + "latitude": 38.642244, + "longitude": -95.149986, + "city": "Wellsville", + "state": "KS", + "county": "Franklin" + }, + { + "zip_code": 66093, + "latitude": 38.210603, + "longitude": -95.457728, + "city": "Westphalia", + "state": "KS", + "county": "Anderson" + }, + { + "zip_code": 66094, + "latitude": 39.873744, + "longitude": -95.29357, + "city": "White Cloud", + "state": "KS", + "county": "Doniphan" + }, + { + "zip_code": 66095, + "latitude": 38.47913, + "longitude": -95.406321, + "city": "Williamsburg", + "state": "KS", + "county": "Franklin" + }, + { + "zip_code": 66097, + "latitude": 39.2314, + "longitude": -95.285222, + "city": "Winchester", + "state": "KS", + "county": "Jefferson" + }, + { + "zip_code": 66101, + "latitude": 39.103053, + "longitude": -94.630384, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66102, + "latitude": 39.101553, + "longitude": -94.750537, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66103, + "latitude": 39.066804, + "longitude": -94.628184, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66104, + "latitude": 39.145049, + "longitude": -94.688896, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66105, + "latitude": 39.082662, + "longitude": -94.635528, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66106, + "latitude": 39.069404, + "longitude": -94.717837, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66109, + "latitude": 39.143692, + "longitude": -94.817719, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66110, + "latitude": 39.096551, + "longitude": -94.749538, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66111, + "latitude": 39.086354, + "longitude": -94.786033, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66112, + "latitude": 39.116953, + "longitude": -94.765822, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66113, + "latitude": 39.073539, + "longitude": -94.723271, + "city": "Edwardsville", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66115, + "latitude": 39.136353, + "longitude": -94.615984, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66117, + "latitude": 39.096551, + "longitude": -94.749538, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66118, + "latitude": 39.101054, + "longitude": -94.614434, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66119, + "latitude": 39.096551, + "longitude": -94.749538, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66160, + "latitude": 39.096551, + "longitude": -94.749538, + "city": "Kansas City", + "state": "KS", + "county": "Wyandotte" + }, + { + "zip_code": 66201, + "latitude": 39.007755, + "longitude": -94.679486, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66202, + "latitude": 39.024819, + "longitude": -94.682563, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66203, + "latitude": 39.015629, + "longitude": -94.693187, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66204, + "latitude": 38.974815, + "longitude": -94.683188, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66205, + "latitude": 38.994381, + "longitude": -94.827369, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66206, + "latitude": 38.959356, + "longitude": -94.716155, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66207, + "latitude": 38.955156, + "longitude": -94.644701, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66208, + "latitude": 38.993805, + "longitude": -94.634038, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66209, + "latitude": 38.898356, + "longitude": -94.637684, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66210, + "latitude": 38.927256, + "longitude": -94.714336, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66211, + "latitude": 38.924838, + "longitude": -94.637888, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66212, + "latitude": 38.956806, + "longitude": -94.683236, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66213, + "latitude": 38.898243, + "longitude": -94.704936, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66214, + "latitude": 38.964879, + "longitude": -94.720914, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66215, + "latitude": 38.949007, + "longitude": -94.740503, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66216, + "latitude": 39.014655, + "longitude": -94.741448, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66217, + "latitude": 39.014604, + "longitude": -94.770868, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66218, + "latitude": 39.014005, + "longitude": -94.81079, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66219, + "latitude": 38.955326, + "longitude": -94.779899, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66220, + "latitude": 38.961334, + "longitude": -94.822249, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66221, + "latitude": 38.861933, + "longitude": -94.714388, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66222, + "latitude": 38.899901, + "longitude": -94.831991, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66223, + "latitude": 38.861887, + "longitude": -94.660994, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66224, + "latitude": 38.859094, + "longitude": -94.631442, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66225, + "latitude": 38.899901, + "longitude": -94.831991, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66226, + "latitude": 39.017826, + "longitude": -94.862667, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66227, + "latitude": 38.974684, + "longitude": -94.868066, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66250, + "latitude": 38.899901, + "longitude": -94.831991, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66251, + "latitude": 38.899901, + "longitude": -94.831991, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66276, + "latitude": 38.899901, + "longitude": -94.831991, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66279, + "latitude": 38.899901, + "longitude": -94.831991, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66282, + "latitude": 38.899901, + "longitude": -94.831991, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66283, + "latitude": 38.899901, + "longitude": -94.831991, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66285, + "latitude": 38.899901, + "longitude": -94.831991, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66286, + "latitude": 38.899901, + "longitude": -94.831991, + "city": "Shawnee Mission", + "state": "KS", + "county": "Johnson" + }, + { + "zip_code": 66401, + "latitude": 38.953556, + "longitude": -96.204558, + "city": "Alma", + "state": "KS", + "county": "Wabaunsee" + }, + { + "zip_code": 66402, + "latitude": 38.916916, + "longitude": -95.839181, + "city": "Auburn", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66403, + "latitude": 39.885826, + "longitude": -96.295457, + "city": "Axtell", + "state": "KS", + "county": "Marshall" + }, + { + "zip_code": 66404, + "latitude": 39.753031, + "longitude": -96.108737, + "city": "Baileyville", + "state": "KS", + "county": "Nemaha" + }, + { + "zip_code": 66406, + "latitude": 39.906945, + "longitude": -96.416779, + "city": "Beattie", + "state": "KS", + "county": "Marshall" + }, + { + "zip_code": 66407, + "latitude": 39.277337, + "longitude": -96.164714, + "city": "Belvue", + "state": "KS", + "county": "Pottawatomie" + }, + { + "zip_code": 66408, + "latitude": 39.960927, + "longitude": -95.967077, + "city": "Bern", + "state": "KS", + "county": "Nemaha" + }, + { + "zip_code": 66409, + "latitude": 38.927847, + "longitude": -95.584708, + "city": "Berryton", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66411, + "latitude": 39.713306, + "longitude": -96.563601, + "city": "Blue Rapids", + "state": "KS", + "county": "Marshall" + }, + { + "zip_code": 66412, + "latitude": 39.907206, + "longitude": -96.758998, + "city": "Bremen", + "state": "KS", + "county": "Marshall" + }, + { + "zip_code": 66413, + "latitude": 38.73799, + "longitude": -95.815754, + "city": "Burlingame", + "state": "KS", + "county": "Osage" + }, + { + "zip_code": 66414, + "latitude": 38.811675, + "longitude": -95.706138, + "city": "Carbondale", + "state": "KS", + "county": "Osage" + }, + { + "zip_code": 66415, + "latitude": 39.697428, + "longitude": -96.032867, + "city": "Centralia", + "state": "KS", + "county": "Nemaha" + }, + { + "zip_code": 66416, + "latitude": 39.528134, + "longitude": -95.848729, + "city": "Circleville", + "state": "KS", + "county": "Jackson" + }, + { + "zip_code": 66417, + "latitude": 39.654314, + "longitude": -96.031758, + "city": "Corning", + "state": "KS", + "county": "Nemaha" + }, + { + "zip_code": 66418, + "latitude": 39.300065, + "longitude": -95.900691, + "city": "Delia", + "state": "KS", + "county": "Jackson" + }, + { + "zip_code": 66419, + "latitude": 39.353979, + "longitude": -95.612718, + "city": "Denison", + "state": "KS", + "county": "Jackson" + }, + { + "zip_code": 66420, + "latitude": 38.964532, + "longitude": -95.917186, + "city": "Dover", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66422, + "latitude": 39.347682, + "longitude": -96.10416, + "city": "Emmett", + "state": "KS", + "county": "Pottawatomie" + }, + { + "zip_code": 66423, + "latitude": 38.858895, + "longitude": -96.145799, + "city": "Eskridge", + "state": "KS", + "county": "Wabaunsee" + }, + { + "zip_code": 66424, + "latitude": 39.699141, + "longitude": -95.462469, + "city": "Everest", + "state": "KS", + "county": "Brown" + }, + { + "zip_code": 66425, + "latitude": 39.821847, + "longitude": -95.727038, + "city": "Fairview", + "state": "KS", + "county": "Brown" + }, + { + "zip_code": 66426, + "latitude": 39.43982, + "longitude": -96.506769, + "city": "Fostoria", + "state": "KS", + "county": "Pottawatomie" + }, + { + "zip_code": 66427, + "latitude": 39.733313, + "longitude": -96.522272, + "city": "Frankfort", + "state": "KS", + "county": "Marshall" + }, + { + "zip_code": 66428, + "latitude": 39.664216, + "longitude": -95.930454, + "city": "Goff", + "state": "KS", + "county": "Nemaha" + }, + { + "zip_code": 66429, + "latitude": 39.104047, + "longitude": -95.539169, + "city": "Grantville", + "state": "KS", + "county": "Jefferson" + }, + { + "zip_code": 66431, + "latitude": 38.789698, + "longitude": -95.963421, + "city": "Harveyville", + "state": "KS", + "county": "Wabaunsee" + }, + { + "zip_code": 66432, + "latitude": 39.44655, + "longitude": -96.37473, + "city": "Havensville", + "state": "KS", + "county": "Pottawatomie" + }, + { + "zip_code": 66434, + "latitude": 39.791367, + "longitude": -95.600405, + "city": "Hiawatha", + "state": "KS", + "county": "Brown" + }, + { + "zip_code": 66436, + "latitude": 39.481012, + "longitude": -95.765586, + "city": "Holton", + "state": "KS", + "county": "Jackson" + }, + { + "zip_code": 66438, + "latitude": 39.848788, + "longitude": -96.506345, + "city": "Home", + "state": "KS", + "county": "Marshall" + }, + { + "zip_code": 66439, + "latitude": 39.664076, + "longitude": -95.527212, + "city": "Horton", + "state": "KS", + "county": "Brown" + }, + { + "zip_code": 66440, + "latitude": 39.305187, + "longitude": -95.685374, + "city": "Hoyt", + "state": "KS", + "county": "Jackson" + }, + { + "zip_code": 66441, + "latitude": 39.026465, + "longitude": -96.783359, + "city": "Junction City", + "state": "KS", + "county": "Geary" + }, + { + "zip_code": 66442, + "latitude": 39.113738, + "longitude": -96.837821, + "city": "Fort Riley", + "state": "KS", + "county": "Geary" + }, + { + "zip_code": 66449, + "latitude": 39.401675, + "longitude": -96.848345, + "city": "Leonardville", + "state": "KS", + "county": "Riley" + }, + { + "zip_code": 66450, + "latitude": 39.261802, + "longitude": -96.333203, + "city": "Louisville", + "state": "KS", + "county": "Pottawatomie" + }, + { + "zip_code": 66451, + "latitude": 38.622848, + "longitude": -95.656131, + "city": "Lyndon", + "state": "KS", + "county": "Osage" + }, + { + "zip_code": 66501, + "latitude": 39.053494, + "longitude": -96.237918, + "city": "Mc Farland", + "state": "KS", + "county": "Wabaunsee" + }, + { + "zip_code": 66502, + "latitude": 39.209375, + "longitude": -96.564589, + "city": "Manhattan", + "state": "KS", + "county": "Riley" + }, + { + "zip_code": 66503, + "latitude": 39.245797, + "longitude": -96.633596, + "city": "Manhattan", + "state": "KS", + "county": "Riley" + }, + { + "zip_code": 66505, + "latitude": 39.304937, + "longitude": -96.675295, + "city": "Manhattan", + "state": "KS", + "county": "Riley" + }, + { + "zip_code": 66506, + "latitude": 39.196032, + "longitude": -96.583875, + "city": "Manhattan", + "state": "KS", + "county": "Riley" + }, + { + "zip_code": 66507, + "latitude": 39.070808, + "longitude": -96.131584, + "city": "Maple Hill", + "state": "KS", + "county": "Wabaunsee" + }, + { + "zip_code": 66508, + "latitude": 39.863544, + "longitude": -96.617219, + "city": "Marysville", + "state": "KS", + "county": "Marshall" + }, + { + "zip_code": 66509, + "latitude": 39.312432, + "longitude": -95.760939, + "city": "Mayetta", + "state": "KS", + "county": "Jackson" + }, + { + "zip_code": 66510, + "latitude": 38.499728, + "longitude": -95.611239, + "city": "Melvern", + "state": "KS", + "county": "Osage" + }, + { + "zip_code": 66512, + "latitude": 39.202791, + "longitude": -95.530598, + "city": "Meriden", + "state": "KS", + "county": "Jefferson" + }, + { + "zip_code": 66514, + "latitude": 39.127855, + "longitude": -96.874028, + "city": "Milford", + "state": "KS", + "county": "Geary" + }, + { + "zip_code": 66515, + "latitude": 39.923097, + "longitude": -95.694761, + "city": "Morrill", + "state": "KS", + "county": "Brown" + }, + { + "zip_code": 66516, + "latitude": 39.601523, + "longitude": -95.716332, + "city": "Netawaka", + "state": "KS", + "county": "Jackson" + }, + { + "zip_code": 66517, + "latitude": 39.115313, + "longitude": -96.71009, + "city": "Ogden", + "state": "KS", + "county": "Riley" + }, + { + "zip_code": 66518, + "latitude": 39.964838, + "longitude": -96.551054, + "city": "Oketo", + "state": "KS", + "county": "Marshall" + }, + { + "zip_code": 66520, + "latitude": 39.411089, + "longitude": -96.439613, + "city": "Olsburg", + "state": "KS", + "county": "Pottawatomie" + }, + { + "zip_code": 66521, + "latitude": 39.442426, + "longitude": -96.34428, + "city": "Onaga", + "state": "KS", + "county": "Pottawatomie" + }, + { + "zip_code": 66522, + "latitude": 39.865912, + "longitude": -95.93919, + "city": "Oneida", + "state": "KS", + "county": "Nemaha" + }, + { + "zip_code": 66523, + "latitude": 38.629558, + "longitude": -95.737112, + "city": "Osage City", + "state": "KS", + "county": "Osage" + }, + { + "zip_code": 66524, + "latitude": 38.724549, + "longitude": -95.574894, + "city": "Overbrook", + "state": "KS", + "county": "Osage" + }, + { + "zip_code": 66526, + "latitude": 39.069282, + "longitude": -96.167821, + "city": "Paxico", + "state": "KS", + "county": "Wabaunsee" + }, + { + "zip_code": 66527, + "latitude": 39.761448, + "longitude": -95.635089, + "city": "Powhattan", + "state": "KS", + "county": "Brown" + }, + { + "zip_code": 66528, + "latitude": 38.634939, + "longitude": -95.55521, + "city": "Quenemo", + "state": "KS", + "county": "Osage" + }, + { + "zip_code": 66531, + "latitude": 39.300456, + "longitude": -96.822207, + "city": "Riley", + "state": "KS", + "county": "Riley" + }, + { + "zip_code": 66532, + "latitude": 39.818216, + "longitude": -95.456658, + "city": "Robinson", + "state": "KS", + "county": "Brown" + }, + { + "zip_code": 66533, + "latitude": 39.158392, + "longitude": -95.959031, + "city": "Rossville", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66534, + "latitude": 39.899941, + "longitude": -95.802372, + "city": "Sabetha", + "state": "KS", + "county": "Nemaha" + }, + { + "zip_code": 66535, + "latitude": 39.28971, + "longitude": -96.435394, + "city": "Saint George", + "state": "KS", + "county": "Pottawatomie" + }, + { + "zip_code": 66536, + "latitude": 39.256719, + "longitude": -96.128154, + "city": "Saint Marys", + "state": "KS", + "county": "Pottawatomie" + }, + { + "zip_code": 66537, + "latitude": 38.74633, + "longitude": -95.675159, + "city": "Scranton", + "state": "KS", + "county": "Osage" + }, + { + "zip_code": 66538, + "latitude": 39.847328, + "longitude": -96.031629, + "city": "Seneca", + "state": "KS", + "county": "Nemaha" + }, + { + "zip_code": 66539, + "latitude": 39.151302, + "longitude": -95.86381, + "city": "Silver Lake", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66540, + "latitude": 39.478973, + "longitude": -95.825452, + "city": "Soldier", + "state": "KS", + "county": "Jackson" + }, + { + "zip_code": 66541, + "latitude": 39.847244, + "longitude": -96.510692, + "city": "Summerfield", + "state": "KS", + "county": "Marshall" + }, + { + "zip_code": 66542, + "latitude": 39.002048, + "longitude": -95.628841, + "city": "Tecumseh", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66543, + "latitude": 38.641898, + "longitude": -95.601158, + "city": "Vassar", + "state": "KS", + "county": "Osage" + }, + { + "zip_code": 66544, + "latitude": 39.689591, + "longitude": -96.495257, + "city": "Vermillion", + "state": "KS", + "county": "Marshall" + }, + { + "zip_code": 66546, + "latitude": 38.905693, + "longitude": -95.729868, + "city": "Wakarusa", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66547, + "latitude": 39.298416, + "longitude": -96.341383, + "city": "Wamego", + "state": "KS", + "county": "Pottawatomie" + }, + { + "zip_code": 66548, + "latitude": 39.763462, + "longitude": -96.701387, + "city": "Waterville", + "state": "KS", + "county": "Marshall" + }, + { + "zip_code": 66549, + "latitude": 39.4138, + "longitude": -96.437389, + "city": "Westmoreland", + "state": "KS", + "county": "Pottawatomie" + }, + { + "zip_code": 66550, + "latitude": 39.636115, + "longitude": -95.811894, + "city": "Wetmore", + "state": "KS", + "county": "Nemaha" + }, + { + "zip_code": 66551, + "latitude": 39.471738, + "longitude": -96.257561, + "city": "Wheaton", + "state": "KS", + "county": "Pottawatomie" + }, + { + "zip_code": 66552, + "latitude": 39.59411, + "longitude": -95.639154, + "city": "Whiting", + "state": "KS", + "county": "Jackson" + }, + { + "zip_code": 66554, + "latitude": 39.465421, + "longitude": -96.806367, + "city": "Randolph", + "state": "KS", + "county": "Riley" + }, + { + "zip_code": 66555, + "latitude": 39.783753, + "longitude": -96.522806, + "city": "Marysville", + "state": "KS", + "county": "Marshall" + }, + { + "zip_code": 66601, + "latitude": 38.988075, + "longitude": -95.780662, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66603, + "latitude": 39.05215, + "longitude": -95.675758, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66604, + "latitude": 39.045716, + "longitude": -95.758369, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66605, + "latitude": 39.01115, + "longitude": -95.592088, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66606, + "latitude": 39.059349, + "longitude": -95.72161, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66607, + "latitude": 39.044349, + "longitude": -95.630107, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66608, + "latitude": 39.080299, + "longitude": -95.645607, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66609, + "latitude": 38.96474, + "longitude": -95.615101, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66610, + "latitude": 38.975466, + "longitude": -95.817109, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66611, + "latitude": 39.0152, + "longitude": -95.695559, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66612, + "latitude": 39.04045, + "longitude": -95.679459, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66614, + "latitude": 39.017305, + "longitude": -95.779995, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66615, + "latitude": 39.055155, + "longitude": -95.854169, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66616, + "latitude": 39.065477, + "longitude": -95.626357, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66617, + "latitude": 39.15275, + "longitude": -95.793795, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66618, + "latitude": 39.139907, + "longitude": -95.801975, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66619, + "latitude": 38.953556, + "longitude": -95.723636, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66620, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66621, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66622, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66624, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66625, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66626, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66628, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66629, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66634, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66636, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66637, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66638, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66642, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66647, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66652, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66653, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66658, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66667, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66675, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66683, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66686, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66692, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66699, + "latitude": 39.042939, + "longitude": -95.769657, + "city": "Topeka", + "state": "KS", + "county": "Shawnee" + }, + { + "zip_code": 66701, + "latitude": 37.821629, + "longitude": -94.714793, + "city": "Fort Scott", + "state": "KS", + "county": "Bourbon" + }, + { + "zip_code": 66710, + "latitude": 37.525023, + "longitude": -95.661801, + "city": "Altoona", + "state": "KS", + "county": "Wilson" + }, + { + "zip_code": 66711, + "latitude": 37.601241, + "longitude": -94.697518, + "city": "Arcadia", + "state": "KS", + "county": "Crawford" + }, + { + "zip_code": 66712, + "latitude": 37.557295, + "longitude": -94.694906, + "city": "Arma", + "state": "KS", + "county": "Crawford" + }, + { + "zip_code": 66713, + "latitude": 37.139184, + "longitude": -94.789814, + "city": "Baxter Springs", + "state": "KS", + "county": "Cherokee" + }, + { + "zip_code": 66714, + "latitude": 37.611817, + "longitude": -95.703812, + "city": "Benedict", + "state": "KS", + "county": "Wilson" + }, + { + "zip_code": 66716, + "latitude": 37.874455, + "longitude": -95.02624, + "city": "Bronson", + "state": "KS", + "county": "Bourbon" + }, + { + "zip_code": 66717, + "latitude": 37.614292, + "longitude": -95.703647, + "city": "Buffalo", + "state": "KS", + "county": "Wilson" + }, + { + "zip_code": 66720, + "latitude": 37.609218, + "longitude": -95.416422, + "city": "Chanute", + "state": "KS", + "county": "Neosho" + }, + { + "zip_code": 66724, + "latitude": 37.368216, + "longitude": -94.832276, + "city": "Cherokee", + "state": "KS", + "county": "Crawford" + }, + { + "zip_code": 66725, + "latitude": 37.169887, + "longitude": -94.889857, + "city": "Columbus", + "state": "KS", + "county": "Cherokee" + }, + { + "zip_code": 66727, + "latitude": 37.559151, + "longitude": -95.743835, + "city": "Coyville", + "state": "KS", + "county": "Wilson" + }, + { + "zip_code": 66728, + "latitude": 37.16944, + "longitude": -94.704133, + "city": "Crestline", + "state": "KS", + "county": "Cherokee" + }, + { + "zip_code": 66732, + "latitude": 37.838456, + "longitude": -95.215073, + "city": "Elsmore", + "state": "KS", + "county": "Allen" + }, + { + "zip_code": 66733, + "latitude": 37.580055, + "longitude": -95.29892, + "city": "Erie", + "state": "KS", + "county": "Neosho" + }, + { + "zip_code": 66734, + "latitude": 37.624035, + "longitude": -94.798259, + "city": "Farlington", + "state": "KS", + "county": "Crawford" + }, + { + "zip_code": 66735, + "latitude": 37.437747, + "longitude": -94.683265, + "city": "Franklin", + "state": "KS", + "county": "Crawford" + }, + { + "zip_code": 66736, + "latitude": 37.571672, + "longitude": -95.748418, + "city": "Fredonia", + "state": "KS", + "county": "Wilson" + }, + { + "zip_code": 66738, + "latitude": 38.01017, + "longitude": -94.720191, + "city": "Fulton", + "state": "KS", + "county": "Bourbon" + }, + { + "zip_code": 66739, + "latitude": 37.15456, + "longitude": -94.833896, + "city": "Galena", + "state": "KS", + "county": "Cherokee" + }, + { + "zip_code": 66740, + "latitude": 37.472432, + "longitude": -95.370691, + "city": "Galesburg", + "state": "KS", + "county": "Neosho" + }, + { + "zip_code": 66741, + "latitude": 37.855416, + "longitude": -94.850996, + "city": "Garland", + "state": "KS", + "county": "Bourbon" + }, + { + "zip_code": 66742, + "latitude": 37.923162, + "longitude": -95.346697, + "city": "Gas", + "state": "KS", + "county": "Allen" + }, + { + "zip_code": 66743, + "latitude": 37.471611, + "longitude": -94.881385, + "city": "Girard", + "state": "KS", + "county": "Crawford" + }, + { + "zip_code": 66746, + "latitude": 37.638333, + "longitude": -94.942113, + "city": "Hepler", + "state": "KS", + "county": "Crawford" + }, + { + "zip_code": 66748, + "latitude": 37.829342, + "longitude": -95.34549, + "city": "Humboldt", + "state": "KS", + "county": "Allen" + }, + { + "zip_code": 66749, + "latitude": 37.885757, + "longitude": -95.391057, + "city": "Iola", + "state": "KS", + "county": "Allen" + }, + { + "zip_code": 66751, + "latitude": 37.914528, + "longitude": -95.255758, + "city": "La Harpe", + "state": "KS", + "county": "Allen" + }, + { + "zip_code": 66753, + "latitude": 37.448486, + "longitude": -94.856644, + "city": "Mc Cune", + "state": "KS", + "county": "Crawford" + }, + { + "zip_code": 66754, + "latitude": 37.855416, + "longitude": -94.850996, + "city": "Mapleton", + "state": "KS", + "county": "Bourbon" + }, + { + "zip_code": 66755, + "latitude": 37.914394, + "longitude": -95.197671, + "city": "Moran", + "state": "KS", + "county": "Allen" + }, + { + "zip_code": 66756, + "latitude": 37.54259, + "longitude": -94.661105, + "city": "Mulberry", + "state": "KS", + "county": "Crawford" + }, + { + "zip_code": 66757, + "latitude": 37.56084, + "longitude": -95.668445, + "city": "Neodesha", + "state": "KS", + "county": "Wilson" + }, + { + "zip_code": 66758, + "latitude": 37.998206, + "longitude": -95.622106, + "city": "Neosho Falls", + "state": "KS", + "county": "Woodson" + }, + { + "zip_code": 66759, + "latitude": 37.568982, + "longitude": -95.937861, + "city": "New Albany", + "state": "KS", + "county": "Wilson" + }, + { + "zip_code": 66760, + "latitude": 37.34199, + "longitude": -94.619885, + "city": "Opolis", + "state": "KS", + "county": "Crawford" + }, + { + "zip_code": 66761, + "latitude": 37.914531, + "longitude": -95.56937, + "city": "Piqua", + "state": "KS", + "county": "Woodson" + }, + { + "zip_code": 66762, + "latitude": 37.448044, + "longitude": -94.819212, + "city": "Pittsburg", + "state": "KS", + "county": "Crawford" + }, + { + "zip_code": 66763, + "latitude": 37.446615, + "longitude": -94.691566, + "city": "Frontenac", + "state": "KS", + "county": "Crawford" + }, + { + "zip_code": 66767, + "latitude": 38.178868, + "longitude": -94.705448, + "city": "Prescott", + "state": "KS", + "county": "Linn" + }, + { + "zip_code": 66769, + "latitude": 37.836666, + "longitude": -94.880482, + "city": "Redfield", + "state": "KS", + "county": "Bourbon" + }, + { + "zip_code": 66770, + "latitude": 37.073183, + "longitude": -94.758958, + "city": "Riverton", + "state": "KS", + "county": "Cherokee" + }, + { + "zip_code": 66771, + "latitude": 37.545144, + "longitude": -95.183687, + "city": "Saint Paul", + "state": "KS", + "county": "Neosho" + }, + { + "zip_code": 66772, + "latitude": 37.768978, + "longitude": -95.24453, + "city": "Savonburg", + "state": "KS", + "county": "Allen" + }, + { + "zip_code": 66773, + "latitude": 37.280945, + "longitude": -94.809198, + "city": "Scammon", + "state": "KS", + "county": "Cherokee" + }, + { + "zip_code": 66775, + "latitude": 37.675371, + "longitude": -95.178823, + "city": "Stark", + "state": "KS", + "county": "Neosho" + }, + { + "zip_code": 66776, + "latitude": 37.480322, + "longitude": -95.452585, + "city": "Thayer", + "state": "KS", + "county": "Neosho" + }, + { + "zip_code": 66777, + "latitude": 37.814423, + "longitude": -95.88888, + "city": "Toronto", + "state": "KS", + "county": "Woodson" + }, + { + "zip_code": 66778, + "latitude": 37.14002, + "longitude": -94.881789, + "city": "Treece", + "state": "KS", + "county": "Cherokee" + }, + { + "zip_code": 66779, + "latitude": 37.847185, + "longitude": -94.975786, + "city": "Uniontown", + "state": "KS", + "county": "Bourbon" + }, + { + "zip_code": 66780, + "latitude": 37.57292, + "longitude": -94.856834, + "city": "Walnut", + "state": "KS", + "county": "Crawford" + }, + { + "zip_code": 66781, + "latitude": 37.258838, + "longitude": -94.734382, + "city": "Weir", + "state": "KS", + "county": "Cherokee" + }, + { + "zip_code": 66782, + "latitude": 37.285147, + "longitude": -94.926124, + "city": "West Mineral", + "state": "KS", + "county": "Cherokee" + }, + { + "zip_code": 66783, + "latitude": 37.884741, + "longitude": -95.723555, + "city": "Yates Center", + "state": "KS", + "county": "Woodson" + }, + { + "zip_code": 66801, + "latitude": 38.434153, + "longitude": -96.152766, + "city": "Emporia", + "state": "KS", + "county": "Lyon" + }, + { + "zip_code": 66830, + "latitude": 38.608394, + "longitude": -96.108283, + "city": "Admire", + "state": "KS", + "county": "Lyon" + }, + { + "zip_code": 66833, + "latitude": 38.652011, + "longitude": -96.173461, + "city": "Allen", + "state": "KS", + "county": "Lyon" + }, + { + "zip_code": 66834, + "latitude": 38.864507, + "longitude": -96.488112, + "city": "Alta Vista", + "state": "KS", + "county": "Wabaunsee" + }, + { + "zip_code": 66835, + "latitude": 38.556174, + "longitude": -96.261884, + "city": "Americus", + "state": "KS", + "county": "Lyon" + }, + { + "zip_code": 66838, + "latitude": 38.565758, + "longitude": -96.801336, + "city": "Burdick", + "state": "KS", + "county": "Morris" + }, + { + "zip_code": 66839, + "latitude": 38.236316, + "longitude": -95.733598, + "city": "Burlington", + "state": "KS", + "county": "Coffey" + }, + { + "zip_code": 66840, + "latitude": 38.089221, + "longitude": -96.888518, + "city": "Burns", + "state": "KS", + "county": "Marion" + }, + { + "zip_code": 66842, + "latitude": 37.995545, + "longitude": -96.661017, + "city": "Cassoday", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 66843, + "latitude": 38.260042, + "longitude": -96.822766, + "city": "Cedar Point", + "state": "KS", + "county": "Chase" + }, + { + "zip_code": 66845, + "latitude": 38.37674, + "longitude": -96.54945, + "city": "Cottonwood Falls", + "state": "KS", + "county": "Chase" + }, + { + "zip_code": 66846, + "latitude": 38.69588, + "longitude": -96.5469, + "city": "Council Grove", + "state": "KS", + "county": "Morris" + }, + { + "zip_code": 66849, + "latitude": 38.826679, + "longitude": -96.579805, + "city": "Dwight", + "state": "KS", + "county": "Morris" + }, + { + "zip_code": 66850, + "latitude": 38.372982, + "longitude": -96.646064, + "city": "Elmdale", + "state": "KS", + "county": "Chase" + }, + { + "zip_code": 66851, + "latitude": 38.293353, + "longitude": -96.974518, + "city": "Florence", + "state": "KS", + "county": "Marion" + }, + { + "zip_code": 66852, + "latitude": 38.105539, + "longitude": -95.794536, + "city": "Gridley", + "state": "KS", + "county": "Coffey" + }, + { + "zip_code": 66853, + "latitude": 37.980393, + "longitude": -96.199508, + "city": "Hamilton", + "state": "KS", + "county": "Greenwood" + }, + { + "zip_code": 66854, + "latitude": 38.345691, + "longitude": -96.103771, + "city": "Hartford", + "state": "KS", + "county": "Lyon" + }, + { + "zip_code": 66855, + "latitude": 37.888276, + "longitude": -96.242059, + "city": "Lamont", + "state": "KS", + "county": "Greenwood" + }, + { + "zip_code": 66856, + "latitude": 38.237155, + "longitude": -95.790281, + "city": "Lebo", + "state": "KS", + "county": "Coffey" + }, + { + "zip_code": 66857, + "latitude": 38.11486, + "longitude": -95.685599, + "city": "Le Roy", + "state": "KS", + "county": "Coffey" + }, + { + "zip_code": 66858, + "latitude": 38.493293, + "longitude": -96.96264, + "city": "Lincolnville", + "state": "KS", + "county": "Marion" + }, + { + "zip_code": 66859, + "latitude": 38.566392, + "longitude": -96.967811, + "city": "Lost Springs", + "state": "KS", + "county": "Marion" + }, + { + "zip_code": 66860, + "latitude": 38.061943, + "longitude": -96.144795, + "city": "Madison", + "state": "KS", + "county": "Greenwood" + }, + { + "zip_code": 66861, + "latitude": 38.284561, + "longitude": -96.965255, + "city": "Marion", + "state": "KS", + "county": "Marion" + }, + { + "zip_code": 66862, + "latitude": 38.303962, + "longitude": -96.597442, + "city": "Matfield Green", + "state": "KS", + "county": "Chase" + }, + { + "zip_code": 66863, + "latitude": 37.888276, + "longitude": -96.242059, + "city": "Neal", + "state": "KS", + "county": "Greenwood" + }, + { + "zip_code": 66864, + "latitude": 38.413332, + "longitude": -96.103875, + "city": "Neosho Rapids", + "state": "KS", + "county": "Lyon" + }, + { + "zip_code": 66865, + "latitude": 38.354006, + "longitude": -96.1903, + "city": "Olpe", + "state": "KS", + "county": "Lyon" + }, + { + "zip_code": 66866, + "latitude": 38.134801, + "longitude": -97.003776, + "city": "Peabody", + "state": "KS", + "county": "Marion" + }, + { + "zip_code": 66868, + "latitude": 38.533232, + "longitude": -96.01436, + "city": "Reading", + "state": "KS", + "county": "Lyon" + }, + { + "zip_code": 66869, + "latitude": 38.390683, + "longitude": -96.538737, + "city": "Strong City", + "state": "KS", + "county": "Chase" + }, + { + "zip_code": 66870, + "latitude": 37.978282, + "longitude": -96.012585, + "city": "Virgil", + "state": "KS", + "county": "Greenwood" + }, + { + "zip_code": 66871, + "latitude": 38.346908, + "longitude": -95.628088, + "city": "Waverly", + "state": "KS", + "county": "Coffey" + }, + { + "zip_code": 66872, + "latitude": 38.783116, + "longitude": -96.779581, + "city": "White City", + "state": "KS", + "county": "Morris" + }, + { + "zip_code": 66873, + "latitude": 38.682093, + "longitude": -96.663865, + "city": "Wilsey", + "state": "KS", + "county": "Morris" + }, + { + "zip_code": 66901, + "latitude": 39.551634, + "longitude": -97.656764, + "city": "Concordia", + "state": "KS", + "county": "Cloud" + }, + { + "zip_code": 66930, + "latitude": 39.70438, + "longitude": -97.446521, + "city": "Agenda", + "state": "KS", + "county": "Republic" + }, + { + "zip_code": 66932, + "latitude": 39.766784, + "longitude": -98.919297, + "city": "Athol", + "state": "KS", + "county": "Smith" + }, + { + "zip_code": 66933, + "latitude": 39.681367, + "longitude": -96.862609, + "city": "Barnes", + "state": "KS", + "county": "Washington" + }, + { + "zip_code": 66935, + "latitude": 39.836218, + "longitude": -97.601461, + "city": "Belleville", + "state": "KS", + "county": "Republic" + }, + { + "zip_code": 66936, + "latitude": 39.784792, + "longitude": -98.218469, + "city": "Burr Oak", + "state": "KS", + "county": "Jewell" + }, + { + "zip_code": 66937, + "latitude": 39.655509, + "longitude": -97.17341, + "city": "Clifton", + "state": "KS", + "county": "Washington" + }, + { + "zip_code": 66938, + "latitude": 39.59127, + "longitude": -97.398639, + "city": "Clyde", + "state": "KS", + "county": "Cloud" + }, + { + "zip_code": 66939, + "latitude": 39.746555, + "longitude": -97.666524, + "city": "Courtland", + "state": "KS", + "county": "Republic" + }, + { + "zip_code": 66940, + "latitude": 39.801787, + "longitude": -97.458269, + "city": "Cuba", + "state": "KS", + "county": "Republic" + }, + { + "zip_code": 66941, + "latitude": 39.820964, + "longitude": -98.433369, + "city": "Esbon", + "state": "KS", + "county": "Jewell" + }, + { + "zip_code": 66942, + "latitude": 39.778286, + "longitude": -97.993161, + "city": "Formoso", + "state": "KS", + "county": "Jewell" + }, + { + "zip_code": 66943, + "latitude": 39.687997, + "longitude": -96.975097, + "city": "Greenleaf", + "state": "KS", + "county": "Washington" + }, + { + "zip_code": 66944, + "latitude": 39.83551, + "longitude": -97.269445, + "city": "Haddam", + "state": "KS", + "county": "Washington" + }, + { + "zip_code": 66945, + "latitude": 39.867079, + "longitude": -96.896534, + "city": "Hanover", + "state": "KS", + "county": "Washington" + }, + { + "zip_code": 66946, + "latitude": 39.841523, + "longitude": -96.966275, + "city": "Hollenberg", + "state": "KS", + "county": "Washington" + }, + { + "zip_code": 66948, + "latitude": 39.598963, + "longitude": -97.86117, + "city": "Jamestown", + "state": "KS", + "county": "Cloud" + }, + { + "zip_code": 66949, + "latitude": 39.671874, + "longitude": -98.147215, + "city": "Jewell", + "state": "KS", + "county": "Jewell" + }, + { + "zip_code": 66951, + "latitude": 39.783621, + "longitude": -98.796287, + "city": "Kensington", + "state": "KS", + "county": "Smith" + }, + { + "zip_code": 66952, + "latitude": 39.807699, + "longitude": -98.556016, + "city": "Lebanon", + "state": "KS", + "county": "Smith" + }, + { + "zip_code": 66953, + "latitude": 39.784861, + "longitude": -97.168514, + "city": "Linn", + "state": "KS", + "county": "Washington" + }, + { + "zip_code": 66955, + "latitude": 39.841669, + "longitude": -97.22614, + "city": "Mahaska", + "state": "KS", + "county": "Washington" + }, + { + "zip_code": 66956, + "latitude": 39.787529, + "longitude": -98.20595, + "city": "Mankato", + "state": "KS", + "county": "Jewell" + }, + { + "zip_code": 66958, + "latitude": 39.885808, + "longitude": -97.172061, + "city": "Morrowville", + "state": "KS", + "county": "Washington" + }, + { + "zip_code": 66959, + "latitude": 39.860279, + "longitude": -97.498488, + "city": "Munden", + "state": "KS", + "county": "Republic" + }, + { + "zip_code": 66960, + "latitude": 39.960731, + "longitude": -97.428585, + "city": "Narka", + "state": "KS", + "county": "Republic" + }, + { + "zip_code": 66961, + "latitude": 39.827894, + "longitude": -97.650902, + "city": "Norway", + "state": "KS", + "county": "Republic" + }, + { + "zip_code": 66962, + "latitude": 39.610229, + "longitude": -97.12993, + "city": "Palmer", + "state": "KS", + "county": "Washington" + }, + { + "zip_code": 66963, + "latitude": 39.643012, + "longitude": -98.044991, + "city": "Randall", + "state": "KS", + "county": "Jewell" + }, + { + "zip_code": 66964, + "latitude": 39.875728, + "longitude": -97.628516, + "city": "Republic", + "state": "KS", + "county": "Republic" + }, + { + "zip_code": 66966, + "latitude": 39.794591, + "longitude": -97.783734, + "city": "Scandia", + "state": "KS", + "county": "Republic" + }, + { + "zip_code": 66967, + "latitude": 39.788577, + "longitude": -98.673356, + "city": "Smith Center", + "state": "KS", + "county": "Smith" + }, + { + "zip_code": 66968, + "latitude": 39.781107, + "longitude": -97.054286, + "city": "Washington", + "state": "KS", + "county": "Washington" + }, + { + "zip_code": 66970, + "latitude": 39.935373, + "longitude": -98.035371, + "city": "Webber", + "state": "KS", + "county": "Jewell" + }, + { + "zip_code": 67001, + "latitude": 37.779733, + "longitude": -97.636619, + "city": "Andale", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67002, + "latitude": 37.701532, + "longitude": -97.098431, + "city": "Andover", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67003, + "latitude": 37.111488, + "longitude": -98.048121, + "city": "Anthony", + "state": "KS", + "county": "Harper" + }, + { + "zip_code": 67004, + "latitude": 37.248959, + "longitude": -97.690887, + "city": "Argonia", + "state": "KS", + "county": "Sumner" + }, + { + "zip_code": 67005, + "latitude": 37.149582, + "longitude": -96.904215, + "city": "Arkansas City", + "state": "KS", + "county": "Cowley" + }, + { + "zip_code": 67008, + "latitude": 37.378279, + "longitude": -96.720974, + "city": "Atlanta", + "state": "KS", + "county": "Cowley" + }, + { + "zip_code": 67009, + "latitude": 37.224885, + "longitude": -98.210087, + "city": "Attica", + "state": "KS", + "county": "Harper" + }, + { + "zip_code": 67010, + "latitude": 37.674347, + "longitude": -96.970128, + "city": "Augusta", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67012, + "latitude": 37.658007, + "longitude": -96.532862, + "city": "Beaumont", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67013, + "latitude": 37.359755, + "longitude": -97.287694, + "city": "Belle Plaine", + "state": "KS", + "county": "Sumner" + }, + { + "zip_code": 67016, + "latitude": 37.886596, + "longitude": -97.516631, + "city": "Bentley", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67017, + "latitude": 37.831767, + "longitude": -97.097363, + "city": "Benton", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67018, + "latitude": 37.062263, + "longitude": -97.865887, + "city": "Bluff City", + "state": "KS", + "county": "Harper" + }, + { + "zip_code": 67019, + "latitude": 37.37062, + "longitude": -96.759983, + "city": "Burden", + "state": "KS", + "county": "Cowley" + }, + { + "zip_code": 67020, + "latitude": 38.021434, + "longitude": -97.537188, + "city": "Burrton", + "state": "KS", + "county": "Harvey" + }, + { + "zip_code": 67021, + "latitude": 37.777955, + "longitude": -98.931119, + "city": "Byers", + "state": "KS", + "county": "Pratt" + }, + { + "zip_code": 67022, + "latitude": 37.133257, + "longitude": -97.601664, + "city": "Caldwell", + "state": "KS", + "county": "Sumner" + }, + { + "zip_code": 67023, + "latitude": 37.309434, + "longitude": -96.717001, + "city": "Cambridge", + "state": "KS", + "county": "Cowley" + }, + { + "zip_code": 67024, + "latitude": 37.130234, + "longitude": -96.444127, + "city": "Cedar Vale", + "state": "KS", + "county": "Chautauqua" + }, + { + "zip_code": 67025, + "latitude": 37.633711, + "longitude": -97.73513, + "city": "Cheney", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67026, + "latitude": 37.548282, + "longitude": -97.488432, + "city": "Clearwater", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67028, + "latitude": 37.638236, + "longitude": -98.889244, + "city": "Coats", + "state": "KS", + "county": "Pratt" + }, + { + "zip_code": 67029, + "latitude": 37.25486, + "longitude": -99.322574, + "city": "Coldwater", + "state": "KS", + "county": "Comanche" + }, + { + "zip_code": 67030, + "latitude": 37.77081, + "longitude": -97.545886, + "city": "Colwich", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67031, + "latitude": 37.394301, + "longitude": -97.658248, + "city": "Conway Springs", + "state": "KS", + "county": "Sumner" + }, + { + "zip_code": 67035, + "latitude": 37.630922, + "longitude": -98.35639, + "city": "Cunningham", + "state": "KS", + "county": "Kingman" + }, + { + "zip_code": 67036, + "latitude": 37.299891, + "longitude": -97.86969, + "city": "Danville", + "state": "KS", + "county": "Harper" + }, + { + "zip_code": 67037, + "latitude": 37.566129, + "longitude": -97.228475, + "city": "Derby", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67038, + "latitude": 37.178743, + "longitude": -96.715776, + "city": "Dexter", + "state": "KS", + "county": "Cowley" + }, + { + "zip_code": 67039, + "latitude": 37.535867, + "longitude": -96.998807, + "city": "Douglass", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67041, + "latitude": 38.054538, + "longitude": -97.128356, + "city": "Elbing", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67042, + "latitude": 37.830491, + "longitude": -96.865969, + "city": "El Dorado", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67045, + "latitude": 37.755154, + "longitude": -96.170019, + "city": "Eureka", + "state": "KS", + "county": "Greenwood" + }, + { + "zip_code": 67047, + "latitude": 37.607625, + "longitude": -96.029221, + "city": "Fall River", + "state": "KS", + "county": "Greenwood" + }, + { + "zip_code": 67049, + "latitude": 37.175377, + "longitude": -97.857243, + "city": "Freeport", + "state": "KS", + "county": "Harper" + }, + { + "zip_code": 67050, + "latitude": 37.674242, + "longitude": -97.654917, + "city": "Garden Plain", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67051, + "latitude": 37.139313, + "longitude": -97.458635, + "city": "Geuda Springs", + "state": "KS", + "county": "Sumner" + }, + { + "zip_code": 67052, + "latitude": 37.663432, + "longitude": -97.579616, + "city": "Goddard", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67053, + "latitude": 38.219081, + "longitude": -97.325769, + "city": "Goessel", + "state": "KS", + "county": "Marion" + }, + { + "zip_code": 67054, + "latitude": 37.607534, + "longitude": -99.204968, + "city": "Greensburg", + "state": "KS", + "county": "Kiowa" + }, + { + "zip_code": 67055, + "latitude": 37.78335, + "longitude": -97.205419, + "city": "Greenwich", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67056, + "latitude": 38.02428, + "longitude": -97.509713, + "city": "Halstead", + "state": "KS", + "county": "Harvey" + }, + { + "zip_code": 67057, + "latitude": 37.076952, + "longitude": -98.751916, + "city": "Hardtner", + "state": "KS", + "county": "Barber" + }, + { + "zip_code": 67058, + "latitude": 37.291318, + "longitude": -98.038455, + "city": "Harper", + "state": "KS", + "county": "Harper" + }, + { + "zip_code": 67059, + "latitude": 37.612557, + "longitude": -99.192552, + "city": "Haviland", + "state": "KS", + "county": "Kiowa" + }, + { + "zip_code": 67060, + "latitude": 37.542404, + "longitude": -97.36324, + "city": "Haysville", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67061, + "latitude": 37.114569, + "longitude": -98.410166, + "city": "Hazelton", + "state": "KS", + "county": "Barber" + }, + { + "zip_code": 67062, + "latitude": 38.137404, + "longitude": -97.443222, + "city": "Hesston", + "state": "KS", + "county": "Harvey" + }, + { + "zip_code": 67063, + "latitude": 38.347988, + "longitude": -97.205656, + "city": "Hillsboro", + "state": "KS", + "county": "Marion" + }, + { + "zip_code": 67065, + "latitude": 37.427542, + "longitude": -98.551564, + "city": "Isabel", + "state": "KS", + "county": "Barber" + }, + { + "zip_code": 67066, + "latitude": 37.75535, + "longitude": -98.756921, + "city": "Iuka", + "state": "KS", + "county": "Pratt" + }, + { + "zip_code": 67067, + "latitude": 37.810488, + "longitude": -97.259353, + "city": "Kechi", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67068, + "latitude": 37.596364, + "longitude": -98.130432, + "city": "Kingman", + "state": "KS", + "county": "Kingman" + }, + { + "zip_code": 67070, + "latitude": 37.138561, + "longitude": -98.503736, + "city": "Kiowa", + "state": "KS", + "county": "Barber" + }, + { + "zip_code": 67071, + "latitude": 37.264177, + "longitude": -98.818915, + "city": "Lake City", + "state": "KS", + "county": "Barber" + }, + { + "zip_code": 67072, + "latitude": 37.606889, + "longitude": -96.658181, + "city": "Latham", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67073, + "latitude": 38.372882, + "longitude": -97.302858, + "city": "Lehigh", + "state": "KS", + "county": "Marion" + }, + { + "zip_code": 67074, + "latitude": 37.66475, + "longitude": -96.748795, + "city": "Leon", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67101, + "latitude": 37.789561, + "longitude": -97.486701, + "city": "Maize", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67102, + "latitude": 37.2377, + "longitude": -96.838911, + "city": "Maple City", + "state": "KS", + "county": "Cowley" + }, + { + "zip_code": 67103, + "latitude": 37.268787, + "longitude": -97.556978, + "city": "Mayfield", + "state": "KS", + "county": "Sumner" + }, + { + "zip_code": 67104, + "latitude": 37.291739, + "longitude": -98.620996, + "city": "Medicine Lodge", + "state": "KS", + "county": "Barber" + }, + { + "zip_code": 67105, + "latitude": 37.227503, + "longitude": -97.674141, + "city": "Milan", + "state": "KS", + "county": "Sumner" + }, + { + "zip_code": 67106, + "latitude": 37.430408, + "longitude": -97.742966, + "city": "Milton", + "state": "KS", + "county": "Sumner" + }, + { + "zip_code": 67107, + "latitude": 38.217149, + "longitude": -97.523327, + "city": "Moundridge", + "state": "KS", + "county": "Mcpherson" + }, + { + "zip_code": 67108, + "latitude": 37.823852, + "longitude": -97.637834, + "city": "Mount Hope", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67109, + "latitude": 37.593142, + "longitude": -99.387747, + "city": "Mullinville", + "state": "KS", + "county": "Kiowa" + }, + { + "zip_code": 67110, + "latitude": 37.3732, + "longitude": -97.441654, + "city": "Mulvane", + "state": "KS", + "county": "Sumner" + }, + { + "zip_code": 67111, + "latitude": 37.619803, + "longitude": -97.963093, + "city": "Murdock", + "state": "KS", + "county": "Kingman" + }, + { + "zip_code": 67112, + "latitude": 37.471011, + "longitude": -98.391558, + "city": "Nashville", + "state": "KS", + "county": "Kingman" + }, + { + "zip_code": 67114, + "latitude": 38.044857, + "longitude": -97.317279, + "city": "Newton", + "state": "KS", + "county": "Harvey" + }, + { + "zip_code": 67117, + "latitude": 38.048707, + "longitude": -97.355813, + "city": "North Newton", + "state": "KS", + "county": "Harvey" + }, + { + "zip_code": 67118, + "latitude": 37.486261, + "longitude": -97.923919, + "city": "Norwich", + "state": "KS", + "county": "Kingman" + }, + { + "zip_code": 67119, + "latitude": 37.231595, + "longitude": -97.212224, + "city": "Oxford", + "state": "KS", + "county": "Sumner" + }, + { + "zip_code": 67120, + "latitude": 37.50541, + "longitude": -97.340797, + "city": "Peck", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67122, + "latitude": 37.888276, + "longitude": -96.242059, + "city": "Piedmont", + "state": "KS", + "county": "Greenwood" + }, + { + "zip_code": 67123, + "latitude": 37.937595, + "longitude": -97.038364, + "city": "Potwin", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67124, + "latitude": 37.63857, + "longitude": -98.758512, + "city": "Pratt", + "state": "KS", + "county": "Pratt" + }, + { + "zip_code": 67127, + "latitude": 37.200135, + "longitude": -99.482888, + "city": "Protection", + "state": "KS", + "county": "Comanche" + }, + { + "zip_code": 67128, + "latitude": 37.436647, + "longitude": -97.995064, + "city": "Rago", + "state": "KS", + "county": "Kingman" + }, + { + "zip_code": 67131, + "latitude": 37.441278, + "longitude": -97.005906, + "city": "Rock", + "state": "KS", + "county": "Cowley" + }, + { + "zip_code": 67132, + "latitude": 37.828375, + "longitude": -96.80597, + "city": "Rosalia", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67133, + "latitude": 37.56297, + "longitude": -97.090019, + "city": "Rose Hill", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67134, + "latitude": 37.509541, + "longitude": -98.647923, + "city": "Sawyer", + "state": "KS", + "county": "Pratt" + }, + { + "zip_code": 67135, + "latitude": 37.955789, + "longitude": -97.473214, + "city": "Sedgwick", + "state": "KS", + "county": "Harvey" + }, + { + "zip_code": 67137, + "latitude": 37.61705, + "longitude": -96.225157, + "city": "Severy", + "state": "KS", + "county": "Greenwood" + }, + { + "zip_code": 67138, + "latitude": 37.224446, + "longitude": -98.42233, + "city": "Sharon", + "state": "KS", + "county": "Barber" + }, + { + "zip_code": 67140, + "latitude": 37.136607, + "longitude": -97.329247, + "city": "South Haven", + "state": "KS", + "county": "Sumner" + }, + { + "zip_code": 67142, + "latitude": 37.491201, + "longitude": -98.209956, + "city": "Spivey", + "state": "KS", + "county": "Kingman" + }, + { + "zip_code": 67143, + "latitude": 37.357385, + "longitude": -98.91273, + "city": "Sun City", + "state": "KS", + "county": "Barber" + }, + { + "zip_code": 67144, + "latitude": 37.905383, + "longitude": -96.85903, + "city": "Towanda", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67146, + "latitude": 37.387823, + "longitude": -97.117926, + "city": "Udall", + "state": "KS", + "county": "Cowley" + }, + { + "zip_code": 67147, + "latitude": 37.845078, + "longitude": -97.335537, + "city": "Valley Center", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67149, + "latitude": 37.583241, + "longitude": -97.519347, + "city": "Viola", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67150, + "latitude": 37.140233, + "longitude": -98.238653, + "city": "Waldron", + "state": "KS", + "county": "Harper" + }, + { + "zip_code": 67151, + "latitude": 38.123189, + "longitude": -97.244464, + "city": "Walton", + "state": "KS", + "county": "Harvey" + }, + { + "zip_code": 67152, + "latitude": 37.280877, + "longitude": -97.42223, + "city": "Wellington", + "state": "KS", + "county": "Sumner" + }, + { + "zip_code": 67154, + "latitude": 37.977983, + "longitude": -97.088361, + "city": "Whitewater", + "state": "KS", + "county": "Butler" + }, + { + "zip_code": 67155, + "latitude": 37.191758, + "longitude": -99.272769, + "city": "Wilmore", + "state": "KS", + "county": "Comanche" + }, + { + "zip_code": 67156, + "latitude": 37.232126, + "longitude": -96.996334, + "city": "Winfield", + "state": "KS", + "county": "Cowley" + }, + { + "zip_code": 67159, + "latitude": 37.449631, + "longitude": -98.3057, + "city": "Zenda", + "state": "KS", + "county": "Kingman" + }, + { + "zip_code": 67201, + "latitude": 37.651974, + "longitude": -97.258997, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67202, + "latitude": 37.686189, + "longitude": -97.334713, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67203, + "latitude": 37.706514, + "longitude": -97.395351, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67204, + "latitude": 37.787925, + "longitude": -97.381233, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67205, + "latitude": 37.773675, + "longitude": -97.444035, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67206, + "latitude": 37.613954, + "longitude": -97.342752, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67207, + "latitude": 37.671048, + "longitude": -97.217907, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67208, + "latitude": 37.74451, + "longitude": -97.276421, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67209, + "latitude": 37.666579, + "longitude": -97.435012, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67210, + "latitude": 37.615901, + "longitude": -97.247359, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67211, + "latitude": 37.661, + "longitude": -97.312573, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67212, + "latitude": 37.701795, + "longitude": -97.435443, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67213, + "latitude": 37.668005, + "longitude": -97.36497, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67214, + "latitude": 37.706143, + "longitude": -97.319593, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67215, + "latitude": 37.626635, + "longitude": -97.425673, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67216, + "latitude": 37.605237, + "longitude": -97.314573, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67217, + "latitude": 37.643576, + "longitude": -97.392906, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67218, + "latitude": 37.668282, + "longitude": -97.280784, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67219, + "latitude": 37.773805, + "longitude": -97.265034, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67220, + "latitude": 37.766663, + "longitude": -97.280524, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67221, + "latitude": 37.628158, + "longitude": -97.26626, + "city": "Mcconnell Afb", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67223, + "latitude": 37.73674, + "longitude": -97.499, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67226, + "latitude": 37.774074, + "longitude": -97.212044, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67227, + "latitude": 37.62812, + "longitude": -97.491566, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67228, + "latitude": 37.774174, + "longitude": -97.171098, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67230, + "latitude": 37.679502, + "longitude": -97.171332, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67231, + "latitude": 37.556692, + "longitude": -97.410154, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67232, + "latitude": 37.639491, + "longitude": -97.171372, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67233, + "latitude": 37.542472, + "longitude": -97.351987, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67235, + "latitude": 37.714891, + "longitude": -97.499024, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67236, + "latitude": 37.542182, + "longitude": -97.287134, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67251, + "latitude": 37.693588, + "longitude": -97.480419, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67256, + "latitude": 37.693588, + "longitude": -97.480419, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67257, + "latitude": 37.693588, + "longitude": -97.480419, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67259, + "latitude": 37.693588, + "longitude": -97.480419, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67260, + "latitude": 37.693588, + "longitude": -97.480419, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67275, + "latitude": 37.693588, + "longitude": -97.480419, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67276, + "latitude": 37.693588, + "longitude": -97.480419, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67277, + "latitude": 37.693588, + "longitude": -97.480419, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67278, + "latitude": 37.693588, + "longitude": -97.480419, + "city": "Wichita", + "state": "KS", + "county": "Sedgwick" + }, + { + "zip_code": 67301, + "latitude": 37.180636, + "longitude": -95.756197, + "city": "Independence", + "state": "KS", + "county": "Montgomery" + }, + { + "zip_code": 67330, + "latitude": 37.222616, + "longitude": -95.360819, + "city": "Altamont", + "state": "KS", + "county": "Labette" + }, + { + "zip_code": 67332, + "latitude": 37.045463, + "longitude": -95.229916, + "city": "Bartlett", + "state": "KS", + "county": "Labette" + }, + { + "zip_code": 67333, + "latitude": 37.048046, + "longitude": -95.884949, + "city": "Caney", + "state": "KS", + "county": "Montgomery" + }, + { + "zip_code": 67334, + "latitude": 37.026243, + "longitude": -96.178281, + "city": "Chautauqua", + "state": "KS", + "county": "Chautauqua" + }, + { + "zip_code": 67335, + "latitude": 37.167997, + "longitude": -95.732508, + "city": "Cherryvale", + "state": "KS", + "county": "Montgomery" + }, + { + "zip_code": 67336, + "latitude": 37.04542, + "longitude": -95.218047, + "city": "Chetopa", + "state": "KS", + "county": "Labette" + }, + { + "zip_code": 67337, + "latitude": 37.146267, + "longitude": -95.748313, + "city": "Coffeyville", + "state": "KS", + "county": "Montgomery" + }, + { + "zip_code": 67340, + "latitude": 37.043836, + "longitude": -95.732624, + "city": "Dearing", + "state": "KS", + "county": "Montgomery" + }, + { + "zip_code": 67341, + "latitude": 37.220501, + "longitude": -95.434853, + "city": "Dennis", + "state": "KS", + "county": "Labette" + }, + { + "zip_code": 67342, + "latitude": 37.071835, + "longitude": -95.347225, + "city": "Edna", + "state": "KS", + "county": "Labette" + }, + { + "zip_code": 67344, + "latitude": 37.288869, + "longitude": -95.908001, + "city": "Elk City", + "state": "KS", + "county": "Montgomery" + }, + { + "zip_code": 67345, + "latitude": 37.383228, + "longitude": -96.272149, + "city": "Elk Falls", + "state": "KS", + "county": "Elk" + }, + { + "zip_code": 67346, + "latitude": 37.406927, + "longitude": -96.384362, + "city": "Grenola", + "state": "KS", + "county": "Elk" + }, + { + "zip_code": 67347, + "latitude": 37.092548, + "longitude": -95.94175, + "city": "Havana", + "state": "KS", + "county": "Montgomery" + }, + { + "zip_code": 67349, + "latitude": 37.419933, + "longitude": -96.278611, + "city": "Howard", + "state": "KS", + "county": "Elk" + }, + { + "zip_code": 67351, + "latitude": 37.09922, + "longitude": -95.583588, + "city": "Liberty", + "state": "KS", + "county": "Montgomery" + }, + { + "zip_code": 67352, + "latitude": 37.374756, + "longitude": -96.13358, + "city": "Longton", + "state": "KS", + "county": "Elk" + }, + { + "zip_code": 67353, + "latitude": 37.357438, + "longitude": -96.373849, + "city": "Moline", + "state": "KS", + "county": "Elk" + }, + { + "zip_code": 67354, + "latitude": 37.215113, + "longitude": -95.422081, + "city": "Mound Valley", + "state": "KS", + "county": "Labette" + }, + { + "zip_code": 67355, + "latitude": 37.037043, + "longitude": -96.012058, + "city": "Niotaze", + "state": "KS", + "county": "Chautauqua" + }, + { + "zip_code": 67356, + "latitude": 37.18919, + "longitude": -95.242611, + "city": "Oswego", + "state": "KS", + "county": "Labette" + }, + { + "zip_code": 67357, + "latitude": 37.217756, + "longitude": -95.266407, + "city": "Parsons", + "state": "KS", + "county": "Labette" + }, + { + "zip_code": 67360, + "latitude": 37.048401, + "longitude": -96.07768, + "city": "Peru", + "state": "KS", + "county": "Chautauqua" + }, + { + "zip_code": 67361, + "latitude": 37.134351, + "longitude": -96.219212, + "city": "Sedan", + "state": "KS", + "county": "Chautauqua" + }, + { + "zip_code": 67363, + "latitude": 37.328119, + "longitude": -95.71697, + "city": "Sycamore", + "state": "KS", + "county": "Montgomery" + }, + { + "zip_code": 67364, + "latitude": 37.036984, + "longitude": -95.823721, + "city": "Tyro", + "state": "KS", + "county": "Montgomery" + }, + { + "zip_code": 67401, + "latitude": 38.823673, + "longitude": -97.642113, + "city": "Salina", + "state": "KS", + "county": "Saline" + }, + { + "zip_code": 67402, + "latitude": 38.78359, + "longitude": -97.650446, + "city": "Salina", + "state": "KS", + "county": "Saline" + }, + { + "zip_code": 67410, + "latitude": 38.9111, + "longitude": -97.195283, + "city": "Abilene", + "state": "KS", + "county": "Dickinson" + }, + { + "zip_code": 67416, + "latitude": 38.688891, + "longitude": -97.59426, + "city": "Assaria", + "state": "KS", + "county": "Saline" + }, + { + "zip_code": 67417, + "latitude": 39.45212, + "longitude": -97.529562, + "city": "Aurora", + "state": "KS", + "county": "Cloud" + }, + { + "zip_code": 67418, + "latitude": 39.188663, + "longitude": -98.044605, + "city": "Barnard", + "state": "KS", + "county": "Lincoln" + }, + { + "zip_code": 67420, + "latitude": 39.441631, + "longitude": -98.119189, + "city": "Beloit", + "state": "KS", + "county": "Mitchell" + }, + { + "zip_code": 67422, + "latitude": 39.019928, + "longitude": -97.622108, + "city": "Bennington", + "state": "KS", + "county": "Ottawa" + }, + { + "zip_code": 67423, + "latitude": 39.045239, + "longitude": -98.209248, + "city": "Beverly", + "state": "KS", + "county": "Lincoln" + }, + { + "zip_code": 67425, + "latitude": 38.783921, + "longitude": -97.854579, + "city": "Brookville", + "state": "KS", + "county": "Saline" + }, + { + "zip_code": 67427, + "latitude": 38.463875, + "longitude": -98.387168, + "city": "Bushton", + "state": "KS", + "county": "Rice" + }, + { + "zip_code": 67428, + "latitude": 38.392631, + "longitude": -97.426953, + "city": "Canton", + "state": "KS", + "county": "Mcpherson" + }, + { + "zip_code": 67430, + "latitude": 39.451105, + "longitude": -98.187156, + "city": "Cawker City", + "state": "KS", + "county": "Mitchell" + }, + { + "zip_code": 67431, + "latitude": 38.972672, + "longitude": -97.018914, + "city": "Chapman", + "state": "KS", + "county": "Dickinson" + }, + { + "zip_code": 67432, + "latitude": 39.349452, + "longitude": -97.164849, + "city": "Clay Center", + "state": "KS", + "county": "Clay" + }, + { + "zip_code": 67436, + "latitude": 39.263098, + "longitude": -97.714625, + "city": "Delphos", + "state": "KS", + "county": "Ottawa" + }, + { + "zip_code": 67437, + "latitude": 39.449456, + "longitude": -98.581432, + "city": "Downs", + "state": "KS", + "county": "Osborne" + }, + { + "zip_code": 67438, + "latitude": 38.523968, + "longitude": -97.251974, + "city": "Durham", + "state": "KS", + "county": "Marion" + }, + { + "zip_code": 67439, + "latitude": 38.696579, + "longitude": -98.205437, + "city": "Ellsworth", + "state": "KS", + "county": "Ellsworth" + }, + { + "zip_code": 67441, + "latitude": 38.889721, + "longitude": -97.09319, + "city": "Enterprise", + "state": "KS", + "county": "Dickinson" + }, + { + "zip_code": 67442, + "latitude": 38.69098, + "longitude": -97.787364, + "city": "Falun", + "state": "KS", + "county": "Saline" + }, + { + "zip_code": 67443, + "latitude": 38.382827, + "longitude": -97.47325, + "city": "Galva", + "state": "KS", + "county": "Mcpherson" + }, + { + "zip_code": 67444, + "latitude": 38.362194, + "longitude": -98.15843, + "city": "Geneseo", + "state": "KS", + "county": "Rice" + }, + { + "zip_code": 67445, + "latitude": 39.36117, + "longitude": -97.83825, + "city": "Glasco", + "state": "KS", + "county": "Cloud" + }, + { + "zip_code": 67446, + "latitude": 39.501034, + "longitude": -98.302257, + "city": "Glen Elder", + "state": "KS", + "county": "Mitchell" + }, + { + "zip_code": 67447, + "latitude": 39.480323, + "longitude": -97.01489, + "city": "Green", + "state": "KS", + "county": "Clay" + }, + { + "zip_code": 67448, + "latitude": 38.710913, + "longitude": -97.492119, + "city": "Gypsum", + "state": "KS", + "county": "Saline" + }, + { + "zip_code": 67449, + "latitude": 38.792473, + "longitude": -96.993297, + "city": "Herington", + "state": "KS", + "county": "Dickinson" + }, + { + "zip_code": 67450, + "latitude": 38.613667, + "longitude": -98.420938, + "city": "Holyrood", + "state": "KS", + "county": "Ellsworth" + }, + { + "zip_code": 67451, + "latitude": 38.826292, + "longitude": -97.121874, + "city": "Hope", + "state": "KS", + "county": "Dickinson" + }, + { + "zip_code": 67452, + "latitude": 39.287497, + "longitude": -98.433673, + "city": "Hunter", + "state": "KS", + "county": "Mitchell" + }, + { + "zip_code": 67454, + "latitude": 38.696847, + "longitude": -98.138181, + "city": "Kanopolis", + "state": "KS", + "county": "Ellsworth" + }, + { + "zip_code": 67455, + "latitude": 39.102718, + "longitude": -98.214909, + "city": "Lincoln", + "state": "KS", + "county": "Lincoln" + }, + { + "zip_code": 67456, + "latitude": 38.497407, + "longitude": -97.628859, + "city": "Lindsborg", + "state": "KS", + "county": "Mcpherson" + }, + { + "zip_code": 67457, + "latitude": 38.378672, + "longitude": -98.095004, + "city": "Little River", + "state": "KS", + "county": "Rice" + }, + { + "zip_code": 67458, + "latitude": 39.183428, + "longitude": -97.249882, + "city": "Longford", + "state": "KS", + "county": "Clay" + }, + { + "zip_code": 67459, + "latitude": 38.601673, + "longitude": -98.273284, + "city": "Lorraine", + "state": "KS", + "county": "Ellsworth" + }, + { + "zip_code": 67460, + "latitude": 38.376302, + "longitude": -97.670184, + "city": "Mcpherson", + "state": "KS", + "county": "Mcpherson" + }, + { + "zip_code": 67464, + "latitude": 38.529808, + "longitude": -97.675384, + "city": "Marquette", + "state": "KS", + "county": "Mcpherson" + }, + { + "zip_code": 67466, + "latitude": 39.349959, + "longitude": -97.454812, + "city": "Miltonvale", + "state": "KS", + "county": "Cloud" + }, + { + "zip_code": 67467, + "latitude": 39.141097, + "longitude": -97.650674, + "city": "Minneapolis", + "state": "KS", + "county": "Ottawa" + }, + { + "zip_code": 67468, + "latitude": 39.328382, + "longitude": -97.164888, + "city": "Morganville", + "state": "KS", + "county": "Clay" + }, + { + "zip_code": 67470, + "latitude": 38.905381, + "longitude": -97.515705, + "city": "New Cambria", + "state": "KS", + "county": "Saline" + }, + { + "zip_code": 67473, + "latitude": 39.385738, + "longitude": -98.795417, + "city": "Osborne", + "state": "KS", + "county": "Osborne" + }, + { + "zip_code": 67474, + "latitude": 39.531927, + "longitude": -98.738629, + "city": "Portis", + "state": "KS", + "county": "Osborne" + }, + { + "zip_code": 67475, + "latitude": 38.59749, + "longitude": -97.062601, + "city": "Ramona", + "state": "KS", + "county": "Marion" + }, + { + "zip_code": 67476, + "latitude": 38.391722, + "longitude": -97.648402, + "city": "Roxbury", + "state": "KS", + "county": "Mcpherson" + }, + { + "zip_code": 67478, + "latitude": 39.385112, + "longitude": -97.932764, + "city": "Simpson", + "state": "KS", + "county": "Mitchell" + }, + { + "zip_code": 67480, + "latitude": 38.910885, + "longitude": -97.339456, + "city": "Solomon", + "state": "KS", + "county": "Dickinson" + }, + { + "zip_code": 67481, + "latitude": 38.969795, + "longitude": -98.435528, + "city": "Sylvan Grove", + "state": "KS", + "county": "Lincoln" + }, + { + "zip_code": 67482, + "latitude": 39.02241, + "longitude": -97.259116, + "city": "Talmage", + "state": "KS", + "county": "Dickinson" + }, + { + "zip_code": 67483, + "latitude": 38.54879, + "longitude": -97.17004, + "city": "Tampa", + "state": "KS", + "county": "Marion" + }, + { + "zip_code": 67484, + "latitude": 39.041646, + "longitude": -97.719466, + "city": "Tescott", + "state": "KS", + "county": "Ottawa" + }, + { + "zip_code": 67485, + "latitude": 39.339425, + "longitude": -98.470261, + "city": "Tipton", + "state": "KS", + "county": "Mitchell" + }, + { + "zip_code": 67487, + "latitude": 39.190937, + "longitude": -97.075406, + "city": "Wakefield", + "state": "KS", + "county": "Clay" + }, + { + "zip_code": 67490, + "latitude": 38.784047, + "longitude": -98.271846, + "city": "Wilson", + "state": "KS", + "county": "Ellsworth" + }, + { + "zip_code": 67491, + "latitude": 38.389365, + "longitude": -97.694453, + "city": "Windom", + "state": "KS", + "county": "Mcpherson" + }, + { + "zip_code": 67492, + "latitude": 38.812401, + "longitude": -96.964022, + "city": "Woodbine", + "state": "KS", + "county": "Dickinson" + }, + { + "zip_code": 67501, + "latitude": 37.954312, + "longitude": -97.88569, + "city": "Hutchinson", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67502, + "latitude": 38.115643, + "longitude": -97.893663, + "city": "Hutchinson", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67504, + "latitude": 37.953219, + "longitude": -98.085924, + "city": "Hutchinson", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67505, + "latitude": 38.003541, + "longitude": -97.944252, + "city": "South Hutchinson", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67510, + "latitude": 38.013705, + "longitude": -98.169523, + "city": "Abbyville", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67511, + "latitude": 38.420451, + "longitude": -98.913448, + "city": "Albert", + "state": "KS", + "county": "Barton" + }, + { + "zip_code": 67512, + "latitude": 38.233295, + "longitude": -98.316515, + "city": "Alden", + "state": "KS", + "county": "Rice" + }, + { + "zip_code": 67513, + "latitude": 38.470116, + "longitude": -99.553222, + "city": "Alexander", + "state": "KS", + "county": "Rush" + }, + { + "zip_code": 67514, + "latitude": 37.829877, + "longitude": -98.196898, + "city": "Arlington", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67515, + "latitude": 38.479822, + "longitude": -99.916519, + "city": "Arnold", + "state": "KS", + "county": "Ness" + }, + { + "zip_code": 67516, + "latitude": 38.445565, + "longitude": -99.692538, + "city": "Bazine", + "state": "KS", + "county": "Ness" + }, + { + "zip_code": 67518, + "latitude": 38.479822, + "longitude": -99.916519, + "city": "Beeler", + "state": "KS", + "county": "Ness" + }, + { + "zip_code": 67519, + "latitude": 37.951204, + "longitude": -99.098947, + "city": "Belpre", + "state": "KS", + "county": "Edwards" + }, + { + "zip_code": 67520, + "latitude": 38.563156, + "longitude": -99.195772, + "city": "Bison", + "state": "KS", + "county": "Rush" + }, + { + "zip_code": 67521, + "latitude": 38.479822, + "longitude": -99.916519, + "city": "Brownell", + "state": "KS", + "county": "Ness" + }, + { + "zip_code": 67522, + "latitude": 38.122794, + "longitude": -97.766352, + "city": "Buhler", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67523, + "latitude": 38.13957, + "longitude": -99.385256, + "city": "Burdett", + "state": "KS", + "county": "Pawnee" + }, + { + "zip_code": 67524, + "latitude": 38.362338, + "longitude": -98.246676, + "city": "Chase", + "state": "KS", + "county": "Rice" + }, + { + "zip_code": 67525, + "latitude": 38.565876, + "longitude": -98.627068, + "city": "Claflin", + "state": "KS", + "county": "Barton" + }, + { + "zip_code": 67526, + "latitude": 38.46396, + "longitude": -98.733001, + "city": "Ellinwood", + "state": "KS", + "county": "Barton" + }, + { + "zip_code": 67529, + "latitude": 38.076733, + "longitude": -99.245071, + "city": "Garfield", + "state": "KS", + "county": "Pawnee" + }, + { + "zip_code": 67530, + "latitude": 38.393567, + "longitude": -98.775074, + "city": "Great Bend", + "state": "KS", + "county": "Barton" + }, + { + "zip_code": 67543, + "latitude": 37.881183, + "longitude": -97.793755, + "city": "Haven", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67544, + "latitude": 38.478935, + "longitude": -98.756485, + "city": "Hoisington", + "state": "KS", + "county": "Barton" + }, + { + "zip_code": 67545, + "latitude": 38.166197, + "longitude": -98.628964, + "city": "Hudson", + "state": "KS", + "county": "Stafford" + }, + { + "zip_code": 67546, + "latitude": 38.246179, + "longitude": -97.795694, + "city": "Inman", + "state": "KS", + "county": "Mcpherson" + }, + { + "zip_code": 67547, + "latitude": 37.91204, + "longitude": -99.478881, + "city": "Kinsley", + "state": "KS", + "county": "Edwards" + }, + { + "zip_code": 67548, + "latitude": 38.531867, + "longitude": -99.300546, + "city": "La Crosse", + "state": "KS", + "county": "Rush" + }, + { + "zip_code": 67550, + "latitude": 38.194644, + "longitude": -99.10096, + "city": "Larned", + "state": "KS", + "county": "Pawnee" + }, + { + "zip_code": 67552, + "latitude": 37.936208, + "longitude": -99.254501, + "city": "Lewis", + "state": "KS", + "county": "Edwards" + }, + { + "zip_code": 67553, + "latitude": 38.655719, + "longitude": -99.320339, + "city": "Liebenthal", + "state": "KS", + "county": "Rush" + }, + { + "zip_code": 67554, + "latitude": 38.376979, + "longitude": -98.193184, + "city": "Lyons", + "state": "KS", + "county": "Rice" + }, + { + "zip_code": 67556, + "latitude": 38.586345, + "longitude": -99.571844, + "city": "Mc Cracken", + "state": "KS", + "county": "Rush" + }, + { + "zip_code": 67557, + "latitude": 37.95853, + "longitude": -98.968997, + "city": "Macksville", + "state": "KS", + "county": "Stafford" + }, + { + "zip_code": 67559, + "latitude": 38.52286, + "longitude": -99.309591, + "city": "Nekoma", + "state": "KS", + "county": "Rush" + }, + { + "zip_code": 67560, + "latitude": 38.455316, + "longitude": -99.905723, + "city": "Ness City", + "state": "KS", + "county": "Ness" + }, + { + "zip_code": 67561, + "latitude": 38.100868, + "longitude": -98.105772, + "city": "Nickerson", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67563, + "latitude": 37.890172, + "longitude": -99.562672, + "city": "Offerle", + "state": "KS", + "county": "Edwards" + }, + { + "zip_code": 67564, + "latitude": 38.543586, + "longitude": -98.895484, + "city": "Olmitz", + "state": "KS", + "county": "Barton" + }, + { + "zip_code": 67565, + "latitude": 38.53527, + "longitude": -99.053404, + "city": "Otis", + "state": "KS", + "county": "Rush" + }, + { + "zip_code": 67566, + "latitude": 38.005705, + "longitude": -97.977327, + "city": "Partridge", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67567, + "latitude": 38.451554, + "longitude": -98.959346, + "city": "Pawnee Rock", + "state": "KS", + "county": "Barton" + }, + { + "zip_code": 67568, + "latitude": 38.006255, + "longitude": -98.261811, + "city": "Plevna", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67570, + "latitude": 37.813853, + "longitude": -97.99759, + "city": "Pretty Prairie", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67572, + "latitude": 38.635962, + "longitude": -99.932676, + "city": "Ransom", + "state": "KS", + "county": "Ness" + }, + { + "zip_code": 67573, + "latitude": 38.26748, + "longitude": -98.392836, + "city": "Raymond", + "state": "KS", + "county": "Rice" + }, + { + "zip_code": 67574, + "latitude": 38.196248, + "longitude": -99.403343, + "city": "Rozel", + "state": "KS", + "county": "Pawnee" + }, + { + "zip_code": 67575, + "latitude": 38.467528, + "longitude": -99.24642, + "city": "Rush Center", + "state": "KS", + "county": "Rush" + }, + { + "zip_code": 67576, + "latitude": 38.060799, + "longitude": -98.78677, + "city": "Saint John", + "state": "KS", + "county": "Stafford" + }, + { + "zip_code": 67578, + "latitude": 37.961811, + "longitude": -98.775, + "city": "Stafford", + "state": "KS", + "county": "Stafford" + }, + { + "zip_code": 67579, + "latitude": 38.224187, + "longitude": -98.183033, + "city": "Sterling", + "state": "KS", + "county": "Rice" + }, + { + "zip_code": 67581, + "latitude": 38.006382, + "longitude": -98.121898, + "city": "Sylvia", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67583, + "latitude": 37.822393, + "longitude": -98.359075, + "city": "Turon", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67584, + "latitude": 38.641893, + "longitude": -100.170396, + "city": "Utica", + "state": "KS", + "county": "Ness" + }, + { + "zip_code": 67585, + "latitude": 37.94119, + "longitude": -97.871147, + "city": "Yoder", + "state": "KS", + "county": "Reno" + }, + { + "zip_code": 67601, + "latitude": 38.878202, + "longitude": -99.334803, + "city": "Hays", + "state": "KS", + "county": "Ellis" + }, + { + "zip_code": 67621, + "latitude": 39.760857, + "longitude": -99.119565, + "city": "Agra", + "state": "KS", + "county": "Phillips" + }, + { + "zip_code": 67622, + "latitude": 39.891272, + "longitude": -99.711523, + "city": "Almena", + "state": "KS", + "county": "Norton" + }, + { + "zip_code": 67623, + "latitude": 39.430147, + "longitude": -98.928883, + "city": "Alton", + "state": "KS", + "county": "Osborne" + }, + { + "zip_code": 67625, + "latitude": 39.360027, + "longitude": -99.6876, + "city": "Bogue", + "state": "KS", + "county": "Graham" + }, + { + "zip_code": 67626, + "latitude": 38.868931, + "longitude": -98.676303, + "city": "Bunker Hill", + "state": "KS", + "county": "Russell" + }, + { + "zip_code": 67627, + "latitude": 38.927648, + "longitude": -99.216051, + "city": "Catharine", + "state": "KS", + "county": "Ellis" + }, + { + "zip_code": 67628, + "latitude": 39.784963, + "longitude": -98.785622, + "city": "Cedar", + "state": "KS", + "county": "Smith" + }, + { + "zip_code": 67629, + "latitude": 39.78432, + "longitude": -99.903004, + "city": "Clayton", + "state": "KS", + "county": "Norton" + }, + { + "zip_code": 67631, + "latitude": 38.91436, + "longitude": -99.872931, + "city": "Collyer", + "state": "KS", + "county": "Trego" + }, + { + "zip_code": 67632, + "latitude": 39.334908, + "longitude": -99.39947, + "city": "Damar", + "state": "KS", + "county": "Rooks" + }, + { + "zip_code": 67634, + "latitude": 38.821918, + "longitude": -98.775418, + "city": "Dorrance", + "state": "KS", + "county": "Russell" + }, + { + "zip_code": 67635, + "latitude": 39.784578, + "longitude": -100.459467, + "city": "Dresden", + "state": "KS", + "county": "Decatur" + }, + { + "zip_code": 67637, + "latitude": 38.950015, + "longitude": -99.336337, + "city": "Ellis", + "state": "KS", + "county": "Ellis" + }, + { + "zip_code": 67638, + "latitude": 39.64705, + "longitude": -98.846513, + "city": "Gaylord", + "state": "KS", + "county": "Smith" + }, + { + "zip_code": 67639, + "latitude": 39.784708, + "longitude": -99.347075, + "city": "Glade", + "state": "KS", + "county": "Phillips" + }, + { + "zip_code": 67640, + "latitude": 38.852325, + "longitude": -99.010803, + "city": "Gorham", + "state": "KS", + "county": "Russell" + }, + { + "zip_code": 67642, + "latitude": 39.366018, + "longitude": -99.842382, + "city": "Hill City", + "state": "KS", + "county": "Graham" + }, + { + "zip_code": 67643, + "latitude": 39.679281, + "longitude": -100.294812, + "city": "Jennings", + "state": "KS", + "county": "Decatur" + }, + { + "zip_code": 67644, + "latitude": 39.668671, + "longitude": -99.342534, + "city": "Kirwin", + "state": "KS", + "county": "Phillips" + }, + { + "zip_code": 67645, + "latitude": 39.610503, + "longitude": -100.002777, + "city": "Lenora", + "state": "KS", + "county": "Norton" + }, + { + "zip_code": 67646, + "latitude": 39.664328, + "longitude": -99.568879, + "city": "Logan", + "state": "KS", + "county": "Phillips" + }, + { + "zip_code": 67647, + "latitude": 39.784708, + "longitude": -99.347075, + "city": "Long Island", + "state": "KS", + "county": "Phillips" + }, + { + "zip_code": 67648, + "latitude": 39.008115, + "longitude": -98.754407, + "city": "Lucas", + "state": "KS", + "county": "Russell" + }, + { + "zip_code": 67649, + "latitude": 39.08201, + "longitude": -98.651072, + "city": "Luray", + "state": "KS", + "county": "Russell" + }, + { + "zip_code": 67650, + "latitude": 39.352426, + "longitude": -100.075464, + "city": "Morland", + "state": "KS", + "county": "Graham" + }, + { + "zip_code": 67651, + "latitude": 39.227878, + "longitude": -98.945419, + "city": "Natoma", + "state": "KS", + "county": "Osborne" + }, + { + "zip_code": 67653, + "latitude": 39.837074, + "longitude": -100.188191, + "city": "Norcatur", + "state": "KS", + "county": "Decatur" + }, + { + "zip_code": 67654, + "latitude": 39.827955, + "longitude": -99.891726, + "city": "Norton", + "state": "KS", + "county": "Norton" + }, + { + "zip_code": 67656, + "latitude": 38.91436, + "longitude": -99.872931, + "city": "Ogallah", + "state": "KS", + "county": "Trego" + }, + { + "zip_code": 67657, + "latitude": 39.229778, + "longitude": -99.346263, + "city": "Palco", + "state": "KS", + "county": "Rooks" + }, + { + "zip_code": 67658, + "latitude": 39.079529, + "longitude": -98.936673, + "city": "Paradise", + "state": "KS", + "county": "Russell" + }, + { + "zip_code": 67659, + "latitude": 39.348243, + "longitude": -99.971939, + "city": "Penokee", + "state": "KS", + "county": "Graham" + }, + { + "zip_code": 67660, + "latitude": 38.715293, + "longitude": -99.171847, + "city": "Pfeifer", + "state": "KS", + "county": "Ellis" + }, + { + "zip_code": 67661, + "latitude": 39.779113, + "longitude": -99.346302, + "city": "Phillipsburg", + "state": "KS", + "county": "Phillips" + }, + { + "zip_code": 67663, + "latitude": 39.248844, + "longitude": -99.316373, + "city": "Plainville", + "state": "KS", + "county": "Rooks" + }, + { + "zip_code": 67664, + "latitude": 39.75337, + "longitude": -99.348129, + "city": "Prairie View", + "state": "KS", + "county": "Phillips" + }, + { + "zip_code": 67665, + "latitude": 38.905159, + "longitude": -98.784797, + "city": "Russell", + "state": "KS", + "county": "Russell" + }, + { + "zip_code": 67667, + "latitude": 38.712772, + "longitude": -99.332221, + "city": "Schoenchen", + "state": "KS", + "county": "Ellis" + }, + { + "zip_code": 67669, + "latitude": 39.412166, + "longitude": -99.369872, + "city": "Stockton", + "state": "KS", + "county": "Rooks" + }, + { + "zip_code": 67670, + "latitude": 39.784708, + "longitude": -99.347075, + "city": "Stuttgart", + "state": "KS", + "county": "Phillips" + }, + { + "zip_code": 67671, + "latitude": 38.915745, + "longitude": -99.141972, + "city": "Victoria", + "state": "KS", + "county": "Ellis" + }, + { + "zip_code": 67672, + "latitude": 39.020792, + "longitude": -99.888083, + "city": "Wa Keeney", + "state": "KS", + "county": "Trego" + }, + { + "zip_code": 67673, + "latitude": 39.067957, + "longitude": -98.788651, + "city": "Waldo", + "state": "KS", + "county": "Russell" + }, + { + "zip_code": 67674, + "latitude": 38.873144, + "longitude": -99.094913, + "city": "Walker", + "state": "KS", + "county": "Ellis" + }, + { + "zip_code": 67675, + "latitude": 39.401699, + "longitude": -99.244147, + "city": "Woodston", + "state": "KS", + "county": "Rooks" + }, + { + "zip_code": 67701, + "latitude": 39.40152, + "longitude": -100.973696, + "city": "Colby", + "state": "KS", + "county": "Thomas" + }, + { + "zip_code": 67730, + "latitude": 39.824688, + "longitude": -101.041371, + "city": "Atwood", + "state": "KS", + "county": "Rawlins" + }, + { + "zip_code": 67731, + "latitude": 39.750443, + "longitude": -101.532798, + "city": "Bird City", + "state": "KS", + "county": "Cheyenne" + }, + { + "zip_code": 67732, + "latitude": 39.358974, + "longitude": -101.061905, + "city": "Brewster", + "state": "KS", + "county": "Thomas" + }, + { + "zip_code": 67733, + "latitude": 39.366545, + "longitude": -101.49405, + "city": "Edson", + "state": "KS", + "county": "Sherman" + }, + { + "zip_code": 67734, + "latitude": 39.459642, + "longitude": -100.934517, + "city": "Gem", + "state": "KS", + "county": "Thomas" + }, + { + "zip_code": 67735, + "latitude": 39.358123, + "longitude": -101.798885, + "city": "Goodland", + "state": "KS", + "county": "Sherman" + }, + { + "zip_code": 67736, + "latitude": 38.915304, + "longitude": -100.483367, + "city": "Gove", + "state": "KS", + "county": "Gove" + }, + { + "zip_code": 67737, + "latitude": 39.11464, + "longitude": -100.46688, + "city": "Grainfield", + "state": "KS", + "county": "Gove" + }, + { + "zip_code": 67738, + "latitude": 39.125891, + "longitude": -100.631872, + "city": "Grinnell", + "state": "KS", + "county": "Gove" + }, + { + "zip_code": 67739, + "latitude": 39.909207, + "longitude": -100.784803, + "city": "Herndon", + "state": "KS", + "county": "Rawlins" + }, + { + "zip_code": 67740, + "latitude": 39.355013, + "longitude": -100.440513, + "city": "Hoxie", + "state": "KS", + "county": "Sheridan" + }, + { + "zip_code": 67741, + "latitude": 39.365231, + "longitude": -101.967481, + "city": "Kanorado", + "state": "KS", + "county": "Sherman" + }, + { + "zip_code": 67743, + "latitude": 39.413268, + "longitude": -101.148818, + "city": "Levant", + "state": "KS", + "county": "Thomas" + }, + { + "zip_code": 67744, + "latitude": 39.785211, + "longitude": -101.076282, + "city": "Ludell", + "state": "KS", + "county": "Rawlins" + }, + { + "zip_code": 67745, + "latitude": 39.785619, + "longitude": -101.370071, + "city": "Mc Donald", + "state": "KS", + "county": "Rawlins" + }, + { + "zip_code": 67747, + "latitude": 39.046409, + "longitude": -101.063728, + "city": "Monument", + "state": "KS", + "county": "Logan" + }, + { + "zip_code": 67748, + "latitude": 38.945805, + "longitude": -100.970176, + "city": "Oakley", + "state": "KS", + "county": "Logan" + }, + { + "zip_code": 67749, + "latitude": 39.820834, + "longitude": -100.529554, + "city": "Oberlin", + "state": "KS", + "county": "Decatur" + }, + { + "zip_code": 67751, + "latitude": 39.063922, + "longitude": -100.233439, + "city": "Park", + "state": "KS", + "county": "Gove" + }, + { + "zip_code": 67752, + "latitude": 39.063613, + "longitude": -100.238001, + "city": "Quinter", + "state": "KS", + "county": "Gove" + }, + { + "zip_code": 67753, + "latitude": 39.390715, + "longitude": -101.049033, + "city": "Rexford", + "state": "KS", + "county": "Thomas" + }, + { + "zip_code": 67756, + "latitude": 39.680371, + "longitude": -101.909252, + "city": "Saint Francis", + "state": "KS", + "county": "Cheyenne" + }, + { + "zip_code": 67757, + "latitude": 39.541125, + "longitude": -100.567722, + "city": "Selden", + "state": "KS", + "county": "Sheridan" + }, + { + "zip_code": 67758, + "latitude": 38.89428, + "longitude": -101.748965, + "city": "Sharon Springs", + "state": "KS", + "county": "Wallace" + }, + { + "zip_code": 67761, + "latitude": 38.916183, + "longitude": -101.762678, + "city": "Wallace", + "state": "KS", + "county": "Wallace" + }, + { + "zip_code": 67762, + "latitude": 38.916183, + "longitude": -101.762678, + "city": "Weskan", + "state": "KS", + "county": "Wallace" + }, + { + "zip_code": 67764, + "latitude": 38.921702, + "longitude": -101.094305, + "city": "Winona", + "state": "KS", + "county": "Logan" + }, + { + "zip_code": 67801, + "latitude": 37.690531, + "longitude": -99.902421, + "city": "Dodge City", + "state": "KS", + "county": "Ford" + }, + { + "zip_code": 67831, + "latitude": 37.171946, + "longitude": -99.769576, + "city": "Ashland", + "state": "KS", + "county": "Clark" + }, + { + "zip_code": 67834, + "latitude": 37.690525, + "longitude": -99.882532, + "city": "Bucklin", + "state": "KS", + "county": "Ford" + }, + { + "zip_code": 67835, + "latitude": 37.803608, + "longitude": -100.338634, + "city": "Cimarron", + "state": "KS", + "county": "Gray" + }, + { + "zip_code": 67836, + "latitude": 37.999701, + "longitude": -101.785968, + "city": "Coolidge", + "state": "KS", + "county": "Hamilton" + }, + { + "zip_code": 67837, + "latitude": 37.738785, + "longitude": -100.505348, + "city": "Copeland", + "state": "KS", + "county": "Gray" + }, + { + "zip_code": 67838, + "latitude": 37.964591, + "longitude": -101.190998, + "city": "Deerfield", + "state": "KS", + "county": "Kearny" + }, + { + "zip_code": 67839, + "latitude": 38.474188, + "longitude": -100.464651, + "city": "Dighton", + "state": "KS", + "county": "Lane" + }, + { + "zip_code": 67840, + "latitude": 37.237186, + "longitude": -99.82422, + "city": "Englewood", + "state": "KS", + "county": "Clark" + }, + { + "zip_code": 67841, + "latitude": 37.624913, + "longitude": -100.27543, + "city": "Ensign", + "state": "KS", + "county": "Gray" + }, + { + "zip_code": 67842, + "latitude": 37.587839, + "longitude": -99.799449, + "city": "Ford", + "state": "KS", + "county": "Ford" + }, + { + "zip_code": 67844, + "latitude": 37.279983, + "longitude": -100.211034, + "city": "Fowler", + "state": "KS", + "county": "Meade" + }, + { + "zip_code": 67846, + "latitude": 38.000771, + "longitude": -100.664407, + "city": "Garden City", + "state": "KS", + "county": "Finney" + }, + { + "zip_code": 67849, + "latitude": 38.121492, + "longitude": -99.709532, + "city": "Hanston", + "state": "KS", + "county": "Hodgeman" + }, + { + "zip_code": 67850, + "latitude": 38.578991, + "longitude": -100.600786, + "city": "Healy", + "state": "KS", + "county": "Lane" + }, + { + "zip_code": 67851, + "latitude": 38.098129, + "longitude": -100.961803, + "city": "Holcomb", + "state": "KS", + "county": "Finney" + }, + { + "zip_code": 67853, + "latitude": 37.789051, + "longitude": -100.46093, + "city": "Ingalls", + "state": "KS", + "county": "Gray" + }, + { + "zip_code": 67854, + "latitude": 38.023937, + "longitude": -99.893681, + "city": "Jetmore", + "state": "KS", + "county": "Hodgeman" + }, + { + "zip_code": 67855, + "latitude": 37.562997, + "longitude": -101.707858, + "city": "Johnson", + "state": "KS", + "county": "Stanton" + }, + { + "zip_code": 67857, + "latitude": 37.999701, + "longitude": -101.785968, + "city": "Kendall", + "state": "KS", + "county": "Hamilton" + }, + { + "zip_code": 67859, + "latitude": 37.204223, + "longitude": -100.701401, + "city": "Kismet", + "state": "KS", + "county": "Seward" + }, + { + "zip_code": 67860, + "latitude": 37.938907, + "longitude": -101.264981, + "city": "Lakin", + "state": "KS", + "county": "Kearny" + }, + { + "zip_code": 67861, + "latitude": 38.477827, + "longitude": -101.293036, + "city": "Leoti", + "state": "KS", + "county": "Wichita" + }, + { + "zip_code": 67862, + "latitude": 37.536283, + "longitude": -101.904726, + "city": "Manter", + "state": "KS", + "county": "Stanton" + }, + { + "zip_code": 67863, + "latitude": 38.483749, + "longitude": -101.283946, + "city": "Marienthal", + "state": "KS", + "county": "Wichita" + }, + { + "zip_code": 67864, + "latitude": 37.238357, + "longitude": -100.316583, + "city": "Meade", + "state": "KS", + "county": "Meade" + }, + { + "zip_code": 67865, + "latitude": 37.442546, + "longitude": -100.008811, + "city": "Minneola", + "state": "KS", + "county": "Clark" + }, + { + "zip_code": 67867, + "latitude": 37.598638, + "longitude": -100.415568, + "city": "Montezuma", + "state": "KS", + "county": "Gray" + }, + { + "zip_code": 67868, + "latitude": 37.905994, + "longitude": -100.752256, + "city": "Pierceville", + "state": "KS", + "county": "Finney" + }, + { + "zip_code": 67869, + "latitude": 37.2419, + "longitude": -100.435253, + "city": "Plains", + "state": "KS", + "county": "Meade" + }, + { + "zip_code": 67870, + "latitude": 37.441023, + "longitude": -100.998474, + "city": "Satanta", + "state": "KS", + "county": "Haskell" + }, + { + "zip_code": 67871, + "latitude": 38.482307, + "longitude": -100.906427, + "city": "Scott City", + "state": "KS", + "county": "Scott" + }, + { + "zip_code": 67876, + "latitude": 37.729884, + "longitude": -99.715817, + "city": "Spearville", + "state": "KS", + "county": "Ford" + }, + { + "zip_code": 67877, + "latitude": 37.482236, + "longitude": -100.848783, + "city": "Sublette", + "state": "KS", + "county": "Haskell" + }, + { + "zip_code": 67878, + "latitude": 37.986428, + "longitude": -101.751732, + "city": "Syracuse", + "state": "KS", + "county": "Hamilton" + }, + { + "zip_code": 67879, + "latitude": 38.469704, + "longitude": -101.747853, + "city": "Tribune", + "state": "KS", + "county": "Greeley" + }, + { + "zip_code": 67880, + "latitude": 37.562467, + "longitude": -101.308565, + "city": "Ulysses", + "state": "KS", + "county": "Grant" + }, + { + "zip_code": 67882, + "latitude": 37.814013, + "longitude": -99.903061, + "city": "Wright", + "state": "KS", + "county": "Ford" + }, + { + "zip_code": 67901, + "latitude": 37.043237, + "longitude": -100.873809, + "city": "Liberal", + "state": "KS", + "county": "Seward" + }, + { + "zip_code": 67905, + "latitude": 37.021641, + "longitude": -100.938049, + "city": "Liberal", + "state": "KS", + "county": "Seward" + }, + { + "zip_code": 67950, + "latitude": 37.00405, + "longitude": -101.896973, + "city": "Elkhart", + "state": "KS", + "county": "Morton" + }, + { + "zip_code": 67951, + "latitude": 37.243161, + "longitude": -101.281684, + "city": "Hugoton", + "state": "KS", + "county": "Stevens" + }, + { + "zip_code": 67952, + "latitude": 37.325308, + "longitude": -101.205904, + "city": "Moscow", + "state": "KS", + "county": "Stevens" + }, + { + "zip_code": 67953, + "latitude": 37.191239, + "longitude": -101.798749, + "city": "Richfield", + "state": "KS", + "county": "Morton" + }, + { + "zip_code": 67954, + "latitude": 37.081137, + "longitude": -101.60469, + "city": "Rolla", + "state": "KS", + "county": "Morton" + }, + { + "zip_code": 68001, + "latitude": 41.332034, + "longitude": -96.949369, + "city": "Abie", + "state": "NE", + "county": "Butler" + }, + { + "zip_code": 68002, + "latitude": 41.501979, + "longitude": -96.317932, + "city": "Arlington", + "state": "NE", + "county": "Washington" + }, + { + "zip_code": 68003, + "latitude": 41.102696, + "longitude": -96.577634, + "city": "Ashland", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68004, + "latitude": 41.995729, + "longitude": -96.671008, + "city": "Bancroft", + "state": "NE", + "county": "Cuming" + }, + { + "zip_code": 68005, + "latitude": 41.132948, + "longitude": -95.903956, + "city": "Bellevue", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68007, + "latitude": 41.357015, + "longitude": -96.203393, + "city": "Bennington", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68008, + "latitude": 41.543582, + "longitude": -96.17653, + "city": "Blair", + "state": "NE", + "county": "Washington" + }, + { + "zip_code": 68009, + "latitude": 41.53827, + "longitude": -96.182295, + "city": "Blair", + "state": "NE", + "county": "Washington" + }, + { + "zip_code": 68010, + "latitude": 41.2587, + "longitude": -96.133047, + "city": "Boys Town", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68014, + "latitude": 41.278245, + "longitude": -96.975393, + "city": "Bruno", + "state": "NE", + "county": "Butler" + }, + { + "zip_code": 68015, + "latitude": 41.365495, + "longitude": -96.631576, + "city": "Cedar Bluffs", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68016, + "latitude": 41.042487, + "longitude": -96.104359, + "city": "Cedar Creek", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68017, + "latitude": 41.096052, + "longitude": -96.638116, + "city": "Ceresco", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68018, + "latitude": 41.307157, + "longitude": -96.610014, + "city": "Colon", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68019, + "latitude": 41.792415, + "longitude": -96.376462, + "city": "Craig", + "state": "NE", + "county": "Burt" + }, + { + "zip_code": 68020, + "latitude": 41.974318, + "longitude": -96.250681, + "city": "Decatur", + "state": "NE", + "county": "Burt" + }, + { + "zip_code": 68022, + "latitude": 41.288631, + "longitude": -96.238818, + "city": "Elkhorn", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68023, + "latitude": 41.447307, + "longitude": -96.023829, + "city": "Fort Calhoun", + "state": "NE", + "county": "Washington" + }, + { + "zip_code": 68025, + "latitude": 41.487786, + "longitude": -96.501672, + "city": "Fremont", + "state": "NE", + "county": "Dodge" + }, + { + "zip_code": 68026, + "latitude": 41.567907, + "longitude": -96.617443, + "city": "Fremont", + "state": "NE", + "county": "Dodge" + }, + { + "zip_code": 68028, + "latitude": 41.098888, + "longitude": -96.239744, + "city": "Gretna", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68029, + "latitude": 41.63256, + "longitude": -96.273735, + "city": "Herman", + "state": "NE", + "county": "Washington" + }, + { + "zip_code": 68030, + "latitude": 42.332188, + "longitude": -96.465599, + "city": "Homer", + "state": "NE", + "county": "Dakota" + }, + { + "zip_code": 68031, + "latitude": 41.621961, + "longitude": -96.549316, + "city": "Hooper", + "state": "NE", + "county": "Dodge" + }, + { + "zip_code": 68033, + "latitude": 41.147084, + "longitude": -96.523011, + "city": "Ithaca", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68034, + "latitude": 41.45256, + "longitude": -96.190348, + "city": "Kennard", + "state": "NE", + "county": "Washington" + }, + { + "zip_code": 68035, + "latitude": 41.339383, + "longitude": -96.444769, + "city": "Leshara", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68036, + "latitude": 41.375639, + "longitude": -96.983695, + "city": "Linwood", + "state": "NE", + "county": "Butler" + }, + { + "zip_code": 68037, + "latitude": 40.979898, + "longitude": -96.084122, + "city": "Louisville", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68038, + "latitude": 41.951479, + "longitude": -96.450944, + "city": "Lyons", + "state": "NE", + "county": "Burt" + }, + { + "zip_code": 68039, + "latitude": 42.146597, + "longitude": -96.545297, + "city": "Macy", + "state": "NE", + "county": "Thurston" + }, + { + "zip_code": 68040, + "latitude": 41.270638, + "longitude": -96.647937, + "city": "Malmo", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68041, + "latitude": 41.19999, + "longitude": -96.640076, + "city": "Mead", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68042, + "latitude": 41.094587, + "longitude": -96.430553, + "city": "Memphis", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68044, + "latitude": 41.536902, + "longitude": -96.520741, + "city": "Nickerson", + "state": "NE", + "county": "Dodge" + }, + { + "zip_code": 68045, + "latitude": 41.845492, + "longitude": -96.401432, + "city": "Oakland", + "state": "NE", + "county": "Burt" + }, + { + "zip_code": 68046, + "latitude": 41.118594, + "longitude": -96.060367, + "city": "Papillion", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68047, + "latitude": 42.110449, + "longitude": -96.723917, + "city": "Pender", + "state": "NE", + "county": "Thurston" + }, + { + "zip_code": 68048, + "latitude": 40.971961, + "longitude": -96.001244, + "city": "Plattsmouth", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68050, + "latitude": 41.314461, + "longitude": -96.823281, + "city": "Prague", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68054, + "latitude": 41.089048, + "longitude": -96.070433, + "city": "Richfield", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68055, + "latitude": 42.056416, + "longitude": -96.513859, + "city": "Rosalie", + "state": "NE", + "county": "Thurston" + }, + { + "zip_code": 68056, + "latitude": 41.092703, + "longitude": -96.090546, + "city": "St Columbans", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68057, + "latitude": 41.567768, + "longitude": -96.588672, + "city": "Scribner", + "state": "NE", + "county": "Dodge" + }, + { + "zip_code": 68058, + "latitude": 41.006712, + "longitude": -96.246207, + "city": "South Bend", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68059, + "latitude": 41.066988, + "longitude": -96.184792, + "city": "Springfield", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68061, + "latitude": 41.808435, + "longitude": -96.25543, + "city": "Tekamah", + "state": "NE", + "county": "Burt" + }, + { + "zip_code": 68062, + "latitude": 42.146597, + "longitude": -96.545297, + "city": "Thurston", + "state": "NE", + "county": "Thurston" + }, + { + "zip_code": 68063, + "latitude": 41.736896, + "longitude": -96.503746, + "city": "Uehling", + "state": "NE", + "county": "Dodge" + }, + { + "zip_code": 68064, + "latitude": 41.342714, + "longitude": -96.344273, + "city": "Valley", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68065, + "latitude": 41.108919, + "longitude": -96.831839, + "city": "Valparaiso", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68066, + "latitude": 41.197043, + "longitude": -96.669114, + "city": "Wahoo", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68067, + "latitude": 42.14967, + "longitude": -96.493734, + "city": "Walthill", + "state": "NE", + "county": "Thurston" + }, + { + "zip_code": 68068, + "latitude": 41.395315, + "longitude": -96.209006, + "city": "Washington", + "state": "NE", + "county": "Washington" + }, + { + "zip_code": 68069, + "latitude": 41.248299, + "longitude": -96.305914, + "city": "Waterloo", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68070, + "latitude": 41.20724, + "longitude": -96.758162, + "city": "Weston", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68071, + "latitude": 42.238161, + "longitude": -96.472847, + "city": "Winnebago", + "state": "NE", + "county": "Thurston" + }, + { + "zip_code": 68072, + "latitude": 41.61023, + "longitude": -96.503281, + "city": "Winslow", + "state": "NE", + "county": "Dodge" + }, + { + "zip_code": 68073, + "latitude": 41.211111, + "longitude": -96.453285, + "city": "Yutan", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68101, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68102, + "latitude": 41.262003, + "longitude": -95.933564, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68103, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68104, + "latitude": 41.295396, + "longitude": -95.99895, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68105, + "latitude": 41.240468, + "longitude": -95.964396, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68106, + "latitude": 41.239005, + "longitude": -95.999367, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68107, + "latitude": 41.211348, + "longitude": -95.950312, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68108, + "latitude": 41.23814, + "longitude": -95.964985, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68109, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68110, + "latitude": 41.295598, + "longitude": -95.914481, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68111, + "latitude": 41.295395, + "longitude": -95.964477, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68112, + "latitude": 41.353658, + "longitude": -95.95064, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68113, + "latitude": 41.128191, + "longitude": -95.917392, + "city": "Offutt A F B", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68114, + "latitude": 41.263262, + "longitude": -96.053634, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68116, + "latitude": 41.293997, + "longitude": -96.167398, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68117, + "latitude": 41.207194, + "longitude": -96.001636, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68118, + "latitude": 41.264155, + "longitude": -96.176419, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68119, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68120, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68122, + "latitude": 41.353003, + "longitude": -96.07026, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68123, + "latitude": 41.115628, + "longitude": -95.939269, + "city": "Bellevue", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68124, + "latitude": 41.23467, + "longitude": -96.052206, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68127, + "latitude": 41.207414, + "longitude": -96.061154, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68128, + "latitude": 41.164994, + "longitude": -96.061055, + "city": "La Vista", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68130, + "latitude": 41.234004, + "longitude": -96.19506, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68131, + "latitude": 41.265611, + "longitude": -95.963832, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68132, + "latitude": 41.264309, + "longitude": -96.000888, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68133, + "latitude": 41.129114, + "longitude": -96.100064, + "city": "Papillion", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68134, + "latitude": 41.302434, + "longitude": -96.055426, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68135, + "latitude": 41.205998, + "longitude": -96.193498, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68136, + "latitude": 41.169034, + "longitude": -96.172007, + "city": "Omaha", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68137, + "latitude": 41.207498, + "longitude": -96.114696, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68138, + "latitude": 41.154898, + "longitude": -96.137617, + "city": "Omaha", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68139, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68142, + "latitude": 41.35585, + "longitude": -96.101846, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68144, + "latitude": 41.233498, + "longitude": -96.118847, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68145, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68147, + "latitude": 41.175798, + "longitude": -95.95529, + "city": "Bellevue", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68152, + "latitude": 41.354544, + "longitude": -95.988532, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68154, + "latitude": 41.286298, + "longitude": -96.117202, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68155, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68157, + "latitude": 41.180985, + "longitude": -95.990942, + "city": "Omaha", + "state": "NE", + "county": "Sarpy" + }, + { + "zip_code": 68164, + "latitude": 41.306689, + "longitude": -96.104795, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68172, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68175, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68176, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68178, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68179, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68180, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68181, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68182, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68183, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68197, + "latitude": "", + "longitude": "", + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68198, + "latitude": 41.291736, + "longitude": -96.171104, + "city": "Omaha", + "state": "NE", + "county": "Douglas" + }, + { + "zip_code": 68301, + "latitude": 40.45603, + "longitude": -96.513526, + "city": "Adams", + "state": "NE", + "county": "Gage" + }, + { + "zip_code": 68303, + "latitude": 40.244068, + "longitude": -97.386612, + "city": "Alexandria", + "state": "NE", + "county": "Thayer" + }, + { + "zip_code": 68304, + "latitude": 40.885316, + "longitude": -96.37898, + "city": "Alvo", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68305, + "latitude": 40.428801, + "longitude": -95.843077, + "city": "Auburn", + "state": "NE", + "county": "Nemaha" + }, + { + "zip_code": 68307, + "latitude": 40.881809, + "longitude": -96.239403, + "city": "Avoca", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68309, + "latitude": 40.041196, + "longitude": -96.5963, + "city": "Barneston", + "state": "NE", + "county": "Gage" + }, + { + "zip_code": 68310, + "latitude": 40.313364, + "longitude": -96.693082, + "city": "Beatrice", + "state": "NE", + "county": "Gage" + }, + { + "zip_code": 68313, + "latitude": 40.785436, + "longitude": -97.23499, + "city": "Beaver Crossing", + "state": "NE", + "county": "Seward" + }, + { + "zip_code": 68314, + "latitude": 41.002864, + "longitude": -97.034527, + "city": "Bee", + "state": "NE", + "county": "Seward" + }, + { + "zip_code": 68315, + "latitude": 40.176221, + "longitude": -97.594987, + "city": "Belvidere", + "state": "NE", + "county": "Thayer" + }, + { + "zip_code": 68316, + "latitude": 41.003042, + "longitude": -97.610404, + "city": "Benedict", + "state": "NE", + "county": "York" + }, + { + "zip_code": 68317, + "latitude": 40.664491, + "longitude": -96.518083, + "city": "Bennet", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68318, + "latitude": 40.299157, + "longitude": -96.753208, + "city": "Blue Springs", + "state": "NE", + "county": "Gage" + }, + { + "zip_code": 68319, + "latitude": 40.930567, + "longitude": -97.750193, + "city": "Bradshaw", + "state": "NE", + "county": "York" + }, + { + "zip_code": 68320, + "latitude": 40.479009, + "longitude": -95.960638, + "city": "Brock", + "state": "NE", + "county": "Nemaha" + }, + { + "zip_code": 68321, + "latitude": 40.397541, + "longitude": -95.663987, + "city": "Brownville", + "state": "NE", + "county": "Nemaha" + }, + { + "zip_code": 68322, + "latitude": 40.335959, + "longitude": -97.56495, + "city": "Bruning", + "state": "NE", + "county": "Thayer" + }, + { + "zip_code": 68323, + "latitude": 40.146335, + "longitude": -96.348151, + "city": "Burchard", + "state": "NE", + "county": "Pawnee" + }, + { + "zip_code": 68324, + "latitude": 40.536353, + "longitude": -96.299662, + "city": "Burr", + "state": "NE", + "county": "Otoe" + }, + { + "zip_code": 68325, + "latitude": 40.005757, + "longitude": -97.76566, + "city": "Byron", + "state": "NE", + "county": "Thayer" + }, + { + "zip_code": 68326, + "latitude": 40.303471, + "longitude": -97.67615, + "city": "Carleton", + "state": "NE", + "county": "Thayer" + }, + { + "zip_code": 68327, + "latitude": 40.00937, + "longitude": -97.617985, + "city": "Chester", + "state": "NE", + "county": "Thayer" + }, + { + "zip_code": 68328, + "latitude": 40.466038, + "longitude": -96.850863, + "city": "Clatonia", + "state": "NE", + "county": "Gage" + }, + { + "zip_code": 68329, + "latitude": 40.510888, + "longitude": -96.161196, + "city": "Cook", + "state": "NE", + "county": "Johnson" + }, + { + "zip_code": 68330, + "latitude": 40.720174, + "longitude": -97.311257, + "city": "Cordova", + "state": "NE", + "county": "Seward" + }, + { + "zip_code": 68331, + "latitude": 40.50528, + "longitude": -96.752373, + "city": "Cortland", + "state": "NE", + "county": "Gage" + }, + { + "zip_code": 68332, + "latitude": 40.392595, + "longitude": -96.26478, + "city": "Crab Orchard", + "state": "NE", + "county": "Johnson" + }, + { + "zip_code": 68333, + "latitude": 40.628937, + "longitude": -97.016925, + "city": "Crete", + "state": "NE", + "county": "Saline" + }, + { + "zip_code": 68335, + "latitude": 40.312473, + "longitude": -97.811467, + "city": "Davenport", + "state": "NE", + "county": "Thayer" + }, + { + "zip_code": 68336, + "latitude": 40.955071, + "longitude": -96.699697, + "city": "Davey", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68337, + "latitude": 40.132685, + "longitude": -95.830408, + "city": "Dawson", + "state": "NE", + "county": "Richardson" + }, + { + "zip_code": 68338, + "latitude": 40.306449, + "longitude": -97.14239, + "city": "Daykin", + "state": "NE", + "county": "Jefferson" + }, + { + "zip_code": 68339, + "latitude": 40.719464, + "longitude": -96.850518, + "city": "Denton", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68340, + "latitude": 40.139448, + "longitude": -97.723461, + "city": "Deshler", + "state": "NE", + "county": "Thayer" + }, + { + "zip_code": 68341, + "latitude": 40.374875, + "longitude": -96.960827, + "city": "De Witt", + "state": "NE", + "county": "Saline" + }, + { + "zip_code": 68342, + "latitude": 40.109484, + "longitude": -97.125705, + "city": "Diller", + "state": "NE", + "county": "Jefferson" + }, + { + "zip_code": 68343, + "latitude": 40.646087, + "longitude": -97.114965, + "city": "Dorchester", + "state": "NE", + "county": "Saline" + }, + { + "zip_code": 68344, + "latitude": 40.569758, + "longitude": -96.42238, + "city": "Douglas", + "state": "NE", + "county": "Otoe" + }, + { + "zip_code": 68345, + "latitude": 40.037725, + "longitude": -96.069797, + "city": "Du Bois", + "state": "NE", + "county": "Pawnee" + }, + { + "zip_code": 68346, + "latitude": 40.634055, + "longitude": -96.030125, + "city": "Dunbar", + "state": "NE", + "county": "Otoe" + }, + { + "zip_code": 68347, + "latitude": 40.899936, + "longitude": -96.378887, + "city": "Eagle", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68348, + "latitude": 40.287778, + "longitude": -96.12748, + "city": "Elk Creek", + "state": "NE", + "county": "Johnson" + }, + { + "zip_code": 68349, + "latitude": 40.834419, + "longitude": -96.323714, + "city": "Elmwood", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68350, + "latitude": 40.049596, + "longitude": -97.081254, + "city": "Endicott", + "state": "NE", + "county": "Jefferson" + }, + { + "zip_code": 68351, + "latitude": 40.653635, + "longitude": -97.430884, + "city": "Exeter", + "state": "NE", + "county": "Fillmore" + }, + { + "zip_code": 68352, + "latitude": 40.175641, + "longitude": -97.171023, + "city": "Fairbury", + "state": "NE", + "county": "Jefferson" + }, + { + "zip_code": 68354, + "latitude": 40.641428, + "longitude": -97.559927, + "city": "Fairmont", + "state": "NE", + "county": "Fillmore" + }, + { + "zip_code": 68355, + "latitude": 40.073908, + "longitude": -95.602053, + "city": "Falls City", + "state": "NE", + "county": "Richardson" + }, + { + "zip_code": 68357, + "latitude": 40.284748, + "longitude": -96.535195, + "city": "Filley", + "state": "NE", + "county": "Gage" + }, + { + "zip_code": 68358, + "latitude": 40.560657, + "longitude": -96.58393, + "city": "Firth", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68359, + "latitude": 40.526915, + "longitude": -97.111028, + "city": "Friend", + "state": "NE", + "county": "Saline" + }, + { + "zip_code": 68360, + "latitude": 40.966358, + "longitude": -96.96783, + "city": "Garland", + "state": "NE", + "county": "Seward" + }, + { + "zip_code": 68361, + "latitude": 40.52749, + "longitude": -97.600691, + "city": "Geneva", + "state": "NE", + "county": "Fillmore" + }, + { + "zip_code": 68362, + "latitude": 40.176221, + "longitude": -97.594987, + "city": "Gilead", + "state": "NE", + "county": "Thayer" + }, + { + "zip_code": 68364, + "latitude": 40.829068, + "longitude": -97.196716, + "city": "Goehner", + "state": "NE", + "county": "Seward" + }, + { + "zip_code": 68365, + "latitude": 40.629407, + "longitude": -97.714675, + "city": "Grafton", + "state": "NE", + "county": "Fillmore" + }, + { + "zip_code": 68366, + "latitude": 40.905385, + "longitude": -96.290223, + "city": "Greenwood", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68367, + "latitude": 41.010433, + "longitude": -97.425506, + "city": "Gresham", + "state": "NE", + "county": "York" + }, + { + "zip_code": 68368, + "latitude": 40.573856, + "longitude": -96.79982, + "city": "Hallam", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68370, + "latitude": 40.240562, + "longitude": -97.64485, + "city": "Hebron", + "state": "NE", + "county": "Thayer" + }, + { + "zip_code": 68371, + "latitude": 40.796446, + "longitude": -97.773811, + "city": "Henderson", + "state": "NE", + "county": "York" + }, + { + "zip_code": 68372, + "latitude": 40.61189, + "longitude": -96.62468, + "city": "Hickman", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68375, + "latitude": 40.008563, + "longitude": -97.497878, + "city": "Hubbell", + "state": "NE", + "county": "Thayer" + }, + { + "zip_code": 68376, + "latitude": 40.167245, + "longitude": -95.945731, + "city": "Humboldt", + "state": "NE", + "county": "Richardson" + }, + { + "zip_code": 68377, + "latitude": 40.232006, + "longitude": -97.028942, + "city": "Jansen", + "state": "NE", + "county": "Jefferson" + }, + { + "zip_code": 68378, + "latitude": 40.345196, + "longitude": -96.000386, + "city": "Johnson", + "state": "NE", + "county": "Nemaha" + }, + { + "zip_code": 68380, + "latitude": 40.195573, + "longitude": -96.379188, + "city": "Lewiston", + "state": "NE", + "county": "Pawnee" + }, + { + "zip_code": 68381, + "latitude": 40.262266, + "longitude": -96.689998, + "city": "Liberty", + "state": "NE", + "county": "Gage" + }, + { + "zip_code": 68382, + "latitude": 40.653589, + "longitude": -96.086904, + "city": "Lorton", + "state": "NE", + "county": "Otoe" + }, + { + "zip_code": 68401, + "latitude": 40.734852, + "longitude": -97.568381, + "city": "Mc Cool Junction", + "state": "NE", + "county": "York" + }, + { + "zip_code": 68402, + "latitude": 40.908246, + "longitude": -96.813503, + "city": "Malcolm", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68403, + "latitude": 40.923199, + "longitude": -96.171189, + "city": "Manley", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68404, + "latitude": 40.617579, + "longitude": -96.669936, + "city": "Martell", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68405, + "latitude": 40.77786, + "longitude": -97.082489, + "city": "Milford", + "state": "NE", + "county": "Seward" + }, + { + "zip_code": 68406, + "latitude": 40.501806, + "longitude": -97.385947, + "city": "Milligan", + "state": "NE", + "county": "Fillmore" + }, + { + "zip_code": 68407, + "latitude": 40.907906, + "longitude": -96.268221, + "city": "Murdock", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68409, + "latitude": 40.90767, + "longitude": -95.949383, + "city": "Murray", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68410, + "latitude": 40.707742, + "longitude": -95.907718, + "city": "Nebraska City", + "state": "NE", + "county": "Otoe" + }, + { + "zip_code": 68413, + "latitude": 40.856763, + "longitude": -96.015428, + "city": "Nehawka", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68414, + "latitude": 40.339435, + "longitude": -95.676576, + "city": "Nemaha", + "state": "NE", + "county": "Nemaha" + }, + { + "zip_code": 68415, + "latitude": 40.050592, + "longitude": -96.801542, + "city": "Odell", + "state": "NE", + "county": "Gage" + }, + { + "zip_code": 68416, + "latitude": 40.454112, + "longitude": -97.421084, + "city": "Ohiowa", + "state": "NE", + "county": "Fillmore" + }, + { + "zip_code": 68417, + "latitude": 40.750553, + "longitude": -96.080921, + "city": "Otoe", + "state": "NE", + "county": "Otoe" + }, + { + "zip_code": 68418, + "latitude": 40.705559, + "longitude": -96.397545, + "city": "Palmyra", + "state": "NE", + "county": "Otoe" + }, + { + "zip_code": 68419, + "latitude": 40.599807, + "longitude": -96.512915, + "city": "Panama", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68420, + "latitude": 40.111565, + "longitude": -96.151758, + "city": "Pawnee City", + "state": "NE", + "county": "Pawnee" + }, + { + "zip_code": 68421, + "latitude": 40.477743, + "longitude": -95.729589, + "city": "Peru", + "state": "NE", + "county": "Nemaha" + }, + { + "zip_code": 68422, + "latitude": 40.378063, + "longitude": -96.728578, + "city": "Pickrell", + "state": "NE", + "county": "Gage" + }, + { + "zip_code": 68423, + "latitude": 40.813869, + "longitude": -96.968018, + "city": "Pleasant Dale", + "state": "NE", + "county": "Seward" + }, + { + "zip_code": 68424, + "latitude": 40.291721, + "longitude": -97.029005, + "city": "Plymouth", + "state": "NE", + "county": "Jefferson" + }, + { + "zip_code": 68428, + "latitude": 40.934176, + "longitude": -96.786573, + "city": "Raymond", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68429, + "latitude": 40.059775, + "longitude": -97.380646, + "city": "Reynolds", + "state": "NE", + "county": "Thayer" + }, + { + "zip_code": 68430, + "latitude": 40.661609, + "longitude": -96.664859, + "city": "Roca", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68431, + "latitude": 40.046277, + "longitude": -95.428531, + "city": "Rulo", + "state": "NE", + "county": "Richardson" + }, + { + "zip_code": 68433, + "latitude": 40.131136, + "longitude": -95.659484, + "city": "Salem", + "state": "NE", + "county": "Richardson" + }, + { + "zip_code": 68434, + "latitude": 40.91582, + "longitude": -97.101341, + "city": "Seward", + "state": "NE", + "county": "Seward" + }, + { + "zip_code": 68436, + "latitude": 40.416166, + "longitude": -97.722218, + "city": "Shickley", + "state": "NE", + "county": "Fillmore" + }, + { + "zip_code": 68437, + "latitude": 40.236756, + "longitude": -95.684024, + "city": "Shubert", + "state": "NE", + "county": "Richardson" + }, + { + "zip_code": 68438, + "latitude": 40.626661, + "longitude": -96.745622, + "city": "Sprague", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68439, + "latitude": 40.95971, + "longitude": -97.251684, + "city": "Staplehurst", + "state": "NE", + "county": "Seward" + }, + { + "zip_code": 68440, + "latitude": 40.152861, + "longitude": -97.126435, + "city": "Steele City", + "state": "NE", + "county": "Jefferson" + }, + { + "zip_code": 68441, + "latitude": 40.207313, + "longitude": -96.231879, + "city": "Steinauer", + "state": "NE", + "county": "Pawnee" + }, + { + "zip_code": 68442, + "latitude": 40.23102, + "longitude": -95.77285, + "city": "Stella", + "state": "NE", + "county": "Richardson" + }, + { + "zip_code": 68443, + "latitude": 40.463451, + "longitude": -96.378249, + "city": "Sterling", + "state": "NE", + "county": "Johnson" + }, + { + "zip_code": 68444, + "latitude": 40.418921, + "longitude": -97.578418, + "city": "Strang", + "state": "NE", + "county": "Fillmore" + }, + { + "zip_code": 68445, + "latitude": 40.379788, + "longitude": -97.080431, + "city": "Swanton", + "state": "NE", + "county": "Saline" + }, + { + "zip_code": 68446, + "latitude": 40.645896, + "longitude": -96.169603, + "city": "Syracuse", + "state": "NE", + "county": "Otoe" + }, + { + "zip_code": 68447, + "latitude": 40.179541, + "longitude": -96.097374, + "city": "Table Rock", + "state": "NE", + "county": "Pawnee" + }, + { + "zip_code": 68448, + "latitude": 40.55711, + "longitude": -95.998514, + "city": "Talmage", + "state": "NE", + "county": "Otoe" + }, + { + "zip_code": 68450, + "latitude": 40.410949, + "longitude": -96.280341, + "city": "Tecumseh", + "state": "NE", + "county": "Johnson" + }, + { + "zip_code": 68452, + "latitude": 40.524526, + "longitude": -98.051184, + "city": "Ong", + "state": "NE", + "county": "Clay" + }, + { + "zip_code": 68453, + "latitude": 40.418436, + "longitude": -97.336671, + "city": "Tobias", + "state": "NE", + "county": "Saline" + }, + { + "zip_code": 68454, + "latitude": 40.684941, + "longitude": -96.270409, + "city": "Unadilla", + "state": "NE", + "county": "Otoe" + }, + { + "zip_code": 68455, + "latitude": 40.831238, + "longitude": -95.903802, + "city": "Union", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68456, + "latitude": 40.938023, + "longitude": -97.292178, + "city": "Utica", + "state": "NE", + "county": "Seward" + }, + { + "zip_code": 68457, + "latitude": 40.149228, + "longitude": -95.710477, + "city": "Verdon", + "state": "NE", + "county": "Richardson" + }, + { + "zip_code": 68458, + "latitude": 40.262266, + "longitude": -96.689998, + "city": "Virginia", + "state": "NE", + "county": "Gage" + }, + { + "zip_code": 68460, + "latitude": 40.886702, + "longitude": -97.437812, + "city": "Waco", + "state": "NE", + "county": "York" + }, + { + "zip_code": 68461, + "latitude": 40.762763, + "longitude": -96.515859, + "city": "Walton", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68462, + "latitude": 40.935601, + "longitude": -96.543431, + "city": "Waverly", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68463, + "latitude": 40.884503, + "longitude": -96.146512, + "city": "Weeping Water", + "state": "NE", + "county": "Cass" + }, + { + "zip_code": 68464, + "latitude": 40.403717, + "longitude": -97.265045, + "city": "Western", + "state": "NE", + "county": "Saline" + }, + { + "zip_code": 68465, + "latitude": 40.484136, + "longitude": -96.96829, + "city": "Wilber", + "state": "NE", + "county": "Saline" + }, + { + "zip_code": 68466, + "latitude": 40.122407, + "longitude": -96.666863, + "city": "Wymore", + "state": "NE", + "county": "Gage" + }, + { + "zip_code": 68467, + "latitude": 40.890132, + "longitude": -97.597278, + "city": "York", + "state": "NE", + "county": "York" + }, + { + "zip_code": 68501, + "latitude": 40.865142, + "longitude": -96.823133, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68502, + "latitude": 40.813101, + "longitude": -96.683702, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68503, + "latitude": 40.84505, + "longitude": -96.698646, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68504, + "latitude": 40.8532, + "longitude": -96.662454, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68505, + "latitude": 40.900275, + "longitude": -96.618058, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68506, + "latitude": 40.804064, + "longitude": -96.687195, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68507, + "latitude": 40.889449, + "longitude": -96.652274, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68508, + "latitude": 40.7981, + "longitude": -96.624692, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68509, + "latitude": 40.784451, + "longitude": -96.688799, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68510, + "latitude": 40.83545, + "longitude": -96.630741, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68512, + "latitude": 40.785689, + "longitude": -96.686643, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68514, + "latitude": 40.940125, + "longitude": -96.662138, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68516, + "latitude": 40.777556, + "longitude": -96.661769, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68517, + "latitude": 40.939903, + "longitude": -96.609721, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68520, + "latitude": 40.7842, + "longitude": -96.534981, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68521, + "latitude": 40.863301, + "longitude": -96.718994, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68522, + "latitude": 40.78456, + "longitude": -96.750075, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68523, + "latitude": 40.735793, + "longitude": -96.763247, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68524, + "latitude": 40.879252, + "longitude": -96.815309, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68526, + "latitude": 40.743346, + "longitude": -96.582442, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68527, + "latitude": 40.855121, + "longitude": -96.525245, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68528, + "latitude": 40.855107, + "longitude": -96.813579, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68529, + "latitude": 40.879752, + "longitude": -96.779796, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68531, + "latitude": 40.900801, + "longitude": -96.720143, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68532, + "latitude": 40.777663, + "longitude": -96.853616, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68542, + "latitude": 40.784451, + "longitude": -96.688799, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68583, + "latitude": 40.784451, + "longitude": -96.688799, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68588, + "latitude": 40.820645, + "longitude": -96.692843, + "city": "Lincoln", + "state": "NE", + "county": "Lancaster" + }, + { + "zip_code": 68601, + "latitude": 41.542962, + "longitude": -97.376314, + "city": "Columbus", + "state": "NE", + "county": "Platte" + }, + { + "zip_code": 68602, + "latitude": 41.53808, + "longitude": -97.541795, + "city": "Columbus", + "state": "NE", + "county": "Platte" + }, + { + "zip_code": 68620, + "latitude": 41.648736, + "longitude": -98.011092, + "city": "Albion", + "state": "NE", + "county": "Boone" + }, + { + "zip_code": 68621, + "latitude": 41.499208, + "longitude": -96.624657, + "city": "Ames", + "state": "NE", + "county": "Dodge" + }, + { + "zip_code": 68622, + "latitude": 41.914601, + "longitude": -98.528373, + "city": "Bartlett", + "state": "NE", + "county": "Wheeler" + }, + { + "zip_code": 68623, + "latitude": 41.471865, + "longitude": -98.068163, + "city": "Belgrade", + "state": "NE", + "county": "Nance" + }, + { + "zip_code": 68624, + "latitude": 41.342556, + "longitude": -97.214802, + "city": "Bellwood", + "state": "NE", + "county": "Butler" + }, + { + "zip_code": 68626, + "latitude": 41.143956, + "longitude": -96.992319, + "city": "Brainard", + "state": "NE", + "county": "Butler" + }, + { + "zip_code": 68627, + "latitude": 41.558087, + "longitude": -98.150139, + "city": "Cedar Rapids", + "state": "NE", + "county": "Boone" + }, + { + "zip_code": 68628, + "latitude": 41.202853, + "longitude": -97.80937, + "city": "Clarks", + "state": "NE", + "county": "Merrick" + }, + { + "zip_code": 68629, + "latitude": 41.663195, + "longitude": -97.137751, + "city": "Clarkson", + "state": "NE", + "county": "Colfax" + }, + { + "zip_code": 68631, + "latitude": 41.718708, + "longitude": -97.372671, + "city": "Creston", + "state": "NE", + "county": "Platte" + }, + { + "zip_code": 68632, + "latitude": 41.220715, + "longitude": -97.157229, + "city": "David City", + "state": "NE", + "county": "Butler" + }, + { + "zip_code": 68633, + "latitude": 41.593378, + "longitude": -96.675369, + "city": "Dodge", + "state": "NE", + "county": "Dodge" + }, + { + "zip_code": 68634, + "latitude": 41.393146, + "longitude": -97.595435, + "city": "Duncan", + "state": "NE", + "county": "Platte" + }, + { + "zip_code": 68635, + "latitude": 41.066016, + "longitude": -97.114365, + "city": "Dwight", + "state": "NE", + "county": "Butler" + }, + { + "zip_code": 68636, + "latitude": 41.982761, + "longitude": -98.083714, + "city": "Elgin", + "state": "NE", + "county": "Antelope" + }, + { + "zip_code": 68637, + "latitude": 41.779992, + "longitude": -98.679988, + "city": "Ericson", + "state": "NE", + "county": "Wheeler" + }, + { + "zip_code": 68638, + "latitude": 41.414475, + "longitude": -97.899889, + "city": "Fullerton", + "state": "NE", + "county": "Nance" + }, + { + "zip_code": 68640, + "latitude": 41.445863, + "longitude": -97.732584, + "city": "Genoa", + "state": "NE", + "county": "Nance" + }, + { + "zip_code": 68641, + "latitude": 41.66172, + "longitude": -97.103325, + "city": "Howells", + "state": "NE", + "county": "Colfax" + }, + { + "zip_code": 68642, + "latitude": 41.690226, + "longitude": -97.487407, + "city": "Humphrey", + "state": "NE", + "county": "Platte" + }, + { + "zip_code": 68643, + "latitude": 41.647114, + "longitude": -97.184984, + "city": "Leigh", + "state": "NE", + "county": "Colfax" + }, + { + "zip_code": 68644, + "latitude": 41.701476, + "longitude": -97.694247, + "city": "Lindsay", + "state": "NE", + "county": "Platte" + }, + { + "zip_code": 68647, + "latitude": 41.465573, + "longitude": -97.625525, + "city": "Monroe", + "state": "NE", + "county": "Platte" + }, + { + "zip_code": 68648, + "latitude": 41.375782, + "longitude": -96.811409, + "city": "Morse Bluff", + "state": "NE", + "county": "Saunders" + }, + { + "zip_code": 68649, + "latitude": 41.54148, + "longitude": -96.685416, + "city": "North Bend", + "state": "NE", + "county": "Dodge" + }, + { + "zip_code": 68651, + "latitude": 41.170633, + "longitude": -97.57, + "city": "Osceola", + "state": "NE", + "county": "Polk" + }, + { + "zip_code": 68652, + "latitude": 41.853086, + "longitude": -98.07996, + "city": "Petersburg", + "state": "NE", + "county": "Boone" + }, + { + "zip_code": 68653, + "latitude": 41.537151, + "longitude": -97.48488, + "city": "Platte Center", + "state": "NE", + "county": "Platte" + }, + { + "zip_code": 68654, + "latitude": 41.075237, + "longitude": -97.78707, + "city": "Polk", + "state": "NE", + "county": "Polk" + }, + { + "zip_code": 68655, + "latitude": 41.698452, + "longitude": -98.062909, + "city": "Primrose", + "state": "NE", + "county": "Boone" + }, + { + "zip_code": 68658, + "latitude": 41.19712, + "longitude": -97.181952, + "city": "Rising City", + "state": "NE", + "county": "Butler" + }, + { + "zip_code": 68659, + "latitude": 41.593926, + "longitude": -96.956019, + "city": "Rogers", + "state": "NE", + "county": "Colfax" + }, + { + "zip_code": 68660, + "latitude": 41.570444, + "longitude": -97.863484, + "city": "Saint Edward", + "state": "NE", + "county": "Boone" + }, + { + "zip_code": 68661, + "latitude": 41.559744, + "longitude": -97.079635, + "city": "Schuyler", + "state": "NE", + "county": "Colfax" + }, + { + "zip_code": 68662, + "latitude": 41.154703, + "longitude": -97.519253, + "city": "Shelby", + "state": "NE", + "county": "Polk" + }, + { + "zip_code": 68663, + "latitude": 41.303844, + "longitude": -97.723453, + "city": "Silver Creek", + "state": "NE", + "county": "Merrick" + }, + { + "zip_code": 68664, + "latitude": 41.648478, + "longitude": -96.787252, + "city": "Snyder", + "state": "NE", + "county": "Dodge" + }, + { + "zip_code": 68665, + "latitude": 41.688144, + "longitude": -98.363282, + "city": "Spalding", + "state": "NE", + "county": "Greeley" + }, + { + "zip_code": 68666, + "latitude": 41.114446, + "longitude": -97.591433, + "city": "Stromsburg", + "state": "NE", + "county": "Polk" + }, + { + "zip_code": 68667, + "latitude": 41.126818, + "longitude": -97.292178, + "city": "Surprise", + "state": "NE", + "county": "Butler" + }, + { + "zip_code": 68669, + "latitude": 41.09176, + "longitude": -97.224683, + "city": "Ulysses", + "state": "NE", + "county": "Butler" + }, + { + "zip_code": 68701, + "latitude": 41.99641, + "longitude": -97.601189, + "city": "Norfolk", + "state": "NE", + "county": "Madison" + }, + { + "zip_code": 68702, + "latitude": 41.916476, + "longitude": -97.601348, + "city": "Norfolk", + "state": "NE", + "county": "Madison" + }, + { + "zip_code": 68710, + "latitude": 42.445278, + "longitude": -96.884378, + "city": "Allen", + "state": "NE", + "county": "Dixon" + }, + { + "zip_code": 68711, + "latitude": 42.556421, + "longitude": -99.032048, + "city": "Amelia", + "state": "NE", + "county": "Holt" + }, + { + "zip_code": 68713, + "latitude": 42.533852, + "longitude": -98.975603, + "city": "Atkinson", + "state": "NE", + "county": "Holt" + }, + { + "zip_code": 68714, + "latitude": 42.583147, + "longitude": -99.551245, + "city": "Bassett", + "state": "NE", + "county": "Rock" + }, + { + "zip_code": 68715, + "latitude": 41.976904, + "longitude": -97.568855, + "city": "Battle Creek", + "state": "NE", + "county": "Madison" + }, + { + "zip_code": 68716, + "latitude": 41.909399, + "longitude": -96.816403, + "city": "Beemer", + "state": "NE", + "county": "Cuming" + }, + { + "zip_code": 68717, + "latitude": 42.429295, + "longitude": -97.212986, + "city": "Belden", + "state": "NE", + "county": "Cedar" + }, + { + "zip_code": 68718, + "latitude": 42.628731, + "longitude": -97.659606, + "city": "Bloomfield", + "state": "NE", + "county": "Knox" + }, + { + "zip_code": 68719, + "latitude": 42.879903, + "longitude": -98.781334, + "city": "Bristow", + "state": "NE", + "county": "Boyd" + }, + { + "zip_code": 68720, + "latitude": 42.176397, + "longitude": -98.066911, + "city": "Brunswick", + "state": "NE", + "county": "Antelope" + }, + { + "zip_code": 68722, + "latitude": 42.911492, + "longitude": -98.847065, + "city": "Butte", + "state": "NE", + "county": "Boyd" + }, + { + "zip_code": 68723, + "latitude": 42.286328, + "longitude": -97.193337, + "city": "Carroll", + "state": "NE", + "county": "Wayne" + }, + { + "zip_code": 68724, + "latitude": 42.597304, + "longitude": -97.866951, + "city": "Center", + "state": "NE", + "county": "Knox" + }, + { + "zip_code": 68725, + "latitude": 42.20186, + "longitude": -98.749451, + "city": "Chambers", + "state": "NE", + "county": "Holt" + }, + { + "zip_code": 68726, + "latitude": 42.176397, + "longitude": -98.066911, + "city": "Clearwater", + "state": "NE", + "county": "Antelope" + }, + { + "zip_code": 68727, + "latitude": 42.530505, + "longitude": -97.260393, + "city": "Coleridge", + "state": "NE", + "county": "Cedar" + }, + { + "zip_code": 68728, + "latitude": 42.493637, + "longitude": -96.853429, + "city": "Concord", + "state": "NE", + "county": "Dixon" + }, + { + "zip_code": 68729, + "latitude": 42.490856, + "longitude": -97.919351, + "city": "Creighton", + "state": "NE", + "county": "Knox" + }, + { + "zip_code": 68730, + "latitude": 42.758387, + "longitude": -97.603391, + "city": "Crofton", + "state": "NE", + "county": "Knox" + }, + { + "zip_code": 68731, + "latitude": 42.381775, + "longitude": -96.565385, + "city": "Dakota City", + "state": "NE", + "county": "Dakota" + }, + { + "zip_code": 68732, + "latitude": 42.480297, + "longitude": -96.967598, + "city": "Dixon", + "state": "NE", + "county": "Dixon" + }, + { + "zip_code": 68733, + "latitude": 42.361551, + "longitude": -96.639317, + "city": "Emerson", + "state": "NE", + "county": "Dakota" + }, + { + "zip_code": 68734, + "latitude": 42.492295, + "longitude": -98.778556, + "city": "Emmet", + "state": "NE", + "county": "Holt" + }, + { + "zip_code": 68735, + "latitude": 42.259207, + "longitude": -98.344313, + "city": "Ewing", + "state": "NE", + "county": "Holt" + }, + { + "zip_code": 68736, + "latitude": 42.728606, + "longitude": -97.319381, + "city": "Fordyce", + "state": "NE", + "county": "Cedar" + }, + { + "zip_code": 68737, + "latitude": 42.264356, + "longitude": -97.601337, + "city": "Foster", + "state": "NE", + "county": "Pierce" + }, + { + "zip_code": 68738, + "latitude": 42.264356, + "longitude": -97.601337, + "city": "Hadar", + "state": "NE", + "county": "Pierce" + }, + { + "zip_code": 68739, + "latitude": 42.591685, + "longitude": -97.250509, + "city": "Hartington", + "state": "NE", + "county": "Cedar" + }, + { + "zip_code": 68740, + "latitude": 42.221141, + "longitude": -97.309909, + "city": "Hoskins", + "state": "NE", + "county": "Wayne" + }, + { + "zip_code": 68741, + "latitude": 42.357595, + "longitude": -96.603097, + "city": "Hubbard", + "state": "NE", + "county": "Dakota" + }, + { + "zip_code": 68742, + "latitude": 42.380604, + "longitude": -98.530866, + "city": "Inman", + "state": "NE", + "county": "Holt" + }, + { + "zip_code": 68743, + "latitude": 42.452053, + "longitude": -96.631738, + "city": "Jackson", + "state": "NE", + "county": "Dakota" + }, + { + "zip_code": 68745, + "latitude": 42.475072, + "longitude": -97.142457, + "city": "Laurel", + "state": "NE", + "county": "Cedar" + }, + { + "zip_code": 68746, + "latitude": 42.879903, + "longitude": -98.781334, + "city": "Lynch", + "state": "NE", + "county": "Boyd" + }, + { + "zip_code": 68747, + "latitude": 42.438634, + "longitude": -97.475151, + "city": "Mclean", + "state": "NE", + "county": "Pierce" + }, + { + "zip_code": 68748, + "latitude": 41.881046, + "longitude": -97.48448, + "city": "Madison", + "state": "NE", + "county": "Madison" + }, + { + "zip_code": 68749, + "latitude": 42.609687, + "longitude": -97.250378, + "city": "Magnet", + "state": "NE", + "county": "Cedar" + }, + { + "zip_code": 68751, + "latitude": 42.481711, + "longitude": -96.926042, + "city": "Maskell", + "state": "NE", + "county": "Dixon" + }, + { + "zip_code": 68752, + "latitude": 42.034395, + "longitude": -97.782829, + "city": "Meadow Grove", + "state": "NE", + "county": "Madison" + }, + { + "zip_code": 68753, + "latitude": 42.858168, + "longitude": -99.726221, + "city": "Mills", + "state": "NE", + "county": "Keya Paha" + }, + { + "zip_code": 68755, + "latitude": 42.879903, + "longitude": -98.781334, + "city": "Naper", + "state": "NE", + "county": "Boyd" + }, + { + "zip_code": 68756, + "latitude": 42.216925, + "longitude": -98.13176, + "city": "Neligh", + "state": "NE", + "county": "Antelope" + }, + { + "zip_code": 68757, + "latitude": 42.494685, + "longitude": -96.861558, + "city": "Newcastle", + "state": "NE", + "county": "Dixon" + }, + { + "zip_code": 68758, + "latitude": 41.747884, + "longitude": -97.777198, + "city": "Newman Grove", + "state": "NE", + "county": "Madison" + }, + { + "zip_code": 68759, + "latitude": 42.858168, + "longitude": -99.726221, + "city": "Newport", + "state": "NE", + "county": "Keya Paha" + }, + { + "zip_code": 68760, + "latitude": 42.739127, + "longitude": -97.924783, + "city": "Niobrara", + "state": "NE", + "county": "Knox" + }, + { + "zip_code": 68761, + "latitude": 42.176397, + "longitude": -98.066911, + "city": "Oakdale", + "state": "NE", + "county": "Antelope" + }, + { + "zip_code": 68763, + "latitude": 42.370456, + "longitude": -98.665685, + "city": "Oneill", + "state": "NE", + "county": "Holt" + }, + { + "zip_code": 68764, + "latitude": 42.337003, + "longitude": -98.239908, + "city": "Orchard", + "state": "NE", + "county": "Antelope" + }, + { + "zip_code": 68765, + "latitude": 42.360661, + "longitude": -97.598511, + "city": "Osmond", + "state": "NE", + "county": "Pierce" + }, + { + "zip_code": 68766, + "latitude": 42.492295, + "longitude": -98.778556, + "city": "Page", + "state": "NE", + "county": "Holt" + }, + { + "zip_code": 68767, + "latitude": 42.224218, + "longitude": -97.581551, + "city": "Pierce", + "state": "NE", + "county": "Pierce" + }, + { + "zip_code": 68768, + "latitude": 41.976143, + "longitude": -97.07791, + "city": "Pilger", + "state": "NE", + "county": "Stanton" + }, + { + "zip_code": 68769, + "latitude": 42.35378, + "longitude": -97.788065, + "city": "Plainview", + "state": "NE", + "county": "Pierce" + }, + { + "zip_code": 68770, + "latitude": 42.565991, + "longitude": -96.711058, + "city": "Ponca", + "state": "NE", + "county": "Dixon" + }, + { + "zip_code": 68771, + "latitude": 42.438743, + "longitude": -97.319835, + "city": "Randolph", + "state": "NE", + "county": "Cedar" + }, + { + "zip_code": 68772, + "latitude": 42.445152, + "longitude": -99.455891, + "city": "Rose", + "state": "NE", + "county": "Rock" + }, + { + "zip_code": 68773, + "latitude": 42.176397, + "longitude": -98.066911, + "city": "Royal", + "state": "NE", + "county": "Antelope" + }, + { + "zip_code": 68774, + "latitude": 42.804591, + "longitude": -97.304691, + "city": "Saint Helena", + "state": "NE", + "county": "Cedar" + }, + { + "zip_code": 68776, + "latitude": 42.459711, + "longitude": -96.457068, + "city": "South Sioux City", + "state": "NE", + "county": "Dakota" + }, + { + "zip_code": 68777, + "latitude": 42.872702, + "longitude": -98.701552, + "city": "Spencer", + "state": "NE", + "county": "Boyd" + }, + { + "zip_code": 68778, + "latitude": 42.836424, + "longitude": -99.747046, + "city": "Springview", + "state": "NE", + "county": "Keya Paha" + }, + { + "zip_code": 68779, + "latitude": 41.982175, + "longitude": -97.203396, + "city": "Stanton", + "state": "NE", + "county": "Stanton" + }, + { + "zip_code": 68780, + "latitude": 42.599715, + "longitude": -99.141514, + "city": "Stuart", + "state": "NE", + "county": "Holt" + }, + { + "zip_code": 68781, + "latitude": 42.042732, + "longitude": -97.829855, + "city": "Tilden", + "state": "NE", + "county": "Madison" + }, + { + "zip_code": 68783, + "latitude": 42.624821, + "longitude": -98.129817, + "city": "Verdigre", + "state": "NE", + "county": "Knox" + }, + { + "zip_code": 68784, + "latitude": 42.307797, + "longitude": -96.930286, + "city": "Wakefield", + "state": "NE", + "county": "Dixon" + }, + { + "zip_code": 68785, + "latitude": 42.512745, + "longitude": -96.824742, + "city": "Waterbury", + "state": "NE", + "county": "Dixon" + }, + { + "zip_code": 68786, + "latitude": 42.518247, + "longitude": -97.608966, + "city": "Wausa", + "state": "NE", + "county": "Knox" + }, + { + "zip_code": 68787, + "latitude": 42.206417, + "longitude": -96.979049, + "city": "Wayne", + "state": "NE", + "county": "Wayne" + }, + { + "zip_code": 68788, + "latitude": 41.870968, + "longitude": -96.777787, + "city": "West Point", + "state": "NE", + "county": "Cuming" + }, + { + "zip_code": 68789, + "latitude": 42.533387, + "longitude": -98.004988, + "city": "Winnetoon", + "state": "NE", + "county": "Knox" + }, + { + "zip_code": 68790, + "latitude": 42.155768, + "longitude": -97.193232, + "city": "Winside", + "state": "NE", + "county": "Wayne" + }, + { + "zip_code": 68791, + "latitude": 41.960145, + "longitude": -96.893932, + "city": "Wisner", + "state": "NE", + "county": "Cuming" + }, + { + "zip_code": 68792, + "latitude": 42.708262, + "longitude": -97.161919, + "city": "Wynot", + "state": "NE", + "county": "Cedar" + }, + { + "zip_code": 68801, + "latitude": 40.87227, + "longitude": -98.368698, + "city": "Grand Island", + "state": "NE", + "county": "Hall" + }, + { + "zip_code": 68802, + "latitude": 40.872457, + "longitude": -98.50213, + "city": "Grand Island", + "state": "NE", + "county": "Hall" + }, + { + "zip_code": 68803, + "latitude": 40.872531, + "longitude": -98.521343, + "city": "Grand Island", + "state": "NE", + "county": "Hall" + }, + { + "zip_code": 68810, + "latitude": 40.860721, + "longitude": -98.504787, + "city": "Alda", + "state": "NE", + "county": "Hall" + }, + { + "zip_code": 68812, + "latitude": 40.916581, + "longitude": -99.292974, + "city": "Amherst", + "state": "NE", + "county": "Buffalo" + }, + { + "zip_code": 68813, + "latitude": 41.620773, + "longitude": -99.864392, + "city": "Anselmo", + "state": "NE", + "county": "Custer" + }, + { + "zip_code": 68814, + "latitude": 41.289827, + "longitude": -99.381735, + "city": "Ansley", + "state": "NE", + "county": "Custer" + }, + { + "zip_code": 68815, + "latitude": 41.52244, + "longitude": -99.038945, + "city": "Arcadia", + "state": "NE", + "county": "Valley" + }, + { + "zip_code": 68816, + "latitude": 41.140845, + "longitude": -98.13559, + "city": "Archer", + "state": "NE", + "county": "Merrick" + }, + { + "zip_code": 68817, + "latitude": 41.249476, + "longitude": -98.79476, + "city": "Ashton", + "state": "NE", + "county": "Sherman" + }, + { + "zip_code": 68818, + "latitude": 40.850832, + "longitude": -98.054272, + "city": "Aurora", + "state": "NE", + "county": "Hamilton" + }, + { + "zip_code": 68819, + "latitude": 41.35201, + "longitude": -99.502374, + "city": "Berwyn", + "state": "NE", + "county": "Custer" + }, + { + "zip_code": 68820, + "latitude": 41.11924, + "longitude": -98.681367, + "city": "Boelus", + "state": "NE", + "county": "Howard" + }, + { + "zip_code": 68821, + "latitude": 41.936376, + "longitude": -99.857111, + "city": "Brewster", + "state": "NE", + "county": "Blaine" + }, + { + "zip_code": 68822, + "latitude": 41.451119, + "longitude": -99.621491, + "city": "Broken Bow", + "state": "NE", + "county": "Custer" + }, + { + "zip_code": 68823, + "latitude": 41.782277, + "longitude": -99.134041, + "city": "Burwell", + "state": "NE", + "county": "Garfield" + }, + { + "zip_code": 68824, + "latitude": 40.908706, + "longitude": -98.568185, + "city": "Cairo", + "state": "NE", + "county": "Hall" + }, + { + "zip_code": 68825, + "latitude": 41.290502, + "longitude": -99.921245, + "city": "Callaway", + "state": "NE", + "county": "Custer" + }, + { + "zip_code": 68826, + "latitude": 41.162876, + "longitude": -98.010548, + "city": "Central City", + "state": "NE", + "county": "Merrick" + }, + { + "zip_code": 68827, + "latitude": 41.046263, + "longitude": -98.188441, + "city": "Chapman", + "state": "NE", + "county": "Merrick" + }, + { + "zip_code": 68828, + "latitude": 41.393902, + "longitude": -99.728097, + "city": "Comstock", + "state": "NE", + "county": "Custer" + }, + { + "zip_code": 68831, + "latitude": 41.16614, + "longitude": -98.546616, + "city": "Dannebrog", + "state": "NE", + "county": "Howard" + }, + { + "zip_code": 68832, + "latitude": 40.800367, + "longitude": -98.446665, + "city": "Doniphan", + "state": "NE", + "county": "Hall" + }, + { + "zip_code": 68833, + "latitude": 41.912303, + "longitude": -99.977135, + "city": "Dunning", + "state": "NE", + "county": "Blaine" + }, + { + "zip_code": 68834, + "latitude": 40.980376, + "longitude": -99.685939, + "city": "Eddyville", + "state": "NE", + "county": "Dawson" + }, + { + "zip_code": 68835, + "latitude": 41.32178, + "longitude": -98.604437, + "city": "Elba", + "state": "NE", + "county": "Howard" + }, + { + "zip_code": 68836, + "latitude": 40.779914, + "longitude": -99.331426, + "city": "Elm Creek", + "state": "NE", + "county": "Buffalo" + }, + { + "zip_code": 68837, + "latitude": 41.567344, + "longitude": -98.981592, + "city": "Elyria", + "state": "NE", + "county": "Valley" + }, + { + "zip_code": 68838, + "latitude": 41.206635, + "longitude": -98.679842, + "city": "Farwell", + "state": "NE", + "county": "Howard" + }, + { + "zip_code": 68840, + "latitude": 40.770884, + "longitude": -98.882818, + "city": "Gibbon", + "state": "NE", + "county": "Buffalo" + }, + { + "zip_code": 68841, + "latitude": 40.763612, + "longitude": -98.158838, + "city": "Giltner", + "state": "NE", + "county": "Hamilton" + }, + { + "zip_code": 68842, + "latitude": 41.563806, + "longitude": -98.530685, + "city": "Greeley", + "state": "NE", + "county": "Greeley" + }, + { + "zip_code": 68843, + "latitude": 40.933448, + "longitude": -98.021035, + "city": "Hampton", + "state": "NE", + "county": "Hamilton" + }, + { + "zip_code": 68844, + "latitude": 41.220515, + "longitude": -98.975997, + "city": "Hazard", + "state": "NE", + "county": "Sherman" + }, + { + "zip_code": 68845, + "latitude": 40.75141, + "longitude": -99.129054, + "city": "Kearney", + "state": "NE", + "county": "Buffalo" + }, + { + "zip_code": 68846, + "latitude": 40.962667, + "longitude": -97.991525, + "city": "Hordville", + "state": "NE", + "county": "Hamilton" + }, + { + "zip_code": 68847, + "latitude": 40.850493, + "longitude": -99.073398, + "city": "Kearney", + "state": "NE", + "county": "Buffalo" + }, + { + "zip_code": 68848, + "latitude": 40.686053, + "longitude": -99.069318, + "city": "Kearney", + "state": "NE", + "county": "Buffalo" + }, + { + "zip_code": 68849, + "latitude": 40.849654, + "longitude": -99.074058, + "city": "Kearney", + "state": "NE", + "county": "Buffalo" + }, + { + "zip_code": 68850, + "latitude": 40.873227, + "longitude": -99.718408, + "city": "Lexington", + "state": "NE", + "county": "Dawson" + }, + { + "zip_code": 68852, + "latitude": 41.156948, + "longitude": -99.153012, + "city": "Litchfield", + "state": "NE", + "county": "Sherman" + }, + { + "zip_code": 68853, + "latitude": 41.276435, + "longitude": -98.966954, + "city": "Loup City", + "state": "NE", + "county": "Sherman" + }, + { + "zip_code": 68854, + "latitude": 41.015778, + "longitude": -98.008324, + "city": "Marquette", + "state": "NE", + "county": "Hamilton" + }, + { + "zip_code": 68855, + "latitude": 41.283369, + "longitude": -99.37871, + "city": "Mason City", + "state": "NE", + "county": "Custer" + }, + { + "zip_code": 68856, + "latitude": 41.484951, + "longitude": -99.760782, + "city": "Merna", + "state": "NE", + "county": "Custer" + }, + { + "zip_code": 68858, + "latitude": 40.952708, + "longitude": -99.364921, + "city": "Miller", + "state": "NE", + "county": "Buffalo" + }, + { + "zip_code": 68859, + "latitude": 41.567344, + "longitude": -98.981592, + "city": "North Loup", + "state": "NE", + "county": "Valley" + }, + { + "zip_code": 68860, + "latitude": 41.393902, + "longitude": -99.728097, + "city": "Oconto", + "state": "NE", + "county": "Custer" + }, + { + "zip_code": 68861, + "latitude": 40.72996, + "longitude": -99.283748, + "city": "Odessa", + "state": "NE", + "county": "Buffalo" + }, + { + "zip_code": 68862, + "latitude": 41.603603, + "longitude": -98.932718, + "city": "Ord", + "state": "NE", + "county": "Valley" + }, + { + "zip_code": 68863, + "latitude": 40.801246, + "longitude": -99.521933, + "city": "Overton", + "state": "NE", + "county": "Dawson" + }, + { + "zip_code": 68864, + "latitude": 41.244701, + "longitude": -98.182952, + "city": "Palmer", + "state": "NE", + "county": "Merrick" + }, + { + "zip_code": 68865, + "latitude": 40.893539, + "longitude": -98.102223, + "city": "Phillips", + "state": "NE", + "county": "Hamilton" + }, + { + "zip_code": 68866, + "latitude": 40.960145, + "longitude": -99.121861, + "city": "Pleasanton", + "state": "NE", + "county": "Buffalo" + }, + { + "zip_code": 68869, + "latitude": 40.960075, + "longitude": -98.902302, + "city": "Ravenna", + "state": "NE", + "county": "Buffalo" + }, + { + "zip_code": 68870, + "latitude": 40.829478, + "longitude": -99.126061, + "city": "Riverdale", + "state": "NE", + "county": "Buffalo" + }, + { + "zip_code": 68871, + "latitude": 41.117178, + "longitude": -98.832654, + "city": "Rockville", + "state": "NE", + "county": "Sherman" + }, + { + "zip_code": 68872, + "latitude": 41.096855, + "longitude": -98.450297, + "city": "Saint Libory", + "state": "NE", + "county": "Howard" + }, + { + "zip_code": 68873, + "latitude": 41.232405, + "longitude": -98.503283, + "city": "Saint Paul", + "state": "NE", + "county": "Howard" + }, + { + "zip_code": 68874, + "latitude": 41.645695, + "longitude": -99.371585, + "city": "Sargent", + "state": "NE", + "county": "Custer" + }, + { + "zip_code": 68875, + "latitude": 41.467579, + "longitude": -98.703727, + "city": "Scotia", + "state": "NE", + "county": "Greeley" + }, + { + "zip_code": 68876, + "latitude": 40.812713, + "longitude": -98.788349, + "city": "Shelton", + "state": "NE", + "county": "Buffalo" + }, + { + "zip_code": 68878, + "latitude": 40.959402, + "longitude": -99.539866, + "city": "Sumner", + "state": "NE", + "county": "Dawson" + }, + { + "zip_code": 68879, + "latitude": 41.91406, + "longitude": -99.454335, + "city": "Taylor", + "state": "NE", + "county": "Loup" + }, + { + "zip_code": 68880, + "latitude": 41.393902, + "longitude": -99.728097, + "city": "Weissert", + "state": "NE", + "county": "Custer" + }, + { + "zip_code": 68881, + "latitude": 41.393902, + "longitude": -99.728097, + "city": "Westerville", + "state": "NE", + "county": "Custer" + }, + { + "zip_code": 68882, + "latitude": 41.397214, + "longitude": -98.431898, + "city": "Wolbach", + "state": "NE", + "county": "Greeley" + }, + { + "zip_code": 68883, + "latitude": 40.872494, + "longitude": -98.589324, + "city": "Wood River", + "state": "NE", + "county": "Hall" + }, + { + "zip_code": 68901, + "latitude": 40.582425, + "longitude": -98.389035, + "city": "Hastings", + "state": "NE", + "county": "Adams" + }, + { + "zip_code": 68902, + "latitude": 40.589594, + "longitude": -98.397248, + "city": "Hastings", + "state": "NE", + "county": "Adams" + }, + { + "zip_code": 68920, + "latitude": 40.101761, + "longitude": -99.352846, + "city": "Alma", + "state": "NE", + "county": "Harlan" + }, + { + "zip_code": 68922, + "latitude": 40.294628, + "longitude": -99.842844, + "city": "Arapahoe", + "state": "NE", + "county": "Furnas" + }, + { + "zip_code": 68923, + "latitude": 40.410446, + "longitude": -99.405055, + "city": "Atlanta", + "state": "NE", + "county": "Phelps" + }, + { + "zip_code": 68924, + "latitude": 40.50339, + "longitude": -99.091654, + "city": "Axtell", + "state": "NE", + "county": "Kearney" + }, + { + "zip_code": 68925, + "latitude": 40.429989, + "longitude": -98.463055, + "city": "Ayr", + "state": "NE", + "county": "Adams" + }, + { + "zip_code": 68926, + "latitude": 40.137671, + "longitude": -99.82693, + "city": "Beaver City", + "state": "NE", + "county": "Furnas" + }, + { + "zip_code": 68927, + "latitude": 40.525235, + "longitude": -99.634275, + "city": "Bertrand", + "state": "NE", + "county": "Phelps" + }, + { + "zip_code": 68928, + "latitude": 40.323796, + "longitude": -98.597026, + "city": "Bladen", + "state": "NE", + "county": "Webster" + }, + { + "zip_code": 68929, + "latitude": 40.097871, + "longitude": -99.037737, + "city": "Bloomington", + "state": "NE", + "county": "Franklin" + }, + { + "zip_code": 68930, + "latitude": 40.316739, + "longitude": -98.450468, + "city": "Blue Hill", + "state": "NE", + "county": "Webster" + }, + { + "zip_code": 68932, + "latitude": 40.306364, + "longitude": -98.814655, + "city": "Campbell", + "state": "NE", + "county": "Franklin" + }, + { + "zip_code": 68933, + "latitude": 40.565856, + "longitude": -98.070907, + "city": "Clay Center", + "state": "NE", + "county": "Clay" + }, + { + "zip_code": 68934, + "latitude": 40.35398, + "longitude": -98.140015, + "city": "Deweese", + "state": "NE", + "county": "Clay" + }, + { + "zip_code": 68935, + "latitude": 40.379736, + "longitude": -97.905641, + "city": "Edgar", + "state": "NE", + "county": "Clay" + }, + { + "zip_code": 68936, + "latitude": 40.277359, + "longitude": -99.776089, + "city": "Edison", + "state": "NE", + "county": "Furnas" + }, + { + "zip_code": 68937, + "latitude": 40.56962, + "longitude": -99.831972, + "city": "Elwood", + "state": "NE", + "county": "Gosper" + }, + { + "zip_code": 68938, + "latitude": 40.395335, + "longitude": -98.053432, + "city": "Fairfield", + "state": "NE", + "county": "Clay" + }, + { + "zip_code": 68939, + "latitude": 40.096305, + "longitude": -98.995406, + "city": "Franklin", + "state": "NE", + "county": "Franklin" + }, + { + "zip_code": 68940, + "latitude": 40.464046, + "longitude": -99.251676, + "city": "Funk", + "state": "NE", + "county": "Phelps" + }, + { + "zip_code": 68941, + "latitude": 40.503252, + "longitude": -98.255757, + "city": "Glenvil", + "state": "NE", + "county": "Clay" + }, + { + "zip_code": 68942, + "latitude": 40.071648, + "longitude": -98.330001, + "city": "Guide Rock", + "state": "NE", + "county": "Webster" + }, + { + "zip_code": 68943, + "latitude": 40.074907, + "longitude": -97.900651, + "city": "Hardy", + "state": "NE", + "county": "Nuckolls" + }, + { + "zip_code": 68944, + "latitude": 40.620578, + "longitude": -98.096849, + "city": "Harvard", + "state": "NE", + "county": "Clay" + }, + { + "zip_code": 68945, + "latitude": 40.55428, + "longitude": -98.790623, + "city": "Heartwell", + "state": "NE", + "county": "Kearney" + }, + { + "zip_code": 68946, + "latitude": 40.176314, + "longitude": -99.913076, + "city": "Hendley", + "state": "NE", + "county": "Furnas" + }, + { + "zip_code": 68947, + "latitude": 40.337828, + "longitude": -99.043138, + "city": "Hildreth", + "state": "NE", + "county": "Franklin" + }, + { + "zip_code": 68948, + "latitude": 40.304641, + "longitude": -99.959503, + "city": "Holbrook", + "state": "NE", + "county": "Furnas" + }, + { + "zip_code": 68949, + "latitude": 40.429207, + "longitude": -99.325955, + "city": "Holdrege", + "state": "NE", + "county": "Phelps" + }, + { + "zip_code": 68950, + "latitude": 40.437334, + "longitude": -98.638633, + "city": "Holstein", + "state": "NE", + "county": "Adams" + }, + { + "zip_code": 68952, + "latitude": 40.176368, + "longitude": -98.500037, + "city": "Inavale", + "state": "NE", + "county": "Webster" + }, + { + "zip_code": 68954, + "latitude": 40.524526, + "longitude": -98.051184, + "city": "Inland", + "state": "NE", + "county": "Clay" + }, + { + "zip_code": 68955, + "latitude": 40.596951, + "longitude": -98.506045, + "city": "Juniata", + "state": "NE", + "county": "Adams" + }, + { + "zip_code": 68956, + "latitude": 40.611581, + "longitude": -98.610696, + "city": "Kenesaw", + "state": "NE", + "county": "Adams" + }, + { + "zip_code": 68957, + "latitude": 40.291047, + "longitude": -98.25954, + "city": "Lawrence", + "state": "NE", + "county": "Nuckolls" + }, + { + "zip_code": 68958, + "latitude": 40.477867, + "longitude": -99.508075, + "city": "Loomis", + "state": "NE", + "county": "Phelps" + }, + { + "zip_code": 68959, + "latitude": 40.502515, + "longitude": -98.907731, + "city": "Minden", + "state": "NE", + "county": "Kearney" + }, + { + "zip_code": 68960, + "latitude": 40.074785, + "longitude": -99.137325, + "city": "Naponee", + "state": "NE", + "county": "Franklin" + }, + { + "zip_code": 68961, + "latitude": 40.20105, + "longitude": -98.068371, + "city": "Nelson", + "state": "NE", + "county": "Nuckolls" + }, + { + "zip_code": 68963, + "latitude": 40.478879, + "longitude": -98.792699, + "city": "Norman", + "state": "NE", + "county": "Kearney" + }, + { + "zip_code": 68964, + "latitude": 40.237813, + "longitude": -97.903047, + "city": "Oak", + "state": "NE", + "county": "Nuckolls" + }, + { + "zip_code": 68966, + "latitude": 40.130072, + "longitude": -99.45511, + "city": "Orleans", + "state": "NE", + "county": "Harlan" + }, + { + "zip_code": 68967, + "latitude": 40.254078, + "longitude": -99.637884, + "city": "Oxford", + "state": "NE", + "county": "Furnas" + }, + { + "zip_code": 68969, + "latitude": 40.176513, + "longitude": -99.404864, + "city": "Ragan", + "state": "NE", + "county": "Harlan" + }, + { + "zip_code": 68970, + "latitude": 40.201919, + "longitude": -98.500021, + "city": "Red Cloud", + "state": "NE", + "county": "Webster" + }, + { + "zip_code": 68971, + "latitude": 40.093106, + "longitude": -99.246197, + "city": "Republican City", + "state": "NE", + "county": "Harlan" + }, + { + "zip_code": 68972, + "latitude": 40.176335, + "longitude": -98.952642, + "city": "Riverton", + "state": "NE", + "county": "Franklin" + }, + { + "zip_code": 68973, + "latitude": 40.466384, + "longitude": -98.544036, + "city": "Roseland", + "state": "NE", + "county": "Adams" + }, + { + "zip_code": 68974, + "latitude": 40.152394, + "longitude": -97.91468, + "city": "Ruskin", + "state": "NE", + "county": "Nuckolls" + }, + { + "zip_code": 68975, + "latitude": 40.602128, + "longitude": -97.938811, + "city": "Saronville", + "state": "NE", + "county": "Clay" + }, + { + "zip_code": 68976, + "latitude": 40.539998, + "longitude": -99.830345, + "city": "Smithfield", + "state": "NE", + "county": "Gosper" + }, + { + "zip_code": 68977, + "latitude": 40.176513, + "longitude": -99.404864, + "city": "Stamford", + "state": "NE", + "county": "Harlan" + }, + { + "zip_code": 68978, + "latitude": 40.036673, + "longitude": -98.069593, + "city": "Superior", + "state": "NE", + "county": "Nuckolls" + }, + { + "zip_code": 68979, + "latitude": 40.507387, + "longitude": -97.85543, + "city": "Sutton", + "state": "NE", + "county": "Clay" + }, + { + "zip_code": 68980, + "latitude": 40.639247, + "longitude": -98.25112, + "city": "Trumbull", + "state": "NE", + "county": "Clay" + }, + { + "zip_code": 68981, + "latitude": 40.31743, + "longitude": -98.904418, + "city": "Upland", + "state": "NE", + "county": "Franklin" + }, + { + "zip_code": 68982, + "latitude": 40.378795, + "longitude": -99.152181, + "city": "Wilcox", + "state": "NE", + "county": "Kearney" + }, + { + "zip_code": 69001, + "latitude": 40.207969, + "longitude": -100.620628, + "city": "Mc Cook", + "state": "NE", + "county": "Red Willow" + }, + { + "zip_code": 69020, + "latitude": 40.252545, + "longitude": -100.305432, + "city": "Bartley", + "state": "NE", + "county": "Red Willow" + }, + { + "zip_code": 69021, + "latitude": 40.103088, + "longitude": -101.789168, + "city": "Benkelman", + "state": "NE", + "county": "Dundy" + }, + { + "zip_code": 69022, + "latitude": 40.269966, + "longitude": -100.171378, + "city": "Cambridge", + "state": "NE", + "county": "Furnas" + }, + { + "zip_code": 69023, + "latitude": 40.52473, + "longitude": -101.69724, + "city": "Champion", + "state": "NE", + "county": "Chase" + }, + { + "zip_code": 69024, + "latitude": 40.231495, + "longitude": -100.835774, + "city": "Culbertson", + "state": "NE", + "county": "Hitchcock" + }, + { + "zip_code": 69025, + "latitude": 40.643861, + "longitude": -100.54399, + "city": "Curtis", + "state": "NE", + "county": "Frontier" + }, + { + "zip_code": 69026, + "latitude": 40.176507, + "longitude": -100.476977, + "city": "Danbury", + "state": "NE", + "county": "Red Willow" + }, + { + "zip_code": 69027, + "latitude": 40.52473, + "longitude": -101.69724, + "city": "Enders", + "state": "NE", + "county": "Chase" + }, + { + "zip_code": 69028, + "latitude": 40.564186, + "longitude": -100.00978, + "city": "Eustis", + "state": "NE", + "county": "Frontier" + }, + { + "zip_code": 69029, + "latitude": 40.740544, + "longitude": -100.173314, + "city": "Farnam", + "state": "NE", + "county": "Dawson" + }, + { + "zip_code": 69030, + "latitude": 40.176417, + "longitude": -101.687688, + "city": "Haigler", + "state": "NE", + "county": "Dundy" + }, + { + "zip_code": 69031, + "latitude": 40.524819, + "longitude": -101.061328, + "city": "Hamlet", + "state": "NE", + "county": "Hayes" + }, + { + "zip_code": 69032, + "latitude": 40.524819, + "longitude": -101.061328, + "city": "Hayes Center", + "state": "NE", + "county": "Hayes" + }, + { + "zip_code": 69033, + "latitude": 40.515114, + "longitude": -101.632038, + "city": "Imperial", + "state": "NE", + "county": "Chase" + }, + { + "zip_code": 69034, + "latitude": 40.240034, + "longitude": -100.365256, + "city": "Indianola", + "state": "NE", + "county": "Red Willow" + }, + { + "zip_code": 69036, + "latitude": 40.176507, + "longitude": -100.476977, + "city": "Lebanon", + "state": "NE", + "county": "Red Willow" + }, + { + "zip_code": 69037, + "latitude": 40.176417, + "longitude": -101.687688, + "city": "Max", + "state": "NE", + "county": "Dundy" + }, + { + "zip_code": 69038, + "latitude": 40.524809, + "longitude": -100.38203, + "city": "Maywood", + "state": "NE", + "county": "Frontier" + }, + { + "zip_code": 69039, + "latitude": 40.524809, + "longitude": -100.38203, + "city": "Moorefield", + "state": "NE", + "county": "Frontier" + }, + { + "zip_code": 69040, + "latitude": 40.267333, + "longitude": -101.065001, + "city": "Palisade", + "state": "NE", + "county": "Hitchcock" + }, + { + "zip_code": 69041, + "latitude": 40.176417, + "longitude": -101.687688, + "city": "Parks", + "state": "NE", + "county": "Dundy" + }, + { + "zip_code": 69042, + "latitude": 40.524809, + "longitude": -100.38203, + "city": "Stockville", + "state": "NE", + "county": "Frontier" + }, + { + "zip_code": 69043, + "latitude": 40.15014, + "longitude": -101.227939, + "city": "Stratton", + "state": "NE", + "county": "Hitchcock" + }, + { + "zip_code": 69044, + "latitude": 40.176356, + "longitude": -101.010823, + "city": "Trenton", + "state": "NE", + "county": "Hitchcock" + }, + { + "zip_code": 69045, + "latitude": 40.416806, + "longitude": -101.370507, + "city": "Wauneta", + "state": "NE", + "county": "Chase" + }, + { + "zip_code": 69046, + "latitude": 40.112009, + "longitude": -100.106003, + "city": "Wilsonville", + "state": "NE", + "county": "Furnas" + }, + { + "zip_code": 69101, + "latitude": 41.102555, + "longitude": -100.74907, + "city": "North Platte", + "state": "NE", + "county": "Lincoln" + }, + { + "zip_code": 69103, + "latitude": 41.046447, + "longitude": -100.746912, + "city": "North Platte", + "state": "NE", + "county": "Lincoln" + }, + { + "zip_code": 69120, + "latitude": 41.423996, + "longitude": -100.194253, + "city": "Arnold", + "state": "NE", + "county": "Custer" + }, + { + "zip_code": 69121, + "latitude": 41.554073, + "longitude": -101.714495, + "city": "Arthur", + "state": "NE", + "county": "Arthur" + }, + { + "zip_code": 69122, + "latitude": 41.111961, + "longitude": -102.261262, + "city": "Big Springs", + "state": "NE", + "county": "Deuel" + }, + { + "zip_code": 69123, + "latitude": 41.049046, + "longitude": -100.391826, + "city": "Brady", + "state": "NE", + "county": "Lincoln" + }, + { + "zip_code": 69125, + "latitude": 41.598622, + "longitude": -102.852752, + "city": "Broadwater", + "state": "NE", + "county": "Morrill" + }, + { + "zip_code": 69127, + "latitude": 41.135819, + "longitude": -101.921709, + "city": "Brule", + "state": "NE", + "county": "Keith" + }, + { + "zip_code": 69128, + "latitude": 41.232626, + "longitude": -103.891757, + "city": "Bushnell", + "state": "NE", + "county": "Kimball" + }, + { + "zip_code": 69129, + "latitude": 41.112122, + "longitude": -102.421494, + "city": "Chappell", + "state": "NE", + "county": "Deuel" + }, + { + "zip_code": 69130, + "latitude": 40.895003, + "longitude": -99.967448, + "city": "Cozad", + "state": "NE", + "county": "Dawson" + }, + { + "zip_code": 69131, + "latitude": 41.380172, + "longitude": -103.031435, + "city": "Dalton", + "state": "NE", + "county": "Cheyenne" + }, + { + "zip_code": 69132, + "latitude": 41.046447, + "longitude": -100.746912, + "city": "Dickens", + "state": "NE", + "county": "Lincoln" + }, + { + "zip_code": 69133, + "latitude": 41.19801, + "longitude": -103.714501, + "city": "Dix", + "state": "NE", + "county": "Kimball" + }, + { + "zip_code": 69134, + "latitude": 40.850739, + "longitude": -101.649075, + "city": "Elsie", + "state": "NE", + "county": "Perkins" + }, + { + "zip_code": 69135, + "latitude": 42.542631, + "longitude": -101.126167, + "city": "Elsmere", + "state": "NE", + "county": "Cherry" + }, + { + "zip_code": 69138, + "latitude": 40.945256, + "longitude": -100.129125, + "city": "Gothenburg", + "state": "NE", + "county": "Dawson" + }, + { + "zip_code": 69140, + "latitude": 40.846046, + "longitude": -101.7258, + "city": "Grant", + "state": "NE", + "county": "Perkins" + }, + { + "zip_code": 69141, + "latitude": 41.315041, + "longitude": -102.983464, + "city": "Gurley", + "state": "NE", + "county": "Cheyenne" + }, + { + "zip_code": 69142, + "latitude": 41.913806, + "longitude": -100.555805, + "city": "Halsey", + "state": "NE", + "county": "Thomas" + }, + { + "zip_code": 69143, + "latitude": 40.98993, + "longitude": -100.96308, + "city": "Hershey", + "state": "NE", + "county": "Lincoln" + }, + { + "zip_code": 69144, + "latitude": 41.293525, + "longitude": -101.604569, + "city": "Keystone", + "state": "NE", + "county": "Keith" + }, + { + "zip_code": 69145, + "latitude": 41.206972, + "longitude": -103.769557, + "city": "Kimball", + "state": "NE", + "county": "Kimball" + }, + { + "zip_code": 69146, + "latitude": 41.323607, + "longitude": -101.767329, + "city": "Lemoyne", + "state": "NE", + "county": "Keith" + }, + { + "zip_code": 69147, + "latitude": 41.315509, + "longitude": -102.153084, + "city": "Lewellen", + "state": "NE", + "county": "Garden" + }, + { + "zip_code": 69148, + "latitude": 41.409518, + "longitude": -102.476752, + "city": "Lisco", + "state": "NE", + "county": "Garden" + }, + { + "zip_code": 69149, + "latitude": 41.223638, + "longitude": -102.794277, + "city": "Lodgepole", + "state": "NE", + "county": "Cheyenne" + }, + { + "zip_code": 69150, + "latitude": 40.850739, + "longitude": -101.649075, + "city": "Madrid", + "state": "NE", + "county": "Perkins" + }, + { + "zip_code": 69151, + "latitude": 41.096752, + "longitude": -100.583269, + "city": "Maxwell", + "state": "NE", + "county": "Lincoln" + }, + { + "zip_code": 69152, + "latitude": 42.042143, + "longitude": -101.045192, + "city": "Mullen", + "state": "NE", + "county": "Hooker" + }, + { + "zip_code": 69153, + "latitude": 41.131676, + "longitude": -101.663033, + "city": "Ogallala", + "state": "NE", + "county": "Keith" + }, + { + "zip_code": 69154, + "latitude": 41.377536, + "longitude": -102.385678, + "city": "Oshkosh", + "state": "NE", + "county": "Garden" + }, + { + "zip_code": 69155, + "latitude": 41.199097, + "longitude": -101.423214, + "city": "Paxton", + "state": "NE", + "county": "Keith" + }, + { + "zip_code": 69156, + "latitude": 41.212817, + "longitude": -103.247811, + "city": "Potter", + "state": "NE", + "county": "Cheyenne" + }, + { + "zip_code": 69157, + "latitude": 41.912303, + "longitude": -99.977135, + "city": "Purdum", + "state": "NE", + "county": "Blaine" + }, + { + "zip_code": 69160, + "latitude": 41.220549, + "longitude": -102.995925, + "city": "Sidney", + "state": "NE", + "county": "Cheyenne" + }, + { + "zip_code": 69161, + "latitude": 41.913806, + "longitude": -100.555805, + "city": "Seneca", + "state": "NE", + "county": "Thomas" + }, + { + "zip_code": 69162, + "latitude": 41.161943, + "longitude": -103.066015, + "city": "Sidney", + "state": "NE", + "county": "Cheyenne" + }, + { + "zip_code": 69163, + "latitude": 41.480166, + "longitude": -100.512463, + "city": "Stapleton", + "state": "NE", + "county": "Logan" + }, + { + "zip_code": 69165, + "latitude": 41.1597, + "longitude": -101.136616, + "city": "Sutherland", + "state": "NE", + "county": "Lincoln" + }, + { + "zip_code": 69166, + "latitude": 41.979407, + "longitude": -100.557354, + "city": "Thedford", + "state": "NE", + "county": "Thomas" + }, + { + "zip_code": 69167, + "latitude": 41.568548, + "longitude": -101.059489, + "city": "Tryon", + "state": "NE", + "county": "Mcpherson" + }, + { + "zip_code": 69168, + "latitude": 40.850739, + "longitude": -101.649075, + "city": "Venango", + "state": "NE", + "county": "Perkins" + }, + { + "zip_code": 69169, + "latitude": 41.046447, + "longitude": -100.746912, + "city": "Wallace", + "state": "NE", + "county": "Lincoln" + }, + { + "zip_code": 69170, + "latitude": 40.762172, + "longitude": -100.760429, + "city": "Wellfleet", + "state": "NE", + "county": "Lincoln" + }, + { + "zip_code": 69171, + "latitude": 40.892469, + "longitude": -100.070257, + "city": "Willow Island", + "state": "NE", + "county": "Dawson" + }, + { + "zip_code": 69190, + "latitude": 41.615307, + "longitude": -102.331762, + "city": "Oshkosh", + "state": "NE", + "county": "Garden" + }, + { + "zip_code": 69201, + "latitude": 42.906836, + "longitude": -100.996747, + "city": "Valentine", + "state": "NE", + "county": "Cherry" + }, + { + "zip_code": 69210, + "latitude": 42.542734, + "longitude": -99.852364, + "city": "Ainsworth", + "state": "NE", + "county": "Brown" + }, + { + "zip_code": 69211, + "latitude": 42.542631, + "longitude": -101.126167, + "city": "Cody", + "state": "NE", + "county": "Cherry" + }, + { + "zip_code": 69212, + "latitude": 42.542631, + "longitude": -101.126167, + "city": "Crookston", + "state": "NE", + "county": "Cherry" + }, + { + "zip_code": 69214, + "latitude": 42.465698, + "longitude": -99.930477, + "city": "Johnstown", + "state": "NE", + "county": "Brown" + }, + { + "zip_code": 69216, + "latitude": 42.542631, + "longitude": -101.126167, + "city": "Kilgore", + "state": "NE", + "county": "Cherry" + }, + { + "zip_code": 69217, + "latitude": 42.533987, + "longitude": -99.702813, + "city": "Long Pine", + "state": "NE", + "county": "Brown" + }, + { + "zip_code": 69218, + "latitude": 42.542631, + "longitude": -101.126167, + "city": "Merriman", + "state": "NE", + "county": "Cherry" + }, + { + "zip_code": 69219, + "latitude": 42.542631, + "longitude": -101.126167, + "city": "Nenzel", + "state": "NE", + "county": "Cherry" + }, + { + "zip_code": 69220, + "latitude": 42.542631, + "longitude": -101.126167, + "city": "Sparks", + "state": "NE", + "county": "Cherry" + }, + { + "zip_code": 69221, + "latitude": 42.542631, + "longitude": -101.126167, + "city": "Wood Lake", + "state": "NE", + "county": "Cherry" + }, + { + "zip_code": 69301, + "latitude": 42.219844, + "longitude": -103.073327, + "city": "Alliance", + "state": "NE", + "county": "Box Butte" + }, + { + "zip_code": 69331, + "latitude": 41.721468, + "longitude": -103.003835, + "city": "Angora", + "state": "NE", + "county": "Morrill" + }, + { + "zip_code": 69333, + "latitude": 41.919117, + "longitude": -101.746919, + "city": "Ashby", + "state": "NE", + "county": "Grant" + }, + { + "zip_code": 69334, + "latitude": 41.760711, + "longitude": -103.32705, + "city": "Bayard", + "state": "NE", + "county": "Morrill" + }, + { + "zip_code": 69335, + "latitude": 42.730616, + "longitude": -102.471549, + "city": "Bingham", + "state": "NE", + "county": "Sheridan" + }, + { + "zip_code": 69336, + "latitude": 41.667733, + "longitude": -103.102335, + "city": "Bridgeport", + "state": "NE", + "county": "Morrill" + }, + { + "zip_code": 69337, + "latitude": 42.774479, + "longitude": -103.138479, + "city": "Chadron", + "state": "NE", + "county": "Dawes" + }, + { + "zip_code": 69339, + "latitude": 42.611517, + "longitude": -103.303223, + "city": "Crawford", + "state": "NE", + "county": "Dawes" + }, + { + "zip_code": 69340, + "latitude": 42.502412, + "longitude": -102.399697, + "city": "Ellsworth", + "state": "NE", + "county": "Sheridan" + }, + { + "zip_code": 69341, + "latitude": 41.80602, + "longitude": -103.75796, + "city": "Gering", + "state": "NE", + "county": "Scotts Bluff" + }, + { + "zip_code": 69343, + "latitude": 42.763456, + "longitude": -102.314593, + "city": "Gordon", + "state": "NE", + "county": "Sheridan" + }, + { + "zip_code": 69345, + "latitude": 41.546441, + "longitude": -103.710045, + "city": "Harrisburg", + "state": "NE", + "county": "Banner" + }, + { + "zip_code": 69346, + "latitude": 42.631216, + "longitude": -103.782027, + "city": "Harrison", + "state": "NE", + "county": "Sioux" + }, + { + "zip_code": 69347, + "latitude": 42.636894, + "longitude": -102.665536, + "city": "Hay Springs", + "state": "NE", + "county": "Sheridan" + }, + { + "zip_code": 69348, + "latitude": 42.314537, + "longitude": -103.097258, + "city": "Hemingford", + "state": "NE", + "county": "Box Butte" + }, + { + "zip_code": 69349, + "latitude": 41.987327, + "longitude": -104.045244, + "city": "Henry", + "state": "NE", + "county": "Scotts Bluff" + }, + { + "zip_code": 69350, + "latitude": 41.959181, + "longitude": -101.751854, + "city": "Hyannis", + "state": "NE", + "county": "Grant" + }, + { + "zip_code": 69351, + "latitude": 42.502412, + "longitude": -102.399697, + "city": "Lakeside", + "state": "NE", + "county": "Sheridan" + }, + { + "zip_code": 69352, + "latitude": 41.835492, + "longitude": -103.974153, + "city": "Lyman", + "state": "NE", + "county": "Scotts Bluff" + }, + { + "zip_code": 69353, + "latitude": 41.746944, + "longitude": -103.416351, + "city": "Mcgrew", + "state": "NE", + "county": "Scotts Bluff" + }, + { + "zip_code": 69354, + "latitude": 42.524433, + "longitude": -103.25644, + "city": "Marsland", + "state": "NE", + "county": "Dawes" + }, + { + "zip_code": 69355, + "latitude": 41.765008, + "longitude": -103.468748, + "city": "Melbeta", + "state": "NE", + "county": "Scotts Bluff" + }, + { + "zip_code": 69356, + "latitude": 41.861192, + "longitude": -103.643939, + "city": "Minatare", + "state": "NE", + "county": "Scotts Bluff" + }, + { + "zip_code": 69357, + "latitude": 41.874333, + "longitude": -103.803504, + "city": "Mitchell", + "state": "NE", + "county": "Scotts Bluff" + }, + { + "zip_code": 69358, + "latitude": 41.929379, + "longitude": -103.950162, + "city": "Morrill", + "state": "NE", + "county": "Scotts Bluff" + }, + { + "zip_code": 69360, + "latitude": 42.71634, + "longitude": -102.46359, + "city": "Rushville", + "state": "NE", + "county": "Sheridan" + }, + { + "zip_code": 69361, + "latitude": 41.872005, + "longitude": -103.77023, + "city": "Scottsbluff", + "state": "NE", + "county": "Scotts Bluff" + }, + { + "zip_code": 69363, + "latitude": 41.851012, + "longitude": -103.70726, + "city": "Scottsbluff", + "state": "NE", + "county": "Scotts Bluff" + }, + { + "zip_code": 69365, + "latitude": 42.502412, + "longitude": -102.399697, + "city": "Whiteclay", + "state": "NE", + "county": "Sheridan" + }, + { + "zip_code": 69366, + "latitude": 41.919117, + "longitude": -101.746919, + "city": "Whitman", + "state": "NE", + "county": "Grant" + }, + { + "zip_code": 69367, + "latitude": 42.788579, + "longitude": -103.299462, + "city": "Whitney", + "state": "NE", + "county": "Dawes" + }, + { + "zip_code": 70001, + "latitude": 29.984643, + "longitude": -90.161821, + "city": "Metairie", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70002, + "latitude": 30.008003, + "longitude": -90.176491, + "city": "Metairie", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70003, + "latitude": 30.005653, + "longitude": -90.20733, + "city": "Metairie", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70004, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "Metairie", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70005, + "latitude": 29.998821, + "longitude": -90.134428, + "city": "Metairie", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70006, + "latitude": 30.013413, + "longitude": -90.195842, + "city": "Metairie", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70009, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "Metairie", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70010, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "Metairie", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70011, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "Metairie", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70030, + "latitude": 29.841219, + "longitude": -90.430699, + "city": "Des Allemands", + "state": "LA", + "county": "Saint Charles" + }, + { + "zip_code": 70031, + "latitude": 29.947005, + "longitude": -90.295997, + "city": "Ama", + "state": "LA", + "county": "Saint Charles" + }, + { + "zip_code": 70032, + "latitude": 29.956803, + "longitude": -89.987547, + "city": "Arabi", + "state": "LA", + "county": "Saint Bernard" + }, + { + "zip_code": 70033, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "Metairie", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70036, + "latitude": 29.696362, + "longitude": -90.112182, + "city": "Barataria", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70037, + "latitude": 29.620092, + "longitude": -89.771638, + "city": "Belle Chasse", + "state": "LA", + "county": "Plaquemines" + }, + { + "zip_code": 70038, + "latitude": 29.303827, + "longitude": -89.401545, + "city": "Boothville", + "state": "LA", + "county": "Plaquemines" + }, + { + "zip_code": 70039, + "latitude": 29.904159, + "longitude": -90.374038, + "city": "Boutte", + "state": "LA", + "county": "Saint Charles" + }, + { + "zip_code": 70040, + "latitude": 29.736105, + "longitude": -89.919691, + "city": "Braithwaite", + "state": "LA", + "county": "Plaquemines" + }, + { + "zip_code": 70041, + "latitude": 29.427314, + "longitude": -89.571937, + "city": "Buras", + "state": "LA", + "county": "Plaquemines" + }, + { + "zip_code": 70042, + "latitude": 29.380066, + "longitude": -89.477464, + "city": "Carlisle", + "state": "LA", + "county": "Plaquemines" + }, + { + "zip_code": 70043, + "latitude": 29.947746, + "longitude": -89.954906, + "city": "Chalmette", + "state": "LA", + "county": "Saint Bernard" + }, + { + "zip_code": 70044, + "latitude": 29.96765, + "longitude": -89.951441, + "city": "Chalmette", + "state": "LA", + "county": "Saint Bernard" + }, + { + "zip_code": 70046, + "latitude": 29.61829, + "longitude": -89.872599, + "city": "Davant", + "state": "LA", + "county": "Plaquemines" + }, + { + "zip_code": 70047, + "latitude": 29.964207, + "longitude": -90.368185, + "city": "Destrehan", + "state": "LA", + "county": "Saint Charles" + }, + { + "zip_code": 70049, + "latitude": 30.033264, + "longitude": -90.575432, + "city": "Edgard", + "state": "LA", + "county": "St John The Baptist" + }, + { + "zip_code": 70050, + "latitude": 29.404065, + "longitude": -89.59563, + "city": "Empire", + "state": "LA", + "county": "Plaquemines" + }, + { + "zip_code": 70051, + "latitude": 29.998705, + "longitude": -90.619382, + "city": "Garyville", + "state": "LA", + "county": "St John The Baptist" + }, + { + "zip_code": 70052, + "latitude": 30.048935, + "longitude": -90.711904, + "city": "Gramercy", + "state": "LA", + "county": "Saint James" + }, + { + "zip_code": 70053, + "latitude": 29.911385, + "longitude": -90.055722, + "city": "Gretna", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70054, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "Gretna", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70055, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "Metairie", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70056, + "latitude": 29.887204, + "longitude": -90.033138, + "city": "Gretna", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70057, + "latitude": 29.966812, + "longitude": -90.408167, + "city": "Hahnville", + "state": "LA", + "county": "Saint Charles" + }, + { + "zip_code": 70058, + "latitude": 29.875555, + "longitude": -90.069558, + "city": "Harvey", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70059, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "Harvey", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70060, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "Metairie", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70062, + "latitude": 29.994398, + "longitude": -90.20446, + "city": "Kenner", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70063, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "Kenner", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70064, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "Kenner", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70065, + "latitude": 30.027041, + "longitude": -90.250547, + "city": "Kenner", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70066, + "latitude": 30.003409, + "longitude": -90.45072, + "city": "Killona", + "state": "LA", + "county": "Saint Charles" + }, + { + "zip_code": 70067, + "latitude": 29.825895, + "longitude": -90.113675, + "city": "Lafitte", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70068, + "latitude": 30.065367, + "longitude": -90.527515, + "city": "La Place", + "state": "LA", + "county": "St John The Baptist" + }, + { + "zip_code": 70069, + "latitude": 30.091158, + "longitude": -90.483189, + "city": "La Place", + "state": "LA", + "county": "St John The Baptist" + }, + { + "zip_code": 70070, + "latitude": 29.944447, + "longitude": -90.348009, + "city": "Luling", + "state": "LA", + "county": "Saint Charles" + }, + { + "zip_code": 70071, + "latitude": 30.03757, + "longitude": -90.73039, + "city": "Lutcher", + "state": "LA", + "county": "Saint James" + }, + { + "zip_code": 70072, + "latitude": 29.819729, + "longitude": -90.078264, + "city": "Marrero", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70073, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "Marrero", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70075, + "latitude": 29.932133, + "longitude": -89.923522, + "city": "Meraux", + "state": "LA", + "county": "Saint Bernard" + }, + { + "zip_code": 70076, + "latitude": 30.057525, + "longitude": -90.636855, + "city": "Mount Airy", + "state": "LA", + "county": "St John The Baptist" + }, + { + "zip_code": 70078, + "latitude": 29.981674, + "longitude": -90.38595, + "city": "New Sarpy", + "state": "LA", + "county": "Saint Charles" + }, + { + "zip_code": 70079, + "latitude": 29.973479, + "longitude": -90.404699, + "city": "Norco", + "state": "LA", + "county": "Saint Charles" + }, + { + "zip_code": 70080, + "latitude": 29.891541, + "longitude": -90.378697, + "city": "Paradis", + "state": "LA", + "county": "Saint Charles" + }, + { + "zip_code": 70081, + "latitude": 29.285081, + "longitude": -89.364034, + "city": "Pilottown", + "state": "LA", + "county": "Plaquemines" + }, + { + "zip_code": 70082, + "latitude": 29.587389, + "longitude": -89.831317, + "city": "Pointe A La Hache", + "state": "LA", + "county": "Plaquemines" + }, + { + "zip_code": 70083, + "latitude": 29.502725, + "longitude": -89.69023, + "city": "Port Sulphur", + "state": "LA", + "county": "Plaquemines" + }, + { + "zip_code": 70084, + "latitude": 30.05819, + "longitude": -90.605871, + "city": "Reserve", + "state": "LA", + "county": "St John The Baptist" + }, + { + "zip_code": 70085, + "latitude": 29.818387, + "longitude": -89.775097, + "city": "Saint Bernard", + "state": "LA", + "county": "Saint Bernard" + }, + { + "zip_code": 70086, + "latitude": 30.033127, + "longitude": -90.867755, + "city": "Saint James", + "state": "LA", + "county": "Saint James" + }, + { + "zip_code": 70087, + "latitude": 29.945998, + "longitude": -90.354891, + "city": "Saint Rose", + "state": "LA", + "county": "Saint Charles" + }, + { + "zip_code": 70090, + "latitude": 29.989546, + "longitude": -90.761722, + "city": "Vacherie", + "state": "LA", + "county": "Saint James" + }, + { + "zip_code": 70091, + "latitude": 29.279536, + "longitude": -89.373855, + "city": "Venice", + "state": "LA", + "county": "Plaquemines" + }, + { + "zip_code": 70092, + "latitude": 29.900262, + "longitude": -89.894926, + "city": "Violet", + "state": "LA", + "county": "Saint Bernard" + }, + { + "zip_code": 70094, + "latitude": 29.920768, + "longitude": -90.204326, + "city": "Westwego", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70096, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "Westwego", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70112, + "latitude": 29.958304, + "longitude": -90.077, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70113, + "latitude": 29.943769, + "longitude": -90.083172, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70114, + "latitude": 29.929605, + "longitude": -90.013164, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70115, + "latitude": 29.938343, + "longitude": -90.100773, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70116, + "latitude": 29.968504, + "longitude": -90.067122, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70117, + "latitude": 29.968553, + "longitude": -90.02845, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70118, + "latitude": 29.948283, + "longitude": -90.122498, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70119, + "latitude": 29.973053, + "longitude": -90.08542, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70121, + "latitude": 29.961448, + "longitude": -90.157715, + "city": "New Orleans", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70122, + "latitude": 30.009063, + "longitude": -90.062147, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70123, + "latitude": 29.951082, + "longitude": -90.206031, + "city": "New Orleans", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70124, + "latitude": 30.002253, + "longitude": -90.103673, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70125, + "latitude": 29.952659, + "longitude": -90.102965, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70126, + "latitude": 29.998653, + "longitude": -90.044561, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70127, + "latitude": 30.031251, + "longitude": -89.975819, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70128, + "latitude": 30.048653, + "longitude": -89.958519, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70129, + "latitude": 30.087708, + "longitude": -89.846226, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70130, + "latitude": 29.939504, + "longitude": -90.074122, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70131, + "latitude": 29.915873, + "longitude": -89.962403, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70139, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70140, + "latitude": 29.95612, + "longitude": -90.078312, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70141, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "New Orleans", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70142, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70143, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70145, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70146, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70148, + "latitude": 30.030902, + "longitude": -90.068022, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70149, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70150, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70151, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70152, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70153, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70154, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70156, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70157, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70158, + "latitude": 29.922905, + "longitude": -90.070922, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70159, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70160, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70161, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70162, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70163, + "latitude": 29.950659, + "longitude": -90.075121, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70164, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70165, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70166, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70167, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70170, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70172, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70174, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70175, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70176, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70177, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70178, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70179, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70181, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "New Orleans", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70182, + "latitude": 30.067646, + "longitude": -89.815993, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70183, + "latitude": 29.677893, + "longitude": -90.0901, + "city": "New Orleans", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70184, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70185, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70186, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70187, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70189, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70190, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70195, + "latitude": 30.032997, + "longitude": -89.882564, + "city": "New Orleans", + "state": "LA", + "county": "Orleans" + }, + { + "zip_code": 70301, + "latitude": 29.640426, + "longitude": -90.599039, + "city": "Thibodaux", + "state": "LA", + "county": "Lafourche" + }, + { + "zip_code": 70302, + "latitude": 29.458689, + "longitude": -90.502848, + "city": "Thibodaux", + "state": "LA", + "county": "Lafourche" + }, + { + "zip_code": 70310, + "latitude": 29.803282, + "longitude": -90.816914, + "city": "Thibodaux", + "state": "LA", + "county": "Lafourche" + }, + { + "zip_code": 70339, + "latitude": 29.947562, + "longitude": -91.188549, + "city": "Pierre Part", + "state": "LA", + "county": "Assumption" + }, + { + "zip_code": 70340, + "latitude": 29.688425, + "longitude": -91.220844, + "city": "Amelia", + "state": "LA", + "county": "Saint Mary" + }, + { + "zip_code": 70341, + "latitude": 30.03307, + "longitude": -91.077279, + "city": "Belle Rose", + "state": "LA", + "county": "Assumption" + }, + { + "zip_code": 70342, + "latitude": 29.692879, + "longitude": -91.251811, + "city": "Berwick", + "state": "LA", + "county": "Saint Mary" + }, + { + "zip_code": 70343, + "latitude": 29.543768, + "longitude": -90.607587, + "city": "Bourg", + "state": "LA", + "county": "Terrebonne" + }, + { + "zip_code": 70344, + "latitude": 29.393661, + "longitude": -90.609142, + "city": "Chauvin", + "state": "LA", + "county": "Terrebonne" + }, + { + "zip_code": 70345, + "latitude": 29.509589, + "longitude": -90.335128, + "city": "Cut Off", + "state": "LA", + "county": "Lafourche" + }, + { + "zip_code": 70346, + "latitude": 30.159584, + "longitude": -90.967424, + "city": "Donaldsonville", + "state": "LA", + "county": "Ascension" + }, + { + "zip_code": 70352, + "latitude": 29.696385, + "longitude": -90.944418, + "city": "Donner", + "state": "LA", + "county": "Terrebonne" + }, + { + "zip_code": 70353, + "latitude": 29.369707, + "longitude": -90.712335, + "city": "Dulac", + "state": "LA", + "county": "Terrebonne" + }, + { + "zip_code": 70354, + "latitude": 29.437009, + "longitude": -90.304724, + "city": "Galliano", + "state": "LA", + "county": "Lafourche" + }, + { + "zip_code": 70355, + "latitude": 29.64798, + "longitude": -90.48031, + "city": "Gheens", + "state": "LA", + "county": "Lafourche" + }, + { + "zip_code": 70356, + "latitude": 29.654609, + "longitude": -90.912489, + "city": "Gibson", + "state": "LA", + "county": "Terrebonne" + }, + { + "zip_code": 70357, + "latitude": 29.269324, + "longitude": -90.195917, + "city": "Golden Meadow", + "state": "LA", + "county": "Lafourche" + }, + { + "zip_code": 70358, + "latitude": 29.227559, + "longitude": -90.018901, + "city": "Grand Isle", + "state": "LA", + "county": "Jefferson" + }, + { + "zip_code": 70359, + "latitude": 29.6936, + "longitude": -90.770768, + "city": "Gray", + "state": "LA", + "county": "Terrebonne" + }, + { + "zip_code": 70360, + "latitude": 29.6421, + "longitude": -90.852551, + "city": "Houma", + "state": "LA", + "county": "Terrebonne" + }, + { + "zip_code": 70361, + "latitude": 29.382117, + "longitude": -90.865568, + "city": "Houma", + "state": "LA", + "county": "Terrebonne" + }, + { + "zip_code": 70363, + "latitude": 29.561855, + "longitude": -90.752351, + "city": "Houma", + "state": "LA", + "county": "Terrebonne" + }, + { + "zip_code": 70364, + "latitude": 29.597188, + "longitude": -90.732776, + "city": "Houma", + "state": "LA", + "county": "Terrebonne" + }, + { + "zip_code": 70371, + "latitude": 29.865202, + "longitude": -90.596159, + "city": "Kraemer", + "state": "LA", + "county": "Lafourche" + }, + { + "zip_code": 70372, + "latitude": 29.917298, + "longitude": -90.985769, + "city": "Labadieville", + "state": "LA", + "county": "Assumption" + }, + { + "zip_code": 70373, + "latitude": 29.520061, + "longitude": -90.347406, + "city": "Larose", + "state": "LA", + "county": "Lafourche" + }, + { + "zip_code": 70374, + "latitude": 29.533839, + "longitude": -90.409864, + "city": "Lockport", + "state": "LA", + "county": "Lafourche" + }, + { + "zip_code": 70375, + "latitude": 29.693833, + "longitude": -90.549555, + "city": "Mathews", + "state": "LA", + "county": "Lafourche" + }, + { + "zip_code": 70376, + "latitude": 30.204707, + "longitude": -90.869481, + "city": "Modeste", + "state": "LA", + "county": "Ascension" + }, + { + "zip_code": 70377, + "latitude": 29.456248, + "longitude": -90.524964, + "city": "Montegut", + "state": "LA", + "county": "Terrebonne" + }, + { + "zip_code": 70380, + "latitude": 29.697653, + "longitude": -91.265374, + "city": "Morgan City", + "state": "LA", + "county": "Saint Mary" + }, + { + "zip_code": 70381, + "latitude": 29.694629, + "longitude": -91.259347, + "city": "Morgan City", + "state": "LA", + "county": "Saint Mary" + }, + { + "zip_code": 70390, + "latitude": 29.908353, + "longitude": -91.064291, + "city": "Napoleonville", + "state": "LA", + "county": "Assumption" + }, + { + "zip_code": 70391, + "latitude": 29.994968, + "longitude": -91.063485, + "city": "Paincourtville", + "state": "LA", + "county": "Assumption" + }, + { + "zip_code": 70392, + "latitude": 29.751746, + "longitude": -91.383904, + "city": "Patterson", + "state": "LA", + "county": "Saint Mary" + }, + { + "zip_code": 70393, + "latitude": 29.9974, + "longitude": -91.023196, + "city": "Plattenville", + "state": "LA", + "county": "Assumption" + }, + { + "zip_code": 70394, + "latitude": 29.683764, + "longitude": -90.627822, + "city": "Raceland", + "state": "LA", + "county": "Lafourche" + }, + { + "zip_code": 70395, + "latitude": 29.691176, + "longitude": -90.863923, + "city": "Schriever", + "state": "LA", + "county": "Terrebonne" + }, + { + "zip_code": 70397, + "latitude": 29.396246, + "longitude": -90.78627, + "city": "Theriot", + "state": "LA", + "county": "Terrebonne" + }, + { + "zip_code": 70401, + "latitude": 30.549037, + "longitude": -90.464466, + "city": "Hammond", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70402, + "latitude": 30.513982, + "longitude": -90.480403, + "city": "Hammond", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70403, + "latitude": 30.529506, + "longitude": -90.465499, + "city": "Hammond", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70404, + "latitude": 30.505061, + "longitude": -90.422504, + "city": "Hammond", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70420, + "latitude": 30.477483, + "longitude": -89.955328, + "city": "Abita Springs", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70421, + "latitude": 30.612371, + "longitude": -90.405312, + "city": "Akers", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70422, + "latitude": 30.74483, + "longitude": -90.41058, + "city": "Amite", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70426, + "latitude": 30.915579, + "longitude": -89.882844, + "city": "Angie", + "state": "LA", + "county": "Washington" + }, + { + "zip_code": 70427, + "latitude": 30.791723, + "longitude": -90.044253, + "city": "Bogalusa", + "state": "LA", + "county": "Washington" + }, + { + "zip_code": 70429, + "latitude": 30.83503, + "longitude": -90.037115, + "city": "Bogalusa", + "state": "LA", + "county": "Washington" + }, + { + "zip_code": 70431, + "latitude": 30.549629, + "longitude": -90.030882, + "city": "Bush", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70433, + "latitude": 30.435893, + "longitude": -90.011991, + "city": "Covington", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70434, + "latitude": 30.492753, + "longitude": -90.125666, + "city": "Covington", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70435, + "latitude": 30.566088, + "longitude": -90.109823, + "city": "Covington", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70436, + "latitude": 30.819086, + "longitude": -90.532641, + "city": "Fluker", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70437, + "latitude": 30.593426, + "longitude": -90.144908, + "city": "Folsom", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70438, + "latitude": 30.840587, + "longitude": -90.120807, + "city": "Franklinton", + "state": "LA", + "county": "Washington" + }, + { + "zip_code": 70441, + "latitude": 30.657123, + "longitude": -90.651536, + "city": "Greensburg", + "state": "LA", + "county": "Saint Helena" + }, + { + "zip_code": 70442, + "latitude": 30.655912, + "longitude": -90.438581, + "city": "Husser", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70443, + "latitude": 30.651594, + "longitude": -90.491168, + "city": "Independence", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70444, + "latitude": 30.814466, + "longitude": -90.428043, + "city": "Kentwood", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70445, + "latitude": 30.386606, + "longitude": -89.900397, + "city": "Lacombe", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70446, + "latitude": 30.635647, + "longitude": -90.361759, + "city": "Loranger", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70447, + "latitude": 30.389107, + "longitude": -90.001553, + "city": "Madisonville", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70448, + "latitude": 30.37706, + "longitude": -89.977719, + "city": "Mandeville", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70449, + "latitude": 30.342352, + "longitude": -90.685853, + "city": "Maurepas", + "state": "LA", + "county": "Livingston" + }, + { + "zip_code": 70450, + "latitude": 30.91821, + "longitude": -90.043651, + "city": "Mount Hermon", + "state": "LA", + "county": "Washington" + }, + { + "zip_code": 70451, + "latitude": 30.531157, + "longitude": -90.475981, + "city": "Natalbany", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70452, + "latitude": 30.423603, + "longitude": -89.921823, + "city": "Pearl River", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70453, + "latitude": 30.676164, + "longitude": -90.80277, + "city": "Pine Grove", + "state": "LA", + "county": "Saint Helena" + }, + { + "zip_code": 70454, + "latitude": 30.467958, + "longitude": -90.393867, + "city": "Ponchatoula", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70455, + "latitude": 30.533384, + "longitude": -90.300373, + "city": "Robert", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70456, + "latitude": 30.654562, + "longitude": -90.501975, + "city": "Roseland", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70457, + "latitude": 30.42551, + "longitude": -89.881256, + "city": "Saint Benedict", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70458, + "latitude": 30.446993, + "longitude": -89.976592, + "city": "Slidell", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70459, + "latitude": 30.42551, + "longitude": -89.881256, + "city": "Slidell", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70460, + "latitude": 30.379561, + "longitude": -89.90975, + "city": "Slidell", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70461, + "latitude": 30.24974, + "longitude": -89.712618, + "city": "Slidell", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70462, + "latitude": 30.387413, + "longitude": -90.588723, + "city": "Springfield", + "state": "LA", + "county": "Livingston" + }, + { + "zip_code": 70463, + "latitude": 30.653805, + "longitude": -89.895502, + "city": "Sun", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70464, + "latitude": 30.534697, + "longitude": -89.885927, + "city": "Talisheek", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70465, + "latitude": 30.863873, + "longitude": -90.51295, + "city": "Tangipahoa", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70466, + "latitude": 30.572825, + "longitude": -90.439399, + "city": "Tickfaw", + "state": "LA", + "county": "Tangipahoa" + }, + { + "zip_code": 70467, + "latitude": 30.90169, + "longitude": -89.820725, + "city": "Angie", + "state": "LA", + "county": "Washington" + }, + { + "zip_code": 70469, + "latitude": 30.42551, + "longitude": -89.881256, + "city": "Slidell", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70470, + "latitude": 30.42551, + "longitude": -89.881256, + "city": "Mandeville", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70471, + "latitude": 30.343159, + "longitude": -89.975815, + "city": "Mandeville", + "state": "LA", + "county": "Saint Tammany" + }, + { + "zip_code": 70501, + "latitude": 30.232955, + "longitude": -92.066574, + "city": "Lafayette", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70502, + "latitude": 30.319799, + "longitude": -92.026969, + "city": "Lafayette", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70503, + "latitude": 30.202892, + "longitude": -92.059521, + "city": "Lafayette", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70504, + "latitude": 30.21385, + "longitude": -92.01866, + "city": "Lafayette", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70505, + "latitude": 30.202251, + "longitude": -92.01877, + "city": "Lafayette", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70506, + "latitude": 30.176093, + "longitude": -92.066315, + "city": "Lafayette", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70507, + "latitude": 30.2528, + "longitude": -92.038679, + "city": "Lafayette", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70508, + "latitude": 30.181866, + "longitude": -92.026859, + "city": "Lafayette", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70509, + "latitude": 30.156506, + "longitude": -92.000019, + "city": "Lafayette", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70510, + "latitude": 29.946603, + "longitude": -92.241595, + "city": "Abbeville", + "state": "LA", + "county": "Vermilion" + }, + { + "zip_code": 70511, + "latitude": 30.032434, + "longitude": -92.176655, + "city": "Abbeville", + "state": "LA", + "county": "Vermilion" + }, + { + "zip_code": 70512, + "latitude": 30.474902, + "longitude": -91.967292, + "city": "Arnaudville", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 70513, + "latitude": 30.045066, + "longitude": -91.878675, + "city": "Avery Island", + "state": "LA", + "county": "Iberia" + }, + { + "zip_code": 70514, + "latitude": 29.846077, + "longitude": -91.545263, + "city": "Baldwin", + "state": "LA", + "county": "Saint Mary" + }, + { + "zip_code": 70515, + "latitude": 30.67837, + "longitude": -92.519207, + "city": "Basile", + "state": "LA", + "county": "Evangeline" + }, + { + "zip_code": 70516, + "latitude": 30.344615, + "longitude": -92.345888, + "city": "Branch", + "state": "LA", + "county": "Acadia" + }, + { + "zip_code": 70517, + "latitude": 30.240316, + "longitude": -91.828827, + "city": "Breaux Bridge", + "state": "LA", + "county": "Saint Martin" + }, + { + "zip_code": 70518, + "latitude": 30.1606, + "longitude": -91.963869, + "city": "Broussard", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70519, + "latitude": 30.079692, + "longitude": -91.911387, + "city": "Cade", + "state": "LA", + "county": "Saint Martin" + }, + { + "zip_code": 70520, + "latitude": 30.238176, + "longitude": -92.047919, + "city": "Carencro", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70521, + "latitude": 30.344923, + "longitude": -91.854758, + "city": "Cecilia", + "state": "LA", + "county": "Saint Martin" + }, + { + "zip_code": 70522, + "latitude": 29.75226, + "longitude": -91.439679, + "city": "Centerville", + "state": "LA", + "county": "Saint Mary" + }, + { + "zip_code": 70523, + "latitude": 29.867131, + "longitude": -91.539372, + "city": "Charenton", + "state": "LA", + "county": "Saint Mary" + }, + { + "zip_code": 70524, + "latitude": 30.575361, + "longitude": -92.287372, + "city": "Chataignier", + "state": "LA", + "county": "Evangeline" + }, + { + "zip_code": 70525, + "latitude": 30.382556, + "longitude": -92.318696, + "city": "Church Point", + "state": "LA", + "county": "Acadia" + }, + { + "zip_code": 70526, + "latitude": 30.228294, + "longitude": -92.438484, + "city": "Crowley", + "state": "LA", + "county": "Acadia" + }, + { + "zip_code": 70527, + "latitude": 30.228409, + "longitude": -92.301795, + "city": "Crowley", + "state": "LA", + "county": "Acadia" + }, + { + "zip_code": 70528, + "latitude": 29.984693, + "longitude": -91.987226, + "city": "Delcambre", + "state": "LA", + "county": "Vermilion" + }, + { + "zip_code": 70529, + "latitude": 30.187978, + "longitude": -92.168953, + "city": "Duson", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70531, + "latitude": 30.256951, + "longitude": -92.486465, + "city": "Egan", + "state": "LA", + "county": "Acadia" + }, + { + "zip_code": 70532, + "latitude": 30.426249, + "longitude": -92.71368, + "city": "Elton", + "state": "LA", + "county": "Jefferson Davis" + }, + { + "zip_code": 70533, + "latitude": 29.947394, + "longitude": -92.045277, + "city": "Erath", + "state": "LA", + "county": "Vermilion" + }, + { + "zip_code": 70534, + "latitude": 30.184157, + "longitude": -92.447152, + "city": "Estherwood", + "state": "LA", + "county": "Acadia" + }, + { + "zip_code": 70535, + "latitude": 30.507236, + "longitude": -92.210855, + "city": "Eunice", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 70537, + "latitude": 30.203238, + "longitude": -92.471305, + "city": "Evangeline", + "state": "LA", + "county": "Acadia" + }, + { + "zip_code": 70538, + "latitude": 29.720652, + "longitude": -91.540902, + "city": "Franklin", + "state": "LA", + "county": "Saint Mary" + }, + { + "zip_code": 70540, + "latitude": 29.76327, + "longitude": -91.466962, + "city": "Garden City", + "state": "LA", + "county": "Saint Mary" + }, + { + "zip_code": 70541, + "latitude": 30.417402, + "longitude": -92.031178, + "city": "Grand Coteau", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 70542, + "latitude": 30.010373, + "longitude": -92.560894, + "city": "Gueydan", + "state": "LA", + "county": "Vermilion" + }, + { + "zip_code": 70543, + "latitude": 30.299682, + "longitude": -92.469182, + "city": "Iota", + "state": "LA", + "county": "Acadia" + }, + { + "zip_code": 70544, + "latitude": 29.936497, + "longitude": -91.724248, + "city": "Jeanerette", + "state": "LA", + "county": "Iberia" + }, + { + "zip_code": 70546, + "latitude": 30.259096, + "longitude": -92.69411, + "city": "Jennings", + "state": "LA", + "county": "Jefferson Davis" + }, + { + "zip_code": 70548, + "latitude": 29.875194, + "longitude": -92.315721, + "city": "Kaplan", + "state": "LA", + "county": "Vermilion" + }, + { + "zip_code": 70549, + "latitude": 30.260341, + "longitude": -92.781945, + "city": "Lake Arthur", + "state": "LA", + "county": "Jefferson Davis" + }, + { + "zip_code": 70550, + "latitude": 30.543842, + "longitude": -92.160849, + "city": "Lawtell", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 70551, + "latitude": 30.475194, + "longitude": -91.973736, + "city": "Leonville", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 70552, + "latitude": 30.052016, + "longitude": -91.683294, + "city": "Loreauville", + "state": "LA", + "county": "Iberia" + }, + { + "zip_code": 70554, + "latitude": 30.714716, + "longitude": -92.425103, + "city": "Mamou", + "state": "LA", + "county": "Evangeline" + }, + { + "zip_code": 70555, + "latitude": 30.074655, + "longitude": -92.147849, + "city": "Maurice", + "state": "LA", + "county": "Vermilion" + }, + { + "zip_code": 70556, + "latitude": 30.186145, + "longitude": -92.572176, + "city": "Mermentau", + "state": "LA", + "county": "Acadia" + }, + { + "zip_code": 70558, + "latitude": 30.098819, + "longitude": -92.064797, + "city": "Milton", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70559, + "latitude": 30.129756, + "longitude": -92.476684, + "city": "Morse", + "state": "LA", + "county": "Acadia" + }, + { + "zip_code": 70560, + "latitude": 29.949527, + "longitude": -91.832747, + "city": "New Iberia", + "state": "LA", + "county": "Iberia" + }, + { + "zip_code": 70562, + "latitude": 29.739932, + "longitude": -91.6331, + "city": "New Iberia", + "state": "LA", + "county": "Iberia" + }, + { + "zip_code": 70563, + "latitude": 30.024515, + "longitude": -91.749604, + "city": "New Iberia", + "state": "LA", + "county": "Iberia" + }, + { + "zip_code": 70569, + "latitude": 29.909643, + "longitude": -91.812552, + "city": "Lydia", + "state": "LA", + "county": "Iberia" + }, + { + "zip_code": 70570, + "latitude": 30.529765, + "longitude": -92.00983, + "city": "Opelousas", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 70571, + "latitude": 30.57445, + "longitude": -92.086077, + "city": "Opelousas", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 70575, + "latitude": 29.866543, + "longitude": -92.158982, + "city": "Perry", + "state": "LA", + "county": "Vermilion" + }, + { + "zip_code": 70576, + "latitude": 30.756671, + "longitude": -92.411722, + "city": "Pine Prairie", + "state": "LA", + "county": "Evangeline" + }, + { + "zip_code": 70577, + "latitude": 30.544276, + "longitude": -91.918924, + "city": "Port Barre", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 70578, + "latitude": 30.256405, + "longitude": -92.261328, + "city": "Rayne", + "state": "LA", + "county": "Acadia" + }, + { + "zip_code": 70580, + "latitude": 30.700768, + "longitude": -92.421915, + "city": "Reddell", + "state": "LA", + "county": "Evangeline" + }, + { + "zip_code": 70581, + "latitude": 30.246362, + "longitude": -92.742134, + "city": "Roanoke", + "state": "LA", + "county": "Jefferson Davis" + }, + { + "zip_code": 70582, + "latitude": 30.223672, + "longitude": -91.779374, + "city": "Saint Martinville", + "state": "LA", + "county": "Saint Martin" + }, + { + "zip_code": 70583, + "latitude": 30.273, + "longitude": -92.100669, + "city": "Scott", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70584, + "latitude": 30.471399, + "longitude": -92.065702, + "city": "Sunset", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 70585, + "latitude": 30.901424, + "longitude": -92.430522, + "city": "Turkey Creek", + "state": "LA", + "county": "Evangeline" + }, + { + "zip_code": 70586, + "latitude": 30.724974, + "longitude": -92.386968, + "city": "Ville Platte", + "state": "LA", + "county": "Evangeline" + }, + { + "zip_code": 70589, + "latitude": 30.694115, + "longitude": -92.048517, + "city": "Washington", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 70591, + "latitude": 30.294276, + "longitude": -92.833656, + "city": "Welsh", + "state": "LA", + "county": "Jefferson Davis" + }, + { + "zip_code": 70592, + "latitude": 30.14033, + "longitude": -92.022573, + "city": "Youngsville", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70593, + "latitude": 30.20812, + "longitude": -92.095109, + "city": "Lafayette", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70596, + "latitude": 30.20812, + "longitude": -92.095109, + "city": "Lafayette", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70598, + "latitude": 30.20812, + "longitude": -92.095109, + "city": "Lafayette", + "state": "LA", + "county": "Lafayette" + }, + { + "zip_code": 70601, + "latitude": 30.233355, + "longitude": -93.214903, + "city": "Lake Charles", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70602, + "latitude": 30.264232, + "longitude": -93.326527, + "city": "Lake Charles", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70605, + "latitude": 30.130378, + "longitude": -93.245056, + "city": "Lake Charles", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70606, + "latitude": 30.264232, + "longitude": -93.326527, + "city": "Lake Charles", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70607, + "latitude": 30.124378, + "longitude": -93.183478, + "city": "Lake Charles", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70609, + "latitude": 30.264232, + "longitude": -93.326527, + "city": "Lake Charles", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70611, + "latitude": 30.335834, + "longitude": -93.204847, + "city": "Lake Charles", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70612, + "latitude": 30.264232, + "longitude": -93.326527, + "city": "Lake Charles", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70615, + "latitude": 30.258498, + "longitude": -93.114623, + "city": "Lake Charles", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70616, + "latitude": 30.264232, + "longitude": -93.326527, + "city": "Lake Charles", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70629, + "latitude": 30.264232, + "longitude": -93.326527, + "city": "Lake Charles", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70630, + "latitude": 30.105386, + "longitude": -93.037173, + "city": "Bell City", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70631, + "latitude": 29.791099, + "longitude": -93.437979, + "city": "Cameron", + "state": "LA", + "county": "Cameron" + }, + { + "zip_code": 70632, + "latitude": 29.807493, + "longitude": -93.051554, + "city": "Creole", + "state": "LA", + "county": "Cameron" + }, + { + "zip_code": 70633, + "latitude": 30.358944, + "longitude": -93.268731, + "city": "Dequincy", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70634, + "latitude": 30.651656, + "longitude": -93.299574, + "city": "Deridder", + "state": "LA", + "county": "Beauregard" + }, + { + "zip_code": 70637, + "latitude": 30.743467, + "longitude": -93.020236, + "city": "Dry Creek", + "state": "LA", + "county": "Beauregard" + }, + { + "zip_code": 70638, + "latitude": 30.818176, + "longitude": -92.758262, + "city": "Elizabeth", + "state": "LA", + "county": "Allen" + }, + { + "zip_code": 70639, + "latitude": 30.96842, + "longitude": -93.520348, + "city": "Evans", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 70640, + "latitude": 30.35502, + "longitude": -92.946269, + "city": "Fenton", + "state": "LA", + "county": "Jefferson Davis" + }, + { + "zip_code": 70642, + "latitude": 31.111979, + "longitude": -93.200936, + "city": "Fullerton", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 70643, + "latitude": 29.764417, + "longitude": -92.926076, + "city": "Grand Chenier", + "state": "LA", + "county": "Cameron" + }, + { + "zip_code": 70644, + "latitude": 30.770681, + "longitude": -92.933723, + "city": "Grant", + "state": "LA", + "county": "Allen" + }, + { + "zip_code": 70645, + "latitude": 29.897443, + "longitude": -93.368241, + "city": "Hackberry", + "state": "LA", + "county": "Cameron" + }, + { + "zip_code": 70646, + "latitude": 30.11138, + "longitude": -92.945098, + "city": "Hayes", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70647, + "latitude": 30.239624, + "longitude": -93.033305, + "city": "Iowa", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70648, + "latitude": 30.578402, + "longitude": -92.928777, + "city": "Kinder", + "state": "LA", + "county": "Allen" + }, + { + "zip_code": 70650, + "latitude": 30.261021, + "longitude": -92.877409, + "city": "Lacassine", + "state": "LA", + "county": "Jefferson Davis" + }, + { + "zip_code": 70651, + "latitude": 30.512276, + "longitude": -92.980987, + "city": "Leblanc", + "state": "LA", + "county": "Allen" + }, + { + "zip_code": 70652, + "latitude": 30.585628, + "longitude": -93.223551, + "city": "Longville", + "state": "LA", + "county": "Beauregard" + }, + { + "zip_code": 70653, + "latitude": 30.682899, + "longitude": -93.441983, + "city": "Merryville", + "state": "LA", + "county": "Beauregard" + }, + { + "zip_code": 70654, + "latitude": 30.703476, + "longitude": -92.906757, + "city": "Mittie", + "state": "LA", + "county": "Allen" + }, + { + "zip_code": 70655, + "latitude": 30.644704, + "longitude": -92.763802, + "city": "Oberlin", + "state": "LA", + "county": "Allen" + }, + { + "zip_code": 70656, + "latitude": 30.987139, + "longitude": -93.046679, + "city": "Pitkin", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 70657, + "latitude": 30.528185, + "longitude": -93.148903, + "city": "Ragley", + "state": "LA", + "county": "Beauregard" + }, + { + "zip_code": 70658, + "latitude": 30.511148, + "longitude": -93.036823, + "city": "Reeves", + "state": "LA", + "county": "Allen" + }, + { + "zip_code": 70659, + "latitude": 30.923606, + "longitude": -93.195312, + "city": "Rosepine", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 70660, + "latitude": 30.593966, + "longitude": -93.369139, + "city": "Singer", + "state": "LA", + "county": "Beauregard" + }, + { + "zip_code": 70661, + "latitude": 30.312173, + "longitude": -93.643003, + "city": "Starks", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70662, + "latitude": 30.803752, + "longitude": -93.010616, + "city": "Sugartown", + "state": "LA", + "county": "Beauregard" + }, + { + "zip_code": 70663, + "latitude": 30.300185, + "longitude": -93.435063, + "city": "Sulphur", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70664, + "latitude": 30.264232, + "longitude": -93.326527, + "city": "Sulphur", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70665, + "latitude": 30.200948, + "longitude": -93.443701, + "city": "Sulphur", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70668, + "latitude": 30.208206, + "longitude": -93.583787, + "city": "Vinton", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70669, + "latitude": 30.240705, + "longitude": -93.275454, + "city": "Westlake", + "state": "LA", + "county": "Calcasieu" + }, + { + "zip_code": 70704, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baker", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70706, + "latitude": 30.570887, + "longitude": -90.877022, + "city": "Denham Springs", + "state": "LA", + "county": "Livingston" + }, + { + "zip_code": 70707, + "latitude": 30.204707, + "longitude": -90.869481, + "city": "Gonzales", + "state": "LA", + "county": "Ascension" + }, + { + "zip_code": 70710, + "latitude": 30.362992, + "longitude": -91.263088, + "city": "Addis", + "state": "LA", + "county": "West Baton Rouge" + }, + { + "zip_code": 70711, + "latitude": 30.527008, + "longitude": -90.742229, + "city": "Albany", + "state": "LA", + "county": "Livingston" + }, + { + "zip_code": 70712, + "latitude": 30.97337, + "longitude": -91.538682, + "city": "Angola", + "state": "LA", + "county": "West Feliciana" + }, + { + "zip_code": 70714, + "latitude": 30.578637, + "longitude": -91.126275, + "city": "Baker", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70715, + "latitude": 30.829754, + "longitude": -91.694354, + "city": "Batchelor", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70716, + "latitude": 30.261384, + "longitude": -91.36026, + "city": "Bayou Goula", + "state": "LA", + "county": "Iberville" + }, + { + "zip_code": 70717, + "latitude": 30.566266, + "longitude": -91.58857, + "city": "Blanks", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70718, + "latitude": 30.201004, + "longitude": -90.868876, + "city": "Brittany", + "state": "LA", + "county": "Ascension" + }, + { + "zip_code": 70719, + "latitude": 30.390091, + "longitude": -91.273501, + "city": "Brusly", + "state": "LA", + "county": "West Baton Rouge" + }, + { + "zip_code": 70720, + "latitude": 30.596789, + "longitude": -91.339546, + "city": "Bueche", + "state": "LA", + "county": "West Baton Rouge" + }, + { + "zip_code": 70721, + "latitude": 30.232366, + "longitude": -91.104709, + "city": "Carville", + "state": "LA", + "county": "Iberville" + }, + { + "zip_code": 70722, + "latitude": 30.842734, + "longitude": -90.960294, + "city": "Clinton", + "state": "LA", + "county": "East Feliciana" + }, + { + "zip_code": 70723, + "latitude": 30.051774, + "longitude": -90.858531, + "city": "Convent", + "state": "LA", + "county": "Saint James" + }, + { + "zip_code": 70725, + "latitude": 30.134188, + "longitude": -90.963042, + "city": "Darrow", + "state": "LA", + "county": "Ascension" + }, + { + "zip_code": 70726, + "latitude": 30.459026, + "longitude": -90.902723, + "city": "Denham Springs", + "state": "LA", + "county": "Livingston" + }, + { + "zip_code": 70727, + "latitude": 30.337495, + "longitude": -90.843449, + "city": "Denham Springs", + "state": "LA", + "county": "Livingston" + }, + { + "zip_code": 70728, + "latitude": 30.295446, + "longitude": -90.945836, + "city": "Duplessis", + "state": "LA", + "county": "Ascension" + }, + { + "zip_code": 70729, + "latitude": 30.551335, + "longitude": -91.394396, + "city": "Erwinville", + "state": "LA", + "county": "West Baton Rouge" + }, + { + "zip_code": 70730, + "latitude": 30.828705, + "longitude": -91.124098, + "city": "Ethel", + "state": "LA", + "county": "East Feliciana" + }, + { + "zip_code": 70732, + "latitude": 30.657644, + "longitude": -91.626406, + "city": "Fordoche", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70733, + "latitude": 30.30657, + "longitude": -90.779704, + "city": "French Settlement", + "state": "LA", + "county": "Livingston" + }, + { + "zip_code": 70734, + "latitude": 30.205118, + "longitude": -90.992636, + "city": "Geismar", + "state": "LA", + "county": "Ascension" + }, + { + "zip_code": 70736, + "latitude": 30.643098, + "longitude": -91.32916, + "city": "Glynn", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70737, + "latitude": 30.219419, + "longitude": -90.9248, + "city": "Gonzales", + "state": "LA", + "county": "Ascension" + }, + { + "zip_code": 70738, + "latitude": 30.204707, + "longitude": -90.869481, + "city": "Burnside", + "state": "LA", + "county": "Ascension" + }, + { + "zip_code": 70739, + "latitude": 30.574145, + "longitude": -90.963516, + "city": "Greenwell Springs", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70740, + "latitude": 30.371497, + "longitude": -91.412678, + "city": "Grosse Tete", + "state": "LA", + "county": "Iberville" + }, + { + "zip_code": 70743, + "latitude": 30.020595, + "longitude": -90.781355, + "city": "Hester", + "state": "LA", + "county": "Saint James" + }, + { + "zip_code": 70744, + "latitude": 30.507099, + "longitude": -90.696724, + "city": "Holden", + "state": "LA", + "county": "Livingston" + }, + { + "zip_code": 70747, + "latitude": 30.902018, + "longitude": -91.71085, + "city": "Innis", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70748, + "latitude": 30.808675, + "longitude": -91.198736, + "city": "Jackson", + "state": "LA", + "county": "East Feliciana" + }, + { + "zip_code": 70749, + "latitude": 30.630136, + "longitude": -91.411031, + "city": "Jarreau", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70750, + "latitude": 30.525441, + "longitude": -91.907178, + "city": "Krotz Springs", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 70751, + "latitude": 30.7513, + "longitude": -91.566273, + "city": "Labarre", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70752, + "latitude": 30.575993, + "longitude": -91.446813, + "city": "Lakeland", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70753, + "latitude": 30.936504, + "longitude": -91.73539, + "city": "Lettsworth", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70754, + "latitude": 30.407207, + "longitude": -90.743125, + "city": "Livingston", + "state": "LA", + "county": "Livingston" + }, + { + "zip_code": 70755, + "latitude": 30.574555, + "longitude": -91.548373, + "city": "Livonia", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70756, + "latitude": 30.572542, + "longitude": -91.628222, + "city": "Lottie", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70757, + "latitude": 30.435891, + "longitude": -91.490655, + "city": "Maringouin", + "state": "LA", + "county": "Iberville" + }, + { + "zip_code": 70759, + "latitude": 30.778438, + "longitude": -91.651669, + "city": "Morganza", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70760, + "latitude": 30.687199, + "longitude": -91.500474, + "city": "New Roads", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70761, + "latitude": 30.959067, + "longitude": -91.024752, + "city": "Norwood", + "state": "LA", + "county": "East Feliciana" + }, + { + "zip_code": 70762, + "latitude": 30.616102, + "longitude": -91.456649, + "city": "Oscar", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70763, + "latitude": 30.041815, + "longitude": -90.743705, + "city": "Paulina", + "state": "LA", + "county": "Saint James" + }, + { + "zip_code": 70764, + "latitude": 30.215233, + "longitude": -91.267904, + "city": "Plaquemine", + "state": "LA", + "county": "Iberville" + }, + { + "zip_code": 70765, + "latitude": 30.261384, + "longitude": -91.36026, + "city": "Plaquemine", + "state": "LA", + "county": "Iberville" + }, + { + "zip_code": 70767, + "latitude": 30.494882, + "longitude": -91.309262, + "city": "Port Allen", + "state": "LA", + "county": "West Baton Rouge" + }, + { + "zip_code": 70769, + "latitude": 30.287275, + "longitude": -90.926014, + "city": "Prairieville", + "state": "LA", + "county": "Ascension" + }, + { + "zip_code": 70770, + "latitude": 30.646585, + "longitude": -90.974252, + "city": "Pride", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70772, + "latitude": 30.435586, + "longitude": -91.466482, + "city": "Rosedale", + "state": "LA", + "county": "Iberville" + }, + { + "zip_code": 70773, + "latitude": 30.602606, + "longitude": -91.415059, + "city": "Rougon", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70774, + "latitude": 30.236364, + "longitude": -90.827056, + "city": "Saint Amant", + "state": "LA", + "county": "Ascension" + }, + { + "zip_code": 70775, + "latitude": 30.869398, + "longitude": -91.418642, + "city": "Saint Francisville", + "state": "LA", + "county": "West Feliciana" + }, + { + "zip_code": 70776, + "latitude": 30.25279, + "longitude": -91.085716, + "city": "Saint Gabriel", + "state": "LA", + "county": "Iberville" + }, + { + "zip_code": 70777, + "latitude": 30.75711, + "longitude": -91.07376, + "city": "Slaughter", + "state": "LA", + "county": "East Feliciana" + }, + { + "zip_code": 70778, + "latitude": 30.186506, + "longitude": -90.880484, + "city": "Sorrento", + "state": "LA", + "county": "Ascension" + }, + { + "zip_code": 70780, + "latitude": 30.295921, + "longitude": -91.166024, + "city": "Sunshine", + "state": "LA", + "county": "Iberville" + }, + { + "zip_code": 70781, + "latitude": 30.561711, + "longitude": -91.487668, + "city": "Torbert", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70782, + "latitude": 30.969401, + "longitude": -91.518541, + "city": "Tunica", + "state": "LA", + "county": "West Feliciana" + }, + { + "zip_code": 70783, + "latitude": 30.689213, + "longitude": -91.476768, + "city": "Ventress", + "state": "LA", + "county": "Pointe Coupee" + }, + { + "zip_code": 70784, + "latitude": 30.917453, + "longitude": -91.358149, + "city": "Wakefield", + "state": "LA", + "county": "West Feliciana" + }, + { + "zip_code": 70785, + "latitude": 30.549316, + "longitude": -90.836232, + "city": "Walker", + "state": "LA", + "county": "Livingston" + }, + { + "zip_code": 70786, + "latitude": 30.550219, + "longitude": -90.958219, + "city": "Watson", + "state": "LA", + "county": "Livingston" + }, + { + "zip_code": 70787, + "latitude": 30.936227, + "longitude": -91.456167, + "city": "Weyanoke", + "state": "LA", + "county": "West Feliciana" + }, + { + "zip_code": 70788, + "latitude": 30.15929, + "longitude": -91.146472, + "city": "White Castle", + "state": "LA", + "county": "Iberville" + }, + { + "zip_code": 70789, + "latitude": 30.914247, + "longitude": -91.098267, + "city": "Wilson", + "state": "LA", + "county": "East Feliciana" + }, + { + "zip_code": 70791, + "latitude": 30.641035, + "longitude": -91.129053, + "city": "Zachary", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70792, + "latitude": 30.027914, + "longitude": -90.802759, + "city": "Uncle Sam", + "state": "LA", + "county": "Saint James" + }, + { + "zip_code": 70801, + "latitude": 30.44924, + "longitude": -91.185607, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70802, + "latitude": 30.44304, + "longitude": -91.155956, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70803, + "latitude": 30.405002, + "longitude": -91.186834, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70804, + "latitude": 30.386267, + "longitude": -91.133905, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70805, + "latitude": 30.473889, + "longitude": -91.104954, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70806, + "latitude": 30.45104, + "longitude": -91.138455, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70807, + "latitude": 30.50791, + "longitude": -91.183243, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70808, + "latitude": 30.408291, + "longitude": -91.143906, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70809, + "latitude": 30.429365, + "longitude": -91.077942, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70810, + "latitude": 30.355342, + "longitude": -91.072118, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70811, + "latitude": 30.555687, + "longitude": -91.152456, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70812, + "latitude": 30.499538, + "longitude": -91.110905, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70813, + "latitude": 30.520111, + "longitude": -91.194863, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70814, + "latitude": 30.488289, + "longitude": -91.072704, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70815, + "latitude": 30.45304, + "longitude": -91.068254, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70816, + "latitude": 30.42949, + "longitude": -91.023502, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70817, + "latitude": 30.384123, + "longitude": -90.972423, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70818, + "latitude": 30.4731, + "longitude": -91.037528, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70819, + "latitude": 30.467539, + "longitude": -91.012194, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70820, + "latitude": 30.373042, + "longitude": -91.176156, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70821, + "latitude": 30.461252, + "longitude": -91.044723, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70822, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70823, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70825, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70826, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70827, + "latitude": 30.433837, + "longitude": -91.082468, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70831, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70833, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70835, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70836, + "latitude": 30.391991, + "longitude": -91.089154, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70837, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70874, + "latitude": 30.590238, + "longitude": -91.2054, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70879, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70883, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70884, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70892, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70893, + "latitude": 30.412991, + "longitude": -91.171456, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70894, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70895, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70896, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 70898, + "latitude": 30.51589, + "longitude": -91.080373, + "city": "Baton Rouge", + "state": "LA", + "county": "East Baton Rouge" + }, + { + "zip_code": 71001, + "latitude": 32.376273, + "longitude": -92.970592, + "city": "Arcadia", + "state": "LA", + "county": "Bienville" + }, + { + "zip_code": 71002, + "latitude": 32.137843, + "longitude": -93.090606, + "city": "Ashland", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71003, + "latitude": 32.68552, + "longitude": -93.033603, + "city": "Athens", + "state": "LA", + "county": "Claiborne" + }, + { + "zip_code": 71004, + "latitude": 32.774283, + "longitude": -93.883624, + "city": "Belcher", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71006, + "latitude": 32.725032, + "longitude": -93.63759, + "city": "Benton", + "state": "LA", + "county": "Bossier" + }, + { + "zip_code": 71007, + "latitude": 32.339309, + "longitude": -94.004646, + "city": "Bethany", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71008, + "latitude": 32.355774, + "longitude": -92.996065, + "city": "Bienville", + "state": "LA", + "county": "Bienville" + }, + { + "zip_code": 71009, + "latitude": 32.632741, + "longitude": -93.896895, + "city": "Blanchard", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71016, + "latitude": 32.240987, + "longitude": -93.104385, + "city": "Castor", + "state": "LA", + "county": "Bienville" + }, + { + "zip_code": 71018, + "latitude": 32.801138, + "longitude": -93.407704, + "city": "Cotton Valley", + "state": "LA", + "county": "Webster" + }, + { + "zip_code": 71019, + "latitude": 32.023096, + "longitude": -93.264819, + "city": "Coushatta", + "state": "LA", + "county": "Red River" + }, + { + "zip_code": 71021, + "latitude": 32.934771, + "longitude": -93.448474, + "city": "Cullen", + "state": "LA", + "county": "Webster" + }, + { + "zip_code": 71023, + "latitude": 32.688512, + "longitude": -93.392015, + "city": "Doyline", + "state": "LA", + "county": "Webster" + }, + { + "zip_code": 71024, + "latitude": 32.687275, + "longitude": -93.308919, + "city": "Dubberly", + "state": "LA", + "county": "Webster" + }, + { + "zip_code": 71025, + "latitude": 32.062391, + "longitude": -93.367949, + "city": "East Point", + "state": "LA", + "county": "Red River" + }, + { + "zip_code": 71027, + "latitude": 32.172214, + "longitude": -93.790471, + "city": "Frierson", + "state": "LA", + "county": "De Soto" + }, + { + "zip_code": 71028, + "latitude": 32.475847, + "longitude": -93.047718, + "city": "Gibsland", + "state": "LA", + "county": "Bienville" + }, + { + "zip_code": 71029, + "latitude": 32.835482, + "longitude": -93.830134, + "city": "Gilliam", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71030, + "latitude": 32.111056, + "longitude": -93.842634, + "city": "Gloster", + "state": "LA", + "county": "De Soto" + }, + { + "zip_code": 71031, + "latitude": 31.953139, + "longitude": -92.945356, + "city": "Goldonna", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71032, + "latitude": 32.09591, + "longitude": -93.820738, + "city": "Grand Cane", + "state": "LA", + "county": "De Soto" + }, + { + "zip_code": 71033, + "latitude": 32.429968, + "longitude": -93.989086, + "city": "Greenwood", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71034, + "latitude": 32.062391, + "longitude": -93.367949, + "city": "Hall Summit", + "state": "LA", + "county": "Red River" + }, + { + "zip_code": 71036, + "latitude": 32.062391, + "longitude": -93.367949, + "city": "Harmon", + "state": "LA", + "county": "Red River" + }, + { + "zip_code": 71037, + "latitude": 32.585005, + "longitude": -93.533104, + "city": "Haughton", + "state": "LA", + "county": "Bossier" + }, + { + "zip_code": 71038, + "latitude": 32.833762, + "longitude": -93.033657, + "city": "Haynesville", + "state": "LA", + "county": "Claiborne" + }, + { + "zip_code": 71039, + "latitude": 32.474113, + "longitude": -93.288906, + "city": "Heflin", + "state": "LA", + "county": "Webster" + }, + { + "zip_code": 71040, + "latitude": 32.775361, + "longitude": -93.000406, + "city": "Homer", + "state": "LA", + "county": "Claiborne" + }, + { + "zip_code": 71043, + "latitude": 32.896272, + "longitude": -93.877571, + "city": "Hosston", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71044, + "latitude": 32.924377, + "longitude": -93.900321, + "city": "Ida", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71045, + "latitude": 32.415006, + "longitude": -93.078363, + "city": "Jamestown", + "state": "LA", + "county": "Bienville" + }, + { + "zip_code": 71046, + "latitude": 32.107786, + "longitude": -93.839512, + "city": "Keatchie", + "state": "LA", + "county": "De Soto" + }, + { + "zip_code": 71047, + "latitude": 32.388579, + "longitude": -93.90393, + "city": "Keithville", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71048, + "latitude": 32.818938, + "longitude": -92.866469, + "city": "Lisbon", + "state": "LA", + "county": "Claiborne" + }, + { + "zip_code": 71049, + "latitude": 32.046684, + "longitude": -93.865925, + "city": "Logansport", + "state": "LA", + "county": "De Soto" + }, + { + "zip_code": 71050, + "latitude": 32.117539, + "longitude": -93.913834, + "city": "Longstreet", + "state": "LA", + "county": "De Soto" + }, + { + "zip_code": 71051, + "latitude": 32.361547, + "longitude": -93.523207, + "city": "Elm Grove", + "state": "LA", + "county": "Bossier" + }, + { + "zip_code": 71052, + "latitude": 32.039947, + "longitude": -93.709777, + "city": "Mansfield", + "state": "LA", + "county": "De Soto" + }, + { + "zip_code": 71055, + "latitude": 32.725217, + "longitude": -93.312837, + "city": "Minden", + "state": "LA", + "county": "Webster" + }, + { + "zip_code": 71058, + "latitude": 32.576948, + "longitude": -93.250705, + "city": "Minden", + "state": "LA", + "county": "Webster" + }, + { + "zip_code": 71060, + "latitude": 32.594798, + "longitude": -93.976775, + "city": "Mooringsport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71061, + "latitude": 32.755816, + "longitude": -93.966734, + "city": "Oil City", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71063, + "latitude": 31.911977, + "longitude": -93.563309, + "city": "Pelican", + "state": "LA", + "county": "De Soto" + }, + { + "zip_code": 71064, + "latitude": 32.768412, + "longitude": -93.647824, + "city": "Plain Dealing", + "state": "LA", + "county": "Bossier" + }, + { + "zip_code": 71065, + "latitude": 31.794655, + "longitude": -93.534539, + "city": "Pleasant Hill", + "state": "LA", + "county": "Sabine" + }, + { + "zip_code": 71066, + "latitude": 31.874059, + "longitude": -93.196609, + "city": "Powhatan", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71067, + "latitude": 32.597435, + "longitude": -93.50865, + "city": "Princeton", + "state": "LA", + "county": "Bossier" + }, + { + "zip_code": 71068, + "latitude": 32.382223, + "longitude": -93.238047, + "city": "Ringgold", + "state": "LA", + "county": "Bienville" + }, + { + "zip_code": 71069, + "latitude": 32.96331, + "longitude": -93.968905, + "city": "Rodessa", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71070, + "latitude": 32.19698, + "longitude": -92.91702, + "city": "Saline", + "state": "LA", + "county": "Bienville" + }, + { + "zip_code": 71071, + "latitude": 32.758417, + "longitude": -93.391177, + "city": "Sarepta", + "state": "LA", + "county": "Webster" + }, + { + "zip_code": 71072, + "latitude": 32.74333, + "longitude": -93.327139, + "city": "Shongaloo", + "state": "LA", + "county": "Webster" + }, + { + "zip_code": 71073, + "latitude": 32.652472, + "longitude": -93.342675, + "city": "Sibley", + "state": "LA", + "county": "Webster" + }, + { + "zip_code": 71075, + "latitude": 32.771459, + "longitude": -93.406102, + "city": "Springhill", + "state": "LA", + "county": "Webster" + }, + { + "zip_code": 71078, + "latitude": 32.173318, + "longitude": -93.867325, + "city": "Stonewall", + "state": "LA", + "county": "De Soto" + }, + { + "zip_code": 71079, + "latitude": 32.945404, + "longitude": -92.811145, + "city": "Summerfield", + "state": "LA", + "county": "Claiborne" + }, + { + "zip_code": 71080, + "latitude": 32.366002, + "longitude": -93.101086, + "city": "Taylor", + "state": "LA", + "county": "Bienville" + }, + { + "zip_code": 71082, + "latitude": 32.84233, + "longitude": -93.950401, + "city": "Vivian", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71101, + "latitude": 32.498202, + "longitude": -93.750228, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71102, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71103, + "latitude": 32.492552, + "longitude": -93.775978, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71104, + "latitude": 32.483313, + "longitude": -93.730764, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71105, + "latitude": 32.450453, + "longitude": -93.712906, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71106, + "latitude": 32.39117, + "longitude": -93.711612, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71107, + "latitude": 32.601593, + "longitude": -93.87377, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71108, + "latitude": 32.602557, + "longitude": -93.816458, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71109, + "latitude": 32.464053, + "longitude": -93.814327, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71110, + "latitude": 32.513749, + "longitude": -93.640362, + "city": "Barksdale Afb", + "state": "LA", + "county": "Bossier" + }, + { + "zip_code": 71111, + "latitude": 32.516708, + "longitude": -93.586698, + "city": "Bossier City", + "state": "LA", + "county": "Bossier" + }, + { + "zip_code": 71112, + "latitude": 32.460209, + "longitude": -93.64562, + "city": "Bossier City", + "state": "LA", + "county": "Bossier" + }, + { + "zip_code": 71113, + "latitude": 32.62762, + "longitude": -93.608968, + "city": "Bossier City", + "state": "LA", + "county": "Bossier" + }, + { + "zip_code": 71115, + "latitude": 32.340125, + "longitude": -93.609198, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71118, + "latitude": 32.535809, + "longitude": -93.805255, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71119, + "latitude": 32.478881, + "longitude": -93.925724, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71120, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71129, + "latitude": 32.346853, + "longitude": -93.924607, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71130, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71133, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71134, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71135, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71136, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71137, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71138, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71148, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71149, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71151, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71152, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71153, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71154, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71156, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71161, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71162, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71163, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71164, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71165, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71166, + "latitude": 32.607556, + "longitude": -93.75256, + "city": "Shreveport", + "state": "LA", + "county": "Caddo" + }, + { + "zip_code": 71171, + "latitude": 32.62762, + "longitude": -93.608968, + "city": "Bossier City", + "state": "LA", + "county": "Bossier" + }, + { + "zip_code": 71172, + "latitude": 32.62762, + "longitude": -93.608968, + "city": "Bossier City", + "state": "LA", + "county": "Bossier" + }, + { + "zip_code": 71201, + "latitude": 32.502833, + "longitude": -92.094583, + "city": "Monroe", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71202, + "latitude": 32.386844, + "longitude": -92.072206, + "city": "Monroe", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71203, + "latitude": 32.600213, + "longitude": -92.027228, + "city": "Monroe", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71207, + "latitude": 32.490777, + "longitude": -92.159354, + "city": "Monroe", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71208, + "latitude": 32.496764, + "longitude": -92.075615, + "city": "Monroe", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71209, + "latitude": 32.527693, + "longitude": -92.075583, + "city": "Monroe", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71210, + "latitude": 32.490777, + "longitude": -92.159354, + "city": "Monroe", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71211, + "latitude": 32.490777, + "longitude": -92.159354, + "city": "Monroe", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71212, + "latitude": 32.528593, + "longitude": -92.072683, + "city": "Monroe", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71213, + "latitude": 32.490777, + "longitude": -92.159354, + "city": "Monroe", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71218, + "latitude": 32.409446, + "longitude": -91.732788, + "city": "Archibald", + "state": "LA", + "county": "Richland" + }, + { + "zip_code": 71219, + "latitude": 32.311261, + "longitude": -91.68543, + "city": "Baskin", + "state": "LA", + "county": "Franklin" + }, + { + "zip_code": 71220, + "latitude": 32.795041, + "longitude": -91.873723, + "city": "Bastrop", + "state": "LA", + "county": "Morehouse" + }, + { + "zip_code": 71221, + "latitude": 32.823863, + "longitude": -91.843528, + "city": "Bastrop", + "state": "LA", + "county": "Morehouse" + }, + { + "zip_code": 71222, + "latitude": 32.837199, + "longitude": -92.471522, + "city": "Bernice", + "state": "LA", + "county": "Union" + }, + { + "zip_code": 71223, + "latitude": 32.906387, + "longitude": -91.653002, + "city": "Bonita", + "state": "LA", + "county": "Morehouse" + }, + { + "zip_code": 71225, + "latitude": 32.496897, + "longitude": -92.337078, + "city": "Calhoun", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71226, + "latitude": 32.29969, + "longitude": -92.44118, + "city": "Chatham", + "state": "LA", + "county": "Jackson" + }, + { + "zip_code": 71227, + "latitude": 32.585408, + "longitude": -92.611834, + "city": "Choudrant", + "state": "LA", + "county": "Lincoln" + }, + { + "zip_code": 71229, + "latitude": 32.663142, + "longitude": -91.812865, + "city": "Collinston", + "state": "LA", + "county": "Morehouse" + }, + { + "zip_code": 71230, + "latitude": 32.138935, + "longitude": -91.691899, + "city": "Crowville", + "state": "LA", + "county": "Franklin" + }, + { + "zip_code": 71232, + "latitude": 32.445598, + "longitude": -91.631433, + "city": "Delhi", + "state": "LA", + "county": "Richland" + }, + { + "zip_code": 71233, + "latitude": 32.341594, + "longitude": -91.216458, + "city": "Delta", + "state": "LA", + "county": "Madison" + }, + { + "zip_code": 71234, + "latitude": 32.664242, + "longitude": -92.36232, + "city": "Downsville", + "state": "LA", + "county": "Union" + }, + { + "zip_code": 71235, + "latitude": 32.644564, + "longitude": -92.699642, + "city": "Dubach", + "state": "LA", + "county": "Lincoln" + }, + { + "zip_code": 71237, + "latitude": 32.718098, + "longitude": -91.499713, + "city": "Epps", + "state": "LA", + "county": "West Carroll" + }, + { + "zip_code": 71238, + "latitude": 32.353757, + "longitude": -92.459917, + "city": "Eros", + "state": "LA", + "county": "Jackson" + }, + { + "zip_code": 71240, + "latitude": 32.490777, + "longitude": -92.159354, + "city": "Fairbanks", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71241, + "latitude": 32.777031, + "longitude": -92.39525, + "city": "Farmerville", + "state": "LA", + "county": "Union" + }, + { + "zip_code": 71242, + "latitude": 32.82388, + "longitude": -91.398944, + "city": "Forest", + "state": "LA", + "county": "West Carroll" + }, + { + "zip_code": 71243, + "latitude": 31.981305, + "longitude": -91.766549, + "city": "Fort Necessity", + "state": "LA", + "county": "Franklin" + }, + { + "zip_code": 71245, + "latitude": 32.515626, + "longitude": -92.73593, + "city": "Grambling", + "state": "LA", + "county": "Lincoln" + }, + { + "zip_code": 71247, + "latitude": 32.280774, + "longitude": -92.71463, + "city": "Hodge", + "state": "LA", + "county": "Jackson" + }, + { + "zip_code": 71249, + "latitude": 32.138935, + "longitude": -91.691899, + "city": "Jigger", + "state": "LA", + "county": "Franklin" + }, + { + "zip_code": 71250, + "latitude": 32.94656, + "longitude": -91.580528, + "city": "Jones", + "state": "LA", + "county": "Morehouse" + }, + { + "zip_code": 71251, + "latitude": 32.228472, + "longitude": -92.575528, + "city": "Jonesboro", + "state": "LA", + "county": "Jackson" + }, + { + "zip_code": 71253, + "latitude": 32.794027, + "longitude": -91.450183, + "city": "Kilbourne", + "state": "LA", + "county": "West Carroll" + }, + { + "zip_code": 71254, + "latitude": 32.796407, + "longitude": -91.252622, + "city": "Lake Providence", + "state": "LA", + "county": "East Carroll" + }, + { + "zip_code": 71256, + "latitude": 32.956279, + "longitude": -92.687277, + "city": "Lillie", + "state": "LA", + "county": "Union" + }, + { + "zip_code": 71259, + "latitude": 32.343608, + "longitude": -91.741639, + "city": "Mangham", + "state": "LA", + "county": "Richland" + }, + { + "zip_code": 71260, + "latitude": 32.871556, + "longitude": -92.28619, + "city": "Marion", + "state": "LA", + "county": "Union" + }, + { + "zip_code": 71261, + "latitude": 32.793556, + "longitude": -91.727614, + "city": "Mer Rouge", + "state": "LA", + "county": "Morehouse" + }, + { + "zip_code": 71263, + "latitude": 32.873125, + "longitude": -91.430209, + "city": "Oak Grove", + "state": "LA", + "county": "West Carroll" + }, + { + "zip_code": 71264, + "latitude": 32.606213, + "longitude": -91.759778, + "city": "Oak Ridge", + "state": "LA", + "county": "Morehouse" + }, + { + "zip_code": 71266, + "latitude": 32.736836, + "longitude": -91.510077, + "city": "Pioneer", + "state": "LA", + "county": "West Carroll" + }, + { + "zip_code": 71268, + "latitude": 32.337632, + "longitude": -92.672165, + "city": "Quitman", + "state": "LA", + "county": "Jackson" + }, + { + "zip_code": 71269, + "latitude": 32.445645, + "longitude": -91.743314, + "city": "Rayville", + "state": "LA", + "county": "Richland" + }, + { + "zip_code": 71270, + "latitude": 32.580553, + "longitude": -92.639756, + "city": "Ruston", + "state": "LA", + "county": "Lincoln" + }, + { + "zip_code": 71272, + "latitude": 32.525825, + "longitude": -92.649298, + "city": "Ruston", + "state": "LA", + "county": "Lincoln" + }, + { + "zip_code": 71273, + "latitude": 32.606535, + "longitude": -92.648384, + "city": "Ruston", + "state": "LA", + "county": "Lincoln" + }, + { + "zip_code": 71275, + "latitude": 32.597482, + "longitude": -92.708389, + "city": "Simsboro", + "state": "LA", + "county": "Lincoln" + }, + { + "zip_code": 71276, + "latitude": 32.771315, + "longitude": -91.230175, + "city": "Sondheimer", + "state": "LA", + "county": "East Carroll" + }, + { + "zip_code": 71277, + "latitude": 32.916505, + "longitude": -92.574611, + "city": "Spearsville", + "state": "LA", + "county": "Union" + }, + { + "zip_code": 71279, + "latitude": 32.49191, + "longitude": -91.856326, + "city": "Start", + "state": "LA", + "county": "Richland" + }, + { + "zip_code": 71280, + "latitude": 32.617816, + "longitude": -92.060082, + "city": "Sterlington", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71281, + "latitude": 32.490777, + "longitude": -92.159354, + "city": "Swartz", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71282, + "latitude": 32.4326, + "longitude": -91.064535, + "city": "Tallulah", + "state": "LA", + "county": "Madison" + }, + { + "zip_code": 71284, + "latitude": 32.341594, + "longitude": -91.216458, + "city": "Tallulah", + "state": "LA", + "county": "Madison" + }, + { + "zip_code": 71286, + "latitude": 32.771315, + "longitude": -91.230175, + "city": "Transylvania", + "state": "LA", + "county": "East Carroll" + }, + { + "zip_code": 71291, + "latitude": 32.497932, + "longitude": -92.16588, + "city": "West Monroe", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71292, + "latitude": 32.402367, + "longitude": -92.203654, + "city": "West Monroe", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71294, + "latitude": 32.490777, + "longitude": -92.159354, + "city": "West Monroe", + "state": "LA", + "county": "Ouachita" + }, + { + "zip_code": 71295, + "latitude": 32.118121, + "longitude": -91.705926, + "city": "Winnsboro", + "state": "LA", + "county": "Franklin" + }, + { + "zip_code": 71301, + "latitude": 31.175885, + "longitude": -92.431184, + "city": "Alexandria", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71302, + "latitude": 31.164904, + "longitude": -92.367497, + "city": "Alexandria", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71303, + "latitude": 31.259983, + "longitude": -92.53434, + "city": "Alexandria", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71306, + "latitude": 31.075638, + "longitude": -92.446135, + "city": "Alexandria", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71307, + "latitude": 31.203393, + "longitude": -92.526927, + "city": "Alexandria", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71309, + "latitude": 31.30473, + "longitude": -92.619593, + "city": "Alexandria", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71315, + "latitude": 31.139651, + "longitude": -92.398384, + "city": "Alexandria", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71316, + "latitude": 31.308416, + "longitude": -91.823219, + "city": "Acme", + "state": "LA", + "county": "Concordia" + }, + { + "zip_code": 71320, + "latitude": 31.091942, + "longitude": -91.906093, + "city": "Bordelonville", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71322, + "latitude": 30.939962, + "longitude": -92.110503, + "city": "Bunkie", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71323, + "latitude": 31.235297, + "longitude": -92.194478, + "city": "Center Point", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71324, + "latitude": 32.138935, + "longitude": -91.691899, + "city": "Chase", + "state": "LA", + "county": "Franklin" + }, + { + "zip_code": 71325, + "latitude": 31.047041, + "longitude": -92.383486, + "city": "Cheneyville", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71326, + "latitude": 31.715764, + "longitude": -91.516323, + "city": "Clayton", + "state": "LA", + "county": "Concordia" + }, + { + "zip_code": 71327, + "latitude": 30.973616, + "longitude": -91.995281, + "city": "Cottonport", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71328, + "latitude": 31.358696, + "longitude": -92.2233, + "city": "Deville", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71329, + "latitude": 31.095889, + "longitude": -91.97899, + "city": "Dupont", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71330, + "latitude": 31.119858, + "longitude": -92.25888, + "city": "Echo", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71331, + "latitude": 31.222424, + "longitude": -92.113774, + "city": "Effie", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71333, + "latitude": 30.91614, + "longitude": -92.067027, + "city": "Evergreen", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71334, + "latitude": 31.660219, + "longitude": -91.550218, + "city": "Ferriday", + "state": "LA", + "county": "Concordia" + }, + { + "zip_code": 71336, + "latitude": 31.999512, + "longitude": -91.619049, + "city": "Gilbert", + "state": "LA", + "county": "Franklin" + }, + { + "zip_code": 71339, + "latitude": 31.037572, + "longitude": -91.904161, + "city": "Hamburg", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71340, + "latitude": 31.746835, + "longitude": -91.890463, + "city": "Harrisonburg", + "state": "LA", + "county": "Catahoula" + }, + { + "zip_code": 71341, + "latitude": 31.112517, + "longitude": -92.041225, + "city": "Hessmer", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71342, + "latitude": 31.60603, + "longitude": -92.140733, + "city": "Jena", + "state": "LA", + "county": "La Salle" + }, + { + "zip_code": 71343, + "latitude": 31.686225, + "longitude": -91.86778, + "city": "Jonesville", + "state": "LA", + "county": "Catahoula" + }, + { + "zip_code": 71345, + "latitude": 30.770459, + "longitude": -92.01484, + "city": "Lebeau", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 71346, + "latitude": 31.092797, + "longitude": -92.439933, + "city": "Lecompte", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71348, + "latitude": 31.203393, + "longitude": -92.526927, + "city": "Libuse", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71350, + "latitude": 31.064478, + "longitude": -92.049086, + "city": "Mansura", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71351, + "latitude": 31.114424, + "longitude": -92.019522, + "city": "Marksville", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71353, + "latitude": 30.716462, + "longitude": -91.793232, + "city": "Melville", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 71354, + "latitude": 31.347431, + "longitude": -91.724573, + "city": "Monterey", + "state": "LA", + "county": "Concordia" + }, + { + "zip_code": 71355, + "latitude": 31.09884, + "longitude": -91.874829, + "city": "Moreauville", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71356, + "latitude": 30.791878, + "longitude": -92.031647, + "city": "Morrow", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 71357, + "latitude": 32.038254, + "longitude": -91.242511, + "city": "Newellton", + "state": "LA", + "county": "Tensas" + }, + { + "zip_code": 71358, + "latitude": 30.72662, + "longitude": -91.895195, + "city": "Palmetto", + "state": "LA", + "county": "Saint Landry" + }, + { + "zip_code": 71359, + "latitude": 31.203393, + "longitude": -92.526927, + "city": "Pineville", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71360, + "latitude": 31.223184, + "longitude": -92.320275, + "city": "Pineville", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71361, + "latitude": 31.36923, + "longitude": -92.419836, + "city": "Pineville", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71362, + "latitude": 30.992478, + "longitude": -92.001767, + "city": "Plaucheville", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71363, + "latitude": 31.596272, + "longitude": -91.77941, + "city": "Rhinehart", + "state": "LA", + "county": "Catahoula" + }, + { + "zip_code": 71365, + "latitude": 31.203393, + "longitude": -92.526927, + "city": "Ruby", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71366, + "latitude": 31.919051, + "longitude": -91.239631, + "city": "Saint Joseph", + "state": "LA", + "county": "Tensas" + }, + { + "zip_code": 71367, + "latitude": 30.899787, + "longitude": -92.296364, + "city": "Saint Landry", + "state": "LA", + "county": "Evangeline" + }, + { + "zip_code": 71368, + "latitude": 31.848184, + "longitude": -91.661308, + "city": "Sicily Island", + "state": "LA", + "county": "Catahoula" + }, + { + "zip_code": 71369, + "latitude": 30.946808, + "longitude": -91.894355, + "city": "Simmesport", + "state": "LA", + "county": "Avoyelles" + }, + { + "zip_code": 71371, + "latitude": 31.697711, + "longitude": -92.177637, + "city": "Trout", + "state": "LA", + "county": "La Salle" + }, + { + "zip_code": 71373, + "latitude": 31.408218, + "longitude": -91.546425, + "city": "Vidalia", + "state": "LA", + "county": "Concordia" + }, + { + "zip_code": 71375, + "latitude": 31.805761, + "longitude": -91.38711, + "city": "Waterproof", + "state": "LA", + "county": "Tensas" + }, + { + "zip_code": 71377, + "latitude": 31.590328, + "longitude": -91.752932, + "city": "Wildsville", + "state": "LA", + "county": "Concordia" + }, + { + "zip_code": 71378, + "latitude": 31.961337, + "longitude": -91.660042, + "city": "Wisner", + "state": "LA", + "county": "Franklin" + }, + { + "zip_code": 71401, + "latitude": 31.596272, + "longitude": -91.77941, + "city": "Aimwell", + "state": "LA", + "county": "Catahoula" + }, + { + "zip_code": 71403, + "latitude": 31.142302, + "longitude": -93.268452, + "city": "Anacoco", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 71404, + "latitude": 31.775958, + "longitude": -92.795773, + "city": "Atlanta", + "state": "LA", + "county": "Winn" + }, + { + "zip_code": 71405, + "latitude": 31.415125, + "longitude": -92.394536, + "city": "Ball", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71406, + "latitude": 31.730633, + "longitude": -93.493958, + "city": "Belmont", + "state": "LA", + "county": "Sabine" + }, + { + "zip_code": 71407, + "latitude": 31.518701, + "longitude": -92.480731, + "city": "Bentley", + "state": "LA", + "county": "Grant" + }, + { + "zip_code": 71409, + "latitude": 31.251382, + "longitude": -92.655743, + "city": "Boyce", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71410, + "latitude": 31.961279, + "longitude": -92.792418, + "city": "Calvin", + "state": "LA", + "county": "Winn" + }, + { + "zip_code": 71411, + "latitude": 31.83009, + "longitude": -93.148989, + "city": "Campti", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71414, + "latitude": 31.818209, + "longitude": -93.021608, + "city": "Clarence", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71415, + "latitude": 32.055505, + "longitude": -92.164903, + "city": "Clarks", + "state": "LA", + "county": "Caldwell" + }, + { + "zip_code": 71416, + "latitude": 31.517836, + "longitude": -92.85577, + "city": "Cloutierville", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71417, + "latitude": 31.527636, + "longitude": -92.653269, + "city": "Colfax", + "state": "LA", + "county": "Grant" + }, + { + "zip_code": 71418, + "latitude": 32.102189, + "longitude": -92.11767, + "city": "Columbia", + "state": "LA", + "county": "Caldwell" + }, + { + "zip_code": 71419, + "latitude": 31.733858, + "longitude": -93.690163, + "city": "Converse", + "state": "LA", + "county": "Sabine" + }, + { + "zip_code": 71422, + "latitude": 32.072883, + "longitude": -92.565469, + "city": "Dodson", + "state": "LA", + "county": "Winn" + }, + { + "zip_code": 71423, + "latitude": 31.552466, + "longitude": -92.673718, + "city": "Dry Prong", + "state": "LA", + "county": "Grant" + }, + { + "zip_code": 71424, + "latitude": 31.178183, + "longitude": -92.700294, + "city": "Elmer", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71425, + "latitude": 31.920835, + "longitude": -91.922802, + "city": "Enterprise", + "state": "LA", + "county": "Catahoula" + }, + { + "zip_code": 71426, + "latitude": 31.493332, + "longitude": -93.464539, + "city": "Fisher", + "state": "LA", + "county": "Sabine" + }, + { + "zip_code": 71427, + "latitude": 31.375488, + "longitude": -92.893591, + "city": "Flatwoods", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71428, + "latitude": 31.612444, + "longitude": -93.097958, + "city": "Flora", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71429, + "latitude": 31.343315, + "longitude": -93.430975, + "city": "Florien", + "state": "LA", + "county": "Sabine" + }, + { + "zip_code": 71430, + "latitude": 31.157736, + "longitude": -92.448853, + "city": "Forest Hill", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71431, + "latitude": 31.258681, + "longitude": -92.677545, + "city": "Gardner", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71432, + "latitude": 31.648593, + "longitude": -92.470407, + "city": "Georgetown", + "state": "LA", + "county": "Grant" + }, + { + "zip_code": 71433, + "latitude": 31.026188, + "longitude": -92.616008, + "city": "Glenmora", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71434, + "latitude": 31.503751, + "longitude": -92.998576, + "city": "Gorum", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71435, + "latitude": 32.066996, + "longitude": -92.169835, + "city": "Grayson", + "state": "LA", + "county": "Caldwell" + }, + { + "zip_code": 71438, + "latitude": 31.166914, + "longitude": -92.737515, + "city": "Hineston", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71439, + "latitude": 31.316133, + "longitude": -93.221228, + "city": "Hornbeck", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 71440, + "latitude": 31.951166, + "longitude": -92.565884, + "city": "Joyce", + "state": "LA", + "county": "Winn" + }, + { + "zip_code": 71441, + "latitude": 31.964848, + "longitude": -92.18248, + "city": "Kelly", + "state": "LA", + "county": "Caldwell" + }, + { + "zip_code": 71443, + "latitude": 31.1019, + "longitude": -93.361238, + "city": "Kurthwood", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 71444, + "latitude": 31.120174, + "longitude": -93.104943, + "city": "Lacamp", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 71446, + "latitude": 31.125636, + "longitude": -93.173622, + "city": "Leesville", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 71447, + "latitude": 31.361027, + "longitude": -92.792811, + "city": "Lena", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71448, + "latitude": 31.203393, + "longitude": -92.526927, + "city": "Longleaf", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71449, + "latitude": 31.530019, + "longitude": -93.51155, + "city": "Many", + "state": "LA", + "county": "Sabine" + }, + { + "zip_code": 71450, + "latitude": 31.78699, + "longitude": -93.361235, + "city": "Marthaville", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71452, + "latitude": 31.679336, + "longitude": -93.171095, + "city": "Melrose", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71454, + "latitude": 31.671495, + "longitude": -92.660865, + "city": "Montgomery", + "state": "LA", + "county": "Grant" + }, + { + "zip_code": 71455, + "latitude": 31.423432, + "longitude": -92.953251, + "city": "Mora", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71456, + "latitude": 31.690431, + "longitude": -93.072487, + "city": "Natchez", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71457, + "latitude": 31.70988, + "longitude": -93.109141, + "city": "Natchitoches", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71458, + "latitude": 31.747563, + "longitude": -93.079055, + "city": "Natchitoches", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71459, + "latitude": 31.029825, + "longitude": -93.23479, + "city": "Leesville", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 71460, + "latitude": 31.448907, + "longitude": -93.621234, + "city": "Negreet", + "state": "LA", + "county": "Sabine" + }, + { + "zip_code": 71461, + "latitude": 31.096279, + "longitude": -93.311433, + "city": "Newllano", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 71462, + "latitude": 31.699522, + "longitude": -93.709535, + "city": "Noble", + "state": "LA", + "county": "Sabine" + }, + { + "zip_code": 71463, + "latitude": 30.769826, + "longitude": -92.771752, + "city": "Oakdale", + "state": "LA", + "county": "Allen" + }, + { + "zip_code": 71465, + "latitude": 31.805736, + "longitude": -92.208993, + "city": "Olla", + "state": "LA", + "county": "La Salle" + }, + { + "zip_code": 71466, + "latitude": 31.200683, + "longitude": -92.637241, + "city": "Otis", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71467, + "latitude": 31.56668, + "longitude": -92.396314, + "city": "Pollock", + "state": "LA", + "county": "Grant" + }, + { + "zip_code": 71468, + "latitude": 31.583252, + "longitude": -93.118485, + "city": "Provencal", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71469, + "latitude": 31.633931, + "longitude": -93.186289, + "city": "Robeline", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71471, + "latitude": 31.749699, + "longitude": -92.927989, + "city": "Saint Maurice", + "state": "LA", + "county": "Winn" + }, + { + "zip_code": 71472, + "latitude": 31.197632, + "longitude": -92.785799, + "city": "Sieper", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71473, + "latitude": 32.042737, + "longitude": -92.449469, + "city": "Sikes", + "state": "LA", + "county": "Winn" + }, + { + "zip_code": 71474, + "latitude": 31.257037, + "longitude": -93.016983, + "city": "Simpson", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 71475, + "latitude": 31.111979, + "longitude": -93.200936, + "city": "Slagle", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 71477, + "latitude": 31.399855, + "longitude": -92.604193, + "city": "Tioga", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71479, + "latitude": 31.861954, + "longitude": -92.291333, + "city": "Tullos", + "state": "LA", + "county": "La Salle" + }, + { + "zip_code": 71480, + "latitude": 31.864998, + "longitude": -92.291463, + "city": "Urania", + "state": "LA", + "county": "La Salle" + }, + { + "zip_code": 71481, + "latitude": 31.592547, + "longitude": -92.58483, + "city": "Verda", + "state": "LA", + "county": "Grant" + }, + { + "zip_code": 71483, + "latitude": 31.914948, + "longitude": -92.669269, + "city": "Winnfield", + "state": "LA", + "county": "Winn" + }, + { + "zip_code": 71485, + "latitude": 31.163485, + "longitude": -92.532189, + "city": "Woodworth", + "state": "LA", + "county": "Rapides" + }, + { + "zip_code": 71486, + "latitude": 31.64176, + "longitude": -93.637939, + "city": "Zwolle", + "state": "LA", + "county": "Sabine" + }, + { + "zip_code": 71496, + "latitude": 31.110298, + "longitude": -93.289988, + "city": "Leesville", + "state": "LA", + "county": "Vernon" + }, + { + "zip_code": 71497, + "latitude": 31.747563, + "longitude": -93.079055, + "city": "Natchitoches", + "state": "LA", + "county": "Natchitoches" + }, + { + "zip_code": 71601, + "latitude": 34.208962, + "longitude": -91.985946, + "city": "Pine Bluff", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 71602, + "latitude": 34.257661, + "longitude": -92.012103, + "city": "White Hall", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 71603, + "latitude": 34.148699, + "longitude": -92.083653, + "city": "Pine Bluff", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 71611, + "latitude": 34.261465, + "longitude": -91.955115, + "city": "Pine Bluff", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 71612, + "latitude": 34.277534, + "longitude": -91.832539, + "city": "White Hall", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 71613, + "latitude": 34.157876, + "longitude": -92.071284, + "city": "Pine Bluff", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 71630, + "latitude": 33.608922, + "longitude": -91.207356, + "city": "Arkansas City", + "state": "AR", + "county": "Desha" + }, + { + "zip_code": 71631, + "latitude": 33.566349, + "longitude": -92.240352, + "city": "Banks", + "state": "AR", + "county": "Bradley" + }, + { + "zip_code": 71635, + "latitude": 33.180855, + "longitude": -91.806256, + "city": "Crossett", + "state": "AR", + "county": "Ashley" + }, + { + "zip_code": 71638, + "latitude": 33.470414, + "longitude": -91.394712, + "city": "Dermott", + "state": "AR", + "county": "Chicot" + }, + { + "zip_code": 71639, + "latitude": 33.875244, + "longitude": -91.488393, + "city": "Dumas", + "state": "AR", + "county": "Desha" + }, + { + "zip_code": 71640, + "latitude": 33.148807, + "longitude": -91.310103, + "city": "Eudora", + "state": "AR", + "county": "Chicot" + }, + { + "zip_code": 71642, + "latitude": 33.363143, + "longitude": -91.908776, + "city": "Fountain Hill", + "state": "AR", + "county": "Ashley" + }, + { + "zip_code": 71643, + "latitude": 34.024648, + "longitude": -91.626178, + "city": "Gould", + "state": "AR", + "county": "Lincoln" + }, + { + "zip_code": 71644, + "latitude": 34.103233, + "longitude": -91.705699, + "city": "Grady", + "state": "AR", + "county": "Lincoln" + }, + { + "zip_code": 71646, + "latitude": 33.215895, + "longitude": -91.804371, + "city": "Hamburg", + "state": "AR", + "county": "Ashley" + }, + { + "zip_code": 71647, + "latitude": 33.390044, + "longitude": -92.155958, + "city": "Hermitage", + "state": "AR", + "county": "Bradley" + }, + { + "zip_code": 71649, + "latitude": 33.283901, + "longitude": -91.25206, + "city": "Jennie", + "state": "AR", + "county": "Chicot" + }, + { + "zip_code": 71650, + "latitude": 33.590601, + "longitude": -91.732829, + "city": "Jerome", + "state": "AR", + "county": "Drew" + }, + { + "zip_code": 71651, + "latitude": 33.368404, + "longitude": -92.290223, + "city": "Jersey", + "state": "AR", + "county": "Bradley" + }, + { + "zip_code": 71652, + "latitude": 33.866338, + "longitude": -92.276397, + "city": "Kingsland", + "state": "AR", + "county": "Cleveland" + }, + { + "zip_code": 71653, + "latitude": 33.331905, + "longitude": -91.297702, + "city": "Lake Village", + "state": "AR", + "county": "Chicot" + }, + { + "zip_code": 71654, + "latitude": 33.644573, + "longitude": -91.401113, + "city": "Mc Gehee", + "state": "AR", + "county": "Desha" + }, + { + "zip_code": 71655, + "latitude": 33.604967, + "longitude": -91.755955, + "city": "Monticello", + "state": "AR", + "county": "Drew" + }, + { + "zip_code": 71656, + "latitude": 33.590601, + "longitude": -91.732829, + "city": "Monticello", + "state": "AR", + "county": "Drew" + }, + { + "zip_code": 71657, + "latitude": 33.590601, + "longitude": -91.732829, + "city": "Monticello", + "state": "AR", + "county": "Drew" + }, + { + "zip_code": 71658, + "latitude": 33.261721, + "longitude": -91.649931, + "city": "Montrose", + "state": "AR", + "county": "Ashley" + }, + { + "zip_code": 71659, + "latitude": 34.134089, + "longitude": -91.79456, + "city": "Moscow", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 71660, + "latitude": 33.884167, + "longitude": -92.214399, + "city": "New Edinburg", + "state": "AR", + "county": "Cleveland" + }, + { + "zip_code": 71661, + "latitude": 33.139243, + "longitude": -91.576612, + "city": "Parkdale", + "state": "AR", + "county": "Ashley" + }, + { + "zip_code": 71662, + "latitude": 33.818318, + "longitude": -91.214054, + "city": "Pickens", + "state": "AR", + "county": "Desha" + }, + { + "zip_code": 71663, + "latitude": 33.212137, + "longitude": -91.512163, + "city": "Portland", + "state": "AR", + "county": "Ashley" + }, + { + "zip_code": 71665, + "latitude": 33.900651, + "longitude": -92.131777, + "city": "Rison", + "state": "AR", + "county": "Cleveland" + }, + { + "zip_code": 71666, + "latitude": 33.818318, + "longitude": -91.214054, + "city": "Mc Gehee", + "state": "AR", + "county": "Desha" + }, + { + "zip_code": 71667, + "latitude": 33.999462, + "longitude": -91.709308, + "city": "Star City", + "state": "AR", + "county": "Lincoln" + }, + { + "zip_code": 71670, + "latitude": 33.698144, + "longitude": -91.443347, + "city": "Tillar", + "state": "AR", + "county": "Desha" + }, + { + "zip_code": 71671, + "latitude": 33.573602, + "longitude": -92.097852, + "city": "Warren", + "state": "AR", + "county": "Bradley" + }, + { + "zip_code": 71674, + "latitude": 33.905202, + "longitude": -91.279828, + "city": "Watson", + "state": "AR", + "county": "Desha" + }, + { + "zip_code": 71675, + "latitude": 33.614151, + "longitude": -91.916698, + "city": "Wilmar", + "state": "AR", + "county": "Drew" + }, + { + "zip_code": 71676, + "latitude": 33.151992, + "longitude": -91.559968, + "city": "Wilmot", + "state": "AR", + "county": "Ashley" + }, + { + "zip_code": 71677, + "latitude": 33.747125, + "longitude": -91.490123, + "city": "Winchester", + "state": "AR", + "county": "Drew" + }, + { + "zip_code": 71678, + "latitude": 33.978738, + "longitude": -91.699077, + "city": "Yorktown", + "state": "AR", + "county": "Lincoln" + }, + { + "zip_code": 71701, + "latitude": 33.594817, + "longitude": -92.851335, + "city": "Camden", + "state": "AR", + "county": "Ouachita" + }, + { + "zip_code": 71711, + "latitude": 33.589009, + "longitude": -92.842649, + "city": "Camden", + "state": "AR", + "county": "Ouachita" + }, + { + "zip_code": 71720, + "latitude": 33.715918, + "longitude": -92.844808, + "city": "Bearden", + "state": "AR", + "county": "Ouachita" + }, + { + "zip_code": 71721, + "latitude": 34.055486, + "longitude": -93.189406, + "city": "Beirne", + "state": "AR", + "county": "Clark" + }, + { + "zip_code": 71722, + "latitude": 33.70082, + "longitude": -93.294126, + "city": "Bluff City", + "state": "AR", + "county": "Nevada" + }, + { + "zip_code": 71724, + "latitude": 33.266043, + "longitude": -92.597514, + "city": "Calion", + "state": "AR", + "county": "Union" + }, + { + "zip_code": 71725, + "latitude": 34.101037, + "longitude": -92.516827, + "city": "Carthage", + "state": "AR", + "county": "Dallas" + }, + { + "zip_code": 71726, + "latitude": 33.665157, + "longitude": -92.996873, + "city": "Chidester", + "state": "AR", + "county": "Ouachita" + }, + { + "zip_code": 71728, + "latitude": 34.010316, + "longitude": -93.097627, + "city": "Curtis", + "state": "AR", + "county": "Clark" + }, + { + "zip_code": 71730, + "latitude": 33.187446, + "longitude": -92.630038, + "city": "El Dorado", + "state": "AR", + "county": "Union" + }, + { + "zip_code": 71731, + "latitude": 33.198024, + "longitude": -92.52891, + "city": "El Dorado", + "state": "AR", + "county": "Union" + }, + { + "zip_code": 71740, + "latitude": 33.112106, + "longitude": -93.203998, + "city": "Emerson", + "state": "AR", + "county": "Columbia" + }, + { + "zip_code": 71742, + "latitude": 33.935138, + "longitude": -92.610536, + "city": "Fordyce", + "state": "AR", + "county": "Dallas" + }, + { + "zip_code": 71743, + "latitude": 33.930011, + "longitude": -93.129994, + "city": "Gurdon", + "state": "AR", + "county": "Clark" + }, + { + "zip_code": 71744, + "latitude": 33.516751, + "longitude": -92.582269, + "city": "Hampton", + "state": "AR", + "county": "Calhoun" + }, + { + "zip_code": 71745, + "latitude": 33.535994, + "longitude": -92.543915, + "city": "Harrell", + "state": "AR", + "county": "Calhoun" + }, + { + "zip_code": 71747, + "latitude": 33.164568, + "longitude": -92.393701, + "city": "Huttig", + "state": "AR", + "county": "Union" + }, + { + "zip_code": 71748, + "latitude": 33.97547, + "longitude": -92.647817, + "city": "Ivan", + "state": "AR", + "county": "Dallas" + }, + { + "zip_code": 71749, + "latitude": 33.16579, + "longitude": -92.768091, + "city": "Junction City", + "state": "AR", + "county": "Union" + }, + { + "zip_code": 71750, + "latitude": 33.198024, + "longitude": -92.52891, + "city": "Lawson", + "state": "AR", + "county": "Union" + }, + { + "zip_code": 71751, + "latitude": 33.416913, + "longitude": -92.777026, + "city": "Louann", + "state": "AR", + "county": "Ouachita" + }, + { + "zip_code": 71752, + "latitude": 33.373136, + "longitude": -93.18731, + "city": "Mc Neil", + "state": "AR", + "county": "Columbia" + }, + { + "zip_code": 71753, + "latitude": 33.206807, + "longitude": -93.224021, + "city": "Magnolia", + "state": "AR", + "county": "Columbia" + }, + { + "zip_code": 71754, + "latitude": 33.242571, + "longitude": -93.22996, + "city": "Magnolia", + "state": "AR", + "county": "Columbia" + }, + { + "zip_code": 71758, + "latitude": 33.302589, + "longitude": -92.817651, + "city": "Mount Holly", + "state": "AR", + "county": "Union" + }, + { + "zip_code": 71759, + "latitude": 33.321864, + "longitude": -92.646905, + "city": "Norphlet", + "state": "AR", + "county": "Union" + }, + { + "zip_code": 71762, + "latitude": 33.194725, + "longitude": -92.523809, + "city": "Smackover", + "state": "AR", + "county": "Union" + }, + { + "zip_code": 71763, + "latitude": 33.914288, + "longitude": -92.853193, + "city": "Sparkman", + "state": "AR", + "county": "Dallas" + }, + { + "zip_code": 71764, + "latitude": 33.46053, + "longitude": -93.011863, + "city": "Stephens", + "state": "AR", + "county": "Ouachita" + }, + { + "zip_code": 71765, + "latitude": 33.169586, + "longitude": -92.331829, + "city": "Strong", + "state": "AR", + "county": "Union" + }, + { + "zip_code": 71766, + "latitude": 33.776795, + "longitude": -92.48616, + "city": "Thornton", + "state": "AR", + "county": "Calhoun" + }, + { + "zip_code": 71767, + "latitude": 33.535994, + "longitude": -92.543915, + "city": "Hampton", + "state": "AR", + "county": "Calhoun" + }, + { + "zip_code": 71768, + "latitude": 33.198024, + "longitude": -92.52891, + "city": "Urbana", + "state": "AR", + "county": "Union" + }, + { + "zip_code": 71769, + "latitude": 33.236156, + "longitude": -93.234494, + "city": "Village", + "state": "AR", + "county": "Columbia" + }, + { + "zip_code": 71770, + "latitude": 33.350437, + "longitude": -93.302374, + "city": "Waldo", + "state": "AR", + "county": "Columbia" + }, + { + "zip_code": 71772, + "latitude": 33.832537, + "longitude": -93.1238, + "city": "Whelen Springs", + "state": "AR", + "county": "Clark" + }, + { + "zip_code": 71801, + "latitude": 33.673559, + "longitude": -93.606807, + "city": "Hope", + "state": "AR", + "county": "Hempstead" + }, + { + "zip_code": 71802, + "latitude": 33.765584, + "longitude": -93.559162, + "city": "Hope", + "state": "AR", + "county": "Hempstead" + }, + { + "zip_code": 71820, + "latitude": 33.778125, + "longitude": -94.270165, + "city": "Alleene", + "state": "AR", + "county": "Little River" + }, + { + "zip_code": 71822, + "latitude": 33.704625, + "longitude": -94.130221, + "city": "Ashdown", + "state": "AR", + "county": "Little River" + }, + { + "zip_code": 71823, + "latitude": 33.837053, + "longitude": -94.120289, + "city": "Ben Lomond", + "state": "AR", + "county": "Sevier" + }, + { + "zip_code": 71825, + "latitude": 33.882525, + "longitude": -93.621434, + "city": "Blevins", + "state": "AR", + "county": "Hempstead" + }, + { + "zip_code": 71826, + "latitude": 33.202695, + "longitude": -93.556966, + "city": "Bradley", + "state": "AR", + "county": "Lafayette" + }, + { + "zip_code": 71827, + "latitude": 33.397484, + "longitude": -93.434895, + "city": "Buckner", + "state": "AR", + "county": "Lafayette" + }, + { + "zip_code": 71828, + "latitude": 33.70082, + "longitude": -93.294126, + "city": "Cale", + "state": "AR", + "county": "Nevada" + }, + { + "zip_code": 71831, + "latitude": 33.793524, + "longitude": -93.807007, + "city": "Columbus", + "state": "AR", + "county": "Hempstead" + }, + { + "zip_code": 71832, + "latitude": 34.050929, + "longitude": -94.28072, + "city": "De Queen", + "state": "AR", + "county": "Sevier" + }, + { + "zip_code": 71833, + "latitude": 34.136218, + "longitude": -94.044286, + "city": "Dierks", + "state": "AR", + "county": "Howard" + }, + { + "zip_code": 71834, + "latitude": 33.441724, + "longitude": -94.023737, + "city": "Doddridge", + "state": "AR", + "county": "Miller" + }, + { + "zip_code": 71835, + "latitude": 33.761471, + "longitude": -93.42928, + "city": "Emmet", + "state": "AR", + "county": "Nevada" + }, + { + "zip_code": 71836, + "latitude": 33.734105, + "longitude": -94.37246, + "city": "Foreman", + "state": "AR", + "county": "Little River" + }, + { + "zip_code": 71837, + "latitude": 33.261629, + "longitude": -93.886621, + "city": "Fouke", + "state": "AR", + "county": "Miller" + }, + { + "zip_code": 71838, + "latitude": 33.669917, + "longitude": -93.79752, + "city": "Fulton", + "state": "AR", + "county": "Hempstead" + }, + { + "zip_code": 71839, + "latitude": 33.25024, + "longitude": -93.612966, + "city": "Garland City", + "state": "AR", + "county": "Lafayette" + }, + { + "zip_code": 71840, + "latitude": 33.316578, + "longitude": -93.854484, + "city": "Genoa", + "state": "AR", + "county": "Miller" + }, + { + "zip_code": 71841, + "latitude": 34.065882, + "longitude": -94.358778, + "city": "Gillham", + "state": "AR", + "county": "Sevier" + }, + { + "zip_code": 71842, + "latitude": 34.004404, + "longitude": -94.255693, + "city": "Horatio", + "state": "AR", + "county": "Sevier" + }, + { + "zip_code": 71844, + "latitude": 33.70082, + "longitude": -93.294126, + "city": "Laneburg", + "state": "AR", + "county": "Nevada" + }, + { + "zip_code": 71845, + "latitude": 33.292401, + "longitude": -93.597793, + "city": "Lewisville", + "state": "AR", + "county": "Lafayette" + }, + { + "zip_code": 71846, + "latitude": 33.967541, + "longitude": -94.194636, + "city": "Lockesburg", + "state": "AR", + "county": "Sevier" + }, + { + "zip_code": 71847, + "latitude": 33.915909, + "longitude": -93.61992, + "city": "Mc Caskill", + "state": "AR", + "county": "Hempstead" + }, + { + "zip_code": 71851, + "latitude": 33.895583, + "longitude": -93.925108, + "city": "Mineral Springs", + "state": "AR", + "county": "Howard" + }, + { + "zip_code": 71852, + "latitude": 34.024903, + "longitude": -93.942206, + "city": "Nashville", + "state": "AR", + "county": "Howard" + }, + { + "zip_code": 71853, + "latitude": 33.596108, + "longitude": -93.960638, + "city": "Ogden", + "state": "AR", + "county": "Little River" + }, + { + "zip_code": 71854, + "latitude": 33.431043, + "longitude": -93.876485, + "city": "Texarkana", + "state": "AR", + "county": "Miller" + }, + { + "zip_code": 71855, + "latitude": 33.83663, + "longitude": -93.732727, + "city": "Ozan", + "state": "AR", + "county": "Hempstead" + }, + { + "zip_code": 71857, + "latitude": 33.776791, + "longitude": -93.289132, + "city": "Prescott", + "state": "AR", + "county": "Nevada" + }, + { + "zip_code": 71858, + "latitude": 33.70082, + "longitude": -93.294126, + "city": "Rosston", + "state": "AR", + "county": "Nevada" + }, + { + "zip_code": 71859, + "latitude": 33.78127, + "longitude": -93.884355, + "city": "Saratoga", + "state": "AR", + "county": "Howard" + }, + { + "zip_code": 71860, + "latitude": 33.343809, + "longitude": -93.50573, + "city": "Stamps", + "state": "AR", + "county": "Lafayette" + }, + { + "zip_code": 71861, + "latitude": 33.112208, + "longitude": -93.322254, + "city": "Taylor", + "state": "AR", + "county": "Columbia" + }, + { + "zip_code": 71862, + "latitude": 33.776095, + "longitude": -93.713625, + "city": "Washington", + "state": "AR", + "county": "Hempstead" + }, + { + "zip_code": 71864, + "latitude": 33.70082, + "longitude": -93.294126, + "city": "Willisville", + "state": "AR", + "county": "Nevada" + }, + { + "zip_code": 71865, + "latitude": 33.733218, + "longitude": -94.147399, + "city": "Wilton", + "state": "AR", + "county": "Little River" + }, + { + "zip_code": 71866, + "latitude": 33.857142, + "longitude": -94.3748, + "city": "Winthrop", + "state": "AR", + "county": "Little River" + }, + { + "zip_code": 71901, + "latitude": 34.526841, + "longitude": -92.958697, + "city": "Hot Springs National Park", + "state": "AR", + "county": "Garland" + }, + { + "zip_code": 71902, + "latitude": 34.581374, + "longitude": -93.099403, + "city": "Hot Springs National Park", + "state": "AR", + "county": "Garland" + }, + { + "zip_code": 71903, + "latitude": 34.581374, + "longitude": -93.099403, + "city": "Hot Springs National Park", + "state": "AR", + "county": "Garland" + }, + { + "zip_code": 71909, + "latitude": 34.576246, + "longitude": -92.989435, + "city": "Hot Springs Village", + "state": "AR", + "county": "Garland" + }, + { + "zip_code": 71910, + "latitude": 34.581374, + "longitude": -93.099403, + "city": "Hot Springs Village", + "state": "AR", + "county": "Garland" + }, + { + "zip_code": 71913, + "latitude": 34.482214, + "longitude": -93.043902, + "city": "Hot Springs National Park", + "state": "AR", + "county": "Garland" + }, + { + "zip_code": 71914, + "latitude": 34.513682, + "longitude": -92.968531, + "city": "Hot Springs National Park", + "state": "AR", + "county": "Garland" + }, + { + "zip_code": 71920, + "latitude": 34.055486, + "longitude": -93.189406, + "city": "Alpine", + "state": "AR", + "county": "Clark" + }, + { + "zip_code": 71921, + "latitude": 34.232509, + "longitude": -93.313673, + "city": "Amity", + "state": "AR", + "county": "Clark" + }, + { + "zip_code": 71922, + "latitude": 34.146678, + "longitude": -93.653733, + "city": "Antoine", + "state": "AR", + "county": "Pike" + }, + { + "zip_code": 71923, + "latitude": 34.031343, + "longitude": -93.111452, + "city": "Arkadelphia", + "state": "AR", + "county": "Clark" + }, + { + "zip_code": 71929, + "latitude": 34.276538, + "longitude": -93.11742, + "city": "Bismarck", + "state": "AR", + "county": "Hot Spring" + }, + { + "zip_code": 71932, + "latitude": 34.537164, + "longitude": -94.0972, + "city": "Board Camp", + "state": "AR", + "county": "Polk" + }, + { + "zip_code": 71933, + "latitude": 34.356772, + "longitude": -93.350643, + "city": "Bonnerdale", + "state": "AR", + "county": "Hot Spring" + }, + { + "zip_code": 71935, + "latitude": 34.392489, + "longitude": -93.683883, + "city": "Caddo Gap", + "state": "AR", + "county": "Montgomery" + }, + { + "zip_code": 71937, + "latitude": 34.354193, + "longitude": -94.383483, + "city": "Cove", + "state": "AR", + "county": "Polk" + }, + { + "zip_code": 71940, + "latitude": 34.146678, + "longitude": -93.653733, + "city": "Delight", + "state": "AR", + "county": "Pike" + }, + { + "zip_code": 71941, + "latitude": 34.229869, + "longitude": -92.963796, + "city": "Donaldson", + "state": "AR", + "county": "Hot Spring" + }, + { + "zip_code": 71942, + "latitude": 34.223546, + "longitude": -93.002367, + "city": "Friendship", + "state": "AR", + "county": "Hot Spring" + }, + { + "zip_code": 71943, + "latitude": 34.206025, + "longitude": -93.589297, + "city": "Glenwood", + "state": "AR", + "county": "Pike" + }, + { + "zip_code": 71944, + "latitude": 34.338462, + "longitude": -94.356273, + "city": "Grannis", + "state": "AR", + "county": "Polk" + }, + { + "zip_code": 71945, + "latitude": 34.5019, + "longitude": -94.362242, + "city": "Hatfield", + "state": "AR", + "county": "Polk" + }, + { + "zip_code": 71946, + "latitude": 34.459413, + "longitude": -94.200221, + "city": "Hatton", + "state": "AR", + "county": "Polk" + }, + { + "zip_code": 71949, + "latitude": 34.709408, + "longitude": -93.038231, + "city": "Jessieville", + "state": "AR", + "county": "Garland" + }, + { + "zip_code": 71950, + "latitude": 34.146678, + "longitude": -93.653733, + "city": "Kirby", + "state": "AR", + "county": "Pike" + }, + { + "zip_code": 71951, + "latitude": 34.581374, + "longitude": -93.099403, + "city": "Hot Springs National Park", + "state": "AR", + "county": "Garland" + }, + { + "zip_code": 71952, + "latitude": 34.146678, + "longitude": -93.653733, + "city": "Langley", + "state": "AR", + "county": "Pike" + }, + { + "zip_code": 71953, + "latitude": 34.503699, + "longitude": -94.194756, + "city": "Mena", + "state": "AR", + "county": "Polk" + }, + { + "zip_code": 71956, + "latitude": 34.637603, + "longitude": -93.233142, + "city": "Mountain Pine", + "state": "AR", + "county": "Garland" + }, + { + "zip_code": 71957, + "latitude": 34.550661, + "longitude": -93.585206, + "city": "Mount Ida", + "state": "AR", + "county": "Montgomery" + }, + { + "zip_code": 71958, + "latitude": 34.050402, + "longitude": -93.75435, + "city": "Murfreesboro", + "state": "AR", + "county": "Pike" + }, + { + "zip_code": 71959, + "latitude": 34.146678, + "longitude": -93.653733, + "city": "Newhope", + "state": "AR", + "county": "Pike" + }, + { + "zip_code": 71960, + "latitude": 34.474709, + "longitude": -93.669613, + "city": "Norman", + "state": "AR", + "county": "Montgomery" + }, + { + "zip_code": 71961, + "latitude": 34.597982, + "longitude": -93.803388, + "city": "Oden", + "state": "AR", + "county": "Montgomery" + }, + { + "zip_code": 71962, + "latitude": 34.041476, + "longitude": -93.267115, + "city": "Okolona", + "state": "AR", + "county": "Clark" + }, + { + "zip_code": 71964, + "latitude": 34.431902, + "longitude": -93.249203, + "city": "Pearcy", + "state": "AR", + "county": "Garland" + }, + { + "zip_code": 71965, + "latitude": 34.651272, + "longitude": -93.740852, + "city": "Pencil Bluff", + "state": "AR", + "county": "Montgomery" + }, + { + "zip_code": 71966, + "latitude": 34.542995, + "longitude": -93.66463, + "city": "Oden", + "state": "AR", + "county": "Montgomery" + }, + { + "zip_code": 71968, + "latitude": 34.514125, + "longitude": -93.282723, + "city": "Royal", + "state": "AR", + "county": "Garland" + }, + { + "zip_code": 71969, + "latitude": 34.653145, + "longitude": -93.614286, + "city": "Sims", + "state": "AR", + "county": "Montgomery" + }, + { + "zip_code": 71970, + "latitude": 34.673248, + "longitude": -93.53027, + "city": "Story", + "state": "AR", + "county": "Montgomery" + }, + { + "zip_code": 71971, + "latitude": 34.294469, + "longitude": -94.095969, + "city": "Umpire", + "state": "AR", + "county": "Howard" + }, + { + "zip_code": 71972, + "latitude": 34.394091, + "longitude": -94.253511, + "city": "Vandervoort", + "state": "AR", + "county": "Polk" + }, + { + "zip_code": 71973, + "latitude": 34.307662, + "longitude": -94.36157, + "city": "Wickes", + "state": "AR", + "county": "Polk" + }, + { + "zip_code": 71998, + "latitude": 34.055486, + "longitude": -93.189406, + "city": "Arkadelphia", + "state": "AR", + "county": "Clark" + }, + { + "zip_code": 71999, + "latitude": 34.055486, + "longitude": -93.189406, + "city": "Arkadelphia", + "state": "AR", + "county": "Clark" + }, + { + "zip_code": 72001, + "latitude": 34.943809, + "longitude": -92.923191, + "city": "Adona", + "state": "AR", + "county": "Perry" + }, + { + "zip_code": 72002, + "latitude": 34.694468, + "longitude": -92.425087, + "city": "Alexander", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72003, + "latitude": 34.38443, + "longitude": -91.392364, + "city": "Almyra", + "state": "AR", + "county": "Arkansas" + }, + { + "zip_code": 72004, + "latitude": 34.284273, + "longitude": -91.698007, + "city": "Altheimer", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 72005, + "latitude": 35.502463, + "longitude": -91.081687, + "city": "Amagon", + "state": "AR", + "county": "Jackson" + }, + { + "zip_code": 72006, + "latitude": 35.207566, + "longitude": -91.372792, + "city": "Augusta", + "state": "AR", + "county": "Woodruff" + }, + { + "zip_code": 72007, + "latitude": 34.980269, + "longitude": -91.979545, + "city": "Austin", + "state": "AR", + "county": "Lonoke" + }, + { + "zip_code": 72010, + "latitude": 35.331399, + "longitude": -91.520754, + "city": "Bald Knob", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72011, + "latitude": 34.509071, + "longitude": -92.482828, + "city": "Bauxite", + "state": "AR", + "county": "Saline" + }, + { + "zip_code": 72012, + "latitude": 35.173395, + "longitude": -91.808393, + "city": "Beebe", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72013, + "latitude": 35.404671, + "longitude": -92.4808, + "city": "Bee Branch", + "state": "AR", + "county": "Van Buren" + }, + { + "zip_code": 72014, + "latitude": 35.418352, + "longitude": -91.116292, + "city": "Beedeville", + "state": "AR", + "county": "Jackson" + }, + { + "zip_code": 72015, + "latitude": 34.614356, + "longitude": -92.668034, + "city": "Benton", + "state": "AR", + "county": "Saline" + }, + { + "zip_code": 72016, + "latitude": 34.968975, + "longitude": -92.626882, + "city": "Bigelow", + "state": "AR", + "county": "Perry" + }, + { + "zip_code": 72017, + "latitude": 34.785525, + "longitude": -91.573785, + "city": "Biscoe", + "state": "AR", + "county": "Prairie" + }, + { + "zip_code": 72018, + "latitude": 34.597345, + "longitude": -92.622857, + "city": "Benton", + "state": "AR", + "county": "Saline" + }, + { + "zip_code": 72020, + "latitude": 35.380014, + "longitude": -91.525309, + "city": "Bradford", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72021, + "latitude": 34.883421, + "longitude": -91.194574, + "city": "Brinkley", + "state": "AR", + "county": "Monroe" + }, + { + "zip_code": 72022, + "latitude": 34.612417, + "longitude": -92.493519, + "city": "Bryant", + "state": "AR", + "county": "Saline" + }, + { + "zip_code": 72023, + "latitude": 34.826103, + "longitude": -91.931526, + "city": "Cabot", + "state": "AR", + "county": "Lonoke" + }, + { + "zip_code": 72024, + "latitude": 34.7309, + "longitude": -91.75149, + "city": "Carlisle", + "state": "AR", + "county": "Lonoke" + }, + { + "zip_code": 72025, + "latitude": 34.943809, + "longitude": -92.923191, + "city": "Casa", + "state": "AR", + "county": "Perry" + }, + { + "zip_code": 72026, + "latitude": 34.509537, + "longitude": -91.299038, + "city": "Casscoe", + "state": "AR", + "county": "Arkansas" + }, + { + "zip_code": 72027, + "latitude": 35.311464, + "longitude": -92.572763, + "city": "Center Ridge", + "state": "AR", + "county": "Conway" + }, + { + "zip_code": 72028, + "latitude": 35.57727, + "longitude": -92.545572, + "city": "Choctaw", + "state": "AR", + "county": "Van Buren" + }, + { + "zip_code": 72029, + "latitude": 34.745361, + "longitude": -91.247509, + "city": "Clarendon", + "state": "AR", + "county": "Monroe" + }, + { + "zip_code": 72030, + "latitude": 35.395535, + "longitude": -92.701955, + "city": "Cleveland", + "state": "AR", + "county": "Conway" + }, + { + "zip_code": 72031, + "latitude": 35.568709, + "longitude": -92.41875, + "city": "Clinton", + "state": "AR", + "county": "Van Buren" + }, + { + "zip_code": 72032, + "latitude": 35.146446, + "longitude": -92.376466, + "city": "Conway", + "state": "AR", + "county": "Faulkner" + }, + { + "zip_code": 72033, + "latitude": 35.105306, + "longitude": -92.354915, + "city": "Conway", + "state": "AR", + "county": "Faulkner" + }, + { + "zip_code": 72034, + "latitude": "", + "longitude": "", + "city": "Conway", + "state": "AR", + "county": "Faulkner" + }, + { + "zip_code": 72035, + "latitude": 35.105306, + "longitude": -92.354915, + "city": "Conway", + "state": "AR", + "county": "Faulkner" + }, + { + "zip_code": 72036, + "latitude": 35.004397, + "longitude": -91.252284, + "city": "Cotton Plant", + "state": "AR", + "county": "Woodruff" + }, + { + "zip_code": 72037, + "latitude": 34.541185, + "longitude": -91.875767, + "city": "Coy", + "state": "AR", + "county": "Lonoke" + }, + { + "zip_code": 72038, + "latitude": 34.459355, + "longitude": -91.317774, + "city": "Crocketts Bluff", + "state": "AR", + "county": "Arkansas" + }, + { + "zip_code": 72039, + "latitude": 35.302414, + "longitude": -92.401428, + "city": "Damascus", + "state": "AR", + "county": "Faulkner" + }, + { + "zip_code": 72040, + "latitude": 34.831514, + "longitude": -91.53744, + "city": "Des Arc", + "state": "AR", + "county": "Prairie" + }, + { + "zip_code": 72041, + "latitude": 34.787106, + "longitude": -91.465859, + "city": "De Valls Bluff", + "state": "AR", + "county": "Prairie" + }, + { + "zip_code": 72042, + "latitude": 34.2746, + "longitude": -91.414442, + "city": "De Witt", + "state": "AR", + "county": "Arkansas" + }, + { + "zip_code": 72043, + "latitude": 35.632918, + "longitude": -91.262651, + "city": "Diaz", + "state": "AR", + "county": "Jackson" + }, + { + "zip_code": 72044, + "latitude": 35.632128, + "longitude": -92.157022, + "city": "Edgemont", + "state": "AR", + "county": "Cleburne" + }, + { + "zip_code": 72045, + "latitude": 35.128619, + "longitude": -92.043231, + "city": "El Paso", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72046, + "latitude": 34.759526, + "longitude": -91.846164, + "city": "England", + "state": "AR", + "county": "Lonoke" + }, + { + "zip_code": 72047, + "latitude": 35.230211, + "longitude": -92.202242, + "city": "Enola", + "state": "AR", + "county": "Faulkner" + }, + { + "zip_code": 72048, + "latitude": 34.298173, + "longitude": -91.1484, + "city": "Ethel", + "state": "AR", + "county": "Arkansas" + }, + { + "zip_code": 72051, + "latitude": 35.91896, + "longitude": -92.127207, + "city": "Fox", + "state": "AR", + "county": "Stone" + }, + { + "zip_code": 72052, + "latitude": 35.144271, + "longitude": -91.77722, + "city": "Garner", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72053, + "latitude": 34.709342, + "longitude": -92.228271, + "city": "College Station", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72055, + "latitude": 34.126257, + "longitude": -91.347993, + "city": "Gillett", + "state": "AR", + "county": "Arkansas" + }, + { + "zip_code": 72057, + "latitude": 34.152591, + "longitude": -92.304314, + "city": "Grapevine", + "state": "AR", + "county": "Grant" + }, + { + "zip_code": 72058, + "latitude": 35.211744, + "longitude": -92.376242, + "city": "Greenbrier", + "state": "AR", + "county": "Faulkner" + }, + { + "zip_code": 72059, + "latitude": 35.179148, + "longitude": -91.259428, + "city": "Gregory", + "state": "AR", + "county": "Woodruff" + }, + { + "zip_code": 72060, + "latitude": 35.113187, + "longitude": -91.606092, + "city": "Griffithville", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72061, + "latitude": 35.322662, + "longitude": -92.334843, + "city": "Guy", + "state": "AR", + "county": "Faulkner" + }, + { + "zip_code": 72063, + "latitude": 35.318809, + "longitude": -92.67533, + "city": "Hattieville", + "state": "AR", + "county": "Conway" + }, + { + "zip_code": 72064, + "latitude": 34.782306, + "longitude": -91.569612, + "city": "Hazen", + "state": "AR", + "county": "Prairie" + }, + { + "zip_code": 72065, + "latitude": 34.520167, + "longitude": -92.205503, + "city": "Hensley", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72066, + "latitude": 34.785525, + "longitude": -91.573785, + "city": "Hickory Plains", + "state": "AR", + "county": "Prairie" + }, + { + "zip_code": 72067, + "latitude": 35.568521, + "longitude": -92.134082, + "city": "Higden", + "state": "AR", + "county": "Cleburne" + }, + { + "zip_code": 72068, + "latitude": 35.152032, + "longitude": -91.710779, + "city": "Higginson", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72069, + "latitude": 34.598059, + "longitude": -91.183945, + "city": "Holly Grove", + "state": "AR", + "county": "Monroe" + }, + { + "zip_code": 72070, + "latitude": 35.055779, + "longitude": -92.692323, + "city": "Houston", + "state": "AR", + "county": "Perry" + }, + { + "zip_code": 72071, + "latitude": 35.179148, + "longitude": -91.259428, + "city": "Howell", + "state": "AR", + "county": "Woodruff" + }, + { + "zip_code": 72072, + "latitude": 34.757194, + "longitude": -91.833442, + "city": "Humnoke", + "state": "AR", + "county": "Lonoke" + }, + { + "zip_code": 72073, + "latitude": 34.374078, + "longitude": -91.638613, + "city": "Humphrey", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 72074, + "latitude": 35.179148, + "longitude": -91.259428, + "city": "Hunter", + "state": "AR", + "county": "Woodruff" + }, + { + "zip_code": 72075, + "latitude": 35.641406, + "longitude": -91.307189, + "city": "Jacksonport", + "state": "AR", + "county": "Jackson" + }, + { + "zip_code": 72076, + "latitude": 34.918774, + "longitude": -92.15149, + "city": "Jacksonville", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72078, + "latitude": 34.751918, + "longitude": -92.392487, + "city": "Jacksonville", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72079, + "latitude": 34.402504, + "longitude": -92.150644, + "city": "Jefferson", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 72080, + "latitude": 35.427817, + "longitude": -92.819567, + "city": "Jerusalem", + "state": "AR", + "county": "Conway" + }, + { + "zip_code": 72081, + "latitude": 35.39438, + "longitude": -91.758198, + "city": "Judsonia", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72082, + "latitude": 35.14574, + "longitude": -91.847466, + "city": "Kensett", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72083, + "latitude": 34.60737, + "longitude": -92.014365, + "city": "Keo", + "state": "AR", + "county": "Lonoke" + }, + { + "zip_code": 72084, + "latitude": 34.218652, + "longitude": -92.613185, + "city": "Leola", + "state": "AR", + "county": "Grant" + }, + { + "zip_code": 72085, + "latitude": 35.359669, + "longitude": -91.820426, + "city": "Letona", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72086, + "latitude": 34.81247, + "longitude": -91.905399, + "city": "Lonoke", + "state": "AR", + "county": "Lonoke" + }, + { + "zip_code": 72087, + "latitude": 34.574419, + "longitude": -92.85784, + "city": "Lonsdale", + "state": "AR", + "county": "Garland" + }, + { + "zip_code": 72088, + "latitude": 35.602704, + "longitude": -92.274195, + "city": "Fairfield Bay", + "state": "AR", + "county": "Van Buren" + }, + { + "zip_code": 72089, + "latitude": 34.635041, + "longitude": -92.65974, + "city": "Bryant", + "state": "AR", + "county": "Saline" + }, + { + "zip_code": 72099, + "latitude": 34.788014, + "longitude": -92.217343, + "city": "Little Rock Air Force Base", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72101, + "latitude": 35.259987, + "longitude": -91.219846, + "city": "Mc Crory", + "state": "AR", + "county": "Woodruff" + }, + { + "zip_code": 72102, + "latitude": 35.246445, + "longitude": -91.848847, + "city": "Mc Rae", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72103, + "latitude": 34.647826, + "longitude": -92.384905, + "city": "Mabelvale", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72104, + "latitude": 34.36975, + "longitude": -92.839331, + "city": "Malvern", + "state": "AR", + "county": "Hot Spring" + }, + { + "zip_code": 72105, + "latitude": 34.39588, + "longitude": -92.851558, + "city": "Jones Mill", + "state": "AR", + "county": "Hot Spring" + }, + { + "zip_code": 72106, + "latitude": 34.963658, + "longitude": -92.423585, + "city": "Mayflower", + "state": "AR", + "county": "Faulkner" + }, + { + "zip_code": 72107, + "latitude": 35.153852, + "longitude": -92.552168, + "city": "Menifee", + "state": "AR", + "county": "Conway" + }, + { + "zip_code": 72108, + "latitude": 34.670187, + "longitude": -91.224126, + "city": "Monroe", + "state": "AR", + "county": "Monroe" + }, + { + "zip_code": 72110, + "latitude": 35.169237, + "longitude": -92.817379, + "city": "Morrilton", + "state": "AR", + "county": "Conway" + }, + { + "zip_code": 72111, + "latitude": 35.23159, + "longitude": -92.168875, + "city": "Mount Vernon", + "state": "AR", + "county": "Faulkner" + }, + { + "zip_code": 72112, + "latitude": 35.569278, + "longitude": -91.203951, + "city": "Newport", + "state": "AR", + "county": "Jackson" + }, + { + "zip_code": 72113, + "latitude": 34.857241, + "longitude": -92.390298, + "city": "Maumelle", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72114, + "latitude": 34.766561, + "longitude": -92.262899, + "city": "North Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72115, + "latitude": 34.751918, + "longitude": -92.392487, + "city": "North Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72116, + "latitude": 34.805945, + "longitude": -92.230488, + "city": "North Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72117, + "latitude": 34.765751, + "longitude": -92.152405, + "city": "North Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72118, + "latitude": 34.833714, + "longitude": -92.3289, + "city": "North Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72119, + "latitude": 34.80165, + "longitude": -92.259781, + "city": "North Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72120, + "latitude": 34.880689, + "longitude": -92.230285, + "city": "Sherwood", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72121, + "latitude": 35.329969, + "longitude": -91.652684, + "city": "Pangburn", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72122, + "latitude": 34.738557, + "longitude": -92.785514, + "city": "Paron", + "state": "AR", + "county": "Saline" + }, + { + "zip_code": 72123, + "latitude": 35.25881, + "longitude": -91.236983, + "city": "Patterson", + "state": "AR", + "county": "Woodruff" + }, + { + "zip_code": 72124, + "latitude": 34.751918, + "longitude": -92.392487, + "city": "North Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72125, + "latitude": 35.044346, + "longitude": -92.795821, + "city": "Perry", + "state": "AR", + "county": "Perry" + }, + { + "zip_code": 72126, + "latitude": 35.025904, + "longitude": -92.786535, + "city": "Perryville", + "state": "AR", + "county": "Perry" + }, + { + "zip_code": 72127, + "latitude": 35.15351, + "longitude": -92.662307, + "city": "Plumerville", + "state": "AR", + "county": "Conway" + }, + { + "zip_code": 72128, + "latitude": 34.3023, + "longitude": -92.609528, + "city": "Poyen", + "state": "AR", + "county": "Grant" + }, + { + "zip_code": 72129, + "latitude": 34.31491, + "longitude": -92.539414, + "city": "Prattsville", + "state": "AR", + "county": "Grant" + }, + { + "zip_code": 72130, + "latitude": 35.667434, + "longitude": -92.093319, + "city": "Prim", + "state": "AR", + "county": "Cleburne" + }, + { + "zip_code": 72131, + "latitude": 35.449492, + "longitude": -92.151804, + "city": "Quitman", + "state": "AR", + "county": "Cleburne" + }, + { + "zip_code": 72132, + "latitude": 34.436424, + "longitude": -92.150356, + "city": "Redfield", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 72133, + "latitude": 34.210031, + "longitude": -91.673115, + "city": "Reydell", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 72134, + "latitude": 34.670187, + "longitude": -91.224126, + "city": "Roe", + "state": "AR", + "county": "Monroe" + }, + { + "zip_code": 72135, + "latitude": 34.87923, + "longitude": -92.572248, + "city": "Roland", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72136, + "latitude": 35.235771, + "longitude": -92.014311, + "city": "Romance", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72137, + "latitude": 35.281826, + "longitude": -91.855634, + "city": "Rose Bud", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72139, + "latitude": 35.356592, + "longitude": -91.495392, + "city": "Russell", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72140, + "latitude": 34.337186, + "longitude": -91.139284, + "city": "Saint Charles", + "state": "AR", + "county": "Arkansas" + }, + { + "zip_code": 72141, + "latitude": 35.57727, + "longitude": -92.545572, + "city": "Scotland", + "state": "AR", + "county": "Van Buren" + }, + { + "zip_code": 72142, + "latitude": 34.670904, + "longitude": -92.152336, + "city": "Scott", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72143, + "latitude": 35.243622, + "longitude": -91.731729, + "city": "Searcy", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72145, + "latitude": 35.277393, + "longitude": -91.732556, + "city": "Searcy", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72149, + "latitude": 35.247376, + "longitude": -91.73139, + "city": "Searcy", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72150, + "latitude": 34.306936, + "longitude": -92.398709, + "city": "Sheridan", + "state": "AR", + "county": "Grant" + }, + { + "zip_code": 72152, + "latitude": 34.363527, + "longitude": -91.927642, + "city": "Sherrill", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 72153, + "latitude": 35.61711, + "longitude": -92.262595, + "city": "Shirley", + "state": "AR", + "county": "Van Buren" + }, + { + "zip_code": 72156, + "latitude": 35.267859, + "longitude": -92.673551, + "city": "Solgohachia", + "state": "AR", + "county": "Conway" + }, + { + "zip_code": 72157, + "latitude": 35.244463, + "longitude": -92.614982, + "city": "Springfield", + "state": "AR", + "county": "Conway" + }, + { + "zip_code": 72158, + "latitude": 34.635041, + "longitude": -92.65974, + "city": "Benton", + "state": "AR", + "county": "Saline" + }, + { + "zip_code": 72160, + "latitude": 34.387577, + "longitude": -91.419955, + "city": "Stuttgart", + "state": "AR", + "county": "Arkansas" + }, + { + "zip_code": 72164, + "latitude": 34.687292, + "longitude": -92.2399, + "city": "Sweet Home", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72165, + "latitude": 35.576231, + "longitude": -91.453861, + "city": "Thida", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72166, + "latitude": 34.079836, + "longitude": -91.227608, + "city": "Tichnor", + "state": "AR", + "county": "Arkansas" + }, + { + "zip_code": 72167, + "latitude": 34.469233, + "longitude": -92.658212, + "city": "Traskwood", + "state": "AR", + "county": "Saline" + }, + { + "zip_code": 72168, + "latitude": 34.431352, + "longitude": -91.96546, + "city": "Tucker", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 72169, + "latitude": 35.384449, + "longitude": -91.223248, + "city": "Tupelo", + "state": "AR", + "county": "Jackson" + }, + { + "zip_code": 72170, + "latitude": 34.577224, + "longitude": -91.463319, + "city": "Ulm", + "state": "AR", + "county": "Prairie" + }, + { + "zip_code": 72173, + "latitude": 35.104753, + "longitude": -92.228182, + "city": "Vilonia", + "state": "AR", + "county": "Faulkner" + }, + { + "zip_code": 72175, + "latitude": 34.348461, + "longitude": -91.862772, + "city": "Wabbaseka", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 72176, + "latitude": 34.988267, + "longitude": -91.905266, + "city": "Ward", + "state": "AR", + "county": "Lonoke" + }, + { + "zip_code": 72178, + "latitude": 35.203213, + "longitude": -91.606367, + "city": "West Point", + "state": "AR", + "county": "White" + }, + { + "zip_code": 72179, + "latitude": 35.510638, + "longitude": -91.864757, + "city": "Wilburn", + "state": "AR", + "county": "Cleburne" + }, + { + "zip_code": 72180, + "latitude": 34.533557, + "longitude": -92.221807, + "city": "Woodson", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72181, + "latitude": 35.187728, + "longitude": -92.449953, + "city": "Wooster", + "state": "AR", + "county": "Faulkner" + }, + { + "zip_code": 72182, + "latitude": 34.429059, + "longitude": -92.059863, + "city": "Wright", + "state": "AR", + "county": "Jefferson" + }, + { + "zip_code": 72183, + "latitude": 34.751918, + "longitude": -92.392487, + "city": "Wrightsville", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72189, + "latitude": 35.179148, + "longitude": -91.259428, + "city": "Mc Crory", + "state": "AR", + "county": "Woodruff" + }, + { + "zip_code": 72190, + "latitude": 34.751918, + "longitude": -92.392487, + "city": "North Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72199, + "latitude": 34.827174, + "longitude": -92.284718, + "city": "North Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72201, + "latitude": 34.755998, + "longitude": -92.284832, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72202, + "latitude": 34.752299, + "longitude": -92.290419, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72203, + "latitude": 34.883484, + "longitude": -92.390766, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72204, + "latitude": 34.711026, + "longitude": -92.297304, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72205, + "latitude": 34.742911, + "longitude": -92.346652, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72206, + "latitude": 34.624693, + "longitude": -92.29525, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72207, + "latitude": 34.772646, + "longitude": -92.340152, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72209, + "latitude": 34.674055, + "longitude": -92.368649, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72210, + "latitude": 34.723533, + "longitude": -92.478032, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72211, + "latitude": 34.783664, + "longitude": -92.430851, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72212, + "latitude": 34.800793, + "longitude": -92.441752, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72214, + "latitude": 34.762141, + "longitude": -92.228248, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72215, + "latitude": 34.751918, + "longitude": -92.392487, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72216, + "latitude": 34.817834, + "longitude": -92.235668, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72217, + "latitude": 34.830158, + "longitude": -92.170174, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72219, + "latitude": 34.751918, + "longitude": -92.392487, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72221, + "latitude": 34.751918, + "longitude": -92.392487, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72222, + "latitude": 34.751918, + "longitude": -92.392487, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72223, + "latitude": 34.790155, + "longitude": -92.504359, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72225, + "latitude": 34.751918, + "longitude": -92.392487, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72227, + "latitude": 34.775747, + "longitude": -92.372386, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72231, + "latitude": 34.80189, + "longitude": -92.189397, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72260, + "latitude": "", + "longitude": "", + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72295, + "latitude": 34.751918, + "longitude": -92.392487, + "city": "Little Rock", + "state": "AR", + "county": "Pulaski" + }, + { + "zip_code": 72301, + "latitude": 35.210811, + "longitude": -90.203849, + "city": "West Memphis", + "state": "AR", + "county": "Crittenden" + }, + { + "zip_code": 72303, + "latitude": 35.137366, + "longitude": -90.285543, + "city": "West Memphis", + "state": "AR", + "county": "Crittenden" + }, + { + "zip_code": 72310, + "latitude": 35.852046, + "longitude": -89.972762, + "city": "Armorel", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72311, + "latitude": 34.719477, + "longitude": -90.89691, + "city": "Aubrey", + "state": "AR", + "county": "Lee" + }, + { + "zip_code": 72312, + "latitude": 34.546696, + "longitude": -90.767879, + "city": "Barton", + "state": "AR", + "county": "Phillips" + }, + { + "zip_code": 72313, + "latitude": 35.712249, + "longitude": -90.028429, + "city": "Bassett", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72314, + "latitude": 35.357184, + "longitude": -90.677331, + "city": "Birdeye", + "state": "AR", + "county": "Cross" + }, + { + "zip_code": 72315, + "latitude": 35.754685, + "longitude": -89.926797, + "city": "Blytheville", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72316, + "latitude": 35.694942, + "longitude": -89.966819, + "city": "Blytheville", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72319, + "latitude": 35.694942, + "longitude": -89.966819, + "city": "Gosnell", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72320, + "latitude": 34.839836, + "longitude": -90.73371, + "city": "Brickeys", + "state": "AR", + "county": "Lee" + }, + { + "zip_code": 72321, + "latitude": 35.816872, + "longitude": -89.944221, + "city": "Burdette", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72322, + "latitude": 35.08844, + "longitude": -90.81081, + "city": "Caldwell", + "state": "AR", + "county": "Saint Francis" + }, + { + "zip_code": 72324, + "latitude": 35.340002, + "longitude": -90.788851, + "city": "Cherry Valley", + "state": "AR", + "county": "Cross" + }, + { + "zip_code": 72325, + "latitude": 35.286354, + "longitude": -90.253781, + "city": "Clarkedale", + "state": "AR", + "county": "Crittenden" + }, + { + "zip_code": 72326, + "latitude": 35.088055, + "longitude": -90.889489, + "city": "Colt", + "state": "AR", + "county": "Saint Francis" + }, + { + "zip_code": 72327, + "latitude": 35.232042, + "longitude": -90.35832, + "city": "Crawfordsville", + "state": "AR", + "county": "Crittenden" + }, + { + "zip_code": 72328, + "latitude": 34.382204, + "longitude": -90.82932, + "city": "Crumrod", + "state": "AR", + "county": "Phillips" + }, + { + "zip_code": 72329, + "latitude": 35.635225, + "longitude": -89.978877, + "city": "Driver", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72330, + "latitude": 35.593098, + "longitude": -90.21404, + "city": "Dyess", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72331, + "latitude": 35.270213, + "longitude": -90.355335, + "city": "Earle", + "state": "AR", + "county": "Crittenden" + }, + { + "zip_code": 72332, + "latitude": 35.119869, + "longitude": -90.304367, + "city": "Edmondson", + "state": "AR", + "county": "Crittenden" + }, + { + "zip_code": 72333, + "latitude": 34.311793, + "longitude": -90.893927, + "city": "Elaine", + "state": "AR", + "county": "Phillips" + }, + { + "zip_code": 72335, + "latitude": 35.026272, + "longitude": -90.859555, + "city": "Forrest City", + "state": "AR", + "county": "Saint Francis" + }, + { + "zip_code": 72336, + "latitude": 35.100867, + "longitude": -90.726069, + "city": "Forrest City", + "state": "AR", + "county": "Saint Francis" + }, + { + "zip_code": 72338, + "latitude": 35.459134, + "longitude": -90.188375, + "city": "Frenchmans Bayou", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72339, + "latitude": 35.405678, + "longitude": -90.27136, + "city": "Gilmore", + "state": "AR", + "county": "Crittenden" + }, + { + "zip_code": 72340, + "latitude": 34.935798, + "longitude": -91.029194, + "city": "Goodwin", + "state": "AR", + "county": "Saint Francis" + }, + { + "zip_code": 72341, + "latitude": 34.894534, + "longitude": -90.750779, + "city": "Haynes", + "state": "AR", + "county": "Lee" + }, + { + "zip_code": 72342, + "latitude": 34.45192, + "longitude": -90.751249, + "city": "Helena", + "state": "AR", + "county": "Phillips" + }, + { + "zip_code": 72346, + "latitude": 35.055842, + "longitude": -90.508034, + "city": "Heth", + "state": "AR", + "county": "Saint Francis" + }, + { + "zip_code": 72347, + "latitude": 35.358936, + "longitude": -90.958977, + "city": "Hickory Ridge", + "state": "AR", + "county": "Cross" + }, + { + "zip_code": 72348, + "latitude": 34.959855, + "longitude": -90.564357, + "city": "Hughes", + "state": "AR", + "county": "Saint Francis" + }, + { + "zip_code": 72350, + "latitude": 35.501635, + "longitude": -90.145752, + "city": "Joiner", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72351, + "latitude": 35.695435, + "longitude": -90.08845, + "city": "Keiser", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72352, + "latitude": 34.769714, + "longitude": -90.755195, + "city": "La Grange", + "state": "AR", + "county": "Lee" + }, + { + "zip_code": 72353, + "latitude": 34.328604, + "longitude": -90.965177, + "city": "Lambrook", + "state": "AR", + "county": "Phillips" + }, + { + "zip_code": 72354, + "latitude": 35.596339, + "longitude": -90.340023, + "city": "Lepanto", + "state": "AR", + "county": "Poinsett" + }, + { + "zip_code": 72355, + "latitude": 34.522109, + "longitude": -90.746809, + "city": "Lexa", + "state": "AR", + "county": "Phillips" + }, + { + "zip_code": 72358, + "latitude": 35.773408, + "longitude": -89.887854, + "city": "Luxora", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72359, + "latitude": 35.025243, + "longitude": -90.708551, + "city": "Madison", + "state": "AR", + "county": "Saint Francis" + }, + { + "zip_code": 72360, + "latitude": 34.768479, + "longitude": -90.783138, + "city": "Marianna", + "state": "AR", + "county": "Lee" + }, + { + "zip_code": 72364, + "latitude": 35.174997, + "longitude": -90.294424, + "city": "Marion", + "state": "AR", + "county": "Crittenden" + }, + { + "zip_code": 72365, + "latitude": 35.531267, + "longitude": -90.43642, + "city": "Marked Tree", + "state": "AR", + "county": "Poinsett" + }, + { + "zip_code": 72366, + "latitude": 34.5334, + "longitude": -90.954242, + "city": "Marvell", + "state": "AR", + "county": "Phillips" + }, + { + "zip_code": 72367, + "latitude": 34.25968, + "longitude": -90.936604, + "city": "Mellwood", + "state": "AR", + "county": "Phillips" + }, + { + "zip_code": 72368, + "latitude": 34.791849, + "longitude": -90.935139, + "city": "Moro", + "state": "AR", + "county": "Lee" + }, + { + "zip_code": 72369, + "latitude": 34.443028, + "longitude": -90.785809, + "city": "Oneida", + "state": "AR", + "county": "Phillips" + }, + { + "zip_code": 72370, + "latitude": 35.646832, + "longitude": -90.094653, + "city": "Osceola", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72372, + "latitude": 35.027132, + "longitude": -90.901168, + "city": "Palestine", + "state": "AR", + "county": "Saint Francis" + }, + { + "zip_code": 72373, + "latitude": 35.293247, + "longitude": -90.635505, + "city": "Parkin", + "state": "AR", + "county": "Cross" + }, + { + "zip_code": 72374, + "latitude": 34.571702, + "longitude": -90.819627, + "city": "Poplar Grove", + "state": "AR", + "county": "Phillips" + }, + { + "zip_code": 72376, + "latitude": 35.116116, + "longitude": -90.238064, + "city": "Proctor", + "state": "AR", + "county": "Crittenden" + }, + { + "zip_code": 72377, + "latitude": 35.674952, + "longitude": -90.346901, + "city": "Rivervale", + "state": "AR", + "county": "Poinsett" + }, + { + "zip_code": 72379, + "latitude": 33.818318, + "longitude": -91.214054, + "city": "Snow Lake", + "state": "AR", + "county": "Desha" + }, + { + "zip_code": 72381, + "latitude": 35.694942, + "longitude": -89.966819, + "city": "Tomato", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72383, + "latitude": 34.498511, + "longitude": -91.027962, + "city": "Turner", + "state": "AR", + "county": "Phillips" + }, + { + "zip_code": 72384, + "latitude": 35.343902, + "longitude": -90.297822, + "city": "Turrell", + "state": "AR", + "county": "Crittenden" + }, + { + "zip_code": 72385, + "latitude": 35.296539, + "longitude": -90.772419, + "city": "Twist", + "state": "AR", + "county": "Cross" + }, + { + "zip_code": 72386, + "latitude": 35.49813, + "longitude": -90.397619, + "city": "Tyronza", + "state": "AR", + "county": "Poinsett" + }, + { + "zip_code": 72387, + "latitude": 35.3182, + "longitude": -90.771505, + "city": "Vanndale", + "state": "AR", + "county": "Cross" + }, + { + "zip_code": 72389, + "latitude": 34.346621, + "longitude": -90.886949, + "city": "Wabash", + "state": "AR", + "county": "Phillips" + }, + { + "zip_code": 72390, + "latitude": 34.530216, + "longitude": -90.681442, + "city": "West Helena", + "state": "AR", + "county": "Phillips" + }, + { + "zip_code": 72391, + "latitude": 35.694942, + "longitude": -89.966819, + "city": "West Ridge", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72392, + "latitude": 34.950619, + "longitude": -91.091003, + "city": "Wheatley", + "state": "AR", + "county": "Saint Francis" + }, + { + "zip_code": 72394, + "latitude": 35.030375, + "longitude": -90.800681, + "city": "Widener", + "state": "AR", + "county": "Saint Francis" + }, + { + "zip_code": 72395, + "latitude": 35.63816, + "longitude": -90.043135, + "city": "Wilson", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72396, + "latitude": 35.274844, + "longitude": -90.798946, + "city": "Wynne", + "state": "AR", + "county": "Cross" + }, + { + "zip_code": 72401, + "latitude": 35.835847, + "longitude": -90.623071, + "city": "Jonesboro", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72402, + "latitude": 35.80881, + "longitude": -90.652887, + "city": "Jonesboro", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72403, + "latitude": 35.830541, + "longitude": -90.703915, + "city": "Jonesboro", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72404, + "latitude": 35.779183, + "longitude": -90.766012, + "city": "Jonesboro", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72410, + "latitude": 35.952057, + "longitude": -91.030074, + "city": "Alicia", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72411, + "latitude": 35.810496, + "longitude": -90.641731, + "city": "Bay", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72412, + "latitude": 36.128069, + "longitude": -90.691421, + "city": "Beech Grove", + "state": "AR", + "county": "Greene" + }, + { + "zip_code": 72413, + "latitude": 36.284433, + "longitude": -90.853751, + "city": "Biggers", + "state": "AR", + "county": "Randolph" + }, + { + "zip_code": 72414, + "latitude": 35.836846, + "longitude": -90.400484, + "city": "Black Oak", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72415, + "latitude": 36.132344, + "longitude": -91.187361, + "city": "Black Rock", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72416, + "latitude": 35.85642, + "longitude": -90.627804, + "city": "Bono", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72417, + "latitude": 35.891366, + "longitude": -90.489547, + "city": "Brookland", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72419, + "latitude": 35.767307, + "longitude": -90.338001, + "city": "Caraway", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72421, + "latitude": 35.795933, + "longitude": -90.963448, + "city": "Cash", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72422, + "latitude": 36.379467, + "longitude": -90.538667, + "city": "Corning", + "state": "AR", + "county": "Clay" + }, + { + "zip_code": 72424, + "latitude": 36.384747, + "longitude": -90.730808, + "city": "Datto", + "state": "AR", + "county": "Clay" + }, + { + "zip_code": 72425, + "latitude": 36.208255, + "longitude": -90.721173, + "city": "Delaplaine", + "state": "AR", + "county": "Greene" + }, + { + "zip_code": 72426, + "latitude": 35.881256, + "longitude": -90.054689, + "city": "Dell", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72427, + "latitude": 35.863996, + "longitude": -90.94278, + "city": "Egypt", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72428, + "latitude": 35.733677, + "longitude": -90.183815, + "city": "Etowah", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72429, + "latitude": 35.503918, + "longitude": -90.944428, + "city": "Fisher", + "state": "AR", + "county": "Poinsett" + }, + { + "zip_code": 72430, + "latitude": 36.327813, + "longitude": -90.182485, + "city": "Greenway", + "state": "AR", + "county": "Clay" + }, + { + "zip_code": 72431, + "latitude": 35.654913, + "longitude": -91.079185, + "city": "Grubbs", + "state": "AR", + "county": "Jackson" + }, + { + "zip_code": 72432, + "latitude": 35.575374, + "longitude": -90.791023, + "city": "Harrisburg", + "state": "AR", + "county": "Poinsett" + }, + { + "zip_code": 72433, + "latitude": 36.050395, + "longitude": -91.021301, + "city": "Hoxie", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72434, + "latitude": 36.183681, + "longitude": -91.215672, + "city": "Imboden", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72435, + "latitude": 36.360817, + "longitude": -90.472819, + "city": "Knobel", + "state": "AR", + "county": "Clay" + }, + { + "zip_code": 72436, + "latitude": 36.202584, + "longitude": -90.469652, + "city": "Lafe", + "state": "AR", + "county": "Greene" + }, + { + "zip_code": 72437, + "latitude": 35.824808, + "longitude": -90.510018, + "city": "Lake City", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72438, + "latitude": 35.884302, + "longitude": -90.210167, + "city": "Leachville", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72439, + "latitude": 36.06805, + "longitude": -90.748876, + "city": "Light", + "state": "AR", + "county": "Greene" + }, + { + "zip_code": 72440, + "latitude": 36.015239, + "longitude": -91.229356, + "city": "Lynn", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72441, + "latitude": 36.429953, + "longitude": -90.386431, + "city": "Mc Dougal", + "state": "AR", + "county": "Clay" + }, + { + "zip_code": 72442, + "latitude": 35.843919, + "longitude": -90.1806, + "city": "Manila", + "state": "AR", + "county": "Mississippi" + }, + { + "zip_code": 72443, + "latitude": 36.156146, + "longitude": -90.39974, + "city": "Marmaduke", + "state": "AR", + "county": "Greene" + }, + { + "zip_code": 72444, + "latitude": 36.396694, + "longitude": -90.936899, + "city": "Maynard", + "state": "AR", + "county": "Randolph" + }, + { + "zip_code": 72445, + "latitude": 35.974287, + "longitude": -91.031799, + "city": "Minturn", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72447, + "latitude": 35.909972, + "longitude": -90.347446, + "city": "Monette", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72449, + "latitude": 36.306745, + "longitude": -91.07791, + "city": "O Kean", + "state": "AR", + "county": "Randolph" + }, + { + "zip_code": 72450, + "latitude": 36.113222, + "longitude": -90.551092, + "city": "Paragould", + "state": "AR", + "county": "Greene" + }, + { + "zip_code": 72451, + "latitude": 36.11635, + "longitude": -90.525077, + "city": "Paragould", + "state": "AR", + "county": "Greene" + }, + { + "zip_code": 72453, + "latitude": 36.277564, + "longitude": -90.687882, + "city": "Peach Orchard", + "state": "AR", + "county": "Clay" + }, + { + "zip_code": 72454, + "latitude": 36.378787, + "longitude": -90.313223, + "city": "Piggott", + "state": "AR", + "county": "Clay" + }, + { + "zip_code": 72455, + "latitude": 36.324042, + "longitude": -91.084748, + "city": "Pocahontas", + "state": "AR", + "county": "Randolph" + }, + { + "zip_code": 72456, + "latitude": 36.38157, + "longitude": -90.375252, + "city": "Pollard", + "state": "AR", + "county": "Clay" + }, + { + "zip_code": 72457, + "latitude": 36.082104, + "longitude": -91.047594, + "city": "Portia", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72458, + "latitude": 36.053597, + "longitude": -91.218089, + "city": "Powhatan", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72459, + "latitude": 36.18246, + "longitude": -91.223314, + "city": "Ravenden", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72460, + "latitude": 36.337228, + "longitude": -91.009405, + "city": "Ravenden Springs", + "state": "AR", + "county": "Randolph" + }, + { + "zip_code": 72461, + "latitude": 36.310788, + "longitude": -90.329565, + "city": "Rector", + "state": "AR", + "county": "Clay" + }, + { + "zip_code": 72462, + "latitude": 36.351441, + "longitude": -90.780125, + "city": "Reyno", + "state": "AR", + "county": "Randolph" + }, + { + "zip_code": 72464, + "latitude": 36.454544, + "longitude": -90.142521, + "city": "Saint Francis", + "state": "AR", + "county": "Clay" + }, + { + "zip_code": 72465, + "latitude": 35.964317, + "longitude": -90.895421, + "city": "Sedgwick", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72466, + "latitude": 36.057939, + "longitude": -91.240065, + "city": "Smithville", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72467, + "latitude": 35.842196, + "longitude": -90.673464, + "city": "State University", + "state": "AR", + "county": "Craighead" + }, + { + "zip_code": 72469, + "latitude": 35.967306, + "longitude": -91.293503, + "city": "Strawberry", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72470, + "latitude": 36.429663, + "longitude": -90.692099, + "city": "Success", + "state": "AR", + "county": "Clay" + }, + { + "zip_code": 72471, + "latitude": 35.817646, + "longitude": -91.092685, + "city": "Swifton", + "state": "AR", + "county": "Jackson" + }, + { + "zip_code": 72472, + "latitude": 35.588215, + "longitude": -90.561977, + "city": "Trumann", + "state": "AR", + "county": "Poinsett" + }, + { + "zip_code": 72473, + "latitude": 35.71528, + "longitude": -91.173296, + "city": "Tuckerman", + "state": "AR", + "county": "Jackson" + }, + { + "zip_code": 72474, + "latitude": 36.041332, + "longitude": -90.671802, + "city": "Walcott", + "state": "AR", + "county": "Greene" + }, + { + "zip_code": 72475, + "latitude": 35.546575, + "longitude": -90.965815, + "city": "Waldenburg", + "state": "AR", + "county": "Poinsett" + }, + { + "zip_code": 72476, + "latitude": 36.042979, + "longitude": -90.998707, + "city": "Walnut Ridge", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72478, + "latitude": 36.44533, + "longitude": -91.054035, + "city": "Warm Springs", + "state": "AR", + "county": "Randolph" + }, + { + "zip_code": 72479, + "latitude": 35.611992, + "longitude": -90.873808, + "city": "Weiner", + "state": "AR", + "county": "Poinsett" + }, + { + "zip_code": 72482, + "latitude": 36.285559, + "longitude": -91.355691, + "city": "Williford", + "state": "AR", + "county": "Sharp" + }, + { + "zip_code": 72501, + "latitude": 35.768738, + "longitude": -91.652338, + "city": "Batesville", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72503, + "latitude": 35.734617, + "longitude": -91.534303, + "city": "Batesville", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72512, + "latitude": 36.185457, + "longitude": -91.915187, + "city": "Horseshoe Bend", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72513, + "latitude": 36.234637, + "longitude": -91.568849, + "city": "Ash Flat", + "state": "AR", + "county": "Sharp" + }, + { + "zip_code": 72515, + "latitude": 36.374704, + "longitude": -91.804608, + "city": "Bexar", + "state": "AR", + "county": "Fulton" + }, + { + "zip_code": 72516, + "latitude": 36.064329, + "longitude": -91.944673, + "city": "Boswell", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72517, + "latitude": 36.121391, + "longitude": -92.134903, + "city": "Brockwell", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72519, + "latitude": 36.178897, + "longitude": -92.129961, + "city": "Calico Rock", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72520, + "latitude": 36.374704, + "longitude": -91.804608, + "city": "Camp", + "state": "AR", + "county": "Fulton" + }, + { + "zip_code": 72521, + "latitude": 35.948292, + "longitude": -91.5317, + "city": "Cave City", + "state": "AR", + "county": "Sharp" + }, + { + "zip_code": 72522, + "latitude": 35.803978, + "longitude": -91.456609, + "city": "Charlotte", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72523, + "latitude": 35.642663, + "longitude": -91.857781, + "city": "Concord", + "state": "AR", + "county": "Cleburne" + }, + { + "zip_code": 72524, + "latitude": 35.843546, + "longitude": -91.36155, + "city": "Cord", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72525, + "latitude": 36.295879, + "longitude": -91.488845, + "city": "Cherokee Village", + "state": "AR", + "county": "Sharp" + }, + { + "zip_code": 72526, + "latitude": 35.872871, + "longitude": -91.758171, + "city": "Cushman", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72527, + "latitude": 35.726232, + "longitude": -91.603429, + "city": "Desha", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72528, + "latitude": 36.064329, + "longitude": -91.944673, + "city": "Dolph", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72529, + "latitude": 36.298192, + "longitude": -91.534657, + "city": "Cherokee Village", + "state": "AR", + "county": "Sharp" + }, + { + "zip_code": 72530, + "latitude": 35.607847, + "longitude": -92.022867, + "city": "Drasco", + "state": "AR", + "county": "Cleburne" + }, + { + "zip_code": 72531, + "latitude": 36.374704, + "longitude": -91.804608, + "city": "Elizabeth", + "state": "AR", + "county": "Fulton" + }, + { + "zip_code": 72532, + "latitude": 36.061757, + "longitude": -91.607603, + "city": "Evening Shade", + "state": "AR", + "county": "Sharp" + }, + { + "zip_code": 72533, + "latitude": 35.91896, + "longitude": -92.127207, + "city": "Fifty Six", + "state": "AR", + "county": "Stone" + }, + { + "zip_code": 72534, + "latitude": 35.663046, + "longitude": -91.712976, + "city": "Floral", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72536, + "latitude": 36.064329, + "longitude": -91.944673, + "city": "Franklin", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72537, + "latitude": 36.42957, + "longitude": -92.325688, + "city": "Gamaliel", + "state": "AR", + "county": "Baxter" + }, + { + "zip_code": 72538, + "latitude": 36.370988, + "longitude": -91.823914, + "city": "Gepp", + "state": "AR", + "county": "Fulton" + }, + { + "zip_code": 72539, + "latitude": 36.374704, + "longitude": -91.804608, + "city": "Glencoe", + "state": "AR", + "county": "Fulton" + }, + { + "zip_code": 72540, + "latitude": 36.064329, + "longitude": -91.944673, + "city": "Guion", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72542, + "latitude": 36.178441, + "longitude": -91.481669, + "city": "Hardy", + "state": "AR", + "county": "Sharp" + }, + { + "zip_code": 72543, + "latitude": 35.453106, + "longitude": -91.98883, + "city": "Heber Springs", + "state": "AR", + "county": "Cleburne" + }, + { + "zip_code": 72544, + "latitude": 36.410457, + "longitude": -92.195113, + "city": "Henderson", + "state": "AR", + "county": "Baxter" + }, + { + "zip_code": 72545, + "latitude": 35.535238, + "longitude": -92.021291, + "city": "Heber Springs", + "state": "AR", + "county": "Cleburne" + }, + { + "zip_code": 72546, + "latitude": 35.581607, + "longitude": -91.930535, + "city": "Ida", + "state": "AR", + "county": "Cleburne" + }, + { + "zip_code": 72550, + "latitude": 35.712421, + "longitude": -91.778953, + "city": "Locust Grove", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72553, + "latitude": 35.707658, + "longitude": -91.474841, + "city": "Magness", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72554, + "latitude": 36.492437, + "longitude": -91.546818, + "city": "Mammoth Spring", + "state": "AR", + "county": "Fulton" + }, + { + "zip_code": 72555, + "latitude": 35.91896, + "longitude": -92.127207, + "city": "Marcella", + "state": "AR", + "county": "Stone" + }, + { + "zip_code": 72556, + "latitude": 36.063529, + "longitude": -91.907947, + "city": "Melbourne", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72557, + "latitude": 36.374704, + "longitude": -91.804608, + "city": "Moko", + "state": "AR", + "county": "Fulton" + }, + { + "zip_code": 72560, + "latitude": 35.820825, + "longitude": -92.038894, + "city": "Mountain View", + "state": "AR", + "county": "Stone" + }, + { + "zip_code": 72561, + "latitude": 35.961824, + "longitude": -91.819741, + "city": "Mount Pleasant", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72562, + "latitude": 35.732409, + "longitude": -91.42517, + "city": "Newark", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72564, + "latitude": 35.59985, + "longitude": -91.475445, + "city": "Oil Trough", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72565, + "latitude": 36.064329, + "longitude": -91.944673, + "city": "Oxford", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72566, + "latitude": 36.157991, + "longitude": -92.112983, + "city": "Pineville", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72567, + "latitude": 35.91896, + "longitude": -92.127207, + "city": "Pleasant Grove", + "state": "AR", + "county": "Stone" + }, + { + "zip_code": 72568, + "latitude": 35.654477, + "longitude": -91.619627, + "city": "Pleasant Plains", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72569, + "latitude": 36.046345, + "longitude": -91.455012, + "city": "Poughkeepsie", + "state": "AR", + "county": "Sharp" + }, + { + "zip_code": 72571, + "latitude": 35.645494, + "longitude": -91.536246, + "city": "Rosie", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72572, + "latitude": 35.953043, + "longitude": -91.283897, + "city": "Saffell", + "state": "AR", + "county": "Lawrence" + }, + { + "zip_code": 72573, + "latitude": 36.064329, + "longitude": -91.944673, + "city": "Sage", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72575, + "latitude": 35.691868, + "longitude": -91.598917, + "city": "Salado", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72576, + "latitude": 36.425836, + "longitude": -91.699502, + "city": "Salem", + "state": "AR", + "county": "Fulton" + }, + { + "zip_code": 72577, + "latitude": 36.066371, + "longitude": -91.64203, + "city": "Sidney", + "state": "AR", + "county": "Sharp" + }, + { + "zip_code": 72578, + "latitude": 36.374704, + "longitude": -91.804608, + "city": "Sturkie", + "state": "AR", + "county": "Fulton" + }, + { + "zip_code": 72579, + "latitude": 35.762212, + "longitude": -91.531986, + "city": "Sulphur Rock", + "state": "AR", + "county": "Independence" + }, + { + "zip_code": 72581, + "latitude": 35.570591, + "longitude": -91.929979, + "city": "Tumbling Shoals", + "state": "AR", + "county": "Cleburne" + }, + { + "zip_code": 72583, + "latitude": 36.392508, + "longitude": -91.93942, + "city": "Viola", + "state": "AR", + "county": "Fulton" + }, + { + "zip_code": 72584, + "latitude": 36.064329, + "longitude": -91.944673, + "city": "Violet Hill", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72585, + "latitude": 36.064329, + "longitude": -91.944673, + "city": "Wideman", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72587, + "latitude": 36.064329, + "longitude": -91.944673, + "city": "Wiseman", + "state": "AR", + "county": "Izard" + }, + { + "zip_code": 72601, + "latitude": 36.295086, + "longitude": -93.092861, + "city": "Harrison", + "state": "AR", + "county": "Boone" + }, + { + "zip_code": 72602, + "latitude": 36.355213, + "longitude": -93.122554, + "city": "Harrison", + "state": "AR", + "county": "Boone" + }, + { + "zip_code": 72610, + "latitude": 35.91896, + "longitude": -92.127207, + "city": "Alco", + "state": "AR", + "county": "Stone" + }, + { + "zip_code": 72611, + "latitude": 36.310814, + "longitude": -93.252276, + "city": "Alpena", + "state": "AR", + "county": "Boone" + }, + { + "zip_code": 72613, + "latitude": 36.431111, + "longitude": -93.699392, + "city": "Beaver", + "state": "AR", + "county": "Carroll" + }, + { + "zip_code": 72615, + "latitude": 36.308349, + "longitude": -93.032099, + "city": "Bergman", + "state": "AR", + "county": "Boone" + }, + { + "zip_code": 72616, + "latitude": 36.316779, + "longitude": -93.5616, + "city": "Berryville", + "state": "AR", + "county": "Carroll" + }, + { + "zip_code": 72617, + "latitude": 36.23638, + "longitude": -92.372635, + "city": "Big Flat", + "state": "AR", + "county": "Baxter" + }, + { + "zip_code": 72619, + "latitude": 36.318875, + "longitude": -92.629141, + "city": "Bull Shoals", + "state": "AR", + "county": "Marion" + }, + { + "zip_code": 72623, + "latitude": 36.472426, + "longitude": -92.329645, + "city": "Clarkridge", + "state": "AR", + "county": "Baxter" + }, + { + "zip_code": 72624, + "latitude": 35.924868, + "longitude": -93.232298, + "city": "Compton", + "state": "AR", + "county": "Newton" + }, + { + "zip_code": 72626, + "latitude": 36.308162, + "longitude": -92.542469, + "city": "Cotter", + "state": "AR", + "county": "Baxter" + }, + { + "zip_code": 72628, + "latitude": 35.924868, + "longitude": -93.232298, + "city": "Deer", + "state": "AR", + "county": "Newton" + }, + { + "zip_code": 72629, + "latitude": 35.57727, + "longitude": -92.545572, + "city": "Dennard", + "state": "AR", + "county": "Van Buren" + }, + { + "zip_code": 72630, + "latitude": 36.458431, + "longitude": -92.913268, + "city": "Diamond City", + "state": "AR", + "county": "Boone" + }, + { + "zip_code": 72631, + "latitude": 36.435013, + "longitude": -93.767298, + "city": "Eureka Springs", + "state": "AR", + "county": "Carroll" + }, + { + "zip_code": 72632, + "latitude": 36.399338, + "longitude": -93.755084, + "city": "Eureka Springs", + "state": "AR", + "county": "Carroll" + }, + { + "zip_code": 72633, + "latitude": 36.164402, + "longitude": -92.953069, + "city": "Everton", + "state": "AR", + "county": "Boone" + }, + { + "zip_code": 72634, + "latitude": 36.317483, + "longitude": -92.595011, + "city": "Flippin", + "state": "AR", + "county": "Marion" + }, + { + "zip_code": 72635, + "latitude": 36.318799, + "longitude": -92.487866, + "city": "Gassville", + "state": "AR", + "county": "Baxter" + }, + { + "zip_code": 72636, + "latitude": 35.916744, + "longitude": -92.681408, + "city": "Gilbert", + "state": "AR", + "county": "Searcy" + }, + { + "zip_code": 72638, + "latitude": 36.310046, + "longitude": -93.57875, + "city": "Green Forest", + "state": "AR", + "county": "Carroll" + }, + { + "zip_code": 72639, + "latitude": 35.916744, + "longitude": -92.681408, + "city": "Harriet", + "state": "AR", + "county": "Searcy" + }, + { + "zip_code": 72640, + "latitude": 35.924868, + "longitude": -93.232298, + "city": "Hasty", + "state": "AR", + "county": "Newton" + }, + { + "zip_code": 72641, + "latitude": 36.005808, + "longitude": -93.187651, + "city": "Jasper", + "state": "AR", + "county": "Newton" + }, + { + "zip_code": 72642, + "latitude": 36.372572, + "longitude": -92.494857, + "city": "Lakeview", + "state": "AR", + "county": "Baxter" + }, + { + "zip_code": 72644, + "latitude": 36.384844, + "longitude": -93.003892, + "city": "Lead Hill", + "state": "AR", + "county": "Boone" + }, + { + "zip_code": 72645, + "latitude": 35.835751, + "longitude": -92.554222, + "city": "Leslie", + "state": "AR", + "county": "Searcy" + }, + { + "zip_code": 72648, + "latitude": 35.924868, + "longitude": -93.232298, + "city": "Marble Falls", + "state": "AR", + "county": "Newton" + }, + { + "zip_code": 72650, + "latitude": 35.908133, + "longitude": -92.63861, + "city": "Marshall", + "state": "AR", + "county": "Searcy" + }, + { + "zip_code": 72651, + "latitude": 36.37792, + "longitude": -92.474246, + "city": "Midway", + "state": "AR", + "county": "Baxter" + }, + { + "zip_code": 72653, + "latitude": 36.318679, + "longitude": -92.372153, + "city": "Mountain Home", + "state": "AR", + "county": "Baxter" + }, + { + "zip_code": 72654, + "latitude": 36.23638, + "longitude": -92.372635, + "city": "Mountain Home", + "state": "AR", + "county": "Baxter" + }, + { + "zip_code": 72655, + "latitude": 35.940667, + "longitude": -93.065393, + "city": "Mount Judea", + "state": "AR", + "county": "Newton" + }, + { + "zip_code": 72657, + "latitude": 35.91896, + "longitude": -92.127207, + "city": "Timbo", + "state": "AR", + "county": "Stone" + }, + { + "zip_code": 72658, + "latitude": 36.250583, + "longitude": -92.310805, + "city": "Norfork", + "state": "AR", + "county": "Baxter" + }, + { + "zip_code": 72659, + "latitude": 36.23638, + "longitude": -92.372635, + "city": "Norfork", + "state": "AR", + "county": "Baxter" + }, + { + "zip_code": 72660, + "latitude": 36.466366, + "longitude": -93.370349, + "city": "Oak Grove", + "state": "AR", + "county": "Carroll" + }, + { + "zip_code": 72661, + "latitude": 36.457556, + "longitude": -92.581535, + "city": "Oakland", + "state": "AR", + "county": "Marion" + }, + { + "zip_code": 72662, + "latitude": 36.421611, + "longitude": -93.166451, + "city": "Omaha", + "state": "AR", + "county": "Boone" + }, + { + "zip_code": 72663, + "latitude": 35.91896, + "longitude": -92.127207, + "city": "Onia", + "state": "AR", + "county": "Stone" + }, + { + "zip_code": 72666, + "latitude": 35.924868, + "longitude": -93.232298, + "city": "Parthenon", + "state": "AR", + "county": "Newton" + }, + { + "zip_code": 72668, + "latitude": 36.280677, + "longitude": -92.648858, + "city": "Peel", + "state": "AR", + "county": "Marion" + }, + { + "zip_code": 72669, + "latitude": 35.916744, + "longitude": -92.681408, + "city": "Pindall", + "state": "AR", + "county": "Searcy" + }, + { + "zip_code": 72670, + "latitude": 35.924868, + "longitude": -93.232298, + "city": "Ponca", + "state": "AR", + "county": "Newton" + }, + { + "zip_code": 72672, + "latitude": 36.248623, + "longitude": -92.841645, + "city": "Pyatt", + "state": "AR", + "county": "Marion" + }, + { + "zip_code": 72675, + "latitude": 35.908381, + "longitude": -92.699416, + "city": "Saint Joe", + "state": "AR", + "county": "Searcy" + }, + { + "zip_code": 72677, + "latitude": 36.267239, + "longitude": -92.685913, + "city": "Summit", + "state": "AR", + "county": "Marion" + }, + { + "zip_code": 72679, + "latitude": 35.706942, + "longitude": -92.843116, + "city": "Tilly", + "state": "AR", + "county": "Pope" + }, + { + "zip_code": 72680, + "latitude": 35.91896, + "longitude": -92.127207, + "city": "Timbo", + "state": "AR", + "county": "Stone" + }, + { + "zip_code": 72682, + "latitude": 36.148259, + "longitude": -92.989569, + "city": "Valley Springs", + "state": "AR", + "county": "Boone" + }, + { + "zip_code": 72683, + "latitude": 35.924868, + "longitude": -93.232298, + "city": "Vendor", + "state": "AR", + "county": "Newton" + }, + { + "zip_code": 72685, + "latitude": 36.098936, + "longitude": -92.961082, + "city": "Western Grove", + "state": "AR", + "county": "Newton" + }, + { + "zip_code": 72686, + "latitude": 35.916744, + "longitude": -92.681408, + "city": "Witts Springs", + "state": "AR", + "county": "Searcy" + }, + { + "zip_code": 72687, + "latitude": 36.254905, + "longitude": -92.688068, + "city": "Yellville", + "state": "AR", + "county": "Marion" + }, + { + "zip_code": 72701, + "latitude": 35.974602, + "longitude": -94.190997, + "city": "Fayetteville", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72702, + "latitude": 35.99403, + "longitude": -94.219977, + "city": "Fayetteville", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72703, + "latitude": 36.126249, + "longitude": -94.074168, + "city": "Fayetteville", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72704, + "latitude": 36.087732, + "longitude": -94.309322, + "city": "Fayetteville", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72711, + "latitude": 36.397805, + "longitude": -94.043837, + "city": "Avoca", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72712, + "latitude": 36.347107, + "longitude": -94.223419, + "city": "Bentonville", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72714, + "latitude": 36.426659, + "longitude": -94.330765, + "city": "Bella Vista", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72715, + "latitude": 36.442323, + "longitude": -94.427298, + "city": "Bella Vista", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72716, + "latitude": 36.299507, + "longitude": -93.956801, + "city": "Bentonville", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72717, + "latitude": 35.847701, + "longitude": -94.444142, + "city": "Canehill", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72718, + "latitude": 36.266213, + "longitude": -94.245722, + "city": "Cave Springs", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72719, + "latitude": 36.328519, + "longitude": -94.366608, + "city": "Centerton", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72721, + "latitude": 36.033601, + "longitude": -93.704255, + "city": "Combs", + "state": "AR", + "county": "Madison" + }, + { + "zip_code": 72722, + "latitude": 36.321366, + "longitude": -94.462415, + "city": "Decatur", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72727, + "latitude": 35.972331, + "longitude": -93.997572, + "city": "Elkins", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72728, + "latitude": 36.210013, + "longitude": -94.254573, + "city": "Elm Springs", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72729, + "latitude": 35.80515, + "longitude": -94.460202, + "city": "Evansville", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72730, + "latitude": 36.081641, + "longitude": -94.209785, + "city": "Farmington", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72732, + "latitude": 36.365048, + "longitude": -94.184187, + "city": "Garfield", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72733, + "latitude": 36.486424, + "longitude": -93.927748, + "city": "Gateway", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72734, + "latitude": 36.288541, + "longitude": -94.435512, + "city": "Gentry", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72735, + "latitude": 36.087551, + "longitude": -93.966645, + "city": "Goshen", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72736, + "latitude": 36.381245, + "longitude": -94.471388, + "city": "Gravette", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72737, + "latitude": 35.928186, + "longitude": -94.152899, + "city": "Greenland", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72738, + "latitude": 36.033601, + "longitude": -93.704255, + "city": "Hindsville", + "state": "AR", + "county": "Madison" + }, + { + "zip_code": 72739, + "latitude": 36.447008, + "longitude": -94.339813, + "city": "Hiwasse", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72740, + "latitude": 36.028046, + "longitude": -93.778748, + "city": "Huntsville", + "state": "AR", + "county": "Madison" + }, + { + "zip_code": 72741, + "latitude": 35.99403, + "longitude": -94.219977, + "city": "Johnson", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72742, + "latitude": 36.033601, + "longitude": -93.704255, + "city": "Kingston", + "state": "AR", + "county": "Madison" + }, + { + "zip_code": 72744, + "latitude": 35.935038, + "longitude": -94.362211, + "city": "Lincoln", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72745, + "latitude": 36.29589, + "longitude": -94.12368, + "city": "Lowell", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72747, + "latitude": 36.391882, + "longitude": -94.583717, + "city": "Maysville", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72749, + "latitude": 35.861658, + "longitude": -94.467398, + "city": "Morrow", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72751, + "latitude": 36.461444, + "longitude": -94.129727, + "city": "Pea Ridge", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72752, + "latitude": 36.033601, + "longitude": -93.704255, + "city": "Pettigrew", + "state": "AR", + "county": "Madison" + }, + { + "zip_code": 72753, + "latitude": 35.927985, + "longitude": -94.317796, + "city": "Prairie Grove", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72756, + "latitude": 36.355417, + "longitude": -94.181568, + "city": "Rogers", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72757, + "latitude": 36.371981, + "longitude": -94.115649, + "city": "Rogers", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72758, + "latitude": 36.316945, + "longitude": -94.154459, + "city": "Rogers", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72760, + "latitude": 36.033601, + "longitude": -93.704255, + "city": "Saint Paul", + "state": "AR", + "county": "Madison" + }, + { + "zip_code": 72761, + "latitude": 36.21791, + "longitude": -94.383778, + "city": "Siloam Springs", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72762, + "latitude": 36.16722, + "longitude": -94.240112, + "city": "Springdale", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72764, + "latitude": 36.171598, + "longitude": -94.042788, + "city": "Springdale", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72765, + "latitude": 36.172541, + "longitude": -94.153512, + "city": "Springdale", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72766, + "latitude": 35.99403, + "longitude": -94.219977, + "city": "Springdale", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72768, + "latitude": 36.384794, + "longitude": -94.449942, + "city": "Sulphur Springs", + "state": "AR", + "county": "Benton" + }, + { + "zip_code": 72769, + "latitude": 36.027589, + "longitude": -94.49393, + "city": "Summers", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72770, + "latitude": 36.14998, + "longitude": -94.242884, + "city": "Tontitown", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72773, + "latitude": 36.033601, + "longitude": -93.704255, + "city": "Wesley", + "state": "AR", + "county": "Madison" + }, + { + "zip_code": 72774, + "latitude": 35.98025, + "longitude": -94.198446, + "city": "West Fork", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 72776, + "latitude": 36.033601, + "longitude": -93.704255, + "city": "Witter", + "state": "AR", + "county": "Madison" + }, + { + "zip_code": 72801, + "latitude": 35.29465, + "longitude": -93.072885, + "city": "Russellville", + "state": "AR", + "county": "Pope" + }, + { + "zip_code": 72802, + "latitude": 35.306683, + "longitude": -93.071219, + "city": "Russellville", + "state": "AR", + "county": "Pope" + }, + { + "zip_code": 72811, + "latitude": 35.314678, + "longitude": -93.113308, + "city": "Russellville", + "state": "AR", + "county": "Pope" + }, + { + "zip_code": 72812, + "latitude": 35.423102, + "longitude": -93.054388, + "city": "Russellville", + "state": "AR", + "county": "Pope" + }, + { + "zip_code": 72820, + "latitude": 35.43356, + "longitude": -93.752642, + "city": "Alix", + "state": "AR", + "county": "Franklin" + }, + { + "zip_code": 72821, + "latitude": 35.434638, + "longitude": -93.759811, + "city": "Altus", + "state": "AR", + "county": "Franklin" + }, + { + "zip_code": 72823, + "latitude": 35.325504, + "longitude": -92.992285, + "city": "Atkins", + "state": "AR", + "county": "Pope" + }, + { + "zip_code": 72824, + "latitude": 35.030397, + "longitude": -93.303203, + "city": "Belleville", + "state": "AR", + "county": "Yell" + }, + { + "zip_code": 72826, + "latitude": 35.130561, + "longitude": -93.749342, + "city": "Blue Mountain", + "state": "AR", + "county": "Logan" + }, + { + "zip_code": 72827, + "latitude": 35.030397, + "longitude": -93.303203, + "city": "Bluffton", + "state": "AR", + "county": "Yell" + }, + { + "zip_code": 72828, + "latitude": 35.030397, + "longitude": -93.303203, + "city": "Briggsville", + "state": "AR", + "county": "Yell" + }, + { + "zip_code": 72829, + "latitude": 35.030397, + "longitude": -93.303203, + "city": "Centerville", + "state": "AR", + "county": "Yell" + }, + { + "zip_code": 72830, + "latitude": 35.473886, + "longitude": -93.516564, + "city": "Clarksville", + "state": "AR", + "county": "Johnson" + }, + { + "zip_code": 72832, + "latitude": 35.430098, + "longitude": -93.672986, + "city": "Coal Hill", + "state": "AR", + "county": "Johnson" + }, + { + "zip_code": 72833, + "latitude": 35.052818, + "longitude": -93.381315, + "city": "Danville", + "state": "AR", + "county": "Yell" + }, + { + "zip_code": 72834, + "latitude": 35.235025, + "longitude": -93.184774, + "city": "Dardanelle", + "state": "AR", + "county": "Yell" + }, + { + "zip_code": 72835, + "latitude": 35.283987, + "longitude": -93.3532, + "city": "Delaware", + "state": "AR", + "county": "Logan" + }, + { + "zip_code": 72837, + "latitude": 35.498142, + "longitude": -93.063411, + "city": "Dover", + "state": "AR", + "county": "Pope" + }, + { + "zip_code": 72838, + "latitude": 35.030397, + "longitude": -93.303203, + "city": "Gravelly", + "state": "AR", + "county": "Yell" + }, + { + "zip_code": 72839, + "latitude": 35.547714, + "longitude": -93.437264, + "city": "Hagarville", + "state": "AR", + "county": "Johnson" + }, + { + "zip_code": 72840, + "latitude": 35.436024, + "longitude": -93.64356, + "city": "Hartman", + "state": "AR", + "county": "Johnson" + }, + { + "zip_code": 72841, + "latitude": 34.882558, + "longitude": -94.079724, + "city": "Harvey", + "state": "AR", + "county": "Scott" + }, + { + "zip_code": 72842, + "latitude": 35.030397, + "longitude": -93.303203, + "city": "Havana", + "state": "AR", + "county": "Yell" + }, + { + "zip_code": 72843, + "latitude": 35.549856, + "longitude": -92.961624, + "city": "Hector", + "state": "AR", + "county": "Pope" + }, + { + "zip_code": 72845, + "latitude": 35.385081, + "longitude": -93.335178, + "city": "Knoxville", + "state": "AR", + "county": "Johnson" + }, + { + "zip_code": 72846, + "latitude": 35.476393, + "longitude": -93.369461, + "city": "Lamar", + "state": "AR", + "county": "Johnson" + }, + { + "zip_code": 72847, + "latitude": 35.368118, + "longitude": -93.244365, + "city": "London", + "state": "AR", + "county": "Pope" + }, + { + "zip_code": 72851, + "latitude": 35.264248, + "longitude": -93.452038, + "city": "New Blaine", + "state": "AR", + "county": "Logan" + }, + { + "zip_code": 72852, + "latitude": 35.547714, + "longitude": -93.437264, + "city": "Oark", + "state": "AR", + "county": "Johnson" + }, + { + "zip_code": 72853, + "latitude": 35.030397, + "longitude": -93.303203, + "city": "Ola", + "state": "AR", + "county": "Yell" + }, + { + "zip_code": 72854, + "latitude": 35.634994, + "longitude": -93.445104, + "city": "Ozone", + "state": "AR", + "county": "Johnson" + }, + { + "zip_code": 72855, + "latitude": 35.274106, + "longitude": -93.615999, + "city": "Paris", + "state": "AR", + "county": "Logan" + }, + { + "zip_code": 72856, + "latitude": 35.617231, + "longitude": -93.034092, + "city": "Pelsor", + "state": "AR", + "county": "Pope" + }, + { + "zip_code": 72857, + "latitude": 34.992068, + "longitude": -93.295552, + "city": "Plainview", + "state": "AR", + "county": "Yell" + }, + { + "zip_code": 72858, + "latitude": 35.232993, + "longitude": -93.026834, + "city": "Pottsville", + "state": "AR", + "county": "Pope" + }, + { + "zip_code": 72860, + "latitude": 35.030397, + "longitude": -93.303203, + "city": "Rover", + "state": "AR", + "county": "Yell" + }, + { + "zip_code": 72863, + "latitude": 35.344745, + "longitude": -93.53721, + "city": "Scranton", + "state": "AR", + "county": "Logan" + }, + { + "zip_code": 72865, + "latitude": 35.315285, + "longitude": -93.599117, + "city": "Subiaco", + "state": "AR", + "county": "Logan" + }, + { + "zip_code": 72901, + "latitude": 35.231245, + "longitude": -94.339412, + "city": "Fort Smith", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72902, + "latitude": 35.38619, + "longitude": -94.409114, + "city": "Fort Smith", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72903, + "latitude": 35.354491, + "longitude": -94.356112, + "city": "Fort Smith", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72904, + "latitude": 35.410754, + "longitude": -94.387568, + "city": "Fort Smith", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72905, + "latitude": 35.191046, + "longitude": -94.23816, + "city": "Fort Smith", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72906, + "latitude": 35.191046, + "longitude": -94.23816, + "city": "Fort Smith", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72908, + "latitude": 35.321912, + "longitude": -94.402779, + "city": "Fort Smith", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72913, + "latitude": 35.191046, + "longitude": -94.23816, + "city": "Fort Smith", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72914, + "latitude": 35.191046, + "longitude": -94.23816, + "city": "Fort Smith", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72916, + "latitude": 35.299584, + "longitude": -94.373858, + "city": "Fort Smith", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72917, + "latitude": 35.191046, + "longitude": -94.23816, + "city": "Fort Smith", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72918, + "latitude": 35.191046, + "longitude": -94.23816, + "city": "Fort Smith", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72919, + "latitude": 35.191046, + "longitude": -94.23816, + "city": "Fort Smith", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72921, + "latitude": 35.479157, + "longitude": -94.193334, + "city": "Alma", + "state": "AR", + "county": "Crawford" + }, + { + "zip_code": 72923, + "latitude": 35.216137, + "longitude": -94.354857, + "city": "Barling", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72924, + "latitude": 34.882558, + "longitude": -94.079724, + "city": "Bates", + "state": "AR", + "county": "Scott" + }, + { + "zip_code": 72926, + "latitude": 34.882558, + "longitude": -94.079724, + "city": "Boles", + "state": "AR", + "county": "Scott" + }, + { + "zip_code": 72927, + "latitude": 35.19356, + "longitude": -93.930763, + "city": "Booneville", + "state": "AR", + "county": "Logan" + }, + { + "zip_code": 72928, + "latitude": 35.311075, + "longitude": -93.922527, + "city": "Branch", + "state": "AR", + "county": "Franklin" + }, + { + "zip_code": 72930, + "latitude": 35.486917, + "longitude": -93.889389, + "city": "Cecil", + "state": "AR", + "county": "Franklin" + }, + { + "zip_code": 72932, + "latitude": 35.654281, + "longitude": -94.369383, + "city": "Cedarville", + "state": "AR", + "county": "Crawford" + }, + { + "zip_code": 72933, + "latitude": 35.387924, + "longitude": -93.95098, + "city": "Charleston", + "state": "AR", + "county": "Franklin" + }, + { + "zip_code": 72934, + "latitude": 35.67603, + "longitude": -94.265465, + "city": "Chester", + "state": "AR", + "county": "Crawford" + }, + { + "zip_code": 72935, + "latitude": 35.496721, + "longitude": -94.114259, + "city": "Dyer", + "state": "AR", + "county": "Crawford" + }, + { + "zip_code": 72936, + "latitude": 35.181209, + "longitude": -94.206011, + "city": "Greenwood", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72937, + "latitude": 35.119452, + "longitude": -94.329759, + "city": "Hackett", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72938, + "latitude": 35.060177, + "longitude": -94.353779, + "city": "Hartford", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72940, + "latitude": 35.13786, + "longitude": -94.24613, + "city": "Huntington", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72941, + "latitude": 35.241045, + "longitude": -94.18783, + "city": "Lavaca", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72943, + "latitude": 35.182673, + "longitude": -93.812592, + "city": "Magazine", + "state": "AR", + "county": "Logan" + }, + { + "zip_code": 72944, + "latitude": 35.063448, + "longitude": -94.243268, + "city": "Mansfield", + "state": "AR", + "county": "Scott" + }, + { + "zip_code": 72945, + "latitude": 35.096272, + "longitude": -94.349565, + "city": "Midland", + "state": "AR", + "county": "Sebastian" + }, + { + "zip_code": 72946, + "latitude": 35.64644, + "longitude": -94.149687, + "city": "Mountainburg", + "state": "AR", + "county": "Crawford" + }, + { + "zip_code": 72947, + "latitude": 35.565805, + "longitude": -94.124776, + "city": "Mulberry", + "state": "AR", + "county": "Crawford" + }, + { + "zip_code": 72948, + "latitude": 35.680583, + "longitude": -94.404185, + "city": "Natural Dam", + "state": "AR", + "county": "Crawford" + }, + { + "zip_code": 72949, + "latitude": 35.405649, + "longitude": -93.909428, + "city": "Ozark", + "state": "AR", + "county": "Franklin" + }, + { + "zip_code": 72950, + "latitude": 34.882558, + "longitude": -94.079724, + "city": "Parks", + "state": "AR", + "county": "Scott" + }, + { + "zip_code": 72951, + "latitude": 35.291693, + "longitude": -93.889921, + "city": "Ratcliff", + "state": "AR", + "county": "Logan" + }, + { + "zip_code": 72952, + "latitude": 35.546818, + "longitude": -94.291296, + "city": "Rudy", + "state": "AR", + "county": "Crawford" + }, + { + "zip_code": 72955, + "latitude": 35.56794, + "longitude": -94.411402, + "city": "Uniontown", + "state": "AR", + "county": "Crawford" + }, + { + "zip_code": 72956, + "latitude": 35.496491, + "longitude": -94.299086, + "city": "Van Buren", + "state": "AR", + "county": "Crawford" + }, + { + "zip_code": 72957, + "latitude": 35.494412, + "longitude": -94.318648, + "city": "Van Buren", + "state": "AR", + "county": "Crawford" + }, + { + "zip_code": 72958, + "latitude": 34.908133, + "longitude": -94.089381, + "city": "Waldron", + "state": "AR", + "county": "Scott" + }, + { + "zip_code": 72959, + "latitude": 35.862402, + "longitude": -94.106004, + "city": "Winslow", + "state": "AR", + "county": "Washington" + }, + { + "zip_code": 73001, + "latitude": 35.203206, + "longitude": -98.357423, + "city": "Albert", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73002, + "latitude": 34.914788, + "longitude": -97.78122, + "city": "Alex", + "state": "OK", + "county": "Grady" + }, + { + "zip_code": 73003, + "latitude": 35.674777, + "longitude": -97.499681, + "city": "Edmond", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73004, + "latitude": 35.031247, + "longitude": -97.881959, + "city": "Amber", + "state": "OK", + "county": "Grady" + }, + { + "zip_code": 73005, + "latitude": 35.167108, + "longitude": -98.325598, + "city": "Anadarko", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73006, + "latitude": 34.891016, + "longitude": -98.361483, + "city": "Apache", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73007, + "latitude": 35.672506, + "longitude": -97.309856, + "city": "Arcadia", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73008, + "latitude": 35.576674, + "longitude": -97.498858, + "city": "Bethany", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73009, + "latitude": 35.308457, + "longitude": -98.344265, + "city": "Binger", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73010, + "latitude": 35.094914, + "longitude": -97.527291, + "city": "Blanchard", + "state": "OK", + "county": "Mcclain" + }, + { + "zip_code": 73011, + "latitude": 35.031247, + "longitude": -97.881959, + "city": "Bradley", + "state": "OK", + "county": "Grady" + }, + { + "zip_code": 73012, + "latitude": 34.48532, + "longitude": -97.852223, + "city": "Bray", + "state": "OK", + "county": "Stephens" + }, + { + "zip_code": 73013, + "latitude": 35.555542, + "longitude": -97.515011, + "city": "Edmond", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73014, + "latitude": 35.547575, + "longitude": -98.151236, + "city": "Calumet", + "state": "OK", + "county": "Canadian" + }, + { + "zip_code": 73015, + "latitude": 35.105404, + "longitude": -98.594067, + "city": "Carnegie", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73016, + "latitude": 35.818432, + "longitude": -97.699679, + "city": "Cashion", + "state": "OK", + "county": "Kingfisher" + }, + { + "zip_code": 73017, + "latitude": 34.924452, + "longitude": -98.163436, + "city": "Cement", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73018, + "latitude": 35.127804, + "longitude": -97.937083, + "city": "Chickasha", + "state": "OK", + "county": "Grady" + }, + { + "zip_code": 73019, + "latitude": 35.208566, + "longitude": -97.44451, + "city": "Norman", + "state": "OK", + "county": "Cleveland" + }, + { + "zip_code": 73020, + "latitude": 35.51876, + "longitude": -97.249071, + "city": "Choctaw", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73021, + "latitude": 35.281428, + "longitude": -98.991373, + "city": "Colony", + "state": "OK", + "county": "Washita" + }, + { + "zip_code": 73022, + "latitude": 35.525192, + "longitude": -97.992347, + "city": "Concho", + "state": "OK", + "county": "Canadian" + }, + { + "zip_code": 73023, + "latitude": 35.031247, + "longitude": -97.881959, + "city": "Chickasha", + "state": "OK", + "county": "Grady" + }, + { + "zip_code": 73024, + "latitude": 35.378409, + "longitude": -98.781794, + "city": "Corn", + "state": "OK", + "county": "Washita" + }, + { + "zip_code": 73026, + "latitude": 35.23429, + "longitude": -97.291356, + "city": "Norman", + "state": "OK", + "county": "Cleveland" + }, + { + "zip_code": 73027, + "latitude": 35.950214, + "longitude": -97.291688, + "city": "Coyle", + "state": "OK", + "county": "Logan" + }, + { + "zip_code": 73028, + "latitude": 35.977031, + "longitude": -97.628098, + "city": "Crescent", + "state": "OK", + "county": "Logan" + }, + { + "zip_code": 73029, + "latitude": 34.897258, + "longitude": -98.204397, + "city": "Cyril", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73030, + "latitude": 34.501771, + "longitude": -97.047346, + "city": "Davis", + "state": "OK", + "county": "Murray" + }, + { + "zip_code": 73031, + "latitude": 35.095739, + "longitude": -97.301103, + "city": "Dibble", + "state": "OK", + "county": "Mcclain" + }, + { + "zip_code": 73032, + "latitude": 34.484702, + "longitude": -97.089708, + "city": "Dougherty", + "state": "OK", + "county": "Murray" + }, + { + "zip_code": 73033, + "latitude": 35.303031, + "longitude": -98.555431, + "city": "Eakly", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73034, + "latitude": 35.631005, + "longitude": -97.463291, + "city": "Edmond", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73036, + "latitude": 35.508128, + "longitude": -98.026708, + "city": "El Reno", + "state": "OK", + "county": "Canadian" + }, + { + "zip_code": 73038, + "latitude": 35.100632, + "longitude": -98.44173, + "city": "Fort Cobb", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73040, + "latitude": 35.630034, + "longitude": -98.32054, + "city": "Geary", + "state": "OK", + "county": "Blaine" + }, + { + "zip_code": 73041, + "latitude": 35.069516, + "longitude": -98.875945, + "city": "Gotebo", + "state": "OK", + "county": "Kiowa" + }, + { + "zip_code": 73042, + "latitude": 35.042316, + "longitude": -98.233336, + "city": "Gracemont", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73043, + "latitude": 35.858554, + "longitude": -98.421836, + "city": "Greenfield", + "state": "OK", + "county": "Blaine" + }, + { + "zip_code": 73044, + "latitude": 35.877129, + "longitude": -97.456312, + "city": "Guthrie", + "state": "OK", + "county": "Logan" + }, + { + "zip_code": 73045, + "latitude": 35.53316, + "longitude": -97.395314, + "city": "Harrah", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73047, + "latitude": 35.473233, + "longitude": -98.36371, + "city": "Hinton", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73048, + "latitude": 35.327225, + "longitude": -98.43108, + "city": "Hydro", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73049, + "latitude": 35.578623, + "longitude": -97.276428, + "city": "Jones", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73050, + "latitude": 35.941924, + "longitude": -97.25565, + "city": "Langston", + "state": "OK", + "county": "Logan" + }, + { + "zip_code": 73051, + "latitude": 35.057992, + "longitude": -97.26999, + "city": "Lexington", + "state": "OK", + "county": "Cleveland" + }, + { + "zip_code": 73052, + "latitude": 34.836481, + "longitude": -97.51668, + "city": "Lindsay", + "state": "OK", + "county": "Garvin" + }, + { + "zip_code": 73053, + "latitude": 35.203206, + "longitude": -98.357423, + "city": "Lookeba", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73054, + "latitude": 35.632093, + "longitude": -97.212206, + "city": "Luther", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73055, + "latitude": 34.640543, + "longitude": -97.908875, + "city": "Marlow", + "state": "OK", + "county": "Stephens" + }, + { + "zip_code": 73056, + "latitude": 36.154158, + "longitude": -97.626084, + "city": "Marshall", + "state": "OK", + "county": "Logan" + }, + { + "zip_code": 73057, + "latitude": 34.816265, + "longitude": -97.405333, + "city": "Maysville", + "state": "OK", + "county": "Garvin" + }, + { + "zip_code": 73058, + "latitude": 35.775549, + "longitude": -97.22659, + "city": "Meridian", + "state": "OK", + "county": "Logan" + }, + { + "zip_code": 73059, + "latitude": 35.31278, + "longitude": -97.950402, + "city": "Minco", + "state": "OK", + "county": "Grady" + }, + { + "zip_code": 73061, + "latitude": 36.288043, + "longitude": -97.029796, + "city": "Morrison", + "state": "OK", + "county": "Noble" + }, + { + "zip_code": 73062, + "latitude": 35.087227, + "longitude": -98.806836, + "city": "Mountain View", + "state": "OK", + "county": "Kiowa" + }, + { + "zip_code": 73063, + "latitude": 36.062875, + "longitude": -97.404562, + "city": "Mulhall", + "state": "OK", + "county": "Logan" + }, + { + "zip_code": 73064, + "latitude": 35.390376, + "longitude": -97.759874, + "city": "Mustang", + "state": "OK", + "county": "Canadian" + }, + { + "zip_code": 73065, + "latitude": 35.219694, + "longitude": -97.574274, + "city": "Newcastle", + "state": "OK", + "county": "Mcclain" + }, + { + "zip_code": 73066, + "latitude": 35.469296, + "longitude": -97.267769, + "city": "Nicoma Park", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73067, + "latitude": 34.932908, + "longitude": -97.939225, + "city": "Ninnekah", + "state": "OK", + "county": "Grady" + }, + { + "zip_code": 73068, + "latitude": 35.152314, + "longitude": -97.276226, + "city": "Noble", + "state": "OK", + "county": "Cleveland" + }, + { + "zip_code": 73069, + "latitude": 35.232966, + "longitude": -97.438246, + "city": "Norman", + "state": "OK", + "county": "Cleveland" + }, + { + "zip_code": 73070, + "latitude": 35.187611, + "longitude": -97.397509, + "city": "Norman", + "state": "OK", + "county": "Cleveland" + }, + { + "zip_code": 73071, + "latitude": 35.254049, + "longitude": -97.300313, + "city": "Norman", + "state": "OK", + "county": "Cleveland" + }, + { + "zip_code": 73072, + "latitude": 35.218728, + "longitude": -97.363181, + "city": "Norman", + "state": "OK", + "county": "Cleveland" + }, + { + "zip_code": 73073, + "latitude": 35.944569, + "longitude": -97.408181, + "city": "Orlando", + "state": "OK", + "county": "Logan" + }, + { + "zip_code": 73074, + "latitude": 34.827711, + "longitude": -97.262188, + "city": "Paoli", + "state": "OK", + "county": "Garvin" + }, + { + "zip_code": 73075, + "latitude": 34.759696, + "longitude": -97.308819, + "city": "Pauls Valley", + "state": "OK", + "county": "Garvin" + }, + { + "zip_code": 73077, + "latitude": 36.318709, + "longitude": -97.285561, + "city": "Perry", + "state": "OK", + "county": "Noble" + }, + { + "zip_code": 73078, + "latitude": 35.653019, + "longitude": -97.753948, + "city": "Piedmont", + "state": "OK", + "county": "Canadian" + }, + { + "zip_code": 73079, + "latitude": 35.031247, + "longitude": -97.881959, + "city": "Pocasset", + "state": "OK", + "county": "Grady" + }, + { + "zip_code": 73080, + "latitude": 35.00181, + "longitude": -97.379902, + "city": "Purcell", + "state": "OK", + "county": "Mcclain" + }, + { + "zip_code": 73082, + "latitude": 34.775535, + "longitude": -97.954459, + "city": "Rush Springs", + "state": "OK", + "county": "Grady" + }, + { + "zip_code": 73083, + "latitude": 35.666481, + "longitude": -97.465436, + "city": "Edmond", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73084, + "latitude": 35.540113, + "longitude": -97.387602, + "city": "Spencer", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73085, + "latitude": 35.489527, + "longitude": -97.750009, + "city": "Yukon", + "state": "OK", + "county": "Canadian" + }, + { + "zip_code": 73086, + "latitude": 34.520837, + "longitude": -96.996244, + "city": "Sulphur", + "state": "OK", + "county": "Murray" + }, + { + "zip_code": 73089, + "latitude": 35.058651, + "longitude": -97.81648, + "city": "Tuttle", + "state": "OK", + "county": "Grady" + }, + { + "zip_code": 73090, + "latitude": 35.392567, + "longitude": -97.944388, + "city": "Union City", + "state": "OK", + "county": "Canadian" + }, + { + "zip_code": 73092, + "latitude": 35.081997, + "longitude": -98.087971, + "city": "Verden", + "state": "OK", + "county": "Grady" + }, + { + "zip_code": 73093, + "latitude": 35.105058, + "longitude": -97.468258, + "city": "Washington", + "state": "OK", + "county": "Mcclain" + }, + { + "zip_code": 73094, + "latitude": 35.203206, + "longitude": -98.357423, + "city": "Washita", + "state": "OK", + "county": "Caddo" + }, + { + "zip_code": 73095, + "latitude": 34.917497, + "longitude": -97.315974, + "city": "Wayne", + "state": "OK", + "county": "Mcclain" + }, + { + "zip_code": 73096, + "latitude": 35.538228, + "longitude": -98.703175, + "city": "Weatherford", + "state": "OK", + "county": "Custer" + }, + { + "zip_code": 73097, + "latitude": 35.400759, + "longitude": -97.644368, + "city": "Wheatland", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73098, + "latitude": 34.645418, + "longitude": -97.162257, + "city": "Wynnewood", + "state": "OK", + "county": "Garvin" + }, + { + "zip_code": 73099, + "latitude": 35.521448, + "longitude": -97.770532, + "city": "Yukon", + "state": "OK", + "county": "Canadian" + }, + { + "zip_code": 73101, + "latitude": 35.491608, + "longitude": -97.562817, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73102, + "latitude": 35.475209, + "longitude": -97.518916, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73103, + "latitude": 35.549197, + "longitude": -97.486407, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73104, + "latitude": 35.44541, + "longitude": -97.506415, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73105, + "latitude": 35.518576, + "longitude": -97.505416, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73106, + "latitude": 35.482014, + "longitude": -97.536666, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73107, + "latitude": 35.481908, + "longitude": -97.542666, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73108, + "latitude": 35.447559, + "longitude": -97.566497, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73109, + "latitude": 35.435221, + "longitude": -97.525265, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73110, + "latitude": 35.460511, + "longitude": -97.397441, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73111, + "latitude": 35.526182, + "longitude": -97.502631, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73112, + "latitude": 35.511007, + "longitude": -97.578865, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73113, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73114, + "latitude": 35.544882, + "longitude": -97.499605, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73115, + "latitude": 35.444931, + "longitude": -97.446013, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73116, + "latitude": 35.551571, + "longitude": -97.556318, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73117, + "latitude": 35.485021, + "longitude": -97.463314, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73118, + "latitude": 35.518458, + "longitude": -97.523316, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73119, + "latitude": 35.462144, + "longitude": -97.583267, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73120, + "latitude": 35.587155, + "longitude": -97.568418, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73121, + "latitude": 35.532257, + "longitude": -97.451938, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73122, + "latitude": 35.518768, + "longitude": -97.636119, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73123, + "latitude": 35.535989, + "longitude": -97.202331, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73124, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73125, + "latitude": 35.465418, + "longitude": -97.521816, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73126, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73127, + "latitude": 35.475459, + "longitude": -97.600817, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73128, + "latitude": 35.427335, + "longitude": -97.636284, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73129, + "latitude": 35.428579, + "longitude": -97.486065, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73130, + "latitude": 35.459312, + "longitude": -97.298733, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73131, + "latitude": 35.566004, + "longitude": -97.459414, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73132, + "latitude": 35.558349, + "longitude": -97.637519, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73134, + "latitude": 35.624134, + "longitude": -97.567199, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73135, + "latitude": 35.401512, + "longitude": -97.416562, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73136, + "latitude": 35.61534, + "longitude": -97.326151, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73137, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73139, + "latitude": 35.370262, + "longitude": -97.525464, + "city": "Oklahoma City", + "state": "OK", + "county": "Cleveland" + }, + { + "zip_code": 73140, + "latitude": 35.518509, + "longitude": -97.427464, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73141, + "latitude": 35.583757, + "longitude": -97.397064, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73142, + "latitude": 35.62034, + "longitude": -97.612588, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73143, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73144, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73145, + "latitude": 35.430406, + "longitude": -97.396184, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73146, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73147, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73148, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73149, + "latitude": 35.391712, + "longitude": -97.477463, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73150, + "latitude": 35.406963, + "longitude": -97.320363, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73151, + "latitude": 35.574858, + "longitude": -97.371621, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73152, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73153, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73154, + "latitude": 35.523758, + "longitude": -97.525467, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73155, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73156, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73157, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73159, + "latitude": 35.394212, + "longitude": -97.566716, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73160, + "latitude": 35.326895, + "longitude": -97.406805, + "city": "Oklahoma City", + "state": "OK", + "county": "Cleveland" + }, + { + "zip_code": 73162, + "latitude": 35.565419, + "longitude": -97.575218, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73163, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73164, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73165, + "latitude": 35.326665, + "longitude": -97.353359, + "city": "Oklahoma City", + "state": "OK", + "county": "Cleveland" + }, + { + "zip_code": 73167, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73169, + "latitude": 35.392473, + "longitude": -97.636161, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73170, + "latitude": 35.2972, + "longitude": -97.501459, + "city": "Oklahoma City", + "state": "OK", + "county": "Cleveland" + }, + { + "zip_code": 73172, + "latitude": 35.517456, + "longitude": -97.621769, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73173, + "latitude": 35.343003, + "longitude": -97.625383, + "city": "Oklahoma City", + "state": "OK", + "county": "Cleveland" + }, + { + "zip_code": 73177, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73178, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73179, + "latitude": 35.424819, + "longitude": -97.6363, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73180, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73184, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73185, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73189, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73190, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73193, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73194, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73195, + "latitude": "", + "longitude": "", + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73196, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73197, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73198, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73199, + "latitude": 35.551409, + "longitude": -97.407537, + "city": "Oklahoma City", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 73301, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 73344, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 73401, + "latitude": 34.156627, + "longitude": -97.179214, + "city": "Ardmore", + "state": "OK", + "county": "Carter" + }, + { + "zip_code": 73402, + "latitude": 34.288884, + "longitude": -97.248074, + "city": "Ardmore", + "state": "OK", + "county": "Carter" + }, + { + "zip_code": 73403, + "latitude": 34.288884, + "longitude": -97.248074, + "city": "Ardmore", + "state": "OK", + "county": "Carter" + }, + { + "zip_code": 73425, + "latitude": 34.48532, + "longitude": -97.852223, + "city": "Countyline", + "state": "OK", + "county": "Stephens" + }, + { + "zip_code": 73430, + "latitude": 33.925982, + "longitude": -97.310324, + "city": "Burneyville", + "state": "OK", + "county": "Love" + }, + { + "zip_code": 73432, + "latitude": 34.310191, + "longitude": -96.670349, + "city": "Coleman", + "state": "OK", + "county": "Johnston" + }, + { + "zip_code": 73433, + "latitude": 34.719832, + "longitude": -97.34077, + "city": "Elmore City", + "state": "OK", + "county": "Garvin" + }, + { + "zip_code": 73434, + "latitude": 34.48532, + "longitude": -97.852223, + "city": "Foster", + "state": "OK", + "county": "Stephens" + }, + { + "zip_code": 73435, + "latitude": 34.288884, + "longitude": -97.248074, + "city": "Fox", + "state": "OK", + "county": "Carter" + }, + { + "zip_code": 73436, + "latitude": 34.293948, + "longitude": -97.033905, + "city": "Gene Autry", + "state": "OK", + "county": "Carter" + }, + { + "zip_code": 73437, + "latitude": 34.288884, + "longitude": -97.248074, + "city": "Graham", + "state": "OK", + "county": "Carter" + }, + { + "zip_code": 73438, + "latitude": 34.217164, + "longitude": -97.402923, + "city": "Healdton", + "state": "OK", + "county": "Carter" + }, + { + "zip_code": 73439, + "latitude": 33.974518, + "longitude": -96.698204, + "city": "Kingston", + "state": "OK", + "county": "Marshall" + }, + { + "zip_code": 73440, + "latitude": 33.998567, + "longitude": -96.758835, + "city": "Lebanon", + "state": "OK", + "county": "Marshall" + }, + { + "zip_code": 73441, + "latitude": 33.894135, + "longitude": -97.247886, + "city": "Leon", + "state": "OK", + "county": "Love" + }, + { + "zip_code": 73442, + "latitude": 34.48532, + "longitude": -97.852223, + "city": "Loco", + "state": "OK", + "county": "Stephens" + }, + { + "zip_code": 73443, + "latitude": 34.141332, + "longitude": -97.321977, + "city": "Lone Grove", + "state": "OK", + "county": "Carter" + }, + { + "zip_code": 73444, + "latitude": 34.680871, + "longitude": -97.300429, + "city": "Hennepin", + "state": "OK", + "county": "Garvin" + }, + { + "zip_code": 73446, + "latitude": 34.010202, + "longitude": -96.754984, + "city": "Madill", + "state": "OK", + "county": "Marshall" + }, + { + "zip_code": 73447, + "latitude": 34.183418, + "longitude": -96.878673, + "city": "Mannsville", + "state": "OK", + "county": "Johnston" + }, + { + "zip_code": 73448, + "latitude": 33.935268, + "longitude": -97.111939, + "city": "Marietta", + "state": "OK", + "county": "Love" + }, + { + "zip_code": 73449, + "latitude": 33.971979, + "longitude": -96.457371, + "city": "Mead", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 73450, + "latitude": 34.310191, + "longitude": -96.670349, + "city": "Milburn", + "state": "OK", + "county": "Johnston" + }, + { + "zip_code": 73453, + "latitude": 33.894135, + "longitude": -97.247886, + "city": "Overbrook", + "state": "OK", + "county": "Love" + }, + { + "zip_code": 73455, + "latitude": 34.244023, + "longitude": -96.752906, + "city": "Ravia", + "state": "OK", + "county": "Johnston" + }, + { + "zip_code": 73456, + "latitude": 34.200318, + "longitude": -97.810259, + "city": "Ringling", + "state": "OK", + "county": "Jefferson" + }, + { + "zip_code": 73458, + "latitude": 34.304534, + "longitude": -97.134372, + "city": "Springer", + "state": "OK", + "county": "Carter" + }, + { + "zip_code": 73459, + "latitude": 33.894135, + "longitude": -97.247886, + "city": "Thackerville", + "state": "OK", + "county": "Love" + }, + { + "zip_code": 73460, + "latitude": 34.275856, + "longitude": -96.655188, + "city": "Tishomingo", + "state": "OK", + "county": "Johnston" + }, + { + "zip_code": 73461, + "latitude": 34.371445, + "longitude": -96.429558, + "city": "Wapanucka", + "state": "OK", + "county": "Johnston" + }, + { + "zip_code": 73463, + "latitude": 34.169282, + "longitude": -97.354691, + "city": "Wilson", + "state": "OK", + "county": "Carter" + }, + { + "zip_code": 73476, + "latitude": 34.680871, + "longitude": -97.300429, + "city": "Pernell", + "state": "OK", + "county": "Garvin" + }, + { + "zip_code": 73481, + "latitude": 34.288884, + "longitude": -97.248074, + "city": "Ratliff City", + "state": "OK", + "county": "Carter" + }, + { + "zip_code": 73487, + "latitude": 34.288884, + "longitude": -97.248074, + "city": "Tatums", + "state": "OK", + "county": "Carter" + }, + { + "zip_code": 73488, + "latitude": 34.288884, + "longitude": -97.248074, + "city": "Tussy", + "state": "OK", + "county": "Carter" + }, + { + "zip_code": 73491, + "latitude": 34.456505, + "longitude": -97.668866, + "city": "Velma", + "state": "OK", + "county": "Stephens" + }, + { + "zip_code": 73501, + "latitude": 34.635378, + "longitude": -98.448452, + "city": "Lawton", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73502, + "latitude": 34.630879, + "longitude": -98.457646, + "city": "Lawton", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73503, + "latitude": 34.663978, + "longitude": -98.437482, + "city": "Fort Sill", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73505, + "latitude": 34.678734, + "longitude": -98.436365, + "city": "Lawton", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73506, + "latitude": 34.630879, + "longitude": -98.457646, + "city": "Lawton", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73507, + "latitude": 34.560957, + "longitude": -98.387482, + "city": "Lawton", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73520, + "latitude": 34.069661, + "longitude": -97.838026, + "city": "Addington", + "state": "OK", + "county": "Jefferson" + }, + { + "zip_code": 73521, + "latitude": 34.663039, + "longitude": -99.280343, + "city": "Altus", + "state": "OK", + "county": "Jackson" + }, + { + "zip_code": 73522, + "latitude": 34.723795, + "longitude": -99.383928, + "city": "Altus", + "state": "OK", + "county": "Jackson" + }, + { + "zip_code": 73523, + "latitude": 34.598197, + "longitude": -99.440839, + "city": "Altus Afb", + "state": "OK", + "county": "Jackson" + }, + { + "zip_code": 73526, + "latitude": 34.783568, + "longitude": -99.331758, + "city": "Blair", + "state": "OK", + "county": "Jackson" + }, + { + "zip_code": 73527, + "latitude": 34.545031, + "longitude": -98.508297, + "city": "Cache", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73528, + "latitude": 34.424316, + "longitude": -98.654352, + "city": "Chattanooga", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73529, + "latitude": 34.393689, + "longitude": -97.970651, + "city": "Comanche", + "state": "OK", + "county": "Stephens" + }, + { + "zip_code": 73530, + "latitude": 34.242236, + "longitude": -99.076314, + "city": "Davidson", + "state": "OK", + "county": "Tillman" + }, + { + "zip_code": 73531, + "latitude": 34.284738, + "longitude": -98.40044, + "city": "Devol", + "state": "OK", + "county": "Cotton" + }, + { + "zip_code": 73532, + "latitude": 34.663508, + "longitude": -99.569018, + "city": "Duke", + "state": "OK", + "county": "Jackson" + }, + { + "zip_code": 73533, + "latitude": 34.547749, + "longitude": -97.933279, + "city": "Duncan", + "state": "OK", + "county": "Stephens" + }, + { + "zip_code": 73534, + "latitude": 34.518944, + "longitude": -97.973331, + "city": "Duncan", + "state": "OK", + "county": "Stephens" + }, + { + "zip_code": 73536, + "latitude": 34.48532, + "longitude": -97.852223, + "city": "Duncan", + "state": "OK", + "county": "Stephens" + }, + { + "zip_code": 73537, + "latitude": 34.472021, + "longitude": -99.647324, + "city": "Eldorado", + "state": "OK", + "county": "Jackson" + }, + { + "zip_code": 73538, + "latitude": 34.609391, + "longitude": -98.406833, + "city": "Elgin", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73539, + "latitude": 34.481717, + "longitude": -99.347951, + "city": "Elmer", + "state": "OK", + "county": "Jackson" + }, + { + "zip_code": 73540, + "latitude": 34.630879, + "longitude": -98.457646, + "city": "Faxon", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73541, + "latitude": 34.826905, + "longitude": -98.228076, + "city": "Fletcher", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73542, + "latitude": 34.386281, + "longitude": -99.001688, + "city": "Frederick", + "state": "OK", + "county": "Tillman" + }, + { + "zip_code": 73543, + "latitude": 34.482402, + "longitude": -98.381879, + "city": "Geronimo", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73544, + "latitude": 34.768632, + "longitude": -99.833341, + "city": "Gould", + "state": "OK", + "county": "Harmon" + }, + { + "zip_code": 73546, + "latitude": 34.362887, + "longitude": -98.911705, + "city": "Grandfield", + "state": "OK", + "county": "Tillman" + }, + { + "zip_code": 73547, + "latitude": 34.950884, + "longitude": -99.394148, + "city": "Granite", + "state": "OK", + "county": "Greer" + }, + { + "zip_code": 73548, + "latitude": 34.069661, + "longitude": -97.838026, + "city": "Hastings", + "state": "OK", + "county": "Jefferson" + }, + { + "zip_code": 73549, + "latitude": 34.626509, + "longitude": -99.139047, + "city": "Headrick", + "state": "OK", + "county": "Jackson" + }, + { + "zip_code": 73550, + "latitude": 34.694028, + "longitude": -99.912395, + "city": "Hollis", + "state": "OK", + "county": "Harmon" + }, + { + "zip_code": 73551, + "latitude": 34.381102, + "longitude": -98.923769, + "city": "Hollister", + "state": "OK", + "county": "Tillman" + }, + { + "zip_code": 73552, + "latitude": 34.618969, + "longitude": -98.75235, + "city": "Indiahoma", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73553, + "latitude": 34.381102, + "longitude": -98.923769, + "city": "Loveland", + "state": "OK", + "county": "Tillman" + }, + { + "zip_code": 73554, + "latitude": 34.912592, + "longitude": -99.460577, + "city": "Mangum", + "state": "OK", + "county": "Greer" + }, + { + "zip_code": 73555, + "latitude": 34.507462, + "longitude": -98.979191, + "city": "Manitou", + "state": "OK", + "county": "Tillman" + }, + { + "zip_code": 73556, + "latitude": 34.719237, + "longitude": -99.4154, + "city": "Martha", + "state": "OK", + "county": "Jackson" + }, + { + "zip_code": 73557, + "latitude": 34.630879, + "longitude": -98.457646, + "city": "Medicine Park", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73558, + "latitude": 34.630879, + "longitude": -98.457646, + "city": "Meers", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73559, + "latitude": 34.69694, + "longitude": -98.94888, + "city": "Mountain Park", + "state": "OK", + "county": "Kiowa" + }, + { + "zip_code": 73560, + "latitude": 34.54794, + "longitude": -99.421959, + "city": "Olustee", + "state": "OK", + "county": "Jackson" + }, + { + "zip_code": 73561, + "latitude": 34.069661, + "longitude": -97.838026, + "city": "Oscar", + "state": "OK", + "county": "Jefferson" + }, + { + "zip_code": 73562, + "latitude": 34.284738, + "longitude": -98.40044, + "city": "Randlett", + "state": "OK", + "county": "Cotton" + }, + { + "zip_code": 73564, + "latitude": 34.850598, + "longitude": -99.021205, + "city": "Roosevelt", + "state": "OK", + "county": "Kiowa" + }, + { + "zip_code": 73565, + "latitude": 34.021911, + "longitude": -97.954867, + "city": "Ryan", + "state": "OK", + "county": "Jefferson" + }, + { + "zip_code": 73566, + "latitude": 34.673689, + "longitude": -98.95239, + "city": "Snyder", + "state": "OK", + "county": "Kiowa" + }, + { + "zip_code": 73567, + "latitude": 34.749594, + "longitude": -98.167941, + "city": "Sterling", + "state": "OK", + "county": "Comanche" + }, + { + "zip_code": 73568, + "latitude": 34.271467, + "longitude": -98.260334, + "city": "Temple", + "state": "OK", + "county": "Cotton" + }, + { + "zip_code": 73569, + "latitude": 34.069661, + "longitude": -97.838026, + "city": "Terral", + "state": "OK", + "county": "Jefferson" + }, + { + "zip_code": 73570, + "latitude": 34.488104, + "longitude": -99.158545, + "city": "Tipton", + "state": "OK", + "county": "Tillman" + }, + { + "zip_code": 73571, + "latitude": 34.768632, + "longitude": -99.833341, + "city": "Vinson", + "state": "OK", + "county": "Harmon" + }, + { + "zip_code": 73572, + "latitude": 34.321541, + "longitude": -98.319264, + "city": "Walters", + "state": "OK", + "county": "Cotton" + }, + { + "zip_code": 73573, + "latitude": 34.168309, + "longitude": -98.000691, + "city": "Waurika", + "state": "OK", + "county": "Jefferson" + }, + { + "zip_code": 73575, + "latitude": 34.48532, + "longitude": -97.852223, + "city": "Duncan", + "state": "OK", + "county": "Stephens" + }, + { + "zip_code": 73601, + "latitude": 35.60603, + "longitude": -98.902136, + "city": "Clinton", + "state": "OK", + "county": "Custer" + }, + { + "zip_code": 73620, + "latitude": 35.566643, + "longitude": -98.960209, + "city": "Arapaho", + "state": "OK", + "county": "Custer" + }, + { + "zip_code": 73622, + "latitude": 35.387478, + "longitude": -98.989778, + "city": "Bessie", + "state": "OK", + "county": "Washita" + }, + { + "zip_code": 73624, + "latitude": 35.349154, + "longitude": -99.187984, + "city": "Burns Flat", + "state": "OK", + "county": "Washita" + }, + { + "zip_code": 73625, + "latitude": 35.63862, + "longitude": -99.00005, + "city": "Butler", + "state": "OK", + "county": "Custer" + }, + { + "zip_code": 73626, + "latitude": 35.418882, + "longitude": -99.280304, + "city": "Canute", + "state": "OK", + "county": "Washita" + }, + { + "zip_code": 73627, + "latitude": 35.26946, + "longitude": -99.680146, + "city": "Carter", + "state": "OK", + "county": "Beckham" + }, + { + "zip_code": 73628, + "latitude": 35.608071, + "longitude": -99.672542, + "city": "Cheyenne", + "state": "OK", + "county": "Roger Mills" + }, + { + "zip_code": 73632, + "latitude": 35.232961, + "longitude": -99.05841, + "city": "Cordell", + "state": "OK", + "county": "Washita" + }, + { + "zip_code": 73638, + "latitude": 35.717616, + "longitude": -99.682177, + "city": "Crawford", + "state": "OK", + "county": "Roger Mills" + }, + { + "zip_code": 73639, + "latitude": 35.62389, + "longitude": -98.912212, + "city": "Custer City", + "state": "OK", + "county": "Custer" + }, + { + "zip_code": 73641, + "latitude": 35.224845, + "longitude": -99.150331, + "city": "Dill City", + "state": "OK", + "county": "Washita" + }, + { + "zip_code": 73642, + "latitude": 35.717616, + "longitude": -99.682177, + "city": "Durham", + "state": "OK", + "county": "Roger Mills" + }, + { + "zip_code": 73644, + "latitude": 35.320621, + "longitude": -99.624253, + "city": "Elk City", + "state": "OK", + "county": "Beckham" + }, + { + "zip_code": 73645, + "latitude": 35.203883, + "longitude": -99.870825, + "city": "Erick", + "state": "OK", + "county": "Beckham" + }, + { + "zip_code": 73646, + "latitude": 35.988409, + "longitude": -99.007165, + "city": "Fay", + "state": "OK", + "county": "Dewey" + }, + { + "zip_code": 73647, + "latitude": 35.281428, + "longitude": -98.991373, + "city": "Foss", + "state": "OK", + "county": "Washita" + }, + { + "zip_code": 73648, + "latitude": 35.26946, + "longitude": -99.680146, + "city": "Elk City", + "state": "OK", + "county": "Beckham" + }, + { + "zip_code": 73650, + "latitude": 35.630294, + "longitude": -99.381869, + "city": "Hammon", + "state": "OK", + "county": "Roger Mills" + }, + { + "zip_code": 73651, + "latitude": 35.012688, + "longitude": -99.136501, + "city": "Hobart", + "state": "OK", + "county": "Kiowa" + }, + { + "zip_code": 73654, + "latitude": 35.868275, + "longitude": -99.344373, + "city": "Leedey", + "state": "OK", + "county": "Dewey" + }, + { + "zip_code": 73655, + "latitude": 34.989694, + "longitude": -99.24543, + "city": "Lone Wolf", + "state": "OK", + "county": "Kiowa" + }, + { + "zip_code": 73658, + "latitude": 35.93284, + "longitude": -98.706518, + "city": "Oakwood", + "state": "OK", + "county": "Dewey" + }, + { + "zip_code": 73659, + "latitude": 35.854883, + "longitude": -98.966584, + "city": "Putnam", + "state": "OK", + "county": "Dewey" + }, + { + "zip_code": 73660, + "latitude": 35.633338, + "longitude": -99.819077, + "city": "Reydon", + "state": "OK", + "county": "Roger Mills" + }, + { + "zip_code": 73661, + "latitude": 35.155439, + "longitude": -99.059758, + "city": "Rocky", + "state": "OK", + "county": "Washita" + }, + { + "zip_code": 73662, + "latitude": 35.237521, + "longitude": -99.74838, + "city": "Sayre", + "state": "OK", + "county": "Beckham" + }, + { + "zip_code": 73663, + "latitude": 36.100391, + "longitude": -98.94537, + "city": "Seiling", + "state": "OK", + "county": "Dewey" + }, + { + "zip_code": 73664, + "latitude": 35.283787, + "longitude": -99.170439, + "city": "Sentinel", + "state": "OK", + "county": "Washita" + }, + { + "zip_code": 73666, + "latitude": 35.717616, + "longitude": -99.682177, + "city": "Sweetwater", + "state": "OK", + "county": "Roger Mills" + }, + { + "zip_code": 73667, + "latitude": 36.040765, + "longitude": -98.961606, + "city": "Taloga", + "state": "OK", + "county": "Dewey" + }, + { + "zip_code": 73668, + "latitude": 35.26946, + "longitude": -99.680146, + "city": "Texola", + "state": "OK", + "county": "Beckham" + }, + { + "zip_code": 73669, + "latitude": 35.709894, + "longitude": -98.81099, + "city": "Thomas", + "state": "OK", + "county": "Custer" + }, + { + "zip_code": 73673, + "latitude": 34.920817, + "longitude": -99.567494, + "city": "Willow", + "state": "OK", + "county": "Greer" + }, + { + "zip_code": 73701, + "latitude": 36.402681, + "longitude": -97.843091, + "city": "Enid", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73702, + "latitude": 36.379072, + "longitude": -97.782595, + "city": "Enid", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73703, + "latitude": 36.398065, + "longitude": -97.943813, + "city": "Enid", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73705, + "latitude": 36.379072, + "longitude": -97.782595, + "city": "Enid", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73706, + "latitude": 36.379072, + "longitude": -97.782595, + "city": "Enid", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73716, + "latitude": 36.51176, + "longitude": -98.449895, + "city": "Aline", + "state": "OK", + "county": "Alfalfa" + }, + { + "zip_code": 73717, + "latitude": 36.826594, + "longitude": -98.640045, + "city": "Alva", + "state": "OK", + "county": "Woods" + }, + { + "zip_code": 73718, + "latitude": 36.246582, + "longitude": -98.185445, + "city": "Ames", + "state": "OK", + "county": "Major" + }, + { + "zip_code": 73719, + "latitude": 36.925116, + "longitude": -98.29243, + "city": "Amorita", + "state": "OK", + "county": "Alfalfa" + }, + { + "zip_code": 73720, + "latitude": 36.379072, + "longitude": -97.782595, + "city": "Bison", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73722, + "latitude": 36.730959, + "longitude": -98.324548, + "city": "Burlington", + "state": "OK", + "county": "Alfalfa" + }, + { + "zip_code": 73724, + "latitude": 36.09281, + "longitude": -98.577618, + "city": "Canton", + "state": "OK", + "county": "Blaine" + }, + { + "zip_code": 73726, + "latitude": 36.578946, + "longitude": -98.45608, + "city": "Carmen", + "state": "OK", + "county": "Alfalfa" + }, + { + "zip_code": 73727, + "latitude": 36.379072, + "longitude": -97.782595, + "city": "Carrier", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73728, + "latitude": 36.665351, + "longitude": -98.366783, + "city": "Cherokee", + "state": "OK", + "county": "Alfalfa" + }, + { + "zip_code": 73729, + "latitude": 36.4053, + "longitude": -98.453278, + "city": "Cleo Springs", + "state": "OK", + "county": "Major" + }, + { + "zip_code": 73730, + "latitude": 36.30749, + "longitude": -97.58643, + "city": "Covington", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73731, + "latitude": 36.662062, + "longitude": -98.562972, + "city": "Dacoma", + "state": "OK", + "county": "Woods" + }, + { + "zip_code": 73733, + "latitude": 36.379072, + "longitude": -97.782595, + "city": "Douglas", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73734, + "latitude": 35.982319, + "longitude": -97.912342, + "city": "Dover", + "state": "OK", + "county": "Kingfisher" + }, + { + "zip_code": 73735, + "latitude": 36.307449, + "longitude": -98.04182, + "city": "Drummond", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73736, + "latitude": 36.379072, + "longitude": -97.782595, + "city": "Fairmont", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73737, + "latitude": 36.323942, + "longitude": -98.337597, + "city": "Fairview", + "state": "OK", + "county": "Major" + }, + { + "zip_code": 73738, + "latitude": 36.436334, + "longitude": -97.580931, + "city": "Garber", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73739, + "latitude": 36.531985, + "longitude": -98.151279, + "city": "Goltry", + "state": "OK", + "county": "Alfalfa" + }, + { + "zip_code": 73741, + "latitude": 36.546639, + "longitude": -98.271091, + "city": "Helena", + "state": "OK", + "county": "Alfalfa" + }, + { + "zip_code": 73742, + "latitude": 35.924916, + "longitude": -97.938778, + "city": "Hennessey", + "state": "OK", + "county": "Kingfisher" + }, + { + "zip_code": 73743, + "latitude": 36.379072, + "longitude": -97.782595, + "city": "Hillsdale", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73744, + "latitude": 35.970011, + "longitude": -98.350529, + "city": "Hitchcock", + "state": "OK", + "county": "Blaine" + }, + { + "zip_code": 73746, + "latitude": 36.695512, + "longitude": -98.994721, + "city": "Hopeton", + "state": "OK", + "county": "Woods" + }, + { + "zip_code": 73747, + "latitude": 36.334047, + "longitude": -98.532338, + "city": "Isabella", + "state": "OK", + "county": "Major" + }, + { + "zip_code": 73749, + "latitude": 36.666492, + "longitude": -98.181223, + "city": "Jet", + "state": "OK", + "county": "Alfalfa" + }, + { + "zip_code": 73750, + "latitude": 35.897508, + "longitude": -97.92563, + "city": "Kingfisher", + "state": "OK", + "county": "Kingfisher" + }, + { + "zip_code": 73753, + "latitude": 36.528516, + "longitude": -97.849762, + "city": "Kremlin", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73754, + "latitude": 36.388985, + "longitude": -98.091121, + "city": "Lahoma", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73755, + "latitude": 36.133739, + "longitude": -98.551349, + "city": "Longdale", + "state": "OK", + "county": "Blaine" + }, + { + "zip_code": 73756, + "latitude": 35.945046, + "longitude": -97.942225, + "city": "Loyal", + "state": "OK", + "county": "Kingfisher" + }, + { + "zip_code": 73757, + "latitude": 36.272842, + "longitude": -97.454971, + "city": "Lucien", + "state": "OK", + "county": "Noble" + }, + { + "zip_code": 73758, + "latitude": 36.79613, + "longitude": -97.787099, + "city": "Manchester", + "state": "OK", + "county": "Grant" + }, + { + "zip_code": 73759, + "latitude": 36.7394, + "longitude": -97.889923, + "city": "Medford", + "state": "OK", + "county": "Grant" + }, + { + "zip_code": 73760, + "latitude": 36.384201, + "longitude": -98.209947, + "city": "Meno", + "state": "OK", + "county": "Major" + }, + { + "zip_code": 73761, + "latitude": 36.664875, + "longitude": -98.0517, + "city": "Nash", + "state": "OK", + "county": "Grant" + }, + { + "zip_code": 73762, + "latitude": 35.732016, + "longitude": -97.97746, + "city": "Okarche", + "state": "OK", + "county": "Canadian" + }, + { + "zip_code": 73763, + "latitude": 36.122914, + "longitude": -98.42913, + "city": "Okeene", + "state": "OK", + "county": "Blaine" + }, + { + "zip_code": 73764, + "latitude": 35.945046, + "longitude": -97.942225, + "city": "Omega", + "state": "OK", + "county": "Kingfisher" + }, + { + "zip_code": 73766, + "latitude": 36.661992, + "longitude": -97.841842, + "city": "Pond Creek", + "state": "OK", + "county": "Grant" + }, + { + "zip_code": 73768, + "latitude": 36.379012, + "longitude": -98.243516, + "city": "Ringwood", + "state": "OK", + "county": "Major" + }, + { + "zip_code": 73770, + "latitude": 36.058133, + "longitude": -98.588383, + "city": "Southard", + "state": "OK", + "county": "Blaine" + }, + { + "zip_code": 73771, + "latitude": 36.882468, + "longitude": -97.923858, + "city": "Wakita", + "state": "OK", + "county": "Grant" + }, + { + "zip_code": 73772, + "latitude": 35.980824, + "longitude": -98.37882, + "city": "Watonga", + "state": "OK", + "county": "Blaine" + }, + { + "zip_code": 73773, + "latitude": 36.241968, + "longitude": -97.911828, + "city": "Waukomis", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 73801, + "latitude": 36.438017, + "longitude": -99.442977, + "city": "Woodward", + "state": "OK", + "county": "Woodward" + }, + { + "zip_code": 73802, + "latitude": 36.431095, + "longitude": -99.534157, + "city": "Woodward", + "state": "OK", + "county": "Woodward" + }, + { + "zip_code": 73832, + "latitude": 36.204191, + "longitude": -99.818311, + "city": "Arnett", + "state": "OK", + "county": "Ellis" + }, + { + "zip_code": 73834, + "latitude": 36.791802, + "longitude": -99.753511, + "city": "Buffalo", + "state": "OK", + "county": "Harper" + }, + { + "zip_code": 73835, + "latitude": 36.019939, + "longitude": -99.287978, + "city": "Camargo", + "state": "OK", + "county": "Dewey" + }, + { + "zip_code": 73838, + "latitude": 36.334047, + "longitude": -98.532338, + "city": "Chester", + "state": "OK", + "county": "Major" + }, + { + "zip_code": 73840, + "latitude": 36.373497, + "longitude": -99.622067, + "city": "Fargo", + "state": "OK", + "county": "Ellis" + }, + { + "zip_code": 73841, + "latitude": 36.572183, + "longitude": -99.573764, + "city": "Fort Supply", + "state": "OK", + "county": "Woodward" + }, + { + "zip_code": 73842, + "latitude": 36.768905, + "longitude": -99.112676, + "city": "Freedom", + "state": "OK", + "county": "Woods" + }, + { + "zip_code": 73843, + "latitude": 36.255493, + "longitude": -99.753814, + "city": "Gage", + "state": "OK", + "county": "Ellis" + }, + { + "zip_code": 73844, + "latitude": 36.750783, + "longitude": -100.478393, + "city": "Gate", + "state": "OK", + "county": "Beaver" + }, + { + "zip_code": 73847, + "latitude": 36.750783, + "longitude": -100.478393, + "city": "Knowles", + "state": "OK", + "county": "Beaver" + }, + { + "zip_code": 73848, + "latitude": 36.764793, + "longitude": -99.765785, + "city": "Laverne", + "state": "OK", + "county": "Harper" + }, + { + "zip_code": 73851, + "latitude": 36.797229, + "longitude": -99.64949, + "city": "May", + "state": "OK", + "county": "Harper" + }, + { + "zip_code": 73852, + "latitude": 36.460397, + "longitude": -99.202631, + "city": "Mooreland", + "state": "OK", + "county": "Woodward" + }, + { + "zip_code": 73853, + "latitude": 36.490567, + "longitude": -99.280828, + "city": "Mutual", + "state": "OK", + "county": "Woodward" + }, + { + "zip_code": 73855, + "latitude": 36.797229, + "longitude": -99.64949, + "city": "Rosston", + "state": "OK", + "county": "Harper" + }, + { + "zip_code": 73857, + "latitude": 36.27581, + "longitude": -99.33784, + "city": "Sharon", + "state": "OK", + "county": "Woodward" + }, + { + "zip_code": 73858, + "latitude": 36.318631, + "longitude": -99.758319, + "city": "Shattuck", + "state": "OK", + "county": "Ellis" + }, + { + "zip_code": 73859, + "latitude": 36.149508, + "longitude": -99.301912, + "city": "Vici", + "state": "OK", + "county": "Dewey" + }, + { + "zip_code": 73860, + "latitude": 36.671897, + "longitude": -98.974629, + "city": "Waynoka", + "state": "OK", + "county": "Woods" + }, + { + "zip_code": 73901, + "latitude": 36.755, + "longitude": -101.077969, + "city": "Adams", + "state": "OK", + "county": "Texas" + }, + { + "zip_code": 73931, + "latitude": 36.750783, + "longitude": -100.478393, + "city": "Balko", + "state": "OK", + "county": "Beaver" + }, + { + "zip_code": 73932, + "latitude": 36.834113, + "longitude": -100.51773, + "city": "Beaver", + "state": "OK", + "county": "Beaver" + }, + { + "zip_code": 73933, + "latitude": 36.742042, + "longitude": -102.510484, + "city": "Boise City", + "state": "OK", + "county": "Cimarron" + }, + { + "zip_code": 73937, + "latitude": 36.75051, + "longitude": -102.515316, + "city": "Felt", + "state": "OK", + "county": "Cimarron" + }, + { + "zip_code": 73938, + "latitude": 36.86081, + "longitude": -100.531611, + "city": "Forgan", + "state": "OK", + "county": "Beaver" + }, + { + "zip_code": 73939, + "latitude": 36.594672, + "longitude": -101.630164, + "city": "Goodwell", + "state": "OK", + "county": "Texas" + }, + { + "zip_code": 73942, + "latitude": 36.729713, + "longitude": -101.426147, + "city": "Guymon", + "state": "OK", + "county": "Texas" + }, + { + "zip_code": 73944, + "latitude": 36.615367, + "longitude": -101.198155, + "city": "Hardesty", + "state": "OK", + "county": "Texas" + }, + { + "zip_code": 73945, + "latitude": 36.810851, + "longitude": -101.216333, + "city": "Hooker", + "state": "OK", + "county": "Texas" + }, + { + "zip_code": 73946, + "latitude": 36.903144, + "longitude": -102.965301, + "city": "Kenton", + "state": "OK", + "county": "Cimarron" + }, + { + "zip_code": 73947, + "latitude": 36.8079, + "longitude": -102.250924, + "city": "Keyes", + "state": "OK", + "county": "Cimarron" + }, + { + "zip_code": 73949, + "latitude": 36.507508, + "longitude": -101.780668, + "city": "Texhoma", + "state": "OK", + "county": "Texas" + }, + { + "zip_code": 73950, + "latitude": 36.866365, + "longitude": -100.877878, + "city": "Turpin", + "state": "OK", + "county": "Beaver" + }, + { + "zip_code": 73951, + "latitude": 36.971874, + "longitude": -101.073973, + "city": "Tyrone", + "state": "OK", + "county": "Texas" + }, + { + "zip_code": 74001, + "latitude": 36.490056, + "longitude": -96.061608, + "city": "Avant", + "state": "OK", + "county": "Osage" + }, + { + "zip_code": 74002, + "latitude": 36.561588, + "longitude": -96.162409, + "city": "Barnsdall", + "state": "OK", + "county": "Osage" + }, + { + "zip_code": 74003, + "latitude": 36.759485, + "longitude": -95.970182, + "city": "Bartlesville", + "state": "OK", + "county": "Washington" + }, + { + "zip_code": 74004, + "latitude": 36.711386, + "longitude": -95.894042, + "city": "Bartlesville", + "state": "OK", + "county": "Washington" + }, + { + "zip_code": 74005, + "latitude": 36.711386, + "longitude": -95.894042, + "city": "Bartlesville", + "state": "OK", + "county": "Washington" + }, + { + "zip_code": 74006, + "latitude": 36.728057, + "longitude": -95.89064, + "city": "Bartlesville", + "state": "OK", + "county": "Washington" + }, + { + "zip_code": 74008, + "latitude": 35.93345, + "longitude": -95.877617, + "city": "Bixby", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74009, + "latitude": 36.665794, + "longitude": -96.398424, + "city": "Bowring", + "state": "OK", + "county": "Osage" + }, + { + "zip_code": 74010, + "latitude": 35.835606, + "longitude": -96.303922, + "city": "Bristow", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74011, + "latitude": 35.986399, + "longitude": -95.818064, + "city": "Broken Arrow", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74012, + "latitude": 36.14226, + "longitude": -95.879069, + "city": "Broken Arrow", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74013, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Broken Arrow", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74014, + "latitude": 36.005673, + "longitude": -95.654486, + "city": "Broken Arrow", + "state": "OK", + "county": "Wagoner" + }, + { + "zip_code": 74015, + "latitude": 36.212092, + "longitude": -95.72584, + "city": "Catoosa", + "state": "OK", + "county": "Rogers" + }, + { + "zip_code": 74016, + "latitude": 36.495713, + "longitude": -95.435688, + "city": "Chelsea", + "state": "OK", + "county": "Rogers" + }, + { + "zip_code": 74017, + "latitude": 36.348616, + "longitude": -95.604344, + "city": "Claremore", + "state": "OK", + "county": "Rogers" + }, + { + "zip_code": 74018, + "latitude": 36.343579, + "longitude": -95.605964, + "city": "Claremore", + "state": "OK", + "county": "Rogers" + }, + { + "zip_code": 74020, + "latitude": 36.263766, + "longitude": -96.443319, + "city": "Cleveland", + "state": "OK", + "county": "Pawnee" + }, + { + "zip_code": 74021, + "latitude": 36.370042, + "longitude": -95.857143, + "city": "Collinsville", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74022, + "latitude": 36.800524, + "longitude": -95.922953, + "city": "Copan", + "state": "OK", + "county": "Washington" + }, + { + "zip_code": 74023, + "latitude": 36.029294, + "longitude": -96.855949, + "city": "Cushing", + "state": "OK", + "county": "Payne" + }, + { + "zip_code": 74026, + "latitude": 35.708886, + "longitude": -96.766992, + "city": "Davenport", + "state": "OK", + "county": "Lincoln" + }, + { + "zip_code": 74027, + "latitude": 36.777208, + "longitude": -95.641981, + "city": "Delaware", + "state": "OK", + "county": "Nowata" + }, + { + "zip_code": 74028, + "latitude": 35.769827, + "longitude": -96.49192, + "city": "Depew", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74029, + "latitude": 36.676086, + "longitude": -95.896743, + "city": "Dewey", + "state": "OK", + "county": "Washington" + }, + { + "zip_code": 74030, + "latitude": 36.012363, + "longitude": -96.548022, + "city": "Drumright", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74031, + "latitude": 36.336457, + "longitude": -95.571646, + "city": "Foyil", + "state": "OK", + "county": "Rogers" + }, + { + "zip_code": 74032, + "latitude": 36.225349, + "longitude": -96.933795, + "city": "Glencoe", + "state": "OK", + "county": "Payne" + }, + { + "zip_code": 74033, + "latitude": 36.102858, + "longitude": -95.998172, + "city": "Glenpool", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74034, + "latitude": 36.36216, + "longitude": -96.637553, + "city": "Hallett", + "state": "OK", + "county": "Pawnee" + }, + { + "zip_code": 74035, + "latitude": 36.363731, + "longitude": -96.236595, + "city": "Hominy", + "state": "OK", + "county": "Osage" + }, + { + "zip_code": 74036, + "latitude": 36.169526, + "longitude": -95.521145, + "city": "Inola", + "state": "OK", + "county": "Rogers" + }, + { + "zip_code": 74037, + "latitude": 36.006567, + "longitude": -95.980972, + "city": "Jenks", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74038, + "latitude": 36.180965, + "longitude": -96.570239, + "city": "Jennings", + "state": "OK", + "county": "Pawnee" + }, + { + "zip_code": 74039, + "latitude": 35.908301, + "longitude": -96.240843, + "city": "Kellyville", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74041, + "latitude": 35.948245, + "longitude": -96.071685, + "city": "Kiefer", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74042, + "latitude": 36.922429, + "longitude": -95.629628, + "city": "Lenapah", + "state": "OK", + "county": "Nowata" + }, + { + "zip_code": 74043, + "latitude": 35.918277, + "longitude": -95.798809, + "city": "Leonard", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74044, + "latitude": 36.079255, + "longitude": -96.378373, + "city": "Mannford", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74045, + "latitude": 36.36216, + "longitude": -96.637553, + "city": "Maramec", + "state": "OK", + "county": "Pawnee" + }, + { + "zip_code": 74046, + "latitude": 35.901277, + "longitude": -96.326053, + "city": "Milfay", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74047, + "latitude": 35.889588, + "longitude": -96.088684, + "city": "Mounds", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74048, + "latitude": 36.69908, + "longitude": -95.631607, + "city": "Nowata", + "state": "OK", + "county": "Nowata" + }, + { + "zip_code": 74050, + "latitude": 36.07694, + "longitude": -96.069726, + "city": "Oakhurst", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74051, + "latitude": 36.624717, + "longitude": -95.951734, + "city": "Ochelata", + "state": "OK", + "county": "Washington" + }, + { + "zip_code": 74052, + "latitude": 36.068495, + "longitude": -96.595845, + "city": "Oilton", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74053, + "latitude": 36.448241, + "longitude": -95.704667, + "city": "Oologah", + "state": "OK", + "county": "Rogers" + }, + { + "zip_code": 74054, + "latitude": 36.265311, + "longitude": -96.341334, + "city": "Osage", + "state": "OK", + "county": "Osage" + }, + { + "zip_code": 74055, + "latitude": 36.140225, + "longitude": -95.909669, + "city": "Owasso", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74056, + "latitude": 36.620131, + "longitude": -96.324443, + "city": "Pawhuska", + "state": "OK", + "county": "Osage" + }, + { + "zip_code": 74058, + "latitude": 36.306976, + "longitude": -96.706208, + "city": "Pawnee", + "state": "OK", + "county": "Pawnee" + }, + { + "zip_code": 74059, + "latitude": 36.096244, + "longitude": -97.000469, + "city": "Perkins", + "state": "OK", + "county": "Payne" + }, + { + "zip_code": 74060, + "latitude": 36.580102, + "longitude": -96.532552, + "city": "Prue", + "state": "OK", + "county": "Osage" + }, + { + "zip_code": 74061, + "latitude": 36.533445, + "longitude": -95.905906, + "city": "Ramona", + "state": "OK", + "county": "Washington" + }, + { + "zip_code": 74062, + "latitude": 36.049649, + "longitude": -96.928923, + "city": "Ripley", + "state": "OK", + "county": "Payne" + }, + { + "zip_code": 74063, + "latitude": 36.118535, + "longitude": -96.186776, + "city": "Sand Springs", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74066, + "latitude": 35.982642, + "longitude": -96.163955, + "city": "Sapulpa", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74067, + "latitude": 36.019575, + "longitude": -96.093682, + "city": "Sapulpa", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74068, + "latitude": 35.912399, + "longitude": -96.57803, + "city": "Shamrock", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74070, + "latitude": 36.413662, + "longitude": -96.168498, + "city": "Skiatook", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74071, + "latitude": 35.901277, + "longitude": -96.326053, + "city": "Slick", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74072, + "latitude": 36.927212, + "longitude": -95.621099, + "city": "S Coffeyville", + "state": "OK", + "county": "Nowata" + }, + { + "zip_code": 74073, + "latitude": 36.298452, + "longitude": -95.951622, + "city": "Sperry", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74074, + "latitude": 36.101521, + "longitude": -97.069061, + "city": "Stillwater", + "state": "OK", + "county": "Payne" + }, + { + "zip_code": 74075, + "latitude": 36.167933, + "longitude": -97.068895, + "city": "Stillwater", + "state": "OK", + "county": "Payne" + }, + { + "zip_code": 74076, + "latitude": 36.072372, + "longitude": -97.055141, + "city": "Stillwater", + "state": "OK", + "county": "Payne" + }, + { + "zip_code": 74077, + "latitude": 36.093665, + "longitude": -96.987458, + "city": "Stillwater", + "state": "OK", + "county": "Payne" + }, + { + "zip_code": 74078, + "latitude": 36.093665, + "longitude": -96.987458, + "city": "Stillwater", + "state": "OK", + "county": "Payne" + }, + { + "zip_code": 74079, + "latitude": 35.709676, + "longitude": -96.745384, + "city": "Stroud", + "state": "OK", + "county": "Lincoln" + }, + { + "zip_code": 74080, + "latitude": 36.496258, + "longitude": -95.70201, + "city": "Talala", + "state": "OK", + "county": "Rogers" + }, + { + "zip_code": 74081, + "latitude": 36.188021, + "longitude": -96.491832, + "city": "Terlton", + "state": "OK", + "county": "Pawnee" + }, + { + "zip_code": 74082, + "latitude": 36.450115, + "longitude": -95.881381, + "city": "Vera", + "state": "OK", + "county": "Washington" + }, + { + "zip_code": 74083, + "latitude": 36.798384, + "longitude": -95.608896, + "city": "Wann", + "state": "OK", + "county": "Nowata" + }, + { + "zip_code": 74084, + "latitude": 36.546423, + "longitude": -96.326019, + "city": "Wynona", + "state": "OK", + "county": "Osage" + }, + { + "zip_code": 74085, + "latitude": 36.164752, + "longitude": -96.803185, + "city": "Yale", + "state": "OK", + "county": "Payne" + }, + { + "zip_code": 74101, + "latitude": 36.039147, + "longitude": -95.868667, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74102, + "latitude": 36.063095, + "longitude": -95.804231, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74103, + "latitude": 36.155392, + "longitude": -95.994424, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74104, + "latitude": 36.146143, + "longitude": -95.951483, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74105, + "latitude": 36.097094, + "longitude": -95.91987, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74106, + "latitude": 36.190442, + "longitude": -95.979824, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74107, + "latitude": 36.076795, + "longitude": -95.954871, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74108, + "latitude": 36.147696, + "longitude": -95.797314, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74110, + "latitude": 36.158314, + "longitude": -95.927771, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74112, + "latitude": 36.146741, + "longitude": -95.90447, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74114, + "latitude": 36.125893, + "longitude": -95.947421, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74115, + "latitude": 36.147343, + "longitude": -95.90717, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74116, + "latitude": 36.189944, + "longitude": -95.817465, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74117, + "latitude": 36.218091, + "longitude": -95.947122, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74119, + "latitude": 36.115461, + "longitude": -95.930271, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74120, + "latitude": 36.148593, + "longitude": -95.979824, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74121, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74126, + "latitude": 36.249491, + "longitude": -95.977624, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74127, + "latitude": 36.221189, + "longitude": -96.05762, + "city": "Tulsa", + "state": "OK", + "county": "Osage" + }, + { + "zip_code": 74128, + "latitude": 36.125545, + "longitude": -95.885568, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74129, + "latitude": 36.125996, + "longitude": -95.868767, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74130, + "latitude": 36.242342, + "longitude": -95.955453, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74131, + "latitude": 36.04989, + "longitude": -96.074326, + "city": "Tulsa", + "state": "OK", + "county": "Creek" + }, + { + "zip_code": 74132, + "latitude": 36.045543, + "longitude": -95.956267, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74133, + "latitude": 36.062203, + "longitude": -95.873067, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74134, + "latitude": 36.104447, + "longitude": -95.804014, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74135, + "latitude": 36.092236, + "longitude": -95.923175, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74136, + "latitude": 36.053498, + "longitude": -95.920371, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74137, + "latitude": 36.017296, + "longitude": -95.93902, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74141, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74145, + "latitude": 36.118687, + "longitude": -95.884368, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74146, + "latitude": 36.097046, + "longitude": -95.846066, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74147, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74148, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74149, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74150, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74152, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74153, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74155, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74156, + "latitude": 36.302391, + "longitude": -95.960472, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74157, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74158, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74159, + "latitude": 36.077221, + "longitude": -96.083477, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74169, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74170, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74171, + "latitude": 36.054345, + "longitude": -95.957721, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74172, + "latitude": 36.154342, + "longitude": -95.992323, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74182, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74183, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74184, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74186, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74187, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74189, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74192, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74193, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74194, + "latitude": 36.139826, + "longitude": -96.029725, + "city": "Tulsa", + "state": "OK", + "county": "Tulsa" + }, + { + "zip_code": 74301, + "latitude": 36.723649, + "longitude": -95.197639, + "city": "Vinita", + "state": "OK", + "county": "Craig" + }, + { + "zip_code": 74330, + "latitude": 36.43736, + "longitude": -95.26975, + "city": "Adair", + "state": "OK", + "county": "Mayes" + }, + { + "zip_code": 74331, + "latitude": 36.82215, + "longitude": -94.916222, + "city": "Afton", + "state": "OK", + "county": "Ottawa" + }, + { + "zip_code": 74332, + "latitude": 36.533954, + "longitude": -95.224568, + "city": "Big Cabin", + "state": "OK", + "county": "Craig" + }, + { + "zip_code": 74333, + "latitude": 36.844913, + "longitude": -95.073159, + "city": "Bluejacket", + "state": "OK", + "county": "Craig" + }, + { + "zip_code": 74335, + "latitude": 36.833508, + "longitude": -94.82788, + "city": "Cardin", + "state": "OK", + "county": "Ottawa" + }, + { + "zip_code": 74337, + "latitude": 36.187866, + "longitude": -95.261554, + "city": "Chouteau", + "state": "OK", + "county": "Mayes" + }, + { + "zip_code": 74338, + "latitude": 36.265655, + "longitude": -94.694674, + "city": "Colcord", + "state": "OK", + "county": "Delaware" + }, + { + "zip_code": 74339, + "latitude": 36.829945, + "longitude": -94.876086, + "city": "Commerce", + "state": "OK", + "county": "Ottawa" + }, + { + "zip_code": 74340, + "latitude": 36.292495, + "longitude": -95.222792, + "city": "Disney", + "state": "OK", + "county": "Mayes" + }, + { + "zip_code": 74342, + "latitude": 36.415938, + "longitude": -94.787091, + "city": "Eucha", + "state": "OK", + "county": "Delaware" + }, + { + "zip_code": 74343, + "latitude": 36.741636, + "longitude": -94.826053, + "city": "Fairland", + "state": "OK", + "county": "Ottawa" + }, + { + "zip_code": 74344, + "latitude": 36.545757, + "longitude": -94.74162, + "city": "Grove", + "state": "OK", + "county": "Delaware" + }, + { + "zip_code": 74345, + "latitude": 36.603587, + "longitude": -94.72974, + "city": "Grove", + "state": "OK", + "county": "Delaware" + }, + { + "zip_code": 74346, + "latitude": 36.482043, + "longitude": -94.802653, + "city": "Jay", + "state": "OK", + "county": "Delaware" + }, + { + "zip_code": 74347, + "latitude": 36.210142, + "longitude": -94.759426, + "city": "Kansas", + "state": "OK", + "county": "Delaware" + }, + { + "zip_code": 74349, + "latitude": 36.489096, + "longitude": -95.027854, + "city": "Ketchum", + "state": "OK", + "county": "Mayes" + }, + { + "zip_code": 74350, + "latitude": 36.464494, + "longitude": -95.047773, + "city": "Langley", + "state": "OK", + "county": "Mayes" + }, + { + "zip_code": 74352, + "latitude": 36.198011, + "longitude": -95.167408, + "city": "Locust Grove", + "state": "OK", + "county": "Mayes" + }, + { + "zip_code": 74354, + "latitude": 36.842401, + "longitude": -94.854482, + "city": "Miami", + "state": "OK", + "county": "Ottawa" + }, + { + "zip_code": 74355, + "latitude": 36.83408, + "longitude": -94.877031, + "city": "Miami", + "state": "OK", + "county": "Ottawa" + }, + { + "zip_code": 74358, + "latitude": 36.916334, + "longitude": -94.885709, + "city": "North Miami", + "state": "OK", + "county": "Ottawa" + }, + { + "zip_code": 74359, + "latitude": 36.415938, + "longitude": -94.787091, + "city": "Oaks", + "state": "OK", + "county": "Delaware" + }, + { + "zip_code": 74360, + "latitude": 36.946023, + "longitude": -94.740343, + "city": "Picher", + "state": "OK", + "county": "Ottawa" + }, + { + "zip_code": 74361, + "latitude": 36.307279, + "longitude": -95.271696, + "city": "Pryor", + "state": "OK", + "county": "Mayes" + }, + { + "zip_code": 74362, + "latitude": 36.292495, + "longitude": -95.222792, + "city": "Pryor", + "state": "OK", + "county": "Mayes" + }, + { + "zip_code": 74363, + "latitude": 36.942292, + "longitude": -94.733392, + "city": "Quapaw", + "state": "OK", + "county": "Ottawa" + }, + { + "zip_code": 74364, + "latitude": 36.292495, + "longitude": -95.222792, + "city": "Rose", + "state": "OK", + "county": "Mayes" + }, + { + "zip_code": 74365, + "latitude": 36.286057, + "longitude": -95.232816, + "city": "Salina", + "state": "OK", + "county": "Mayes" + }, + { + "zip_code": 74366, + "latitude": 36.396264, + "longitude": -95.049656, + "city": "Spavinaw", + "state": "OK", + "county": "Mayes" + }, + { + "zip_code": 74367, + "latitude": 36.414108, + "longitude": -95.077276, + "city": "Strang", + "state": "OK", + "county": "Mayes" + }, + { + "zip_code": 74368, + "latitude": 36.205961, + "longitude": -94.797319, + "city": "Twin Oaks", + "state": "OK", + "county": "Delaware" + }, + { + "zip_code": 74369, + "latitude": 36.885732, + "longitude": -95.215685, + "city": "Welch", + "state": "OK", + "county": "Craig" + }, + { + "zip_code": 74370, + "latitude": 36.798561, + "longitude": -94.789475, + "city": "Wyandotte", + "state": "OK", + "county": "Ottawa" + }, + { + "zip_code": 74401, + "latitude": 35.70582, + "longitude": -95.50025, + "city": "Muskogee", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74402, + "latitude": 35.764223, + "longitude": -95.306916, + "city": "Muskogee", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74403, + "latitude": 35.654483, + "longitude": -95.433598, + "city": "Muskogee", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74421, + "latitude": 35.737125, + "longitude": -96.026538, + "city": "Beggs", + "state": "OK", + "county": "Okmulgee" + }, + { + "zip_code": 74422, + "latitude": 35.559244, + "longitude": -95.408146, + "city": "Boynton", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74423, + "latitude": 35.662957, + "longitude": -95.19778, + "city": "Braggs", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74425, + "latitude": 35.157132, + "longitude": -95.621536, + "city": "Canadian", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74426, + "latitude": 35.492196, + "longitude": -95.517816, + "city": "Checotah", + "state": "OK", + "county": "Mcintosh" + }, + { + "zip_code": 74427, + "latitude": 35.8093, + "longitude": -95.076549, + "city": "Cookson", + "state": "OK", + "county": "Cherokee" + }, + { + "zip_code": 74428, + "latitude": 35.559244, + "longitude": -95.408146, + "city": "Council Hill", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74429, + "latitude": 36.002092, + "longitude": -95.674795, + "city": "Coweta", + "state": "OK", + "county": "Wagoner" + }, + { + "zip_code": 74430, + "latitude": 34.947259, + "longitude": -95.720708, + "city": "Crowder", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74431, + "latitude": 35.455066, + "longitude": -95.949771, + "city": "Dewar", + "state": "OK", + "county": "Okmulgee" + }, + { + "zip_code": 74432, + "latitude": 35.318019, + "longitude": -95.588523, + "city": "Eufaula", + "state": "OK", + "county": "Mcintosh" + }, + { + "zip_code": 74434, + "latitude": 35.739927, + "longitude": -95.40064, + "city": "Fort Gibson", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74435, + "latitude": 35.532577, + "longitude": -95.109916, + "city": "Gore", + "state": "OK", + "county": "Sequoyah" + }, + { + "zip_code": 74436, + "latitude": 35.813548, + "longitude": -95.681972, + "city": "Haskell", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74437, + "latitude": 35.462159, + "longitude": -96.012229, + "city": "Henryetta", + "state": "OK", + "county": "Okmulgee" + }, + { + "zip_code": 74438, + "latitude": 35.347368, + "longitude": -95.664118, + "city": "Hitchita", + "state": "OK", + "county": "Mcintosh" + }, + { + "zip_code": 74440, + "latitude": 35.258196, + "longitude": -95.134492, + "city": "Hoyt", + "state": "OK", + "county": "Haskell" + }, + { + "zip_code": 74441, + "latitude": 35.94161, + "longitude": -95.198082, + "city": "Hulbert", + "state": "OK", + "county": "Cherokee" + }, + { + "zip_code": 74442, + "latitude": 34.947259, + "longitude": -95.720708, + "city": "Indianola", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74444, + "latitude": 36.025728, + "longitude": -94.957751, + "city": "Moodys", + "state": "OK", + "county": "Cherokee" + }, + { + "zip_code": 74445, + "latitude": 35.624291, + "longitude": -95.841592, + "city": "Morris", + "state": "OK", + "county": "Okmulgee" + }, + { + "zip_code": 74446, + "latitude": 35.857722, + "longitude": -95.285648, + "city": "Okay", + "state": "OK", + "county": "Wagoner" + }, + { + "zip_code": 74447, + "latitude": 35.612514, + "longitude": -95.966857, + "city": "Okmulgee", + "state": "OK", + "county": "Okmulgee" + }, + { + "zip_code": 74450, + "latitude": 35.604611, + "longitude": -95.463621, + "city": "Oktaha", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74451, + "latitude": 35.727468, + "longitude": -94.997651, + "city": "Park Hill", + "state": "OK", + "county": "Cherokee" + }, + { + "zip_code": 74452, + "latitude": 35.900074, + "longitude": -95.040008, + "city": "Peggs", + "state": "OK", + "county": "Cherokee" + }, + { + "zip_code": 74454, + "latitude": 35.86881, + "longitude": -95.522072, + "city": "Porter", + "state": "OK", + "county": "Wagoner" + }, + { + "zip_code": 74455, + "latitude": 35.46187, + "longitude": -95.297144, + "city": "Porum", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74456, + "latitude": 35.616975, + "longitude": -95.952741, + "city": "Preston", + "state": "OK", + "county": "Okmulgee" + }, + { + "zip_code": 74457, + "latitude": 35.900019, + "longitude": -94.640218, + "city": "Proctor", + "state": "OK", + "county": "Adair" + }, + { + "zip_code": 74458, + "latitude": 35.963567, + "longitude": -95.513856, + "city": "Redbird", + "state": "OK", + "county": "Wagoner" + }, + { + "zip_code": 74459, + "latitude": 35.521423, + "longitude": -95.494952, + "city": "Rentiesville", + "state": "OK", + "county": "Mcintosh" + }, + { + "zip_code": 74460, + "latitude": 35.513169, + "longitude": -95.958271, + "city": "Schulter", + "state": "OK", + "county": "Okmulgee" + }, + { + "zip_code": 74461, + "latitude": 35.347368, + "longitude": -95.664118, + "city": "Stidham", + "state": "OK", + "county": "Mcintosh" + }, + { + "zip_code": 74462, + "latitude": 35.266094, + "longitude": -95.061902, + "city": "Stigler", + "state": "OK", + "county": "Haskell" + }, + { + "zip_code": 74463, + "latitude": 35.763648, + "longitude": -95.544501, + "city": "Taft", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74464, + "latitude": 35.911304, + "longitude": -94.911331, + "city": "Tahlequah", + "state": "OK", + "county": "Cherokee" + }, + { + "zip_code": 74465, + "latitude": 35.900074, + "longitude": -95.040008, + "city": "Tahlequah", + "state": "OK", + "county": "Cherokee" + }, + { + "zip_code": 74466, + "latitude": 35.963567, + "longitude": -95.513856, + "city": "Tullahassee", + "state": "OK", + "county": "Wagoner" + }, + { + "zip_code": 74467, + "latitude": 35.943419, + "longitude": -95.415011, + "city": "Wagoner", + "state": "OK", + "county": "Wagoner" + }, + { + "zip_code": 74468, + "latitude": 35.559244, + "longitude": -95.408146, + "city": "Wainwright", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74469, + "latitude": 35.493529, + "longitude": -95.390328, + "city": "Warner", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74470, + "latitude": 35.511412, + "longitude": -95.131499, + "city": "Webbers Falls", + "state": "OK", + "county": "Muskogee" + }, + { + "zip_code": 74471, + "latitude": 35.764427, + "longitude": -94.881607, + "city": "Welling", + "state": "OK", + "county": "Cherokee" + }, + { + "zip_code": 74472, + "latitude": 35.258196, + "longitude": -95.134492, + "city": "Whitefield", + "state": "OK", + "county": "Haskell" + }, + { + "zip_code": 74477, + "latitude": 35.963567, + "longitude": -95.513856, + "city": "Wagoner", + "state": "OK", + "county": "Wagoner" + }, + { + "zip_code": 74501, + "latitude": 34.922756, + "longitude": -95.685544, + "city": "Mcalester", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74502, + "latitude": 34.947259, + "longitude": -95.720708, + "city": "Mcalester", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74521, + "latitude": 34.418801, + "longitude": -95.358406, + "city": "Albion", + "state": "OK", + "county": "Pushmataha" + }, + { + "zip_code": 74522, + "latitude": 34.904489, + "longitude": -95.69806, + "city": "Alderson", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74523, + "latitude": 34.215441, + "longitude": -95.626306, + "city": "Antlers", + "state": "OK", + "county": "Pushmataha" + }, + { + "zip_code": 74525, + "latitude": 34.358254, + "longitude": -96.0825, + "city": "Atoka", + "state": "OK", + "county": "Atoka" + }, + { + "zip_code": 74528, + "latitude": 34.947259, + "longitude": -95.720708, + "city": "Blanco", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74529, + "latitude": 34.947259, + "longitude": -95.720708, + "city": "Blocker", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74530, + "latitude": 34.310191, + "longitude": -96.670349, + "city": "Bromide", + "state": "OK", + "county": "Johnston" + }, + { + "zip_code": 74531, + "latitude": 35.028521, + "longitude": -96.235928, + "city": "Calvin", + "state": "OK", + "county": "Hughes" + }, + { + "zip_code": 74533, + "latitude": 34.208512, + "longitude": -96.197853, + "city": "Caney", + "state": "OK", + "county": "Atoka" + }, + { + "zip_code": 74534, + "latitude": 34.592949, + "longitude": -96.303069, + "city": "Centrahoma", + "state": "OK", + "county": "Coal" + }, + { + "zip_code": 74535, + "latitude": 34.592949, + "longitude": -96.303069, + "city": "Clarita", + "state": "OK", + "county": "Coal" + }, + { + "zip_code": 74536, + "latitude": 34.418801, + "longitude": -95.358406, + "city": "Clayton", + "state": "OK", + "county": "Pushmataha" + }, + { + "zip_code": 74538, + "latitude": 34.538327, + "longitude": -96.229156, + "city": "Coalgate", + "state": "OK", + "county": "Coal" + }, + { + "zip_code": 74540, + "latitude": 34.4187, + "longitude": -96.039727, + "city": "Daisy", + "state": "OK", + "county": "Atoka" + }, + { + "zip_code": 74542, + "latitude": 34.4187, + "longitude": -96.039727, + "city": "Atoka", + "state": "OK", + "county": "Atoka" + }, + { + "zip_code": 74543, + "latitude": 34.418801, + "longitude": -95.358406, + "city": "Finley", + "state": "OK", + "county": "Pushmataha" + }, + { + "zip_code": 74545, + "latitude": 34.869457, + "longitude": -95.221099, + "city": "Gowen", + "state": "OK", + "county": "Latimer" + }, + { + "zip_code": 74546, + "latitude": 34.849958, + "longitude": -95.577718, + "city": "Haileyville", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74547, + "latitude": 34.982457, + "longitude": -95.544861, + "city": "Hartshorne", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74549, + "latitude": 35.025939, + "longitude": -94.618339, + "city": "Honobia", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74552, + "latitude": 35.258196, + "longitude": -95.134492, + "city": "Kinta", + "state": "OK", + "county": "Haskell" + }, + { + "zip_code": 74553, + "latitude": 34.723584, + "longitude": -95.906795, + "city": "Kiowa", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74554, + "latitude": 34.894194, + "longitude": -95.761561, + "city": "Krebs", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74555, + "latitude": 34.247711, + "longitude": -95.935842, + "city": "Lane", + "state": "OK", + "county": "Atoka" + }, + { + "zip_code": 74556, + "latitude": 34.592949, + "longitude": -96.303069, + "city": "Lehigh", + "state": "OK", + "county": "Coal" + }, + { + "zip_code": 74557, + "latitude": 34.418801, + "longitude": -95.358406, + "city": "Moyers", + "state": "OK", + "county": "Pushmataha" + }, + { + "zip_code": 74558, + "latitude": 34.418801, + "longitude": -95.358406, + "city": "Nashoba", + "state": "OK", + "county": "Pushmataha" + }, + { + "zip_code": 74559, + "latitude": 34.869457, + "longitude": -95.221099, + "city": "Panola", + "state": "OK", + "county": "Latimer" + }, + { + "zip_code": 74560, + "latitude": 34.718754, + "longitude": -95.897915, + "city": "Pittsburg", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74561, + "latitude": 35.125294, + "longitude": -95.364874, + "city": "Quinton", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74562, + "latitude": 34.418801, + "longitude": -95.358406, + "city": "Rattan", + "state": "OK", + "county": "Pushmataha" + }, + { + "zip_code": 74563, + "latitude": 34.951776, + "longitude": -95.079806, + "city": "Red Oak", + "state": "OK", + "county": "Latimer" + }, + { + "zip_code": 74565, + "latitude": 34.835378, + "longitude": -95.838039, + "city": "Savanna", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74567, + "latitude": 34.418801, + "longitude": -95.358406, + "city": "Snow", + "state": "OK", + "county": "Pushmataha" + }, + { + "zip_code": 74569, + "latitude": 34.456722, + "longitude": -96.012309, + "city": "Stringtown", + "state": "OK", + "county": "Atoka" + }, + { + "zip_code": 74570, + "latitude": 34.903001, + "longitude": -96.099488, + "city": "Stuart", + "state": "OK", + "county": "Hughes" + }, + { + "zip_code": 74571, + "latitude": 34.745742, + "longitude": -95.044014, + "city": "Talihina", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74572, + "latitude": 34.603933, + "longitude": -96.420055, + "city": "Tupelo", + "state": "OK", + "county": "Coal" + }, + { + "zip_code": 74574, + "latitude": 34.418801, + "longitude": -95.358406, + "city": "Tuskahoma", + "state": "OK", + "county": "Pushmataha" + }, + { + "zip_code": 74576, + "latitude": 34.947259, + "longitude": -95.720708, + "city": "Wardville", + "state": "OK", + "county": "Pittsburg" + }, + { + "zip_code": 74577, + "latitude": 34.943627, + "longitude": -94.745782, + "city": "Whitesboro", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74578, + "latitude": 34.855219, + "longitude": -95.287712, + "city": "Wilburton", + "state": "OK", + "county": "Latimer" + }, + { + "zip_code": 74601, + "latitude": 36.736868, + "longitude": -97.18908, + "city": "Ponca City", + "state": "OK", + "county": "Kay" + }, + { + "zip_code": 74602, + "latitude": 36.695368, + "longitude": -97.137693, + "city": "Ponca City", + "state": "OK", + "county": "Kay" + }, + { + "zip_code": 74603, + "latitude": 36.796349, + "longitude": -97.106166, + "city": "Ponca City", + "state": "OK", + "county": "Kay" + }, + { + "zip_code": 74604, + "latitude": 36.767551, + "longitude": -97.154165, + "city": "Ponca City", + "state": "OK", + "county": "Kay" + }, + { + "zip_code": 74630, + "latitude": 36.513543, + "longitude": -97.408128, + "city": "Billings", + "state": "OK", + "county": "Noble" + }, + { + "zip_code": 74631, + "latitude": 36.803494, + "longitude": -97.20684, + "city": "Blackwell", + "state": "OK", + "county": "Kay" + }, + { + "zip_code": 74632, + "latitude": 36.941212, + "longitude": -97.336335, + "city": "Braman", + "state": "OK", + "county": "Kay" + }, + { + "zip_code": 74633, + "latitude": 36.709687, + "longitude": -96.806094, + "city": "Burbank", + "state": "OK", + "county": "Osage" + }, + { + "zip_code": 74636, + "latitude": 36.807305, + "longitude": -97.520322, + "city": "Deer Creek", + "state": "OK", + "county": "Grant" + }, + { + "zip_code": 74637, + "latitude": 36.593236, + "longitude": -96.778701, + "city": "Fairfax", + "state": "OK", + "county": "Osage" + }, + { + "zip_code": 74640, + "latitude": 36.563723, + "longitude": -97.662492, + "city": "Hunter", + "state": "OK", + "county": "Garfield" + }, + { + "zip_code": 74641, + "latitude": 36.838239, + "longitude": -96.883292, + "city": "Kaw City", + "state": "OK", + "county": "Kay" + }, + { + "zip_code": 74643, + "latitude": 36.690445, + "longitude": -97.557809, + "city": "Lamont", + "state": "OK", + "county": "Grant" + }, + { + "zip_code": 74644, + "latitude": 36.543244, + "longitude": -97.123973, + "city": "Marland", + "state": "OK", + "county": "Noble" + }, + { + "zip_code": 74646, + "latitude": 36.818186, + "longitude": -97.430104, + "city": "Nardin", + "state": "OK", + "county": "Kay" + }, + { + "zip_code": 74647, + "latitude": 36.840009, + "longitude": -97.056112, + "city": "Newkirk", + "state": "OK", + "county": "Kay" + }, + { + "zip_code": 74650, + "latitude": 36.503442, + "longitude": -96.735613, + "city": "Ralston", + "state": "OK", + "county": "Pawnee" + }, + { + "zip_code": 74651, + "latitude": 36.455368, + "longitude": -97.187383, + "city": "Red Rock", + "state": "OK", + "county": "Noble" + }, + { + "zip_code": 74652, + "latitude": 36.781943, + "longitude": -96.6607, + "city": "Shidler", + "state": "OK", + "county": "Osage" + }, + { + "zip_code": 74653, + "latitude": 36.678755, + "longitude": -97.166131, + "city": "Tonkawa", + "state": "OK", + "county": "Kay" + }, + { + "zip_code": 74701, + "latitude": 34.044944, + "longitude": -96.321428, + "city": "Durant", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74702, + "latitude": 33.921979, + "longitude": -96.191767, + "city": "Durant", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74720, + "latitude": 33.924443, + "longitude": -96.264411, + "city": "Achille", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74721, + "latitude": 33.921979, + "longitude": -96.191767, + "city": "Albany", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74722, + "latitude": 34.061674, + "longitude": -94.808868, + "city": "Battiest", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74723, + "latitude": 34.002019, + "longitude": -96.038191, + "city": "Bennington", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74724, + "latitude": 34.061674, + "longitude": -94.808868, + "city": "Bethel", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74726, + "latitude": 34.017405, + "longitude": -96.141469, + "city": "Bokchito", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74727, + "latitude": 34.028048, + "longitude": -95.869986, + "city": "Boswell", + "state": "OK", + "county": "Choctaw" + }, + { + "zip_code": 74728, + "latitude": 33.953477, + "longitude": -94.828998, + "city": "Broken Bow", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74729, + "latitude": 34.092082, + "longitude": -96.301579, + "city": "Caddo", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74730, + "latitude": 33.932249, + "longitude": -96.430781, + "city": "Calera", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74731, + "latitude": 33.921979, + "longitude": -96.191767, + "city": "Cartwright", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74733, + "latitude": 33.857674, + "longitude": -96.528187, + "city": "Colbert", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74734, + "latitude": 34.061674, + "longitude": -94.808868, + "city": "Eagletown", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74735, + "latitude": 34.01168, + "longitude": -95.573733, + "city": "Fort Towson", + "state": "OK", + "county": "Choctaw" + }, + { + "zip_code": 74736, + "latitude": 34.061674, + "longitude": -94.808868, + "city": "Garvin", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74737, + "latitude": 34.061674, + "longitude": -94.808868, + "city": "Golden", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74738, + "latitude": 34.01168, + "longitude": -95.573733, + "city": "Grant", + "state": "OK", + "county": "Choctaw" + }, + { + "zip_code": 74740, + "latitude": 33.851471, + "longitude": -94.733795, + "city": "Haworth", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74741, + "latitude": 33.772161, + "longitude": -96.354429, + "city": "Hendrix", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74743, + "latitude": 34.018892, + "longitude": -95.514473, + "city": "Hugo", + "state": "OK", + "county": "Choctaw" + }, + { + "zip_code": 74745, + "latitude": 33.956429, + "longitude": -94.869464, + "city": "Idabel", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74747, + "latitude": 33.921979, + "longitude": -96.191767, + "city": "Kemp", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74748, + "latitude": 34.131629, + "longitude": -96.263566, + "city": "Kenefic", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74750, + "latitude": 33.980066, + "longitude": -95.002496, + "city": "Millerton", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74752, + "latitude": 34.061674, + "longitude": -94.808868, + "city": "Pickens", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74753, + "latitude": 33.921979, + "longitude": -96.191767, + "city": "Platter", + "state": "OK", + "county": "Bryan" + }, + { + "zip_code": 74754, + "latitude": 34.061674, + "longitude": -94.808868, + "city": "Ringold", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74755, + "latitude": 34.061674, + "longitude": -94.808868, + "city": "Rufe", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74756, + "latitude": 34.01168, + "longitude": -95.573733, + "city": "Sawyer", + "state": "OK", + "county": "Choctaw" + }, + { + "zip_code": 74759, + "latitude": 34.03264, + "longitude": -95.696492, + "city": "Soper", + "state": "OK", + "county": "Choctaw" + }, + { + "zip_code": 74760, + "latitude": 34.01168, + "longitude": -95.573733, + "city": "Spencerville", + "state": "OK", + "county": "Choctaw" + }, + { + "zip_code": 74761, + "latitude": 34.01168, + "longitude": -95.573733, + "city": "Swink", + "state": "OK", + "county": "Choctaw" + }, + { + "zip_code": 74764, + "latitude": 34.00463, + "longitude": -95.090099, + "city": "Valliant", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74766, + "latitude": 34.061785, + "longitude": -95.005676, + "city": "Wright City", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74801, + "latitude": 35.295843, + "longitude": -96.960092, + "city": "Shawnee", + "state": "OK", + "county": "Pottawatomie" + }, + { + "zip_code": 74802, + "latitude": 35.365621, + "longitude": -96.959601, + "city": "Shawnee", + "state": "OK", + "county": "Pottawatomie" + }, + { + "zip_code": 74804, + "latitude": 35.386758, + "longitude": -96.933148, + "city": "Shawnee", + "state": "OK", + "county": "Pottawatomie" + }, + { + "zip_code": 74818, + "latitude": 35.162228, + "longitude": -96.609139, + "city": "Seminole", + "state": "OK", + "county": "Seminole" + }, + { + "zip_code": 74820, + "latitude": 34.748961, + "longitude": -96.685325, + "city": "Ada", + "state": "OK", + "county": "Pontotoc" + }, + { + "zip_code": 74821, + "latitude": 34.735301, + "longitude": -96.669321, + "city": "Ada", + "state": "OK", + "county": "Pontotoc" + }, + { + "zip_code": 74824, + "latitude": 35.908981, + "longitude": -96.873793, + "city": "Agra", + "state": "OK", + "county": "Lincoln" + }, + { + "zip_code": 74825, + "latitude": 34.869145, + "longitude": -96.415107, + "city": "Allen", + "state": "OK", + "county": "Pontotoc" + }, + { + "zip_code": 74826, + "latitude": 34.96959, + "longitude": -96.946216, + "city": "Asher", + "state": "OK", + "county": "Pottawatomie" + }, + { + "zip_code": 74827, + "latitude": 35.028521, + "longitude": -96.235928, + "city": "Atwood", + "state": "OK", + "county": "Hughes" + }, + { + "zip_code": 74829, + "latitude": 35.513491, + "longitude": -96.495334, + "city": "Boley", + "state": "OK", + "county": "Okfuskee" + }, + { + "zip_code": 74830, + "latitude": 35.162228, + "longitude": -96.609139, + "city": "Bowlegs", + "state": "OK", + "county": "Seminole" + }, + { + "zip_code": 74831, + "latitude": 34.873374, + "longitude": -97.048399, + "city": "Byars", + "state": "OK", + "county": "Mcclain" + }, + { + "zip_code": 74832, + "latitude": 35.804507, + "longitude": -97.028182, + "city": "Carney", + "state": "OK", + "county": "Lincoln" + }, + { + "zip_code": 74833, + "latitude": 35.464506, + "longitude": -96.303082, + "city": "Castle", + "state": "OK", + "county": "Okfuskee" + }, + { + "zip_code": 74834, + "latitude": 35.647953, + "longitude": -96.871215, + "city": "Chandler", + "state": "OK", + "county": "Lincoln" + }, + { + "zip_code": 74836, + "latitude": 34.419411, + "longitude": -96.629095, + "city": "Connerville", + "state": "OK", + "county": "Johnston" + }, + { + "zip_code": 74837, + "latitude": 35.340458, + "longitude": -96.454578, + "city": "Cromwell", + "state": "OK", + "county": "Seminole" + }, + { + "zip_code": 74839, + "latitude": 35.270328, + "longitude": -96.033734, + "city": "Dustin", + "state": "OK", + "county": "Hughes" + }, + { + "zip_code": 74840, + "latitude": 35.324924, + "longitude": -96.800685, + "city": "Earlsboro", + "state": "OK", + "county": "Pottawatomie" + }, + { + "zip_code": 74842, + "latitude": 34.735301, + "longitude": -96.669321, + "city": "Fittstown", + "state": "OK", + "county": "Pontotoc" + }, + { + "zip_code": 74843, + "latitude": 34.735301, + "longitude": -96.669321, + "city": "Fitzhugh", + "state": "OK", + "county": "Pontotoc" + }, + { + "zip_code": 74844, + "latitude": 34.874058, + "longitude": -96.628899, + "city": "Francis", + "state": "OK", + "county": "Pontotoc" + }, + { + "zip_code": 74845, + "latitude": 35.347368, + "longitude": -95.664118, + "city": "Hanna", + "state": "OK", + "county": "Mcintosh" + }, + { + "zip_code": 74848, + "latitude": 35.087498, + "longitude": -96.387256, + "city": "Holdenville", + "state": "OK", + "county": "Hughes" + }, + { + "zip_code": 74849, + "latitude": 34.957481, + "longitude": -96.750209, + "city": "Konawa", + "state": "OK", + "county": "Seminole" + }, + { + "zip_code": 74850, + "latitude": 35.028521, + "longitude": -96.235928, + "city": "Lamar", + "state": "OK", + "county": "Hughes" + }, + { + "zip_code": 74851, + "latitude": 35.319161, + "longitude": -97.000737, + "city": "Mcloud", + "state": "OK", + "county": "Pottawatomie" + }, + { + "zip_code": 74852, + "latitude": 35.116442, + "longitude": -97.01139, + "city": "Macomb", + "state": "OK", + "county": "Pottawatomie" + }, + { + "zip_code": 74854, + "latitude": 35.06577, + "longitude": -96.850202, + "city": "Maud", + "state": "OK", + "county": "Pottawatomie" + }, + { + "zip_code": 74855, + "latitude": 35.486112, + "longitude": -96.907623, + "city": "Meeker", + "state": "OK", + "county": "Lincoln" + }, + { + "zip_code": 74856, + "latitude": 34.310191, + "longitude": -96.670349, + "city": "Mill Creek", + "state": "OK", + "county": "Johnston" + }, + { + "zip_code": 74857, + "latitude": 35.443973, + "longitude": -97.354813, + "city": "Newalla", + "state": "OK", + "county": "Oklahoma" + }, + { + "zip_code": 74859, + "latitude": 35.462681, + "longitude": -96.430286, + "city": "Okemah", + "state": "OK", + "county": "Okfuskee" + }, + { + "zip_code": 74860, + "latitude": 35.464803, + "longitude": -96.580729, + "city": "Paden", + "state": "OK", + "county": "Okfuskee" + }, + { + "zip_code": 74864, + "latitude": 35.58473, + "longitude": -96.777761, + "city": "Prague", + "state": "OK", + "county": "Lincoln" + }, + { + "zip_code": 74865, + "latitude": 34.626335, + "longitude": -96.841231, + "city": "Roff", + "state": "OK", + "county": "Pontotoc" + }, + { + "zip_code": 74866, + "latitude": 35.181436, + "longitude": -96.882996, + "city": "Saint Louis", + "state": "OK", + "county": "Pottawatomie" + }, + { + "zip_code": 74867, + "latitude": 35.162228, + "longitude": -96.609139, + "city": "Sasakwa", + "state": "OK", + "county": "Seminole" + }, + { + "zip_code": 74868, + "latitude": 35.229281, + "longitude": -96.652931, + "city": "Seminole", + "state": "OK", + "county": "Seminole" + }, + { + "zip_code": 74869, + "latitude": 35.610392, + "longitude": -96.814633, + "city": "Sparks", + "state": "OK", + "county": "Lincoln" + }, + { + "zip_code": 74871, + "latitude": 34.651102, + "longitude": -96.52735, + "city": "Stonewall", + "state": "OK", + "county": "Pontotoc" + }, + { + "zip_code": 74872, + "latitude": 34.723793, + "longitude": -96.962983, + "city": "Stratford", + "state": "OK", + "county": "Garvin" + }, + { + "zip_code": 74873, + "latitude": 35.183973, + "longitude": -96.959439, + "city": "Tecumseh", + "state": "OK", + "county": "Pottawatomie" + }, + { + "zip_code": 74875, + "latitude": 35.875943, + "longitude": -96.962261, + "city": "Tryon", + "state": "OK", + "county": "Lincoln" + }, + { + "zip_code": 74878, + "latitude": 34.962658, + "longitude": -97.031451, + "city": "Wanette", + "state": "OK", + "county": "Pottawatomie" + }, + { + "zip_code": 74880, + "latitude": 35.344476, + "longitude": -96.077141, + "city": "Weleetka", + "state": "OK", + "county": "Okfuskee" + }, + { + "zip_code": 74881, + "latitude": 35.634929, + "longitude": -97.098322, + "city": "Wellston", + "state": "OK", + "county": "Lincoln" + }, + { + "zip_code": 74883, + "latitude": 35.237428, + "longitude": -96.248595, + "city": "Wetumka", + "state": "OK", + "county": "Hughes" + }, + { + "zip_code": 74884, + "latitude": 35.146252, + "longitude": -96.627985, + "city": "Wewoka", + "state": "OK", + "county": "Seminole" + }, + { + "zip_code": 74901, + "latitude": 35.202297, + "longitude": -94.551914, + "city": "Arkoma", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74902, + "latitude": 35.158316, + "longitude": -94.579744, + "city": "Pocola", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74930, + "latitude": 34.943627, + "longitude": -94.745782, + "city": "Bokoshe", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74931, + "latitude": 35.900019, + "longitude": -94.640218, + "city": "Bunch", + "state": "OK", + "county": "Adair" + }, + { + "zip_code": 74932, + "latitude": 35.126904, + "longitude": -94.600976, + "city": "Cameron", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74935, + "latitude": 34.897962, + "longitude": -94.980334, + "city": "Fanshawe", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74936, + "latitude": 35.394647, + "longitude": -94.690149, + "city": "Gans", + "state": "OK", + "county": "Sequoyah" + }, + { + "zip_code": 74937, + "latitude": 34.967535, + "longitude": -94.662657, + "city": "Heavener", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74939, + "latitude": 34.849951, + "longitude": -94.64237, + "city": "Hodgen", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74940, + "latitude": 34.946433, + "longitude": -94.637378, + "city": "Howe", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74941, + "latitude": 35.258196, + "longitude": -95.134492, + "city": "Keota", + "state": "OK", + "county": "Haskell" + }, + { + "zip_code": 74942, + "latitude": 34.897872, + "longitude": -94.975763, + "city": "Leflore", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74943, + "latitude": 35.218128, + "longitude": -95.118733, + "city": "Lequire", + "state": "OK", + "county": "Haskell" + }, + { + "zip_code": 74944, + "latitude": 35.15159, + "longitude": -94.966276, + "city": "Mccurtain", + "state": "OK", + "county": "Haskell" + }, + { + "zip_code": 74945, + "latitude": 35.465054, + "longitude": -94.781885, + "city": "Marble City", + "state": "OK", + "county": "Sequoyah" + }, + { + "zip_code": 74946, + "latitude": 35.389791, + "longitude": -94.446215, + "city": "Moffett", + "state": "OK", + "county": "Sequoyah" + }, + { + "zip_code": 74947, + "latitude": 34.943627, + "longitude": -94.745782, + "city": "Monroe", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74948, + "latitude": 35.470128, + "longitude": -94.539715, + "city": "Muldrow", + "state": "OK", + "county": "Sequoyah" + }, + { + "zip_code": 74949, + "latitude": 34.943627, + "longitude": -94.745782, + "city": "Muse", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74951, + "latitude": 35.153493, + "longitude": -94.670941, + "city": "Panama", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74953, + "latitude": 35.16394, + "longitude": -94.578787, + "city": "Poteau", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74954, + "latitude": 35.416163, + "longitude": -94.52271, + "city": "Roland", + "state": "OK", + "county": "Sequoyah" + }, + { + "zip_code": 74955, + "latitude": 35.450662, + "longitude": -94.706796, + "city": "Sallisaw", + "state": "OK", + "county": "Sequoyah" + }, + { + "zip_code": 74956, + "latitude": 34.943627, + "longitude": -94.745782, + "city": "Shady Point", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74957, + "latitude": 34.061674, + "longitude": -94.808868, + "city": "Smithville", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74959, + "latitude": 35.264931, + "longitude": -94.55985, + "city": "Spiro", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 74960, + "latitude": 35.931689, + "longitude": -94.606985, + "city": "Stilwell", + "state": "OK", + "county": "Adair" + }, + { + "zip_code": 74962, + "latitude": 35.497703, + "longitude": -94.968442, + "city": "Vian", + "state": "OK", + "county": "Sequoyah" + }, + { + "zip_code": 74963, + "latitude": 34.061674, + "longitude": -94.808868, + "city": "Watson", + "state": "OK", + "county": "Mccurtain" + }, + { + "zip_code": 74964, + "latitude": 36.051727, + "longitude": -94.571431, + "city": "Watts", + "state": "OK", + "county": "Adair" + }, + { + "zip_code": 74965, + "latitude": 35.991414, + "longitude": -94.570433, + "city": "Westville", + "state": "OK", + "county": "Adair" + }, + { + "zip_code": 74966, + "latitude": 34.967414, + "longitude": -94.72241, + "city": "Wister", + "state": "OK", + "county": "Le Flore" + }, + { + "zip_code": 75001, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Addison", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75002, + "latitude": 33.208033, + "longitude": -96.646773, + "city": "Allen", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75006, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Carrollton", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75007, + "latitude": 33.007436, + "longitude": -96.895893, + "city": "Carrollton", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 75008, + "latitude": 33.20743, + "longitude": -97.116282, + "city": "Carrollton", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 75009, + "latitude": 33.332852, + "longitude": -96.726103, + "city": "Celina", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75010, + "latitude": 33.029268, + "longitude": -96.901417, + "city": "Carrollton", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 75011, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Carrollton", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75013, + "latitude": 33.118645, + "longitude": -96.677328, + "city": "Allen", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75014, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Irving", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75015, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Irving", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75016, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Irving", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75017, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Irving", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75019, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Coppell", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75020, + "latitude": 33.76672, + "longitude": -96.546662, + "city": "Denison", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 75021, + "latitude": 33.716947, + "longitude": -96.523482, + "city": "Denison", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 75022, + "latitude": 33.026795, + "longitude": -97.119331, + "city": "Flower Mound", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 75023, + "latitude": 33.104885, + "longitude": -96.659574, + "city": "Plano", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75024, + "latitude": 33.096727, + "longitude": -96.805334, + "city": "Plano", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75025, + "latitude": 33.107261, + "longitude": -96.734968, + "city": "Plano", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75026, + "latitude": 33.19359, + "longitude": -96.569879, + "city": "Plano", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75027, + "latitude": 33.20743, + "longitude": -97.116282, + "city": "Flower Mound", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 75028, + "latitude": 33.030903, + "longitude": -97.102543, + "city": "Flower Mound", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 75029, + "latitude": 33.20743, + "longitude": -97.116282, + "city": "Lewisville", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 75030, + "latitude": 32.91747, + "longitude": -96.534737, + "city": "Rowlett", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75032, + "latitude": 32.886, + "longitude": -96.409502, + "city": "Rockwall", + "state": "TX", + "county": "Rockwall" + }, + { + "zip_code": 75034, + "latitude": 33.152222, + "longitude": -96.796437, + "city": "Frisco", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75035, + "latitude": 33.157083, + "longitude": -96.772929, + "city": "Frisco", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75037, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Irving", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75038, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Irving", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75039, + "latitude": 32.73178, + "longitude": -96.82273, + "city": "Irving", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75040, + "latitude": 32.931523, + "longitude": -96.615821, + "city": "Garland", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75041, + "latitude": 32.856976, + "longitude": -96.690775, + "city": "Garland", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75042, + "latitude": 32.829977, + "longitude": -96.690125, + "city": "Garland", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75043, + "latitude": 32.876046, + "longitude": -96.58227, + "city": "Garland", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75044, + "latitude": 32.952929, + "longitude": -96.646873, + "city": "Garland", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75045, + "latitude": 32.913695, + "longitude": -96.627131, + "city": "Garland", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75046, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Garland", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75047, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Garland", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75048, + "latitude": 32.950372, + "longitude": -96.575302, + "city": "Sachse", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75049, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Garland", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75050, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Grand Prairie", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75051, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Grand Prairie", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75052, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Grand Prairie", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75053, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Grand Prairie", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75054, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Grand Prairie", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75056, + "latitude": 33.077136, + "longitude": -96.901605, + "city": "The Colony", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 75057, + "latitude": 33.088471, + "longitude": -96.977396, + "city": "Lewisville", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 75058, + "latitude": 33.449135, + "longitude": -96.709494, + "city": "Gunter", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 75060, + "latitude": 32.75453, + "longitude": -96.782279, + "city": "Irving", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75061, + "latitude": 32.921476, + "longitude": -96.587847, + "city": "Irving", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75062, + "latitude": 32.980974, + "longitude": -96.604557, + "city": "Irving", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75063, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Irving", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75065, + "latitude": 33.131089, + "longitude": -97.008563, + "city": "Lake Dallas", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 75067, + "latitude": 33.047871, + "longitude": -97.050897, + "city": "Lewisville", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 75068, + "latitude": 33.17679, + "longitude": -96.958293, + "city": "Little Elm", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 75069, + "latitude": 33.141438, + "longitude": -96.588295, + "city": "Mc Kinney", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75070, + "latitude": 33.230381, + "longitude": -96.627018, + "city": "Mc Kinney", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75071, + "latitude": "", + "longitude": "", + "city": "Mc Kinney", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75074, + "latitude": 33.109044, + "longitude": -96.578819, + "city": "Plano", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75075, + "latitude": 33.162417, + "longitude": -96.71546, + "city": "Plano", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75076, + "latitude": 33.817503, + "longitude": -96.676191, + "city": "Pottsboro", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 75077, + "latitude": 33.101069, + "longitude": -97.054032, + "city": "Lewisville", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 75078, + "latitude": 33.254191, + "longitude": -96.78524, + "city": "Prosper", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75080, + "latitude": 32.962811, + "longitude": -96.726826, + "city": "Richardson", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75081, + "latitude": 32.949266, + "longitude": -96.721626, + "city": "Richardson", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75082, + "latitude": 32.979315, + "longitude": -96.69137, + "city": "Richardson", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75083, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Richardson", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75085, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Richardson", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75086, + "latitude": 33.002395, + "longitude": -96.615837, + "city": "Plano", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75087, + "latitude": 32.897823, + "longitude": -96.42713, + "city": "Rockwall", + "state": "TX", + "county": "Rockwall" + }, + { + "zip_code": 75088, + "latitude": 32.928105, + "longitude": -96.555019, + "city": "Rowlett", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75089, + "latitude": 32.934572, + "longitude": -96.554399, + "city": "Rowlett", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75090, + "latitude": 33.647425, + "longitude": -96.659726, + "city": "Sherman", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 75091, + "latitude": 33.678665, + "longitude": -96.662289, + "city": "Sherman", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 75092, + "latitude": 33.637151, + "longitude": -96.618419, + "city": "Sherman", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 75093, + "latitude": 33.032674, + "longitude": -96.805055, + "city": "Plano", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75094, + "latitude": 33.011889, + "longitude": -96.643043, + "city": "Plano", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75097, + "latitude": 33.351238, + "longitude": -96.664632, + "city": "Weston", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75098, + "latitude": 32.970309, + "longitude": -96.552397, + "city": "Wylie", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75099, + "latitude": 32.77103, + "longitude": -96.79963, + "city": "Coppell", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75101, + "latitude": 32.211518, + "longitude": -96.736746, + "city": "Bardwell", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 75102, + "latitude": 32.036797, + "longitude": -96.666279, + "city": "Barry", + "state": "TX", + "county": "Navarro" + }, + { + "zip_code": 75103, + "latitude": 32.611471, + "longitude": -95.900705, + "city": "Canton", + "state": "TX", + "county": "Van Zandt" + }, + { + "zip_code": 75104, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Cedar Hill", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75105, + "latitude": 32.243775, + "longitude": -96.414423, + "city": "Chatfield", + "state": "TX", + "county": "Navarro" + }, + { + "zip_code": 75106, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Cedar Hill", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75109, + "latitude": "", + "longitude": "", + "city": "Corsicana", + "state": "TX", + "county": "Navarro" + }, + { + "zip_code": 75110, + "latitude": 32.059928, + "longitude": -96.369648, + "city": "Corsicana", + "state": "TX", + "county": "Navarro" + }, + { + "zip_code": 75114, + "latitude": 32.661312, + "longitude": -96.444347, + "city": "Crandall", + "state": "TX", + "county": "Kaufman" + }, + { + "zip_code": 75115, + "latitude": 32.620585, + "longitude": -96.822778, + "city": "Desoto", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75116, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Duncanville", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75117, + "latitude": 32.71476, + "longitude": -95.85635, + "city": "Edgewood", + "state": "TX", + "county": "Van Zandt" + }, + { + "zip_code": 75118, + "latitude": 32.599614, + "longitude": -96.302743, + "city": "Elmo", + "state": "TX", + "county": "Kaufman" + }, + { + "zip_code": 75119, + "latitude": 32.333778, + "longitude": -96.63479, + "city": "Ennis", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 75120, + "latitude": 32.334709, + "longitude": -96.633546, + "city": "Ennis", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 75121, + "latitude": 33.061849, + "longitude": -96.417438, + "city": "Copeville", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75123, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Desoto", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75124, + "latitude": 32.289838, + "longitude": -95.791559, + "city": "Eustace", + "state": "TX", + "county": "Henderson" + }, + { + "zip_code": 75125, + "latitude": 32.494337, + "longitude": -96.640443, + "city": "Ferris", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 75126, + "latitude": 32.723931, + "longitude": -96.450819, + "city": "Forney", + "state": "TX", + "county": "Kaufman" + }, + { + "zip_code": 75127, + "latitude": 32.685045, + "longitude": -95.79425, + "city": "Fruitvale", + "state": "TX", + "county": "Van Zandt" + }, + { + "zip_code": 75132, + "latitude": 32.955476, + "longitude": -96.367821, + "city": "Fate", + "state": "TX", + "county": "Rockwall" + }, + { + "zip_code": 75134, + "latitude": 32.621185, + "longitude": -96.76442, + "city": "Lancaster", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75135, + "latitude": 33.076823, + "longitude": -96.219803, + "city": "Caddo Mills", + "state": "TX", + "county": "Hunt" + }, + { + "zip_code": 75137, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Duncanville", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75138, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Duncanville", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75140, + "latitude": 32.661269, + "longitude": -95.77607, + "city": "Grand Saline", + "state": "TX", + "county": "Van Zandt" + }, + { + "zip_code": 75141, + "latitude": 32.633257, + "longitude": -96.689174, + "city": "Hutchins", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75142, + "latitude": 32.581306, + "longitude": -96.265477, + "city": "Kaufman", + "state": "TX", + "county": "Kaufman" + }, + { + "zip_code": 75143, + "latitude": 32.24862, + "longitude": -96.216065, + "city": "Kemp", + "state": "TX", + "county": "Kaufman" + }, + { + "zip_code": 75144, + "latitude": 32.124332, + "longitude": -96.368686, + "city": "Kerens", + "state": "TX", + "county": "Navarro" + }, + { + "zip_code": 75146, + "latitude": 32.580136, + "longitude": -96.748525, + "city": "Lancaster", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75147, + "latitude": 32.463647, + "longitude": -96.135356, + "city": "Mabank", + "state": "TX", + "county": "Kaufman" + }, + { + "zip_code": 75148, + "latitude": 32.146014, + "longitude": -96.029222, + "city": "Malakoff", + "state": "TX", + "county": "Henderson" + }, + { + "zip_code": 75149, + "latitude": 32.777779, + "longitude": -96.62315, + "city": "Mesquite", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75150, + "latitude": 32.790964, + "longitude": -96.635868, + "city": "Mesquite", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75151, + "latitude": 32.062395, + "longitude": -96.473459, + "city": "Corsicana", + "state": "TX", + "county": "Navarro" + }, + { + "zip_code": 75152, + "latitude": 32.460524, + "longitude": -96.675575, + "city": "Palmer", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 75153, + "latitude": 32.165005, + "longitude": -96.338746, + "city": "Powell", + "state": "TX", + "county": "Navarro" + }, + { + "zip_code": 75154, + "latitude": 32.484383, + "longitude": -96.795429, + "city": "Red Oak", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 75155, + "latitude": 32.300757, + "longitude": -96.735335, + "city": "Rice", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 75157, + "latitude": 32.455407, + "longitude": -96.439495, + "city": "Rosser", + "state": "TX", + "county": "Kaufman" + }, + { + "zip_code": 75158, + "latitude": 32.463618, + "longitude": -96.384263, + "city": "Scurry", + "state": "TX", + "county": "Kaufman" + }, + { + "zip_code": 75159, + "latitude": 32.620763, + "longitude": -96.573555, + "city": "Seagoville", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75160, + "latitude": 32.641903, + "longitude": -96.25138, + "city": "Terrell", + "state": "TX", + "county": "Kaufman" + }, + { + "zip_code": 75161, + "latitude": 32.733179, + "longitude": -96.195026, + "city": "Terrell", + "state": "TX", + "county": "Kaufman" + }, + { + "zip_code": 75163, + "latitude": 32.208934, + "longitude": -96.114682, + "city": "Trinidad", + "state": "TX", + "county": "Henderson" + }, + { + "zip_code": 75164, + "latitude": 33.084304, + "longitude": -96.321337, + "city": "Josephine", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75165, + "latitude": 32.376984, + "longitude": -96.843682, + "city": "Waxahachie", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 75166, + "latitude": 33.013879, + "longitude": -96.437656, + "city": "Lavon", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75167, + "latitude": 32.377291, + "longitude": -96.916207, + "city": "Waxahachie", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 75168, + "latitude": 32.374937, + "longitude": -96.716638, + "city": "Waxahachie", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 75169, + "latitude": 32.695514, + "longitude": -95.974996, + "city": "Wills Point", + "state": "TX", + "county": "Van Zandt" + }, + { + "zip_code": 75172, + "latitude": 32.603835, + "longitude": -96.673223, + "city": "Wilmer", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75173, + "latitude": 33.073224, + "longitude": -96.428356, + "city": "Nevada", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75180, + "latitude": 32.721225, + "longitude": -96.615271, + "city": "Mesquite", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75181, + "latitude": 32.727857, + "longitude": -96.564919, + "city": "Mesquite", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75182, + "latitude": 32.797048, + "longitude": -96.561606, + "city": "Sunnyvale", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75185, + "latitude": 32.740332, + "longitude": -96.561846, + "city": "Mesquite", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75187, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Mesquite", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75189, + "latitude": 32.919754, + "longitude": -96.35631, + "city": "Royse City", + "state": "TX", + "county": "Rockwall" + }, + { + "zip_code": 75201, + "latitude": 32.781179, + "longitude": -96.790329, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75202, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75203, + "latitude": 32.741481, + "longitude": -96.795879, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75204, + "latitude": 32.800028, + "longitude": -96.781229, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75205, + "latitude": 32.826028, + "longitude": -96.784329, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75206, + "latitude": 32.833881, + "longitude": -96.771528, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75207, + "latitude": 32.76313, + "longitude": -96.798372, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75208, + "latitude": 32.736344, + "longitude": -96.82303, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75209, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75210, + "latitude": 32.769479, + "longitude": -96.750478, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75211, + "latitude": 32.736481, + "longitude": -96.835013, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75212, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75214, + "latitude": 32.841252, + "longitude": -96.698402, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75215, + "latitude": 32.75368, + "longitude": -96.76587, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75216, + "latitude": 32.682883, + "longitude": -96.779278, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75217, + "latitude": 32.702531, + "longitude": -96.684525, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75218, + "latitude": 32.838526, + "longitude": -96.699475, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75219, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75220, + "latitude": 32.778412, + "longitude": -96.806376, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75221, + "latitude": 32.814728, + "longitude": -96.787725, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75222, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75223, + "latitude": 32.794228, + "longitude": -96.749578, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75224, + "latitude": 32.710281, + "longitude": -96.82623, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75225, + "latitude": 32.851127, + "longitude": -96.771829, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75226, + "latitude": 32.783879, + "longitude": -96.775578, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75227, + "latitude": 32.773128, + "longitude": -96.685609, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75228, + "latitude": 32.832277, + "longitude": -96.682075, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75229, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75230, + "latitude": 32.886576, + "longitude": -96.769578, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75231, + "latitude": 32.880025, + "longitude": -96.740103, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75232, + "latitude": 32.652934, + "longitude": -96.820845, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75233, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75234, + "latitude": 32.909545, + "longitude": -96.819289, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75235, + "latitude": 32.692682, + "longitude": -96.623022, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75236, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75237, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75238, + "latitude": 32.878923, + "longitude": -96.704725, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75239, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75240, + "latitude": 32.910185, + "longitude": -96.789191, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75241, + "latitude": 32.660114, + "longitude": -96.759227, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75242, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75243, + "latitude": 32.777979, + "longitude": -96.733826, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75244, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75245, + "latitude": 32.922499, + "longitude": -96.535191, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75246, + "latitude": 32.793328, + "longitude": -96.773179, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75247, + "latitude": 32.660247, + "longitude": -96.752254, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75248, + "latitude": 32.986006, + "longitude": -96.767999, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75249, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75250, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75251, + "latitude": 32.895102, + "longitude": -96.734178, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75252, + "latitude": 32.986259, + "longitude": -96.768049, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75253, + "latitude": 32.672132, + "longitude": -96.60847, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75254, + "latitude": "", + "longitude": "", + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75258, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75260, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75261, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75262, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75263, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75264, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75265, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75266, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75267, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75270, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75275, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75277, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75283, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75284, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75285, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75286, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75287, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75295, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75301, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75303, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75310, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75312, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75313, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75315, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75320, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75323, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75326, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75336, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75339, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75342, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75346, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75353, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75354, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75355, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75356, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75357, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75359, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75360, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75363, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75364, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75367, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75368, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75370, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75371, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75372, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75373, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75374, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75376, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75378, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75379, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75380, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75381, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75382, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75386, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75387, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75388, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75389, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75390, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75391, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75392, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75393, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75394, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75395, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75396, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75397, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75398, + "latitude": 32.767268, + "longitude": -96.777626, + "city": "Dallas", + "state": "TX", + "county": "Dallas" + }, + { + "zip_code": 75401, + "latitude": 33.104859, + "longitude": -96.115491, + "city": "Greenville", + "state": "TX", + "county": "Hunt" + }, + { + "zip_code": 75402, + "latitude": 33.104707, + "longitude": -96.092747, + "city": "Greenville", + "state": "TX", + "county": "Hunt" + }, + { + "zip_code": 75403, + "latitude": 33.218505, + "longitude": -96.048665, + "city": "Greenville", + "state": "TX", + "county": "Hunt" + }, + { + "zip_code": 75404, + "latitude": 33.056265, + "longitude": -96.080973, + "city": "Greenville", + "state": "TX", + "county": "Hunt" + }, + { + "zip_code": 75407, + "latitude": 33.152612, + "longitude": -96.47527, + "city": "Princeton", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75409, + "latitude": 33.323709, + "longitude": -96.524804, + "city": "Anna", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75410, + "latitude": 32.815881, + "longitude": -95.705636, + "city": "Alba", + "state": "TX", + "county": "Wood" + }, + { + "zip_code": 75411, + "latitude": 33.65973, + "longitude": -95.582906, + "city": "Arthur City", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75412, + "latitude": 33.639683, + "longitude": -95.021683, + "city": "Bagwell", + "state": "TX", + "county": "Red River" + }, + { + "zip_code": 75413, + "latitude": 33.416579, + "longitude": -96.213438, + "city": "Bailey", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75414, + "latitude": 33.623738, + "longitude": -96.442444, + "city": "Bells", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 75415, + "latitude": 33.356865, + "longitude": -95.584162, + "city": "Ben Franklin", + "state": "TX", + "county": "Delta" + }, + { + "zip_code": 75416, + "latitude": 33.600079, + "longitude": -95.520367, + "city": "Blossom", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75417, + "latitude": 33.470494, + "longitude": -95.211712, + "city": "Bogata", + "state": "TX", + "county": "Red River" + }, + { + "zip_code": 75418, + "latitude": 33.527267, + "longitude": -96.172998, + "city": "Bonham", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75420, + "latitude": 33.168606, + "longitude": -95.585464, + "city": "Brashear", + "state": "TX", + "county": "Hopkins" + }, + { + "zip_code": 75421, + "latitude": 33.655316, + "longitude": -95.646417, + "city": "Brookston", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75422, + "latitude": 33.12254, + "longitude": -95.934428, + "city": "Campbell", + "state": "TX", + "county": "Hunt" + }, + { + "zip_code": 75423, + "latitude": 33.23896, + "longitude": -96.175726, + "city": "Celeste", + "state": "TX", + "county": "Hunt" + }, + { + "zip_code": 75424, + "latitude": 33.318638, + "longitude": -96.396186, + "city": "Blue Ridge", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75425, + "latitude": 33.65973, + "longitude": -95.582906, + "city": "Chicota", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75426, + "latitude": 33.61306, + "longitude": -95.096511, + "city": "Clarksville", + "state": "TX", + "county": "Red River" + }, + { + "zip_code": 75428, + "latitude": 33.289045, + "longitude": -95.976965, + "city": "Commerce", + "state": "TX", + "county": "Hunt" + }, + { + "zip_code": 75429, + "latitude": 33.237722, + "longitude": -95.90886, + "city": "Commerce", + "state": "TX", + "county": "Hunt" + }, + { + "zip_code": 75431, + "latitude": 33.095582, + "longitude": -95.656717, + "city": "Como", + "state": "TX", + "county": "Hopkins" + }, + { + "zip_code": 75432, + "latitude": 33.344751, + "longitude": -95.74361, + "city": "Cooper", + "state": "TX", + "county": "Delta" + }, + { + "zip_code": 75433, + "latitude": 33.136079, + "longitude": -95.844353, + "city": "Cumby", + "state": "TX", + "county": "Hopkins" + }, + { + "zip_code": 75434, + "latitude": 33.65973, + "longitude": -95.582906, + "city": "Cunningham", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75435, + "latitude": 33.530359, + "longitude": -95.318244, + "city": "Deport", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75436, + "latitude": 33.664645, + "longitude": -95.262837, + "city": "Detroit", + "state": "TX", + "county": "Red River" + }, + { + "zip_code": 75437, + "latitude": 33.168606, + "longitude": -95.585464, + "city": "Dike", + "state": "TX", + "county": "Hopkins" + }, + { + "zip_code": 75438, + "latitude": 33.57047, + "longitude": -96.054433, + "city": "Dodd City", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75439, + "latitude": 33.575694, + "longitude": -96.138464, + "city": "Ector", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75440, + "latitude": 32.834006, + "longitude": -95.724069, + "city": "Emory", + "state": "TX", + "county": "Rains" + }, + { + "zip_code": 75441, + "latitude": 33.356865, + "longitude": -95.584162, + "city": "Enloe", + "state": "TX", + "county": "Delta" + }, + { + "zip_code": 75442, + "latitude": 33.218463, + "longitude": -96.379009, + "city": "Farmersville", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75443, + "latitude": 33.469719, + "longitude": -96.111103, + "city": "Gober", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75444, + "latitude": 32.777228, + "longitude": -95.407675, + "city": "Golden", + "state": "TX", + "county": "Wood" + }, + { + "zip_code": 75446, + "latitude": 33.488056, + "longitude": -96.085924, + "city": "Honey Grove", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75447, + "latitude": 33.58203, + "longitude": -95.921449, + "city": "Ivanhoe", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75448, + "latitude": 33.356865, + "longitude": -95.584162, + "city": "Klondike", + "state": "TX", + "county": "Delta" + }, + { + "zip_code": 75449, + "latitude": 33.494184, + "longitude": -96.150371, + "city": "Ladonia", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75450, + "latitude": 33.356865, + "longitude": -95.584162, + "city": "Lake Creek", + "state": "TX", + "county": "Delta" + }, + { + "zip_code": 75451, + "latitude": 32.989797, + "longitude": -94.936022, + "city": "Leesburg", + "state": "TX", + "county": "Camp" + }, + { + "zip_code": 75452, + "latitude": 33.41874, + "longitude": -96.238027, + "city": "Leonard", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75453, + "latitude": 33.012331, + "longitude": -95.933534, + "city": "Lone Oak", + "state": "TX", + "county": "Hunt" + }, + { + "zip_code": 75454, + "latitude": 33.283706, + "longitude": -96.53316, + "city": "Melissa", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75455, + "latitude": 33.22101, + "longitude": -94.984645, + "city": "Mount Pleasant", + "state": "TX", + "county": "Titus" + }, + { + "zip_code": 75456, + "latitude": 33.19045, + "longitude": -94.967456, + "city": "Mount Pleasant", + "state": "TX", + "county": "Titus" + }, + { + "zip_code": 75457, + "latitude": 33.15396, + "longitude": -95.217812, + "city": "Mount Vernon", + "state": "TX", + "county": "Franklin" + }, + { + "zip_code": 75458, + "latitude": 33.242656, + "longitude": -96.291572, + "city": "Merit", + "state": "TX", + "county": "Hunt" + }, + { + "zip_code": 75459, + "latitude": 33.535538, + "longitude": -96.655494, + "city": "Howe", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 75460, + "latitude": 33.612433, + "longitude": -95.464896, + "city": "Paris", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75461, + "latitude": 33.663213, + "longitude": -95.460797, + "city": "Paris", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75462, + "latitude": 33.680451, + "longitude": -95.490539, + "city": "Paris", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75468, + "latitude": 33.621656, + "longitude": -95.466406, + "city": "Pattonville", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75469, + "latitude": 33.442173, + "longitude": -95.851141, + "city": "Pecan Gap", + "state": "TX", + "county": "Delta" + }, + { + "zip_code": 75470, + "latitude": 33.65973, + "longitude": -95.582906, + "city": "Petty", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75471, + "latitude": 33.168606, + "longitude": -95.585464, + "city": "Pickton", + "state": "TX", + "county": "Hopkins" + }, + { + "zip_code": 75472, + "latitude": 32.917861, + "longitude": -95.898171, + "city": "Point", + "state": "TX", + "county": "Rains" + }, + { + "zip_code": 75473, + "latitude": 33.792741, + "longitude": -95.522757, + "city": "Powderly", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75474, + "latitude": 32.934537, + "longitude": -96.121946, + "city": "Quinlan", + "state": "TX", + "county": "Hunt" + }, + { + "zip_code": 75475, + "latitude": 33.484594, + "longitude": -96.254127, + "city": "Randolph", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75476, + "latitude": 33.670261, + "longitude": -96.276105, + "city": "Ravenna", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75477, + "latitude": 33.544969, + "longitude": -95.721734, + "city": "Roxton", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75478, + "latitude": 33.168606, + "longitude": -95.585464, + "city": "Saltillo", + "state": "TX", + "county": "Hopkins" + }, + { + "zip_code": 75479, + "latitude": 33.555782, + "longitude": -96.27085, + "city": "Savoy", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75480, + "latitude": 33.047785, + "longitude": -95.196153, + "city": "Scroggins", + "state": "TX", + "county": "Franklin" + }, + { + "zip_code": 75481, + "latitude": 33.168606, + "longitude": -95.585464, + "city": "Sulphur Bluff", + "state": "TX", + "county": "Hopkins" + }, + { + "zip_code": 75482, + "latitude": 33.126435, + "longitude": -95.600838, + "city": "Sulphur Springs", + "state": "TX", + "county": "Hopkins" + }, + { + "zip_code": 75483, + "latitude": 33.168606, + "longitude": -95.585464, + "city": "Sulphur Springs", + "state": "TX", + "county": "Hopkins" + }, + { + "zip_code": 75485, + "latitude": 33.361524, + "longitude": -96.467617, + "city": "Westminster", + "state": "TX", + "county": "Collin" + }, + { + "zip_code": 75486, + "latitude": 33.65973, + "longitude": -95.582906, + "city": "Sumner", + "state": "TX", + "county": "Lamar" + }, + { + "zip_code": 75487, + "latitude": 33.175662, + "longitude": -95.216724, + "city": "Talco", + "state": "TX", + "county": "Franklin" + }, + { + "zip_code": 75488, + "latitude": 33.613994, + "longitude": -96.114265, + "city": "Telephone", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75489, + "latitude": 33.529674, + "longitude": -96.483563, + "city": "Tom Bean", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 75490, + "latitude": 33.413778, + "longitude": -96.30401, + "city": "Trenton", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75491, + "latitude": 33.502316, + "longitude": -96.446845, + "city": "Whitewright", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 75492, + "latitude": 33.563367, + "longitude": -96.000216, + "city": "Windom", + "state": "TX", + "county": "Fannin" + }, + { + "zip_code": 75493, + "latitude": 33.166579, + "longitude": -95.109, + "city": "Winfield", + "state": "TX", + "county": "Titus" + }, + { + "zip_code": 75494, + "latitude": 32.944701, + "longitude": -95.306215, + "city": "Winnsboro", + "state": "TX", + "county": "Wood" + }, + { + "zip_code": 75495, + "latitude": 33.541018, + "longitude": -96.6356, + "city": "Van Alstyne", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 75496, + "latitude": 33.32576, + "longitude": -96.056153, + "city": "Wolfe City", + "state": "TX", + "county": "Hunt" + }, + { + "zip_code": 75497, + "latitude": 32.891514, + "longitude": -95.579297, + "city": "Yantis", + "state": "TX", + "county": "Wood" + }, + { + "zip_code": 75501, + "latitude": 33.411321, + "longitude": -94.177354, + "city": "Texarkana", + "state": "TX", + "county": "Bowie" + }, + { + "zip_code": 75503, + "latitude": 33.464376, + "longitude": -94.116906, + "city": "Texarkana", + "state": "TX", + "county": "Bowie" + }, + { + "zip_code": 75504, + "latitude": 33.476552, + "longitude": -94.39495, + "city": "Texarkana", + "state": "TX", + "county": "Bowie" + }, + { + "zip_code": 75505, + "latitude": 33.46238, + "longitude": -94.0715, + "city": "Texarkana", + "state": "TX", + "county": "Bowie" + }, + { + "zip_code": 75507, + "latitude": 33.393447, + "longitude": -94.340437, + "city": "Texarkana", + "state": "TX", + "county": "Bowie" + }, + { + "zip_code": 75550, + "latitude": 33.582918, + "longitude": -94.915595, + "city": "Annona", + "state": "TX", + "county": "Red River" + }, + { + "zip_code": 75551, + "latitude": 33.08447, + "longitude": -94.242023, + "city": "Atlanta", + "state": "TX", + "county": "Cass" + }, + { + "zip_code": 75554, + "latitude": 33.551468, + "longitude": -94.772766, + "city": "Avery", + "state": "TX", + "county": "Red River" + }, + { + "zip_code": 75555, + "latitude": 33.007551, + "longitude": -94.074752, + "city": "Bivins", + "state": "TX", + "county": "Cass" + }, + { + "zip_code": 75556, + "latitude": 33.095778, + "longitude": -94.348359, + "city": "Bloomburg", + "state": "TX", + "county": "Cass" + }, + { + "zip_code": 75558, + "latitude": 33.19045, + "longitude": -94.967456, + "city": "Cookville", + "state": "TX", + "county": "Titus" + }, + { + "zip_code": 75559, + "latitude": 33.506028, + "longitude": -94.589575, + "city": "De Kalb", + "state": "TX", + "county": "Bowie" + }, + { + "zip_code": 75560, + "latitude": 33.095778, + "longitude": -94.348359, + "city": "Douglassville", + "state": "TX", + "county": "Cass" + }, + { + "zip_code": 75561, + "latitude": 33.407128, + "longitude": -94.337772, + "city": "Hooks", + "state": "TX", + "county": "Bowie" + }, + { + "zip_code": 75562, + "latitude": 33.008643, + "longitude": -94.361886, + "city": "Kildare", + "state": "TX", + "county": "Cass" + }, + { + "zip_code": 75563, + "latitude": 33.069718, + "longitude": -94.264576, + "city": "Linden", + "state": "TX", + "county": "Cass" + }, + { + "zip_code": 75564, + "latitude": 32.795866, + "longitude": -94.28917, + "city": "Lodi", + "state": "TX", + "county": "Marion" + }, + { + "zip_code": 75565, + "latitude": 33.095778, + "longitude": -94.348359, + "city": "Mc Leod", + "state": "TX", + "county": "Cass" + }, + { + "zip_code": 75566, + "latitude": 33.095778, + "longitude": -94.348359, + "city": "Marietta", + "state": "TX", + "county": "Cass" + }, + { + "zip_code": 75567, + "latitude": 33.340864, + "longitude": -94.317527, + "city": "Maud", + "state": "TX", + "county": "Bowie" + }, + { + "zip_code": 75568, + "latitude": 33.164839, + "longitude": -94.686156, + "city": "Naples", + "state": "TX", + "county": "Morris" + }, + { + "zip_code": 75569, + "latitude": 33.406372, + "longitude": -94.223069, + "city": "Nash", + "state": "TX", + "county": "Bowie" + }, + { + "zip_code": 75570, + "latitude": 33.421142, + "longitude": -94.372021, + "city": "New Boston", + "state": "TX", + "county": "Bowie" + }, + { + "zip_code": 75571, + "latitude": 33.179537, + "longitude": -94.739141, + "city": "Omaha", + "state": "TX", + "county": "Morris" + }, + { + "zip_code": 75572, + "latitude": 33.155715, + "longitude": -94.153684, + "city": "Queen City", + "state": "TX", + "county": "Cass" + }, + { + "zip_code": 75573, + "latitude": 33.357968, + "longitude": -94.25707, + "city": "Redwater", + "state": "TX", + "county": "Bowie" + }, + { + "zip_code": 75574, + "latitude": 33.476552, + "longitude": -94.39495, + "city": "Simms", + "state": "TX", + "county": "Bowie" + }, + { + "zip_code": 75599, + "latitude": 33.476552, + "longitude": -94.39495, + "city": "Texarkana", + "state": "TX", + "county": "Bowie" + }, + { + "zip_code": 75601, + "latitude": 32.517846, + "longitude": -94.730285, + "city": "Longview", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75602, + "latitude": 32.434239, + "longitude": -94.747488, + "city": "Longview", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75603, + "latitude": 32.419782, + "longitude": -94.690041, + "city": "Longview", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75604, + "latitude": 32.493577, + "longitude": -94.827415, + "city": "Longview", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75605, + "latitude": 32.505708, + "longitude": -94.718839, + "city": "Longview", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75606, + "latitude": 32.369393, + "longitude": -94.616062, + "city": "Longview", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75607, + "latitude": 32.51121, + "longitude": -94.783493, + "city": "Longview", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75608, + "latitude": 32.570051, + "longitude": -94.848063, + "city": "Longview", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75615, + "latitude": 32.51121, + "longitude": -94.783493, + "city": "Longview", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75630, + "latitude": 32.895799, + "longitude": -94.574658, + "city": "Avinger", + "state": "TX", + "county": "Cass" + }, + { + "zip_code": 75631, + "latitude": 32.233362, + "longitude": -94.456952, + "city": "Beckville", + "state": "TX", + "county": "Panola" + }, + { + "zip_code": 75633, + "latitude": 32.183133, + "longitude": -94.309189, + "city": "Carthage", + "state": "TX", + "county": "Panola" + }, + { + "zip_code": 75636, + "latitude": 33.122567, + "longitude": -94.735972, + "city": "Cason", + "state": "TX", + "county": "Morris" + }, + { + "zip_code": 75637, + "latitude": 32.102729, + "longitude": -94.493543, + "city": "Clayton", + "state": "TX", + "county": "Panola" + }, + { + "zip_code": 75638, + "latitude": 33.044611, + "longitude": -94.739524, + "city": "Daingerfield", + "state": "TX", + "county": "Morris" + }, + { + "zip_code": 75639, + "latitude": 32.259146, + "longitude": -94.21128, + "city": "De Berry", + "state": "TX", + "county": "Panola" + }, + { + "zip_code": 75640, + "latitude": 32.769819, + "longitude": -94.703213, + "city": "Diana", + "state": "TX", + "county": "Upshur" + }, + { + "zip_code": 75641, + "latitude": 32.51121, + "longitude": -94.783493, + "city": "Easton", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75642, + "latitude": 32.386275, + "longitude": -94.210541, + "city": "Elysian Fields", + "state": "TX", + "county": "Harrison" + }, + { + "zip_code": 75643, + "latitude": 32.033446, + "longitude": -94.380023, + "city": "Gary", + "state": "TX", + "county": "Panola" + }, + { + "zip_code": 75644, + "latitude": 32.712654, + "longitude": -94.909365, + "city": "Gilmer", + "state": "TX", + "county": "Upshur" + }, + { + "zip_code": 75645, + "latitude": "", + "longitude": "", + "city": "Gilmer", + "state": "TX", + "county": "Upshur" + }, + { + "zip_code": 75647, + "latitude": 32.477189, + "longitude": -94.9327, + "city": "Gladewater", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75650, + "latitude": 32.526928, + "longitude": -94.573183, + "city": "Hallsville", + "state": "TX", + "county": "Harrison" + }, + { + "zip_code": 75651, + "latitude": 32.676919, + "longitude": -94.531537, + "city": "Harleton", + "state": "TX", + "county": "Harrison" + }, + { + "zip_code": 75652, + "latitude": 32.213061, + "longitude": -94.783436, + "city": "Henderson", + "state": "TX", + "county": "Rusk" + }, + { + "zip_code": 75653, + "latitude": 32.204724, + "longitude": -94.8845, + "city": "Henderson", + "state": "TX", + "county": "Rusk" + }, + { + "zip_code": 75654, + "latitude": 32.125958, + "longitude": -94.748825, + "city": "Henderson", + "state": "TX", + "county": "Rusk" + }, + { + "zip_code": 75656, + "latitude": 32.953226, + "longitude": -94.599193, + "city": "Hughes Springs", + "state": "TX", + "county": "Cass" + }, + { + "zip_code": 75657, + "latitude": 32.805853, + "longitude": -94.365546, + "city": "Jefferson", + "state": "TX", + "county": "Marion" + }, + { + "zip_code": 75658, + "latitude": 32.195927, + "longitude": -94.906515, + "city": "Joinerville", + "state": "TX", + "county": "Rusk" + }, + { + "zip_code": 75659, + "latitude": 32.507491, + "longitude": -94.110636, + "city": "Jonesville", + "state": "TX", + "county": "Harrison" + }, + { + "zip_code": 75660, + "latitude": 32.51121, + "longitude": -94.783493, + "city": "Judson", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75661, + "latitude": 32.65575, + "longitude": -94.154735, + "city": "Karnack", + "state": "TX", + "county": "Harrison" + }, + { + "zip_code": 75662, + "latitude": 32.410306, + "longitude": -94.793392, + "city": "Kilgore", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75663, + "latitude": 32.386976, + "longitude": -94.895098, + "city": "Kilgore", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75666, + "latitude": 32.301898, + "longitude": -94.928795, + "city": "Laird Hill", + "state": "TX", + "county": "Rusk" + }, + { + "zip_code": 75667, + "latitude": 31.986546, + "longitude": -94.859558, + "city": "Laneville", + "state": "TX", + "county": "Rusk" + }, + { + "zip_code": 75668, + "latitude": 32.925231, + "longitude": -94.704906, + "city": "Lone Star", + "state": "TX", + "county": "Morris" + }, + { + "zip_code": 75669, + "latitude": 32.044916, + "longitude": -94.538115, + "city": "Long Branch", + "state": "TX", + "county": "Panola" + }, + { + "zip_code": 75670, + "latitude": 32.538112, + "longitude": -94.406228, + "city": "Marshall", + "state": "TX", + "county": "Harrison" + }, + { + "zip_code": 75671, + "latitude": 32.522659, + "longitude": -94.389476, + "city": "Marshall", + "state": "TX", + "county": "Harrison" + }, + { + "zip_code": 75672, + "latitude": 32.516507, + "longitude": -94.32511, + "city": "Marshall", + "state": "TX", + "county": "Harrison" + }, + { + "zip_code": 75680, + "latitude": 32.125654, + "longitude": -94.719095, + "city": "Minden", + "state": "TX", + "county": "Rusk" + }, + { + "zip_code": 75681, + "latitude": 31.966905, + "longitude": -94.687331, + "city": "Mount Enterprise", + "state": "TX", + "county": "Rusk" + }, + { + "zip_code": 75682, + "latitude": 32.25416, + "longitude": -94.932215, + "city": "New London", + "state": "TX", + "county": "Rusk" + }, + { + "zip_code": 75683, + "latitude": 32.832441, + "longitude": -94.771016, + "city": "Ore City", + "state": "TX", + "county": "Upshur" + }, + { + "zip_code": 75684, + "latitude": 32.133478, + "longitude": -94.83149, + "city": "Overton", + "state": "TX", + "county": "Rusk" + }, + { + "zip_code": 75685, + "latitude": 32.183774, + "longitude": -94.308713, + "city": "Panola", + "state": "TX", + "county": "Panola" + }, + { + "zip_code": 75686, + "latitude": 32.998041, + "longitude": -94.952278, + "city": "Pittsburg", + "state": "TX", + "county": "Camp" + }, + { + "zip_code": 75687, + "latitude": 32.151755, + "longitude": -94.955432, + "city": "Price", + "state": "TX", + "county": "Rusk" + }, + { + "zip_code": 75688, + "latitude": 32.55397, + "longitude": -94.239351, + "city": "Scottsville", + "state": "TX", + "county": "Harrison" + }, + { + "zip_code": 75689, + "latitude": 32.1826, + "longitude": -94.935456, + "city": "Selman City", + "state": "TX", + "county": "Rusk" + }, + { + "zip_code": 75691, + "latitude": 32.301179, + "longitude": -94.742539, + "city": "Tatum", + "state": "TX", + "county": "Rusk" + }, + { + "zip_code": 75692, + "latitude": 32.518392, + "longitude": -94.135507, + "city": "Waskom", + "state": "TX", + "county": "Harrison" + }, + { + "zip_code": 75693, + "latitude": 32.538299, + "longitude": -94.862219, + "city": "White Oak", + "state": "TX", + "county": "Gregg" + }, + { + "zip_code": 75694, + "latitude": 32.653731, + "longitude": -94.342725, + "city": "Woodlawn", + "state": "TX", + "county": "Harrison" + }, + { + "zip_code": 75701, + "latitude": 32.288029, + "longitude": -95.200403, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75702, + "latitude": 32.309852, + "longitude": -95.203647, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75703, + "latitude": 32.230847, + "longitude": -95.340504, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75704, + "latitude": 32.385204, + "longitude": -95.407365, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75705, + "latitude": 32.350251, + "longitude": -95.134664, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75706, + "latitude": 32.464496, + "longitude": -95.31477, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75707, + "latitude": 32.286869, + "longitude": -95.1511, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75708, + "latitude": 32.41896, + "longitude": -95.210564, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75709, + "latitude": 32.315983, + "longitude": -95.380577, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75710, + "latitude": 32.347549, + "longitude": -95.306528, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75711, + "latitude": 32.539879, + "longitude": -95.419983, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75712, + "latitude": 32.411237, + "longitude": -95.289903, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75713, + "latitude": 32.411237, + "longitude": -95.289903, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75750, + "latitude": 32.27795, + "longitude": -95.067302, + "city": "Arp", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75751, + "latitude": 32.188097, + "longitude": -95.882391, + "city": "Athens", + "state": "TX", + "county": "Henderson" + }, + { + "zip_code": 75752, + "latitude": "", + "longitude": "", + "city": "Athens", + "state": "TX", + "county": "Henderson" + }, + { + "zip_code": 75754, + "latitude": 32.423029, + "longitude": -95.712867, + "city": "Ben Wheeler", + "state": "TX", + "county": "Van Zandt" + }, + { + "zip_code": 75755, + "latitude": 32.571552, + "longitude": -95.057746, + "city": "Big Sandy", + "state": "TX", + "county": "Upshur" + }, + { + "zip_code": 75756, + "latitude": 32.232783, + "longitude": -95.575732, + "city": "Brownsboro", + "state": "TX", + "county": "Henderson" + }, + { + "zip_code": 75757, + "latitude": 32.177304, + "longitude": -95.254306, + "city": "Bullard", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75758, + "latitude": 32.257185, + "longitude": -95.539252, + "city": "Chandler", + "state": "TX", + "county": "Henderson" + }, + { + "zip_code": 75759, + "latitude": 31.873255, + "longitude": -95.228829, + "city": "Cuney", + "state": "TX", + "county": "Cherokee" + }, + { + "zip_code": 75760, + "latitude": 31.714047, + "longitude": -94.841773, + "city": "Cushing", + "state": "TX", + "county": "Nacogdoches" + }, + { + "zip_code": 75762, + "latitude": 32.226635, + "longitude": -95.390166, + "city": "Flint", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75763, + "latitude": 31.992987, + "longitude": -95.499133, + "city": "Frankston", + "state": "TX", + "county": "Anderson" + }, + { + "zip_code": 75764, + "latitude": 31.88493, + "longitude": -95.157159, + "city": "Gallatin", + "state": "TX", + "county": "Cherokee" + }, + { + "zip_code": 75765, + "latitude": 32.648003, + "longitude": -95.23372, + "city": "Hawkins", + "state": "TX", + "county": "Wood" + }, + { + "zip_code": 75766, + "latitude": 31.865305, + "longitude": -95.155683, + "city": "Jacksonville", + "state": "TX", + "county": "Cherokee" + }, + { + "zip_code": 75770, + "latitude": 32.127602, + "longitude": -95.641089, + "city": "Larue", + "state": "TX", + "county": "Henderson" + }, + { + "zip_code": 75771, + "latitude": 32.506185, + "longitude": -95.400598, + "city": "Lindale", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75772, + "latitude": 31.800846, + "longitude": -95.300142, + "city": "Maydelle", + "state": "TX", + "county": "Cherokee" + }, + { + "zip_code": 75773, + "latitude": 32.713422, + "longitude": -95.485939, + "city": "Mineola", + "state": "TX", + "county": "Wood" + }, + { + "zip_code": 75778, + "latitude": 32.293384, + "longitude": -95.742334, + "city": "Murchison", + "state": "TX", + "county": "Henderson" + }, + { + "zip_code": 75779, + "latitude": 31.794191, + "longitude": -95.661964, + "city": "Neches", + "state": "TX", + "county": "Anderson" + }, + { + "zip_code": 75780, + "latitude": 31.782048, + "longitude": -95.164021, + "city": "New Summerfield", + "state": "TX", + "county": "Cherokee" + }, + { + "zip_code": 75782, + "latitude": 32.194199, + "longitude": -95.548056, + "city": "Poynor", + "state": "TX", + "county": "Henderson" + }, + { + "zip_code": 75783, + "latitude": 32.782264, + "longitude": -95.44337, + "city": "Quitman", + "state": "TX", + "county": "Wood" + }, + { + "zip_code": 75784, + "latitude": 31.86904, + "longitude": -94.995364, + "city": "Reklaw", + "state": "TX", + "county": "Cherokee" + }, + { + "zip_code": 75785, + "latitude": 31.813578, + "longitude": -95.0965, + "city": "Rusk", + "state": "TX", + "county": "Cherokee" + }, + { + "zip_code": 75788, + "latitude": 31.825389, + "longitude": -94.918855, + "city": "Sacul", + "state": "TX", + "county": "Nacogdoches" + }, + { + "zip_code": 75789, + "latitude": 32.2477, + "longitude": -95.17896, + "city": "Troup", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75790, + "latitude": 32.543649, + "longitude": -95.679211, + "city": "Van", + "state": "TX", + "county": "Van Zandt" + }, + { + "zip_code": 75791, + "latitude": 32.219518, + "longitude": -95.217652, + "city": "Whitehouse", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75792, + "latitude": 32.51931, + "longitude": -95.283799, + "city": "Winona", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75798, + "latitude": 32.411237, + "longitude": -95.289903, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75799, + "latitude": 32.411237, + "longitude": -95.289903, + "city": "Tyler", + "state": "TX", + "county": "Smith" + }, + { + "zip_code": 75801, + "latitude": 31.848542, + "longitude": -95.685179, + "city": "Palestine", + "state": "TX", + "county": "Anderson" + }, + { + "zip_code": 75802, + "latitude": 31.926836, + "longitude": -95.579561, + "city": "Palestine", + "state": "TX", + "county": "Anderson" + }, + { + "zip_code": 75803, + "latitude": "", + "longitude": "", + "city": "Palestine", + "state": "TX", + "county": "Anderson" + }, + { + "zip_code": 75831, + "latitude": 31.412142, + "longitude": -95.990369, + "city": "Buffalo", + "state": "TX", + "county": "Leon" + }, + { + "zip_code": 75832, + "latitude": 31.794191, + "longitude": -95.661964, + "city": "Cayuga", + "state": "TX", + "county": "Anderson" + }, + { + "zip_code": 75833, + "latitude": 31.363103, + "longitude": -95.899965, + "city": "Centerville", + "state": "TX", + "county": "Leon" + }, + { + "zip_code": 75834, + "latitude": 31.105786, + "longitude": -95.138794, + "city": "Centralia", + "state": "TX", + "county": "Trinity" + }, + { + "zip_code": 75835, + "latitude": 31.320814, + "longitude": -95.392816, + "city": "Crockett", + "state": "TX", + "county": "Houston" + }, + { + "zip_code": 75838, + "latitude": 31.595644, + "longitude": -96.075096, + "city": "Donie", + "state": "TX", + "county": "Freestone" + }, + { + "zip_code": 75839, + "latitude": 31.64803, + "longitude": -95.555052, + "city": "Elkhart", + "state": "TX", + "county": "Anderson" + }, + { + "zip_code": 75840, + "latitude": 31.767543, + "longitude": -96.138094, + "city": "Fairfield", + "state": "TX", + "county": "Freestone" + }, + { + "zip_code": 75844, + "latitude": 31.495931, + "longitude": -95.468798, + "city": "Grapeland", + "state": "TX", + "county": "Houston" + }, + { + "zip_code": 75845, + "latitude": 31.062102, + "longitude": -95.142669, + "city": "Groveton", + "state": "TX", + "county": "Trinity" + }, + { + "zip_code": 75846, + "latitude": 31.304025, + "longitude": -96.16864, + "city": "Jewett", + "state": "TX", + "county": "Leon" + }, + { + "zip_code": 75847, + "latitude": 31.361995, + "longitude": -95.182216, + "city": "Kennard", + "state": "TX", + "county": "Houston" + }, + { + "zip_code": 75848, + "latitude": 31.847652, + "longitude": -96.280967, + "city": "Kirvin", + "state": "TX", + "county": "Freestone" + }, + { + "zip_code": 75849, + "latitude": 31.25937, + "longitude": -95.367485, + "city": "Latexo", + "state": "TX", + "county": "Houston" + }, + { + "zip_code": 75850, + "latitude": 31.189891, + "longitude": -95.901284, + "city": "Leona", + "state": "TX", + "county": "Leon" + }, + { + "zip_code": 75851, + "latitude": 31.136667, + "longitude": -95.476903, + "city": "Lovelady", + "state": "TX", + "county": "Houston" + }, + { + "zip_code": 75852, + "latitude": 31.009503, + "longitude": -95.772458, + "city": "Midway", + "state": "TX", + "county": "Madison" + }, + { + "zip_code": 75853, + "latitude": 31.794191, + "longitude": -95.661964, + "city": "Montalba", + "state": "TX", + "county": "Anderson" + }, + { + "zip_code": 75855, + "latitude": 31.478777, + "longitude": -95.866174, + "city": "Oakwood", + "state": "TX", + "county": "Leon" + }, + { + "zip_code": 75856, + "latitude": 31.105786, + "longitude": -95.138794, + "city": "Pennington", + "state": "TX", + "county": "Trinity" + }, + { + "zip_code": 75858, + "latitude": 31.25937, + "longitude": -95.367485, + "city": "Ratcliff", + "state": "TX", + "county": "Houston" + }, + { + "zip_code": 75859, + "latitude": 31.837751, + "longitude": -96.23408, + "city": "Streetman", + "state": "TX", + "county": "Freestone" + }, + { + "zip_code": 75860, + "latitude": 31.627713, + "longitude": -96.21236, + "city": "Teague", + "state": "TX", + "county": "Freestone" + }, + { + "zip_code": 75861, + "latitude": 31.802787, + "longitude": -95.84481, + "city": "Tennessee Colony", + "state": "TX", + "county": "Anderson" + }, + { + "zip_code": 75862, + "latitude": 30.910161, + "longitude": -95.312168, + "city": "Trinity", + "state": "TX", + "county": "Trinity" + }, + { + "zip_code": 75865, + "latitude": 31.105786, + "longitude": -95.138794, + "city": "Woodlake", + "state": "TX", + "county": "Trinity" + }, + { + "zip_code": 75880, + "latitude": 31.794191, + "longitude": -95.661964, + "city": "Tennessee Colony", + "state": "TX", + "county": "Anderson" + }, + { + "zip_code": 75882, + "latitude": 31.794191, + "longitude": -95.661964, + "city": "Palestine", + "state": "TX", + "county": "Anderson" + }, + { + "zip_code": 75884, + "latitude": 31.794191, + "longitude": -95.661964, + "city": "Tennessee Colony", + "state": "TX", + "county": "Anderson" + }, + { + "zip_code": 75886, + "latitude": 31.794191, + "longitude": -95.661964, + "city": "Tennessee Colony", + "state": "TX", + "county": "Anderson" + }, + { + "zip_code": 75901, + "latitude": 31.276467, + "longitude": -94.508447, + "city": "Lufkin", + "state": "TX", + "county": "Angelina" + }, + { + "zip_code": 75902, + "latitude": 31.362315, + "longitude": -94.761103, + "city": "Lufkin", + "state": "TX", + "county": "Angelina" + }, + { + "zip_code": 75903, + "latitude": 31.276647, + "longitude": -94.56759, + "city": "Lufkin", + "state": "TX", + "county": "Angelina" + }, + { + "zip_code": 75904, + "latitude": 31.335094, + "longitude": -94.703921, + "city": "Lufkin", + "state": "TX", + "county": "Angelina" + }, + { + "zip_code": 75915, + "latitude": 31.287257, + "longitude": -94.577084, + "city": "Lufkin", + "state": "TX", + "county": "Angelina" + }, + { + "zip_code": 75925, + "latitude": 31.806668, + "longitude": -95.142971, + "city": "Alto", + "state": "TX", + "county": "Cherokee" + }, + { + "zip_code": 75926, + "latitude": 31.105786, + "longitude": -95.138794, + "city": "Apple Springs", + "state": "TX", + "county": "Trinity" + }, + { + "zip_code": 75928, + "latitude": 30.714636, + "longitude": -93.709628, + "city": "Bon Wier", + "state": "TX", + "county": "Newton" + }, + { + "zip_code": 75929, + "latitude": 31.418078, + "longitude": -94.182373, + "city": "Broaddus", + "state": "TX", + "county": "San Augustine" + }, + { + "zip_code": 75930, + "latitude": 31.373062, + "longitude": -93.821948, + "city": "Bronson", + "state": "TX", + "county": "Sabine" + }, + { + "zip_code": 75931, + "latitude": 31.248984, + "longitude": -93.757415, + "city": "Brookeland", + "state": "TX", + "county": "Sabine" + }, + { + "zip_code": 75932, + "latitude": 31.147913, + "longitude": -93.612413, + "city": "Burkeville", + "state": "TX", + "county": "Newton" + }, + { + "zip_code": 75933, + "latitude": 30.714636, + "longitude": -93.709628, + "city": "Call", + "state": "TX", + "county": "Newton" + }, + { + "zip_code": 75934, + "latitude": 30.817866, + "longitude": -94.869052, + "city": "Camden", + "state": "TX", + "county": "Polk" + }, + { + "zip_code": 75935, + "latitude": 31.780781, + "longitude": -94.235334, + "city": "Center", + "state": "TX", + "county": "Shelby" + }, + { + "zip_code": 75936, + "latitude": 30.766328, + "longitude": -94.463387, + "city": "Chester", + "state": "TX", + "county": "Tyler" + }, + { + "zip_code": 75937, + "latitude": 31.486578, + "longitude": -94.348665, + "city": "Chireno", + "state": "TX", + "county": "Nacogdoches" + }, + { + "zip_code": 75938, + "latitude": 30.900651, + "longitude": -94.391575, + "city": "Colmesneil", + "state": "TX", + "county": "Tyler" + }, + { + "zip_code": 75939, + "latitude": 31.040793, + "longitude": -94.812363, + "city": "Corrigan", + "state": "TX", + "county": "Polk" + }, + { + "zip_code": 75941, + "latitude": 31.221634, + "longitude": -94.593924, + "city": "Diboll", + "state": "TX", + "county": "Angelina" + }, + { + "zip_code": 75942, + "latitude": 30.808063, + "longitude": -94.427902, + "city": "Doucette", + "state": "TX", + "county": "Tyler" + }, + { + "zip_code": 75943, + "latitude": 31.622983, + "longitude": -94.851213, + "city": "Douglass", + "state": "TX", + "county": "Nacogdoches" + }, + { + "zip_code": 75944, + "latitude": 31.534162, + "longitude": -94.639022, + "city": "Etoile", + "state": "TX", + "county": "Nacogdoches" + }, + { + "zip_code": 75946, + "latitude": 31.771781, + "longitude": -94.526793, + "city": "Garrison", + "state": "TX", + "county": "Nacogdoches" + }, + { + "zip_code": 75947, + "latitude": 31.373062, + "longitude": -93.821948, + "city": "Geneva", + "state": "TX", + "county": "Sabine" + }, + { + "zip_code": 75948, + "latitude": 31.329084, + "longitude": -93.773671, + "city": "Hemphill", + "state": "TX", + "county": "Sabine" + }, + { + "zip_code": 75949, + "latitude": 31.285984, + "longitude": -94.526589, + "city": "Huntington", + "state": "TX", + "county": "Angelina" + }, + { + "zip_code": 75951, + "latitude": 30.867257, + "longitude": -93.997666, + "city": "Jasper", + "state": "TX", + "county": "Jasper" + }, + { + "zip_code": 75954, + "latitude": 31.966633, + "longitude": -94.058836, + "city": "Joaquin", + "state": "TX", + "county": "Shelby" + }, + { + "zip_code": 75956, + "latitude": 30.658273, + "longitude": -93.8984, + "city": "Kirbyville", + "state": "TX", + "county": "Jasper" + }, + { + "zip_code": 75958, + "latitude": 31.534162, + "longitude": -94.639022, + "city": "Martinsville", + "state": "TX", + "county": "Nacogdoches" + }, + { + "zip_code": 75959, + "latitude": 31.373062, + "longitude": -93.821948, + "city": "Milam", + "state": "TX", + "county": "Sabine" + }, + { + "zip_code": 75960, + "latitude": 30.817866, + "longitude": -94.869052, + "city": "Moscow", + "state": "TX", + "county": "Polk" + }, + { + "zip_code": 75961, + "latitude": 31.664506, + "longitude": -94.578421, + "city": "Nacogdoches", + "state": "TX", + "county": "Nacogdoches" + }, + { + "zip_code": 75962, + "latitude": 31.699494, + "longitude": -94.607432, + "city": "Nacogdoches", + "state": "TX", + "county": "Nacogdoches" + }, + { + "zip_code": 75963, + "latitude": 31.604573, + "longitude": -94.664127, + "city": "Nacogdoches", + "state": "TX", + "county": "Nacogdoches" + }, + { + "zip_code": 75964, + "latitude": 31.673736, + "longitude": -94.693206, + "city": "Nacogdoches", + "state": "TX", + "county": "Nacogdoches" + }, + { + "zip_code": 75965, + "latitude": "", + "longitude": "", + "city": "Nacogdoches", + "state": "TX", + "county": "Nacogdoches" + }, + { + "zip_code": 75966, + "latitude": 30.838608, + "longitude": -93.767911, + "city": "Newton", + "state": "TX", + "county": "Newton" + }, + { + "zip_code": 75968, + "latitude": 31.24817, + "longitude": -93.973106, + "city": "Pineland", + "state": "TX", + "county": "Sabine" + }, + { + "zip_code": 75969, + "latitude": 31.440245, + "longitude": -94.869754, + "city": "Pollok", + "state": "TX", + "county": "Angelina" + }, + { + "zip_code": 75972, + "latitude": 31.548122, + "longitude": -94.111751, + "city": "San Augustine", + "state": "TX", + "county": "San Augustine" + }, + { + "zip_code": 75973, + "latitude": 31.774637, + "longitude": -94.152946, + "city": "Shelbyville", + "state": "TX", + "county": "Shelby" + }, + { + "zip_code": 75974, + "latitude": 31.948053, + "longitude": -94.247695, + "city": "Tenaha", + "state": "TX", + "county": "Shelby" + }, + { + "zip_code": 75975, + "latitude": 31.905616, + "longitude": -94.42602, + "city": "Timpson", + "state": "TX", + "county": "Shelby" + }, + { + "zip_code": 75976, + "latitude": 31.782048, + "longitude": -95.164021, + "city": "Wells", + "state": "TX", + "county": "Cherokee" + }, + { + "zip_code": 75977, + "latitude": 30.714636, + "longitude": -93.709628, + "city": "Wiergate", + "state": "TX", + "county": "Newton" + }, + { + "zip_code": 75978, + "latitude": 31.534162, + "longitude": -94.639022, + "city": "Woden", + "state": "TX", + "county": "Nacogdoches" + }, + { + "zip_code": 75979, + "latitude": 30.758494, + "longitude": -94.366929, + "city": "Woodville", + "state": "TX", + "county": "Tyler" + }, + { + "zip_code": 75980, + "latitude": 31.174421, + "longitude": -94.401293, + "city": "Zavalla", + "state": "TX", + "county": "Angelina" + }, + { + "zip_code": 75990, + "latitude": 30.792674, + "longitude": -94.354476, + "city": "Woodville", + "state": "TX", + "county": "Tyler" + }, + { + "zip_code": 76001, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76002, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76003, + "latitude": 32.741685, + "longitude": -97.225324, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76004, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76005, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76006, + "latitude": 32.776551, + "longitude": -97.085559, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76007, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76008, + "latitude": 32.681918, + "longitude": -97.779522, + "city": "Aledo", + "state": "TX", + "county": "Parker" + }, + { + "zip_code": 76009, + "latitude": 32.421034, + "longitude": -97.196279, + "city": "Alvarado", + "state": "TX", + "county": "Johnson" + }, + { + "zip_code": 76010, + "latitude": 32.731821, + "longitude": -97.079787, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76011, + "latitude": 32.771455, + "longitude": -97.079633, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76012, + "latitude": 32.77408, + "longitude": -97.131689, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76013, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76014, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76015, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76016, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76017, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76018, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76019, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76020, + "latitude": 32.909715, + "longitude": -97.526302, + "city": "Azle", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76021, + "latitude": 32.852546, + "longitude": -97.136289, + "city": "Bedford", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76022, + "latitude": 32.831019, + "longitude": -97.144339, + "city": "Bedford", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76023, + "latitude": 33.111268, + "longitude": -97.638617, + "city": "Boyd", + "state": "TX", + "county": "Wise" + }, + { + "zip_code": 76028, + "latitude": 32.492683, + "longitude": -97.264359, + "city": "Burleson", + "state": "TX", + "county": "Johnson" + }, + { + "zip_code": 76031, + "latitude": 32.317774, + "longitude": -97.440849, + "city": "Cleburne", + "state": "TX", + "county": "Johnson" + }, + { + "zip_code": 76033, + "latitude": 32.350907, + "longitude": -97.410254, + "city": "Cleburne", + "state": "TX", + "county": "Johnson" + }, + { + "zip_code": 76034, + "latitude": 32.88955, + "longitude": -97.143409, + "city": "Colleyville", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76035, + "latitude": 32.473973, + "longitude": -97.67747, + "city": "Cresson", + "state": "TX", + "county": "Hood" + }, + { + "zip_code": 76036, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Crowley", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76039, + "latitude": 32.859305, + "longitude": -97.075688, + "city": "Euless", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76040, + "latitude": 32.821379, + "longitude": -97.108179, + "city": "Euless", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76041, + "latitude": 32.248588, + "longitude": -96.823225, + "city": "Forreston", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 76043, + "latitude": 32.210812, + "longitude": -97.792155, + "city": "Glen Rose", + "state": "TX", + "county": "Somervell" + }, + { + "zip_code": 76044, + "latitude": 32.418496, + "longitude": -97.530566, + "city": "Godley", + "state": "TX", + "county": "Johnson" + }, + { + "zip_code": 76048, + "latitude": 32.435405, + "longitude": -97.844867, + "city": "Granbury", + "state": "TX", + "county": "Hood" + }, + { + "zip_code": 76049, + "latitude": 32.449368, + "longitude": -97.76658, + "city": "Granbury", + "state": "TX", + "county": "Hood" + }, + { + "zip_code": 76050, + "latitude": 32.336003, + "longitude": -97.311068, + "city": "Grandview", + "state": "TX", + "county": "Johnson" + }, + { + "zip_code": 76051, + "latitude": 32.932843, + "longitude": -97.080802, + "city": "Grapevine", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76052, + "latitude": 32.941139, + "longitude": -97.353767, + "city": "Haslet", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76053, + "latitude": 32.882663, + "longitude": -97.227779, + "city": "Hurst", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76054, + "latitude": 32.863193, + "longitude": -97.175935, + "city": "Hurst", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76055, + "latitude": 32.176705, + "longitude": -97.20549, + "city": "Itasca", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76058, + "latitude": 32.408644, + "longitude": -97.303647, + "city": "Joshua", + "state": "TX", + "county": "Johnson" + }, + { + "zip_code": 76059, + "latitude": 32.334964, + "longitude": -97.30553, + "city": "Keene", + "state": "TX", + "county": "Johnson" + }, + { + "zip_code": 76060, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Kennedale", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76061, + "latitude": 32.476067, + "longitude": -97.189257, + "city": "Lillian", + "state": "TX", + "county": "Johnson" + }, + { + "zip_code": 76063, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Mansfield", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76064, + "latitude": 32.299304, + "longitude": -97.02705, + "city": "Maypearl", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 76065, + "latitude": 32.431364, + "longitude": -96.978849, + "city": "Midlothian", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 76066, + "latitude": 32.745716, + "longitude": -97.956126, + "city": "Millsap", + "state": "TX", + "county": "Parker" + }, + { + "zip_code": 76067, + "latitude": 32.800128, + "longitude": -98.24943, + "city": "Mineral Wells", + "state": "TX", + "county": "Palo Pinto" + }, + { + "zip_code": 76068, + "latitude": 32.759769, + "longitude": -98.316175, + "city": "Mineral Wells", + "state": "TX", + "county": "Palo Pinto" + }, + { + "zip_code": 76070, + "latitude": 32.234831, + "longitude": -97.665434, + "city": "Nemo", + "state": "TX", + "county": "Somervell" + }, + { + "zip_code": 76071, + "latitude": 33.006977, + "longitude": -97.492336, + "city": "Newark", + "state": "TX", + "county": "Wise" + }, + { + "zip_code": 76073, + "latitude": 33.097605, + "longitude": -97.727516, + "city": "Paradise", + "state": "TX", + "county": "Wise" + }, + { + "zip_code": 76077, + "latitude": 32.284006, + "longitude": -97.704041, + "city": "Rainbow", + "state": "TX", + "county": "Somervell" + }, + { + "zip_code": 76078, + "latitude": 33.092103, + "longitude": -97.480329, + "city": "Rhome", + "state": "TX", + "county": "Wise" + }, + { + "zip_code": 76082, + "latitude": 32.80864, + "longitude": -97.693195, + "city": "Springtown", + "state": "TX", + "county": "Parker" + }, + { + "zip_code": 76084, + "latitude": 32.455147, + "longitude": -97.141191, + "city": "Venus", + "state": "TX", + "county": "Johnson" + }, + { + "zip_code": 76085, + "latitude": "", + "longitude": "", + "city": "Weatherford", + "state": "TX", + "county": "Parker" + }, + { + "zip_code": 76086, + "latitude": 32.780766, + "longitude": -97.806778, + "city": "Weatherford", + "state": "TX", + "county": "Parker" + }, + { + "zip_code": 76087, + "latitude": 32.753927, + "longitude": -97.786026, + "city": "Weatherford", + "state": "TX", + "county": "Parker" + }, + { + "zip_code": 76088, + "latitude": 32.847803, + "longitude": -97.860618, + "city": "Weatherford", + "state": "TX", + "county": "Parker" + }, + { + "zip_code": 76092, + "latitude": 32.948474, + "longitude": -97.152368, + "city": "Southlake", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76093, + "latitude": 32.295054, + "longitude": -97.326177, + "city": "Rio Vista", + "state": "TX", + "county": "Johnson" + }, + { + "zip_code": 76094, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76095, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Bedford", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76096, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Arlington", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76097, + "latitude": 32.524393, + "longitude": -97.2609, + "city": "Burleson", + "state": "TX", + "county": "Johnson" + }, + { + "zip_code": 76098, + "latitude": 32.895716, + "longitude": -97.563622, + "city": "Azle", + "state": "TX", + "county": "Parker" + }, + { + "zip_code": 76099, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Grapevine", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76101, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76102, + "latitude": 32.759437, + "longitude": -97.245612, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76103, + "latitude": 32.756715, + "longitude": -97.274093, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76104, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76105, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76106, + "latitude": 32.788655, + "longitude": -97.355195, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76107, + "latitude": 32.75428, + "longitude": -97.380446, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76108, + "latitude": 32.782178, + "longitude": -97.496948, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76109, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76110, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76111, + "latitude": 32.794671, + "longitude": -97.297494, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76112, + "latitude": 32.77213, + "longitude": -97.217742, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76113, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76114, + "latitude": 32.779629, + "longitude": -97.392797, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76115, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76116, + "latitude": 32.743094, + "longitude": -97.426847, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76117, + "latitude": 32.801874, + "longitude": -97.263393, + "city": "Haltom City", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76118, + "latitude": 32.801252, + "longitude": -97.195241, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76119, + "latitude": 32.798883, + "longitude": -97.193275, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76120, + "latitude": 32.769931, + "longitude": -97.184721, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76121, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76122, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76123, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76124, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76126, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76127, + "latitude": 32.766737, + "longitude": -97.427153, + "city": "Naval Air Station/ Jrb", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76129, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76130, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76131, + "latitude": 32.891654, + "longitude": -97.348081, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76132, + "latitude": 32.868287, + "longitude": -97.369898, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76133, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76134, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76135, + "latitude": 32.834785, + "longitude": -97.470199, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76136, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76137, + "latitude": 32.853199, + "longitude": -97.288144, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76140, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76147, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76148, + "latitude": 32.862105, + "longitude": -97.250808, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76150, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76155, + "latitude": 32.831354, + "longitude": -97.051969, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76161, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76162, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76163, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76164, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76177, + "latitude": 32.93455, + "longitude": -97.32362, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76178, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76179, + "latitude": 32.907394, + "longitude": -97.425681, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76180, + "latitude": 32.868023, + "longitude": -97.217416, + "city": "North Richland Hills", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76181, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76182, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "North Richland Hills", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76185, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76191, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76192, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76193, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76195, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76196, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76197, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76198, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76199, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Fort Worth", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76201, + "latitude": 33.244683, + "longitude": -97.200555, + "city": "Denton", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76202, + "latitude": 33.225523, + "longitude": -97.108546, + "city": "Denton", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76203, + "latitude": 33.246457, + "longitude": -97.127027, + "city": "Denton", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76204, + "latitude": 33.20743, + "longitude": -97.116282, + "city": "Denton", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76205, + "latitude": 33.152861, + "longitude": -97.091876, + "city": "Denton", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76206, + "latitude": 33.169379, + "longitude": -97.150558, + "city": "Denton", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76207, + "latitude": 33.238378, + "longitude": -97.203975, + "city": "Denton", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76208, + "latitude": 33.160393, + "longitude": -97.095421, + "city": "Denton", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76209, + "latitude": "", + "longitude": "", + "city": "Denton", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76210, + "latitude": "", + "longitude": "", + "city": "Denton", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76225, + "latitude": 33.355828, + "longitude": -97.708353, + "city": "Alvord", + "state": "TX", + "county": "Wise" + }, + { + "zip_code": 76226, + "latitude": 33.215066, + "longitude": -97.164644, + "city": "Argyle", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76227, + "latitude": 33.278066, + "longitude": -97.01748, + "city": "Aubrey", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76228, + "latitude": 33.634364, + "longitude": -98.015081, + "city": "Bellevue", + "state": "TX", + "county": "Clay" + }, + { + "zip_code": 76230, + "latitude": 33.530011, + "longitude": -97.856849, + "city": "Bowie", + "state": "TX", + "county": "Montague" + }, + { + "zip_code": 76233, + "latitude": 33.561589, + "longitude": -96.856165, + "city": "Collinsville", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 76234, + "latitude": 33.260148, + "longitude": -97.610974, + "city": "Decatur", + "state": "TX", + "county": "Wise" + }, + { + "zip_code": 76238, + "latitude": 33.490924, + "longitude": -97.313913, + "city": "Era", + "state": "TX", + "county": "Cooke" + }, + { + "zip_code": 76239, + "latitude": 33.436183, + "longitude": -97.565592, + "city": "Forestburg", + "state": "TX", + "county": "Montague" + }, + { + "zip_code": 76240, + "latitude": 33.654698, + "longitude": -97.158295, + "city": "Gainesville", + "state": "TX", + "county": "Cooke" + }, + { + "zip_code": 76241, + "latitude": 33.610384, + "longitude": -97.03692, + "city": "Gainesville", + "state": "TX", + "county": "Cooke" + }, + { + "zip_code": 76244, + "latitude": 32.771419, + "longitude": -97.291484, + "city": "Keller", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76245, + "latitude": 33.826599, + "longitude": -96.851241, + "city": "Gordonville", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 76246, + "latitude": 33.317914, + "longitude": -97.609392, + "city": "Greenwood", + "state": "TX", + "county": "Wise" + }, + { + "zip_code": 76247, + "latitude": 33.100744, + "longitude": -97.245551, + "city": "Justin", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76248, + "latitude": 32.934629, + "longitude": -97.24871, + "city": "Keller", + "state": "TX", + "county": "Tarrant" + }, + { + "zip_code": 76249, + "latitude": 33.224192, + "longitude": -97.286741, + "city": "Krum", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76250, + "latitude": 33.533869, + "longitude": -97.171723, + "city": "Lindsay", + "state": "TX", + "county": "Cooke" + }, + { + "zip_code": 76251, + "latitude": 33.647198, + "longitude": -97.720081, + "city": "Montague", + "state": "TX", + "county": "Montague" + }, + { + "zip_code": 76252, + "latitude": 33.690667, + "longitude": -97.34502, + "city": "Muenster", + "state": "TX", + "county": "Cooke" + }, + { + "zip_code": 76253, + "latitude": 33.617841, + "longitude": -97.309018, + "city": "Myra", + "state": "TX", + "county": "Cooke" + }, + { + "zip_code": 76255, + "latitude": 33.815096, + "longitude": -97.691515, + "city": "Nocona", + "state": "TX", + "county": "Montague" + }, + { + "zip_code": 76258, + "latitude": 33.249576, + "longitude": -97.067567, + "city": "Pilot Point", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76259, + "latitude": 33.192662, + "longitude": -97.309629, + "city": "Ponder", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76261, + "latitude": 33.820163, + "longitude": -97.941476, + "city": "Ringgold", + "state": "TX", + "county": "Montague" + }, + { + "zip_code": 76262, + "latitude": 33.199082, + "longitude": -97.117815, + "city": "Roanoke", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76263, + "latitude": 33.487842, + "longitude": -97.421155, + "city": "Rosston", + "state": "TX", + "county": "Cooke" + }, + { + "zip_code": 76264, + "latitude": 33.728996, + "longitude": -96.846208, + "city": "Sadler", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 76265, + "latitude": 33.692738, + "longitude": -97.524599, + "city": "Saint Jo", + "state": "TX", + "county": "Montague" + }, + { + "zip_code": 76266, + "latitude": 33.341653, + "longitude": -97.214454, + "city": "Sanger", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76267, + "latitude": 33.378039, + "longitude": -97.39219, + "city": "Slidell", + "state": "TX", + "county": "Wise" + }, + { + "zip_code": 76268, + "latitude": 33.602427, + "longitude": -96.757322, + "city": "Southmayd", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 76270, + "latitude": 33.499274, + "longitude": -97.760266, + "city": "Sunset", + "state": "TX", + "county": "Montague" + }, + { + "zip_code": 76271, + "latitude": 33.532559, + "longitude": -96.859159, + "city": "Tioga", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 76272, + "latitude": 33.495794, + "longitude": -97.143184, + "city": "Valley View", + "state": "TX", + "county": "Cooke" + }, + { + "zip_code": 76273, + "latitude": 33.701372, + "longitude": -96.836522, + "city": "Whitesboro", + "state": "TX", + "county": "Grayson" + }, + { + "zip_code": 76299, + "latitude": 33.20743, + "longitude": -97.116282, + "city": "Roanoke", + "state": "TX", + "county": "Denton" + }, + { + "zip_code": 76301, + "latitude": 33.959758, + "longitude": -98.48283, + "city": "Wichita Falls", + "state": "TX", + "county": "Wichita" + }, + { + "zip_code": 76302, + "latitude": 33.863948, + "longitude": -98.47828, + "city": "Wichita Falls", + "state": "TX", + "county": "Wichita" + }, + { + "zip_code": 76305, + "latitude": 33.973736, + "longitude": -98.512878, + "city": "Wichita Falls", + "state": "TX", + "county": "Wichita" + }, + { + "zip_code": 76306, + "latitude": 33.979635, + "longitude": -98.696094, + "city": "Wichita Falls", + "state": "TX", + "county": "Wichita" + }, + { + "zip_code": 76307, + "latitude": 33.877746, + "longitude": -98.494595, + "city": "Wichita Falls", + "state": "TX", + "county": "Wichita" + }, + { + "zip_code": 76308, + "latitude": 33.863226, + "longitude": -98.582279, + "city": "Wichita Falls", + "state": "TX", + "county": "Wichita" + }, + { + "zip_code": 76309, + "latitude": 33.892709, + "longitude": -98.499781, + "city": "Wichita Falls", + "state": "TX", + "county": "Wichita" + }, + { + "zip_code": 76310, + "latitude": 33.87121, + "longitude": -98.576573, + "city": "Wichita Falls", + "state": "TX", + "county": "Wichita" + }, + { + "zip_code": 76311, + "latitude": 33.968945, + "longitude": -98.505933, + "city": "Sheppard Afb", + "state": "TX", + "county": "Wichita" + }, + { + "zip_code": 76351, + "latitude": 33.556215, + "longitude": -98.624934, + "city": "Archer City", + "state": "TX", + "county": "Archer" + }, + { + "zip_code": 76352, + "latitude": 33.811665, + "longitude": -98.184762, + "city": "Bluegrove", + "state": "TX", + "county": "Clay" + }, + { + "zip_code": 76354, + "latitude": 34.048087, + "longitude": -98.600475, + "city": "Burkburnett", + "state": "TX", + "county": "Wichita" + }, + { + "zip_code": 76357, + "latitude": 34.072254, + "longitude": -98.191301, + "city": "Byers", + "state": "TX", + "county": "Clay" + }, + { + "zip_code": 76360, + "latitude": 33.999472, + "longitude": -98.743552, + "city": "Electra", + "state": "TX", + "county": "Wichita" + }, + { + "zip_code": 76363, + "latitude": 33.514168, + "longitude": -99.572744, + "city": "Goree", + "state": "TX", + "county": "Knox" + }, + { + "zip_code": 76364, + "latitude": 34.118913, + "longitude": -99.033787, + "city": "Harrold", + "state": "TX", + "county": "Wilbarger" + }, + { + "zip_code": 76365, + "latitude": 33.906101, + "longitude": -98.201732, + "city": "Henrietta", + "state": "TX", + "county": "Clay" + }, + { + "zip_code": 76366, + "latitude": 33.711373, + "longitude": -98.711928, + "city": "Holliday", + "state": "TX", + "county": "Archer" + }, + { + "zip_code": 76367, + "latitude": 33.969067, + "longitude": -98.717032, + "city": "Iowa Park", + "state": "TX", + "county": "Wichita" + }, + { + "zip_code": 76369, + "latitude": 34.023386, + "longitude": -98.687748, + "city": "Kamay", + "state": "TX", + "county": "Wichita" + }, + { + "zip_code": 76370, + "latitude": 33.453275, + "longitude": -98.929727, + "city": "Megargel", + "state": "TX", + "county": "Archer" + }, + { + "zip_code": 76371, + "latitude": 33.495136, + "longitude": -99.642309, + "city": "Munday", + "state": "TX", + "county": "Knox" + }, + { + "zip_code": 76372, + "latitude": 33.1934, + "longitude": -98.742126, + "city": "Newcastle", + "state": "TX", + "county": "Young" + }, + { + "zip_code": 76373, + "latitude": 34.145598, + "longitude": -99.107033, + "city": "Oklaunion", + "state": "TX", + "county": "Wilbarger" + }, + { + "zip_code": 76374, + "latitude": 33.361214, + "longitude": -98.779466, + "city": "Olney", + "state": "TX", + "county": "Young" + }, + { + "zip_code": 76377, + "latitude": 34.032867, + "longitude": -98.228187, + "city": "Petrolia", + "state": "TX", + "county": "Clay" + }, + { + "zip_code": 76379, + "latitude": 33.615708, + "longitude": -98.687302, + "city": "Scotland", + "state": "TX", + "county": "Archer" + }, + { + "zip_code": 76380, + "latitude": 33.620131, + "longitude": -99.263681, + "city": "Seymour", + "state": "TX", + "county": "Baylor" + }, + { + "zip_code": 76384, + "latitude": 34.155524, + "longitude": -99.284002, + "city": "Vernon", + "state": "TX", + "county": "Wilbarger" + }, + { + "zip_code": 76385, + "latitude": 34.146356, + "longitude": -99.214088, + "city": "Vernon", + "state": "TX", + "county": "Wilbarger" + }, + { + "zip_code": 76388, + "latitude": 33.322098, + "longitude": -99.674393, + "city": "Weinert", + "state": "TX", + "county": "Haskell" + }, + { + "zip_code": 76389, + "latitude": 33.615708, + "longitude": -98.687302, + "city": "Windthorst", + "state": "TX", + "county": "Archer" + }, + { + "zip_code": 76401, + "latitude": 32.321348, + "longitude": -98.108828, + "city": "Stephenville", + "state": "TX", + "county": "Erath" + }, + { + "zip_code": 76402, + "latitude": 32.215275, + "longitude": -98.207997, + "city": "Stephenville", + "state": "TX", + "county": "Erath" + }, + { + "zip_code": 76424, + "latitude": 32.769037, + "longitude": -98.84154, + "city": "Breckenridge", + "state": "TX", + "county": "Stephens" + }, + { + "zip_code": 76426, + "latitude": 33.174802, + "longitude": -97.697401, + "city": "Bridgeport", + "state": "TX", + "county": "Wise" + }, + { + "zip_code": 76427, + "latitude": 33.161547, + "longitude": -98.387427, + "city": "Bryson", + "state": "TX", + "county": "Jack" + }, + { + "zip_code": 76429, + "latitude": 32.715706, + "longitude": -98.749054, + "city": "Caddo", + "state": "TX", + "county": "Stephens" + }, + { + "zip_code": 76430, + "latitude": 32.768222, + "longitude": -99.210207, + "city": "Albany", + "state": "TX", + "county": "Shackelford" + }, + { + "zip_code": 76431, + "latitude": 33.301868, + "longitude": -97.814354, + "city": "Chico", + "state": "TX", + "county": "Wise" + }, + { + "zip_code": 76432, + "latitude": 31.801502, + "longitude": -98.827637, + "city": "Blanket", + "state": "TX", + "county": "Brown" + }, + { + "zip_code": 76433, + "latitude": 32.28842, + "longitude": -98.053885, + "city": "Bluff Dale", + "state": "TX", + "county": "Erath" + }, + { + "zip_code": 76435, + "latitude": 32.228414, + "longitude": -98.819663, + "city": "Carbon", + "state": "TX", + "county": "Eastland" + }, + { + "zip_code": 76436, + "latitude": 31.717077, + "longitude": -98.115083, + "city": "Carlton", + "state": "TX", + "county": "Hamilton" + }, + { + "zip_code": 76437, + "latitude": 32.286476, + "longitude": -98.973319, + "city": "Cisco", + "state": "TX", + "county": "Eastland" + }, + { + "zip_code": 76439, + "latitude": 32.632495, + "longitude": -97.957483, + "city": "Dennis", + "state": "TX", + "county": "Parker" + }, + { + "zip_code": 76442, + "latitude": 31.979672, + "longitude": -98.513844, + "city": "Comanche", + "state": "TX", + "county": "Comanche" + }, + { + "zip_code": 76443, + "latitude": 32.16742, + "longitude": -99.221055, + "city": "Cross Plains", + "state": "TX", + "county": "Callahan" + }, + { + "zip_code": 76444, + "latitude": 32.070468, + "longitude": -98.650751, + "city": "De Leon", + "state": "TX", + "county": "Comanche" + }, + { + "zip_code": 76445, + "latitude": 32.296818, + "longitude": -98.796686, + "city": "Desdemona", + "state": "TX", + "county": "Eastland" + }, + { + "zip_code": 76446, + "latitude": 32.123145, + "longitude": -98.289028, + "city": "Dublin", + "state": "TX", + "county": "Erath" + }, + { + "zip_code": 76448, + "latitude": 32.403972, + "longitude": -98.777973, + "city": "Eastland", + "state": "TX", + "county": "Eastland" + }, + { + "zip_code": 76449, + "latitude": 32.774543, + "longitude": -98.337981, + "city": "Graford", + "state": "TX", + "county": "Palo Pinto" + }, + { + "zip_code": 76450, + "latitude": 33.092674, + "longitude": -98.64403, + "city": "Graham", + "state": "TX", + "county": "Young" + }, + { + "zip_code": 76452, + "latitude": 31.972712, + "longitude": -98.540485, + "city": "Energy", + "state": "TX", + "county": "Comanche" + }, + { + "zip_code": 76453, + "latitude": 32.616663, + "longitude": -98.368583, + "city": "Gordon", + "state": "TX", + "county": "Palo Pinto" + }, + { + "zip_code": 76454, + "latitude": 32.221688, + "longitude": -98.719352, + "city": "Gorman", + "state": "TX", + "county": "Eastland" + }, + { + "zip_code": 76455, + "latitude": 31.846846, + "longitude": -98.401686, + "city": "Gustine", + "state": "TX", + "county": "Comanche" + }, + { + "zip_code": 76457, + "latitude": 31.939212, + "longitude": -98.032562, + "city": "Hico", + "state": "TX", + "county": "Hamilton" + }, + { + "zip_code": 76458, + "latitude": 33.246805, + "longitude": -98.264241, + "city": "Jacksboro", + "state": "TX", + "county": "Jack" + }, + { + "zip_code": 76459, + "latitude": 33.234207, + "longitude": -98.172371, + "city": "Jermyn", + "state": "TX", + "county": "Jack" + }, + { + "zip_code": 76460, + "latitude": 33.290955, + "longitude": -98.496902, + "city": "Loving", + "state": "TX", + "county": "Young" + }, + { + "zip_code": 76461, + "latitude": 32.221433, + "longitude": -98.342798, + "city": "Lingleville", + "state": "TX", + "county": "Erath" + }, + { + "zip_code": 76462, + "latitude": 32.494133, + "longitude": -97.989191, + "city": "Lipan", + "state": "TX", + "county": "Hood" + }, + { + "zip_code": 76463, + "latitude": 32.538075, + "longitude": -98.421901, + "city": "Mingus", + "state": "TX", + "county": "Palo Pinto" + }, + { + "zip_code": 76464, + "latitude": 32.624249, + "longitude": -99.199479, + "city": "Moran", + "state": "TX", + "county": "Shackelford" + }, + { + "zip_code": 76465, + "latitude": 32.215275, + "longitude": -98.207997, + "city": "Morgan Mill", + "state": "TX", + "county": "Erath" + }, + { + "zip_code": 76466, + "latitude": 32.442088, + "longitude": -98.734228, + "city": "Olden", + "state": "TX", + "county": "Eastland" + }, + { + "zip_code": 76467, + "latitude": 32.341365, + "longitude": -97.932083, + "city": "Paluxy", + "state": "TX", + "county": "Hood" + }, + { + "zip_code": 76468, + "latitude": 31.972712, + "longitude": -98.540485, + "city": "Proctor", + "state": "TX", + "county": "Comanche" + }, + { + "zip_code": 76469, + "latitude": 32.374033, + "longitude": -99.195668, + "city": "Putnam", + "state": "TX", + "county": "Callahan" + }, + { + "zip_code": 76470, + "latitude": 32.303639, + "longitude": -98.778484, + "city": "Ranger", + "state": "TX", + "county": "Eastland" + }, + { + "zip_code": 76471, + "latitude": 32.268924, + "longitude": -98.860949, + "city": "Rising Star", + "state": "TX", + "county": "Eastland" + }, + { + "zip_code": 76472, + "latitude": 32.635934, + "longitude": -98.179314, + "city": "Santo", + "state": "TX", + "county": "Palo Pinto" + }, + { + "zip_code": 76474, + "latitude": 31.972712, + "longitude": -98.540485, + "city": "Sidney", + "state": "TX", + "county": "Comanche" + }, + { + "zip_code": 76475, + "latitude": 32.693772, + "longitude": -98.509939, + "city": "Strawn", + "state": "TX", + "county": "Palo Pinto" + }, + { + "zip_code": 76476, + "latitude": 32.400038, + "longitude": -97.933708, + "city": "Tolar", + "state": "TX", + "county": "Hood" + }, + { + "zip_code": 76481, + "latitude": 33.005164, + "longitude": -98.689196, + "city": "South Bend", + "state": "TX", + "county": "Young" + }, + { + "zip_code": 76483, + "latitude": 33.158707, + "longitude": -99.145361, + "city": "Throckmorton", + "state": "TX", + "county": "Throckmorton" + }, + { + "zip_code": 76484, + "latitude": 32.704835, + "longitude": -98.346877, + "city": "Palo Pinto", + "state": "TX", + "county": "Palo Pinto" + }, + { + "zip_code": 76485, + "latitude": 32.779315, + "longitude": -97.805502, + "city": "Peaster", + "state": "TX", + "county": "Parker" + }, + { + "zip_code": 76486, + "latitude": 33.030672, + "longitude": -98.066151, + "city": "Perrin", + "state": "TX", + "county": "Jack" + }, + { + "zip_code": 76487, + "latitude": 32.94962, + "longitude": -97.903499, + "city": "Poolville", + "state": "TX", + "county": "Parker" + }, + { + "zip_code": 76490, + "latitude": 32.951494, + "longitude": -97.942209, + "city": "Whitt", + "state": "TX", + "county": "Parker" + }, + { + "zip_code": 76491, + "latitude": 33.074064, + "longitude": -99.054584, + "city": "Woodson", + "state": "TX", + "county": "Throckmorton" + }, + { + "zip_code": 76501, + "latitude": 31.068306, + "longitude": -97.3047, + "city": "Temple", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76502, + "latitude": 31.104581, + "longitude": -97.402704, + "city": "Temple", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76503, + "latitude": 31.053986, + "longitude": -97.320306, + "city": "Temple", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76504, + "latitude": 31.121795, + "longitude": -97.440951, + "city": "Temple", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76505, + "latitude": 31.036287, + "longitude": -97.492017, + "city": "Temple", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76508, + "latitude": 31.036287, + "longitude": -97.492017, + "city": "Temple", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76511, + "latitude": 30.906295, + "longitude": -97.417295, + "city": "Bartlett", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76513, + "latitude": 30.983551, + "longitude": -97.521848, + "city": "Belton", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76518, + "latitude": 30.868537, + "longitude": -97.055021, + "city": "Buckholts", + "state": "TX", + "county": "Milam" + }, + { + "zip_code": 76519, + "latitude": 30.973648, + "longitude": -96.964199, + "city": "Burlington", + "state": "TX", + "county": "Milam" + }, + { + "zip_code": 76520, + "latitude": 30.812561, + "longitude": -96.902747, + "city": "Cameron", + "state": "TX", + "county": "Milam" + }, + { + "zip_code": 76522, + "latitude": 31.202919, + "longitude": -97.930051, + "city": "Copperas Cove", + "state": "TX", + "county": "Coryell" + }, + { + "zip_code": 76523, + "latitude": 30.784169, + "longitude": -96.96376, + "city": "Davilla", + "state": "TX", + "county": "Milam" + }, + { + "zip_code": 76524, + "latitude": 31.308813, + "longitude": -97.277397, + "city": "Eddy", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76525, + "latitude": 31.438841, + "longitude": -98.053477, + "city": "Evant", + "state": "TX", + "county": "Coryell" + }, + { + "zip_code": 76526, + "latitude": 31.295568, + "longitude": -97.582152, + "city": "Flat", + "state": "TX", + "county": "Coryell" + }, + { + "zip_code": 76527, + "latitude": 30.807586, + "longitude": -97.78119, + "city": "Florence", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 76528, + "latitude": 31.417739, + "longitude": -97.833033, + "city": "Gatesville", + "state": "TX", + "county": "Coryell" + }, + { + "zip_code": 76530, + "latitude": 30.71136, + "longitude": -97.418471, + "city": "Granger", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 76531, + "latitude": 31.671399, + "longitude": -98.107585, + "city": "Hamilton", + "state": "TX", + "county": "Hamilton" + }, + { + "zip_code": 76533, + "latitude": 31.049621, + "longitude": -97.493616, + "city": "Heidenheimer", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76534, + "latitude": 30.887588, + "longitude": -97.418108, + "city": "Holland", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76537, + "latitude": 30.811931, + "longitude": -97.594186, + "city": "Jarrell", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 76538, + "latitude": 31.559947, + "longitude": -97.845634, + "city": "Jonesboro", + "state": "TX", + "county": "Coryell" + }, + { + "zip_code": 76539, + "latitude": 31.107716, + "longitude": -97.957926, + "city": "Kempner", + "state": "TX", + "county": "Lampasas" + }, + { + "zip_code": 76540, + "latitude": 31.085833, + "longitude": -97.357099, + "city": "Killeen", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76541, + "latitude": 31.057772, + "longitude": -97.621213, + "city": "Killeen", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76542, + "latitude": 31.03757, + "longitude": -97.680866, + "city": "Killeen", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76543, + "latitude": 31.010681, + "longitude": -97.585946, + "city": "Killeen", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76544, + "latitude": 31.128195, + "longitude": -97.746948, + "city": "Killeen", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76545, + "latitude": 31.036287, + "longitude": -97.492017, + "city": "Killeen", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76546, + "latitude": 31.036287, + "longitude": -97.492017, + "city": "Killeen", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76547, + "latitude": 31.036287, + "longitude": -97.492017, + "city": "Killeen", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76548, + "latitude": 31.028627, + "longitude": -97.611484, + "city": "Harker Heights", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76549, + "latitude": 31.043013, + "longitude": -97.590787, + "city": "Killeen", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76550, + "latitude": 31.183225, + "longitude": -98.236306, + "city": "Lampasas", + "state": "TX", + "county": "Lampasas" + }, + { + "zip_code": 76552, + "latitude": 31.351234, + "longitude": -97.548468, + "city": "Leon Junction", + "state": "TX", + "county": "Coryell" + }, + { + "zip_code": 76554, + "latitude": 30.963007, + "longitude": -97.361597, + "city": "Little River", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76555, + "latitude": 30.784169, + "longitude": -96.96376, + "city": "Maysfield", + "state": "TX", + "county": "Milam" + }, + { + "zip_code": 76556, + "latitude": 30.730427, + "longitude": -96.880743, + "city": "Milano", + "state": "TX", + "county": "Milam" + }, + { + "zip_code": 76557, + "latitude": 31.335232, + "longitude": -97.336265, + "city": "Moody", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76558, + "latitude": 31.351386, + "longitude": -97.644352, + "city": "Mound", + "state": "TX", + "county": "Coryell" + }, + { + "zip_code": 76559, + "latitude": 31.037986, + "longitude": -97.5083, + "city": "Nolanville", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76561, + "latitude": 31.415049, + "longitude": -97.560418, + "city": "Oglesby", + "state": "TX", + "county": "Coryell" + }, + { + "zip_code": 76564, + "latitude": 31.036287, + "longitude": -97.492017, + "city": "Pendleton", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76565, + "latitude": 31.636838, + "longitude": -98.348689, + "city": "Pottsville", + "state": "TX", + "county": "Hamilton" + }, + { + "zip_code": 76566, + "latitude": 31.484144, + "longitude": -97.990338, + "city": "Purmela", + "state": "TX", + "county": "Coryell" + }, + { + "zip_code": 76567, + "latitude": 30.655359, + "longitude": -97.035158, + "city": "Rockdale", + "state": "TX", + "county": "Milam" + }, + { + "zip_code": 76569, + "latitude": 30.948804, + "longitude": -97.225426, + "city": "Rogers", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76570, + "latitude": 31.103376, + "longitude": -96.998652, + "city": "Rosebud", + "state": "TX", + "county": "Falls" + }, + { + "zip_code": 76571, + "latitude": 30.925692, + "longitude": -97.570057, + "city": "Salado", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76573, + "latitude": 30.805512, + "longitude": -97.470456, + "city": "Schwertner", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 76574, + "latitude": 30.581504, + "longitude": -97.393787, + "city": "Taylor", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 76577, + "latitude": 30.613774, + "longitude": -97.205788, + "city": "Thorndale", + "state": "TX", + "county": "Milam" + }, + { + "zip_code": 76578, + "latitude": 30.546326, + "longitude": -97.236259, + "city": "Thrall", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 76579, + "latitude": 31.174847, + "longitude": -97.269835, + "city": "Troy", + "state": "TX", + "county": "Bell" + }, + { + "zip_code": 76596, + "latitude": 31.390196, + "longitude": -97.799309, + "city": "Gatesville", + "state": "TX", + "county": "Coryell" + }, + { + "zip_code": 76597, + "latitude": 31.390196, + "longitude": -97.799309, + "city": "Gatesville", + "state": "TX", + "county": "Coryell" + }, + { + "zip_code": 76598, + "latitude": 31.390196, + "longitude": -97.799309, + "city": "Gatesville", + "state": "TX", + "county": "Coryell" + }, + { + "zip_code": 76599, + "latitude": 31.470598, + "longitude": -97.734728, + "city": "Gatesville", + "state": "TX", + "county": "Coryell" + }, + { + "zip_code": 76621, + "latitude": 31.88454, + "longitude": -97.077218, + "city": "Abbott", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76622, + "latitude": 31.987167, + "longitude": -97.108113, + "city": "Aquilla", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76623, + "latitude": 32.221421, + "longitude": -96.7832, + "city": "Avalon", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 76624, + "latitude": 31.687303, + "longitude": -96.986233, + "city": "Axtell", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76626, + "latitude": 32.10146, + "longitude": -96.733115, + "city": "Blooming Grove", + "state": "TX", + "county": "Navarro" + }, + { + "zip_code": 76627, + "latitude": 32.045004, + "longitude": -97.373528, + "city": "Blum", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76628, + "latitude": 31.987167, + "longitude": -97.108113, + "city": "Brandon", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76629, + "latitude": 31.165947, + "longitude": -96.675985, + "city": "Bremond", + "state": "TX", + "county": "Robertson" + }, + { + "zip_code": 76630, + "latitude": 31.335902, + "longitude": -97.230006, + "city": "Bruceville", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76631, + "latitude": 31.968293, + "longitude": -97.003015, + "city": "Bynum", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76632, + "latitude": 31.303213, + "longitude": -97.039384, + "city": "Chilton", + "state": "TX", + "county": "Falls" + }, + { + "zip_code": 76633, + "latitude": 31.666665, + "longitude": -97.310809, + "city": "China Spring", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76634, + "latitude": 31.791801, + "longitude": -97.520315, + "city": "Clifton", + "state": "TX", + "county": "Bosque" + }, + { + "zip_code": 76635, + "latitude": 31.695145, + "longitude": -96.586919, + "city": "Coolidge", + "state": "TX", + "county": "Limestone" + }, + { + "zip_code": 76636, + "latitude": 32.235057, + "longitude": -97.229962, + "city": "Covington", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76637, + "latitude": 31.897381, + "longitude": -97.64097, + "city": "Cranfills Gap", + "state": "TX", + "county": "Bosque" + }, + { + "zip_code": 76638, + "latitude": 31.565099, + "longitude": -97.43051, + "city": "Crawford", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76639, + "latitude": 31.909682, + "longitude": -96.646518, + "city": "Dawson", + "state": "TX", + "county": "Navarro" + }, + { + "zip_code": 76640, + "latitude": 31.699922, + "longitude": -97.11457, + "city": "Elm Mott", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76641, + "latitude": 32.01253, + "longitude": -96.792321, + "city": "Frost", + "state": "TX", + "county": "Navarro" + }, + { + "zip_code": 76642, + "latitude": 31.473823, + "longitude": -96.543147, + "city": "Groesbeck", + "state": "TX", + "county": "Limestone" + }, + { + "zip_code": 76643, + "latitude": 31.522017, + "longitude": -97.164392, + "city": "Hewitt", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76644, + "latitude": 31.897381, + "longitude": -97.64097, + "city": "Laguna Park", + "state": "TX", + "county": "Bosque" + }, + { + "zip_code": 76645, + "latitude": 31.937903, + "longitude": -97.057661, + "city": "Hillsboro", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76648, + "latitude": 31.905748, + "longitude": -97.079707, + "city": "Hubbard", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76649, + "latitude": 31.984603, + "longitude": -97.870387, + "city": "Iredell", + "state": "TX", + "county": "Bosque" + }, + { + "zip_code": 76650, + "latitude": 31.987167, + "longitude": -97.108113, + "city": "Irene", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76651, + "latitude": 32.189616, + "longitude": -96.873872, + "city": "Italy", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 76652, + "latitude": 31.897381, + "longitude": -97.64097, + "city": "Kopperl", + "state": "TX", + "county": "Bosque" + }, + { + "zip_code": 76653, + "latitude": 31.312973, + "longitude": -96.629121, + "city": "Kosse", + "state": "TX", + "county": "Limestone" + }, + { + "zip_code": 76654, + "latitude": 31.553646, + "longitude": -97.203166, + "city": "Leroy", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76655, + "latitude": 31.527918, + "longitude": -97.16353, + "city": "Lorena", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76656, + "latitude": 31.146313, + "longitude": -97.043397, + "city": "Lott", + "state": "TX", + "county": "Falls" + }, + { + "zip_code": 76657, + "latitude": 31.40352, + "longitude": -97.393924, + "city": "Mc Gregor", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76660, + "latitude": 31.891824, + "longitude": -96.911219, + "city": "Malone", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76661, + "latitude": 31.249621, + "longitude": -96.885602, + "city": "Marlin", + "state": "TX", + "county": "Falls" + }, + { + "zip_code": 76664, + "latitude": 31.554423, + "longitude": -96.871366, + "city": "Mart", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76665, + "latitude": 31.926424, + "longitude": -97.652901, + "city": "Meridian", + "state": "TX", + "county": "Bosque" + }, + { + "zip_code": 76666, + "latitude": 32.058486, + "longitude": -96.893871, + "city": "Mertens", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76667, + "latitude": 31.674789, + "longitude": -96.52153, + "city": "Mexia", + "state": "TX", + "county": "Limestone" + }, + { + "zip_code": 76670, + "latitude": 32.150961, + "longitude": -96.981584, + "city": "Milford", + "state": "TX", + "county": "Ellis" + }, + { + "zip_code": 76671, + "latitude": 32.0068, + "longitude": -97.634243, + "city": "Morgan", + "state": "TX", + "county": "Bosque" + }, + { + "zip_code": 76673, + "latitude": 31.755973, + "longitude": -96.882676, + "city": "Mount Calm", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76675, + "latitude": 31.254242, + "longitude": -96.937574, + "city": "Otto", + "state": "TX", + "county": "Falls" + }, + { + "zip_code": 76676, + "latitude": 31.859638, + "longitude": -96.926944, + "city": "Penelope", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76677, + "latitude": 31.254242, + "longitude": -96.937574, + "city": "Perry", + "state": "TX", + "county": "Falls" + }, + { + "zip_code": 76678, + "latitude": 31.517893, + "longitude": -96.584425, + "city": "Prairie Hill", + "state": "TX", + "county": "Limestone" + }, + { + "zip_code": 76679, + "latitude": 31.931282, + "longitude": -96.604622, + "city": "Purdon", + "state": "TX", + "county": "Navarro" + }, + { + "zip_code": 76680, + "latitude": 31.254242, + "longitude": -96.937574, + "city": "Reagan", + "state": "TX", + "county": "Falls" + }, + { + "zip_code": 76681, + "latitude": 31.905199, + "longitude": -96.388082, + "city": "Richland", + "state": "TX", + "county": "Navarro" + }, + { + "zip_code": 76682, + "latitude": 31.48862, + "longitude": -96.944644, + "city": "Riesel", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76684, + "latitude": 31.717293, + "longitude": -97.118754, + "city": "Ross", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76685, + "latitude": 31.371525, + "longitude": -97.076732, + "city": "Satin", + "state": "TX", + "county": "Falls" + }, + { + "zip_code": 76686, + "latitude": 31.750384, + "longitude": -96.541589, + "city": "Tehuacana", + "state": "TX", + "county": "Limestone" + }, + { + "zip_code": 76687, + "latitude": 31.409873, + "longitude": -96.57281, + "city": "Thornton", + "state": "TX", + "county": "Limestone" + }, + { + "zip_code": 76689, + "latitude": 31.657441, + "longitude": -97.471686, + "city": "Valley Mills", + "state": "TX", + "county": "Bosque" + }, + { + "zip_code": 76690, + "latitude": 32.043524, + "longitude": -97.750239, + "city": "Walnut Springs", + "state": "TX", + "county": "Bosque" + }, + { + "zip_code": 76691, + "latitude": 31.759903, + "longitude": -97.102936, + "city": "West", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76692, + "latitude": 31.971321, + "longitude": -97.346289, + "city": "Whitney", + "state": "TX", + "county": "Hill" + }, + { + "zip_code": 76693, + "latitude": 31.76936, + "longitude": -96.391904, + "city": "Wortham", + "state": "TX", + "county": "Freestone" + }, + { + "zip_code": 76701, + "latitude": 31.551566, + "longitude": -97.15508, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76702, + "latitude": 31.547516, + "longitude": -97.14433, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76703, + "latitude": 31.553646, + "longitude": -97.203166, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76704, + "latitude": 31.554918, + "longitude": -97.133007, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76705, + "latitude": 31.640315, + "longitude": -97.096306, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76706, + "latitude": 31.47441, + "longitude": -97.112326, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76707, + "latitude": 31.516366, + "longitude": -97.160281, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76708, + "latitude": 31.639896, + "longitude": -97.266208, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76710, + "latitude": 31.51156, + "longitude": -97.186682, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76711, + "latitude": 31.517516, + "longitude": -97.15473, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76712, + "latitude": 31.539194, + "longitude": -97.265089, + "city": "Woodway", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76714, + "latitude": 31.553646, + "longitude": -97.203166, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76715, + "latitude": 31.553646, + "longitude": -97.203166, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76716, + "latitude": 31.553646, + "longitude": -97.203166, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76795, + "latitude": 31.553646, + "longitude": -97.203166, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76797, + "latitude": 31.553646, + "longitude": -97.203166, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76798, + "latitude": 31.553646, + "longitude": -97.203166, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76799, + "latitude": 31.541116, + "longitude": -97.16148, + "city": "Waco", + "state": "TX", + "county": "Mclennan" + }, + { + "zip_code": 76801, + "latitude": 31.775393, + "longitude": -98.99153, + "city": "Brownwood", + "state": "TX", + "county": "Brown" + }, + { + "zip_code": 76802, + "latitude": 31.787392, + "longitude": -98.922858, + "city": "Early", + "state": "TX", + "county": "Brown" + }, + { + "zip_code": 76803, + "latitude": 31.763882, + "longitude": -98.936021, + "city": "Brownwood", + "state": "TX", + "county": "Brown" + }, + { + "zip_code": 76804, + "latitude": 31.77419, + "longitude": -99.09213, + "city": "Brownwood", + "state": "TX", + "county": "Brown" + }, + { + "zip_code": 76820, + "latitude": 30.720372, + "longitude": -99.100089, + "city": "Art", + "state": "TX", + "county": "Mason" + }, + { + "zip_code": 76821, + "latitude": 31.770615, + "longitude": -99.911547, + "city": "Ballinger", + "state": "TX", + "county": "Runnels" + }, + { + "zip_code": 76823, + "latitude": 31.758771, + "longitude": -99.038558, + "city": "Bangs", + "state": "TX", + "county": "Brown" + }, + { + "zip_code": 76824, + "latitude": 31.246571, + "longitude": -98.238344, + "city": "Bend", + "state": "TX", + "county": "Lampasas" + }, + { + "zip_code": 76825, + "latitude": 31.150939, + "longitude": -99.337237, + "city": "Brady", + "state": "TX", + "county": "Mcculloch" + }, + { + "zip_code": 76827, + "latitude": 31.547322, + "longitude": -99.091825, + "city": "Brookesmith", + "state": "TX", + "county": "Brown" + }, + { + "zip_code": 76828, + "latitude": 31.745879, + "longitude": -99.458967, + "city": "Burkett", + "state": "TX", + "county": "Coleman" + }, + { + "zip_code": 76831, + "latitude": 30.70395, + "longitude": -98.657239, + "city": "Castell", + "state": "TX", + "county": "Llano" + }, + { + "zip_code": 76832, + "latitude": 30.965073, + "longitude": -98.710661, + "city": "Cherokee", + "state": "TX", + "county": "San Saba" + }, + { + "zip_code": 76834, + "latitude": 31.896653, + "longitude": -99.400197, + "city": "Coleman", + "state": "TX", + "county": "Coleman" + }, + { + "zip_code": 76836, + "latitude": 31.217152, + "longitude": -99.347156, + "city": "Doole", + "state": "TX", + "county": "Mcculloch" + }, + { + "zip_code": 76837, + "latitude": 31.174061, + "longitude": -99.876368, + "city": "Eden", + "state": "TX", + "county": "Concho" + }, + { + "zip_code": 76841, + "latitude": 30.931395, + "longitude": -99.827483, + "city": "Fort Mc Kavett", + "state": "TX", + "county": "Menard" + }, + { + "zip_code": 76842, + "latitude": 30.719628, + "longitude": -99.224184, + "city": "Fredonia", + "state": "TX", + "county": "Mason" + }, + { + "zip_code": 76844, + "latitude": 31.447214, + "longitude": -98.458794, + "city": "Goldthwaite", + "state": "TX", + "county": "Mills" + }, + { + "zip_code": 76845, + "latitude": 31.528604, + "longitude": -99.546975, + "city": "Gouldbusk", + "state": "TX", + "county": "Coleman" + }, + { + "zip_code": 76848, + "latitude": 30.89918, + "longitude": -99.80024, + "city": "Hext", + "state": "TX", + "county": "Menard" + }, + { + "zip_code": 76849, + "latitude": 30.49687, + "longitude": -99.776055, + "city": "Junction", + "state": "TX", + "county": "Kimble" + }, + { + "zip_code": 76852, + "latitude": 31.217152, + "longitude": -99.347156, + "city": "Lohn", + "state": "TX", + "county": "Mcculloch" + }, + { + "zip_code": 76853, + "latitude": 31.218283, + "longitude": -98.394921, + "city": "Lometa", + "state": "TX", + "county": "Lampasas" + }, + { + "zip_code": 76854, + "latitude": 30.498845, + "longitude": -99.709428, + "city": "London", + "state": "TX", + "county": "Kimble" + }, + { + "zip_code": 76855, + "latitude": 31.333614, + "longitude": -99.85837, + "city": "Lowake", + "state": "TX", + "county": "Concho" + }, + { + "zip_code": 76856, + "latitude": 30.752875, + "longitude": -99.142096, + "city": "Mason", + "state": "TX", + "county": "Mason" + }, + { + "zip_code": 76857, + "latitude": 31.951238, + "longitude": -98.927189, + "city": "May", + "state": "TX", + "county": "Brown" + }, + { + "zip_code": 76858, + "latitude": 31.217152, + "longitude": -99.347156, + "city": "Melvin", + "state": "TX", + "county": "Mcculloch" + }, + { + "zip_code": 76859, + "latitude": 30.918307, + "longitude": -99.78049, + "city": "Menard", + "state": "TX", + "county": "Menard" + }, + { + "zip_code": 76861, + "latitude": 31.680297, + "longitude": -100.147719, + "city": "Miles", + "state": "TX", + "county": "Runnels" + }, + { + "zip_code": 76862, + "latitude": 31.535046, + "longitude": -99.710871, + "city": "Millersview", + "state": "TX", + "county": "Concho" + }, + { + "zip_code": 76864, + "latitude": 31.551904, + "longitude": -98.639178, + "city": "Mullin", + "state": "TX", + "county": "Mills" + }, + { + "zip_code": 76865, + "latitude": 31.869872, + "longitude": -100.163871, + "city": "Norton", + "state": "TX", + "county": "Runnels" + }, + { + "zip_code": 76866, + "latitude": 31.462315, + "longitude": -100.014384, + "city": "Paint Rock", + "state": "TX", + "county": "Concho" + }, + { + "zip_code": 76867, + "latitude": 31.217152, + "longitude": -99.347156, + "city": "Pear Valley", + "state": "TX", + "county": "Mcculloch" + }, + { + "zip_code": 76869, + "latitude": 30.719628, + "longitude": -99.224184, + "city": "Pontotoc", + "state": "TX", + "county": "Mason" + }, + { + "zip_code": 76870, + "latitude": 31.477095, + "longitude": -98.630919, + "city": "Priddy", + "state": "TX", + "county": "Mills" + }, + { + "zip_code": 76871, + "latitude": 31.300297, + "longitude": -98.912791, + "city": "Richland Springs", + "state": "TX", + "county": "San Saba" + }, + { + "zip_code": 76872, + "latitude": 31.217152, + "longitude": -99.347156, + "city": "Rochelle", + "state": "TX", + "county": "Mcculloch" + }, + { + "zip_code": 76873, + "latitude": 31.745879, + "longitude": -99.458967, + "city": "Rockwood", + "state": "TX", + "county": "Coleman" + }, + { + "zip_code": 76874, + "latitude": 30.498845, + "longitude": -99.709428, + "city": "Roosevelt", + "state": "TX", + "county": "Kimble" + }, + { + "zip_code": 76875, + "latitude": 31.668401, + "longitude": -100.047062, + "city": "Rowena", + "state": "TX", + "county": "Runnels" + }, + { + "zip_code": 76877, + "latitude": 31.212412, + "longitude": -98.723024, + "city": "San Saba", + "state": "TX", + "county": "San Saba" + }, + { + "zip_code": 76878, + "latitude": 31.737608, + "longitude": -99.326291, + "city": "Santa Anna", + "state": "TX", + "county": "Coleman" + }, + { + "zip_code": 76880, + "latitude": 31.477095, + "longitude": -98.630919, + "city": "Star", + "state": "TX", + "county": "Mills" + }, + { + "zip_code": 76882, + "latitude": 31.78326, + "longitude": -99.631855, + "city": "Talpa", + "state": "TX", + "county": "Coleman" + }, + { + "zip_code": 76883, + "latitude": 29.956952, + "longitude": -100.227509, + "city": "Telegraph", + "state": "TX", + "county": "Edwards" + }, + { + "zip_code": 76884, + "latitude": 31.745879, + "longitude": -99.458967, + "city": "Valera", + "state": "TX", + "county": "Coleman" + }, + { + "zip_code": 76885, + "latitude": 30.70395, + "longitude": -98.657239, + "city": "Valley Spring", + "state": "TX", + "county": "Llano" + }, + { + "zip_code": 76886, + "latitude": 31.349348, + "longitude": -100.494912, + "city": "Veribest", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76887, + "latitude": 31.217152, + "longitude": -99.347156, + "city": "Voca", + "state": "TX", + "county": "Mcculloch" + }, + { + "zip_code": 76888, + "latitude": 31.745879, + "longitude": -99.458967, + "city": "Voss", + "state": "TX", + "county": "Coleman" + }, + { + "zip_code": 76890, + "latitude": 31.692764, + "longitude": -98.80701, + "city": "Zephyr", + "state": "TX", + "county": "Brown" + }, + { + "zip_code": 76901, + "latitude": 31.44451, + "longitude": -100.533397, + "city": "San Angelo", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76902, + "latitude": 31.39577, + "longitude": -100.68959, + "city": "San Angelo", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76903, + "latitude": 31.505333, + "longitude": -100.301959, + "city": "San Angelo", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76904, + "latitude": 31.342589, + "longitude": -100.443556, + "city": "San Angelo", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76905, + "latitude": 31.441909, + "longitude": -100.301587, + "city": "San Angelo", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76906, + "latitude": 31.372754, + "longitude": -100.495114, + "city": "San Angelo", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76908, + "latitude": 31.39577, + "longitude": -100.68959, + "city": "Goodfellow Afb", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76909, + "latitude": 31.39577, + "longitude": -100.68959, + "city": "San Angelo", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76930, + "latitude": 31.143346, + "longitude": -101.126017, + "city": "Barnhart", + "state": "TX", + "county": "Irion" + }, + { + "zip_code": 76932, + "latitude": 31.417011, + "longitude": -101.5423, + "city": "Big Lake", + "state": "TX", + "county": "Reagan" + }, + { + "zip_code": 76933, + "latitude": 31.854544, + "longitude": -100.343161, + "city": "Bronte", + "state": "TX", + "county": "Coke" + }, + { + "zip_code": 76934, + "latitude": 31.626621, + "longitude": -100.669391, + "city": "Carlsbad", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76935, + "latitude": 31.188841, + "longitude": -100.544674, + "city": "Christoval", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76936, + "latitude": 30.912773, + "longitude": -100.676722, + "city": "Eldorado", + "state": "TX", + "county": "Schleicher" + }, + { + "zip_code": 76937, + "latitude": 31.361745, + "longitude": -100.092229, + "city": "Eola", + "state": "TX", + "county": "Concho" + }, + { + "zip_code": 76939, + "latitude": 31.250101, + "longitude": -100.592015, + "city": "Knickerbocker", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76940, + "latitude": 31.480347, + "longitude": -100.143724, + "city": "Mereta", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76941, + "latitude": 31.347682, + "longitude": -100.874701, + "city": "Mertzon", + "state": "TX", + "county": "Irion" + }, + { + "zip_code": 76943, + "latitude": 30.798496, + "longitude": -101.498604, + "city": "Ozona", + "state": "TX", + "county": "Crockett" + }, + { + "zip_code": 76945, + "latitude": 31.911149, + "longitude": -100.487299, + "city": "Robert Lee", + "state": "TX", + "county": "Coke" + }, + { + "zip_code": 76949, + "latitude": 31.889601, + "longitude": -100.530253, + "city": "Silver", + "state": "TX", + "county": "Coke" + }, + { + "zip_code": 76950, + "latitude": 30.579386, + "longitude": -100.671422, + "city": "Sonora", + "state": "TX", + "county": "Sutton" + }, + { + "zip_code": 76951, + "latitude": 31.882997, + "longitude": -101.030277, + "city": "Sterling City", + "state": "TX", + "county": "Sterling" + }, + { + "zip_code": 76953, + "latitude": 31.739714, + "longitude": -100.288365, + "city": "Tennyson", + "state": "TX", + "county": "Coke" + }, + { + "zip_code": 76955, + "latitude": 31.32795, + "longitude": -100.154738, + "city": "Vancourt", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76957, + "latitude": 31.359844, + "longitude": -100.206705, + "city": "Wall", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 76958, + "latitude": 31.635184, + "longitude": -100.658982, + "city": "Water Valley", + "state": "TX", + "county": "Tom Green" + }, + { + "zip_code": 77001, + "latitude": 29.813142, + "longitude": -95.309789, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77002, + "latitude": 29.807651, + "longitude": -95.391447, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77003, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77004, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77005, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77006, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77007, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77008, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77009, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77010, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77011, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77012, + "latitude": 29.711528, + "longitude": -95.251662, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77013, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77014, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77015, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77016, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77017, + "latitude": 29.679879, + "longitude": -95.257113, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77018, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77019, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77020, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77021, + "latitude": 29.67843, + "longitude": -95.373966, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77022, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77023, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77024, + "latitude": 29.824899, + "longitude": -95.421967, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77025, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77026, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77027, + "latitude": 29.688374, + "longitude": -95.303129, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77028, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77029, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77030, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77031, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77032, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77033, + "latitude": 29.66868, + "longitude": -95.337865, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77034, + "latitude": 29.61903, + "longitude": -95.197354, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77035, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77036, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77037, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77038, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77039, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77040, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77041, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77042, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77043, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77044, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77045, + "latitude": 29.642031, + "longitude": -95.403617, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77046, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77047, + "latitude": 29.614782, + "longitude": -95.387721, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77048, + "latitude": 29.625781, + "longitude": -95.340665, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77049, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77050, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77051, + "latitude": 29.65833, + "longitude": -95.381407, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77052, + "latitude": 29.676829, + "longitude": -95.177587, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77053, + "latitude": 29.600732, + "longitude": -95.424818, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77054, + "latitude": 29.67543, + "longitude": -95.391466, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77055, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77056, + "latitude": 29.698579, + "longitude": -95.207161, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77057, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77058, + "latitude": 29.571604, + "longitude": -95.099828, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77059, + "latitude": 29.576505, + "longitude": -95.120937, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77060, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77061, + "latitude": 29.65688, + "longitude": -95.28316, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77062, + "latitude": 29.571478, + "longitude": -95.131719, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77063, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77064, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77065, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77066, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77067, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77068, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77069, + "latitude": 29.781938, + "longitude": -95.335551, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77070, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77071, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77072, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77073, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77074, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77075, + "latitude": 29.623734, + "longitude": -95.262863, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77076, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77077, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77078, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77079, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77080, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77081, + "latitude": 29.68193, + "longitude": -95.306914, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77082, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77083, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77084, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77085, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77086, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77087, + "latitude": 29.676829, + "longitude": -95.297913, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77088, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77089, + "latitude": 29.58949, + "longitude": -95.235712, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77090, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77091, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77092, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77093, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77094, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77095, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77096, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77097, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77098, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77099, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77201, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77202, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77203, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77204, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77205, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77206, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77207, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77208, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77209, + "latitude": 29.612816, + "longitude": -95.158517, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77210, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77212, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77213, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77215, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77216, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77217, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77218, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77219, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77220, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77221, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77222, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77223, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77224, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77225, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77226, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77227, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77228, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77229, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77230, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77231, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77233, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77234, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77235, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77236, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77237, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77238, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77240, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77241, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77242, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77243, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77244, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77245, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77248, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77249, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77251, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77252, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77253, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77254, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77255, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77256, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77257, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77258, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77259, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77261, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77262, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77263, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77265, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77266, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77267, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77268, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77269, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77270, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77271, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77272, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77273, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77274, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77275, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77277, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77279, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77280, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77281, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77282, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77284, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77287, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77288, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77289, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77290, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77291, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77292, + "latitude": 29.744341, + "longitude": -95.332598, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77293, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77297, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77298, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77299, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77301, + "latitude": 30.310041, + "longitude": -95.51232, + "city": "Conroe", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77302, + "latitude": 30.223802, + "longitude": -95.357716, + "city": "Conroe", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77303, + "latitude": 30.334581, + "longitude": -95.480387, + "city": "Conroe", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77304, + "latitude": 30.276638, + "longitude": -95.444823, + "city": "Conroe", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77305, + "latitude": 30.290638, + "longitude": -95.383202, + "city": "Conroe", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77306, + "latitude": 30.227669, + "longitude": -95.285136, + "city": "Conroe", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77315, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "North Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77316, + "latitude": 30.358652, + "longitude": -95.685746, + "city": "Montgomery", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77318, + "latitude": 30.43794, + "longitude": -95.490719, + "city": "Willis", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77320, + "latitude": 30.846986, + "longitude": -95.597029, + "city": "Huntsville", + "state": "TX", + "county": "Walker" + }, + { + "zip_code": 77325, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Humble", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77326, + "latitude": 30.520924, + "longitude": -94.822101, + "city": "Ace", + "state": "TX", + "county": "Polk" + }, + { + "zip_code": 77327, + "latitude": 30.343114, + "longitude": -94.978471, + "city": "Cleveland", + "state": "TX", + "county": "Liberty" + }, + { + "zip_code": 77328, + "latitude": 30.188885, + "longitude": -94.804065, + "city": "Cleveland", + "state": "TX", + "county": "Liberty" + }, + { + "zip_code": 77331, + "latitude": 30.588554, + "longitude": -95.111278, + "city": "Coldspring", + "state": "TX", + "county": "San Jacinto" + }, + { + "zip_code": 77332, + "latitude": 30.817866, + "longitude": -94.869052, + "city": "Dallardsville", + "state": "TX", + "county": "Polk" + }, + { + "zip_code": 77333, + "latitude": 30.374064, + "longitude": -95.79387, + "city": "Dobbin", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77334, + "latitude": 30.77197, + "longitude": -95.383817, + "city": "Dodge", + "state": "TX", + "county": "Walker" + }, + { + "zip_code": 77335, + "latitude": 30.594279, + "longitude": -94.904791, + "city": "Goodrich", + "state": "TX", + "county": "Polk" + }, + { + "zip_code": 77336, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Huffman", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77337, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Hufsmith", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77338, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Humble", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77339, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Humble", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77340, + "latitude": 30.644755, + "longitude": -95.579836, + "city": "Huntsville", + "state": "TX", + "county": "Walker" + }, + { + "zip_code": 77341, + "latitude": 30.78128, + "longitude": -95.59527, + "city": "Huntsville", + "state": "TX", + "county": "Walker" + }, + { + "zip_code": 77342, + "latitude": 30.78128, + "longitude": -95.59527, + "city": "Huntsville", + "state": "TX", + "county": "Walker" + }, + { + "zip_code": 77343, + "latitude": 30.78128, + "longitude": -95.59527, + "city": "Huntsville", + "state": "TX", + "county": "Walker" + }, + { + "zip_code": 77344, + "latitude": 30.78128, + "longitude": -95.59527, + "city": "Huntsville", + "state": "TX", + "county": "Walker" + }, + { + "zip_code": 77345, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Humble", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77346, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Humble", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77347, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Humble", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77348, + "latitude": 30.78128, + "longitude": -95.59527, + "city": "Huntsville", + "state": "TX", + "county": "Walker" + }, + { + "zip_code": 77349, + "latitude": 30.78128, + "longitude": -95.59527, + "city": "Huntsville", + "state": "TX", + "county": "Walker" + }, + { + "zip_code": 77350, + "latitude": 30.856814, + "longitude": -94.856052, + "city": "Leggett", + "state": "TX", + "county": "Polk" + }, + { + "zip_code": 77351, + "latitude": 30.682947, + "longitude": -94.897605, + "city": "Livingston", + "state": "TX", + "county": "Polk" + }, + { + "zip_code": 77353, + "latitude": 30.180626, + "longitude": -95.70925, + "city": "Magnolia", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77354, + "latitude": 30.233328, + "longitude": -95.550188, + "city": "Magnolia", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77355, + "latitude": 30.182467, + "longitude": -95.679174, + "city": "Magnolia", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77356, + "latitude": 30.354902, + "longitude": -95.49833, + "city": "Montgomery", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77357, + "latitude": 30.27931, + "longitude": -95.436337, + "city": "New Caney", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77358, + "latitude": 30.550542, + "longitude": -95.466582, + "city": "New Waverly", + "state": "TX", + "county": "Walker" + }, + { + "zip_code": 77359, + "latitude": 30.674933, + "longitude": -95.290469, + "city": "Oakhurst", + "state": "TX", + "county": "San Jacinto" + }, + { + "zip_code": 77360, + "latitude": 30.822525, + "longitude": -95.105581, + "city": "Onalaska", + "state": "TX", + "county": "Polk" + }, + { + "zip_code": 77362, + "latitude": 30.179187, + "longitude": -95.692288, + "city": "Pinehurst", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77363, + "latitude": 30.288721, + "longitude": -95.856892, + "city": "Plantersville", + "state": "TX", + "county": "Grimes" + }, + { + "zip_code": 77364, + "latitude": 30.755812, + "longitude": -95.218676, + "city": "Pointblank", + "state": "TX", + "county": "San Jacinto" + }, + { + "zip_code": 77365, + "latitude": 30.21308, + "longitude": -95.400036, + "city": "Porter", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77367, + "latitude": 30.847563, + "longitude": -95.390439, + "city": "Riverside", + "state": "TX", + "county": "Walker" + }, + { + "zip_code": 77368, + "latitude": 30.188885, + "longitude": -94.804065, + "city": "Romayor", + "state": "TX", + "county": "Liberty" + }, + { + "zip_code": 77369, + "latitude": 30.188885, + "longitude": -94.804065, + "city": "Rye", + "state": "TX", + "county": "Liberty" + }, + { + "zip_code": 77371, + "latitude": 30.632802, + "longitude": -95.085922, + "city": "Shepherd", + "state": "TX", + "county": "San Jacinto" + }, + { + "zip_code": 77372, + "latitude": 30.255457, + "longitude": -95.183281, + "city": "Splendora", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77373, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Spring", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77374, + "latitude": 30.312185, + "longitude": -94.401843, + "city": "Thicket", + "state": "TX", + "county": "Hardin" + }, + { + "zip_code": 77375, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Tomball", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77376, + "latitude": 30.426417, + "longitude": -94.652109, + "city": "Votaw", + "state": "TX", + "county": "Hardin" + }, + { + "zip_code": 77377, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Tomball", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77378, + "latitude": 30.444115, + "longitude": -95.450554, + "city": "Willis", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77379, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Spring", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77380, + "latitude": 30.144112, + "longitude": -95.470336, + "city": "Spring", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77381, + "latitude": 30.171573, + "longitude": -95.498497, + "city": "Spring", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77382, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Spring", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77383, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Spring", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77384, + "latitude": 30.225997, + "longitude": -95.499935, + "city": "Conroe", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77385, + "latitude": 30.191153, + "longitude": -95.419023, + "city": "Conroe", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77386, + "latitude": 30.124558, + "longitude": -95.401815, + "city": "Spring", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77387, + "latitude": 30.378446, + "longitude": -95.557004, + "city": "Spring", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77388, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Spring", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77389, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Spring", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77391, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Spring", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77393, + "latitude": 30.329016, + "longitude": -95.463474, + "city": "Spring", + "state": "TX", + "county": "Montgomery" + }, + { + "zip_code": 77396, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Humble", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77399, + "latitude": 30.817866, + "longitude": -94.869052, + "city": "Livingston", + "state": "TX", + "county": "Polk" + }, + { + "zip_code": 77401, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Bellaire", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77402, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Bellaire", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77404, + "latitude": 28.798156, + "longitude": -95.651058, + "city": "Bay City", + "state": "TX", + "county": "Matagorda" + }, + { + "zip_code": 77406, + "latitude": 29.50401, + "longitude": -95.919107, + "city": "Richmond", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77410, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Cypress", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77411, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Alief", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77412, + "latitude": 29.60466, + "longitude": -96.524899, + "city": "Altair", + "state": "TX", + "county": "Colorado" + }, + { + "zip_code": 77413, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Barker", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77414, + "latitude": 28.86362, + "longitude": -95.917347, + "city": "Bay City", + "state": "TX", + "county": "Matagorda" + }, + { + "zip_code": 77415, + "latitude": 28.815437, + "longitude": -95.846061, + "city": "Cedar Lane", + "state": "TX", + "county": "Matagorda" + }, + { + "zip_code": 77417, + "latitude": 29.482797, + "longitude": -95.974399, + "city": "Beasley", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77418, + "latitude": 29.864772, + "longitude": -96.321766, + "city": "Bellville", + "state": "TX", + "county": "Austin" + }, + { + "zip_code": 77419, + "latitude": 28.754719, + "longitude": -95.945896, + "city": "Blessing", + "state": "TX", + "county": "Matagorda" + }, + { + "zip_code": 77420, + "latitude": 29.240304, + "longitude": -95.954627, + "city": "Boling", + "state": "TX", + "county": "Wharton" + }, + { + "zip_code": 77422, + "latitude": 28.995948, + "longitude": -95.520413, + "city": "Brazoria", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77423, + "latitude": 29.85915, + "longitude": -95.98022, + "city": "Brookshire", + "state": "TX", + "county": "Waller" + }, + { + "zip_code": 77426, + "latitude": 30.156759, + "longitude": -96.278602, + "city": "Chappell Hill", + "state": "TX", + "county": "Washington" + }, + { + "zip_code": 77428, + "latitude": 28.754719, + "longitude": -95.945896, + "city": "Collegeport", + "state": "TX", + "county": "Matagorda" + }, + { + "zip_code": 77429, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Cypress", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77430, + "latitude": 29.235317, + "longitude": -95.677475, + "city": "Damon", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77431, + "latitude": 29.173701, + "longitude": -95.820719, + "city": "Danciger", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77432, + "latitude": 29.298532, + "longitude": -96.241147, + "city": "Danevang", + "state": "TX", + "county": "Wharton" + }, + { + "zip_code": 77433, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Cypress", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77434, + "latitude": 29.590148, + "longitude": -96.35207, + "city": "Eagle Lake", + "state": "TX", + "county": "Colorado" + }, + { + "zip_code": 77435, + "latitude": 29.484089, + "longitude": -96.093732, + "city": "East Bernard", + "state": "TX", + "county": "Wharton" + }, + { + "zip_code": 77436, + "latitude": 29.375762, + "longitude": -96.227967, + "city": "Egypt", + "state": "TX", + "county": "Wharton" + }, + { + "zip_code": 77437, + "latitude": 29.322527, + "longitude": -96.234361, + "city": "El Campo", + "state": "TX", + "county": "Wharton" + }, + { + "zip_code": 77440, + "latitude": 28.754719, + "longitude": -95.945896, + "city": "Elmaton", + "state": "TX", + "county": "Matagorda" + }, + { + "zip_code": 77441, + "latitude": 29.688985, + "longitude": -95.935279, + "city": "Fulshear", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77442, + "latitude": 29.447899, + "longitude": -96.397296, + "city": "Garwood", + "state": "TX", + "county": "Colorado" + }, + { + "zip_code": 77443, + "latitude": 29.335331, + "longitude": -96.175363, + "city": "Glen Flora", + "state": "TX", + "county": "Wharton" + }, + { + "zip_code": 77444, + "latitude": 29.349957, + "longitude": -95.77215, + "city": "Guy", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77445, + "latitude": 30.02851, + "longitude": -96.02782, + "city": "Hempstead", + "state": "TX", + "county": "Waller" + }, + { + "zip_code": 77446, + "latitude": 30.082135, + "longitude": -96.013596, + "city": "Prairie View", + "state": "TX", + "county": "Waller" + }, + { + "zip_code": 77447, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Hockley", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77448, + "latitude": 29.413676, + "longitude": -96.092868, + "city": "Hungerford", + "state": "TX", + "county": "Wharton" + }, + { + "zip_code": 77449, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Katy", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77450, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Katy", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77451, + "latitude": 29.466642, + "longitude": -95.994475, + "city": "Kendleton", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77452, + "latitude": 29.849283, + "longitude": -96.313271, + "city": "Kenney", + "state": "TX", + "county": "Austin" + }, + { + "zip_code": 77453, + "latitude": 29.170387, + "longitude": -96.014159, + "city": "Lane City", + "state": "TX", + "county": "Wharton" + }, + { + "zip_code": 77454, + "latitude": 29.298532, + "longitude": -96.241147, + "city": "Lissie", + "state": "TX", + "county": "Wharton" + }, + { + "zip_code": 77455, + "latitude": 29.113458, + "longitude": -96.408664, + "city": "Louise", + "state": "TX", + "county": "Wharton" + }, + { + "zip_code": 77456, + "latitude": 28.962723, + "longitude": -96.068212, + "city": "Markham", + "state": "TX", + "county": "Matagorda" + }, + { + "zip_code": 77457, + "latitude": 28.649645, + "longitude": -95.962269, + "city": "Matagorda", + "state": "TX", + "county": "Matagorda" + }, + { + "zip_code": 77458, + "latitude": 28.941283, + "longitude": -96.217884, + "city": "Midfield", + "state": "TX", + "county": "Matagorda" + }, + { + "zip_code": 77459, + "latitude": 29.323965, + "longitude": -95.649939, + "city": "Missouri City", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77460, + "latitude": 29.60466, + "longitude": -96.524899, + "city": "Nada", + "state": "TX", + "county": "Colorado" + }, + { + "zip_code": 77461, + "latitude": 29.423517, + "longitude": -95.771651, + "city": "Needville", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77462, + "latitude": 29.298532, + "longitude": -96.241147, + "city": "Newgulf", + "state": "TX", + "county": "Wharton" + }, + { + "zip_code": 77463, + "latitude": 29.130819, + "longitude": -95.791554, + "city": "Old Ocean", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77464, + "latitude": 29.503446, + "longitude": -95.904066, + "city": "Orchard", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77465, + "latitude": 28.934196, + "longitude": -96.075063, + "city": "Palacios", + "state": "TX", + "county": "Matagorda" + }, + { + "zip_code": 77466, + "latitude": 29.817257, + "longitude": -96.007261, + "city": "Pattison", + "state": "TX", + "county": "Waller" + }, + { + "zip_code": 77467, + "latitude": 29.298532, + "longitude": -96.241147, + "city": "Pierce", + "state": "TX", + "county": "Wharton" + }, + { + "zip_code": 77468, + "latitude": 28.949429, + "longitude": -96.052347, + "city": "Pledger", + "state": "TX", + "county": "Matagorda" + }, + { + "zip_code": 77469, + "latitude": 29.555831, + "longitude": -95.788479, + "city": "Richmond", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77470, + "latitude": 29.60466, + "longitude": -96.524899, + "city": "Rock Island", + "state": "TX", + "county": "Colorado" + }, + { + "zip_code": 77471, + "latitude": 29.555889, + "longitude": -95.858475, + "city": "Rosenberg", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77473, + "latitude": 29.792014, + "longitude": -96.097261, + "city": "San Felipe", + "state": "TX", + "county": "Austin" + }, + { + "zip_code": 77474, + "latitude": 29.845826, + "longitude": -96.317806, + "city": "Sealy", + "state": "TX", + "county": "Austin" + }, + { + "zip_code": 77475, + "latitude": 29.60466, + "longitude": -96.524899, + "city": "Sheridan", + "state": "TX", + "county": "Colorado" + }, + { + "zip_code": 77476, + "latitude": 29.667486, + "longitude": -95.965953, + "city": "Simonton", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77477, + "latitude": 29.450518, + "longitude": -95.996865, + "city": "Stafford", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77478, + "latitude": 29.525461, + "longitude": -95.756462, + "city": "Sugar Land", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77479, + "latitude": 29.552921, + "longitude": -95.666778, + "city": "Sugar Land", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77480, + "latitude": 29.100012, + "longitude": -95.744623, + "city": "Sweeny", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77481, + "latitude": 29.489921, + "longitude": -95.594174, + "city": "Thompsons", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77482, + "latitude": 29.015988, + "longitude": -95.890495, + "city": "Van Vleck", + "state": "TX", + "county": "Matagorda" + }, + { + "zip_code": 77483, + "latitude": 28.754719, + "longitude": -95.945896, + "city": "Wadsworth", + "state": "TX", + "county": "Matagorda" + }, + { + "zip_code": 77484, + "latitude": 30.087937, + "longitude": -95.948512, + "city": "Waller", + "state": "TX", + "county": "Waller" + }, + { + "zip_code": 77485, + "latitude": 29.789915, + "longitude": -96.279263, + "city": "Wallis", + "state": "TX", + "county": "Austin" + }, + { + "zip_code": 77486, + "latitude": 29.122892, + "longitude": -95.684009, + "city": "West Columbia", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77487, + "latitude": 29.525461, + "longitude": -95.756462, + "city": "Sugar Land", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77488, + "latitude": 29.323344, + "longitude": -96.091123, + "city": "Wharton", + "state": "TX", + "county": "Wharton" + }, + { + "zip_code": 77489, + "latitude": 29.525461, + "longitude": -95.756462, + "city": "Missouri City", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77491, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Katy", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77492, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Katy", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77493, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Katy", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77494, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Katy", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77496, + "latitude": 29.525461, + "longitude": -95.756462, + "city": "Sugar Land", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77497, + "latitude": 29.525461, + "longitude": -95.756462, + "city": "Stafford", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77501, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Pasadena", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77502, + "latitude": 29.678179, + "longitude": -95.202911, + "city": "Pasadena", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77503, + "latitude": 29.65955, + "longitude": -95.169129, + "city": "Pasadena", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77504, + "latitude": 29.645312, + "longitude": -95.176291, + "city": "Pasadena", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77505, + "latitude": 29.648731, + "longitude": -95.143911, + "city": "Pasadena", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77506, + "latitude": 29.714385, + "longitude": -95.200011, + "city": "Pasadena", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77507, + "latitude": 29.622436, + "longitude": -95.054456, + "city": "Pasadena", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77508, + "latitude": 29.569927, + "longitude": -95.106637, + "city": "Pasadena", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77510, + "latitude": 29.403211, + "longitude": -95.073408, + "city": "Santa Fe", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77511, + "latitude": 29.337714, + "longitude": -95.406048, + "city": "Alvin", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77512, + "latitude": 29.362879, + "longitude": -95.27605, + "city": "Alvin", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77514, + "latitude": 29.662044, + "longitude": -94.592995, + "city": "Anahuac", + "state": "TX", + "county": "Chambers" + }, + { + "zip_code": 77515, + "latitude": 29.154269, + "longitude": -95.406577, + "city": "Angleton", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77516, + "latitude": 29.183991, + "longitude": -95.465083, + "city": "Angleton", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77517, + "latitude": 29.406632, + "longitude": -95.084661, + "city": "Santa Fe", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77518, + "latitude": 29.497095, + "longitude": -94.961157, + "city": "Bacliff", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77519, + "latitude": 30.220893, + "longitude": -94.60237, + "city": "Batson", + "state": "TX", + "county": "Hardin" + }, + { + "zip_code": 77520, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Baytown", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77521, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Baytown", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77522, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Baytown", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77530, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Channelview", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77531, + "latitude": 29.031236, + "longitude": -95.3908, + "city": "Clute", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77532, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Crosby", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77533, + "latitude": 30.105083, + "longitude": -94.856128, + "city": "Daisetta", + "state": "TX", + "county": "Liberty" + }, + { + "zip_code": 77534, + "latitude": 29.319781, + "longitude": -95.309176, + "city": "Danbury", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77535, + "latitude": 30.064742, + "longitude": -94.80927, + "city": "Dayton", + "state": "TX", + "county": "Liberty" + }, + { + "zip_code": 77536, + "latitude": 29.687972, + "longitude": -95.116749, + "city": "Deer Park", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77538, + "latitude": 29.990724, + "longitude": -94.723055, + "city": "Devers", + "state": "TX", + "county": "Liberty" + }, + { + "zip_code": 77539, + "latitude": 29.458472, + "longitude": -95.034525, + "city": "Dickinson", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77541, + "latitude": 29.161924, + "longitude": -95.342392, + "city": "Freeport", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77542, + "latitude": 29.183991, + "longitude": -95.465083, + "city": "Freeport", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77545, + "latitude": 29.525461, + "longitude": -95.756462, + "city": "Fresno", + "state": "TX", + "county": "Fort Bend" + }, + { + "zip_code": 77546, + "latitude": 29.482185, + "longitude": -95.156545, + "city": "Friendswood", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77547, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Galena Park", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77549, + "latitude": 29.330501, + "longitude": -94.800238, + "city": "Friendswood", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77550, + "latitude": 29.323619, + "longitude": -94.913451, + "city": "Galveston", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77551, + "latitude": 29.212008, + "longitude": -94.933849, + "city": "Galveston", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77552, + "latitude": 29.22051, + "longitude": -94.944391, + "city": "Galveston", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77553, + "latitude": 29.195607, + "longitude": -94.981554, + "city": "Galveston", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77554, + "latitude": 29.277856, + "longitude": -94.956217, + "city": "Galveston", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77555, + "latitude": 29.330501, + "longitude": -94.800238, + "city": "Galveston", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77560, + "latitude": 29.693181, + "longitude": -94.685815, + "city": "Hankamer", + "state": "TX", + "county": "Chambers" + }, + { + "zip_code": 77561, + "latitude": 30.150955, + "longitude": -94.733789, + "city": "Hardin", + "state": "TX", + "county": "Liberty" + }, + { + "zip_code": 77562, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "Highlands", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77563, + "latitude": 29.344488, + "longitude": -94.990471, + "city": "Hitchcock", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77564, + "latitude": 30.122197, + "longitude": -94.667832, + "city": "Hull", + "state": "TX", + "county": "Liberty" + }, + { + "zip_code": 77565, + "latitude": 29.465064, + "longitude": -95.053246, + "city": "Kemah", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77566, + "latitude": 29.09609, + "longitude": -95.425232, + "city": "Lake Jackson", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77568, + "latitude": 29.374626, + "longitude": -94.998361, + "city": "La Marque", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77571, + "latitude": 29.688447, + "longitude": -95.051319, + "city": "La Porte", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77572, + "latitude": 29.83399, + "longitude": -95.434241, + "city": "La Porte", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77573, + "latitude": 29.496451, + "longitude": -95.052262, + "city": "League City", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77574, + "latitude": 29.511582, + "longitude": -95.058153, + "city": "League City", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77575, + "latitude": 30.094593, + "longitude": -94.737806, + "city": "Liberty", + "state": "TX", + "county": "Liberty" + }, + { + "zip_code": 77577, + "latitude": 29.266699, + "longitude": -95.288863, + "city": "Liverpool", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77578, + "latitude": 29.478468, + "longitude": -95.374419, + "city": "Manvel", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77580, + "latitude": 29.856137, + "longitude": -94.842939, + "city": "Mont Belvieu", + "state": "TX", + "county": "Chambers" + }, + { + "zip_code": 77581, + "latitude": 29.328311, + "longitude": -95.316425, + "city": "Pearland", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77582, + "latitude": 30.054158, + "longitude": -94.676436, + "city": "Raywood", + "state": "TX", + "county": "Liberty" + }, + { + "zip_code": 77583, + "latitude": 29.42501, + "longitude": -95.448799, + "city": "Rosharon", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77584, + "latitude": 29.54017, + "longitude": -95.33232, + "city": "Pearland", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77585, + "latitude": 30.309518, + "longitude": -94.477059, + "city": "Saratoga", + "state": "TX", + "county": "Hardin" + }, + { + "zip_code": 77586, + "latitude": 29.602041, + "longitude": -95.101012, + "city": "Seabrook", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77587, + "latitude": 29.662579, + "longitude": -95.229511, + "city": "South Houston", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77588, + "latitude": 29.512687, + "longitude": -95.254188, + "city": "Pearland", + "state": "TX", + "county": "Brazoria" + }, + { + "zip_code": 77590, + "latitude": 29.376057, + "longitude": -94.921474, + "city": "Texas City", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77591, + "latitude": 29.427468, + "longitude": -94.969173, + "city": "Texas City", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77592, + "latitude": 29.330501, + "longitude": -94.800238, + "city": "Texas City", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77597, + "latitude": 29.811188, + "longitude": -94.682325, + "city": "Wallisville", + "state": "TX", + "county": "Chambers" + }, + { + "zip_code": 77598, + "latitude": 29.550411, + "longitude": -95.128758, + "city": "Webster", + "state": "TX", + "county": "Harris" + }, + { + "zip_code": 77611, + "latitude": 30.019163, + "longitude": -93.832632, + "city": "Bridge City", + "state": "TX", + "county": "Orange" + }, + { + "zip_code": 77612, + "latitude": 30.493361, + "longitude": -93.951837, + "city": "Buna", + "state": "TX", + "county": "Jasper" + }, + { + "zip_code": 77613, + "latitude": 30.025795, + "longitude": -94.197989, + "city": "China", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77614, + "latitude": 30.584648, + "longitude": -93.749467, + "city": "Deweyville", + "state": "TX", + "county": "Newton" + }, + { + "zip_code": 77615, + "latitude": 30.69986, + "longitude": -94.163, + "city": "Evadale", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77616, + "latitude": 30.792674, + "longitude": -94.354476, + "city": "Fred", + "state": "TX", + "county": "Tyler" + }, + { + "zip_code": 77617, + "latitude": 29.523018, + "longitude": -94.475459, + "city": "Gilchrist", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77619, + "latitude": 29.941563, + "longitude": -93.916957, + "city": "Groves", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77622, + "latitude": 29.851906, + "longitude": -94.289265, + "city": "Hamshire", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77623, + "latitude": 29.547224, + "longitude": -94.426731, + "city": "High Island", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77624, + "latitude": 30.675022, + "longitude": -94.353409, + "city": "Hillister", + "state": "TX", + "county": "Tyler" + }, + { + "zip_code": 77625, + "latitude": 30.361001, + "longitude": -94.37408, + "city": "Kountze", + "state": "TX", + "county": "Hardin" + }, + { + "zip_code": 77626, + "latitude": 30.203996, + "longitude": -93.886646, + "city": "Mauriceville", + "state": "TX", + "county": "Orange" + }, + { + "zip_code": 77627, + "latitude": 29.992248, + "longitude": -94.195448, + "city": "Nederland", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77629, + "latitude": 29.993788, + "longitude": -94.367034, + "city": "Nome", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77630, + "latitude": 30.135425, + "longitude": -93.860282, + "city": "Orange", + "state": "TX", + "county": "Orange" + }, + { + "zip_code": 77631, + "latitude": 30.054793, + "longitude": -93.903108, + "city": "Orange", + "state": "TX", + "county": "Orange" + }, + { + "zip_code": 77632, + "latitude": 30.17752, + "longitude": -93.840937, + "city": "Orange", + "state": "TX", + "county": "Orange" + }, + { + "zip_code": 77639, + "latitude": 30.063101, + "longitude": -93.859903, + "city": "Orangefield", + "state": "TX", + "county": "Orange" + }, + { + "zip_code": 77640, + "latitude": 29.870904, + "longitude": -93.964278, + "city": "Port Arthur", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77641, + "latitude": 29.847569, + "longitude": -94.129733, + "city": "Port Arthur", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77642, + "latitude": 29.864207, + "longitude": -93.942055, + "city": "Port Arthur", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77643, + "latitude": 29.962144, + "longitude": -93.867932, + "city": "Port Arthur", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77650, + "latitude": 29.437631, + "longitude": -94.632252, + "city": "Port Bolivar", + "state": "TX", + "county": "Galveston" + }, + { + "zip_code": 77651, + "latitude": 30.005205, + "longitude": -94.132182, + "city": "Port Neches", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77655, + "latitude": 29.782283, + "longitude": -94.091127, + "city": "Sabine Pass", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77656, + "latitude": 30.327169, + "longitude": -94.274154, + "city": "Silsbee", + "state": "TX", + "county": "Hardin" + }, + { + "zip_code": 77657, + "latitude": 30.281836, + "longitude": -94.219122, + "city": "Lumberton", + "state": "TX", + "county": "Hardin" + }, + { + "zip_code": 77659, + "latitude": 30.238876, + "longitude": -94.403654, + "city": "Sour Lake", + "state": "TX", + "county": "Hardin" + }, + { + "zip_code": 77660, + "latitude": 30.792674, + "longitude": -94.354476, + "city": "Spurger", + "state": "TX", + "county": "Tyler" + }, + { + "zip_code": 77661, + "latitude": 29.780948, + "longitude": -94.390045, + "city": "Stowell", + "state": "TX", + "county": "Chambers" + }, + { + "zip_code": 77662, + "latitude": 30.15549, + "longitude": -93.935765, + "city": "Vidor", + "state": "TX", + "county": "Orange" + }, + { + "zip_code": 77663, + "latitude": 30.518504, + "longitude": -94.4458, + "city": "Village Mills", + "state": "TX", + "county": "Hardin" + }, + { + "zip_code": 77664, + "latitude": 30.634714, + "longitude": -94.380858, + "city": "Warren", + "state": "TX", + "county": "Tyler" + }, + { + "zip_code": 77665, + "latitude": 29.823383, + "longitude": -94.475364, + "city": "Winnie", + "state": "TX", + "county": "Chambers" + }, + { + "zip_code": 77670, + "latitude": 30.054793, + "longitude": -93.903108, + "city": "Vidor", + "state": "TX", + "county": "Orange" + }, + { + "zip_code": 77701, + "latitude": 30.073712, + "longitude": -94.109705, + "city": "Beaumont", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77702, + "latitude": 30.084112, + "longitude": -94.126444, + "city": "Beaumont", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77703, + "latitude": 30.113761, + "longitude": -94.120426, + "city": "Beaumont", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77704, + "latitude": 30.12355, + "longitude": -94.153941, + "city": "Beaumont", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77705, + "latitude": 29.928158, + "longitude": -94.189854, + "city": "Beaumont", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77706, + "latitude": 30.115295, + "longitude": -94.157916, + "city": "Beaumont", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77707, + "latitude": 30.009716, + "longitude": -94.162252, + "city": "Beaumont", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77708, + "latitude": 30.148461, + "longitude": -94.172481, + "city": "Beaumont", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77709, + "latitude": 30.176361, + "longitude": -94.187683, + "city": "Voth", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77710, + "latitude": 29.847569, + "longitude": -94.129733, + "city": "Beaumont", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77713, + "latitude": 30.069437, + "longitude": -94.260793, + "city": "Beaumont", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77720, + "latitude": 29.847569, + "longitude": -94.129733, + "city": "Beaumont", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77725, + "latitude": 29.847569, + "longitude": -94.129733, + "city": "Beaumont", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77726, + "latitude": 30.111843, + "longitude": -94.190147, + "city": "Beaumont", + "state": "TX", + "county": "Jefferson" + }, + { + "zip_code": 77801, + "latitude": 30.667044, + "longitude": -96.361631, + "city": "Bryan", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77802, + "latitude": 30.620983, + "longitude": -96.319377, + "city": "Bryan", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77803, + "latitude": 30.677338, + "longitude": -96.395088, + "city": "Bryan", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77805, + "latitude": 30.65212, + "longitude": -96.341012, + "city": "Bryan", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77806, + "latitude": 30.65212, + "longitude": -96.341012, + "city": "Bryan", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77807, + "latitude": 30.671076, + "longitude": -96.479892, + "city": "Bryan", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77808, + "latitude": 30.820187, + "longitude": -96.305894, + "city": "Bryan", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77830, + "latitude": 30.562982, + "longitude": -95.981285, + "city": "Anderson", + "state": "TX", + "county": "Grimes" + }, + { + "zip_code": 77831, + "latitude": 30.706523, + "longitude": -95.954649, + "city": "Bedias", + "state": "TX", + "county": "Grimes" + }, + { + "zip_code": 77833, + "latitude": 30.216516, + "longitude": -96.385104, + "city": "Brenham", + "state": "TX", + "county": "Washington" + }, + { + "zip_code": 77834, + "latitude": 30.231333, + "longitude": -96.290358, + "city": "Brenham", + "state": "TX", + "county": "Washington" + }, + { + "zip_code": 77835, + "latitude": 30.179152, + "longitude": -96.628566, + "city": "Burton", + "state": "TX", + "county": "Washington" + }, + { + "zip_code": 77836, + "latitude": 30.526184, + "longitude": -96.658407, + "city": "Caldwell", + "state": "TX", + "county": "Burleson" + }, + { + "zip_code": 77837, + "latitude": 30.980617, + "longitude": -96.674911, + "city": "Calvert", + "state": "TX", + "county": "Robertson" + }, + { + "zip_code": 77838, + "latitude": 30.513118, + "longitude": -96.618047, + "city": "Chriesman", + "state": "TX", + "county": "Burleson" + }, + { + "zip_code": 77839, + "latitude": 30.341403, + "longitude": -96.526669, + "city": "Clay", + "state": "TX", + "county": "Burleson" + }, + { + "zip_code": 77840, + "latitude": 30.582241, + "longitude": -96.289328, + "city": "College Station", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77841, + "latitude": 30.57258, + "longitude": -96.327044, + "city": "College Station", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77842, + "latitude": 30.65212, + "longitude": -96.341012, + "city": "College Station", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77843, + "latitude": 30.65212, + "longitude": -96.341012, + "city": "College Station", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77844, + "latitude": 30.65212, + "longitude": -96.341012, + "city": "College Station", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77845, + "latitude": 30.579234, + "longitude": -96.293826, + "city": "College Station", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77850, + "latitude": 31.313816, + "longitude": -95.993482, + "city": "Concord", + "state": "TX", + "county": "Leon" + }, + { + "zip_code": 77852, + "latitude": 30.513118, + "longitude": -96.618047, + "city": "Deanville", + "state": "TX", + "county": "Burleson" + }, + { + "zip_code": 77853, + "latitude": 30.277104, + "longitude": -96.892115, + "city": "Dime Box", + "state": "TX", + "county": "Lee" + }, + { + "zip_code": 77855, + "latitude": 31.15928, + "longitude": -96.12342, + "city": "Flynn", + "state": "TX", + "county": "Leon" + }, + { + "zip_code": 77856, + "latitude": 31.000137, + "longitude": -96.517098, + "city": "Franklin", + "state": "TX", + "county": "Robertson" + }, + { + "zip_code": 77857, + "latitude": 30.783324, + "longitude": -96.723691, + "city": "Gause", + "state": "TX", + "county": "Milam" + }, + { + "zip_code": 77859, + "latitude": 30.925686, + "longitude": -96.581229, + "city": "Hearne", + "state": "TX", + "county": "Robertson" + }, + { + "zip_code": 77861, + "latitude": 30.714476, + "longitude": -96.09887, + "city": "Iola", + "state": "TX", + "county": "Grimes" + }, + { + "zip_code": 77862, + "latitude": 30.65212, + "longitude": -96.341012, + "city": "Kurten", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77863, + "latitude": 30.359245, + "longitude": -96.591535, + "city": "Lyons", + "state": "TX", + "county": "Burleson" + }, + { + "zip_code": 77864, + "latitude": 30.970828, + "longitude": -95.890751, + "city": "Madisonville", + "state": "TX", + "county": "Madison" + }, + { + "zip_code": 77865, + "latitude": 31.253791, + "longitude": -96.22305, + "city": "Marquez", + "state": "TX", + "county": "Leon" + }, + { + "zip_code": 77866, + "latitude": 30.47857, + "longitude": -96.244718, + "city": "Millican", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77867, + "latitude": 31.026276, + "longitude": -96.533031, + "city": "Mumford", + "state": "TX", + "county": "Robertson" + }, + { + "zip_code": 77868, + "latitude": 30.383369, + "longitude": -96.008619, + "city": "Navasota", + "state": "TX", + "county": "Grimes" + }, + { + "zip_code": 77869, + "latitude": 30.65212, + "longitude": -96.341012, + "city": "Navasota", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77870, + "latitude": 31.026276, + "longitude": -96.533031, + "city": "New Baden", + "state": "TX", + "county": "Robertson" + }, + { + "zip_code": 77871, + "latitude": 31.12486, + "longitude": -96.109604, + "city": "Normangee", + "state": "TX", + "county": "Leon" + }, + { + "zip_code": 77872, + "latitude": 30.913412, + "longitude": -96.085341, + "city": "North Zulch", + "state": "TX", + "county": "Madison" + }, + { + "zip_code": 77873, + "latitude": 30.579623, + "longitude": -95.895889, + "city": "Richards", + "state": "TX", + "county": "Grimes" + }, + { + "zip_code": 77875, + "latitude": 30.607534, + "longitude": -95.957945, + "city": "Roans Prairie", + "state": "TX", + "county": "Grimes" + }, + { + "zip_code": 77876, + "latitude": 30.494286, + "longitude": -96.018489, + "city": "Shiro", + "state": "TX", + "county": "Grimes" + }, + { + "zip_code": 77878, + "latitude": 30.513118, + "longitude": -96.618047, + "city": "Snook", + "state": "TX", + "county": "Burleson" + }, + { + "zip_code": 77879, + "latitude": 30.364879, + "longitude": -96.526729, + "city": "Somerville", + "state": "TX", + "county": "Burleson" + }, + { + "zip_code": 77880, + "latitude": 30.298367, + "longitude": -96.211265, + "city": "Washington", + "state": "TX", + "county": "Washington" + }, + { + "zip_code": 77881, + "latitude": 30.65212, + "longitude": -96.341012, + "city": "Wellborn", + "state": "TX", + "county": "Brazos" + }, + { + "zip_code": 77882, + "latitude": 31.026276, + "longitude": -96.533031, + "city": "Wheelock", + "state": "TX", + "county": "Robertson" + }, + { + "zip_code": 77901, + "latitude": 28.777373, + "longitude": -97.026681, + "city": "Victoria", + "state": "TX", + "county": "Victoria" + }, + { + "zip_code": 77902, + "latitude": 28.925513, + "longitude": -97.100624, + "city": "Victoria", + "state": "TX", + "county": "Victoria" + }, + { + "zip_code": 77903, + "latitude": 28.794935, + "longitude": -96.974119, + "city": "Victoria", + "state": "TX", + "county": "Victoria" + }, + { + "zip_code": 77904, + "latitude": 28.90025, + "longitude": -97.001424, + "city": "Victoria", + "state": "TX", + "county": "Victoria" + }, + { + "zip_code": 77905, + "latitude": 28.752488, + "longitude": -97.033759, + "city": "Victoria", + "state": "TX", + "county": "Victoria" + }, + { + "zip_code": 77950, + "latitude": 28.308115, + "longitude": -97.152097, + "city": "Austwell", + "state": "TX", + "county": "Refugio" + }, + { + "zip_code": 77951, + "latitude": 28.649465, + "longitude": -96.894486, + "city": "Bloomington", + "state": "TX", + "county": "Victoria" + }, + { + "zip_code": 77954, + "latitude": 29.093677, + "longitude": -97.260776, + "city": "Cuero", + "state": "TX", + "county": "De Witt" + }, + { + "zip_code": 77957, + "latitude": 29.003797, + "longitude": -96.68519, + "city": "Edna", + "state": "TX", + "county": "Jackson" + }, + { + "zip_code": 77960, + "latitude": 28.677805, + "longitude": -97.260556, + "city": "Fannin", + "state": "TX", + "county": "Goliad" + }, + { + "zip_code": 77961, + "latitude": 28.961388, + "longitude": -96.501501, + "city": "Francitas", + "state": "TX", + "county": "Jackson" + }, + { + "zip_code": 77962, + "latitude": 28.988713, + "longitude": -96.456421, + "city": "Ganado", + "state": "TX", + "county": "Jackson" + }, + { + "zip_code": 77963, + "latitude": 28.664092, + "longitude": -97.460854, + "city": "Goliad", + "state": "TX", + "county": "Goliad" + }, + { + "zip_code": 77964, + "latitude": 29.418431, + "longitude": -96.93942, + "city": "Hallettsville", + "state": "TX", + "county": "Lavaca" + }, + { + "zip_code": 77967, + "latitude": 29.098894, + "longitude": -97.365742, + "city": "Hochheim", + "state": "TX", + "county": "De Witt" + }, + { + "zip_code": 77968, + "latitude": 28.851753, + "longitude": -96.857725, + "city": "Inez", + "state": "TX", + "county": "Victoria" + }, + { + "zip_code": 77969, + "latitude": 28.851185, + "longitude": -96.681608, + "city": "La Salle", + "state": "TX", + "county": "Jackson" + }, + { + "zip_code": 77970, + "latitude": 28.896485, + "longitude": -96.462184, + "city": "La Ward", + "state": "TX", + "county": "Jackson" + }, + { + "zip_code": 77971, + "latitude": 28.863912, + "longitude": -96.504071, + "city": "Lolita", + "state": "TX", + "county": "Jackson" + }, + { + "zip_code": 77972, + "latitude": 28.525453, + "longitude": -96.694818, + "city": "Long Mott", + "state": "TX", + "county": "Calhoun" + }, + { + "zip_code": 77973, + "latitude": 28.551137, + "longitude": -97.009923, + "city": "Mcfaddin", + "state": "TX", + "county": "Victoria" + }, + { + "zip_code": 77974, + "latitude": 28.917556, + "longitude": -97.290727, + "city": "Meyersville", + "state": "TX", + "county": "De Witt" + }, + { + "zip_code": 77975, + "latitude": 29.576432, + "longitude": -97.145989, + "city": "Moulton", + "state": "TX", + "county": "Lavaca" + }, + { + "zip_code": 77976, + "latitude": 28.954273, + "longitude": -97.090604, + "city": "Nursery", + "state": "TX", + "county": "Victoria" + }, + { + "zip_code": 77977, + "latitude": 28.692323, + "longitude": -96.825416, + "city": "Placedo", + "state": "TX", + "county": "Victoria" + }, + { + "zip_code": 77978, + "latitude": 28.681485, + "longitude": -96.50072, + "city": "Point Comfort", + "state": "TX", + "county": "Calhoun" + }, + { + "zip_code": 77979, + "latitude": 28.556096, + "longitude": -96.600353, + "city": "Port Lavaca", + "state": "TX", + "county": "Calhoun" + }, + { + "zip_code": 77982, + "latitude": 28.443245, + "longitude": -96.422834, + "city": "Port O Connor", + "state": "TX", + "county": "Calhoun" + }, + { + "zip_code": 77983, + "latitude": 28.427276, + "longitude": -96.667313, + "city": "Seadrift", + "state": "TX", + "county": "Calhoun" + }, + { + "zip_code": 77984, + "latitude": 29.42254, + "longitude": -97.153946, + "city": "Shiner", + "state": "TX", + "county": "Lavaca" + }, + { + "zip_code": 77985, + "latitude": 29.347975, + "longitude": -96.900331, + "city": "Speaks", + "state": "TX", + "county": "Lavaca" + }, + { + "zip_code": 77986, + "latitude": 29.487564, + "longitude": -96.794605, + "city": "Sublime", + "state": "TX", + "county": "Lavaca" + }, + { + "zip_code": 77987, + "latitude": 29.347975, + "longitude": -96.900331, + "city": "Sweet Home", + "state": "TX", + "county": "Lavaca" + }, + { + "zip_code": 77988, + "latitude": 28.838353, + "longitude": -96.887217, + "city": "Telferner", + "state": "TX", + "county": "Victoria" + }, + { + "zip_code": 77989, + "latitude": 28.997449, + "longitude": -97.153868, + "city": "Thomaston", + "state": "TX", + "county": "De Witt" + }, + { + "zip_code": 77990, + "latitude": 28.458661, + "longitude": -96.892788, + "city": "Tivoli", + "state": "TX", + "county": "Refugio" + }, + { + "zip_code": 77991, + "latitude": 28.845526, + "longitude": -96.581962, + "city": "Vanderbilt", + "state": "TX", + "county": "Jackson" + }, + { + "zip_code": 77993, + "latitude": 28.835825, + "longitude": -97.444155, + "city": "Weesatche", + "state": "TX", + "county": "Goliad" + }, + { + "zip_code": 77994, + "latitude": 29.102107, + "longitude": -97.328361, + "city": "Westhoff", + "state": "TX", + "county": "De Witt" + }, + { + "zip_code": 77995, + "latitude": 29.297302, + "longitude": -97.047148, + "city": "Yoakum", + "state": "TX", + "county": "Lavaca" + }, + { + "zip_code": 78001, + "latitude": 28.338951, + "longitude": -99.098369, + "city": "Artesia Wells", + "state": "TX", + "county": "La Salle" + }, + { + "zip_code": 78002, + "latitude": 29.279376, + "longitude": -98.735851, + "city": "Atascosa", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78003, + "latitude": 29.724328, + "longitude": -99.104014, + "city": "Bandera", + "state": "TX", + "county": "Bandera" + }, + { + "zip_code": 78004, + "latitude": 29.897947, + "longitude": -98.564153, + "city": "Bergheim", + "state": "TX", + "county": "Kendall" + }, + { + "zip_code": 78005, + "latitude": 28.965841, + "longitude": -98.857837, + "city": "Bigfoot", + "state": "TX", + "county": "Frio" + }, + { + "zip_code": 78006, + "latitude": 29.893137, + "longitude": -98.685719, + "city": "Boerne", + "state": "TX", + "county": "Kendall" + }, + { + "zip_code": 78007, + "latitude": 28.350458, + "longitude": -98.56876, + "city": "Calliham", + "state": "TX", + "county": "Mcmullen" + }, + { + "zip_code": 78008, + "latitude": 28.788589, + "longitude": -98.139626, + "city": "Campbellton", + "state": "TX", + "county": "Atascosa" + }, + { + "zip_code": 78009, + "latitude": 29.364948, + "longitude": -98.909219, + "city": "Castroville", + "state": "TX", + "county": "Medina" + }, + { + "zip_code": 78010, + "latitude": 29.931026, + "longitude": -99.067431, + "city": "Center Point", + "state": "TX", + "county": "Kerr" + }, + { + "zip_code": 78011, + "latitude": 28.814293, + "longitude": -98.655756, + "city": "Charlotte", + "state": "TX", + "county": "Atascosa" + }, + { + "zip_code": 78012, + "latitude": 28.785811, + "longitude": -98.488586, + "city": "Christine", + "state": "TX", + "county": "Atascosa" + }, + { + "zip_code": 78013, + "latitude": 29.945489, + "longitude": -98.712767, + "city": "Comfort", + "state": "TX", + "county": "Kendall" + }, + { + "zip_code": 78014, + "latitude": 28.243436, + "longitude": -99.278563, + "city": "Cotulla", + "state": "TX", + "county": "La Salle" + }, + { + "zip_code": 78015, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "Boerne", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78016, + "latitude": 29.21041, + "longitude": -98.978383, + "city": "Devine", + "state": "TX", + "county": "Medina" + }, + { + "zip_code": 78017, + "latitude": 28.763313, + "longitude": -99.217995, + "city": "Dilley", + "state": "TX", + "county": "Frio" + }, + { + "zip_code": 78019, + "latitude": 28.040526, + "longitude": -99.356329, + "city": "Encinal", + "state": "TX", + "county": "La Salle" + }, + { + "zip_code": 78021, + "latitude": 28.338951, + "longitude": -99.098369, + "city": "Fowlerton", + "state": "TX", + "county": "La Salle" + }, + { + "zip_code": 78022, + "latitude": 28.302094, + "longitude": -98.104154, + "city": "George West", + "state": "TX", + "county": "Live Oak" + }, + { + "zip_code": 78023, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "Helotes", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78024, + "latitude": 30.079396, + "longitude": -99.303613, + "city": "Hunt", + "state": "TX", + "county": "Kerr" + }, + { + "zip_code": 78025, + "latitude": 30.07271, + "longitude": -99.207682, + "city": "Ingram", + "state": "TX", + "county": "Kerr" + }, + { + "zip_code": 78026, + "latitude": 28.932742, + "longitude": -98.612998, + "city": "Jourdanton", + "state": "TX", + "county": "Atascosa" + }, + { + "zip_code": 78027, + "latitude": 29.968844, + "longitude": -98.540536, + "city": "Kendalia", + "state": "TX", + "county": "Kendall" + }, + { + "zip_code": 78028, + "latitude": 29.988525, + "longitude": -99.155469, + "city": "Kerrville", + "state": "TX", + "county": "Kerr" + }, + { + "zip_code": 78029, + "latitude": 30.033226, + "longitude": -99.140974, + "city": "Kerrville", + "state": "TX", + "county": "Kerr" + }, + { + "zip_code": 78039, + "latitude": 29.311728, + "longitude": -98.839256, + "city": "La Coste", + "state": "TX", + "county": "Medina" + }, + { + "zip_code": 78040, + "latitude": 27.515879, + "longitude": -99.494078, + "city": "Laredo", + "state": "TX", + "county": "Webb" + }, + { + "zip_code": 78041, + "latitude": 27.556714, + "longitude": -99.475079, + "city": "Laredo", + "state": "TX", + "county": "Webb" + }, + { + "zip_code": 78042, + "latitude": 27.565464, + "longitude": -99.476792, + "city": "Laredo", + "state": "TX", + "county": "Webb" + }, + { + "zip_code": 78043, + "latitude": 27.462213, + "longitude": -99.475032, + "city": "Laredo", + "state": "TX", + "county": "Webb" + }, + { + "zip_code": 78044, + "latitude": 27.363738, + "longitude": -99.481919, + "city": "Laredo", + "state": "TX", + "county": "Webb" + }, + { + "zip_code": 78045, + "latitude": 27.63573, + "longitude": -99.592284, + "city": "Laredo", + "state": "TX", + "county": "Webb" + }, + { + "zip_code": 78046, + "latitude": 27.404679, + "longitude": -99.474294, + "city": "Laredo", + "state": "TX", + "county": "Webb" + }, + { + "zip_code": 78049, + "latitude": 27.732094, + "longitude": -99.505138, + "city": "Laredo", + "state": "TX", + "county": "Webb" + }, + { + "zip_code": 78050, + "latitude": 29.101362, + "longitude": -98.488128, + "city": "Leming", + "state": "TX", + "county": "Atascosa" + }, + { + "zip_code": 78052, + "latitude": 29.213865, + "longitude": -98.755526, + "city": "Lytle", + "state": "TX", + "county": "Atascosa" + }, + { + "zip_code": 78053, + "latitude": 28.851823, + "longitude": -98.268515, + "city": "Mc Coy", + "state": "TX", + "county": "Atascosa" + }, + { + "zip_code": 78054, + "latitude": 29.325602, + "longitude": -98.732187, + "city": "Macdona", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78055, + "latitude": 29.729603, + "longitude": -99.191141, + "city": "Medina", + "state": "TX", + "county": "Bandera" + }, + { + "zip_code": 78056, + "latitude": 29.511723, + "longitude": -98.938654, + "city": "Mico", + "state": "TX", + "county": "Medina" + }, + { + "zip_code": 78057, + "latitude": 29.059489, + "longitude": -99.020436, + "city": "Moore", + "state": "TX", + "county": "Frio" + }, + { + "zip_code": 78058, + "latitude": 30.172545, + "longitude": -99.484971, + "city": "Mountain Home", + "state": "TX", + "county": "Kerr" + }, + { + "zip_code": 78059, + "latitude": 29.199959, + "longitude": -98.847138, + "city": "Natalia", + "state": "TX", + "county": "Medina" + }, + { + "zip_code": 78060, + "latitude": 28.421814, + "longitude": -98.071902, + "city": "Oakville", + "state": "TX", + "county": "Live Oak" + }, + { + "zip_code": 78061, + "latitude": 28.867782, + "longitude": -99.108227, + "city": "Pearsall", + "state": "TX", + "county": "Frio" + }, + { + "zip_code": 78062, + "latitude": 28.919999, + "longitude": -98.552942, + "city": "Peggy", + "state": "TX", + "county": "Atascosa" + }, + { + "zip_code": 78063, + "latitude": 29.67956, + "longitude": -98.948428, + "city": "Pipe Creek", + "state": "TX", + "county": "Bandera" + }, + { + "zip_code": 78064, + "latitude": 28.975023, + "longitude": -98.495551, + "city": "Pleasanton", + "state": "TX", + "county": "Atascosa" + }, + { + "zip_code": 78065, + "latitude": 29.059014, + "longitude": -98.63756, + "city": "Poteet", + "state": "TX", + "county": "Atascosa" + }, + { + "zip_code": 78066, + "latitude": 29.461171, + "longitude": -98.869444, + "city": "Rio Medina", + "state": "TX", + "county": "Medina" + }, + { + "zip_code": 78067, + "latitude": 27.09468, + "longitude": -99.354468, + "city": "San Ygnacio", + "state": "TX", + "county": "Zapata" + }, + { + "zip_code": 78069, + "latitude": 29.22053, + "longitude": -98.667756, + "city": "Somerset", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78070, + "latitude": 29.881355, + "longitude": -98.408614, + "city": "Spring Branch", + "state": "TX", + "county": "Comal" + }, + { + "zip_code": 78071, + "latitude": 28.452822, + "longitude": -98.166012, + "city": "Three Rivers", + "state": "TX", + "county": "Live Oak" + }, + { + "zip_code": 78072, + "latitude": 28.350458, + "longitude": -98.56876, + "city": "Tilden", + "state": "TX", + "county": "Mcmullen" + }, + { + "zip_code": 78073, + "latitude": 29.247612, + "longitude": -98.546361, + "city": "Von Ormy", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78074, + "latitude": 29.952304, + "longitude": -98.794374, + "city": "Waring", + "state": "TX", + "county": "Kendall" + }, + { + "zip_code": 78075, + "latitude": 28.421814, + "longitude": -98.071902, + "city": "Whitsett", + "state": "TX", + "county": "Live Oak" + }, + { + "zip_code": 78076, + "latitude": 26.923302, + "longitude": -99.215337, + "city": "Zapata", + "state": "TX", + "county": "Zapata" + }, + { + "zip_code": 78101, + "latitude": 29.368735, + "longitude": -98.253788, + "city": "Adkins", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78102, + "latitude": 28.488192, + "longitude": -97.730956, + "city": "Beeville", + "state": "TX", + "county": "Bee" + }, + { + "zip_code": 78104, + "latitude": 28.393116, + "longitude": -97.776017, + "city": "Beeville", + "state": "TX", + "county": "Bee" + }, + { + "zip_code": 78107, + "latitude": 28.529477, + "longitude": -97.592509, + "city": "Berclair", + "state": "TX", + "county": "Goliad" + }, + { + "zip_code": 78108, + "latitude": 29.555429, + "longitude": -98.090085, + "city": "Cibolo", + "state": "TX", + "county": "Guadalupe" + }, + { + "zip_code": 78109, + "latitude": 29.378081, + "longitude": -98.250136, + "city": "Converse", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78111, + "latitude": 28.944864, + "longitude": -97.882815, + "city": "Ecleto", + "state": "TX", + "county": "Karnes" + }, + { + "zip_code": 78112, + "latitude": 29.207578, + "longitude": -98.383291, + "city": "Elmendorf", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78113, + "latitude": 28.967642, + "longitude": -98.015225, + "city": "Falls City", + "state": "TX", + "county": "Karnes" + }, + { + "zip_code": 78114, + "latitude": 29.162771, + "longitude": -98.175887, + "city": "Floresville", + "state": "TX", + "county": "Wilson" + }, + { + "zip_code": 78115, + "latitude": 29.54508, + "longitude": -98.040833, + "city": "Geronimo", + "state": "TX", + "county": "Guadalupe" + }, + { + "zip_code": 78116, + "latitude": 29.092731, + "longitude": -97.843908, + "city": "Gillett", + "state": "TX", + "county": "Karnes" + }, + { + "zip_code": 78117, + "latitude": 28.993819, + "longitude": -97.928162, + "city": "Hobson", + "state": "TX", + "county": "Karnes" + }, + { + "zip_code": 78118, + "latitude": 28.922377, + "longitude": -97.937085, + "city": "Karnes City", + "state": "TX", + "county": "Karnes" + }, + { + "zip_code": 78119, + "latitude": 28.883947, + "longitude": -97.858465, + "city": "Kenedy", + "state": "TX", + "county": "Karnes" + }, + { + "zip_code": 78121, + "latitude": 29.34551, + "longitude": -98.087356, + "city": "La Vernia", + "state": "TX", + "county": "Wilson" + }, + { + "zip_code": 78122, + "latitude": 29.407188, + "longitude": -97.741358, + "city": "Leesville", + "state": "TX", + "county": "Gonzales" + }, + { + "zip_code": 78123, + "latitude": 29.600748, + "longitude": -98.041576, + "city": "Mc Queeney", + "state": "TX", + "county": "Guadalupe" + }, + { + "zip_code": 78124, + "latitude": 29.567879, + "longitude": -98.130236, + "city": "Marion", + "state": "TX", + "county": "Guadalupe" + }, + { + "zip_code": 78125, + "latitude": 28.424535, + "longitude": -97.732736, + "city": "Mineral", + "state": "TX", + "county": "Bee" + }, + { + "zip_code": 78130, + "latitude": 29.776488, + "longitude": -98.221041, + "city": "New Braunfels", + "state": "TX", + "county": "Comal" + }, + { + "zip_code": 78131, + "latitude": 29.79918, + "longitude": -98.338419, + "city": "New Braunfels", + "state": "TX", + "county": "Comal" + }, + { + "zip_code": 78132, + "latitude": 29.756508, + "longitude": -98.198321, + "city": "New Braunfels", + "state": "TX", + "county": "Comal" + }, + { + "zip_code": 78133, + "latitude": 29.801223, + "longitude": -98.220684, + "city": "Canyon Lake", + "state": "TX", + "county": "Comal" + }, + { + "zip_code": 78135, + "latitude": 29.738502, + "longitude": -98.087157, + "city": "New Braunfels", + "state": "TX", + "county": "Comal" + }, + { + "zip_code": 78140, + "latitude": 29.331033, + "longitude": -97.789879, + "city": "Nixon", + "state": "TX", + "county": "Gonzales" + }, + { + "zip_code": 78141, + "latitude": 28.924265, + "longitude": -97.446179, + "city": "Nordheim", + "state": "TX", + "county": "De Witt" + }, + { + "zip_code": 78142, + "latitude": 28.527798, + "longitude": -97.783069, + "city": "Normanna", + "state": "TX", + "county": "Bee" + }, + { + "zip_code": 78143, + "latitude": 29.24841, + "longitude": -97.828699, + "city": "Pandora", + "state": "TX", + "county": "Wilson" + }, + { + "zip_code": 78144, + "latitude": 28.956228, + "longitude": -97.898179, + "city": "Panna Maria", + "state": "TX", + "county": "Karnes" + }, + { + "zip_code": 78145, + "latitude": 28.424535, + "longitude": -97.732736, + "city": "Pawnee", + "state": "TX", + "county": "Bee" + }, + { + "zip_code": 78146, + "latitude": 28.616396, + "longitude": -97.808154, + "city": "Pettus", + "state": "TX", + "county": "Bee" + }, + { + "zip_code": 78147, + "latitude": 29.080236, + "longitude": -98.106249, + "city": "Poth", + "state": "TX", + "county": "Wilson" + }, + { + "zip_code": 78148, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "Universal City", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78150, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "Universal City", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78151, + "latitude": 28.821975, + "longitude": -97.768307, + "city": "Runge", + "state": "TX", + "county": "Karnes" + }, + { + "zip_code": 78152, + "latitude": 29.433781, + "longitude": -98.222438, + "city": "Saint Hedwig", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78154, + "latitude": 29.578978, + "longitude": -98.277839, + "city": "Schertz", + "state": "TX", + "county": "Guadalupe" + }, + { + "zip_code": 78155, + "latitude": 29.578734, + "longitude": -97.951829, + "city": "Seguin", + "state": "TX", + "county": "Guadalupe" + }, + { + "zip_code": 78156, + "latitude": 29.611797, + "longitude": -97.971208, + "city": "Seguin", + "state": "TX", + "county": "Guadalupe" + }, + { + "zip_code": 78159, + "latitude": 29.277318, + "longitude": -97.645878, + "city": "Smiley", + "state": "TX", + "county": "Gonzales" + }, + { + "zip_code": 78160, + "latitude": 29.235395, + "longitude": -97.934068, + "city": "Stockdale", + "state": "TX", + "county": "Wilson" + }, + { + "zip_code": 78161, + "latitude": 29.288795, + "longitude": -98.050916, + "city": "Sutherland Springs", + "state": "TX", + "county": "Wilson" + }, + { + "zip_code": 78162, + "latitude": 28.424535, + "longitude": -97.732736, + "city": "Tuleta", + "state": "TX", + "county": "Bee" + }, + { + "zip_code": 78163, + "latitude": 29.776691, + "longitude": -98.46263, + "city": "Bulverde", + "state": "TX", + "county": "Comal" + }, + { + "zip_code": 78164, + "latitude": 29.080478, + "longitude": -97.504179, + "city": "Yorktown", + "state": "TX", + "county": "De Witt" + }, + { + "zip_code": 78201, + "latitude": 29.399933, + "longitude": -98.537495, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78202, + "latitude": 29.428432, + "longitude": -98.462096, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78203, + "latitude": 29.414633, + "longitude": -98.461443, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78204, + "latitude": 29.405931, + "longitude": -98.507844, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78205, + "latitude": 29.424132, + "longitude": -98.484144, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78206, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78207, + "latitude": 29.348816, + "longitude": -98.439943, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78208, + "latitude": 29.439982, + "longitude": -98.460075, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78209, + "latitude": 29.431232, + "longitude": -98.427793, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78210, + "latitude": 29.353652, + "longitude": -98.480544, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78211, + "latitude": 29.311651, + "longitude": -98.642815, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78212, + "latitude": 29.438782, + "longitude": -98.493494, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78213, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78214, + "latitude": 29.350735, + "longitude": -98.483894, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78215, + "latitude": 29.437982, + "longitude": -98.483994, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78216, + "latitude": 29.173285, + "longitude": -98.478975, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78217, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78218, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78219, + "latitude": 29.449182, + "longitude": -98.34464, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78220, + "latitude": 29.414183, + "longitude": -98.391741, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78221, + "latitude": 29.259178, + "longitude": -98.453688, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78222, + "latitude": 29.332886, + "longitude": -98.382441, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78223, + "latitude": 29.323178, + "longitude": -98.372743, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78224, + "latitude": 29.326065, + "longitude": -98.456031, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78225, + "latitude": 29.337885, + "longitude": -98.440692, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78226, + "latitude": 29.390123, + "longitude": -98.549932, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78227, + "latitude": 29.401583, + "longitude": -98.625548, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78228, + "latitude": 29.353335, + "longitude": -98.467443, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78229, + "latitude": 29.269288, + "longitude": -98.33469, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78230, + "latitude": 29.268287, + "longitude": -98.7195, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78231, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78232, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78233, + "latitude": 29.292564, + "longitude": -98.408567, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78234, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78235, + "latitude": 29.349352, + "longitude": -98.442186, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78236, + "latitude": 29.405983, + "longitude": -98.608447, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78237, + "latitude": 29.345385, + "longitude": -98.483449, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78238, + "latitude": 29.45102, + "longitude": -98.616908, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78239, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78240, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78241, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78242, + "latitude": 29.340511, + "longitude": -98.670818, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78243, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78244, + "latitude": 29.388484, + "longitude": -98.448593, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78245, + "latitude": 29.406883, + "longitude": -98.722675, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78246, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78247, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78248, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78249, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78250, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78251, + "latitude": 29.464885, + "longitude": -98.671774, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78252, + "latitude": 29.337325, + "longitude": -98.705868, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78253, + "latitude": 29.471977, + "longitude": -98.757439, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78254, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78255, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78256, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78257, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78258, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78259, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78260, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78261, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78262, + "latitude": 29.449332, + "longitude": -98.290394, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78263, + "latitude": 29.354369, + "longitude": -98.305439, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78264, + "latitude": 29.194922, + "longitude": -98.499936, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78265, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78266, + "latitude": 29.740162, + "longitude": -98.22843, + "city": "San Antonio", + "state": "TX", + "county": "Comal" + }, + { + "zip_code": 78268, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78269, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78270, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78275, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78278, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78279, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78280, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78283, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78284, + "latitude": 29.442632, + "longitude": -98.491344, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78285, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78286, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78287, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78288, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78289, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78291, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78292, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78293, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78294, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78295, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78296, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78297, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78298, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78299, + "latitude": 29.437532, + "longitude": -98.461582, + "city": "San Antonio", + "state": "TX", + "county": "Bexar" + }, + { + "zip_code": 78330, + "latitude": 27.836111, + "longitude": -97.530388, + "city": "Agua Dulce", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78332, + "latitude": 27.703829, + "longitude": -98.055296, + "city": "Alice", + "state": "TX", + "county": "Jim Wells" + }, + { + "zip_code": 78333, + "latitude": 27.659473, + "longitude": -98.012331, + "city": "Alice", + "state": "TX", + "county": "Jim Wells" + }, + { + "zip_code": 78335, + "latitude": 27.912454, + "longitude": -97.188437, + "city": "Aransas Pass", + "state": "TX", + "county": "San Patricio" + }, + { + "zip_code": 78336, + "latitude": 27.94979, + "longitude": -97.513458, + "city": "Aransas Pass", + "state": "TX", + "county": "San Patricio" + }, + { + "zip_code": 78338, + "latitude": 27.116964, + "longitude": -97.612449, + "city": "Armstrong", + "state": "TX", + "county": "Kenedy" + }, + { + "zip_code": 78339, + "latitude": 27.804485, + "longitude": -97.80874, + "city": "Banquete", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78340, + "latitude": 28.097783, + "longitude": -97.206225, + "city": "Bayside", + "state": "TX", + "county": "Refugio" + }, + { + "zip_code": 78341, + "latitude": 27.592468, + "longitude": -98.414188, + "city": "Benavides", + "state": "TX", + "county": "Duval" + }, + { + "zip_code": 78342, + "latitude": 27.659473, + "longitude": -98.012331, + "city": "Ben Bolt", + "state": "TX", + "county": "Jim Wells" + }, + { + "zip_code": 78343, + "latitude": 27.623349, + "longitude": -97.749935, + "city": "Bishop", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78344, + "latitude": 27.429451, + "longitude": -98.838546, + "city": "Bruni", + "state": "TX", + "county": "Webb" + }, + { + "zip_code": 78347, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Chapman Ranch", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78349, + "latitude": 27.660242, + "longitude": -98.517894, + "city": "Concepcion", + "state": "TX", + "county": "Duval" + }, + { + "zip_code": 78350, + "latitude": 28.421814, + "longitude": -98.071902, + "city": "Dinero", + "state": "TX", + "county": "Live Oak" + }, + { + "zip_code": 78351, + "latitude": 27.633281, + "longitude": -97.763356, + "city": "Driscoll", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78352, + "latitude": 27.964959, + "longitude": -97.668225, + "city": "Edroy", + "state": "TX", + "county": "San Patricio" + }, + { + "zip_code": 78353, + "latitude": 27.023059, + "longitude": -98.261049, + "city": "Encino", + "state": "TX", + "county": "Brooks" + }, + { + "zip_code": 78355, + "latitude": 27.223209, + "longitude": -98.145056, + "city": "Falfurrias", + "state": "TX", + "county": "Brooks" + }, + { + "zip_code": 78357, + "latitude": 27.899181, + "longitude": -98.614928, + "city": "Freer", + "state": "TX", + "county": "Duval" + }, + { + "zip_code": 78358, + "latitude": 28.058922, + "longitude": -97.052415, + "city": "Fulton", + "state": "TX", + "county": "Aransas" + }, + { + "zip_code": 78359, + "latitude": 27.945389, + "longitude": -97.245888, + "city": "Gregory", + "state": "TX", + "county": "San Patricio" + }, + { + "zip_code": 78360, + "latitude": 27.071318, + "longitude": -98.686327, + "city": "Guerra", + "state": "TX", + "county": "Jim Hogg" + }, + { + "zip_code": 78361, + "latitude": 27.07069, + "longitude": -98.692717, + "city": "Hebbronville", + "state": "TX", + "county": "Jim Hogg" + }, + { + "zip_code": 78362, + "latitude": 27.873566, + "longitude": -97.224236, + "city": "Ingleside", + "state": "TX", + "county": "San Patricio" + }, + { + "zip_code": 78363, + "latitude": 27.422876, + "longitude": -97.84068, + "city": "Kingsville", + "state": "TX", + "county": "Kleberg" + }, + { + "zip_code": 78364, + "latitude": 27.421023, + "longitude": -97.882432, + "city": "Kingsville", + "state": "TX", + "county": "Kleberg" + }, + { + "zip_code": 78368, + "latitude": 28.000693, + "longitude": -97.539384, + "city": "Mathis", + "state": "TX", + "county": "San Patricio" + }, + { + "zip_code": 78369, + "latitude": 27.43807, + "longitude": -99.001969, + "city": "Mirando City", + "state": "TX", + "county": "Webb" + }, + { + "zip_code": 78370, + "latitude": 27.941424, + "longitude": -97.581752, + "city": "Odem", + "state": "TX", + "county": "San Patricio" + }, + { + "zip_code": 78371, + "latitude": 27.732094, + "longitude": -99.505138, + "city": "Oilton", + "state": "TX", + "county": "Webb" + }, + { + "zip_code": 78372, + "latitude": 27.942358, + "longitude": -98.06417, + "city": "Orange Grove", + "state": "TX", + "county": "Jim Wells" + }, + { + "zip_code": 78373, + "latitude": 27.770678, + "longitude": -97.105137, + "city": "Port Aransas", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78374, + "latitude": 27.979489, + "longitude": -97.538993, + "city": "Portland", + "state": "TX", + "county": "San Patricio" + }, + { + "zip_code": 78375, + "latitude": 27.315242, + "longitude": -98.164332, + "city": "Premont", + "state": "TX", + "county": "Jim Wells" + }, + { + "zip_code": 78376, + "latitude": 27.660242, + "longitude": -98.517894, + "city": "Realitos", + "state": "TX", + "county": "Duval" + }, + { + "zip_code": 78377, + "latitude": 28.281826, + "longitude": -97.297783, + "city": "Refugio", + "state": "TX", + "county": "Refugio" + }, + { + "zip_code": 78379, + "latitude": 27.297687, + "longitude": -97.787713, + "city": "Riviera", + "state": "TX", + "county": "Kleberg" + }, + { + "zip_code": 78380, + "latitude": 27.795517, + "longitude": -97.752083, + "city": "Robstown", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78381, + "latitude": 28.013108, + "longitude": -97.09364, + "city": "Rockport", + "state": "TX", + "county": "Aransas" + }, + { + "zip_code": 78382, + "latitude": 28.070458, + "longitude": -97.101567, + "city": "Rockport", + "state": "TX", + "county": "Aransas" + }, + { + "zip_code": 78383, + "latitude": 28.024961, + "longitude": -97.870486, + "city": "Sandia", + "state": "TX", + "county": "Jim Wells" + }, + { + "zip_code": 78384, + "latitude": 27.660127, + "longitude": -98.517875, + "city": "San Diego", + "state": "TX", + "county": "Duval" + }, + { + "zip_code": 78385, + "latitude": 27.222302, + "longitude": -97.793153, + "city": "Sarita", + "state": "TX", + "county": "Kenedy" + }, + { + "zip_code": 78387, + "latitude": 28.012823, + "longitude": -97.556615, + "city": "Sinton", + "state": "TX", + "county": "San Patricio" + }, + { + "zip_code": 78389, + "latitude": 28.21206, + "longitude": -97.712708, + "city": "Skidmore", + "state": "TX", + "county": "Bee" + }, + { + "zip_code": 78390, + "latitude": 27.973917, + "longitude": -97.421131, + "city": "Taft", + "state": "TX", + "county": "San Patricio" + }, + { + "zip_code": 78391, + "latitude": 28.178966, + "longitude": -97.74564, + "city": "Tynan", + "state": "TX", + "county": "Bee" + }, + { + "zip_code": 78393, + "latitude": 28.206879, + "longitude": -97.334538, + "city": "Woodsboro", + "state": "TX", + "county": "Refugio" + }, + { + "zip_code": 78401, + "latitude": 27.759399, + "longitude": -97.648158, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78402, + "latitude": 27.824911, + "longitude": -97.387555, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78403, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78404, + "latitude": 27.773456, + "longitude": -97.644134, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78405, + "latitude": 27.772443, + "longitude": -97.438727, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78406, + "latitude": 27.766605, + "longitude": -97.528579, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78407, + "latitude": 27.805687, + "longitude": -97.446032, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78408, + "latitude": 27.782654, + "longitude": -97.445674, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78409, + "latitude": 27.807955, + "longitude": -97.69339, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78410, + "latitude": 27.82437, + "longitude": -97.584067, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78411, + "latitude": 27.732089, + "longitude": -97.385169, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78412, + "latitude": 27.68456, + "longitude": -97.351868, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78413, + "latitude": 27.675937, + "longitude": -97.40242, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78414, + "latitude": 27.667387, + "longitude": -97.373419, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78415, + "latitude": 27.679532, + "longitude": -97.450239, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78416, + "latitude": 27.811334, + "longitude": -97.613918, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78417, + "latitude": 27.717017, + "longitude": -97.445407, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78418, + "latitude": 27.70944, + "longitude": -97.26289, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78419, + "latitude": 27.723611, + "longitude": -97.380884, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78426, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78427, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78460, + "latitude": 27.889868, + "longitude": -97.879743, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78461, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78463, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78465, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78466, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78467, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78468, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78469, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78470, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78471, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78472, + "latitude": 27.740225, + "longitude": -97.579207, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78473, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78474, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78475, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78476, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78477, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78478, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78480, + "latitude": 27.777, + "longitude": -97.463213, + "city": "Corpus Christi", + "state": "TX", + "county": "Nueces" + }, + { + "zip_code": 78501, + "latitude": 26.269305, + "longitude": -98.224364, + "city": "Mcallen", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78502, + "latitude": 26.25671, + "longitude": -98.198929, + "city": "Mcallen", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78503, + "latitude": 26.182171, + "longitude": -98.33773, + "city": "Mcallen", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78504, + "latitude": 26.326284, + "longitude": -98.233488, + "city": "Mcallen", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78505, + "latitude": 26.409709, + "longitude": -98.224206, + "city": "Mcallen", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78516, + "latitude": 26.221712, + "longitude": -98.218896, + "city": "Alamo", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78520, + "latitude": 26.052155, + "longitude": -97.514466, + "city": "Brownsville", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78521, + "latitude": 26.098629, + "longitude": -97.5069, + "city": "Brownsville", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78522, + "latitude": 26.188911, + "longitude": -97.764271, + "city": "Brownsville", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78523, + "latitude": 25.981006, + "longitude": -97.520941, + "city": "Brownsville", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78526, + "latitude": 25.971728, + "longitude": -97.469871, + "city": "Brownsville", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78535, + "latitude": 26.245051, + "longitude": -97.74157, + "city": "Combes", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78536, + "latitude": 26.421394, + "longitude": -98.848757, + "city": "Delmita", + "state": "TX", + "county": "Starr" + }, + { + "zip_code": 78537, + "latitude": 26.211241, + "longitude": -98.134864, + "city": "Donna", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78538, + "latitude": 26.332751, + "longitude": -97.96224, + "city": "Edcouch", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78539, + "latitude": 26.328674, + "longitude": -98.139672, + "city": "Edinburg", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78540, + "latitude": 26.319405, + "longitude": -98.190922, + "city": "Edinburg", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78543, + "latitude": 26.297428, + "longitude": -97.98837, + "city": "Elsa", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78545, + "latitude": 26.562044, + "longitude": -99.133528, + "city": "Falcon Heights", + "state": "TX", + "county": "Starr" + }, + { + "zip_code": 78547, + "latitude": 26.339353, + "longitude": -98.737359, + "city": "Garciasville", + "state": "TX", + "county": "Starr" + }, + { + "zip_code": 78548, + "latitude": 26.289718, + "longitude": -98.647936, + "city": "Grulla", + "state": "TX", + "county": "Starr" + }, + { + "zip_code": 78549, + "latitude": 26.409709, + "longitude": -98.224206, + "city": "Hargill", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78550, + "latitude": 26.185202, + "longitude": -97.536807, + "city": "Harlingen", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78551, + "latitude": 26.244651, + "longitude": -97.720569, + "city": "Harlingen", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78552, + "latitude": 26.174402, + "longitude": -97.683666, + "city": "Harlingen", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78553, + "latitude": 26.125242, + "longitude": -97.475663, + "city": "Harlingen", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78557, + "latitude": 26.185789, + "longitude": -98.272287, + "city": "Hidalgo", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78558, + "latitude": 26.294532, + "longitude": -98.045699, + "city": "La Blanca", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78559, + "latitude": 26.131353, + "longitude": -97.754971, + "city": "La Feria", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78560, + "latitude": 26.242565, + "longitude": -98.474651, + "city": "La Joya", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78561, + "latitude": 26.561287, + "longitude": -97.429952, + "city": "Lasara", + "state": "TX", + "county": "Willacy" + }, + { + "zip_code": 78562, + "latitude": 26.299892, + "longitude": -97.924718, + "city": "La Villa", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78563, + "latitude": 26.409709, + "longitude": -98.224206, + "city": "Linn", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78564, + "latitude": 26.945418, + "longitude": -99.203985, + "city": "Lopeno", + "state": "TX", + "county": "Zapata" + }, + { + "zip_code": 78565, + "latitude": 26.409709, + "longitude": -98.224206, + "city": "Los Ebanos", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78566, + "latitude": 26.131503, + "longitude": -97.552425, + "city": "Los Fresnos", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78567, + "latitude": 26.041669, + "longitude": -97.693736, + "city": "Los Indios", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78568, + "latitude": 26.190402, + "longitude": -97.542263, + "city": "Lozano", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78569, + "latitude": 26.406243, + "longitude": -97.791701, + "city": "Lyford", + "state": "TX", + "county": "Willacy" + }, + { + "zip_code": 78570, + "latitude": 26.209065, + "longitude": -98.075583, + "city": "Mercedes", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78572, + "latitude": 26.229639, + "longitude": -98.192732, + "city": "Mission", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78573, + "latitude": 26.409709, + "longitude": -98.224206, + "city": "Mission", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78575, + "latitude": 26.006779, + "longitude": -97.547392, + "city": "Olmito", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78576, + "latitude": 26.193734, + "longitude": -98.101526, + "city": "Penitas", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78577, + "latitude": 26.186698, + "longitude": -98.127765, + "city": "Pharr", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78578, + "latitude": 26.145304, + "longitude": -97.505429, + "city": "Port Isabel", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78579, + "latitude": 26.092209, + "longitude": -97.953259, + "city": "Progreso", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78580, + "latitude": 26.417824, + "longitude": -97.79468, + "city": "Raymondville", + "state": "TX", + "county": "Willacy" + }, + { + "zip_code": 78582, + "latitude": 26.499887, + "longitude": -98.752428, + "city": "Rio Grande City", + "state": "TX", + "county": "Starr" + }, + { + "zip_code": 78583, + "latitude": 26.252266, + "longitude": -97.565494, + "city": "Rio Hondo", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78584, + "latitude": 26.584581, + "longitude": -99.004493, + "city": "Roma", + "state": "TX", + "county": "Starr" + }, + { + "zip_code": 78585, + "latitude": 26.510436, + "longitude": -98.746365, + "city": "Salineno", + "state": "TX", + "county": "Starr" + }, + { + "zip_code": 78586, + "latitude": 26.152353, + "longitude": -97.53175, + "city": "San Benito", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78588, + "latitude": 26.510436, + "longitude": -98.746365, + "city": "San Isidro", + "state": "TX", + "county": "Starr" + }, + { + "zip_code": 78589, + "latitude": 26.214873, + "longitude": -98.161978, + "city": "San Juan", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78590, + "latitude": 26.455519, + "longitude": -97.585805, + "city": "San Perlita", + "state": "TX", + "county": "Willacy" + }, + { + "zip_code": 78591, + "latitude": 26.749896, + "longitude": -98.583016, + "city": "Santa Elena", + "state": "TX", + "county": "Starr" + }, + { + "zip_code": 78592, + "latitude": 26.125242, + "longitude": -97.475663, + "city": "Santa Maria", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78593, + "latitude": 26.229551, + "longitude": -97.803023, + "city": "Santa Rosa", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78594, + "latitude": 26.345298, + "longitude": -97.791472, + "city": "Sebastian", + "state": "TX", + "county": "Willacy" + }, + { + "zip_code": 78595, + "latitude": 26.275293, + "longitude": -98.56996, + "city": "Sullivan City", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78596, + "latitude": 26.178744, + "longitude": -98.134649, + "city": "Weslaco", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78597, + "latitude": 26.115896, + "longitude": -97.494039, + "city": "South Padre Island", + "state": "TX", + "county": "Cameron" + }, + { + "zip_code": 78598, + "latitude": 26.554299, + "longitude": -97.426247, + "city": "Port Mansfield", + "state": "TX", + "county": "Willacy" + }, + { + "zip_code": 78599, + "latitude": 26.409709, + "longitude": -98.224206, + "city": "Weslaco", + "state": "TX", + "county": "Hidalgo" + }, + { + "zip_code": 78602, + "latitude": 30.140905, + "longitude": -97.313592, + "city": "Bastrop", + "state": "TX", + "county": "Bastrop" + }, + { + "zip_code": 78603, + "latitude": 29.447211, + "longitude": -97.494649, + "city": "Bebe", + "state": "TX", + "county": "Gonzales" + }, + { + "zip_code": 78604, + "latitude": 29.447211, + "longitude": -97.494649, + "city": "Belmont", + "state": "TX", + "county": "Gonzales" + }, + { + "zip_code": 78605, + "latitude": 30.74431, + "longitude": -98.08625, + "city": "Bertram", + "state": "TX", + "county": "Burnet" + }, + { + "zip_code": 78606, + "latitude": 30.137027, + "longitude": -98.419985, + "city": "Blanco", + "state": "TX", + "county": "Blanco" + }, + { + "zip_code": 78607, + "latitude": 30.828132, + "longitude": -98.431188, + "city": "Bluffton", + "state": "TX", + "county": "Llano" + }, + { + "zip_code": 78608, + "latitude": 30.878476, + "longitude": -97.910703, + "city": "Briggs", + "state": "TX", + "county": "Burnet" + }, + { + "zip_code": 78609, + "latitude": 30.766448, + "longitude": -98.427288, + "city": "Buchanan Dam", + "state": "TX", + "county": "Llano" + }, + { + "zip_code": 78610, + "latitude": 30.108361, + "longitude": -97.989275, + "city": "Buda", + "state": "TX", + "county": "Hays" + }, + { + "zip_code": 78611, + "latitude": 30.749465, + "longitude": -98.238816, + "city": "Burnet", + "state": "TX", + "county": "Burnet" + }, + { + "zip_code": 78612, + "latitude": 30.083931, + "longitude": -97.486885, + "city": "Cedar Creek", + "state": "TX", + "county": "Bastrop" + }, + { + "zip_code": 78613, + "latitude": 30.494032, + "longitude": -97.628724, + "city": "Cedar Park", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78614, + "latitude": 29.447211, + "longitude": -97.494649, + "city": "Cost", + "state": "TX", + "county": "Gonzales" + }, + { + "zip_code": 78615, + "latitude": 30.487161, + "longitude": -97.367571, + "city": "Coupland", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78616, + "latitude": 29.889187, + "longitude": -97.573078, + "city": "Dale", + "state": "TX", + "county": "Caldwell" + }, + { + "zip_code": 78617, + "latitude": 30.151068, + "longitude": -97.60206, + "city": "Del Valle", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78618, + "latitude": 30.373945, + "longitude": -99.096213, + "city": "Doss", + "state": "TX", + "county": "Gillespie" + }, + { + "zip_code": 78619, + "latitude": 30.09393, + "longitude": -98.000454, + "city": "Driftwood", + "state": "TX", + "county": "Hays" + }, + { + "zip_code": 78620, + "latitude": 30.165463, + "longitude": -98.044468, + "city": "Dripping Springs", + "state": "TX", + "county": "Hays" + }, + { + "zip_code": 78621, + "latitude": 30.308019, + "longitude": -97.36044, + "city": "Elgin", + "state": "TX", + "county": "Bastrop" + }, + { + "zip_code": 78622, + "latitude": 29.76084, + "longitude": -97.751156, + "city": "Fentress", + "state": "TX", + "county": "Caldwell" + }, + { + "zip_code": 78623, + "latitude": 29.95346, + "longitude": -98.228503, + "city": "Fischer", + "state": "TX", + "county": "Comal" + }, + { + "zip_code": 78624, + "latitude": 30.313385, + "longitude": -98.8936, + "city": "Fredericksburg", + "state": "TX", + "county": "Gillespie" + }, + { + "zip_code": 78626, + "latitude": 30.668034, + "longitude": -97.574706, + "city": "Georgetown", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78627, + "latitude": 30.673597, + "longitude": -97.646143, + "city": "Georgetown", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78628, + "latitude": 30.692191, + "longitude": -97.756049, + "city": "Georgetown", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78629, + "latitude": 29.543029, + "longitude": -97.543969, + "city": "Gonzales", + "state": "TX", + "county": "Gonzales" + }, + { + "zip_code": 78630, + "latitude": 30.656817, + "longitude": -97.602552, + "city": "Cedar Park", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78631, + "latitude": 30.247879, + "longitude": -99.268227, + "city": "Harper", + "state": "TX", + "county": "Gillespie" + }, + { + "zip_code": 78632, + "latitude": 29.447211, + "longitude": -97.494649, + "city": "Harwood", + "state": "TX", + "county": "Gonzales" + }, + { + "zip_code": 78634, + "latitude": 30.551885, + "longitude": -97.554189, + "city": "Hutto", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78635, + "latitude": 30.225386, + "longitude": -98.542031, + "city": "Hye", + "state": "TX", + "county": "Blanco" + }, + { + "zip_code": 78636, + "latitude": 30.21577, + "longitude": -98.405866, + "city": "Johnson City", + "state": "TX", + "county": "Blanco" + }, + { + "zip_code": 78638, + "latitude": 29.658865, + "longitude": -97.835535, + "city": "Kingsbury", + "state": "TX", + "county": "Guadalupe" + }, + { + "zip_code": 78639, + "latitude": 30.697117, + "longitude": -98.548345, + "city": "Kingsland", + "state": "TX", + "county": "Llano" + }, + { + "zip_code": 78640, + "latitude": 29.996599, + "longitude": -97.83354, + "city": "Kyle", + "state": "TX", + "county": "Hays" + }, + { + "zip_code": 78641, + "latitude": 30.583474, + "longitude": -97.857453, + "city": "Leander", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78642, + "latitude": 30.715353, + "longitude": -97.91191, + "city": "Liberty Hill", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78643, + "latitude": 30.71514, + "longitude": -98.610863, + "city": "Llano", + "state": "TX", + "county": "Llano" + }, + { + "zip_code": 78644, + "latitude": 29.875405, + "longitude": -97.630472, + "city": "Lockhart", + "state": "TX", + "county": "Caldwell" + }, + { + "zip_code": 78645, + "latitude": 30.44901, + "longitude": -97.966945, + "city": "Leander", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78646, + "latitude": 30.656817, + "longitude": -97.602552, + "city": "Leander", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78648, + "latitude": 29.709928, + "longitude": -97.638005, + "city": "Luling", + "state": "TX", + "county": "Caldwell" + }, + { + "zip_code": 78650, + "latitude": 30.272109, + "longitude": -97.236741, + "city": "Mc Dade", + "state": "TX", + "county": "Bastrop" + }, + { + "zip_code": 78651, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Mc Neil", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78652, + "latitude": 30.123827, + "longitude": -97.839325, + "city": "Manchaca", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78653, + "latitude": 30.343501, + "longitude": -97.512902, + "city": "Manor", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78654, + "latitude": 30.663954, + "longitude": -98.161114, + "city": "Marble Falls", + "state": "TX", + "county": "Burnet" + }, + { + "zip_code": 78655, + "latitude": 29.839448, + "longitude": -97.850842, + "city": "Martindale", + "state": "TX", + "county": "Caldwell" + }, + { + "zip_code": 78656, + "latitude": 29.85922, + "longitude": -97.799121, + "city": "Maxwell", + "state": "TX", + "county": "Caldwell" + }, + { + "zip_code": 78657, + "latitude": 30.537773, + "longitude": -98.333113, + "city": "Marble Falls", + "state": "TX", + "county": "Burnet" + }, + { + "zip_code": 78658, + "latitude": 29.447211, + "longitude": -97.494649, + "city": "Ottine", + "state": "TX", + "county": "Gonzales" + }, + { + "zip_code": 78659, + "latitude": 30.210039, + "longitude": -97.157246, + "city": "Paige", + "state": "TX", + "county": "Bastrop" + }, + { + "zip_code": 78660, + "latitude": 30.442737, + "longitude": -97.597055, + "city": "Pflugerville", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78661, + "latitude": 29.751348, + "longitude": -97.748349, + "city": "Prairie Lea", + "state": "TX", + "county": "Caldwell" + }, + { + "zip_code": 78662, + "latitude": 29.955422, + "longitude": -97.425923, + "city": "Red Rock", + "state": "TX", + "county": "Bastrop" + }, + { + "zip_code": 78663, + "latitude": 30.414943, + "longitude": -98.356711, + "city": "Round Mountain", + "state": "TX", + "county": "Blanco" + }, + { + "zip_code": 78664, + "latitude": 30.530497, + "longitude": -97.635103, + "city": "Round Rock", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78665, + "latitude": 30.219829, + "longitude": -98.358613, + "city": "Sandy", + "state": "TX", + "county": "Blanco" + }, + { + "zip_code": 78666, + "latitude": 29.972907, + "longitude": -97.997166, + "city": "San Marcos", + "state": "TX", + "county": "Hays" + }, + { + "zip_code": 78667, + "latitude": 30.054378, + "longitude": -98.003574, + "city": "San Marcos", + "state": "TX", + "county": "Hays" + }, + { + "zip_code": 78669, + "latitude": 30.397227, + "longitude": -97.82012, + "city": "Spicewood", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78670, + "latitude": 29.611797, + "longitude": -97.971208, + "city": "Staples", + "state": "TX", + "county": "Guadalupe" + }, + { + "zip_code": 78671, + "latitude": 30.289559, + "longitude": -98.706737, + "city": "Stonewall", + "state": "TX", + "county": "Gillespie" + }, + { + "zip_code": 78672, + "latitude": 30.772002, + "longitude": -98.446332, + "city": "Tow", + "state": "TX", + "county": "Llano" + }, + { + "zip_code": 78673, + "latitude": 30.741495, + "longitude": -97.589147, + "city": "Walburg", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78674, + "latitude": 30.674667, + "longitude": -97.59286, + "city": "Weir", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78675, + "latitude": 30.387956, + "longitude": -98.701902, + "city": "Willow City", + "state": "TX", + "county": "Gillespie" + }, + { + "zip_code": 78676, + "latitude": 30.012441, + "longitude": -98.031713, + "city": "Wimberley", + "state": "TX", + "county": "Hays" + }, + { + "zip_code": 78677, + "latitude": 29.447211, + "longitude": -97.494649, + "city": "Wrightsboro", + "state": "TX", + "county": "Gonzales" + }, + { + "zip_code": 78680, + "latitude": 30.656817, + "longitude": -97.602552, + "city": "Round Rock", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78681, + "latitude": 30.52398, + "longitude": -97.718672, + "city": "Round Rock", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78682, + "latitude": 30.656817, + "longitude": -97.602552, + "city": "Round Rock", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78683, + "latitude": 30.656817, + "longitude": -97.602552, + "city": "Round Rock", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78691, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Pflugerville", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78701, + "latitude": 30.268335, + "longitude": -97.741382, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78702, + "latitude": 30.264115, + "longitude": -97.713581, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78703, + "latitude": 30.290107, + "longitude": -97.766351, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78704, + "latitude": 30.240685, + "longitude": -97.768832, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78705, + "latitude": 30.293057, + "longitude": -97.736932, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78708, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78709, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78710, + "latitude": 30.351953, + "longitude": -97.715123, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78711, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78712, + "latitude": 30.285207, + "longitude": -97.735394, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78713, + "latitude": 30.468583, + "longitude": -97.843336, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78714, + "latitude": 30.335787, + "longitude": -97.443751, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78715, + "latitude": 30.450088, + "longitude": -97.486509, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78716, + "latitude": 30.316223, + "longitude": -97.85877, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78717, + "latitude": 30.493156, + "longitude": -97.756517, + "city": "Austin", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78718, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78719, + "latitude": 30.141293, + "longitude": -97.678843, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78720, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78721, + "latitude": 30.268684, + "longitude": -97.684781, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78722, + "latitude": 30.286857, + "longitude": -97.718832, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78723, + "latitude": 30.305107, + "longitude": -97.686631, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78724, + "latitude": 30.292188, + "longitude": -97.617871, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78725, + "latitude": 30.243552, + "longitude": -97.625293, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78726, + "latitude": 30.427124, + "longitude": -97.843801, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78727, + "latitude": 30.427402, + "longitude": -97.719678, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78728, + "latitude": 30.452151, + "longitude": -97.694784, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78729, + "latitude": 30.456713, + "longitude": -97.770237, + "city": "Austin", + "state": "TX", + "county": "Williamson" + }, + { + "zip_code": 78730, + "latitude": 30.364587, + "longitude": -97.836441, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78731, + "latitude": 30.345554, + "longitude": -97.769769, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78732, + "latitude": 30.376821, + "longitude": -97.889237, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78733, + "latitude": 30.321504, + "longitude": -97.889882, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78734, + "latitude": 30.370457, + "longitude": -97.942721, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78735, + "latitude": 30.267607, + "longitude": -97.860767, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78736, + "latitude": 30.272424, + "longitude": -97.973888, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78737, + "latitude": 30.203952, + "longitude": -97.931042, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78738, + "latitude": 30.326866, + "longitude": -98.013542, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78739, + "latitude": 30.172937, + "longitude": -97.886794, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78741, + "latitude": 30.231309, + "longitude": -97.715057, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78742, + "latitude": 30.236455, + "longitude": -97.669953, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78744, + "latitude": 30.166102, + "longitude": -97.737181, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78745, + "latitude": 30.198702, + "longitude": -97.797183, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78746, + "latitude": 30.2971, + "longitude": -97.818113, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78747, + "latitude": 30.120427, + "longitude": -97.743317, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78748, + "latitude": 30.16696, + "longitude": -97.823854, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78749, + "latitude": 30.207969, + "longitude": -97.857187, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78750, + "latitude": 30.406729, + "longitude": -97.8155, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78751, + "latitude": 30.310606, + "longitude": -97.722382, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78752, + "latitude": 30.332901, + "longitude": -97.699932, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78753, + "latitude": 30.378554, + "longitude": -97.676445, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78754, + "latitude": 30.365596, + "longitude": -97.646734, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78755, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78756, + "latitude": 30.320606, + "longitude": -97.737583, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78757, + "latitude": 30.348567, + "longitude": -97.601444, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78758, + "latitude": 30.383637, + "longitude": -97.708233, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78759, + "latitude": 30.395586, + "longitude": -97.750611, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78760, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78761, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78762, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78763, + "latitude": 30.335398, + "longitude": -97.559807, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78764, + "latitude": 30.445502, + "longitude": -97.659533, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78765, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78766, + "latitude": 30.442202, + "longitude": -97.62333, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78767, + "latitude": 30.222007, + "longitude": -97.896285, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78768, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78769, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78772, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78773, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78774, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78778, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78779, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78780, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78781, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78783, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78785, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78786, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78788, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78789, + "latitude": 30.326374, + "longitude": -97.771258, + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78799, + "latitude": "", + "longitude": "", + "city": "Austin", + "state": "TX", + "county": "Travis" + }, + { + "zip_code": 78801, + "latitude": 29.240446, + "longitude": -99.727018, + "city": "Uvalde", + "state": "TX", + "county": "Uvalde" + }, + { + "zip_code": 78802, + "latitude": 29.223697, + "longitude": -99.779351, + "city": "Uvalde", + "state": "TX", + "county": "Uvalde" + }, + { + "zip_code": 78827, + "latitude": 28.448923, + "longitude": -99.759184, + "city": "Asherton", + "state": "TX", + "county": "Dimmit" + }, + { + "zip_code": 78828, + "latitude": 29.828166, + "longitude": -100.105033, + "city": "Barksdale", + "state": "TX", + "county": "Edwards" + }, + { + "zip_code": 78829, + "latitude": 28.959826, + "longitude": -99.621047, + "city": "Batesville", + "state": "TX", + "county": "Zavala" + }, + { + "zip_code": 78830, + "latitude": 28.569297, + "longitude": -99.570327, + "city": "Big Wells", + "state": "TX", + "county": "Dimmit" + }, + { + "zip_code": 78832, + "latitude": 29.299888, + "longitude": -100.421055, + "city": "Brackettville", + "state": "TX", + "county": "Kinney" + }, + { + "zip_code": 78833, + "latitude": 29.669203, + "longitude": -100.012219, + "city": "Camp Wood", + "state": "TX", + "county": "Real" + }, + { + "zip_code": 78834, + "latitude": 28.507128, + "longitude": -99.726018, + "city": "Carrizo Springs", + "state": "TX", + "county": "Dimmit" + }, + { + "zip_code": 78836, + "latitude": 28.42297, + "longitude": -99.75426, + "city": "Catarina", + "state": "TX", + "county": "Dimmit" + }, + { + "zip_code": 78837, + "latitude": 29.763171, + "longitude": -101.230032, + "city": "Comstock", + "state": "TX", + "county": "Val Verde" + }, + { + "zip_code": 78838, + "latitude": 29.357005, + "longitude": -99.762039, + "city": "Concan", + "state": "TX", + "county": "Uvalde" + }, + { + "zip_code": 78839, + "latitude": 28.69381, + "longitude": -99.824936, + "city": "Crystal City", + "state": "TX", + "county": "Zavala" + }, + { + "zip_code": 78840, + "latitude": 29.410195, + "longitude": -100.893202, + "city": "Del Rio", + "state": "TX", + "county": "Val Verde" + }, + { + "zip_code": 78841, + "latitude": 29.346518, + "longitude": -100.928864, + "city": "Del Rio", + "state": "TX", + "county": "Val Verde" + }, + { + "zip_code": 78842, + "latitude": 29.411955, + "longitude": -100.934216, + "city": "Del Rio", + "state": "TX", + "county": "Val Verde" + }, + { + "zip_code": 78843, + "latitude": 29.356379, + "longitude": -100.79269, + "city": "Laughlin A F B", + "state": "TX", + "county": "Val Verde" + }, + { + "zip_code": 78847, + "latitude": 29.763171, + "longitude": -101.230032, + "city": "Del Rio", + "state": "TX", + "county": "Val Verde" + }, + { + "zip_code": 78850, + "latitude": 29.339502, + "longitude": -99.321884, + "city": "D Hanis", + "state": "TX", + "county": "Medina" + }, + { + "zip_code": 78851, + "latitude": 30.218602, + "longitude": -102.106642, + "city": "Dryden", + "state": "TX", + "county": "Terrell" + }, + { + "zip_code": 78852, + "latitude": 28.781057, + "longitude": -100.312766, + "city": "Eagle Pass", + "state": "TX", + "county": "Maverick" + }, + { + "zip_code": 78853, + "latitude": 28.679006, + "longitude": -100.478373, + "city": "Eagle Pass", + "state": "TX", + "county": "Maverick" + }, + { + "zip_code": 78860, + "latitude": 28.529532, + "longitude": -100.334651, + "city": "El Indio", + "state": "TX", + "county": "Maverick" + }, + { + "zip_code": 78861, + "latitude": 29.398586, + "longitude": -99.176245, + "city": "Hondo", + "state": "TX", + "county": "Medina" + }, + { + "zip_code": 78870, + "latitude": 29.298401, + "longitude": -99.636636, + "city": "Knippa", + "state": "TX", + "county": "Uvalde" + }, + { + "zip_code": 78871, + "latitude": 29.763171, + "longitude": -101.230032, + "city": "Langtry", + "state": "TX", + "county": "Val Verde" + }, + { + "zip_code": 78872, + "latitude": 28.943649, + "longitude": -99.843874, + "city": "La Pryor", + "state": "TX", + "county": "Zavala" + }, + { + "zip_code": 78873, + "latitude": 29.865649, + "longitude": -99.686783, + "city": "Leakey", + "state": "TX", + "county": "Real" + }, + { + "zip_code": 78877, + "latitude": 28.641577, + "longitude": -100.389477, + "city": "Quemado", + "state": "TX", + "county": "Maverick" + }, + { + "zip_code": 78879, + "latitude": 29.84975, + "longitude": -99.768284, + "city": "Rio Frio", + "state": "TX", + "county": "Real" + }, + { + "zip_code": 78880, + "latitude": 30.017074, + "longitude": -100.212863, + "city": "Rocksprings", + "state": "TX", + "county": "Edwards" + }, + { + "zip_code": 78881, + "latitude": 29.321387, + "longitude": -99.468886, + "city": "Sabinal", + "state": "TX", + "county": "Uvalde" + }, + { + "zip_code": 78883, + "latitude": 29.729603, + "longitude": -99.191141, + "city": "Tarpley", + "state": "TX", + "county": "Bandera" + }, + { + "zip_code": 78884, + "latitude": 29.357005, + "longitude": -99.762039, + "city": "Utopia", + "state": "TX", + "county": "Uvalde" + }, + { + "zip_code": 78885, + "latitude": 29.729603, + "longitude": -99.191141, + "city": "Vanderpool", + "state": "TX", + "county": "Bandera" + }, + { + "zip_code": 78886, + "latitude": 29.236464, + "longitude": -99.145273, + "city": "Yancey", + "state": "TX", + "county": "Medina" + }, + { + "zip_code": 78931, + "latitude": 29.849283, + "longitude": -96.313271, + "city": "Bleiblerville", + "state": "TX", + "county": "Austin" + }, + { + "zip_code": 78932, + "latitude": 30.112343, + "longitude": -96.719014, + "city": "Carmine", + "state": "TX", + "county": "Fayette" + }, + { + "zip_code": 78933, + "latitude": 29.886715, + "longitude": -96.290838, + "city": "Cat Spring", + "state": "TX", + "county": "Austin" + }, + { + "zip_code": 78934, + "latitude": 29.69632, + "longitude": -96.592531, + "city": "Columbus", + "state": "TX", + "county": "Colorado" + }, + { + "zip_code": 78935, + "latitude": 29.709171, + "longitude": -96.486458, + "city": "Alleyton", + "state": "TX", + "county": "Colorado" + }, + { + "zip_code": 78938, + "latitude": 29.854599, + "longitude": -96.685111, + "city": "Ellinger", + "state": "TX", + "county": "Fayette" + }, + { + "zip_code": 78940, + "latitude": 29.859063, + "longitude": -96.845436, + "city": "Fayetteville", + "state": "TX", + "county": "Fayette" + }, + { + "zip_code": 78941, + "latitude": 29.782749, + "longitude": -97.111371, + "city": "Flatonia", + "state": "TX", + "county": "Fayette" + }, + { + "zip_code": 78942, + "latitude": 30.249357, + "longitude": -96.931852, + "city": "Giddings", + "state": "TX", + "county": "Lee" + }, + { + "zip_code": 78943, + "latitude": 29.699366, + "longitude": -96.5942, + "city": "Glidden", + "state": "TX", + "county": "Colorado" + }, + { + "zip_code": 78944, + "latitude": 29.977686, + "longitude": -96.451652, + "city": "Industry", + "state": "TX", + "county": "Austin" + }, + { + "zip_code": 78945, + "latitude": 29.896494, + "longitude": -96.872133, + "city": "La Grange", + "state": "TX", + "county": "Fayette" + }, + { + "zip_code": 78946, + "latitude": 30.09469, + "longitude": -96.795224, + "city": "Ledbetter", + "state": "TX", + "county": "Fayette" + }, + { + "zip_code": 78947, + "latitude": 30.405444, + "longitude": -97.020931, + "city": "Lexington", + "state": "TX", + "county": "Lee" + }, + { + "zip_code": 78948, + "latitude": 30.294922, + "longitude": -96.96599, + "city": "Lincoln", + "state": "TX", + "county": "Lee" + }, + { + "zip_code": 78949, + "latitude": 29.828348, + "longitude": -97.073122, + "city": "Muldoon", + "state": "TX", + "county": "Fayette" + }, + { + "zip_code": 78950, + "latitude": 29.913413, + "longitude": -96.496067, + "city": "New Ulm", + "state": "TX", + "county": "Austin" + }, + { + "zip_code": 78951, + "latitude": 29.60466, + "longitude": -96.524899, + "city": "Oakland", + "state": "TX", + "county": "Colorado" + }, + { + "zip_code": 78952, + "latitude": 29.896219, + "longitude": -96.943868, + "city": "Plum", + "state": "TX", + "county": "Fayette" + }, + { + "zip_code": 78953, + "latitude": 29.90847, + "longitude": -97.317608, + "city": "Rosanky", + "state": "TX", + "county": "Bastrop" + }, + { + "zip_code": 78954, + "latitude": 30.041719, + "longitude": -96.711265, + "city": "Round Top", + "state": "TX", + "county": "Fayette" + }, + { + "zip_code": 78956, + "latitude": 29.714899, + "longitude": -96.93382, + "city": "Schulenburg", + "state": "TX", + "county": "Fayette" + }, + { + "zip_code": 78957, + "latitude": 30.003401, + "longitude": -97.222121, + "city": "Smithville", + "state": "TX", + "county": "Bastrop" + }, + { + "zip_code": 78959, + "latitude": 29.693474, + "longitude": -97.299947, + "city": "Waelder", + "state": "TX", + "county": "Gonzales" + }, + { + "zip_code": 78960, + "latitude": 30.070244, + "longitude": -96.902035, + "city": "Warda", + "state": "TX", + "county": "Fayette" + }, + { + "zip_code": 78961, + "latitude": 29.665518, + "longitude": -97.039741, + "city": "Round Top", + "state": "TX", + "county": "Fayette" + }, + { + "zip_code": 78962, + "latitude": 29.675937, + "longitude": -96.743007, + "city": "Weimar", + "state": "TX", + "county": "Colorado" + }, + { + "zip_code": 78963, + "latitude": 29.914207, + "longitude": -97.053015, + "city": "West Point", + "state": "TX", + "county": "Fayette" + }, + { + "zip_code": 79001, + "latitude": 35.40527, + "longitude": -102.602749, + "city": "Adrian", + "state": "TX", + "county": "Oldham" + }, + { + "zip_code": 79002, + "latitude": 35.432839, + "longitude": -100.746559, + "city": "Alanreed", + "state": "TX", + "county": "Gray" + }, + { + "zip_code": 79003, + "latitude": 35.401181, + "longitude": -100.270306, + "city": "Allison", + "state": "TX", + "county": "Wheeler" + }, + { + "zip_code": 79005, + "latitude": 36.448291, + "longitude": -100.330411, + "city": "Booker", + "state": "TX", + "county": "Lipscomb" + }, + { + "zip_code": 79007, + "latitude": 35.728104, + "longitude": -101.487464, + "city": "Borger", + "state": "TX", + "county": "Hutchinson" + }, + { + "zip_code": 79008, + "latitude": 35.631621, + "longitude": -101.599447, + "city": "Borger", + "state": "TX", + "county": "Hutchinson" + }, + { + "zip_code": 79009, + "latitude": 34.519042, + "longitude": -102.784639, + "city": "Bovina", + "state": "TX", + "county": "Parmer" + }, + { + "zip_code": 79010, + "latitude": 35.40527, + "longitude": -102.602749, + "city": "Boys Ranch", + "state": "TX", + "county": "Oldham" + }, + { + "zip_code": 79011, + "latitude": 35.532082, + "longitude": -100.209628, + "city": "Briscoe", + "state": "TX", + "county": "Wheeler" + }, + { + "zip_code": 79012, + "latitude": 35.225625, + "longitude": -102.029919, + "city": "Bushland", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79013, + "latitude": 36.041191, + "longitude": -102.00075, + "city": "Cactus", + "state": "TX", + "county": "Moore" + }, + { + "zip_code": 79014, + "latitude": 35.904503, + "longitude": -100.384093, + "city": "Canadian", + "state": "TX", + "county": "Hemphill" + }, + { + "zip_code": 79015, + "latitude": 35.004998, + "longitude": -101.91008, + "city": "Canyon", + "state": "TX", + "county": "Randall" + }, + { + "zip_code": 79016, + "latitude": 34.96539, + "longitude": -101.895894, + "city": "Canyon", + "state": "TX", + "county": "Randall" + }, + { + "zip_code": 79018, + "latitude": 35.685842, + "longitude": -102.330294, + "city": "Channing", + "state": "TX", + "county": "Hartley" + }, + { + "zip_code": 79019, + "latitude": 35.133039, + "longitude": -101.460835, + "city": "Claude", + "state": "TX", + "county": "Armstrong" + }, + { + "zip_code": 79021, + "latitude": 34.068903, + "longitude": -101.826997, + "city": "Cotton Center", + "state": "TX", + "county": "Hale" + }, + { + "zip_code": 79022, + "latitude": 36.277826, + "longitude": -102.602022, + "city": "Dalhart", + "state": "TX", + "county": "Dallam" + }, + { + "zip_code": 79024, + "latitude": 36.445302, + "longitude": -100.325415, + "city": "Darrouzett", + "state": "TX", + "county": "Lipscomb" + }, + { + "zip_code": 79025, + "latitude": 34.910608, + "longitude": -102.200173, + "city": "Dawn", + "state": "TX", + "county": "Deaf Smith" + }, + { + "zip_code": 79027, + "latitude": 34.530453, + "longitude": -102.262133, + "city": "Dimmitt", + "state": "TX", + "county": "Castro" + }, + { + "zip_code": 79029, + "latitude": 35.9216, + "longitude": -101.92026, + "city": "Dumas", + "state": "TX", + "county": "Moore" + }, + { + "zip_code": 79031, + "latitude": 34.237177, + "longitude": -102.36276, + "city": "Earth", + "state": "TX", + "county": "Lamb" + }, + { + "zip_code": 79032, + "latitude": 34.278925, + "longitude": -101.894088, + "city": "Edmonson", + "state": "TX", + "county": "Hale" + }, + { + "zip_code": 79033, + "latitude": 36.391123, + "longitude": -100.761225, + "city": "Farnsworth", + "state": "TX", + "county": "Ochiltree" + }, + { + "zip_code": 79034, + "latitude": 36.433821, + "longitude": -100.139117, + "city": "Follett", + "state": "TX", + "county": "Lipscomb" + }, + { + "zip_code": 79035, + "latitude": 34.627408, + "longitude": -102.784361, + "city": "Friona", + "state": "TX", + "county": "Parmer" + }, + { + "zip_code": 79036, + "latitude": 35.663213, + "longitude": -101.575988, + "city": "Fritch", + "state": "TX", + "county": "Hutchinson" + }, + { + "zip_code": 79039, + "latitude": 35.276741, + "longitude": -101.232275, + "city": "Groom", + "state": "TX", + "county": "Carson" + }, + { + "zip_code": 79040, + "latitude": 36.230799, + "longitude": -101.310055, + "city": "Gruver", + "state": "TX", + "county": "Hansford" + }, + { + "zip_code": 79041, + "latitude": 34.064607, + "longitude": -101.845753, + "city": "Hale Center", + "state": "TX", + "county": "Hale" + }, + { + "zip_code": 79042, + "latitude": 34.741789, + "longitude": -101.857175, + "city": "Happy", + "state": "TX", + "county": "Swisher" + }, + { + "zip_code": 79043, + "latitude": 34.385133, + "longitude": -102.117552, + "city": "Hart", + "state": "TX", + "county": "Castro" + }, + { + "zip_code": 79044, + "latitude": 35.891634, + "longitude": -102.392664, + "city": "Hartley", + "state": "TX", + "county": "Hartley" + }, + { + "zip_code": 79045, + "latitude": 34.966095, + "longitude": -102.31309, + "city": "Hereford", + "state": "TX", + "county": "Deaf Smith" + }, + { + "zip_code": 79046, + "latitude": 36.118997, + "longitude": -100.027623, + "city": "Higgins", + "state": "TX", + "county": "Lipscomb" + }, + { + "zip_code": 79051, + "latitude": 36.277839, + "longitude": -102.602174, + "city": "Kerrick", + "state": "TX", + "county": "Dallam" + }, + { + "zip_code": 79052, + "latitude": 34.361722, + "longitude": -101.749905, + "city": "Kress", + "state": "TX", + "county": "Swisher" + }, + { + "zip_code": 79053, + "latitude": 34.52997, + "longitude": -102.784583, + "city": "Lazbuddie", + "state": "TX", + "county": "Parmer" + }, + { + "zip_code": 79054, + "latitude": 35.439056, + "longitude": -100.805869, + "city": "Lefors", + "state": "TX", + "county": "Gray" + }, + { + "zip_code": 79056, + "latitude": 36.277602, + "longitude": -100.273561, + "city": "Lipscomb", + "state": "TX", + "county": "Lipscomb" + }, + { + "zip_code": 79057, + "latitude": 35.231235, + "longitude": -100.60084, + "city": "Mclean", + "state": "TX", + "county": "Gray" + }, + { + "zip_code": 79058, + "latitude": 35.837775, + "longitude": -101.892846, + "city": "Masterson", + "state": "TX", + "county": "Moore" + }, + { + "zip_code": 79059, + "latitude": 35.71814, + "longitude": -100.676817, + "city": "Miami", + "state": "TX", + "county": "Roberts" + }, + { + "zip_code": 79061, + "latitude": 35.515434, + "longitude": -100.414781, + "city": "Mobeetie", + "state": "TX", + "county": "Wheeler" + }, + { + "zip_code": 79062, + "latitude": 36.277322, + "longitude": -101.354354, + "city": "Morse", + "state": "TX", + "county": "Hansford" + }, + { + "zip_code": 79063, + "latitude": 34.542943, + "longitude": -102.09605, + "city": "Nazareth", + "state": "TX", + "county": "Castro" + }, + { + "zip_code": 79064, + "latitude": 34.181129, + "longitude": -102.145562, + "city": "Olton", + "state": "TX", + "county": "Lamb" + }, + { + "zip_code": 79065, + "latitude": 35.515114, + "longitude": -100.836363, + "city": "Pampa", + "state": "TX", + "county": "Gray" + }, + { + "zip_code": 79066, + "latitude": 35.533384, + "longitude": -100.956013, + "city": "Pampa", + "state": "TX", + "county": "Gray" + }, + { + "zip_code": 79068, + "latitude": 35.296115, + "longitude": -101.345689, + "city": "Panhandle", + "state": "TX", + "county": "Carson" + }, + { + "zip_code": 79070, + "latitude": 36.408493, + "longitude": -100.687227, + "city": "Perryton", + "state": "TX", + "county": "Ochiltree" + }, + { + "zip_code": 79072, + "latitude": 34.068999, + "longitude": -101.82702, + "city": "Plainview", + "state": "TX", + "county": "Hale" + }, + { + "zip_code": 79073, + "latitude": 34.068903, + "longitude": -101.826997, + "city": "Plainview", + "state": "TX", + "county": "Hale" + }, + { + "zip_code": 79077, + "latitude": 34.840485, + "longitude": -100.204928, + "city": "Samnorwood", + "state": "TX", + "county": "Collingsworth" + }, + { + "zip_code": 79078, + "latitude": 35.672009, + "longitude": -101.574959, + "city": "Sanford", + "state": "TX", + "county": "Hutchinson" + }, + { + "zip_code": 79079, + "latitude": 35.315345, + "longitude": -100.272153, + "city": "Shamrock", + "state": "TX", + "county": "Wheeler" + }, + { + "zip_code": 79080, + "latitude": 35.569232, + "longitude": -101.172931, + "city": "Skellytown", + "state": "TX", + "county": "Carson" + }, + { + "zip_code": 79081, + "latitude": 36.226446, + "longitude": -101.294059, + "city": "Spearman", + "state": "TX", + "county": "Hansford" + }, + { + "zip_code": 79082, + "latitude": 34.23322, + "longitude": -102.307243, + "city": "Springlake", + "state": "TX", + "county": "Lamb" + }, + { + "zip_code": 79083, + "latitude": 35.823913, + "longitude": -101.445209, + "city": "Stinnett", + "state": "TX", + "county": "Hutchinson" + }, + { + "zip_code": 79084, + "latitude": 36.340796, + "longitude": -102.073587, + "city": "Stratford", + "state": "TX", + "county": "Sherman" + }, + { + "zip_code": 79085, + "latitude": 34.743735, + "longitude": -102.506442, + "city": "Summerfield", + "state": "TX", + "county": "Castro" + }, + { + "zip_code": 79086, + "latitude": 36.019612, + "longitude": -101.820002, + "city": "Sunray", + "state": "TX", + "county": "Moore" + }, + { + "zip_code": 79087, + "latitude": 36.337083, + "longitude": -102.916844, + "city": "Texline", + "state": "TX", + "county": "Dallam" + }, + { + "zip_code": 79088, + "latitude": 34.558293, + "longitude": -101.803862, + "city": "Tulia", + "state": "TX", + "county": "Swisher" + }, + { + "zip_code": 79091, + "latitude": 34.96539, + "longitude": -101.895894, + "city": "Umbarger", + "state": "TX", + "county": "Randall" + }, + { + "zip_code": 79092, + "latitude": 35.224143, + "longitude": -102.421407, + "city": "Vega", + "state": "TX", + "county": "Oldham" + }, + { + "zip_code": 79093, + "latitude": 36.278199, + "longitude": -100.815862, + "city": "Waka", + "state": "TX", + "county": "Ochiltree" + }, + { + "zip_code": 79094, + "latitude": 34.965329, + "longitude": -101.357838, + "city": "Wayside", + "state": "TX", + "county": "Armstrong" + }, + { + "zip_code": 79095, + "latitude": 34.852623, + "longitude": -100.21447, + "city": "Wellington", + "state": "TX", + "county": "Collingsworth" + }, + { + "zip_code": 79096, + "latitude": 35.394891, + "longitude": -100.224203, + "city": "Wheeler", + "state": "TX", + "county": "Wheeler" + }, + { + "zip_code": 79097, + "latitude": 35.414902, + "longitude": -101.176661, + "city": "White Deer", + "state": "TX", + "county": "Carson" + }, + { + "zip_code": 79098, + "latitude": 35.211942, + "longitude": -102.200425, + "city": "Wildorado", + "state": "TX", + "county": "Oldham" + }, + { + "zip_code": 79101, + "latitude": 35.205452, + "longitude": -101.795512, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79102, + "latitude": 35.200852, + "longitude": -101.851514, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79103, + "latitude": 35.195302, + "longitude": -101.744272, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79104, + "latitude": 35.205702, + "longitude": -101.777911, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79105, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79106, + "latitude": 35.248669, + "longitude": -101.942719, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79107, + "latitude": 35.273627, + "longitude": -101.744686, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79108, + "latitude": 35.293191, + "longitude": -101.772258, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79109, + "latitude": 35.11389, + "longitude": -101.847324, + "city": "Amarillo", + "state": "TX", + "county": "Randall" + }, + { + "zip_code": 79110, + "latitude": 35.131403, + "longitude": -101.856612, + "city": "Amarillo", + "state": "TX", + "county": "Randall" + }, + { + "zip_code": 79111, + "latitude": 35.258656, + "longitude": -101.698058, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79114, + "latitude": 35.050003, + "longitude": -101.817485, + "city": "Amarillo", + "state": "TX", + "county": "Randall" + }, + { + "zip_code": 79116, + "latitude": 35.245398, + "longitude": -101.999047, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79117, + "latitude": 35.308889, + "longitude": -101.843033, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79118, + "latitude": 35.098729, + "longitude": -101.806557, + "city": "Amarillo", + "state": "TX", + "county": "Randall" + }, + { + "zip_code": 79119, + "latitude": 35.060389, + "longitude": -102.017795, + "city": "Amarillo", + "state": "TX", + "county": "Randall" + }, + { + "zip_code": 79120, + "latitude": 35.196352, + "longitude": -101.803412, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79121, + "latitude": 35.142756, + "longitude": -101.992003, + "city": "Amarillo", + "state": "TX", + "county": "Randall" + }, + { + "zip_code": 79123, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79124, + "latitude": 35.252532, + "longitude": -101.939874, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79159, + "latitude": 35.216029, + "longitude": -102.071415, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79163, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79164, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79165, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79166, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79167, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79168, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79170, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79171, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79172, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79174, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79175, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79178, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79180, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79181, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79182, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79184, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79185, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79186, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79187, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79189, + "latitude": 35.401475, + "longitude": -101.895089, + "city": "Amarillo", + "state": "TX", + "county": "Potter" + }, + { + "zip_code": 79201, + "latitude": 34.4104, + "longitude": -100.236376, + "city": "Childress", + "state": "TX", + "county": "Childress" + }, + { + "zip_code": 79220, + "latitude": 33.616428, + "longitude": -100.779303, + "city": "Afton", + "state": "TX", + "county": "Dickens" + }, + { + "zip_code": 79221, + "latitude": 34.071514, + "longitude": -101.30313, + "city": "Aiken", + "state": "TX", + "county": "Floyd" + }, + { + "zip_code": 79222, + "latitude": 34.529678, + "longitude": -100.207642, + "city": "Carey", + "state": "TX", + "county": "Childress" + }, + { + "zip_code": 79223, + "latitude": 34.074854, + "longitude": -100.258156, + "city": "Cee Vee", + "state": "TX", + "county": "Cottle" + }, + { + "zip_code": 79224, + "latitude": 34.074854, + "longitude": -100.258156, + "city": "Chalk", + "state": "TX", + "county": "Cottle" + }, + { + "zip_code": 79225, + "latitude": 34.195699, + "longitude": -99.547098, + "city": "Chillicothe", + "state": "TX", + "county": "Hardeman" + }, + { + "zip_code": 79226, + "latitude": 34.968107, + "longitude": -100.891655, + "city": "Clarendon", + "state": "TX", + "county": "Donley" + }, + { + "zip_code": 79227, + "latitude": 33.968163, + "longitude": -99.641288, + "city": "Crowell", + "state": "TX", + "county": "Foard" + }, + { + "zip_code": 79229, + "latitude": 33.62196, + "longitude": -100.841745, + "city": "Dickens", + "state": "TX", + "county": "Dickens" + }, + { + "zip_code": 79230, + "latitude": 34.765663, + "longitude": -100.021258, + "city": "Dodson", + "state": "TX", + "county": "Collingsworth" + }, + { + "zip_code": 79231, + "latitude": 34.071514, + "longitude": -101.30313, + "city": "Dougherty", + "state": "TX", + "county": "Floyd" + }, + { + "zip_code": 79232, + "latitude": 33.616572, + "longitude": -100.254835, + "city": "Dumont", + "state": "TX", + "county": "King" + }, + { + "zip_code": 79233, + "latitude": 34.530559, + "longitude": -100.681047, + "city": "Estelline", + "state": "TX", + "county": "Hall" + }, + { + "zip_code": 79234, + "latitude": 34.073908, + "longitude": -100.779551, + "city": "Flomot", + "state": "TX", + "county": "Motley" + }, + { + "zip_code": 79235, + "latitude": 34.015814, + "longitude": -101.381126, + "city": "Floydada", + "state": "TX", + "county": "Floyd" + }, + { + "zip_code": 79236, + "latitude": 33.616723, + "longitude": -100.254782, + "city": "Guthrie", + "state": "TX", + "county": "King" + }, + { + "zip_code": 79237, + "latitude": 34.869376, + "longitude": -100.658936, + "city": "Hedley", + "state": "TX", + "county": "Donley" + }, + { + "zip_code": 79238, + "latitude": 34.529678, + "longitude": -100.207642, + "city": "Kirkland", + "state": "TX", + "county": "Childress" + }, + { + "zip_code": 79239, + "latitude": 34.672342, + "longitude": -100.696501, + "city": "Lakeview", + "state": "TX", + "county": "Hall" + }, + { + "zip_code": 79240, + "latitude": 34.965525, + "longitude": -100.814865, + "city": "Lelia Lake", + "state": "TX", + "county": "Donley" + }, + { + "zip_code": 79241, + "latitude": 34.123072, + "longitude": -101.443848, + "city": "Lockney", + "state": "TX", + "county": "Floyd" + }, + { + "zip_code": 79243, + "latitude": 33.616428, + "longitude": -100.779303, + "city": "Mcadoo", + "state": "TX", + "county": "Dickens" + }, + { + "zip_code": 79244, + "latitude": 34.01165, + "longitude": -100.820926, + "city": "Matador", + "state": "TX", + "county": "Motley" + }, + { + "zip_code": 79245, + "latitude": 34.730964, + "longitude": -100.539782, + "city": "Memphis", + "state": "TX", + "county": "Hall" + }, + { + "zip_code": 79247, + "latitude": 34.341985, + "longitude": -99.365767, + "city": "Odell", + "state": "TX", + "county": "Wilbarger" + }, + { + "zip_code": 79248, + "latitude": 34.02174, + "longitude": -100.298633, + "city": "Paducah", + "state": "TX", + "county": "Cottle" + }, + { + "zip_code": 79250, + "latitude": 33.86948, + "longitude": -101.596234, + "city": "Petersburg", + "state": "TX", + "county": "Hale" + }, + { + "zip_code": 79251, + "latitude": 34.964812, + "longitude": -100.270689, + "city": "Quail", + "state": "TX", + "county": "Collingsworth" + }, + { + "zip_code": 79252, + "latitude": 34.39086, + "longitude": -99.857216, + "city": "Quanah", + "state": "TX", + "county": "Hardeman" + }, + { + "zip_code": 79255, + "latitude": 34.380648, + "longitude": -101.087775, + "city": "Quitaque", + "state": "TX", + "county": "Briscoe" + }, + { + "zip_code": 79256, + "latitude": 33.901277, + "longitude": -100.857208, + "city": "Roaring Springs", + "state": "TX", + "county": "Motley" + }, + { + "zip_code": 79257, + "latitude": 34.471337, + "longitude": -101.30419, + "city": "Silverton", + "state": "TX", + "county": "Briscoe" + }, + { + "zip_code": 79258, + "latitude": 34.071514, + "longitude": -101.30313, + "city": "South Plains", + "state": "TX", + "county": "Floyd" + }, + { + "zip_code": 79259, + "latitude": 34.529678, + "longitude": -100.207642, + "city": "Tell", + "state": "TX", + "county": "Childress" + }, + { + "zip_code": 79261, + "latitude": 34.394837, + "longitude": -100.892561, + "city": "Turkey", + "state": "TX", + "county": "Hall" + }, + { + "zip_code": 79311, + "latitude": 33.949361, + "longitude": -101.81782, + "city": "Abernathy", + "state": "TX", + "county": "Hale" + }, + { + "zip_code": 79312, + "latitude": 34.02831, + "longitude": -102.425378, + "city": "Amherst", + "state": "TX", + "county": "Lamb" + }, + { + "zip_code": 79313, + "latitude": 33.770506, + "longitude": -102.192713, + "city": "Anton", + "state": "TX", + "county": "Hockley" + }, + { + "zip_code": 79314, + "latitude": 33.606603, + "longitude": -102.825745, + "city": "Bledsoe", + "state": "TX", + "county": "Cochran" + }, + { + "zip_code": 79316, + "latitude": 33.172013, + "longitude": -102.335299, + "city": "Brownfield", + "state": "TX", + "county": "Terry" + }, + { + "zip_code": 79320, + "latitude": 33.929317, + "longitude": -102.688297, + "city": "Bula", + "state": "TX", + "county": "Bailey" + }, + { + "zip_code": 79322, + "latitude": 33.616133, + "longitude": -101.306058, + "city": "Crosbyton", + "state": "TX", + "county": "Crosby" + }, + { + "zip_code": 79323, + "latitude": 33.005196, + "longitude": -102.851592, + "city": "Denver City", + "state": "TX", + "county": "Yoakum" + }, + { + "zip_code": 79324, + "latitude": 33.868293, + "longitude": -102.764582, + "city": "Enochs", + "state": "TX", + "county": "Bailey" + }, + { + "zip_code": 79325, + "latitude": 34.524376, + "longitude": -102.784569, + "city": "Farwell", + "state": "TX", + "county": "Parmer" + }, + { + "zip_code": 79326, + "latitude": 34.068938, + "longitude": -102.350649, + "city": "Fieldton", + "state": "TX", + "county": "Lamb" + }, + { + "zip_code": 79329, + "latitude": 33.593715, + "longitude": -101.814803, + "city": "Idalou", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79330, + "latitude": 33.179123, + "longitude": -101.298004, + "city": "Justiceburg", + "state": "TX", + "county": "Garza" + }, + { + "zip_code": 79331, + "latitude": 32.715593, + "longitude": -101.937544, + "city": "Lamesa", + "state": "TX", + "county": "Dawson" + }, + { + "zip_code": 79336, + "latitude": 33.606901, + "longitude": -102.345939, + "city": "Levelland", + "state": "TX", + "county": "Hockley" + }, + { + "zip_code": 79338, + "latitude": 33.593213, + "longitude": -102.362709, + "city": "Levelland", + "state": "TX", + "county": "Hockley" + }, + { + "zip_code": 79339, + "latitude": 34.063781, + "longitude": -102.413251, + "city": "Littlefield", + "state": "TX", + "county": "Lamb" + }, + { + "zip_code": 79342, + "latitude": 32.671468, + "longitude": -102.644589, + "city": "Loop", + "state": "TX", + "county": "Gaines" + }, + { + "zip_code": 79343, + "latitude": 33.621158, + "longitude": -101.300936, + "city": "Lorenzo", + "state": "TX", + "county": "Crosby" + }, + { + "zip_code": 79344, + "latitude": 33.863254, + "longitude": -102.955355, + "city": "Maple", + "state": "TX", + "county": "Bailey" + }, + { + "zip_code": 79345, + "latitude": 33.340812, + "longitude": -102.208876, + "city": "Meadow", + "state": "TX", + "county": "Terry" + }, + { + "zip_code": 79346, + "latitude": 33.667497, + "longitude": -102.690997, + "city": "Morton", + "state": "TX", + "county": "Cochran" + }, + { + "zip_code": 79347, + "latitude": 34.092391, + "longitude": -102.829924, + "city": "Muleshoe", + "state": "TX", + "county": "Bailey" + }, + { + "zip_code": 79350, + "latitude": 33.729589, + "longitude": -101.83551, + "city": "New Deal", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79351, + "latitude": 32.977027, + "longitude": -101.937148, + "city": "Odonnell", + "state": "TX", + "county": "Lynn" + }, + { + "zip_code": 79353, + "latitude": 33.778988, + "longitude": -102.466624, + "city": "Pep", + "state": "TX", + "county": "Hockley" + }, + { + "zip_code": 79355, + "latitude": 33.149263, + "longitude": -102.834676, + "city": "Plains", + "state": "TX", + "county": "Yoakum" + }, + { + "zip_code": 79356, + "latitude": 33.180889, + "longitude": -101.298072, + "city": "Post", + "state": "TX", + "county": "Garza" + }, + { + "zip_code": 79357, + "latitude": 33.68513, + "longitude": -101.383596, + "city": "Ralls", + "state": "TX", + "county": "Crosby" + }, + { + "zip_code": 79358, + "latitude": 33.451993, + "longitude": -102.285032, + "city": "Ropesville", + "state": "TX", + "county": "Hockley" + }, + { + "zip_code": 79359, + "latitude": 32.94248, + "longitude": -102.588484, + "city": "Seagraves", + "state": "TX", + "county": "Gaines" + }, + { + "zip_code": 79360, + "latitude": 32.671912, + "longitude": -102.805355, + "city": "Seminole", + "state": "TX", + "county": "Gaines" + }, + { + "zip_code": 79363, + "latitude": 33.714072, + "longitude": -102.00946, + "city": "Shallowater", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79364, + "latitude": 33.553496, + "longitude": -101.809124, + "city": "Slaton", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79366, + "latitude": 33.531329, + "longitude": -101.700776, + "city": "Ransom Canyon", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79367, + "latitude": 33.566955, + "longitude": -102.210086, + "city": "Smyer", + "state": "TX", + "county": "Hockley" + }, + { + "zip_code": 79369, + "latitude": 34.068938, + "longitude": -102.350649, + "city": "Spade", + "state": "TX", + "county": "Lamb" + }, + { + "zip_code": 79370, + "latitude": 33.471532, + "longitude": -100.802023, + "city": "Spur", + "state": "TX", + "county": "Dickens" + }, + { + "zip_code": 79371, + "latitude": 34.047934, + "longitude": -102.526312, + "city": "Sudan", + "state": "TX", + "county": "Lamb" + }, + { + "zip_code": 79372, + "latitude": 33.494472, + "longitude": -102.438638, + "city": "Sundown", + "state": "TX", + "county": "Hockley" + }, + { + "zip_code": 79373, + "latitude": 33.178077, + "longitude": -101.816443, + "city": "Tahoka", + "state": "TX", + "county": "Lynn" + }, + { + "zip_code": 79376, + "latitude": 33.173518, + "longitude": -102.829456, + "city": "Tokio", + "state": "TX", + "county": "Yoakum" + }, + { + "zip_code": 79377, + "latitude": 32.929753, + "longitude": -102.127798, + "city": "Welch", + "state": "TX", + "county": "Dawson" + }, + { + "zip_code": 79378, + "latitude": 33.047275, + "longitude": -102.428171, + "city": "Wellman", + "state": "TX", + "county": "Terry" + }, + { + "zip_code": 79379, + "latitude": 33.598837, + "longitude": -102.619882, + "city": "Whiteface", + "state": "TX", + "county": "Cochran" + }, + { + "zip_code": 79380, + "latitude": 33.74566, + "longitude": -102.320586, + "city": "Whitharral", + "state": "TX", + "county": "Hockley" + }, + { + "zip_code": 79381, + "latitude": 33.318712, + "longitude": -101.725673, + "city": "Wilson", + "state": "TX", + "county": "Lynn" + }, + { + "zip_code": 79382, + "latitude": 33.563121, + "longitude": -102.026405, + "city": "Wolfforth", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79383, + "latitude": 33.177231, + "longitude": -101.816432, + "city": "New Home", + "state": "TX", + "county": "Lynn" + }, + { + "zip_code": 79401, + "latitude": 33.607701, + "longitude": -101.842056, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79402, + "latitude": 33.592235, + "longitude": -101.851144, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79403, + "latitude": 33.582684, + "longitude": -101.835604, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79404, + "latitude": 33.562452, + "longitude": -101.821415, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79405, + "latitude": 33.578735, + "longitude": -101.850044, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79406, + "latitude": 33.604197, + "longitude": -101.894137, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79407, + "latitude": 33.555775, + "longitude": -101.989408, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79408, + "latitude": 33.565926, + "longitude": -101.92669, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79409, + "latitude": 33.610018, + "longitude": -101.821292, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79410, + "latitude": 33.572085, + "longitude": -101.896394, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79411, + "latitude": 33.570485, + "longitude": -101.862944, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79412, + "latitude": 33.528692, + "longitude": -101.931, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79413, + "latitude": 33.546285, + "longitude": -101.888794, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79414, + "latitude": 33.576284, + "longitude": -101.923415, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79415, + "latitude": 33.675714, + "longitude": -101.906553, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79416, + "latitude": 33.587073, + "longitude": -101.957394, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79423, + "latitude": 33.472975, + "longitude": -101.896714, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79424, + "latitude": 33.492483, + "longitude": -101.983125, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79430, + "latitude": 33.610018, + "longitude": -101.821292, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79452, + "latitude": 33.610018, + "longitude": -101.821292, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79453, + "latitude": 33.610018, + "longitude": -101.821292, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79457, + "latitude": 33.610018, + "longitude": -101.821292, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79464, + "latitude": 33.489623, + "longitude": -102.010895, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79490, + "latitude": 33.610018, + "longitude": -101.821292, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79491, + "latitude": 33.610018, + "longitude": -101.821292, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79493, + "latitude": 33.610018, + "longitude": -101.821292, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79499, + "latitude": 33.610018, + "longitude": -101.821292, + "city": "Lubbock", + "state": "TX", + "county": "Lubbock" + }, + { + "zip_code": 79501, + "latitude": 32.765623, + "longitude": -99.854766, + "city": "Anson", + "state": "TX", + "county": "Jones" + }, + { + "zip_code": 79502, + "latitude": 33.139647, + "longitude": -100.224966, + "city": "Aspermont", + "state": "TX", + "county": "Stonewall" + }, + { + "zip_code": 79503, + "latitude": 32.749919, + "longitude": -99.783771, + "city": "Avoca", + "state": "TX", + "county": "Jones" + }, + { + "zip_code": 79504, + "latitude": 32.322053, + "longitude": -99.335495, + "city": "Baird", + "state": "TX", + "county": "Callahan" + }, + { + "zip_code": 79505, + "latitude": 33.599303, + "longitude": -99.884689, + "city": "Benjamin", + "state": "TX", + "county": "Knox" + }, + { + "zip_code": 79506, + "latitude": 32.175814, + "longitude": -100.289569, + "city": "Blackwell", + "state": "TX", + "county": "Nolan" + }, + { + "zip_code": 79508, + "latitude": 32.289413, + "longitude": -99.810319, + "city": "Buffalo Gap", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79510, + "latitude": 32.297559, + "longitude": -99.412891, + "city": "Clyde", + "state": "TX", + "county": "Callahan" + }, + { + "zip_code": 79511, + "latitude": 32.299597, + "longitude": -101.343248, + "city": "Coahoma", + "state": "TX", + "county": "Howard" + }, + { + "zip_code": 79512, + "latitude": 32.340912, + "longitude": -100.900564, + "city": "Colorado City", + "state": "TX", + "county": "Mitchell" + }, + { + "zip_code": 79516, + "latitude": 32.747707, + "longitude": -100.9153, + "city": "Dunn", + "state": "TX", + "county": "Scurry" + }, + { + "zip_code": 79517, + "latitude": 32.853009, + "longitude": -101.103033, + "city": "Fluvanna", + "state": "TX", + "county": "Scurry" + }, + { + "zip_code": 79518, + "latitude": 33.336305, + "longitude": -100.774317, + "city": "Girard", + "state": "TX", + "county": "Kent" + }, + { + "zip_code": 79519, + "latitude": 32.058222, + "longitude": -99.686094, + "city": "Goldsboro", + "state": "TX", + "county": "Coleman" + }, + { + "zip_code": 79520, + "latitude": 32.817535, + "longitude": -99.967329, + "city": "Hamlin", + "state": "TX", + "county": "Jones" + }, + { + "zip_code": 79521, + "latitude": 33.207016, + "longitude": -99.717417, + "city": "Haskell", + "state": "TX", + "county": "Haskell" + }, + { + "zip_code": 79525, + "latitude": 32.642251, + "longitude": -99.923862, + "city": "Hawley", + "state": "TX", + "county": "Jones" + }, + { + "zip_code": 79526, + "latitude": 32.666914, + "longitude": -100.789448, + "city": "Hermleigh", + "state": "TX", + "county": "Scurry" + }, + { + "zip_code": 79527, + "latitude": 32.646004, + "longitude": -101.030102, + "city": "Ira", + "state": "TX", + "county": "Scurry" + }, + { + "zip_code": 79528, + "latitude": 33.185031, + "longitude": -100.646103, + "city": "Jayton", + "state": "TX", + "county": "Kent" + }, + { + "zip_code": 79529, + "latitude": 33.493579, + "longitude": -99.812671, + "city": "Knox City", + "state": "TX", + "county": "Knox" + }, + { + "zip_code": 79530, + "latitude": 32.128322, + "longitude": -99.823884, + "city": "Lawn", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79532, + "latitude": 32.378102, + "longitude": -100.759165, + "city": "Loraine", + "state": "TX", + "county": "Mitchell" + }, + { + "zip_code": 79533, + "latitude": 32.815151, + "longitude": -99.745175, + "city": "Lueders", + "state": "TX", + "county": "Jones" + }, + { + "zip_code": 79534, + "latitude": 32.753257, + "longitude": -100.232805, + "city": "Mc Caulley", + "state": "TX", + "county": "Fisher" + }, + { + "zip_code": 79535, + "latitude": 32.180499, + "longitude": -100.424987, + "city": "Maryneal", + "state": "TX", + "county": "Nolan" + }, + { + "zip_code": 79536, + "latitude": 32.329643, + "longitude": -99.939593, + "city": "Merkel", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79537, + "latitude": 32.272581, + "longitude": -100.218794, + "city": "Nolan", + "state": "TX", + "county": "Nolan" + }, + { + "zip_code": 79538, + "latitude": 31.953707, + "longitude": -99.605724, + "city": "Novice", + "state": "TX", + "county": "Coleman" + }, + { + "zip_code": 79539, + "latitude": 33.286038, + "longitude": -99.847301, + "city": "O Brien", + "state": "TX", + "county": "Haskell" + }, + { + "zip_code": 79540, + "latitude": 33.178927, + "longitude": -100.254017, + "city": "Old Glory", + "state": "TX", + "county": "Stonewall" + }, + { + "zip_code": 79541, + "latitude": 32.155364, + "longitude": -99.873296, + "city": "Ovalo", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79543, + "latitude": 32.749277, + "longitude": -100.338798, + "city": "Roby", + "state": "TX", + "county": "Fisher" + }, + { + "zip_code": 79544, + "latitude": 33.331926, + "longitude": -99.781154, + "city": "Rochester", + "state": "TX", + "county": "Haskell" + }, + { + "zip_code": 79545, + "latitude": 32.384442, + "longitude": -100.572217, + "city": "Roscoe", + "state": "TX", + "county": "Nolan" + }, + { + "zip_code": 79546, + "latitude": 32.837949, + "longitude": -100.489193, + "city": "Rotan", + "state": "TX", + "county": "Fisher" + }, + { + "zip_code": 79547, + "latitude": 33.181, + "longitude": -99.854024, + "city": "Rule", + "state": "TX", + "county": "Haskell" + }, + { + "zip_code": 79548, + "latitude": 33.077086, + "longitude": -99.958978, + "city": "Rule", + "state": "TX", + "county": "Haskell" + }, + { + "zip_code": 79549, + "latitude": 32.745073, + "longitude": -100.917479, + "city": "Snyder", + "state": "TX", + "county": "Scurry" + }, + { + "zip_code": 79550, + "latitude": 32.747707, + "longitude": -100.9153, + "city": "Snyder", + "state": "TX", + "county": "Scurry" + }, + { + "zip_code": 79553, + "latitude": 32.869561, + "longitude": -99.808377, + "city": "Stamford", + "state": "TX", + "county": "Jones" + }, + { + "zip_code": 79556, + "latitude": 32.308289, + "longitude": -100.404514, + "city": "Sweetwater", + "state": "TX", + "county": "Nolan" + }, + { + "zip_code": 79560, + "latitude": 32.708935, + "longitude": -100.234051, + "city": "Sylvester", + "state": "TX", + "county": "Fisher" + }, + { + "zip_code": 79561, + "latitude": 32.472234, + "longitude": -100.065421, + "city": "Trent", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79562, + "latitude": 32.300287, + "longitude": -99.909752, + "city": "Tuscola", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79563, + "latitude": 32.432954, + "longitude": -99.924042, + "city": "Tye", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79565, + "latitude": 32.362705, + "longitude": -101.043022, + "city": "Westbrook", + "state": "TX", + "county": "Mitchell" + }, + { + "zip_code": 79566, + "latitude": 32.031119, + "longitude": -100.131927, + "city": "Wingate", + "state": "TX", + "county": "Runnels" + }, + { + "zip_code": 79567, + "latitude": 31.951207, + "longitude": -99.955406, + "city": "Winters", + "state": "TX", + "county": "Runnels" + }, + { + "zip_code": 79601, + "latitude": 32.344457, + "longitude": -99.80213, + "city": "Abilene", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79602, + "latitude": 32.342605, + "longitude": -99.694283, + "city": "Abilene", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79603, + "latitude": 32.418824, + "longitude": -99.880368, + "city": "Abilene", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79604, + "latitude": 32.428796, + "longitude": -99.795167, + "city": "Abilene", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79605, + "latitude": 32.370484, + "longitude": -99.814693, + "city": "Abilene", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79606, + "latitude": 32.303126, + "longitude": -99.908645, + "city": "Abilene", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79607, + "latitude": 32.427052, + "longitude": -99.745385, + "city": "Dyess Afb", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79608, + "latitude": 32.302132, + "longitude": -99.890737, + "city": "Abilene", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79697, + "latitude": 32.302132, + "longitude": -99.890737, + "city": "Abilene", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79698, + "latitude": 32.475074, + "longitude": -99.73484, + "city": "Abilene", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79699, + "latitude": 32.466474, + "longitude": -99.711665, + "city": "Abilene", + "state": "TX", + "county": "Taylor" + }, + { + "zip_code": 79701, + "latitude": 31.861876, + "longitude": -102.091276, + "city": "Midland", + "state": "TX", + "county": "Midland" + }, + { + "zip_code": 79702, + "latitude": 31.963698, + "longitude": -102.080064, + "city": "Midland", + "state": "TX", + "county": "Midland" + }, + { + "zip_code": 79703, + "latitude": 31.973312, + "longitude": -102.134352, + "city": "Midland", + "state": "TX", + "county": "Midland" + }, + { + "zip_code": 79704, + "latitude": 31.869259, + "longitude": -102.031726, + "city": "Midland", + "state": "TX", + "county": "Midland" + }, + { + "zip_code": 79705, + "latitude": 32.046146, + "longitude": -102.073493, + "city": "Midland", + "state": "TX", + "county": "Midland" + }, + { + "zip_code": 79706, + "latitude": 31.881592, + "longitude": -102.01343, + "city": "Midland", + "state": "TX", + "county": "Midland" + }, + { + "zip_code": 79707, + "latitude": 32.008395, + "longitude": -102.185691, + "city": "Midland", + "state": "TX", + "county": "Midland" + }, + { + "zip_code": 79708, + "latitude": 31.869259, + "longitude": -102.031726, + "city": "Midland", + "state": "TX", + "county": "Midland" + }, + { + "zip_code": 79710, + "latitude": 31.869259, + "longitude": -102.031726, + "city": "Midland", + "state": "TX", + "county": "Midland" + }, + { + "zip_code": 79711, + "latitude": 31.869259, + "longitude": -102.031726, + "city": "Midland", + "state": "TX", + "county": "Midland" + }, + { + "zip_code": 79712, + "latitude": 31.869259, + "longitude": -102.031726, + "city": "Midland", + "state": "TX", + "county": "Midland" + }, + { + "zip_code": 79713, + "latitude": 32.527337, + "longitude": -101.715971, + "city": "Ackerly", + "state": "TX", + "county": "Dawson" + }, + { + "zip_code": 79714, + "latitude": 32.370377, + "longitude": -102.523255, + "city": "Andrews", + "state": "TX", + "county": "Andrews" + }, + { + "zip_code": 79718, + "latitude": 31.383297, + "longitude": -103.556598, + "city": "Balmorhea", + "state": "TX", + "county": "Reeves" + }, + { + "zip_code": 79719, + "latitude": 31.453665, + "longitude": -103.420615, + "city": "Barstow", + "state": "TX", + "county": "Ward" + }, + { + "zip_code": 79720, + "latitude": 32.278703, + "longitude": -101.457761, + "city": "Big Spring", + "state": "TX", + "county": "Howard" + }, + { + "zip_code": 79721, + "latitude": 32.27328, + "longitude": -101.373968, + "city": "Big Spring", + "state": "TX", + "county": "Howard" + }, + { + "zip_code": 79730, + "latitude": 30.711984, + "longitude": -102.676783, + "city": "Coyanosa", + "state": "TX", + "county": "Pecos" + }, + { + "zip_code": 79731, + "latitude": 31.500553, + "longitude": -102.347243, + "city": "Crane", + "state": "TX", + "county": "Crane" + }, + { + "zip_code": 79733, + "latitude": 32.110537, + "longitude": -101.366949, + "city": "Forsan", + "state": "TX", + "county": "Howard" + }, + { + "zip_code": 79734, + "latitude": 30.758682, + "longitude": -104.209994, + "city": "Fort Davis", + "state": "TX", + "county": "Jeff Davis" + }, + { + "zip_code": 79735, + "latitude": 30.886367, + "longitude": -102.890491, + "city": "Fort Stockton", + "state": "TX", + "county": "Pecos" + }, + { + "zip_code": 79738, + "latitude": 32.743795, + "longitude": -101.432354, + "city": "Gail", + "state": "TX", + "county": "Borden" + }, + { + "zip_code": 79739, + "latitude": 31.864331, + "longitude": -101.49375, + "city": "Garden City", + "state": "TX", + "county": "Glasscock" + }, + { + "zip_code": 79740, + "latitude": 30.711984, + "longitude": -102.676783, + "city": "Girvin", + "state": "TX", + "county": "Pecos" + }, + { + "zip_code": 79741, + "latitude": 31.981472, + "longitude": -102.615727, + "city": "Goldsmith", + "state": "TX", + "county": "Ector" + }, + { + "zip_code": 79742, + "latitude": 31.340332, + "longitude": -102.854027, + "city": "Grandfalls", + "state": "TX", + "county": "Ward" + }, + { + "zip_code": 79743, + "latitude": 30.711984, + "longitude": -102.676783, + "city": "Imperial", + "state": "TX", + "county": "Pecos" + }, + { + "zip_code": 79744, + "latitude": 30.914993, + "longitude": -101.899569, + "city": "Iraan", + "state": "TX", + "county": "Pecos" + }, + { + "zip_code": 79745, + "latitude": 31.808357, + "longitude": -103.1135, + "city": "Kermit", + "state": "TX", + "county": "Winkler" + }, + { + "zip_code": 79748, + "latitude": 32.378209, + "longitude": -101.61263, + "city": "Knott", + "state": "TX", + "county": "Howard" + }, + { + "zip_code": 79749, + "latitude": 32.258885, + "longitude": -101.844195, + "city": "Lenorah", + "state": "TX", + "county": "Martin" + }, + { + "zip_code": 79752, + "latitude": 31.16157, + "longitude": -102.107279, + "city": "Mc Camey", + "state": "TX", + "county": "Upton" + }, + { + "zip_code": 79754, + "latitude": 31.825466, + "longitude": -103.65528, + "city": "Mentone", + "state": "TX", + "county": "Loving" + }, + { + "zip_code": 79755, + "latitude": 31.365814, + "longitude": -102.04652, + "city": "Midkiff", + "state": "TX", + "county": "Upton" + }, + { + "zip_code": 79756, + "latitude": 31.548092, + "longitude": -102.943277, + "city": "Monahans", + "state": "TX", + "county": "Ward" + }, + { + "zip_code": 79758, + "latitude": 32.028014, + "longitude": -102.340552, + "city": "Gardendale", + "state": "TX", + "county": "Ector" + }, + { + "zip_code": 79759, + "latitude": 31.869142, + "longitude": -102.542944, + "city": "Notrees", + "state": "TX", + "county": "Ector" + }, + { + "zip_code": 79760, + "latitude": 31.765163, + "longitude": -102.354346, + "city": "Odessa", + "state": "TX", + "county": "Ector" + }, + { + "zip_code": 79761, + "latitude": 31.854178, + "longitude": -102.35022, + "city": "Odessa", + "state": "TX", + "county": "Ector" + }, + { + "zip_code": 79762, + "latitude": 31.893906, + "longitude": -102.353839, + "city": "Odessa", + "state": "TX", + "county": "Ector" + }, + { + "zip_code": 79763, + "latitude": 31.796965, + "longitude": -102.440113, + "city": "Odessa", + "state": "TX", + "county": "Ector" + }, + { + "zip_code": 79764, + "latitude": 31.88967, + "longitude": -102.482783, + "city": "Odessa", + "state": "TX", + "county": "Ector" + }, + { + "zip_code": 79765, + "latitude": 31.880682, + "longitude": -102.347889, + "city": "Odessa", + "state": "TX", + "county": "Ector" + }, + { + "zip_code": 79766, + "latitude": 31.769701, + "longitude": -102.345518, + "city": "Odessa", + "state": "TX", + "county": "Ector" + }, + { + "zip_code": 79768, + "latitude": 31.869142, + "longitude": -102.542944, + "city": "Odessa", + "state": "TX", + "county": "Ector" + }, + { + "zip_code": 79769, + "latitude": 31.746572, + "longitude": -102.566993, + "city": "Odessa", + "state": "TX", + "county": "Ector" + }, + { + "zip_code": 79770, + "latitude": 31.383297, + "longitude": -103.556598, + "city": "Orla", + "state": "TX", + "county": "Reeves" + }, + { + "zip_code": 79772, + "latitude": 31.446678, + "longitude": -103.57906, + "city": "Pecos", + "state": "TX", + "county": "Reeves" + }, + { + "zip_code": 79776, + "latitude": 31.733396, + "longitude": -102.587906, + "city": "Penwell", + "state": "TX", + "county": "Ector" + }, + { + "zip_code": 79777, + "latitude": 31.538694, + "longitude": -103.126666, + "city": "Pyote", + "state": "TX", + "county": "Ward" + }, + { + "zip_code": 79778, + "latitude": 31.226573, + "longitude": -101.944129, + "city": "Rankin", + "state": "TX", + "county": "Upton" + }, + { + "zip_code": 79779, + "latitude": 31.459448, + "longitude": -103.188993, + "city": "Royalty", + "state": "TX", + "county": "Ward" + }, + { + "zip_code": 79780, + "latitude": 31.383297, + "longitude": -103.556598, + "city": "Saragosa", + "state": "TX", + "county": "Reeves" + }, + { + "zip_code": 79781, + "latitude": 30.711984, + "longitude": -102.676783, + "city": "Sheffield", + "state": "TX", + "county": "Pecos" + }, + { + "zip_code": 79782, + "latitude": 32.200014, + "longitude": -101.823066, + "city": "Stanton", + "state": "TX", + "county": "Martin" + }, + { + "zip_code": 79783, + "latitude": 32.306026, + "longitude": -101.949963, + "city": "Tarzan", + "state": "TX", + "county": "Martin" + }, + { + "zip_code": 79785, + "latitude": 31.383297, + "longitude": -103.556598, + "city": "Toyah", + "state": "TX", + "county": "Reeves" + }, + { + "zip_code": 79786, + "latitude": 31.383297, + "longitude": -103.556598, + "city": "Toyahvale", + "state": "TX", + "county": "Reeves" + }, + { + "zip_code": 79788, + "latitude": 31.569243, + "longitude": -103.006747, + "city": "Wickett", + "state": "TX", + "county": "Ward" + }, + { + "zip_code": 79789, + "latitude": 31.755315, + "longitude": -103.155748, + "city": "Wink", + "state": "TX", + "county": "Winkler" + }, + { + "zip_code": 79821, + "latitude": 31.725097, + "longitude": -106.359795, + "city": "Anthony", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79830, + "latitude": 30.357926, + "longitude": -103.66029, + "city": "Alpine", + "state": "TX", + "county": "Brewster" + }, + { + "zip_code": 79831, + "latitude": 30.436562, + "longitude": -103.70439, + "city": "Alpine", + "state": "TX", + "county": "Brewster" + }, + { + "zip_code": 79832, + "latitude": 30.363139, + "longitude": -103.653904, + "city": "Alpine", + "state": "TX", + "county": "Brewster" + }, + { + "zip_code": 79834, + "latitude": 29.818742, + "longitude": -103.060715, + "city": "Big Bend National Park", + "state": "TX", + "county": "Brewster" + }, + { + "zip_code": 79835, + "latitude": 31.907296, + "longitude": -106.596493, + "city": "Canutillo", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79836, + "latitude": 31.510446, + "longitude": -106.145329, + "city": "Clint", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79837, + "latitude": 31.958194, + "longitude": -105.201061, + "city": "Dell City", + "state": "TX", + "county": "Hudspeth" + }, + { + "zip_code": 79838, + "latitude": 31.519675, + "longitude": -106.20338, + "city": "Fabens", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79839, + "latitude": 31.315723, + "longitude": -105.452562, + "city": "Fort Hancock", + "state": "TX", + "county": "Hudspeth" + }, + { + "zip_code": 79842, + "latitude": 29.818742, + "longitude": -103.060715, + "city": "Marathon", + "state": "TX", + "county": "Brewster" + }, + { + "zip_code": 79843, + "latitude": 30.351902, + "longitude": -104.018475, + "city": "Marfa", + "state": "TX", + "county": "Presidio" + }, + { + "zip_code": 79845, + "latitude": 29.572128, + "longitude": -104.372626, + "city": "Presidio", + "state": "TX", + "county": "Presidio" + }, + { + "zip_code": 79846, + "latitude": 29.943719, + "longitude": -104.386683, + "city": "Redford", + "state": "TX", + "county": "Presidio" + }, + { + "zip_code": 79847, + "latitude": 31.315723, + "longitude": -105.452562, + "city": "Salt Flat", + "state": "TX", + "county": "Hudspeth" + }, + { + "zip_code": 79848, + "latitude": 30.252946, + "longitude": -102.162882, + "city": "Sanderson", + "state": "TX", + "county": "Terrell" + }, + { + "zip_code": 79849, + "latitude": 31.550844, + "longitude": -106.250732, + "city": "San Elizario", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79850, + "latitude": 29.943719, + "longitude": -104.386683, + "city": "Shafter", + "state": "TX", + "county": "Presidio" + }, + { + "zip_code": 79851, + "latitude": 31.315723, + "longitude": -105.452562, + "city": "Sierra Blanca", + "state": "TX", + "county": "Hudspeth" + }, + { + "zip_code": 79852, + "latitude": 29.818742, + "longitude": -103.060715, + "city": "Terlingua", + "state": "TX", + "county": "Brewster" + }, + { + "zip_code": 79853, + "latitude": 31.440685, + "longitude": -106.076524, + "city": "Tornillo", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79854, + "latitude": 30.758682, + "longitude": -104.209994, + "city": "Valentine", + "state": "TX", + "county": "Jeff Davis" + }, + { + "zip_code": 79855, + "latitude": 31.03912, + "longitude": -104.824473, + "city": "Van Horn", + "state": "TX", + "county": "Culberson" + }, + { + "zip_code": 79901, + "latitude": 31.763608, + "longitude": -106.484592, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79902, + "latitude": 31.879779, + "longitude": -106.544218, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79903, + "latitude": 31.786857, + "longitude": -106.445291, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79904, + "latitude": 31.868055, + "longitude": -106.44904, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79905, + "latitude": 31.767758, + "longitude": -106.438791, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79906, + "latitude": 31.809164, + "longitude": -106.424711, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79907, + "latitude": 31.71251, + "longitude": -106.328464, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79908, + "latitude": 31.826457, + "longitude": -106.385684, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79910, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79911, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79912, + "latitude": 31.897242, + "longitude": -106.564782, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79913, + "latitude": 31.93728, + "longitude": -106.572393, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79914, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79915, + "latitude": 31.746559, + "longitude": -106.372089, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79916, + "latitude": 31.744353, + "longitude": -106.287923, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79917, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79918, + "latitude": 31.831782, + "longitude": -106.390656, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79920, + "latitude": 31.821439, + "longitude": -106.461405, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79922, + "latitude": 31.802756, + "longitude": -106.545393, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79923, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79924, + "latitude": 31.87224, + "longitude": -106.502841, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79925, + "latitude": 31.773452, + "longitude": -106.37709, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79926, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79927, + "latitude": 31.660671, + "longitude": -106.176474, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79928, + "latitude": "", + "longitude": "", + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79929, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79930, + "latitude": 31.809457, + "longitude": -106.464242, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79931, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79932, + "latitude": 31.877386, + "longitude": -106.607588, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79934, + "latitude": 31.963221, + "longitude": -106.39227, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79935, + "latitude": 31.770111, + "longitude": -106.331988, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79936, + "latitude": 31.711209, + "longitude": -106.243004, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79937, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79938, + "latitude": 31.849828, + "longitude": -106.3044, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79940, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79941, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79942, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79943, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79944, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79945, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79946, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79947, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79948, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79949, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79950, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79951, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79952, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79953, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79954, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79955, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79958, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79960, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79961, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79966, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79968, + "latitude": 31.770458, + "longitude": -106.504843, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79973, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79974, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79975, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79976, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79977, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79978, + "latitude": 31.799275, + "longitude": -106.382757, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79980, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79982, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79983, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79984, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79985, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79986, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79987, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79988, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79989, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79990, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79991, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79992, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79993, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79994, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79995, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79996, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79997, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79998, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 79999, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 80001, + "latitude": 39.522014, + "longitude": -105.223945, + "city": "Arvada", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80002, + "latitude": 39.827818, + "longitude": -105.109236, + "city": "Arvada", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80003, + "latitude": 39.835086, + "longitude": -105.105775, + "city": "Arvada", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80004, + "latitude": 39.814481, + "longitude": -105.128173, + "city": "Arvada", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80005, + "latitude": 39.857259, + "longitude": -105.12344, + "city": "Arvada", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80006, + "latitude": 39.522014, + "longitude": -105.223945, + "city": "Arvada", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80007, + "latitude": 39.863369, + "longitude": -105.172429, + "city": "Arvada", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80010, + "latitude": 39.715287, + "longitude": -104.84748, + "city": "Aurora", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80011, + "latitude": 39.788286, + "longitude": -104.822765, + "city": "Aurora", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80012, + "latitude": 39.681201, + "longitude": -104.80973, + "city": "Aurora", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80013, + "latitude": 39.660654, + "longitude": -104.76275, + "city": "Aurora", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80014, + "latitude": 39.660437, + "longitude": -104.82933, + "city": "Aurora", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80015, + "latitude": 39.667429, + "longitude": -104.775265, + "city": "Aurora", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80016, + "latitude": 39.601172, + "longitude": -104.739428, + "city": "Aurora", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80017, + "latitude": 39.702142, + "longitude": -104.80667, + "city": "Aurora", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80018, + "latitude": 39.689487, + "longitude": -104.67982, + "city": "Aurora", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80019, + "latitude": 39.781442, + "longitude": -104.685374, + "city": "Aurora", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80020, + "latitude": 40.046064, + "longitude": -105.097151, + "city": "Broomfield", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80021, + "latitude": 39.885388, + "longitude": -105.11389, + "city": "Broomfield", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80022, + "latitude": 39.869835, + "longitude": -104.771527, + "city": "Commerce City", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80024, + "latitude": 39.844501, + "longitude": -104.918783, + "city": "Dupont", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80025, + "latitude": 39.93242, + "longitude": -105.287967, + "city": "Eldorado Springs", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80026, + "latitude": 40.026334, + "longitude": -105.104899, + "city": "Lafayette", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80027, + "latitude": 39.980835, + "longitude": -105.269915, + "city": "Louisville", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80028, + "latitude": 40.087835, + "longitude": -105.373507, + "city": "Louisville", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80030, + "latitude": 39.872535, + "longitude": -105.034487, + "city": "Westminster", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80031, + "latitude": 39.87529, + "longitude": -105.034487, + "city": "Westminster", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80033, + "latitude": 39.776986, + "longitude": -105.108182, + "city": "Wheat Ridge", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80034, + "latitude": 39.522014, + "longitude": -105.223945, + "city": "Wheat Ridge", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80035, + "latitude": 39.80797, + "longitude": -104.407918, + "city": "Westminster", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80036, + "latitude": 39.80797, + "longitude": -104.407918, + "city": "Westminster", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80037, + "latitude": 39.80797, + "longitude": -104.407918, + "city": "Commerce City", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80038, + "latitude": 40.087835, + "longitude": -105.373507, + "city": "Broomfield", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80040, + "latitude": 39.80797, + "longitude": -104.407918, + "city": "Aurora", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80041, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Aurora", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80042, + "latitude": 39.80797, + "longitude": -104.407918, + "city": "Aurora", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80044, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Aurora", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80045, + "latitude": 39.746736, + "longitude": -104.838361, + "city": "Aurora", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80046, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Aurora", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80047, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Aurora", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80101, + "latitude": 39.382335, + "longitude": -104.084781, + "city": "Agate", + "state": "CO", + "county": "Elbert" + }, + { + "zip_code": 80102, + "latitude": 39.869384, + "longitude": -104.458336, + "city": "Bennett", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80103, + "latitude": 39.652632, + "longitude": -104.162633, + "city": "Byers", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80104, + "latitude": 39.374779, + "longitude": -104.849988, + "city": "Castle Rock", + "state": "CO", + "county": "Douglas" + }, + { + "zip_code": 80105, + "latitude": 39.659461, + "longitude": -103.948538, + "city": "Deer Trail", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80106, + "latitude": 39.208967, + "longitude": -104.505121, + "city": "Elbert", + "state": "CO", + "county": "Elbert" + }, + { + "zip_code": 80107, + "latitude": 39.382844, + "longitude": -104.495911, + "city": "Elizabeth", + "state": "CO", + "county": "Elbert" + }, + { + "zip_code": 80110, + "latitude": 39.648958, + "longitude": -104.973852, + "city": "Englewood", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80111, + "latitude": 39.666811, + "longitude": -104.864703, + "city": "Englewood", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80112, + "latitude": 39.581238, + "longitude": -104.862194, + "city": "Englewood", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80116, + "latitude": 39.30403, + "longitude": -104.756722, + "city": "Franktown", + "state": "CO", + "county": "Douglas" + }, + { + "zip_code": 80117, + "latitude": 39.370254, + "longitude": -104.421214, + "city": "Kiowa", + "state": "CO", + "county": "Elbert" + }, + { + "zip_code": 80118, + "latitude": 39.213354, + "longitude": -104.950189, + "city": "Larkspur", + "state": "CO", + "county": "Douglas" + }, + { + "zip_code": 80120, + "latitude": 39.597937, + "longitude": -105.010182, + "city": "Littleton", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80121, + "latitude": 39.612789, + "longitude": -104.88773, + "city": "Littleton", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80122, + "latitude": 39.582222, + "longitude": -104.955576, + "city": "Littleton", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80123, + "latitude": 39.620596, + "longitude": -105.090085, + "city": "Littleton", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80124, + "latitude": 39.529639, + "longitude": -104.906562, + "city": "Littleton", + "state": "CO", + "county": "Douglas" + }, + { + "zip_code": 80125, + "latitude": 39.495327, + "longitude": -105.05897, + "city": "Littleton", + "state": "CO", + "county": "Douglas" + }, + { + "zip_code": 80126, + "latitude": 39.54372, + "longitude": -104.969143, + "city": "Littleton", + "state": "CO", + "county": "Douglas" + }, + { + "zip_code": 80127, + "latitude": 39.544307, + "longitude": -105.153074, + "city": "Littleton", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80128, + "latitude": 39.591827, + "longitude": -105.083196, + "city": "Littleton", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80129, + "latitude": "", + "longitude": "", + "city": "Littleton", + "state": "CO", + "county": "Douglas" + }, + { + "zip_code": 80130, + "latitude": "", + "longitude": "", + "city": "Littleton", + "state": "CO", + "county": "Douglas" + }, + { + "zip_code": 80131, + "latitude": 39.347863, + "longitude": -104.994708, + "city": "Louviers", + "state": "CO", + "county": "Douglas" + }, + { + "zip_code": 80132, + "latitude": 39.086393, + "longitude": -104.807666, + "city": "Monument", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80133, + "latitude": 39.112138, + "longitude": -104.900328, + "city": "Palmer Lake", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80134, + "latitude": 39.489472, + "longitude": -104.844731, + "city": "Parker", + "state": "CO", + "county": "Douglas" + }, + { + "zip_code": 80135, + "latitude": 39.311334, + "longitude": -105.067554, + "city": "Sedalia", + "state": "CO", + "county": "Douglas" + }, + { + "zip_code": 80136, + "latitude": 39.865547, + "longitude": -104.291682, + "city": "Strasburg", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80137, + "latitude": 39.796784, + "longitude": -104.630327, + "city": "Watkins", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80138, + "latitude": 39.510214, + "longitude": -104.721607, + "city": "Parker", + "state": "CO", + "county": "Douglas" + }, + { + "zip_code": 80150, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Englewood", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80151, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Englewood", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80154, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Englewood", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80155, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Englewood", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80160, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Littleton", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80161, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Littleton", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80162, + "latitude": 39.522014, + "longitude": -105.223945, + "city": "Littleton", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80163, + "latitude": 39.347863, + "longitude": -104.994708, + "city": "Littleton", + "state": "CO", + "county": "Douglas" + }, + { + "zip_code": 80165, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Littleton", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80166, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Littleton", + "state": "CO", + "county": "Arapahoe" + }, + { + "zip_code": 80201, + "latitude": 39.726303, + "longitude": -104.856808, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80202, + "latitude": 39.760189, + "longitude": -104.996553, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80203, + "latitude": 39.729205, + "longitude": -104.970331, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80204, + "latitude": 39.720136, + "longitude": -105.021502, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80205, + "latitude": 39.760137, + "longitude": -104.967585, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80206, + "latitude": 39.730787, + "longitude": -104.953335, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80207, + "latitude": 39.713186, + "longitude": -104.903532, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80208, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80209, + "latitude": 39.707332, + "longitude": -104.964236, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80210, + "latitude": 39.701677, + "longitude": -104.964186, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80211, + "latitude": 39.765291, + "longitude": -105.018387, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80212, + "latitude": 39.768286, + "longitude": -105.049338, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80214, + "latitude": 39.743636, + "longitude": -105.064336, + "city": "Denver", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80215, + "latitude": 39.743486, + "longitude": -105.100854, + "city": "Denver", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80216, + "latitude": 39.777036, + "longitude": -104.942034, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80217, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80218, + "latitude": 39.720236, + "longitude": -104.968759, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80219, + "latitude": 39.695014, + "longitude": -105.034339, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80220, + "latitude": 39.732436, + "longitude": -104.910843, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80221, + "latitude": 39.838028, + "longitude": -104.998788, + "city": "Denver", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80222, + "latitude": 39.709343, + "longitude": -104.924134, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80223, + "latitude": 39.707186, + "longitude": -105.008762, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80224, + "latitude": 39.702037, + "longitude": -104.911434, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80225, + "latitude": 39.69709, + "longitude": -105.12044, + "city": "Denver", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80226, + "latitude": 39.712337, + "longitude": -105.091784, + "city": "Denver", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80227, + "latitude": 39.667479, + "longitude": -105.067136, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80228, + "latitude": 39.688776, + "longitude": -105.156, + "city": "Denver", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80229, + "latitude": 39.867098, + "longitude": -104.922688, + "city": "Denver", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80230, + "latitude": 39.721848, + "longitude": -104.895093, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80231, + "latitude": 39.68493, + "longitude": -104.886785, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80232, + "latitude": 39.689487, + "longitude": -105.090779, + "city": "Denver", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80233, + "latitude": 39.901534, + "longitude": -104.940683, + "city": "Denver", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80234, + "latitude": 39.910774, + "longitude": -105.010886, + "city": "Denver", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80235, + "latitude": 39.645837, + "longitude": -105.065003, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80236, + "latitude": 39.649837, + "longitude": -105.034988, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80237, + "latitude": 39.638537, + "longitude": -104.903984, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80238, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80239, + "latitude": 39.804398, + "longitude": -104.813919, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80241, + "latitude": 39.927421, + "longitude": -104.954833, + "city": "Denver", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80243, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80244, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80246, + "latitude": 39.708637, + "longitude": -104.931234, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80248, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80249, + "latitude": 39.83776, + "longitude": -104.697674, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80250, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80251, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80252, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80254, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80255, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80256, + "latitude": 39.74739, + "longitude": -104.992842, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80257, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80259, + "latitude": 39.746239, + "longitude": -104.991334, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80260, + "latitude": 39.867235, + "longitude": -105.004125, + "city": "Denver", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80261, + "latitude": 39.737929, + "longitude": -104.985036, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80262, + "latitude": 39.731038, + "longitude": -104.938391, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80263, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80264, + "latitude": 39.74259, + "longitude": -104.986292, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80265, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80266, + "latitude": 39.747179, + "longitude": -104.991511, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80270, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80271, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80273, + "latitude": 39.727293, + "longitude": -104.987535, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80274, + "latitude": 39.743934, + "longitude": -104.987577, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80275, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80279, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80280, + "latitude": 39.716675, + "longitude": -104.906942, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80281, + "latitude": 39.74394, + "longitude": -104.987577, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80285, + "latitude": "", + "longitude": "", + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80290, + "latitude": 39.743608, + "longitude": -104.987556, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80291, + "latitude": 39.74394, + "longitude": -104.987577, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80292, + "latitude": 39.74739, + "longitude": -104.992842, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80293, + "latitude": 39.745786, + "longitude": -104.990686, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80294, + "latitude": 39.749086, + "longitude": -104.989036, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80295, + "latitude": 39.745486, + "longitude": -104.986336, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80299, + "latitude": 39.738752, + "longitude": -104.408349, + "city": "Denver", + "state": "CO", + "county": "Denver" + }, + { + "zip_code": 80301, + "latitude": 40.094787, + "longitude": -105.278083, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80302, + "latitude": 40.063935, + "longitude": -105.390027, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80303, + "latitude": 40.067772, + "longitude": -105.27484, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80304, + "latitude": 40.114114, + "longitude": -105.369797, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80305, + "latitude": "", + "longitude": "", + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80306, + "latitude": 40.102219, + "longitude": -105.384694, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80307, + "latitude": 40.087835, + "longitude": -105.373507, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80308, + "latitude": 40.027672, + "longitude": -105.3868, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80309, + "latitude": 40.087835, + "longitude": -105.373507, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80310, + "latitude": 40.087835, + "longitude": -105.373507, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80314, + "latitude": 40.087835, + "longitude": -105.373507, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80321, + "latitude": 40.087835, + "longitude": -105.373507, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80322, + "latitude": 40.087835, + "longitude": -105.373507, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80323, + "latitude": 40.087835, + "longitude": -105.373507, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80328, + "latitude": 40.087835, + "longitude": -105.373507, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80329, + "latitude": 40.087835, + "longitude": -105.373507, + "city": "Boulder", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80401, + "latitude": 39.718539, + "longitude": -105.245659, + "city": "Golden", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80402, + "latitude": 39.522014, + "longitude": -105.223945, + "city": "Golden", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80403, + "latitude": 39.829821, + "longitude": -105.270395, + "city": "Golden", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80419, + "latitude": 39.522014, + "longitude": -105.223945, + "city": "Golden", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80420, + "latitude": 39.297972, + "longitude": -106.063548, + "city": "Alma", + "state": "CO", + "county": "Park" + }, + { + "zip_code": 80421, + "latitude": 39.203721, + "longitude": -105.747242, + "city": "Bailey", + "state": "CO", + "county": "Park" + }, + { + "zip_code": 80422, + "latitude": 39.81599, + "longitude": -105.475322, + "city": "Black Hawk", + "state": "CO", + "county": "Gilpin" + }, + { + "zip_code": 80423, + "latitude": 39.860356, + "longitude": -106.631246, + "city": "Bond", + "state": "CO", + "county": "Eagle" + }, + { + "zip_code": 80424, + "latitude": 39.475323, + "longitude": -106.022472, + "city": "Breckenridge", + "state": "CO", + "county": "Summit" + }, + { + "zip_code": 80425, + "latitude": 39.332179, + "longitude": -105.254998, + "city": "Buffalo Creek", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80426, + "latitude": 39.78361, + "longitude": -106.896452, + "city": "Burns", + "state": "CO", + "county": "Eagle" + }, + { + "zip_code": 80427, + "latitude": 39.821626, + "longitude": -105.545631, + "city": "Central City", + "state": "CO", + "county": "Gilpin" + }, + { + "zip_code": 80428, + "latitude": 40.730717, + "longitude": -106.913996, + "city": "Clark", + "state": "CO", + "county": "Routt" + }, + { + "zip_code": 80429, + "latitude": 39.225758, + "longitude": -106.311697, + "city": "Climax", + "state": "CO", + "county": "Lake" + }, + { + "zip_code": 80430, + "latitude": 40.480364, + "longitude": -106.448221, + "city": "Coalmont", + "state": "CO", + "county": "Jackson" + }, + { + "zip_code": 80432, + "latitude": 39.158746, + "longitude": -105.816986, + "city": "Como", + "state": "CO", + "county": "Park" + }, + { + "zip_code": 80433, + "latitude": 39.473542, + "longitude": -105.284448, + "city": "Conifer", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80434, + "latitude": 40.663052, + "longitude": -106.362488, + "city": "Cowdrey", + "state": "CO", + "county": "Jackson" + }, + { + "zip_code": 80435, + "latitude": 39.595212, + "longitude": -105.974117, + "city": "Dillon", + "state": "CO", + "county": "Summit" + }, + { + "zip_code": 80436, + "latitude": 39.75315, + "longitude": -105.635592, + "city": "Dumont", + "state": "CO", + "county": "Clear Creek" + }, + { + "zip_code": 80437, + "latitude": 39.522014, + "longitude": -105.223945, + "city": "Evergreen", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80438, + "latitude": 39.76193, + "longitude": -105.665451, + "city": "Empire", + "state": "CO", + "county": "Clear Creek" + }, + { + "zip_code": 80439, + "latitude": 39.629598, + "longitude": -105.326248, + "city": "Evergreen", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80440, + "latitude": 39.149, + "longitude": -105.885893, + "city": "Fairplay", + "state": "CO", + "county": "Park" + }, + { + "zip_code": 80442, + "latitude": 39.958523, + "longitude": -105.792637, + "city": "Fraser", + "state": "CO", + "county": "Grand" + }, + { + "zip_code": 80443, + "latitude": 39.558929, + "longitude": -106.133183, + "city": "Frisco", + "state": "CO", + "county": "Summit" + }, + { + "zip_code": 80444, + "latitude": 39.725703, + "longitude": -105.760626, + "city": "Georgetown", + "state": "CO", + "county": "Clear Creek" + }, + { + "zip_code": 80446, + "latitude": 40.073869, + "longitude": -105.928533, + "city": "Granby", + "state": "CO", + "county": "Grand" + }, + { + "zip_code": 80447, + "latitude": 40.153982, + "longitude": -105.852209, + "city": "Grand Lake", + "state": "CO", + "county": "Grand" + }, + { + "zip_code": 80448, + "latitude": 39.461223, + "longitude": -105.658305, + "city": "Grant", + "state": "CO", + "county": "Park" + }, + { + "zip_code": 80449, + "latitude": 38.967262, + "longitude": -105.878811, + "city": "Hartsel", + "state": "CO", + "county": "Park" + }, + { + "zip_code": 80451, + "latitude": 40.071207, + "longitude": -106.069256, + "city": "Hot Sulphur Springs", + "state": "CO", + "county": "Grand" + }, + { + "zip_code": 80452, + "latitude": 39.706574, + "longitude": -105.541583, + "city": "Idaho Springs", + "state": "CO", + "county": "Clear Creek" + }, + { + "zip_code": 80453, + "latitude": 39.668426, + "longitude": -105.244245, + "city": "Idledale", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80454, + "latitude": 39.654637, + "longitude": -105.248119, + "city": "Indian Hills", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80455, + "latitude": 40.101985, + "longitude": -105.423992, + "city": "Jamestown", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80456, + "latitude": 39.27593, + "longitude": -105.686535, + "city": "Jefferson", + "state": "CO", + "county": "Park" + }, + { + "zip_code": 80457, + "latitude": 39.648137, + "longitude": -105.278194, + "city": "Kittredge", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80459, + "latitude": 40.147681, + "longitude": -106.378296, + "city": "Kremmling", + "state": "CO", + "county": "Grand" + }, + { + "zip_code": 80461, + "latitude": 39.21753, + "longitude": -106.35833, + "city": "Leadville", + "state": "CO", + "county": "Lake" + }, + { + "zip_code": 80463, + "latitude": 39.82712, + "longitude": -106.772151, + "city": "Mc Coy", + "state": "CO", + "county": "Eagle" + }, + { + "zip_code": 80465, + "latitude": 39.610289, + "longitude": -105.201967, + "city": "Morrison", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80466, + "latitude": 40.000686, + "longitude": -105.495998, + "city": "Nederland", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80467, + "latitude": 40.323272, + "longitude": -106.944274, + "city": "Oak Creek", + "state": "CO", + "county": "Routt" + }, + { + "zip_code": 80468, + "latitude": 39.953932, + "longitude": -106.093005, + "city": "Parshall", + "state": "CO", + "county": "Grand" + }, + { + "zip_code": 80469, + "latitude": 40.190711, + "longitude": -106.973513, + "city": "Phippsburg", + "state": "CO", + "county": "Routt" + }, + { + "zip_code": 80470, + "latitude": 39.356599, + "longitude": -105.3136, + "city": "Pine", + "state": "CO", + "county": "Jefferson" + }, + { + "zip_code": 80471, + "latitude": 39.947386, + "longitude": -105.459269, + "city": "Pinecliffe", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80473, + "latitude": 40.466701, + "longitude": -106.185703, + "city": "Rand", + "state": "CO", + "county": "Jackson" + }, + { + "zip_code": 80474, + "latitude": 39.883804, + "longitude": -105.5482, + "city": "Rollinsville", + "state": "CO", + "county": "Gilpin" + }, + { + "zip_code": 80475, + "latitude": 39.439493, + "longitude": -105.602959, + "city": "Shawnee", + "state": "CO", + "county": "Park" + }, + { + "zip_code": 80476, + "latitude": 39.699631, + "longitude": -105.75074, + "city": "Silver Plume", + "state": "CO", + "county": "Clear Creek" + }, + { + "zip_code": 80477, + "latitude": 40.348242, + "longitude": -106.92691, + "city": "Steamboat Springs", + "state": "CO", + "county": "Routt" + }, + { + "zip_code": 80478, + "latitude": 39.979743, + "longitude": -105.86148, + "city": "Tabernash", + "state": "CO", + "county": "Grand" + }, + { + "zip_code": 80479, + "latitude": 40.067609, + "longitude": -106.851718, + "city": "Toponas", + "state": "CO", + "county": "Routt" + }, + { + "zip_code": 80480, + "latitude": 40.678825, + "longitude": -106.249045, + "city": "Walden", + "state": "CO", + "county": "Jackson" + }, + { + "zip_code": 80481, + "latitude": 40.055785, + "longitude": -105.472634, + "city": "Ward", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80482, + "latitude": 39.949118, + "longitude": -105.816439, + "city": "Winter Park", + "state": "CO", + "county": "Grand" + }, + { + "zip_code": 80483, + "latitude": 40.130445, + "longitude": -106.911567, + "city": "Yampa", + "state": "CO", + "county": "Routt" + }, + { + "zip_code": 80487, + "latitude": 40.632683, + "longitude": -106.931827, + "city": "Steamboat Springs", + "state": "CO", + "county": "Routt" + }, + { + "zip_code": 80488, + "latitude": 40.619661, + "longitude": -106.860746, + "city": "Steamboat Springs", + "state": "CO", + "county": "Routt" + }, + { + "zip_code": 80497, + "latitude": 39.641146, + "longitude": -106.108002, + "city": "Silverthorne", + "state": "CO", + "county": "Summit" + }, + { + "zip_code": 80498, + "latitude": 39.764692, + "longitude": -106.221139, + "city": "Silverthorne", + "state": "CO", + "county": "Summit" + }, + { + "zip_code": 80501, + "latitude": 40.165634, + "longitude": -105.1633, + "city": "Longmont", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80502, + "latitude": 40.087835, + "longitude": -105.373507, + "city": "Longmont", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80503, + "latitude": 40.159043, + "longitude": -105.212558, + "city": "Longmont", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80504, + "latitude": 40.129416, + "longitude": -104.970816, + "city": "Longmont", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80510, + "latitude": 40.210184, + "longitude": -105.50795, + "city": "Allenspark", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80511, + "latitude": 40.628112, + "longitude": -105.569245, + "city": "Estes Park", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80512, + "latitude": 40.610729, + "longitude": -105.525784, + "city": "Bellvue", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80513, + "latitude": 40.530475, + "longitude": -105.321046, + "city": "Berthoud", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80514, + "latitude": 40.204344, + "longitude": -104.911938, + "city": "Dacono", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80515, + "latitude": 40.427541, + "longitude": -105.383062, + "city": "Drake", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80516, + "latitude": 40.062204, + "longitude": -104.923481, + "city": "Erie", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80517, + "latitude": 40.370748, + "longitude": -105.323971, + "city": "Estes Park", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80520, + "latitude": 40.122477, + "longitude": -104.935838, + "city": "Firestone", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80521, + "latitude": 40.59227, + "longitude": -105.298344, + "city": "Fort Collins", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80522, + "latitude": 40.642907, + "longitude": -105.057005, + "city": "Fort Collins", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80523, + "latitude": 40.45553, + "longitude": -105.464832, + "city": "Fort Collins", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80524, + "latitude": 40.59889, + "longitude": -105.252751, + "city": "Fort Collins", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80525, + "latitude": 40.532277, + "longitude": -105.207073, + "city": "Fort Collins", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80526, + "latitude": 40.587553, + "longitude": -105.324268, + "city": "Fort Collins", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80527, + "latitude": 40.540565, + "longitude": -105.280009, + "city": "Fort Collins", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80528, + "latitude": 40.533726, + "longitude": -105.034077, + "city": "Fort Collins", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80530, + "latitude": 40.123557, + "longitude": -104.938057, + "city": "Frederick", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80532, + "latitude": 40.457758, + "longitude": -105.447005, + "city": "Glen Haven", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80533, + "latitude": 40.181515, + "longitude": -105.232695, + "city": "Hygiene", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80534, + "latitude": 40.320091, + "longitude": -104.867196, + "city": "Johnstown", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80535, + "latitude": 40.589014, + "longitude": -105.262822, + "city": "Laporte", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80536, + "latitude": 40.693564, + "longitude": -105.441688, + "city": "Livermore", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80537, + "latitude": 40.553704, + "longitude": -105.266415, + "city": "Loveland", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80538, + "latitude": 40.551116, + "longitude": -105.183385, + "city": "Loveland", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80539, + "latitude": 40.38636, + "longitude": -105.163377, + "city": "Loveland", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80540, + "latitude": 40.189788, + "longitude": -105.35528, + "city": "Lyons", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80541, + "latitude": 40.529278, + "longitude": -105.372014, + "city": "Masonville", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80542, + "latitude": 40.327051, + "longitude": -104.893796, + "city": "Mead", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80543, + "latitude": 40.387381, + "longitude": -104.841349, + "city": "Milliken", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80544, + "latitude": 40.177043, + "longitude": -105.275045, + "city": "Niwot", + "state": "CO", + "county": "Boulder" + }, + { + "zip_code": 80545, + "latitude": 40.610176, + "longitude": -105.638852, + "city": "Red Feather Lakes", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80546, + "latitude": 40.524987, + "longitude": -104.850544, + "city": "Severance", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80547, + "latitude": 40.708692, + "longitude": -105.017539, + "city": "Timnath", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80549, + "latitude": 40.795455, + "longitude": -105.085627, + "city": "Wellington", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80550, + "latitude": 40.307972, + "longitude": -104.942467, + "city": "Windsor", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80551, + "latitude": 40.464092, + "longitude": -104.885116, + "city": "Windsor", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80553, + "latitude": 40.628112, + "longitude": -105.569245, + "city": "Fort Collins", + "state": "CO", + "county": "Larimer" + }, + { + "zip_code": 80601, + "latitude": 39.942984, + "longitude": -104.786597, + "city": "Brighton", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80602, + "latitude": "", + "longitude": "", + "city": "Brighton", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80603, + "latitude": "", + "longitude": "", + "city": "Brighton", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80610, + "latitude": 40.675794, + "longitude": -104.607073, + "city": "Ault", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80611, + "latitude": 40.443596, + "longitude": -104.240542, + "city": "Briggsdale", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80612, + "latitude": 40.597204, + "longitude": -104.869798, + "city": "Carr", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80614, + "latitude": 39.80797, + "longitude": -104.407918, + "city": "Eastlake", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80615, + "latitude": 40.350055, + "longitude": -104.660412, + "city": "Eaton", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80620, + "latitude": 40.263453, + "longitude": -104.791285, + "city": "Evans", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80621, + "latitude": 40.363977, + "longitude": -104.650827, + "city": "Fort Lupton", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80622, + "latitude": 40.536158, + "longitude": -104.500735, + "city": "Galeton", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80623, + "latitude": 40.24938, + "longitude": -104.796889, + "city": "Gilcrest", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80624, + "latitude": 40.475572, + "longitude": -104.590607, + "city": "Gill", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80631, + "latitude": 40.384991, + "longitude": -104.680631, + "city": "Greeley", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80632, + "latitude": 40.376626, + "longitude": -104.762899, + "city": "Greeley", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80633, + "latitude": 40.500919, + "longitude": -104.31497, + "city": "Greeley", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80634, + "latitude": 40.281195, + "longitude": -104.796453, + "city": "Greeley", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80638, + "latitude": 40.500919, + "longitude": -104.31497, + "city": "Greeley", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80639, + "latitude": 40.399281, + "longitude": -104.70172, + "city": "Greeley", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80640, + "latitude": 39.879235, + "longitude": -104.883581, + "city": "Henderson", + "state": "CO", + "county": "Adams" + }, + { + "zip_code": 80642, + "latitude": 40.109353, + "longitude": -104.672306, + "city": "Hudson", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80643, + "latitude": 40.085322, + "longitude": -104.506123, + "city": "Keenesburg", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80644, + "latitude": 40.47404, + "longitude": -104.472779, + "city": "Kersey", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80645, + "latitude": 40.328185, + "longitude": -104.665639, + "city": "La Salle", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80646, + "latitude": 40.48243, + "longitude": -104.70542, + "city": "Lucerne", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80648, + "latitude": 40.492804, + "longitude": -104.627586, + "city": "Nunn", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80649, + "latitude": 40.414728, + "longitude": -104.081667, + "city": "Orchard", + "state": "CO", + "county": "Morgan" + }, + { + "zip_code": 80650, + "latitude": 40.646551, + "longitude": -104.744575, + "city": "Pierce", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80651, + "latitude": 40.217382, + "longitude": -104.712141, + "city": "Platteville", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80652, + "latitude": 40.087777, + "longitude": -104.281976, + "city": "Roggen", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80653, + "latitude": 40.382218, + "longitude": -103.974159, + "city": "Weldona", + "state": "CO", + "county": "Morgan" + }, + { + "zip_code": 80654, + "latitude": 40.159839, + "longitude": -104.046791, + "city": "Wiggins", + "state": "CO", + "county": "Morgan" + }, + { + "zip_code": 80701, + "latitude": 40.262591, + "longitude": -103.847648, + "city": "Fort Morgan", + "state": "CO", + "county": "Morgan" + }, + { + "zip_code": 80705, + "latitude": 40.270654, + "longitude": -103.833813, + "city": "Log Lane Village", + "state": "CO", + "county": "Morgan" + }, + { + "zip_code": 80720, + "latitude": 40.073328, + "longitude": -103.202379, + "city": "Akron", + "state": "CO", + "county": "Washington" + }, + { + "zip_code": 80721, + "latitude": 40.608363, + "longitude": -102.3582, + "city": "Amherst", + "state": "CO", + "county": "Phillips" + }, + { + "zip_code": 80722, + "latitude": 40.525066, + "longitude": -103.197305, + "city": "Atwood", + "state": "CO", + "county": "Logan" + }, + { + "zip_code": 80723, + "latitude": 40.218547, + "longitude": -103.613248, + "city": "Brush", + "state": "CO", + "county": "Morgan" + }, + { + "zip_code": 80726, + "latitude": 40.8523, + "longitude": -103.074727, + "city": "Crook", + "state": "CO", + "county": "Logan" + }, + { + "zip_code": 80727, + "latitude": 40.061126, + "longitude": -102.4803, + "city": "Eckley", + "state": "CO", + "county": "Yuma" + }, + { + "zip_code": 80728, + "latitude": 40.598608, + "longitude": -102.874735, + "city": "Fleming", + "state": "CO", + "county": "Logan" + }, + { + "zip_code": 80729, + "latitude": 40.820129, + "longitude": -104.168529, + "city": "Grover", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80731, + "latitude": 40.601383, + "longitude": -102.523842, + "city": "Haxtun", + "state": "CO", + "county": "Phillips" + }, + { + "zip_code": 80732, + "latitude": 40.975104, + "longitude": -104.305265, + "city": "Hereford", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80733, + "latitude": 40.345863, + "longitude": -103.505721, + "city": "Hillrose", + "state": "CO", + "county": "Morgan" + }, + { + "zip_code": 80734, + "latitude": 40.587166, + "longitude": -102.272326, + "city": "Holyoke", + "state": "CO", + "county": "Phillips" + }, + { + "zip_code": 80735, + "latitude": 39.816703, + "longitude": -102.426235, + "city": "Idalia", + "state": "CO", + "county": "Yuma" + }, + { + "zip_code": 80736, + "latitude": 40.784483, + "longitude": -102.960098, + "city": "Iliff", + "state": "CO", + "county": "Logan" + }, + { + "zip_code": 80737, + "latitude": 40.875606, + "longitude": -102.351994, + "city": "Julesburg", + "state": "CO", + "county": "Sedgwick" + }, + { + "zip_code": 80740, + "latitude": 39.790894, + "longitude": -103.414172, + "city": "Lindon", + "state": "CO", + "county": "Washington" + }, + { + "zip_code": 80741, + "latitude": 40.632075, + "longitude": -103.413883, + "city": "Merino", + "state": "CO", + "county": "Logan" + }, + { + "zip_code": 80742, + "latitude": 40.736271, + "longitude": -103.878656, + "city": "New Raymer", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80743, + "latitude": 40.163025, + "longitude": -103.042516, + "city": "Otis", + "state": "CO", + "county": "Washington" + }, + { + "zip_code": 80744, + "latitude": 40.875571, + "longitude": -102.358241, + "city": "Ovid", + "state": "CO", + "county": "Sedgwick" + }, + { + "zip_code": 80745, + "latitude": 40.884156, + "longitude": -103.372814, + "city": "Padroni", + "state": "CO", + "county": "Logan" + }, + { + "zip_code": 80746, + "latitude": 40.610554, + "longitude": -102.472203, + "city": "Paoli", + "state": "CO", + "county": "Phillips" + }, + { + "zip_code": 80747, + "latitude": 40.825442, + "longitude": -103.16182, + "city": "Peetz", + "state": "CO", + "county": "Logan" + }, + { + "zip_code": 80749, + "latitude": 40.875703, + "longitude": -102.44023, + "city": "Sedgwick", + "state": "CO", + "county": "Sedgwick" + }, + { + "zip_code": 80750, + "latitude": 40.415193, + "longitude": -103.610575, + "city": "Snyder", + "state": "CO", + "county": "Morgan" + }, + { + "zip_code": 80751, + "latitude": 40.715081, + "longitude": -103.211191, + "city": "Sterling", + "state": "CO", + "county": "Logan" + }, + { + "zip_code": 80754, + "latitude": 40.735758, + "longitude": -103.997391, + "city": "Stoneham", + "state": "CO", + "county": "Weld" + }, + { + "zip_code": 80755, + "latitude": 39.812149, + "longitude": -102.434252, + "city": "Vernon", + "state": "CO", + "county": "Yuma" + }, + { + "zip_code": 80757, + "latitude": 39.804985, + "longitude": -103.57521, + "city": "Woodrow", + "state": "CO", + "county": "Washington" + }, + { + "zip_code": 80758, + "latitude": 40.068525, + "longitude": -102.392973, + "city": "Wray", + "state": "CO", + "county": "Yuma" + }, + { + "zip_code": 80759, + "latitude": 40.061817, + "longitude": -102.618522, + "city": "Yuma", + "state": "CO", + "county": "Yuma" + }, + { + "zip_code": 80801, + "latitude": 39.690908, + "longitude": -103.137281, + "city": "Anton", + "state": "CO", + "county": "Washington" + }, + { + "zip_code": 80802, + "latitude": 38.847485, + "longitude": -102.524932, + "city": "Arapahoe", + "state": "CO", + "county": "Cheyenne" + }, + { + "zip_code": 80804, + "latitude": 39.316461, + "longitude": -103.323143, + "city": "Arriba", + "state": "CO", + "county": "Lincoln" + }, + { + "zip_code": 80805, + "latitude": 39.293345, + "longitude": -102.433217, + "city": "Bethune", + "state": "CO", + "county": "Kit Carson" + }, + { + "zip_code": 80807, + "latitude": 39.308966, + "longitude": -102.461287, + "city": "Burlington", + "state": "CO", + "county": "Kit Carson" + }, + { + "zip_code": 80808, + "latitude": 38.94043, + "longitude": -104.282512, + "city": "Calhan", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80809, + "latitude": 38.945534, + "longitude": -104.994972, + "city": "Cascade", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80810, + "latitude": 38.827259, + "longitude": -102.411537, + "city": "Cheyenne Wells", + "state": "CO", + "county": "Cheyenne" + }, + { + "zip_code": 80812, + "latitude": 39.684772, + "longitude": -102.99038, + "city": "Cope", + "state": "CO", + "county": "Washington" + }, + { + "zip_code": 80813, + "latitude": 38.826084, + "longitude": -105.149874, + "city": "Cripple Creek", + "state": "CO", + "county": "Teller" + }, + { + "zip_code": 80814, + "latitude": 38.923901, + "longitude": -105.185653, + "city": "Divide", + "state": "CO", + "county": "Teller" + }, + { + "zip_code": 80815, + "latitude": 39.32513, + "longitude": -102.783284, + "city": "Flagler", + "state": "CO", + "county": "Kit Carson" + }, + { + "zip_code": 80816, + "latitude": 38.855231, + "longitude": -105.190895, + "city": "Florissant", + "state": "CO", + "county": "Teller" + }, + { + "zip_code": 80817, + "latitude": 38.663856, + "longitude": -104.652221, + "city": "Fountain", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80818, + "latitude": 39.348432, + "longitude": -103.49065, + "city": "Genoa", + "state": "CO", + "county": "Lincoln" + }, + { + "zip_code": 80819, + "latitude": 38.93893, + "longitude": -105.009444, + "city": "Green Mountain Falls", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80820, + "latitude": 38.835374, + "longitude": -105.562124, + "city": "Guffey", + "state": "CO", + "county": "Park" + }, + { + "zip_code": 80821, + "latitude": 39.022942, + "longitude": -103.457864, + "city": "Hugo", + "state": "CO", + "county": "Lincoln" + }, + { + "zip_code": 80822, + "latitude": 39.959546, + "longitude": -102.500066, + "city": "Joes", + "state": "CO", + "county": "Yuma" + }, + { + "zip_code": 80823, + "latitude": 38.806509, + "longitude": -103.474701, + "city": "Karval", + "state": "CO", + "county": "Lincoln" + }, + { + "zip_code": 80824, + "latitude": 39.664421, + "longitude": -102.546469, + "city": "Kirk", + "state": "CO", + "county": "Yuma" + }, + { + "zip_code": 80825, + "latitude": 38.827174, + "longitude": -102.598136, + "city": "Kit Carson", + "state": "CO", + "county": "Cheyenne" + }, + { + "zip_code": 80826, + "latitude": 39.041435, + "longitude": -103.604851, + "city": "Limon", + "state": "CO", + "county": "Lincoln" + }, + { + "zip_code": 80827, + "latitude": 38.980056, + "longitude": -105.514472, + "city": "Lake George", + "state": "CO", + "county": "Park" + }, + { + "zip_code": 80828, + "latitude": 39.31654, + "longitude": -103.588908, + "city": "Limon", + "state": "CO", + "county": "Lincoln" + }, + { + "zip_code": 80829, + "latitude": 38.853366, + "longitude": -104.927452, + "city": "Manitou Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80830, + "latitude": 39.114381, + "longitude": -103.900144, + "city": "Matheson", + "state": "CO", + "county": "Elbert" + }, + { + "zip_code": 80831, + "latitude": 38.984206, + "longitude": -104.526328, + "city": "Peyton", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80832, + "latitude": 39.035064, + "longitude": -104.163326, + "city": "Ramah", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80833, + "latitude": 38.818756, + "longitude": -104.117904, + "city": "Rush", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80834, + "latitude": 39.322355, + "longitude": -102.881192, + "city": "Seibert", + "state": "CO", + "county": "Kit Carson" + }, + { + "zip_code": 80835, + "latitude": 39.208696, + "longitude": -104.070186, + "city": "Simla", + "state": "CO", + "county": "Elbert" + }, + { + "zip_code": 80836, + "latitude": 39.304913, + "longitude": -102.67301, + "city": "Stratton", + "state": "CO", + "county": "Kit Carson" + }, + { + "zip_code": 80840, + "latitude": 38.979235, + "longitude": -104.860561, + "city": "U S A F Academy", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80841, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "U S A F Academy", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80860, + "latitude": 38.731005, + "longitude": -105.132073, + "city": "Victor", + "state": "CO", + "county": "Teller" + }, + { + "zip_code": 80861, + "latitude": 39.311151, + "longitude": -102.74229, + "city": "Vona", + "state": "CO", + "county": "Kit Carson" + }, + { + "zip_code": 80862, + "latitude": 38.804111, + "longitude": -103.079761, + "city": "Wild Horse", + "state": "CO", + "county": "Cheyenne" + }, + { + "zip_code": 80863, + "latitude": 38.918437, + "longitude": -105.166398, + "city": "Woodland Park", + "state": "CO", + "county": "Teller" + }, + { + "zip_code": 80864, + "latitude": 38.738943, + "longitude": -104.193088, + "city": "Yoder", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80866, + "latitude": 39.03635, + "longitude": -105.15597, + "city": "Woodland Park", + "state": "CO", + "county": "Teller" + }, + { + "zip_code": 80901, + "latitude": 38.861469, + "longitude": -104.857828, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80903, + "latitude": 38.828893, + "longitude": -104.809929, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80904, + "latitude": 38.861981, + "longitude": -104.874531, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80905, + "latitude": 38.844319, + "longitude": -104.801472, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80906, + "latitude": 38.796074, + "longitude": -104.841763, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80907, + "latitude": 38.943076, + "longitude": -104.81444, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80908, + "latitude": 39.020647, + "longitude": -104.705498, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80909, + "latitude": 38.838268, + "longitude": -104.85023, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80910, + "latitude": 38.804094, + "longitude": -104.772059, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80911, + "latitude": 38.922849, + "longitude": -104.789157, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80912, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80913, + "latitude": 38.729969, + "longitude": -104.753607, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80914, + "latitude": 38.819195, + "longitude": -104.701177, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80915, + "latitude": 38.874436, + "longitude": -104.751515, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80916, + "latitude": 38.81033, + "longitude": -104.718555, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80917, + "latitude": 38.82513, + "longitude": -104.746689, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80918, + "latitude": 38.90319, + "longitude": -104.807998, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80919, + "latitude": 38.938149, + "longitude": -104.917436, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80920, + "latitude": 38.965298, + "longitude": -104.755956, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80921, + "latitude": 39.055054, + "longitude": -104.89122, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80922, + "latitude": 38.904817, + "longitude": -104.70124, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80925, + "latitude": 38.737774, + "longitude": -104.645854, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80926, + "latitude": 38.644087, + "longitude": -104.880825, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80928, + "latitude": 38.645078, + "longitude": -104.395746, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80929, + "latitude": 38.846355, + "longitude": -104.624727, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80930, + "latitude": 38.824202, + "longitude": -104.493259, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80931, + "latitude": 38.953003, + "longitude": -104.60923, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80932, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80933, + "latitude": 38.939371, + "longitude": -105.011786, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80934, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80935, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80936, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80937, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80940, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80941, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80942, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80943, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80944, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80945, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80946, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80947, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80949, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80950, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80960, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80962, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80970, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80977, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80995, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 80997, + "latitude": 38.82469, + "longitude": -104.562027, + "city": "Colorado Springs", + "state": "CO", + "county": "El Paso" + }, + { + "zip_code": 81001, + "latitude": 38.344117, + "longitude": -104.427776, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81002, + "latitude": 38.128626, + "longitude": -104.552299, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81003, + "latitude": 38.121031, + "longitude": -104.763851, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81004, + "latitude": 38.087325, + "longitude": -104.822451, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81005, + "latitude": 38.152191, + "longitude": -104.841328, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81006, + "latitude": 38.113259, + "longitude": -104.52127, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81007, + "latitude": 38.387004, + "longitude": -104.779156, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81008, + "latitude": 38.402934, + "longitude": -104.644423, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81009, + "latitude": 38.128626, + "longitude": -104.552299, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81010, + "latitude": 38.128626, + "longitude": -104.552299, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81011, + "latitude": 38.128626, + "longitude": -104.552299, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81012, + "latitude": 38.128626, + "longitude": -104.552299, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81013, + "latitude": 38.128626, + "longitude": -104.552299, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81014, + "latitude": 38.128626, + "longitude": -104.552299, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81015, + "latitude": 38.128626, + "longitude": -104.552299, + "city": "Pueblo", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81019, + "latitude": 37.887346, + "longitude": -104.613617, + "city": "Colorado City", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81020, + "latitude": 37.381577, + "longitude": -104.653809, + "city": "Aguilar", + "state": "CO", + "county": "Las Animas" + }, + { + "zip_code": 81021, + "latitude": 38.430393, + "longitude": -103.366655, + "city": "Arlington", + "state": "CO", + "county": "Kiowa" + }, + { + "zip_code": 81022, + "latitude": 38.102502, + "longitude": -104.529794, + "city": "Avondale", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81023, + "latitude": 38.127363, + "longitude": -104.63577, + "city": "Beulah", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81024, + "latitude": 37.208109, + "longitude": -104.719787, + "city": "Boncarbo", + "state": "CO", + "county": "Las Animas" + }, + { + "zip_code": 81025, + "latitude": 38.319575, + "longitude": -104.209119, + "city": "Boone", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81027, + "latitude": 37.232444, + "longitude": -103.722865, + "city": "Branson", + "state": "CO", + "county": "Las Animas" + }, + { + "zip_code": 81029, + "latitude": 37.184434, + "longitude": -102.473938, + "city": "Campo", + "state": "CO", + "county": "Baca" + }, + { + "zip_code": 81030, + "latitude": 38.102941, + "longitude": -103.5367, + "city": "Cheraw", + "state": "CO", + "county": "Otero" + }, + { + "zip_code": 81033, + "latitude": 38.229447, + "longitude": -103.804241, + "city": "Crowley", + "state": "CO", + "county": "Crowley" + }, + { + "zip_code": 81034, + "latitude": 38.317851, + "longitude": -103.779959, + "city": "Crowley", + "state": "CO", + "county": "Crowley" + }, + { + "zip_code": 81036, + "latitude": 38.440752, + "longitude": -102.554901, + "city": "Eads", + "state": "CO", + "county": "Kiowa" + }, + { + "zip_code": 81038, + "latitude": 37.955547, + "longitude": -103.072469, + "city": "Fort Lyon", + "state": "CO", + "county": "Bent" + }, + { + "zip_code": 81039, + "latitude": 37.98146, + "longitude": -103.967799, + "city": "Fowler", + "state": "CO", + "county": "Otero" + }, + { + "zip_code": 81040, + "latitude": 37.787772, + "longitude": -105.18487, + "city": "Gardner", + "state": "CO", + "county": "Huerfano" + }, + { + "zip_code": 81041, + "latitude": 37.870309, + "longitude": -102.367626, + "city": "Granada", + "state": "CO", + "county": "Prowers" + }, + { + "zip_code": 81042, + "latitude": 37.315263, + "longitude": -104.73461, + "city": "Gulnare", + "state": "CO", + "county": "Las Animas" + }, + { + "zip_code": 81043, + "latitude": 38.119522, + "longitude": -102.216833, + "city": "Hartman", + "state": "CO", + "county": "Prowers" + }, + { + "zip_code": 81044, + "latitude": 37.959036, + "longitude": -103.015041, + "city": "Hasty", + "state": "CO", + "county": "Bent" + }, + { + "zip_code": 81045, + "latitude": 38.440077, + "longitude": -103.130677, + "city": "Haswell", + "state": "CO", + "county": "Kiowa" + }, + { + "zip_code": 81046, + "latitude": 37.279584, + "longitude": -104.358375, + "city": "Hoehne", + "state": "CO", + "county": "Las Animas" + }, + { + "zip_code": 81047, + "latitude": 37.956511, + "longitude": -102.335202, + "city": "Holly", + "state": "CO", + "county": "Prowers" + }, + { + "zip_code": 81049, + "latitude": 37.33276, + "longitude": -103.373586, + "city": "Kim", + "state": "CO", + "county": "Las Animas" + }, + { + "zip_code": 81050, + "latitude": 37.954619, + "longitude": -103.664437, + "city": "La Junta", + "state": "CO", + "county": "Otero" + }, + { + "zip_code": 81052, + "latitude": 37.955488, + "longitude": -102.436416, + "city": "Lamar", + "state": "CO", + "county": "Prowers" + }, + { + "zip_code": 81054, + "latitude": 37.923031, + "longitude": -103.088444, + "city": "Las Animas", + "state": "CO", + "county": "Bent" + }, + { + "zip_code": 81055, + "latitude": 37.511672, + "longitude": -105.057545, + "city": "La Veta", + "state": "CO", + "county": "Huerfano" + }, + { + "zip_code": 81057, + "latitude": 38.085032, + "longitude": -102.88691, + "city": "Mc Clave", + "state": "CO", + "county": "Bent" + }, + { + "zip_code": 81058, + "latitude": 38.082793, + "longitude": -103.885189, + "city": "Manzanola", + "state": "CO", + "county": "Otero" + }, + { + "zip_code": 81059, + "latitude": 37.519198, + "longitude": -104.223007, + "city": "Model", + "state": "CO", + "county": "Las Animas" + }, + { + "zip_code": 81062, + "latitude": 38.327723, + "longitude": -103.953208, + "city": "Olney Springs", + "state": "CO", + "county": "Crowley" + }, + { + "zip_code": 81063, + "latitude": 38.317486, + "longitude": -103.780036, + "city": "Ordway", + "state": "CO", + "county": "Crowley" + }, + { + "zip_code": 81064, + "latitude": 37.272262, + "longitude": -102.914489, + "city": "Pritchett", + "state": "CO", + "county": "Baca" + }, + { + "zip_code": 81066, + "latitude": 37.712093, + "longitude": -105.344931, + "city": "Walsenburg", + "state": "CO", + "county": "Huerfano" + }, + { + "zip_code": 81067, + "latitude": 37.995867, + "longitude": -103.708332, + "city": "Rocky Ford", + "state": "CO", + "county": "Otero" + }, + { + "zip_code": 81069, + "latitude": 37.936061, + "longitude": -104.874843, + "city": "Rye", + "state": "CO", + "county": "Pueblo" + }, + { + "zip_code": 81071, + "latitude": 38.441431, + "longitude": -102.604797, + "city": "Sheridan Lake", + "state": "CO", + "county": "Kiowa" + }, + { + "zip_code": 81073, + "latitude": 37.371522, + "longitude": -102.677359, + "city": "Springfield", + "state": "CO", + "county": "Baca" + }, + { + "zip_code": 81074, + "latitude": 37.121029, + "longitude": -104.523155, + "city": "Starkville", + "state": "CO", + "county": "Las Animas" + }, + { + "zip_code": 81076, + "latitude": 38.315371, + "longitude": -103.599555, + "city": "Sugar City", + "state": "CO", + "county": "Crowley" + }, + { + "zip_code": 81077, + "latitude": 38.054962, + "longitude": -103.619493, + "city": "Swink", + "state": "CO", + "county": "Otero" + }, + { + "zip_code": 81081, + "latitude": 37.0999, + "longitude": -104.132767, + "city": "Trinchera", + "state": "CO", + "county": "Las Animas" + }, + { + "zip_code": 81082, + "latitude": 37.269059, + "longitude": -104.5038, + "city": "Trinidad", + "state": "CO", + "county": "Las Animas" + }, + { + "zip_code": 81084, + "latitude": 37.521432, + "longitude": -102.433241, + "city": "Two Buttes", + "state": "CO", + "county": "Baca" + }, + { + "zip_code": 81087, + "latitude": 37.33995, + "longitude": -102.491522, + "city": "Vilas", + "state": "CO", + "county": "Baca" + }, + { + "zip_code": 81089, + "latitude": 37.646467, + "longitude": -104.779815, + "city": "Walsenburg", + "state": "CO", + "county": "Huerfano" + }, + { + "zip_code": 81090, + "latitude": 37.368042, + "longitude": -102.265146, + "city": "Walsh", + "state": "CO", + "county": "Baca" + }, + { + "zip_code": 81091, + "latitude": 37.190046, + "longitude": -104.795074, + "city": "Weston", + "state": "CO", + "county": "Las Animas" + }, + { + "zip_code": 81092, + "latitude": 38.189902, + "longitude": -102.705397, + "city": "Wiley", + "state": "CO", + "county": "Prowers" + }, + { + "zip_code": 81101, + "latitude": 37.479933, + "longitude": -105.790967, + "city": "Alamosa", + "state": "CO", + "county": "Alamosa" + }, + { + "zip_code": 81102, + "latitude": 37.476026, + "longitude": -105.881779, + "city": "Alamosa", + "state": "CO", + "county": "Alamosa" + }, + { + "zip_code": 81120, + "latitude": 37.135059, + "longitude": -106.190367, + "city": "Antonito", + "state": "CO", + "county": "Conejos" + }, + { + "zip_code": 81121, + "latitude": 37.109225, + "longitude": -107.31183, + "city": "Arboles", + "state": "CO", + "county": "Archuleta" + }, + { + "zip_code": 81122, + "latitude": 37.292065, + "longitude": -107.736318, + "city": "Bayfield", + "state": "CO", + "county": "La Plata" + }, + { + "zip_code": 81123, + "latitude": 37.435812, + "longitude": -105.57348, + "city": "Blanca", + "state": "CO", + "county": "Costilla" + }, + { + "zip_code": 81124, + "latitude": 37.304205, + "longitude": -106.127935, + "city": "Capulin", + "state": "CO", + "county": "Conejos" + }, + { + "zip_code": 81125, + "latitude": 37.869875, + "longitude": -106.046711, + "city": "Center", + "state": "CO", + "county": "Saguache" + }, + { + "zip_code": 81126, + "latitude": 37.326735, + "longitude": -105.450502, + "city": "Chama", + "state": "CO", + "county": "Costilla" + }, + { + "zip_code": 81127, + "latitude": 37.250704, + "longitude": -107.321138, + "city": "Chimney Rock", + "state": "CO", + "county": "Archuleta" + }, + { + "zip_code": 81128, + "latitude": 37.130148, + "longitude": -106.821686, + "city": "Chromo", + "state": "CO", + "county": "Archuleta" + }, + { + "zip_code": 81129, + "latitude": 37.101134, + "longitude": -106.02648, + "city": "Conejos", + "state": "CO", + "county": "Conejos" + }, + { + "zip_code": 81130, + "latitude": 37.761293, + "longitude": -106.981852, + "city": "Creede", + "state": "CO", + "county": "Mineral" + }, + { + "zip_code": 81131, + "latitude": 37.953038, + "longitude": -105.68788, + "city": "Crestone", + "state": "CO", + "county": "Saguache" + }, + { + "zip_code": 81132, + "latitude": 37.644684, + "longitude": -106.407311, + "city": "Del Norte", + "state": "CO", + "county": "Rio Grande" + }, + { + "zip_code": 81133, + "latitude": 37.403455, + "longitude": -105.415437, + "city": "Fort Garland", + "state": "CO", + "county": "Costilla" + }, + { + "zip_code": 81134, + "latitude": 37.092195, + "longitude": -105.530023, + "city": "Garcia", + "state": "CO", + "county": "Costilla" + }, + { + "zip_code": 81135, + "latitude": 37.615741, + "longitude": -106.375292, + "city": "Homelake", + "state": "CO", + "county": "Rio Grande" + }, + { + "zip_code": 81136, + "latitude": 37.699184, + "longitude": -105.873616, + "city": "Hooper", + "state": "CO", + "county": "Alamosa" + }, + { + "zip_code": 81137, + "latitude": 37.114844, + "longitude": -107.659745, + "city": "Ignacio", + "state": "CO", + "county": "La Plata" + }, + { + "zip_code": 81138, + "latitude": 37.197731, + "longitude": -105.429395, + "city": "Jaroso", + "state": "CO", + "county": "Costilla" + }, + { + "zip_code": 81140, + "latitude": 37.276566, + "longitude": -106.007989, + "city": "La Jara", + "state": "CO", + "county": "Conejos" + }, + { + "zip_code": 81141, + "latitude": 37.175463, + "longitude": -105.927841, + "city": "Manassa", + "state": "CO", + "county": "Conejos" + }, + { + "zip_code": 81143, + "latitude": 38.065284, + "longitude": -105.817955, + "city": "Moffat", + "state": "CO", + "county": "Saguache" + }, + { + "zip_code": 81144, + "latitude": 37.570515, + "longitude": -106.345624, + "city": "Monte Vista", + "state": "CO", + "county": "Rio Grande" + }, + { + "zip_code": 81146, + "latitude": 37.631025, + "longitude": -105.773133, + "city": "Mosca", + "state": "CO", + "county": "Alamosa" + }, + { + "zip_code": 81147, + "latitude": 37.202251, + "longitude": -107.12619, + "city": "Pagosa Springs", + "state": "CO", + "county": "Archuleta" + }, + { + "zip_code": 81148, + "latitude": 37.172101, + "longitude": -105.985811, + "city": "Romeo", + "state": "CO", + "county": "Conejos" + }, + { + "zip_code": 81149, + "latitude": 38.181206, + "longitude": -106.351826, + "city": "Saguache", + "state": "CO", + "county": "Saguache" + }, + { + "zip_code": 81151, + "latitude": 37.255221, + "longitude": -105.848097, + "city": "Sanford", + "state": "CO", + "county": "Conejos" + }, + { + "zip_code": 81152, + "latitude": 37.106599, + "longitude": -105.47813, + "city": "San Luis", + "state": "CO", + "county": "Costilla" + }, + { + "zip_code": 81153, + "latitude": 37.202995, + "longitude": -105.418718, + "city": "San Pablo", + "state": "CO", + "county": "Costilla" + }, + { + "zip_code": 81154, + "latitude": 37.638307, + "longitude": -106.597775, + "city": "South Fork", + "state": "CO", + "county": "Rio Grande" + }, + { + "zip_code": 81155, + "latitude": 38.306022, + "longitude": -106.046577, + "city": "Villa Grove", + "state": "CO", + "county": "Saguache" + }, + { + "zip_code": 81157, + "latitude": 37.270438, + "longitude": -107.093153, + "city": "Pagosa Springs", + "state": "CO", + "county": "Archuleta" + }, + { + "zip_code": 81201, + "latitude": 38.629119, + "longitude": -106.120582, + "city": "Salida", + "state": "CO", + "county": "Chaffee" + }, + { + "zip_code": 81210, + "latitude": 38.820006, + "longitude": -106.660278, + "city": "Almont", + "state": "CO", + "county": "Gunnison" + }, + { + "zip_code": 81211, + "latitude": 38.885032, + "longitude": -106.179938, + "city": "Buena Vista", + "state": "CO", + "county": "Chaffee" + }, + { + "zip_code": 81212, + "latitude": 38.477727, + "longitude": -105.507603, + "city": "Canon City", + "state": "CO", + "county": "Fremont" + }, + { + "zip_code": 81215, + "latitude": 38.477563, + "longitude": -105.476577, + "city": "Canon City", + "state": "CO", + "county": "Fremont" + }, + { + "zip_code": 81220, + "latitude": 38.416326, + "longitude": -107.529303, + "city": "Cimarron", + "state": "CO", + "county": "Montrose" + }, + { + "zip_code": 81221, + "latitude": 38.338919, + "longitude": -105.159722, + "city": "Coal Creek", + "state": "CO", + "county": "Fremont" + }, + { + "zip_code": 81222, + "latitude": 38.382377, + "longitude": -105.784315, + "city": "Coaldale", + "state": "CO", + "county": "Fremont" + }, + { + "zip_code": 81223, + "latitude": 38.439983, + "longitude": -105.49649, + "city": "Cotopaxi", + "state": "CO", + "county": "Fremont" + }, + { + "zip_code": 81224, + "latitude": 38.880713, + "longitude": -106.94868, + "city": "Crested Butte", + "state": "CO", + "county": "Gunnison" + }, + { + "zip_code": 81225, + "latitude": 38.90056, + "longitude": -106.963148, + "city": "Crested Butte", + "state": "CO", + "county": "Gunnison" + }, + { + "zip_code": 81226, + "latitude": 38.355202, + "longitude": -105.254782, + "city": "Florence", + "state": "CO", + "county": "Fremont" + }, + { + "zip_code": 81227, + "latitude": 38.545757, + "longitude": -106.243422, + "city": "Monarch", + "state": "CO", + "county": "Chaffee" + }, + { + "zip_code": 81228, + "latitude": 39.030747, + "longitude": -106.256615, + "city": "Granite", + "state": "CO", + "county": "Chaffee" + }, + { + "zip_code": 81230, + "latitude": 38.528323, + "longitude": -107.037294, + "city": "Gunnison", + "state": "CO", + "county": "Gunnison" + }, + { + "zip_code": 81231, + "latitude": 38.702309, + "longitude": -106.940201, + "city": "Gunnison", + "state": "CO", + "county": "Gunnison" + }, + { + "zip_code": 81232, + "latitude": 38.285533, + "longitude": -105.642451, + "city": "Hillside", + "state": "CO", + "county": "Fremont" + }, + { + "zip_code": 81233, + "latitude": 38.410012, + "longitude": -105.769848, + "city": "Howard", + "state": "CO", + "county": "Fremont" + }, + { + "zip_code": 81235, + "latitude": 38.026256, + "longitude": -107.276581, + "city": "Lake City", + "state": "CO", + "county": "Hinsdale" + }, + { + "zip_code": 81236, + "latitude": 38.747896, + "longitude": -106.251196, + "city": "Nathrop", + "state": "CO", + "county": "Chaffee" + }, + { + "zip_code": 81237, + "latitude": 38.590788, + "longitude": -106.602838, + "city": "Ohio City", + "state": "CO", + "county": "Gunnison" + }, + { + "zip_code": 81239, + "latitude": 38.537083, + "longitude": -106.635214, + "city": "Parlin", + "state": "CO", + "county": "Gunnison" + }, + { + "zip_code": 81240, + "latitude": 38.414125, + "longitude": -105.047277, + "city": "Penrose", + "state": "CO", + "county": "Fremont" + }, + { + "zip_code": 81241, + "latitude": 38.589072, + "longitude": -106.570985, + "city": "Pitkin", + "state": "CO", + "county": "Gunnison" + }, + { + "zip_code": 81242, + "latitude": 38.471892, + "longitude": -106.097284, + "city": "Poncha Springs", + "state": "CO", + "county": "Chaffee" + }, + { + "zip_code": 81243, + "latitude": 38.270602, + "longitude": -107.302888, + "city": "Powderhorn", + "state": "CO", + "county": "Gunnison" + }, + { + "zip_code": 81244, + "latitude": 38.336184, + "longitude": -105.22114, + "city": "Rockvale", + "state": "CO", + "county": "Fremont" + }, + { + "zip_code": 81246, + "latitude": 38.477563, + "longitude": -105.476577, + "city": "Canon City", + "state": "CO", + "county": "Fremont" + }, + { + "zip_code": 81247, + "latitude": 38.457513, + "longitude": -107.292081, + "city": "Gunnison", + "state": "CO", + "county": "Gunnison" + }, + { + "zip_code": 81248, + "latitude": 38.403295, + "longitude": -106.416083, + "city": "Sargents", + "state": "CO", + "county": "Saguache" + }, + { + "zip_code": 81251, + "latitude": 39.151466, + "longitude": -106.422616, + "city": "Twin Lakes", + "state": "CO", + "county": "Lake" + }, + { + "zip_code": 81252, + "latitude": 38.095173, + "longitude": -105.421953, + "city": "Westcliffe", + "state": "CO", + "county": "Custer" + }, + { + "zip_code": 81253, + "latitude": 38.121657, + "longitude": -105.14766, + "city": "Wetmore", + "state": "CO", + "county": "Custer" + }, + { + "zip_code": 81290, + "latitude": 38.358421, + "longitude": -105.106881, + "city": "Florence", + "state": "CO", + "county": "Fremont" + }, + { + "zip_code": 81301, + "latitude": 37.318364, + "longitude": -107.880367, + "city": "Durango", + "state": "CO", + "county": "La Plata" + }, + { + "zip_code": 81302, + "latitude": 37.357249, + "longitude": -107.935945, + "city": "Durango", + "state": "CO", + "county": "La Plata" + }, + { + "zip_code": 81303, + "latitude": "", + "longitude": "", + "city": "Durango", + "state": "CO", + "county": "La Plata" + }, + { + "zip_code": 81320, + "latitude": 37.718233, + "longitude": -108.791671, + "city": "Cahone", + "state": "CO", + "county": "Dolores" + }, + { + "zip_code": 81321, + "latitude": 37.373594, + "longitude": -108.662826, + "city": "Cortez", + "state": "CO", + "county": "Montezuma" + }, + { + "zip_code": 81323, + "latitude": 37.469333, + "longitude": -108.35245, + "city": "Dolores", + "state": "CO", + "county": "Montezuma" + }, + { + "zip_code": 81324, + "latitude": 37.711532, + "longitude": -108.924334, + "city": "Dove Creek", + "state": "CO", + "county": "Dolores" + }, + { + "zip_code": 81325, + "latitude": 37.929371, + "longitude": -108.846067, + "city": "Egnar", + "state": "CO", + "county": "San Miguel" + }, + { + "zip_code": 81326, + "latitude": 37.205423, + "longitude": -108.138519, + "city": "Hesperus", + "state": "CO", + "county": "La Plata" + }, + { + "zip_code": 81327, + "latitude": 37.458047, + "longitude": -108.655638, + "city": "Lewis", + "state": "CO", + "county": "Montezuma" + }, + { + "zip_code": 81328, + "latitude": 37.336041, + "longitude": -108.468364, + "city": "Mancos", + "state": "CO", + "county": "Montezuma" + }, + { + "zip_code": 81329, + "latitude": 37.092605, + "longitude": -108.125194, + "city": "Marvel", + "state": "CO", + "county": "La Plata" + }, + { + "zip_code": 81330, + "latitude": 37.319207, + "longitude": -108.509012, + "city": "Mesa Verde National Park", + "state": "CO", + "county": "Montezuma" + }, + { + "zip_code": 81331, + "latitude": 37.551564, + "longitude": -108.829926, + "city": "Pleasant View", + "state": "CO", + "county": "Montezuma" + }, + { + "zip_code": 81332, + "latitude": 37.690498, + "longitude": -108.03241, + "city": "Rico", + "state": "CO", + "county": "Dolores" + }, + { + "zip_code": 81334, + "latitude": 37.319207, + "longitude": -108.509012, + "city": "Towaoc", + "state": "CO", + "county": "Montezuma" + }, + { + "zip_code": 81335, + "latitude": 37.508114, + "longitude": -108.744007, + "city": "Yellow Jacket", + "state": "CO", + "county": "Montezuma" + }, + { + "zip_code": 81401, + "latitude": 38.443069, + "longitude": -108.050689, + "city": "Montrose", + "state": "CO", + "county": "Montrose" + }, + { + "zip_code": 81402, + "latitude": 38.485093, + "longitude": -107.885975, + "city": "Montrose", + "state": "CO", + "county": "Montrose" + }, + { + "zip_code": 81410, + "latitude": 38.805013, + "longitude": -107.983125, + "city": "Austin", + "state": "CO", + "county": "Delta" + }, + { + "zip_code": 81411, + "latitude": 38.34867, + "longitude": -108.937369, + "city": "Bedrock", + "state": "CO", + "county": "Montrose" + }, + { + "zip_code": 81413, + "latitude": 38.881646, + "longitude": -107.795704, + "city": "Cedaredge", + "state": "CO", + "county": "Delta" + }, + { + "zip_code": 81414, + "latitude": 38.788697, + "longitude": -107.986174, + "city": "Cory", + "state": "CO", + "county": "Delta" + }, + { + "zip_code": 81415, + "latitude": 38.767652, + "longitude": -107.63089, + "city": "Crawford", + "state": "CO", + "county": "Delta" + }, + { + "zip_code": 81416, + "latitude": 38.785768, + "longitude": -107.97078, + "city": "Delta", + "state": "CO", + "county": "Delta" + }, + { + "zip_code": 81418, + "latitude": 38.87534, + "longitude": -107.961178, + "city": "Eckert", + "state": "CO", + "county": "Delta" + }, + { + "zip_code": 81419, + "latitude": 38.859973, + "longitude": -107.752349, + "city": "Hotchkiss", + "state": "CO", + "county": "Delta" + }, + { + "zip_code": 81420, + "latitude": 38.781745, + "longitude": -107.780778, + "city": "Lazear", + "state": "CO", + "county": "Delta" + }, + { + "zip_code": 81421, + "latitude": 38.942927, + "longitude": -107.939831, + "city": "Maher", + "state": "CO", + "county": "Delta" + }, + { + "zip_code": 81422, + "latitude": 38.269387, + "longitude": -108.574539, + "city": "Naturita", + "state": "CO", + "county": "Montrose" + }, + { + "zip_code": 81423, + "latitude": 38.028899, + "longitude": -108.316049, + "city": "Norwood", + "state": "CO", + "county": "San Miguel" + }, + { + "zip_code": 81424, + "latitude": 38.310689, + "longitude": -108.57669, + "city": "Nucla", + "state": "CO", + "county": "Montrose" + }, + { + "zip_code": 81425, + "latitude": 38.497566, + "longitude": -108.078623, + "city": "Olathe", + "state": "CO", + "county": "Montrose" + }, + { + "zip_code": 81426, + "latitude": 37.843026, + "longitude": -107.86454, + "city": "Ophir", + "state": "CO", + "county": "San Miguel" + }, + { + "zip_code": 81427, + "latitude": 38.087654, + "longitude": -107.728712, + "city": "Ouray", + "state": "CO", + "county": "Ouray" + }, + { + "zip_code": 81428, + "latitude": 38.877198, + "longitude": -107.609167, + "city": "Paonia", + "state": "CO", + "county": "Delta" + }, + { + "zip_code": 81429, + "latitude": 38.371101, + "longitude": -108.969823, + "city": "Paradox", + "state": "CO", + "county": "Montrose" + }, + { + "zip_code": 81430, + "latitude": 38.059321, + "longitude": -107.990438, + "city": "Placerville", + "state": "CO", + "county": "San Miguel" + }, + { + "zip_code": 81431, + "latitude": 38.192224, + "longitude": -108.415514, + "city": "Redvale", + "state": "CO", + "county": "Montrose" + }, + { + "zip_code": 81432, + "latitude": 38.177464, + "longitude": -107.72736, + "city": "Ridgway", + "state": "CO", + "county": "Ouray" + }, + { + "zip_code": 81433, + "latitude": 37.848391, + "longitude": -107.680381, + "city": "Silverton", + "state": "CO", + "county": "San Juan" + }, + { + "zip_code": 81434, + "latitude": 38.988409, + "longitude": -107.231438, + "city": "Somerset", + "state": "CO", + "county": "Gunnison" + }, + { + "zip_code": 81435, + "latitude": 37.983589, + "longitude": -107.956606, + "city": "Telluride", + "state": "CO", + "county": "San Miguel" + }, + { + "zip_code": 81501, + "latitude": 39.069019, + "longitude": -108.583126, + "city": "Grand Junction", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81502, + "latitude": 39.017876, + "longitude": -108.481354, + "city": "Grand Junction", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81503, + "latitude": 39.013584, + "longitude": -108.591229, + "city": "Grand Junction", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81504, + "latitude": 39.123554, + "longitude": -108.589414, + "city": "Grand Junction", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81505, + "latitude": 39.14657, + "longitude": -108.626481, + "city": "Grand Junction", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81506, + "latitude": 39.089167, + "longitude": -108.566523, + "city": "Grand Junction", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81520, + "latitude": 39.08246, + "longitude": -108.404055, + "city": "Clifton", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81521, + "latitude": 39.149614, + "longitude": -108.685164, + "city": "Fruita", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81522, + "latitude": 38.678448, + "longitude": -108.971863, + "city": "Gateway", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81523, + "latitude": 38.989416, + "longitude": -108.78097, + "city": "Glade Park", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81524, + "latitude": 39.256425, + "longitude": -108.78446, + "city": "Loma", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81525, + "latitude": 39.246379, + "longitude": -108.933957, + "city": "Mack", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81526, + "latitude": 39.095369, + "longitude": -108.299254, + "city": "Palisade", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81527, + "latitude": 38.814573, + "longitude": -108.604695, + "city": "Whitewater", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81601, + "latitude": 39.500281, + "longitude": -107.585235, + "city": "Glenwood Springs", + "state": "CO", + "county": "Garfield" + }, + { + "zip_code": 81602, + "latitude": 39.511742, + "longitude": -107.325336, + "city": "Glenwood Springs", + "state": "CO", + "county": "Garfield" + }, + { + "zip_code": 81610, + "latitude": 40.36715, + "longitude": -108.277407, + "city": "Dinosaur", + "state": "CO", + "county": "Moffat" + }, + { + "zip_code": 81611, + "latitude": 39.169324, + "longitude": -106.776744, + "city": "Aspen", + "state": "CO", + "county": "Pitkin" + }, + { + "zip_code": 81612, + "latitude": 39.223416, + "longitude": -106.882774, + "city": "Aspen", + "state": "CO", + "county": "Pitkin" + }, + { + "zip_code": 81615, + "latitude": 39.206518, + "longitude": -106.868877, + "city": "Snowmass Village", + "state": "CO", + "county": "Pitkin" + }, + { + "zip_code": 81620, + "latitude": 39.631349, + "longitude": -106.510843, + "city": "Avon", + "state": "CO", + "county": "Eagle" + }, + { + "zip_code": 81621, + "latitude": 39.495223, + "longitude": -106.804842, + "city": "Basalt", + "state": "CO", + "county": "Eagle" + }, + { + "zip_code": 81623, + "latitude": 39.476857, + "longitude": -107.38813, + "city": "Carbondale", + "state": "CO", + "county": "Garfield" + }, + { + "zip_code": 81624, + "latitude": 39.205633, + "longitude": -107.929135, + "city": "Collbran", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81625, + "latitude": 40.612421, + "longitude": -108.009784, + "city": "Craig", + "state": "CO", + "county": "Moffat" + }, + { + "zip_code": 81626, + "latitude": 40.667669, + "longitude": -107.783276, + "city": "Craig", + "state": "CO", + "county": "Moffat" + }, + { + "zip_code": 81630, + "latitude": 39.292409, + "longitude": -108.210688, + "city": "De Beque", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81631, + "latitude": 39.607401, + "longitude": -106.805111, + "city": "Eagle", + "state": "CO", + "county": "Eagle" + }, + { + "zip_code": 81632, + "latitude": 39.638166, + "longitude": -106.620644, + "city": "Edwards", + "state": "CO", + "county": "Eagle" + }, + { + "zip_code": 81633, + "latitude": 40.377031, + "longitude": -108.398991, + "city": "Dinosaur", + "state": "CO", + "county": "Moffat" + }, + { + "zip_code": 81635, + "latitude": 39.458498, + "longitude": -107.878874, + "city": "Parachute", + "state": "CO", + "county": "Garfield" + }, + { + "zip_code": 81636, + "latitude": 39.430535, + "longitude": -108.023924, + "city": "Battlement Mesa", + "state": "CO", + "county": "Garfield" + }, + { + "zip_code": 81637, + "latitude": 39.615505, + "longitude": -106.895722, + "city": "Gypsum", + "state": "CO", + "county": "Eagle" + }, + { + "zip_code": 81638, + "latitude": 40.297591, + "longitude": -107.665731, + "city": "Hamilton", + "state": "CO", + "county": "Moffat" + }, + { + "zip_code": 81639, + "latitude": 40.438195, + "longitude": -107.277181, + "city": "Hayden", + "state": "CO", + "county": "Routt" + }, + { + "zip_code": 81640, + "latitude": 40.673756, + "longitude": -108.369943, + "city": "Maybell", + "state": "CO", + "county": "Moffat" + }, + { + "zip_code": 81641, + "latitude": 39.967864, + "longitude": -108.043592, + "city": "Meeker", + "state": "CO", + "county": "Rio Blanco" + }, + { + "zip_code": 81642, + "latitude": 39.294737, + "longitude": -106.715287, + "city": "Meredith", + "state": "CO", + "county": "Pitkin" + }, + { + "zip_code": 81643, + "latitude": 39.14932, + "longitude": -108.169723, + "city": "Mesa", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81645, + "latitude": 39.580461, + "longitude": -106.417574, + "city": "Minturn", + "state": "CO", + "county": "Eagle" + }, + { + "zip_code": 81646, + "latitude": 39.165152, + "longitude": -108.076508, + "city": "Molina", + "state": "CO", + "county": "Mesa" + }, + { + "zip_code": 81647, + "latitude": 39.597433, + "longitude": -107.566159, + "city": "New Castle", + "state": "CO", + "county": "Garfield" + }, + { + "zip_code": 81648, + "latitude": 39.936331, + "longitude": -108.650793, + "city": "Rangely", + "state": "CO", + "county": "Rio Blanco" + }, + { + "zip_code": 81649, + "latitude": 39.458351, + "longitude": -106.385056, + "city": "Red Cliff", + "state": "CO", + "county": "Eagle" + }, + { + "zip_code": 81650, + "latitude": 39.582273, + "longitude": -107.794723, + "city": "Rifle", + "state": "CO", + "county": "Garfield" + }, + { + "zip_code": 81652, + "latitude": 39.502817, + "longitude": -107.665664, + "city": "Silt", + "state": "CO", + "county": "Garfield" + }, + { + "zip_code": 81653, + "latitude": 40.997896, + "longitude": -107.33877, + "city": "Slater", + "state": "CO", + "county": "Moffat" + }, + { + "zip_code": 81654, + "latitude": 39.251721, + "longitude": -106.922425, + "city": "Snowmass", + "state": "CO", + "county": "Pitkin" + }, + { + "zip_code": 81655, + "latitude": 39.79073, + "longitude": -106.696372, + "city": "Wolcott", + "state": "CO", + "county": "Eagle" + }, + { + "zip_code": 81656, + "latitude": 39.283116, + "longitude": -106.898514, + "city": "Woody Creek", + "state": "CO", + "county": "Pitkin" + }, + { + "zip_code": 81657, + "latitude": 39.5824, + "longitude": -106.44873, + "city": "Vail", + "state": "CO", + "county": "Eagle" + }, + { + "zip_code": 81658, + "latitude": 39.624171, + "longitude": -106.497314, + "city": "Vail", + "state": "CO", + "county": "Eagle" + }, + { + "zip_code": 82001, + "latitude": 41.25173, + "longitude": -104.56264, + "city": "Cheyenne", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82002, + "latitude": 41.327351, + "longitude": -104.666365, + "city": "Cheyenne", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82003, + "latitude": 41.219107, + "longitude": -104.661244, + "city": "Cheyenne", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82005, + "latitude": 41.139057, + "longitude": -104.862947, + "city": "Fe Warren Afb", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82006, + "latitude": 41.327351, + "longitude": -104.666365, + "city": "Cheyenne", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82007, + "latitude": 41.209351, + "longitude": -104.666476, + "city": "Cheyenne", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82008, + "latitude": 41.327351, + "longitude": -104.666365, + "city": "Cheyenne", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82009, + "latitude": 41.377698, + "longitude": -104.660353, + "city": "Cheyenne", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82010, + "latitude": 41.327351, + "longitude": -104.666365, + "city": "Cheyenne", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82050, + "latitude": 41.335468, + "longitude": -104.249495, + "city": "Albin", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82051, + "latitude": 41.464065, + "longitude": -105.676771, + "city": "Bosler", + "state": "WY", + "county": "Albany" + }, + { + "zip_code": 82052, + "latitude": 41.110146, + "longitude": -105.325712, + "city": "Buford", + "state": "WY", + "county": "Albany" + }, + { + "zip_code": 82053, + "latitude": 41.235922, + "longitude": -104.378477, + "city": "Burns", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82054, + "latitude": 41.097376, + "longitude": -104.356347, + "city": "Carpenter", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82055, + "latitude": 41.311739, + "longitude": -105.847938, + "city": "Centennial", + "state": "WY", + "county": "Albany" + }, + { + "zip_code": 82058, + "latitude": 42.203504, + "longitude": -105.677952, + "city": "Garrett", + "state": "WY", + "county": "Albany" + }, + { + "zip_code": 82059, + "latitude": 41.047337, + "longitude": -105.151706, + "city": "Granite Canon", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82060, + "latitude": 41.213557, + "longitude": -104.493307, + "city": "Hillsdale", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82061, + "latitude": 41.435318, + "longitude": -105.141679, + "city": "Horse Creek", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82063, + "latitude": 41.053927, + "longitude": -106.076251, + "city": "Jelm", + "state": "WY", + "county": "Albany" + }, + { + "zip_code": 82070, + "latitude": 41.43902, + "longitude": -105.801022, + "city": "Laramie", + "state": "WY", + "county": "Albany" + }, + { + "zip_code": 82071, + "latitude": 41.715061, + "longitude": -105.797388, + "city": "Laramie", + "state": "WY", + "county": "Albany" + }, + { + "zip_code": 82072, + "latitude": 41.582018, + "longitude": -105.708717, + "city": "Laramie", + "state": "WY", + "county": "Albany" + }, + { + "zip_code": 82073, + "latitude": 41.307065, + "longitude": -105.624667, + "city": "Laramie", + "state": "WY", + "county": "Albany" + }, + { + "zip_code": 82081, + "latitude": 41.513944, + "longitude": -104.441122, + "city": "Meriden", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82082, + "latitude": 41.277286, + "longitude": -104.205462, + "city": "Pine Bluffs", + "state": "WY", + "county": "Laramie" + }, + { + "zip_code": 82083, + "latitude": 42.023074, + "longitude": -105.51461, + "city": "Rock River", + "state": "WY", + "county": "Albany" + }, + { + "zip_code": 82084, + "latitude": 41.271207, + "longitude": -105.486538, + "city": "Tie Siding", + "state": "WY", + "county": "Albany" + }, + { + "zip_code": 82190, + "latitude": 44.795733, + "longitude": -110.613731, + "city": "Yellowstone National Park", + "state": "WY", + "county": "Park" + }, + { + "zip_code": 82201, + "latitude": 42.013984, + "longitude": -104.967405, + "city": "Wheatland", + "state": "WY", + "county": "Platte" + }, + { + "zip_code": 82210, + "latitude": 41.74064, + "longitude": -104.871308, + "city": "Chugwater", + "state": "WY", + "county": "Platte" + }, + { + "zip_code": 82212, + "latitude": 42.213334, + "longitude": -104.518529, + "city": "Fort Laramie", + "state": "WY", + "county": "Goshen" + }, + { + "zip_code": 82213, + "latitude": 42.481824, + "longitude": -104.980954, + "city": "Glendo", + "state": "WY", + "county": "Platte" + }, + { + "zip_code": 82214, + "latitude": 42.256819, + "longitude": -104.786912, + "city": "Guernsey", + "state": "WY", + "county": "Platte" + }, + { + "zip_code": 82215, + "latitude": 42.321218, + "longitude": -104.722426, + "city": "Hartville", + "state": "WY", + "county": "Platte" + }, + { + "zip_code": 82217, + "latitude": 42.088115, + "longitude": -104.354049, + "city": "Hawk Springs", + "state": "WY", + "county": "Goshen" + }, + { + "zip_code": 82218, + "latitude": 42.088115, + "longitude": -104.354049, + "city": "Huntley", + "state": "WY", + "county": "Goshen" + }, + { + "zip_code": 82219, + "latitude": 42.088115, + "longitude": -104.354049, + "city": "Jay Em", + "state": "WY", + "county": "Goshen" + }, + { + "zip_code": 82221, + "latitude": 42.088115, + "longitude": -104.354049, + "city": "Lagrange", + "state": "WY", + "county": "Goshen" + }, + { + "zip_code": 82222, + "latitude": 43.152195, + "longitude": -104.59198, + "city": "Lance Creek", + "state": "WY", + "county": "Niobrara" + }, + { + "zip_code": 82223, + "latitude": 42.137939, + "longitude": -104.351273, + "city": "Lingle", + "state": "WY", + "county": "Goshen" + }, + { + "zip_code": 82224, + "latitude": 42.987443, + "longitude": -104.919086, + "city": "Lost Springs", + "state": "WY", + "county": "Converse" + }, + { + "zip_code": 82225, + "latitude": 42.964197, + "longitude": -104.385106, + "city": "Lusk", + "state": "WY", + "county": "Niobrara" + }, + { + "zip_code": 82227, + "latitude": 42.73001, + "longitude": -104.702397, + "city": "Manville", + "state": "WY", + "county": "Niobrara" + }, + { + "zip_code": 82229, + "latitude": 42.787675, + "longitude": -105.063337, + "city": "Shawnee", + "state": "WY", + "county": "Converse" + }, + { + "zip_code": 82240, + "latitude": 42.072314, + "longitude": -104.187474, + "city": "Torrington", + "state": "WY", + "county": "Goshen" + }, + { + "zip_code": 82242, + "latitude": 42.703263, + "longitude": -104.140785, + "city": "Van Tassell", + "state": "WY", + "county": "Niobrara" + }, + { + "zip_code": 82243, + "latitude": 42.088115, + "longitude": -104.354049, + "city": "Veteran", + "state": "WY", + "county": "Goshen" + }, + { + "zip_code": 82244, + "latitude": 42.088115, + "longitude": -104.354049, + "city": "Yoder", + "state": "WY", + "county": "Goshen" + }, + { + "zip_code": 82301, + "latitude": 41.538075, + "longitude": -106.921959, + "city": "Rawlins", + "state": "WY", + "county": "Carbon" + }, + { + "zip_code": 82310, + "latitude": 42.472474, + "longitude": -107.760978, + "city": "Jeffrey City", + "state": "WY", + "county": "Fremont" + }, + { + "zip_code": 82321, + "latitude": 41.025579, + "longitude": -107.569976, + "city": "Baggs", + "state": "WY", + "county": "Carbon" + }, + { + "zip_code": 82322, + "latitude": 42.239404, + "longitude": -107.558882, + "city": "Bairoil", + "state": "WY", + "county": "Sweetwater" + }, + { + "zip_code": 82323, + "latitude": 41.031513, + "longitude": -107.642891, + "city": "Dixon", + "state": "WY", + "county": "Carbon" + }, + { + "zip_code": 82324, + "latitude": 41.687359, + "longitude": -106.414629, + "city": "Elk Mountain", + "state": "WY", + "county": "Carbon" + }, + { + "zip_code": 82325, + "latitude": 41.224462, + "longitude": -106.790506, + "city": "Encampment", + "state": "WY", + "county": "Carbon" + }, + { + "zip_code": 82327, + "latitude": 41.869647, + "longitude": -106.552216, + "city": "Hanna", + "state": "WY", + "county": "Carbon" + }, + { + "zip_code": 82329, + "latitude": 41.834011, + "longitude": -106.180829, + "city": "Medicine Bow", + "state": "WY", + "county": "Carbon" + }, + { + "zip_code": 82331, + "latitude": 41.497994, + "longitude": -106.753979, + "city": "Saratoga", + "state": "WY", + "county": "Carbon" + }, + { + "zip_code": 82332, + "latitude": 41.027293, + "longitude": -107.634563, + "city": "Savery", + "state": "WY", + "county": "Carbon" + }, + { + "zip_code": 82334, + "latitude": 41.780239, + "longitude": -107.117226, + "city": "Sinclair", + "state": "WY", + "county": "Carbon" + }, + { + "zip_code": 82335, + "latitude": 41.71694, + "longitude": -106.999195, + "city": "Walcott", + "state": "WY", + "county": "Carbon" + }, + { + "zip_code": 82336, + "latitude": 41.853191, + "longitude": -107.851852, + "city": "Wamsutter", + "state": "WY", + "county": "Sweetwater" + }, + { + "zip_code": 82401, + "latitude": 44.008105, + "longitude": -108.141457, + "city": "Worland", + "state": "WY", + "county": "Washakie" + }, + { + "zip_code": 82410, + "latitude": 44.346935, + "longitude": -108.165824, + "city": "Basin", + "state": "WY", + "county": "Big Horn" + }, + { + "zip_code": 82411, + "latitude": 44.436282, + "longitude": -108.470326, + "city": "Burlington", + "state": "WY", + "county": "Big Horn" + }, + { + "zip_code": 82412, + "latitude": 44.784396, + "longitude": -108.543965, + "city": "Byron", + "state": "WY", + "county": "Big Horn" + }, + { + "zip_code": 82414, + "latitude": 44.541637, + "longitude": -109.436585, + "city": "Cody", + "state": "WY", + "county": "Park" + }, + { + "zip_code": 82420, + "latitude": 44.884137, + "longitude": -108.463779, + "city": "Cowley", + "state": "WY", + "county": "Big Horn" + }, + { + "zip_code": 82421, + "latitude": 44.702955, + "longitude": -108.335432, + "city": "Deaver", + "state": "WY", + "county": "Big Horn" + }, + { + "zip_code": 82422, + "latitude": 44.583633, + "longitude": -107.883519, + "city": "Emblem", + "state": "WY", + "county": "Big Horn" + }, + { + "zip_code": 82423, + "latitude": 44.971811, + "longitude": -108.622097, + "city": "Frannie", + "state": "WY", + "county": "Park" + }, + { + "zip_code": 82426, + "latitude": 44.477394, + "longitude": -108.130553, + "city": "Greybull", + "state": "WY", + "county": "Big Horn" + }, + { + "zip_code": 82427, + "latitude": 43.76976, + "longitude": -108.454106, + "city": "Hamilton Dome", + "state": "WY", + "county": "Hot Springs" + }, + { + "zip_code": 82428, + "latitude": 44.217942, + "longitude": -107.681792, + "city": "Hyattville", + "state": "WY", + "county": "Big Horn" + }, + { + "zip_code": 82430, + "latitude": 43.804189, + "longitude": -108.180469, + "city": "Kirby", + "state": "WY", + "county": "Hot Springs" + }, + { + "zip_code": 82431, + "latitude": 44.584242, + "longitude": -108.264522, + "city": "Lovell", + "state": "WY", + "county": "Big Horn" + }, + { + "zip_code": 82432, + "latitude": 44.303336, + "longitude": -107.85976, + "city": "Manderson", + "state": "WY", + "county": "Big Horn" + }, + { + "zip_code": 82433, + "latitude": 44.165967, + "longitude": -108.916862, + "city": "Meeteetse", + "state": "WY", + "county": "Park" + }, + { + "zip_code": 82434, + "latitude": 44.532074, + "longitude": -108.423412, + "city": "Otto", + "state": "WY", + "county": "Big Horn" + }, + { + "zip_code": 82435, + "latitude": 44.615962, + "longitude": -108.948914, + "city": "Powell", + "state": "WY", + "county": "Park" + }, + { + "zip_code": 82440, + "latitude": 44.69496, + "longitude": -108.883283, + "city": "Ralston", + "state": "WY", + "county": "Park" + }, + { + "zip_code": 82441, + "latitude": 44.601118, + "longitude": -107.78886, + "city": "Shell", + "state": "WY", + "county": "Big Horn" + }, + { + "zip_code": 82442, + "latitude": 43.908687, + "longitude": -107.530662, + "city": "Ten Sleep", + "state": "WY", + "county": "Washakie" + }, + { + "zip_code": 82443, + "latitude": 43.775844, + "longitude": -108.383949, + "city": "Thermopolis", + "state": "WY", + "county": "Hot Springs" + }, + { + "zip_code": 82450, + "latitude": 44.463071, + "longitude": -109.415501, + "city": "Wapiti", + "state": "WY", + "county": "Park" + }, + { + "zip_code": 82501, + "latitude": 43.180647, + "longitude": -108.925734, + "city": "Riverton", + "state": "WY", + "county": "Fremont" + }, + { + "zip_code": 82510, + "latitude": 43.035809, + "longitude": -108.584486, + "city": "Arapahoe", + "state": "WY", + "county": "Fremont" + }, + { + "zip_code": 82512, + "latitude": 43.362997, + "longitude": -109.221657, + "city": "Crowheart", + "state": "WY", + "county": "Fremont" + }, + { + "zip_code": 82513, + "latitude": 43.549861, + "longitude": -109.704749, + "city": "Dubois", + "state": "WY", + "county": "Fremont" + }, + { + "zip_code": 82514, + "latitude": 43.059931, + "longitude": -108.879125, + "city": "Fort Washakie", + "state": "WY", + "county": "Fremont" + }, + { + "zip_code": 82515, + "latitude": 42.900791, + "longitude": -108.582745, + "city": "Hudson", + "state": "WY", + "county": "Fremont" + }, + { + "zip_code": 82516, + "latitude": 43.267755, + "longitude": -108.933381, + "city": "Kinnear", + "state": "WY", + "county": "Fremont" + }, + { + "zip_code": 82520, + "latitude": 42.920832, + "longitude": -108.591264, + "city": "Lander", + "state": "WY", + "county": "Fremont" + }, + { + "zip_code": 82523, + "latitude": 43.362321, + "longitude": -108.699805, + "city": "Pavillion", + "state": "WY", + "county": "Fremont" + }, + { + "zip_code": 82524, + "latitude": 42.998588, + "longitude": -108.57191, + "city": "Saint Stephens", + "state": "WY", + "county": "Fremont" + }, + { + "zip_code": 82601, + "latitude": 42.859875, + "longitude": -106.312561, + "city": "Casper", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82602, + "latitude": 42.889576, + "longitude": -106.35696, + "city": "Casper", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82604, + "latitude": 42.973745, + "longitude": -106.893746, + "city": "Casper", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82605, + "latitude": 42.966192, + "longitude": -106.807047, + "city": "Casper", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82609, + "latitude": 42.811163, + "longitude": -106.267391, + "city": "Casper", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82615, + "latitude": 41.71694, + "longitude": -106.999195, + "city": "Shirley Basin", + "state": "WY", + "county": "Carbon" + }, + { + "zip_code": 82620, + "latitude": 42.530223, + "longitude": -106.759971, + "city": "Alcova", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82630, + "latitude": 42.966192, + "longitude": -106.807047, + "city": "Arminto", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82631, + "latitude": 42.894249, + "longitude": -105.485243, + "city": "Bill", + "state": "WY", + "county": "Converse" + }, + { + "zip_code": 82633, + "latitude": 42.894084, + "longitude": -105.389691, + "city": "Douglas", + "state": "WY", + "county": "Converse" + }, + { + "zip_code": 82635, + "latitude": 43.407351, + "longitude": -106.263808, + "city": "Edgerton", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82636, + "latitude": 42.899153, + "longitude": -106.175375, + "city": "Evansville", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82637, + "latitude": 42.780251, + "longitude": -105.871922, + "city": "Glenrock", + "state": "WY", + "county": "Converse" + }, + { + "zip_code": 82638, + "latitude": 42.966192, + "longitude": -106.807047, + "city": "Hiland", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82639, + "latitude": 43.720933, + "longitude": -106.541709, + "city": "Kaycee", + "state": "WY", + "county": "Johnson" + }, + { + "zip_code": 82640, + "latitude": 43.565149, + "longitude": -106.172827, + "city": "Linch", + "state": "WY", + "county": "Johnson" + }, + { + "zip_code": 82642, + "latitude": 43.282255, + "longitude": -107.815622, + "city": "Lysite", + "state": "WY", + "county": "Fremont" + }, + { + "zip_code": 82643, + "latitude": 43.405584, + "longitude": -106.278264, + "city": "Midwest", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82644, + "latitude": 42.947954, + "longitude": -106.444584, + "city": "Mills", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82646, + "latitude": 42.966192, + "longitude": -106.807047, + "city": "Natrona", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82648, + "latitude": 42.966192, + "longitude": -106.807047, + "city": "Powder River", + "state": "WY", + "county": "Natrona" + }, + { + "zip_code": 82649, + "latitude": 43.191539, + "longitude": -108.009659, + "city": "Shoshoni", + "state": "WY", + "county": "Fremont" + }, + { + "zip_code": 82701, + "latitude": 43.8397, + "longitude": -104.567814, + "city": "Newcastle", + "state": "WY", + "county": "Weston" + }, + { + "zip_code": 82710, + "latitude": 44.738184, + "longitude": -104.288519, + "city": "Aladdin", + "state": "WY", + "county": "Crook" + }, + { + "zip_code": 82711, + "latitude": 44.68734, + "longitude": -104.441353, + "city": "Alva", + "state": "WY", + "county": "Crook" + }, + { + "zip_code": 82712, + "latitude": 44.543625, + "longitude": -104.074532, + "city": "Beulah", + "state": "WY", + "county": "Crook" + }, + { + "zip_code": 82713, + "latitude": 44.525891, + "longitude": -104.767846, + "city": "Carlile", + "state": "WY", + "county": "Crook" + }, + { + "zip_code": 82714, + "latitude": 44.524758, + "longitude": -104.686692, + "city": "Devils Tower", + "state": "WY", + "county": "Crook" + }, + { + "zip_code": 82715, + "latitude": 43.840033, + "longitude": -104.568128, + "city": "Four Corners", + "state": "WY", + "county": "Weston" + }, + { + "zip_code": 82716, + "latitude": 44.377283, + "longitude": -105.550237, + "city": "Gillette", + "state": "WY", + "county": "Campbell" + }, + { + "zip_code": 82717, + "latitude": 44.304713, + "longitude": -105.495943, + "city": "Gillette", + "state": "WY", + "county": "Campbell" + }, + { + "zip_code": 82718, + "latitude": 43.928249, + "longitude": -105.549244, + "city": "Gillette", + "state": "WY", + "county": "Campbell" + }, + { + "zip_code": 82720, + "latitude": 44.675348, + "longitude": -104.661438, + "city": "Hulett", + "state": "WY", + "county": "Crook" + }, + { + "zip_code": 82721, + "latitude": 44.415431, + "longitude": -104.838916, + "city": "Moorcroft", + "state": "WY", + "county": "Crook" + }, + { + "zip_code": 82723, + "latitude": 44.04631, + "longitude": -104.360224, + "city": "Osage", + "state": "WY", + "county": "Weston" + }, + { + "zip_code": 82725, + "latitude": 44.851059, + "longitude": -105.669641, + "city": "Recluse", + "state": "WY", + "county": "Campbell" + }, + { + "zip_code": 82727, + "latitude": 44.412924, + "longitude": -105.529275, + "city": "Rozet", + "state": "WY", + "county": "Campbell" + }, + { + "zip_code": 82729, + "latitude": 44.352274, + "longitude": -104.420625, + "city": "Sundance", + "state": "WY", + "county": "Crook" + }, + { + "zip_code": 82730, + "latitude": 43.937319, + "longitude": -104.620856, + "city": "Upton", + "state": "WY", + "county": "Weston" + }, + { + "zip_code": 82731, + "latitude": 44.770503, + "longitude": -105.358147, + "city": "Weston", + "state": "WY", + "county": "Campbell" + }, + { + "zip_code": 82732, + "latitude": 43.761422, + "longitude": -105.520135, + "city": "Wright", + "state": "WY", + "county": "Campbell" + }, + { + "zip_code": 82801, + "latitude": 44.780378, + "longitude": -106.837563, + "city": "Sheridan", + "state": "WY", + "county": "Sheridan" + }, + { + "zip_code": 82831, + "latitude": 44.731059, + "longitude": -106.392413, + "city": "Arvada", + "state": "WY", + "county": "Sheridan" + }, + { + "zip_code": 82832, + "latitude": 44.768801, + "longitude": -106.555587, + "city": "Banner", + "state": "WY", + "county": "Sheridan" + }, + { + "zip_code": 82833, + "latitude": 44.653104, + "longitude": -107.024713, + "city": "Big Horn", + "state": "WY", + "county": "Sheridan" + }, + { + "zip_code": 82834, + "latitude": 44.122611, + "longitude": -106.561068, + "city": "Buffalo", + "state": "WY", + "county": "Johnson" + }, + { + "zip_code": 82835, + "latitude": 44.770346, + "longitude": -106.425278, + "city": "Clearmont", + "state": "WY", + "county": "Sheridan" + }, + { + "zip_code": 82836, + "latitude": 44.870973, + "longitude": -107.330606, + "city": "Dayton", + "state": "WY", + "county": "Sheridan" + }, + { + "zip_code": 82837, + "latitude": 44.783153, + "longitude": -106.280598, + "city": "Leiter", + "state": "WY", + "county": "Sheridan" + }, + { + "zip_code": 82838, + "latitude": 44.808925, + "longitude": -107.135181, + "city": "Parkman", + "state": "WY", + "county": "Sheridan" + }, + { + "zip_code": 82839, + "latitude": 44.917078, + "longitude": -107.173995, + "city": "Ranchester", + "state": "WY", + "county": "Sheridan" + }, + { + "zip_code": 82840, + "latitude": 44.497609, + "longitude": -106.870963, + "city": "Saddlestring", + "state": "WY", + "county": "Johnson" + }, + { + "zip_code": 82842, + "latitude": 44.580015, + "longitude": -106.897795, + "city": "Story", + "state": "WY", + "county": "Sheridan" + }, + { + "zip_code": 82844, + "latitude": 44.850012, + "longitude": -107.185309, + "city": "Wolf", + "state": "WY", + "county": "Sheridan" + }, + { + "zip_code": 82845, + "latitude": 44.753413, + "longitude": -106.694907, + "city": "Wyarno", + "state": "WY", + "county": "Sheridan" + }, + { + "zip_code": 82901, + "latitude": 41.634515, + "longitude": -109.149045, + "city": "Rock Springs", + "state": "WY", + "county": "Sweetwater" + }, + { + "zip_code": 82902, + "latitude": 41.631408, + "longitude": -108.963931, + "city": "Rock Springs", + "state": "WY", + "county": "Sweetwater" + }, + { + "zip_code": 82922, + "latitude": 43.221022, + "longitude": -110.152755, + "city": "Bondurant", + "state": "WY", + "county": "Sublette" + }, + { + "zip_code": 82923, + "latitude": 42.723092, + "longitude": -109.582132, + "city": "Boulder", + "state": "WY", + "county": "Sublette" + }, + { + "zip_code": 82925, + "latitude": 43.125465, + "longitude": -109.981117, + "city": "Cora", + "state": "WY", + "county": "Sublette" + }, + { + "zip_code": 82929, + "latitude": 41.758101, + "longitude": -109.745873, + "city": "Little America", + "state": "WY", + "county": "Sweetwater" + }, + { + "zip_code": 82930, + "latitude": 41.233758, + "longitude": -110.664401, + "city": "Evanston", + "state": "WY", + "county": "Uinta" + }, + { + "zip_code": 82931, + "latitude": 41.261943, + "longitude": -110.919995, + "city": "Evanston", + "state": "WY", + "county": "Uinta" + }, + { + "zip_code": 82932, + "latitude": 42.083362, + "longitude": -109.418358, + "city": "Farson", + "state": "WY", + "county": "Sweetwater" + }, + { + "zip_code": 82933, + "latitude": 41.295023, + "longitude": -110.399094, + "city": "Fort Bridger", + "state": "WY", + "county": "Uinta" + }, + { + "zip_code": 82934, + "latitude": 41.537225, + "longitude": -109.763045, + "city": "Granger", + "state": "WY", + "county": "Sweetwater" + }, + { + "zip_code": 82935, + "latitude": 41.51437, + "longitude": -109.427616, + "city": "Green River", + "state": "WY", + "county": "Sweetwater" + }, + { + "zip_code": 82936, + "latitude": 41.024224, + "longitude": -110.173336, + "city": "Lonetree", + "state": "WY", + "county": "Uinta" + }, + { + "zip_code": 82937, + "latitude": 41.331817, + "longitude": -110.303367, + "city": "Lyman", + "state": "WY", + "county": "Uinta" + }, + { + "zip_code": 82938, + "latitude": 41.251079, + "longitude": -109.275019, + "city": "Mc Kinnon", + "state": "WY", + "county": "Sweetwater" + }, + { + "zip_code": 82939, + "latitude": 41.233491, + "longitude": -110.337157, + "city": "Mountain View", + "state": "WY", + "county": "Uinta" + }, + { + "zip_code": 82941, + "latitude": 42.849757, + "longitude": -109.938968, + "city": "Pinedale", + "state": "WY", + "county": "Sublette" + }, + { + "zip_code": 82942, + "latitude": 41.653038, + "longitude": -108.525247, + "city": "Point Of Rocks", + "state": "WY", + "county": "Sweetwater" + }, + { + "zip_code": 82943, + "latitude": 41.669845, + "longitude": -109.191857, + "city": "Reliance", + "state": "WY", + "county": "Sweetwater" + }, + { + "zip_code": 82944, + "latitude": 41.099266, + "longitude": -110.500655, + "city": "Robertson", + "state": "WY", + "county": "Uinta" + }, + { + "zip_code": 82945, + "latitude": 41.7643, + "longitude": -108.968062, + "city": "Superior", + "state": "WY", + "county": "Sweetwater" + }, + { + "zip_code": 83001, + "latitude": 43.452793, + "longitude": -110.739266, + "city": "Jackson", + "state": "WY", + "county": "Teton" + }, + { + "zip_code": 83002, + "latitude": 43.50537, + "longitude": -110.786527, + "city": "Jackson", + "state": "WY", + "county": "Teton" + }, + { + "zip_code": 83011, + "latitude": 43.950896, + "longitude": -110.553181, + "city": "Kelly", + "state": "WY", + "county": "Teton" + }, + { + "zip_code": 83012, + "latitude": 43.550144, + "longitude": -110.747494, + "city": "Moose", + "state": "WY", + "county": "Teton" + }, + { + "zip_code": 83013, + "latitude": 43.950896, + "longitude": -110.553181, + "city": "Moran", + "state": "WY", + "county": "Teton" + }, + { + "zip_code": 83014, + "latitude": 43.482361, + "longitude": -110.839782, + "city": "Wilson", + "state": "WY", + "county": "Teton" + }, + { + "zip_code": 83025, + "latitude": 43.443851, + "longitude": -110.694002, + "city": "Teton Village", + "state": "WY", + "county": "Teton" + }, + { + "zip_code": 83101, + "latitude": 42.368433, + "longitude": -110.514132, + "city": "Kemmerer", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83110, + "latitude": 42.711296, + "longitude": -110.619734, + "city": "Afton", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83111, + "latitude": 42.478175, + "longitude": -110.981561, + "city": "Auburn", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83112, + "latitude": 42.8701, + "longitude": -110.940062, + "city": "Bedford", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83113, + "latitude": 42.648328, + "longitude": -110.124616, + "city": "Big Piney", + "state": "WY", + "county": "Sublette" + }, + { + "zip_code": 83114, + "latitude": 42.247455, + "longitude": -110.941119, + "city": "Cokeville", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83115, + "latitude": 42.785695, + "longitude": -110.186599, + "city": "Daniel", + "state": "WY", + "county": "Sublette" + }, + { + "zip_code": 83116, + "latitude": 41.783935, + "longitude": -110.54, + "city": "Diamondville", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83118, + "latitude": 43.044268, + "longitude": -111.008517, + "city": "Etna", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83119, + "latitude": 42.674643, + "longitude": -111.014786, + "city": "Fairview", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83120, + "latitude": 43.026767, + "longitude": -111.003953, + "city": "Freedom", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83121, + "latitude": 41.796019, + "longitude": -110.537302, + "city": "Frontier", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83122, + "latitude": 42.789343, + "longitude": -110.942061, + "city": "Grover", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83123, + "latitude": 42.206598, + "longitude": -110.286804, + "city": "La Barge", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83124, + "latitude": 41.779459, + "longitude": -110.275995, + "city": "Opal", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83126, + "latitude": 42.587769, + "longitude": -110.916034, + "city": "Smoot", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83127, + "latitude": 42.956988, + "longitude": -110.974174, + "city": "Thayne", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83128, + "latitude": 43.030327, + "longitude": -110.884515, + "city": "Alpine", + "state": "WY", + "county": "Lincoln" + }, + { + "zip_code": 83201, + "latitude": 42.770177, + "longitude": -112.259807, + "city": "Pocatello", + "state": "ID", + "county": "Bannock" + }, + { + "zip_code": 83202, + "latitude": 42.935728, + "longitude": -112.46793, + "city": "Pocatello", + "state": "ID", + "county": "Bannock" + }, + { + "zip_code": 83203, + "latitude": 43.033131, + "longitude": -112.428535, + "city": "Fort Hall", + "state": "ID", + "county": "Bingham" + }, + { + "zip_code": 83204, + "latitude": 42.72575, + "longitude": -112.335661, + "city": "Pocatello", + "state": "ID", + "county": "Bannock" + }, + { + "zip_code": 83205, + "latitude": 42.80616, + "longitude": -112.410283, + "city": "Pocatello", + "state": "ID", + "county": "Bannock" + }, + { + "zip_code": 83206, + "latitude": 42.639474, + "longitude": -112.313836, + "city": "Pocatello", + "state": "ID", + "county": "Bannock" + }, + { + "zip_code": 83209, + "latitude": 42.639474, + "longitude": -112.313836, + "city": "Pocatello", + "state": "ID", + "county": "Bannock" + }, + { + "zip_code": 83210, + "latitude": 43.004883, + "longitude": -112.839971, + "city": "Aberdeen", + "state": "ID", + "county": "Bingham" + }, + { + "zip_code": 83211, + "latitude": 42.635233, + "longitude": -112.945777, + "city": "American Falls", + "state": "ID", + "county": "Power" + }, + { + "zip_code": 83212, + "latitude": 42.512788, + "longitude": -112.542643, + "city": "Arbon", + "state": "ID", + "county": "Power" + }, + { + "zip_code": 83213, + "latitude": 43.634236, + "longitude": -113.213308, + "city": "Arco", + "state": "ID", + "county": "Butte" + }, + { + "zip_code": 83214, + "latitude": 42.566743, + "longitude": -112.259209, + "city": "Arimo", + "state": "ID", + "county": "Bannock" + }, + { + "zip_code": 83215, + "latitude": 43.244795, + "longitude": -112.297912, + "city": "Atomic City", + "state": "ID", + "county": "Bingham" + }, + { + "zip_code": 83217, + "latitude": 42.813756, + "longitude": -111.52793, + "city": "Bancroft", + "state": "ID", + "county": "Caribou" + }, + { + "zip_code": 83218, + "latitude": 43.304278, + "longitude": -112.181741, + "city": "Basalt", + "state": "ID", + "county": "Bingham" + }, + { + "zip_code": 83220, + "latitude": 42.295466, + "longitude": -111.373414, + "city": "Bern", + "state": "ID", + "county": "Bear Lake" + }, + { + "zip_code": 83221, + "latitude": 43.251328, + "longitude": -112.464518, + "city": "Blackfoot", + "state": "ID", + "county": "Bingham" + }, + { + "zip_code": 83223, + "latitude": 42.190025, + "longitude": -111.470801, + "city": "Bloomington", + "state": "ID", + "county": "Bear Lake" + }, + { + "zip_code": 83226, + "latitude": 44.50599, + "longitude": -114.222666, + "city": "Challis", + "state": "ID", + "county": "Custer" + }, + { + "zip_code": 83227, + "latitude": 44.22397, + "longitude": -114.312713, + "city": "Clayton", + "state": "ID", + "county": "Custer" + }, + { + "zip_code": 83228, + "latitude": 42.207519, + "longitude": -111.997341, + "city": "Clifton", + "state": "ID", + "county": "Franklin" + }, + { + "zip_code": 83229, + "latitude": 44.968059, + "longitude": -113.816735, + "city": "Cobalt", + "state": "ID", + "county": "Lemhi" + }, + { + "zip_code": 83230, + "latitude": 42.719102, + "longitude": -111.596651, + "city": "Conda", + "state": "ID", + "county": "Caribou" + }, + { + "zip_code": 83232, + "latitude": 42.145827, + "longitude": -111.97748, + "city": "Dayton", + "state": "ID", + "county": "Franklin" + }, + { + "zip_code": 83233, + "latitude": 42.177359, + "longitude": -111.217381, + "city": "Dingle", + "state": "ID", + "county": "Bear Lake" + }, + { + "zip_code": 83234, + "latitude": 42.473005, + "longitude": -112.120195, + "city": "Downey", + "state": "ID", + "county": "Bannock" + }, + { + "zip_code": 83235, + "latitude": 44.22397, + "longitude": -114.312713, + "city": "Ellis", + "state": "ID", + "county": "Custer" + }, + { + "zip_code": 83236, + "latitude": 43.303218, + "longitude": -112.10957, + "city": "Firth", + "state": "ID", + "county": "Bingham" + }, + { + "zip_code": 83237, + "latitude": 42.028792, + "longitude": -111.787055, + "city": "Franklin", + "state": "ID", + "county": "Franklin" + }, + { + "zip_code": 83238, + "latitude": 42.331048, + "longitude": -111.088609, + "city": "Geneva", + "state": "ID", + "county": "Bear Lake" + }, + { + "zip_code": 83239, + "latitude": 42.472875, + "longitude": -111.435777, + "city": "Georgetown", + "state": "ID", + "county": "Bear Lake" + }, + { + "zip_code": 83241, + "latitude": 42.525874, + "longitude": -111.76691, + "city": "Grace", + "state": "ID", + "county": "Caribou" + }, + { + "zip_code": 83243, + "latitude": 42.234859, + "longitude": -112.599201, + "city": "Holbrook", + "state": "ID", + "county": "Oneida" + }, + { + "zip_code": 83244, + "latitude": 43.908662, + "longitude": -113.087828, + "city": "Howe", + "state": "ID", + "county": "Butte" + }, + { + "zip_code": 83245, + "latitude": 42.670637, + "longitude": -112.248038, + "city": "Inkom", + "state": "ID", + "county": "Bannock" + }, + { + "zip_code": 83246, + "latitude": 42.60197, + "longitude": -112.058039, + "city": "Lava Hot Springs", + "state": "ID", + "county": "Bannock" + }, + { + "zip_code": 83250, + "latitude": 42.611881, + "longitude": -112.207443, + "city": "Mccammon", + "state": "ID", + "county": "Bannock" + }, + { + "zip_code": 83251, + "latitude": 44.017199, + "longitude": -113.740599, + "city": "Mackay", + "state": "ID", + "county": "Custer" + }, + { + "zip_code": 83252, + "latitude": 42.236441, + "longitude": -112.556004, + "city": "Malad City", + "state": "ID", + "county": "Oneida" + }, + { + "zip_code": 83253, + "latitude": 44.968059, + "longitude": -113.816735, + "city": "May", + "state": "ID", + "county": "Lemhi" + }, + { + "zip_code": 83254, + "latitude": 42.28644, + "longitude": -111.29681, + "city": "Montpelier", + "state": "ID", + "county": "Bear Lake" + }, + { + "zip_code": 83255, + "latitude": 43.729598, + "longitude": -113.4544, + "city": "Moore", + "state": "ID", + "county": "Butte" + }, + { + "zip_code": 83256, + "latitude": 43.222648, + "longitude": -112.442253, + "city": "Moreland", + "state": "ID", + "county": "Bingham" + }, + { + "zip_code": 83261, + "latitude": 42.224249, + "longitude": -111.420825, + "city": "Paris", + "state": "ID", + "county": "Bear Lake" + }, + { + "zip_code": 83262, + "latitude": 43.133647, + "longitude": -112.629467, + "city": "Pingree", + "state": "ID", + "county": "Bingham" + }, + { + "zip_code": 83263, + "latitude": 42.207376, + "longitude": -111.812126, + "city": "Preston", + "state": "ID", + "county": "Franklin" + }, + { + "zip_code": 83271, + "latitude": 42.490846, + "longitude": -112.836032, + "city": "Rockland", + "state": "ID", + "county": "Power" + }, + { + "zip_code": 83272, + "latitude": 42.095512, + "longitude": -111.329873, + "city": "Saint Charles", + "state": "ID", + "county": "Bear Lake" + }, + { + "zip_code": 83274, + "latitude": 43.349659, + "longitude": -112.118813, + "city": "Shelley", + "state": "ID", + "county": "Bingham" + }, + { + "zip_code": 83276, + "latitude": 42.772866, + "longitude": -111.634757, + "city": "Soda Springs", + "state": "ID", + "county": "Caribou" + }, + { + "zip_code": 83277, + "latitude": 43.080334, + "longitude": -112.672955, + "city": "Springfield", + "state": "ID", + "county": "Bingham" + }, + { + "zip_code": 83278, + "latitude": 44.371442, + "longitude": -114.856089, + "city": "Stanley", + "state": "ID", + "county": "Custer" + }, + { + "zip_code": 83281, + "latitude": 42.319496, + "longitude": -111.978055, + "city": "Swanlake", + "state": "ID", + "county": "Bannock" + }, + { + "zip_code": 83283, + "latitude": 42.379408, + "longitude": -111.684093, + "city": "Thatcher", + "state": "ID", + "county": "Franklin" + }, + { + "zip_code": 83285, + "latitude": 42.892211, + "longitude": -111.267458, + "city": "Wayan", + "state": "ID", + "county": "Caribou" + }, + { + "zip_code": 83286, + "latitude": 42.060353, + "longitude": -112.013197, + "city": "Weston", + "state": "ID", + "county": "Franklin" + }, + { + "zip_code": 83287, + "latitude": 42.039684, + "longitude": -111.441977, + "city": "Fish Haven", + "state": "ID", + "county": "Bear Lake" + }, + { + "zip_code": 83301, + "latitude": 42.443224, + "longitude": -114.629497, + "city": "Twin Falls", + "state": "ID", + "county": "Twin Falls" + }, + { + "zip_code": 83302, + "latitude": 42.166936, + "longitude": -114.815971, + "city": "Rogerson", + "state": "ID", + "county": "Twin Falls" + }, + { + "zip_code": 83303, + "latitude": 42.456273, + "longitude": -114.519536, + "city": "Twin Falls", + "state": "ID", + "county": "Twin Falls" + }, + { + "zip_code": 83311, + "latitude": 42.339326, + "longitude": -113.461324, + "city": "Albion", + "state": "ID", + "county": "Cassia" + }, + { + "zip_code": 83312, + "latitude": 42.084606, + "longitude": -113.628255, + "city": "Almo", + "state": "ID", + "county": "Cassia" + }, + { + "zip_code": 83313, + "latitude": 43.39476, + "longitude": -114.217718, + "city": "Bellevue", + "state": "ID", + "county": "Blaine" + }, + { + "zip_code": 83314, + "latitude": 42.918993, + "longitude": -114.887601, + "city": "Bliss", + "state": "ID", + "county": "Gooding" + }, + { + "zip_code": 83316, + "latitude": 42.586201, + "longitude": -114.829856, + "city": "Buhl", + "state": "ID", + "county": "Twin Falls" + }, + { + "zip_code": 83318, + "latitude": 42.399472, + "longitude": -113.848558, + "city": "Burley", + "state": "ID", + "county": "Cassia" + }, + { + "zip_code": 83320, + "latitude": 43.391742, + "longitude": -114.076206, + "city": "Carey", + "state": "ID", + "county": "Blaine" + }, + { + "zip_code": 83321, + "latitude": 42.402884, + "longitude": -114.784168, + "city": "Castleford", + "state": "ID", + "county": "Twin Falls" + }, + { + "zip_code": 83322, + "latitude": 43.528155, + "longitude": -114.730694, + "city": "Corral", + "state": "ID", + "county": "Camas" + }, + { + "zip_code": 83323, + "latitude": 42.524527, + "longitude": -113.433757, + "city": "Declo", + "state": "ID", + "county": "Cassia" + }, + { + "zip_code": 83324, + "latitude": 42.888995, + "longitude": -114.289216, + "city": "Dietrich", + "state": "ID", + "county": "Lincoln" + }, + { + "zip_code": 83325, + "latitude": 42.586804, + "longitude": -114.246706, + "city": "Eden", + "state": "ID", + "county": "Jerome" + }, + { + "zip_code": 83327, + "latitude": 43.368419, + "longitude": -114.686706, + "city": "Fairfield", + "state": "ID", + "county": "Camas" + }, + { + "zip_code": 83328, + "latitude": 42.54076, + "longitude": -114.623799, + "city": "Filer", + "state": "ID", + "county": "Twin Falls" + }, + { + "zip_code": 83330, + "latitude": 42.907488, + "longitude": -114.773963, + "city": "Gooding", + "state": "ID", + "county": "Gooding" + }, + { + "zip_code": 83332, + "latitude": 42.807535, + "longitude": -114.86211, + "city": "Hagerman", + "state": "ID", + "county": "Gooding" + }, + { + "zip_code": 83333, + "latitude": 43.54195, + "longitude": -114.31008, + "city": "Hailey", + "state": "ID", + "county": "Blaine" + }, + { + "zip_code": 83334, + "latitude": 42.451937, + "longitude": -114.207144, + "city": "Hansen", + "state": "ID", + "county": "Twin Falls" + }, + { + "zip_code": 83335, + "latitude": 42.596069, + "longitude": -114.071311, + "city": "Hazelton", + "state": "ID", + "county": "Jerome" + }, + { + "zip_code": 83336, + "latitude": 42.564732, + "longitude": -113.809824, + "city": "Heyburn", + "state": "ID", + "county": "Minidoka" + }, + { + "zip_code": 83337, + "latitude": 43.3277, + "longitude": -114.801713, + "city": "Hill City", + "state": "ID", + "county": "Camas" + }, + { + "zip_code": 83338, + "latitude": 42.736869, + "longitude": -114.374568, + "city": "Jerome", + "state": "ID", + "county": "Jerome" + }, + { + "zip_code": 83340, + "latitude": 43.669159, + "longitude": -114.485781, + "city": "Ketchum", + "state": "ID", + "county": "Blaine" + }, + { + "zip_code": 83341, + "latitude": 42.50541, + "longitude": -114.367966, + "city": "Kimberly", + "state": "ID", + "county": "Twin Falls" + }, + { + "zip_code": 83342, + "latitude": 42.274076, + "longitude": -113.392736, + "city": "Malta", + "state": "ID", + "county": "Cassia" + }, + { + "zip_code": 83343, + "latitude": 42.772955, + "longitude": -113.509762, + "city": "Minidoka", + "state": "ID", + "county": "Minidoka" + }, + { + "zip_code": 83344, + "latitude": 42.476903, + "longitude": -114.120513, + "city": "Murtaugh", + "state": "ID", + "county": "Twin Falls" + }, + { + "zip_code": 83346, + "latitude": 42.193954, + "longitude": -113.872032, + "city": "Oakley", + "state": "ID", + "county": "Cassia" + }, + { + "zip_code": 83347, + "latitude": 42.684923, + "longitude": -113.790133, + "city": "Paul", + "state": "ID", + "county": "Minidoka" + }, + { + "zip_code": 83348, + "latitude": 43.298245, + "longitude": -114.023913, + "city": "Picabo", + "state": "ID", + "county": "Blaine" + }, + { + "zip_code": 83349, + "latitude": 43.060804, + "longitude": -114.212408, + "city": "Richfield", + "state": "ID", + "county": "Lincoln" + }, + { + "zip_code": 83350, + "latitude": 42.688753, + "longitude": -113.648077, + "city": "Rupert", + "state": "ID", + "county": "Minidoka" + }, + { + "zip_code": 83352, + "latitude": 43.059165, + "longitude": -114.414825, + "city": "Shoshone", + "state": "ID", + "county": "Lincoln" + }, + { + "zip_code": 83353, + "latitude": 43.684047, + "longitude": -114.527235, + "city": "Sun Valley", + "state": "ID", + "county": "Blaine" + }, + { + "zip_code": 83354, + "latitude": 43.594633, + "longitude": -114.322568, + "city": "Sun Valley", + "state": "ID", + "county": "Blaine" + }, + { + "zip_code": 83355, + "latitude": 42.747536, + "longitude": -114.730593, + "city": "Wendell", + "state": "ID", + "county": "Gooding" + }, + { + "zip_code": 83401, + "latitude": 43.516701, + "longitude": -111.691535, + "city": "Idaho Falls", + "state": "ID", + "county": "Bonneville" + }, + { + "zip_code": 83402, + "latitude": 43.51824, + "longitude": -112.134734, + "city": "Idaho Falls", + "state": "ID", + "county": "Bonneville" + }, + { + "zip_code": 83403, + "latitude": 43.421132, + "longitude": -111.333376, + "city": "Idaho Falls", + "state": "ID", + "county": "Bonneville" + }, + { + "zip_code": 83404, + "latitude": 43.433036, + "longitude": -111.660433, + "city": "Idaho Falls", + "state": "ID", + "county": "Bonneville" + }, + { + "zip_code": 83405, + "latitude": 43.323306, + "longitude": -111.782152, + "city": "Idaho Falls", + "state": "ID", + "county": "Bonneville" + }, + { + "zip_code": 83406, + "latitude": 43.444641, + "longitude": -111.963375, + "city": "Idaho Falls", + "state": "ID", + "county": "Bonneville" + }, + { + "zip_code": 83415, + "latitude": 43.323306, + "longitude": -111.782152, + "city": "Idaho Falls", + "state": "ID", + "county": "Bonneville" + }, + { + "zip_code": 83420, + "latitude": 44.015259, + "longitude": -111.42527, + "city": "Ashton", + "state": "ID", + "county": "Fremont" + }, + { + "zip_code": 83421, + "latitude": 44.001141, + "longitude": -111.535095, + "city": "Chester", + "state": "ID", + "county": "Fremont" + }, + { + "zip_code": 83422, + "latitude": 43.713752, + "longitude": -111.158402, + "city": "Driggs", + "state": "ID", + "county": "Teton" + }, + { + "zip_code": 83423, + "latitude": 44.177432, + "longitude": -112.219898, + "city": "Dubois", + "state": "ID", + "county": "Clark" + }, + { + "zip_code": 83424, + "latitude": 43.872755, + "longitude": -111.153854, + "city": "Felt", + "state": "ID", + "county": "Teton" + }, + { + "zip_code": 83425, + "latitude": 43.878511, + "longitude": -112.260858, + "city": "Hamer", + "state": "ID", + "county": "Jefferson" + }, + { + "zip_code": 83427, + "latitude": 43.407293, + "longitude": -111.854263, + "city": "Iona", + "state": "ID", + "county": "Bonneville" + }, + { + "zip_code": 83428, + "latitude": 43.386149, + "longitude": -111.25273, + "city": "Irwin", + "state": "ID", + "county": "Bonneville" + }, + { + "zip_code": 83429, + "latitude": 44.408347, + "longitude": -111.427555, + "city": "Island Park", + "state": "ID", + "county": "Fremont" + }, + { + "zip_code": 83431, + "latitude": 43.692913, + "longitude": -112.023161, + "city": "Lewisville", + "state": "ID", + "county": "Jefferson" + }, + { + "zip_code": 83433, + "latitude": 44.319199, + "longitude": -111.60171, + "city": "Macks Inn", + "state": "ID", + "county": "Fremont" + }, + { + "zip_code": 83434, + "latitude": 43.714547, + "longitude": -112.041547, + "city": "Menan", + "state": "ID", + "county": "Jefferson" + }, + { + "zip_code": 83435, + "latitude": 43.871293, + "longitude": -112.447757, + "city": "Monteview", + "state": "ID", + "county": "Jefferson" + }, + { + "zip_code": 83436, + "latitude": 43.89767, + "longitude": -111.59402, + "city": "Newdale", + "state": "ID", + "county": "Fremont" + }, + { + "zip_code": 83438, + "latitude": 44.319199, + "longitude": -111.60171, + "city": "Parker", + "state": "ID", + "county": "Fremont" + }, + { + "zip_code": 83440, + "latitude": 43.79132, + "longitude": -111.771375, + "city": "Rexburg", + "state": "ID", + "county": "Madison" + }, + { + "zip_code": 83441, + "latitude": 43.776095, + "longitude": -111.691047, + "city": "Rexburg", + "state": "ID", + "county": "Madison" + }, + { + "zip_code": 83442, + "latitude": 43.692206, + "longitude": -111.889325, + "city": "Rigby", + "state": "ID", + "county": "Jefferson" + }, + { + "zip_code": 83443, + "latitude": 43.641033, + "longitude": -111.71458, + "city": "Ririe", + "state": "ID", + "county": "Jefferson" + }, + { + "zip_code": 83444, + "latitude": 43.698922, + "longitude": -112.173195, + "city": "Roberts", + "state": "ID", + "county": "Jefferson" + }, + { + "zip_code": 83445, + "latitude": 43.962969, + "longitude": -111.703605, + "city": "Saint Anthony", + "state": "ID", + "county": "Fremont" + }, + { + "zip_code": 83446, + "latitude": 44.271785, + "longitude": -112.306237, + "city": "Spencer", + "state": "ID", + "county": "Clark" + }, + { + "zip_code": 83447, + "latitude": 44.319199, + "longitude": -111.60171, + "city": "Squirrel", + "state": "ID", + "county": "Fremont" + }, + { + "zip_code": 83448, + "latitude": 43.847662, + "longitude": -111.693201, + "city": "Sugar City", + "state": "ID", + "county": "Madison" + }, + { + "zip_code": 83449, + "latitude": 43.509657, + "longitude": -111.402336, + "city": "Swan Valley", + "state": "ID", + "county": "Bonneville" + }, + { + "zip_code": 83450, + "latitude": 43.85886, + "longitude": -112.439084, + "city": "Terreton", + "state": "ID", + "county": "Jefferson" + }, + { + "zip_code": 83451, + "latitude": 43.890665, + "longitude": -111.650418, + "city": "Teton", + "state": "ID", + "county": "Fremont" + }, + { + "zip_code": 83452, + "latitude": 43.781382, + "longitude": -111.211829, + "city": "Tetonia", + "state": "ID", + "county": "Teton" + }, + { + "zip_code": 83454, + "latitude": 43.593567, + "longitude": -111.957274, + "city": "Ucon", + "state": "ID", + "county": "Bonneville" + }, + { + "zip_code": 83455, + "latitude": 43.63848, + "longitude": -111.132302, + "city": "Victor", + "state": "ID", + "county": "Teton" + }, + { + "zip_code": 83460, + "latitude": 43.776095, + "longitude": -111.691047, + "city": "Rexburg", + "state": "ID", + "county": "Madison" + }, + { + "zip_code": 83462, + "latitude": 44.968059, + "longitude": -113.816735, + "city": "Carmen", + "state": "ID", + "county": "Lemhi" + }, + { + "zip_code": 83463, + "latitude": 44.968059, + "longitude": -113.816735, + "city": "Gibbonsville", + "state": "ID", + "county": "Lemhi" + }, + { + "zip_code": 83464, + "latitude": 44.968059, + "longitude": -113.816735, + "city": "Leadore", + "state": "ID", + "county": "Lemhi" + }, + { + "zip_code": 83465, + "latitude": 44.968059, + "longitude": -113.816735, + "city": "Lemhi", + "state": "ID", + "county": "Lemhi" + }, + { + "zip_code": 83466, + "latitude": 45.612948, + "longitude": -113.967272, + "city": "North Fork", + "state": "ID", + "county": "Lemhi" + }, + { + "zip_code": 83467, + "latitude": 45.171856, + "longitude": -113.921041, + "city": "Salmon", + "state": "ID", + "county": "Lemhi" + }, + { + "zip_code": 83468, + "latitude": 44.968059, + "longitude": -113.816735, + "city": "Tendoy", + "state": "ID", + "county": "Lemhi" + }, + { + "zip_code": 83469, + "latitude": 44.968059, + "longitude": -113.816735, + "city": "Shoup", + "state": "ID", + "county": "Lemhi" + }, + { + "zip_code": 83501, + "latitude": 46.3646, + "longitude": -116.860852, + "city": "Lewiston", + "state": "ID", + "county": "Nez Perce" + }, + { + "zip_code": 83520, + "latitude": 46.507385, + "longitude": -116.296141, + "city": "Ahsahka", + "state": "ID", + "county": "Clearwater" + }, + { + "zip_code": 83522, + "latitude": 45.688686, + "longitude": -115.596198, + "city": "Cottonwood", + "state": "ID", + "county": "Idaho" + }, + { + "zip_code": 83523, + "latitude": 46.269379, + "longitude": -116.539248, + "city": "Craigmont", + "state": "ID", + "county": "Lewis" + }, + { + "zip_code": 83524, + "latitude": 46.401878, + "longitude": -116.651362, + "city": "Culdesac", + "state": "ID", + "county": "Nez Perce" + }, + { + "zip_code": 83525, + "latitude": 45.822931, + "longitude": -115.791688, + "city": "Elk City", + "state": "ID", + "county": "Idaho" + }, + { + "zip_code": 83526, + "latitude": 46.152621, + "longitude": -116.390762, + "city": "Ferdinand", + "state": "ID", + "county": "Idaho" + }, + { + "zip_code": 83530, + "latitude": 45.869801, + "longitude": -116.19729, + "city": "Grangeville", + "state": "ID", + "county": "Idaho" + }, + { + "zip_code": 83531, + "latitude": 45.889314, + "longitude": -115.557407, + "city": "Fenn", + "state": "ID", + "county": "Idaho" + }, + { + "zip_code": 83533, + "latitude": 45.889314, + "longitude": -115.557407, + "city": "Greencreek", + "state": "ID", + "county": "Idaho" + }, + { + "zip_code": 83535, + "latitude": 46.582376, + "longitude": -116.739999, + "city": "Juliaetta", + "state": "ID", + "county": "Latah" + }, + { + "zip_code": 83536, + "latitude": 46.223289, + "longitude": -116.034292, + "city": "Kamiah", + "state": "ID", + "county": "Lewis" + }, + { + "zip_code": 83537, + "latitude": 46.663944, + "longitude": -116.573632, + "city": "Kendrick", + "state": "ID", + "county": "Latah" + }, + { + "zip_code": 83539, + "latitude": 46.115992, + "longitude": -115.945949, + "city": "Kooskia", + "state": "ID", + "county": "Idaho" + }, + { + "zip_code": 83540, + "latitude": 46.402671, + "longitude": -116.805125, + "city": "Lapwai", + "state": "ID", + "county": "Nez Perce" + }, + { + "zip_code": 83541, + "latitude": 46.549573, + "longitude": -116.377265, + "city": "Lenore", + "state": "ID", + "county": "Clearwater" + }, + { + "zip_code": 83542, + "latitude": 45.536959, + "longitude": -116.323741, + "city": "Lucile", + "state": "ID", + "county": "Idaho" + }, + { + "zip_code": 83543, + "latitude": 46.296282, + "longitude": -116.264274, + "city": "Nezperce", + "state": "ID", + "county": "Lewis" + }, + { + "zip_code": 83544, + "latitude": 46.4976, + "longitude": -116.184848, + "city": "Orofino", + "state": "ID", + "county": "Clearwater" + }, + { + "zip_code": 83545, + "latitude": 46.451381, + "longitude": -116.517114, + "city": "Peck", + "state": "ID", + "county": "Nez Perce" + }, + { + "zip_code": 83546, + "latitude": 46.443665, + "longitude": -115.804849, + "city": "Pierce", + "state": "ID", + "county": "Clearwater" + }, + { + "zip_code": 83547, + "latitude": 45.325345, + "longitude": -116.359122, + "city": "Pollock", + "state": "ID", + "county": "Idaho" + }, + { + "zip_code": 83548, + "latitude": 46.32309, + "longitude": -116.538865, + "city": "Reubens", + "state": "ID", + "county": "Lewis" + }, + { + "zip_code": 83549, + "latitude": 45.400163, + "longitude": -116.351079, + "city": "Riggins", + "state": "ID", + "county": "Idaho" + }, + { + "zip_code": 83551, + "latitude": 46.400349, + "longitude": -116.804544, + "city": "Spalding", + "state": "ID", + "county": "Nez Perce" + }, + { + "zip_code": 83552, + "latitude": 46.117669, + "longitude": -115.974107, + "city": "Stites", + "state": "ID", + "county": "Idaho" + }, + { + "zip_code": 83553, + "latitude": 46.381159, + "longitude": -115.918826, + "city": "Weippe", + "state": "ID", + "county": "Clearwater" + }, + { + "zip_code": 83554, + "latitude": 45.889314, + "longitude": -115.557407, + "city": "White Bird", + "state": "ID", + "county": "Idaho" + }, + { + "zip_code": 83555, + "latitude": 46.24243, + "longitude": -116.544158, + "city": "Winchester", + "state": "ID", + "county": "Lewis" + }, + { + "zip_code": 83601, + "latitude": 43.847915, + "longitude": -115.253751, + "city": "Atlanta", + "state": "ID", + "county": "Elmore" + }, + { + "zip_code": 83602, + "latitude": 44.088695, + "longitude": -116.065807, + "city": "Banks", + "state": "ID", + "county": "Boise" + }, + { + "zip_code": 83604, + "latitude": 42.613957, + "longitude": -115.841917, + "city": "Bruneau", + "state": "ID", + "county": "Owyhee" + }, + { + "zip_code": 83605, + "latitude": 43.630795, + "longitude": -116.717598, + "city": "Caldwell", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83606, + "latitude": 43.724917, + "longitude": -116.798923, + "city": "Caldwell", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83607, + "latitude": 43.618618, + "longitude": -116.750109, + "city": "Caldwell", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83610, + "latitude": 44.642508, + "longitude": -116.690316, + "city": "Cambridge", + "state": "ID", + "county": "Washington" + }, + { + "zip_code": 83611, + "latitude": 44.692713, + "longitude": -115.641659, + "city": "Cascade", + "state": "ID", + "county": "Valley" + }, + { + "zip_code": 83612, + "latitude": 44.853452, + "longitude": -116.548601, + "city": "Council", + "state": "ID", + "county": "Adams" + }, + { + "zip_code": 83615, + "latitude": 44.665905, + "longitude": -116.036911, + "city": "Donnelly", + "state": "ID", + "county": "Valley" + }, + { + "zip_code": 83616, + "latitude": 43.735179, + "longitude": -116.41033, + "city": "Eagle", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83617, + "latitude": 43.908876, + "longitude": -116.492657, + "city": "Emmett", + "state": "ID", + "county": "Gem" + }, + { + "zip_code": 83619, + "latitude": 43.974615, + "longitude": -116.900775, + "city": "Fruitland", + "state": "ID", + "county": "Payette" + }, + { + "zip_code": 83620, + "latitude": 44.817671, + "longitude": -116.429857, + "city": "Fruitvale", + "state": "ID", + "county": "Adams" + }, + { + "zip_code": 83622, + "latitude": 44.091712, + "longitude": -115.909781, + "city": "Garden Valley", + "state": "ID", + "county": "Boise" + }, + { + "zip_code": 83623, + "latitude": 42.950333, + "longitude": -115.310227, + "city": "Glenns Ferry", + "state": "ID", + "county": "Elmore" + }, + { + "zip_code": 83624, + "latitude": 43.300562, + "longitude": -116.510261, + "city": "Grand View", + "state": "ID", + "county": "Owyhee" + }, + { + "zip_code": 83626, + "latitude": 43.679989, + "longitude": -116.76248, + "city": "Greenleaf", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83627, + "latitude": 42.948206, + "longitude": -115.38369, + "city": "Hammett", + "state": "ID", + "county": "Elmore" + }, + { + "zip_code": 83628, + "latitude": 43.635593, + "longitude": -116.96811, + "city": "Homedale", + "state": "ID", + "county": "Owyhee" + }, + { + "zip_code": 83629, + "latitude": 43.969086, + "longitude": -116.11845, + "city": "Horseshoe Bend", + "state": "ID", + "county": "Boise" + }, + { + "zip_code": 83630, + "latitude": 43.602661, + "longitude": -116.790284, + "city": "Huston", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83631, + "latitude": 43.883371, + "longitude": -115.708048, + "city": "Idaho City", + "state": "ID", + "county": "Boise" + }, + { + "zip_code": 83632, + "latitude": 44.560567, + "longitude": -116.462903, + "city": "Indian Valley", + "state": "ID", + "county": "Adams" + }, + { + "zip_code": 83633, + "latitude": 42.979861, + "longitude": -115.189933, + "city": "King Hill", + "state": "ID", + "county": "Elmore" + }, + { + "zip_code": 83634, + "latitude": 43.459904, + "longitude": -116.338457, + "city": "Kuna", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83635, + "latitude": 44.68367, + "longitude": -115.453583, + "city": "Lake Fork", + "state": "ID", + "county": "Valley" + }, + { + "zip_code": 83636, + "latitude": 43.896275, + "longitude": -116.646209, + "city": "Letha", + "state": "ID", + "county": "Gem" + }, + { + "zip_code": 83637, + "latitude": 44.108217, + "longitude": -115.481823, + "city": "Lowman", + "state": "ID", + "county": "Boise" + }, + { + "zip_code": 83638, + "latitude": 44.75196, + "longitude": -116.057987, + "city": "Mccall", + "state": "ID", + "county": "Valley" + }, + { + "zip_code": 83639, + "latitude": 43.388977, + "longitude": -116.731362, + "city": "Marsing", + "state": "ID", + "county": "Owyhee" + }, + { + "zip_code": 83641, + "latitude": 43.389331, + "longitude": -116.583102, + "city": "Melba", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83642, + "latitude": 43.579067, + "longitude": -116.421656, + "city": "Meridian", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83643, + "latitude": 44.625475, + "longitude": -116.449286, + "city": "Mesa", + "state": "ID", + "county": "Adams" + }, + { + "zip_code": 83644, + "latitude": 43.577401, + "longitude": -116.590338, + "city": "Middleton", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83645, + "latitude": 44.38304, + "longitude": -116.651974, + "city": "Midvale", + "state": "ID", + "county": "Washington" + }, + { + "zip_code": 83647, + "latitude": 43.156195, + "longitude": -115.720455, + "city": "Mountain Home", + "state": "ID", + "county": "Elmore" + }, + { + "zip_code": 83648, + "latitude": 43.009282, + "longitude": -115.588317, + "city": "Mountain Home A F B", + "state": "ID", + "county": "Elmore" + }, + { + "zip_code": 83650, + "latitude": 42.838437, + "longitude": -116.032163, + "city": "Murphy", + "state": "ID", + "county": "Owyhee" + }, + { + "zip_code": 83651, + "latitude": 43.595567, + "longitude": -116.61063, + "city": "Nampa", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83652, + "latitude": 43.70713, + "longitude": -116.620774, + "city": "Nampa", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83653, + "latitude": 43.585149, + "longitude": -116.752963, + "city": "Nampa", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83654, + "latitude": 45.086839, + "longitude": -116.303451, + "city": "New Meadows", + "state": "ID", + "county": "Adams" + }, + { + "zip_code": 83655, + "latitude": 43.95779, + "longitude": -116.813237, + "city": "New Plymouth", + "state": "ID", + "county": "Payette" + }, + { + "zip_code": 83656, + "latitude": 43.725933, + "longitude": -116.799727, + "city": "Notus", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83657, + "latitude": 44.241764, + "longitude": -116.273214, + "city": "Ola", + "state": "ID", + "county": "Gem" + }, + { + "zip_code": 83660, + "latitude": 43.785082, + "longitude": -116.897455, + "city": "Parma", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83661, + "latitude": 44.063604, + "longitude": -116.750704, + "city": "Payette", + "state": "ID", + "county": "Payette" + }, + { + "zip_code": 83666, + "latitude": 44.004244, + "longitude": -115.966981, + "city": "Placerville", + "state": "ID", + "county": "Boise" + }, + { + "zip_code": 83669, + "latitude": 43.713037, + "longitude": -116.485429, + "city": "Star", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83670, + "latitude": 43.989971, + "longitude": -116.328567, + "city": "Sweet", + "state": "ID", + "county": "Gem" + }, + { + "zip_code": 83671, + "latitude": 45.889314, + "longitude": -115.557407, + "city": "Warren", + "state": "ID", + "county": "Idaho" + }, + { + "zip_code": 83672, + "latitude": 44.304193, + "longitude": -116.859937, + "city": "Weiser", + "state": "ID", + "county": "Washington" + }, + { + "zip_code": 83676, + "latitude": 43.657855, + "longitude": -116.919629, + "city": "Wilder", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83677, + "latitude": 44.68367, + "longitude": -115.453583, + "city": "Yellow Pine", + "state": "ID", + "county": "Valley" + }, + { + "zip_code": 83680, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Meridian", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83686, + "latitude": 43.549984, + "longitude": -116.612678, + "city": "Nampa", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83687, + "latitude": 43.602302, + "longitude": -116.552636, + "city": "Nampa", + "state": "ID", + "county": "Canyon" + }, + { + "zip_code": 83701, + "latitude": 43.603768, + "longitude": -116.272921, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83702, + "latitude": 43.661963, + "longitude": -116.195004, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83703, + "latitude": 43.680432, + "longitude": -116.248664, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83704, + "latitude": 43.641467, + "longitude": -116.290009, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83705, + "latitude": 43.565639, + "longitude": -116.223203, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83706, + "latitude": 43.478618, + "longitude": -116.137752, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83707, + "latitude": 43.38469, + "longitude": -115.997118, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83708, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83709, + "latitude": 43.558127, + "longitude": -116.276002, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83711, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83712, + "latitude": 43.58775, + "longitude": -116.139425, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83713, + "latitude": 43.634002, + "longitude": -116.341948, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83714, + "latitude": 43.6428, + "longitude": -116.282554, + "city": "Garden City", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83715, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83716, + "latitude": 43.441445, + "longitude": -116.079142, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83717, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83719, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83720, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83721, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83722, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83723, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83724, + "latitude": 43.619477, + "longitude": -116.195159, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83725, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83726, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83727, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83728, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83729, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83730, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83731, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83732, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83733, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83735, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83744, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83756, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83757, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83788, + "latitude": 43.60682, + "longitude": -116.282259, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83799, + "latitude": 43.459855, + "longitude": -116.243984, + "city": "Boise", + "state": "ID", + "county": "Ada" + }, + { + "zip_code": 83801, + "latitude": 47.922361, + "longitude": -116.686007, + "city": "Athol", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83802, + "latitude": 47.501205, + "longitude": -115.644501, + "city": "Avery", + "state": "ID", + "county": "Shoshone" + }, + { + "zip_code": 83803, + "latitude": 47.982174, + "longitude": -116.549408, + "city": "Bayview", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83804, + "latitude": 48.274708, + "longitude": -116.604444, + "city": "Blanchard", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83805, + "latitude": 48.814078, + "longitude": -116.398202, + "city": "Bonners Ferry", + "state": "ID", + "county": "Boundary" + }, + { + "zip_code": 83806, + "latitude": 46.871563, + "longitude": -116.407235, + "city": "Bovill", + "state": "ID", + "county": "Latah" + }, + { + "zip_code": 83808, + "latitude": 47.501205, + "longitude": -115.644501, + "city": "Calder", + "state": "ID", + "county": "Shoshone" + }, + { + "zip_code": 83809, + "latitude": 48.048216, + "longitude": -116.59389, + "city": "Careywood", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83810, + "latitude": 47.527719, + "longitude": -116.453134, + "city": "Cataldo", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83811, + "latitude": 48.115891, + "longitude": -116.128983, + "city": "Clark Fork", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83812, + "latitude": 46.974333, + "longitude": -116.28108, + "city": "Clarkia", + "state": "ID", + "county": "Shoshone" + }, + { + "zip_code": 83813, + "latitude": 48.087984, + "longitude": -116.614684, + "city": "Cocolalla", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83814, + "latitude": 47.728441, + "longitude": -116.780869, + "city": "Coeur D Alene", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83815, + "latitude": 47.837453, + "longitude": -116.718533, + "city": "Coeur D Alene", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83816, + "latitude": 47.678798, + "longitude": -116.682718, + "city": "Coeur D Alene", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83821, + "latitude": 48.607807, + "longitude": -116.84866, + "city": "Coolin", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83822, + "latitude": 48.155185, + "longitude": -116.978066, + "city": "Oldtown", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83823, + "latitude": 46.777036, + "longitude": -116.525556, + "city": "Deary", + "state": "ID", + "county": "Latah" + }, + { + "zip_code": 83824, + "latitude": 47.146411, + "longitude": -116.915483, + "city": "Desmet", + "state": "ID", + "county": "Benewah" + }, + { + "zip_code": 83825, + "latitude": 48.36875, + "longitude": -116.545493, + "city": "Dover", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83826, + "latitude": 48.750618, + "longitude": -116.54067, + "city": "Eastport", + "state": "ID", + "county": "Boundary" + }, + { + "zip_code": 83827, + "latitude": 46.779553, + "longitude": -116.214523, + "city": "Elk River", + "state": "ID", + "county": "Clearwater" + }, + { + "zip_code": 83830, + "latitude": 47.112423, + "longitude": -116.528526, + "city": "Fernwood", + "state": "ID", + "county": "Benewah" + }, + { + "zip_code": 83832, + "latitude": 46.604181, + "longitude": -116.903754, + "city": "Genesee", + "state": "ID", + "county": "Latah" + }, + { + "zip_code": 83833, + "latitude": 47.501761, + "longitude": -116.751226, + "city": "Harrison", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83834, + "latitude": 46.924095, + "longitude": -116.715837, + "city": "Harvard", + "state": "ID", + "county": "Latah" + }, + { + "zip_code": 83835, + "latitude": 47.798886, + "longitude": -116.742254, + "city": "Hayden", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83836, + "latitude": 48.248701, + "longitude": -116.279202, + "city": "Hope", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83837, + "latitude": 47.515352, + "longitude": -116.01766, + "city": "Kellogg", + "state": "ID", + "county": "Shoshone" + }, + { + "zip_code": 83839, + "latitude": 47.574471, + "longitude": -116.145637, + "city": "Kingston", + "state": "ID", + "county": "Shoshone" + }, + { + "zip_code": 83840, + "latitude": 48.314378, + "longitude": -116.515276, + "city": "Kootenai", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83841, + "latitude": 48.179085, + "longitude": -116.824602, + "city": "Laclede", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83842, + "latitude": 47.464178, + "longitude": -116.659053, + "city": "Medimont", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83843, + "latitude": 46.735334, + "longitude": -116.870147, + "city": "Moscow", + "state": "ID", + "county": "Latah" + }, + { + "zip_code": 83844, + "latitude": 46.836284, + "longitude": -116.684553, + "city": "Moscow", + "state": "ID", + "county": "Latah" + }, + { + "zip_code": 83845, + "latitude": 48.695988, + "longitude": -116.305402, + "city": "Moyie Springs", + "state": "ID", + "county": "Boundary" + }, + { + "zip_code": 83846, + "latitude": 47.465825, + "longitude": -115.765951, + "city": "Mullan", + "state": "ID", + "county": "Shoshone" + }, + { + "zip_code": 83847, + "latitude": 48.694804, + "longitude": -116.304264, + "city": "Naples", + "state": "ID", + "county": "Boundary" + }, + { + "zip_code": 83848, + "latitude": 48.614631, + "longitude": -116.925844, + "city": "Nordman", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83849, + "latitude": 47.521132, + "longitude": -116.021029, + "city": "Osburn", + "state": "ID", + "county": "Shoshone" + }, + { + "zip_code": 83850, + "latitude": 47.494941, + "longitude": -116.041059, + "city": "Pinehurst", + "state": "ID", + "county": "Shoshone" + }, + { + "zip_code": 83851, + "latitude": 47.243487, + "longitude": -116.862018, + "city": "Plummer", + "state": "ID", + "county": "Benewah" + }, + { + "zip_code": 83852, + "latitude": 48.411377, + "longitude": -116.731899, + "city": "Ponderay", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83853, + "latitude": 48.750618, + "longitude": -116.54067, + "city": "Porthill", + "state": "ID", + "county": "Boundary" + }, + { + "zip_code": 83854, + "latitude": 47.795737, + "longitude": -116.946395, + "city": "Post Falls", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83855, + "latitude": 46.950211, + "longitude": -116.935859, + "city": "Potlatch", + "state": "ID", + "county": "Latah" + }, + { + "zip_code": 83856, + "latitude": 48.324253, + "longitude": -116.669154, + "city": "Priest River", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83857, + "latitude": 46.884343, + "longitude": -116.804736, + "city": "Princeton", + "state": "ID", + "county": "Latah" + }, + { + "zip_code": 83858, + "latitude": 47.845814, + "longitude": -116.839411, + "city": "Rathdrum", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83860, + "latitude": 48.193853, + "longitude": -116.644705, + "city": "Sagle", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83861, + "latitude": 47.279233, + "longitude": -116.646826, + "city": "Saint Maries", + "state": "ID", + "county": "Benewah" + }, + { + "zip_code": 83862, + "latitude": 48.36875, + "longitude": -116.545493, + "city": "Samuels", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83864, + "latitude": 48.299486, + "longitude": -116.553968, + "city": "Sandpoint", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83865, + "latitude": 48.363251, + "longitude": -116.625594, + "city": "Colburn", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 83866, + "latitude": 47.154416, + "longitude": -116.430997, + "city": "Santa", + "state": "ID", + "county": "Benewah" + }, + { + "zip_code": 83867, + "latitude": 47.498078, + "longitude": -115.965732, + "city": "Silverton", + "state": "ID", + "county": "Shoshone" + }, + { + "zip_code": 83868, + "latitude": 47.536163, + "longitude": -116.206234, + "city": "Smelterville", + "state": "ID", + "county": "Shoshone" + }, + { + "zip_code": 83869, + "latitude": 47.944549, + "longitude": -116.811536, + "city": "Spirit Lake", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83870, + "latitude": 47.147494, + "longitude": -116.918177, + "city": "Tensed", + "state": "ID", + "county": "Benewah" + }, + { + "zip_code": 83871, + "latitude": 46.75717, + "longitude": -116.714214, + "city": "Troy", + "state": "ID", + "county": "Latah" + }, + { + "zip_code": 83872, + "latitude": 46.871724, + "longitude": -116.967516, + "city": "Viola", + "state": "ID", + "county": "Latah" + }, + { + "zip_code": 83873, + "latitude": 47.553491, + "longitude": -116.01401, + "city": "Wallace", + "state": "ID", + "county": "Shoshone" + }, + { + "zip_code": 83874, + "latitude": 47.501205, + "longitude": -115.644501, + "city": "Murray", + "state": "ID", + "county": "Shoshone" + }, + { + "zip_code": 83876, + "latitude": 47.456856, + "longitude": -116.898603, + "city": "Worley", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83877, + "latitude": 47.678798, + "longitude": -116.682718, + "city": "Post Falls", + "state": "ID", + "county": "Kootenai" + }, + { + "zip_code": 83888, + "latitude": 48.36875, + "longitude": -116.545493, + "city": "Sandpoint", + "state": "ID", + "county": "Bonner" + }, + { + "zip_code": 84001, + "latitude": 40.320728, + "longitude": -110.435974, + "city": "Altamont", + "state": "UT", + "county": "Duchesne" + }, + { + "zip_code": 84002, + "latitude": 40.320728, + "longitude": -110.435974, + "city": "Altonah", + "state": "UT", + "county": "Duchesne" + }, + { + "zip_code": 84003, + "latitude": 40.395796, + "longitude": -111.803101, + "city": "American Fork", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84004, + "latitude": 40.459133, + "longitude": -111.773164, + "city": "Alpine", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84006, + "latitude": 40.592045, + "longitude": -112.0786, + "city": "Bingham Canyon", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84007, + "latitude": 40.312539, + "longitude": -110.229816, + "city": "Bluebell", + "state": "UT", + "county": "Duchesne" + }, + { + "zip_code": 84008, + "latitude": 40.443106, + "longitude": -109.505593, + "city": "Bonanza", + "state": "UT", + "county": "Uintah" + }, + { + "zip_code": 84010, + "latitude": 40.874038, + "longitude": -111.870994, + "city": "Bountiful", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84011, + "latitude": 40.963547, + "longitude": -112.115984, + "city": "Bountiful", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84013, + "latitude": 40.183311, + "longitude": -111.919871, + "city": "Cedar Valley", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84014, + "latitude": 40.929547, + "longitude": -111.889651, + "city": "Centerville", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84015, + "latitude": 41.017594, + "longitude": -111.995023, + "city": "Clearfield", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84016, + "latitude": 40.892995, + "longitude": -111.888121, + "city": "Clearfield", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84017, + "latitude": 40.840518, + "longitude": -111.322754, + "city": "Coalville", + "state": "UT", + "county": "Summit" + }, + { + "zip_code": 84018, + "latitude": 41.090456, + "longitude": -111.486959, + "city": "Croydon", + "state": "UT", + "county": "Morgan" + }, + { + "zip_code": 84020, + "latitude": 40.506148, + "longitude": -111.869671, + "city": "Draper", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84021, + "latitude": 40.193815, + "longitude": -110.31321, + "city": "Duchesne", + "state": "UT", + "county": "Duchesne" + }, + { + "zip_code": 84022, + "latitude": 40.270806, + "longitude": -112.689833, + "city": "Dugway", + "state": "UT", + "county": "Tooele" + }, + { + "zip_code": 84023, + "latitude": 40.936315, + "longitude": -109.432883, + "city": "Dutch John", + "state": "UT", + "county": "Daggett" + }, + { + "zip_code": 84024, + "latitude": 40.989171, + "longitude": -111.451001, + "city": "Echo", + "state": "UT", + "county": "Summit" + }, + { + "zip_code": 84025, + "latitude": 40.969069, + "longitude": -111.907344, + "city": "Farmington", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84026, + "latitude": 40.290515, + "longitude": -109.846675, + "city": "Fort Duchesne", + "state": "UT", + "county": "Uintah" + }, + { + "zip_code": 84027, + "latitude": 40.320728, + "longitude": -110.435974, + "city": "Fruitland", + "state": "UT", + "county": "Duchesne" + }, + { + "zip_code": 84028, + "latitude": 41.907816, + "longitude": -111.379691, + "city": "Garden City", + "state": "UT", + "county": "Rich" + }, + { + "zip_code": 84029, + "latitude": 40.560384, + "longitude": -112.54061, + "city": "Grantsville", + "state": "UT", + "county": "Tooele" + }, + { + "zip_code": 84030, + "latitude": 40.160179, + "longitude": -109.547839, + "city": "Gusher", + "state": "UT", + "county": "Uintah" + }, + { + "zip_code": 84031, + "latitude": 40.428901, + "longitude": -110.807816, + "city": "Hanna", + "state": "UT", + "county": "Duchesne" + }, + { + "zip_code": 84032, + "latitude": 40.517678, + "longitude": -111.348882, + "city": "Heber City", + "state": "UT", + "county": "Wasatch" + }, + { + "zip_code": 84033, + "latitude": 41.018639, + "longitude": -111.501094, + "city": "Henefer", + "state": "UT", + "county": "Summit" + }, + { + "zip_code": 84034, + "latitude": 40.489989, + "longitude": -113.095905, + "city": "Ibapah", + "state": "UT", + "county": "Tooele" + }, + { + "zip_code": 84035, + "latitude": 40.344753, + "longitude": -109.387441, + "city": "Jensen", + "state": "UT", + "county": "Uintah" + }, + { + "zip_code": 84036, + "latitude": 40.667933, + "longitude": -111.312427, + "city": "Kamas", + "state": "UT", + "county": "Summit" + }, + { + "zip_code": 84037, + "latitude": 40.960691, + "longitude": -111.92797, + "city": "Kaysville", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84038, + "latitude": 41.858357, + "longitude": -111.349487, + "city": "Laketown", + "state": "UT", + "county": "Rich" + }, + { + "zip_code": 84039, + "latitude": 40.485962, + "longitude": -109.774553, + "city": "Lapoint", + "state": "UT", + "county": "Uintah" + }, + { + "zip_code": 84040, + "latitude": 41.088889, + "longitude": -111.92614, + "city": "Layton", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84041, + "latitude": 41.059863, + "longitude": -111.994525, + "city": "Layton", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84042, + "latitude": 40.340251, + "longitude": -111.719923, + "city": "Lindon", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84043, + "latitude": 40.318139, + "longitude": -111.921078, + "city": "Lehi", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84044, + "latitude": 40.699401, + "longitude": -112.088875, + "city": "Magna", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84046, + "latitude": 40.990039, + "longitude": -109.704889, + "city": "Manila", + "state": "UT", + "county": "Daggett" + }, + { + "zip_code": 84047, + "latitude": 40.608972, + "longitude": -111.885868, + "city": "Midvale", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84049, + "latitude": 40.489378, + "longitude": -111.485127, + "city": "Midway", + "state": "UT", + "county": "Wasatch" + }, + { + "zip_code": 84050, + "latitude": 41.068883, + "longitude": -111.702746, + "city": "Morgan", + "state": "UT", + "county": "Morgan" + }, + { + "zip_code": 84051, + "latitude": 40.320728, + "longitude": -110.435974, + "city": "Mountain Home", + "state": "UT", + "county": "Duchesne" + }, + { + "zip_code": 84052, + "latitude": 40.200074, + "longitude": -110.049034, + "city": "Myton", + "state": "UT", + "county": "Duchesne" + }, + { + "zip_code": 84053, + "latitude": 40.320728, + "longitude": -110.435974, + "city": "Neola", + "state": "UT", + "county": "Duchesne" + }, + { + "zip_code": 84054, + "latitude": 40.844595, + "longitude": -111.919115, + "city": "North Salt Lake", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84055, + "latitude": 40.724311, + "longitude": -111.24561, + "city": "Oakley", + "state": "UT", + "county": "Summit" + }, + { + "zip_code": 84056, + "latitude": 41.120219, + "longitude": -111.989813, + "city": "Hill Afb", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84057, + "latitude": 40.311353, + "longitude": -111.72496, + "city": "Orem", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84058, + "latitude": 40.2818, + "longitude": -111.72091, + "city": "Orem", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84059, + "latitude": 40.176975, + "longitude": -111.536036, + "city": "Orem", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84060, + "latitude": 40.71188, + "longitude": -111.448892, + "city": "Park City", + "state": "UT", + "county": "Summit" + }, + { + "zip_code": 84061, + "latitude": 40.743379, + "longitude": -111.351178, + "city": "Peoa", + "state": "UT", + "county": "Summit" + }, + { + "zip_code": 84062, + "latitude": 40.386385, + "longitude": -111.732911, + "city": "Pleasant Grove", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84063, + "latitude": 40.30168, + "longitude": -109.806162, + "city": "Randlett", + "state": "UT", + "county": "Uintah" + }, + { + "zip_code": 84064, + "latitude": 41.690895, + "longitude": -111.184512, + "city": "Randolph", + "state": "UT", + "county": "Rich" + }, + { + "zip_code": 84065, + "latitude": 40.495129, + "longitude": -112.00627, + "city": "Riverton", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84066, + "latitude": 40.266539, + "longitude": -110.106937, + "city": "Roosevelt", + "state": "UT", + "county": "Duchesne" + }, + { + "zip_code": 84067, + "latitude": 41.178743, + "longitude": -112.052525, + "city": "Roy", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84068, + "latitude": 40.66797, + "longitude": -111.505365, + "city": "Park City", + "state": "UT", + "county": "Summit" + }, + { + "zip_code": 84069, + "latitude": 40.356629, + "longitude": -112.465914, + "city": "Rush Valley", + "state": "UT", + "county": "Tooele" + }, + { + "zip_code": 84070, + "latitude": 40.578597, + "longitude": -111.859504, + "city": "Sandy", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84071, + "latitude": 40.441463, + "longitude": -112.355926, + "city": "Stockton", + "state": "UT", + "county": "Tooele" + }, + { + "zip_code": 84072, + "latitude": 40.359782, + "longitude": -110.721218, + "city": "Tabiona", + "state": "UT", + "county": "Duchesne" + }, + { + "zip_code": 84073, + "latitude": 40.320728, + "longitude": -110.435974, + "city": "Talmage", + "state": "UT", + "county": "Duchesne" + }, + { + "zip_code": 84074, + "latitude": 40.617392, + "longitude": -113.144159, + "city": "Tooele", + "state": "UT", + "county": "Tooele" + }, + { + "zip_code": 84075, + "latitude": 41.096293, + "longitude": -112.079415, + "city": "Syracuse", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84076, + "latitude": 40.425577, + "longitude": -109.840776, + "city": "Tridell", + "state": "UT", + "county": "Uintah" + }, + { + "zip_code": 84078, + "latitude": 40.368246, + "longitude": -109.556103, + "city": "Vernal", + "state": "UT", + "county": "Uintah" + }, + { + "zip_code": 84079, + "latitude": 40.160179, + "longitude": -109.547839, + "city": "Vernal", + "state": "UT", + "county": "Uintah" + }, + { + "zip_code": 84080, + "latitude": 40.086909, + "longitude": -112.455046, + "city": "Vernon", + "state": "UT", + "county": "Tooele" + }, + { + "zip_code": 84082, + "latitude": 40.410548, + "longitude": -111.394222, + "city": "Wallsburg", + "state": "UT", + "county": "Wasatch" + }, + { + "zip_code": 84083, + "latitude": 40.7329, + "longitude": -113.991849, + "city": "Wendover", + "state": "UT", + "county": "Tooele" + }, + { + "zip_code": 84084, + "latitude": 40.606125, + "longitude": -111.978898, + "city": "West Jordan", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84085, + "latitude": 40.374808, + "longitude": -109.911237, + "city": "Whiterocks", + "state": "UT", + "county": "Uintah" + }, + { + "zip_code": 84086, + "latitude": 41.467578, + "longitude": -111.18365, + "city": "Woodruff", + "state": "UT", + "county": "Rich" + }, + { + "zip_code": 84087, + "latitude": 40.889027, + "longitude": -111.926646, + "city": "Woods Cross", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84088, + "latitude": 40.587629, + "longitude": -111.98342, + "city": "West Jordan", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84089, + "latitude": 40.963547, + "longitude": -112.115984, + "city": "Clearfield", + "state": "UT", + "county": "Davis" + }, + { + "zip_code": 84090, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Sandy", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84091, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Sandy", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84092, + "latitude": 40.583401, + "longitude": -111.746713, + "city": "Sandy", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84093, + "latitude": 40.595025, + "longitude": -111.824566, + "city": "Sandy", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84094, + "latitude": 40.569893, + "longitude": -111.858617, + "city": "Sandy", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84095, + "latitude": 40.554098, + "longitude": -111.953891, + "city": "South Jordan", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84097, + "latitude": 40.297153, + "longitude": -111.670519, + "city": "Orem", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84098, + "latitude": 40.702896, + "longitude": -111.548098, + "city": "Park City", + "state": "UT", + "county": "Summit" + }, + { + "zip_code": 84101, + "latitude": 40.756095, + "longitude": -111.900719, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84102, + "latitude": 40.759246, + "longitude": -111.86259, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84103, + "latitude": 40.785847, + "longitude": -111.869485, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84104, + "latitude": 40.747845, + "longitude": -111.9841, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84105, + "latitude": 40.738153, + "longitude": -111.856517, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84106, + "latitude": 40.707846, + "longitude": -111.836766, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84107, + "latitude": 40.656796, + "longitude": -111.890414, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84108, + "latitude": 40.777078, + "longitude": -111.753274, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84109, + "latitude": 40.707005, + "longitude": -111.744257, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84110, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84111, + "latitude": 40.755596, + "longitude": -111.883718, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84112, + "latitude": 40.765868, + "longitude": -111.840284, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84113, + "latitude": 40.765795, + "longitude": -111.836423, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84114, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84115, + "latitude": 40.714496, + "longitude": -111.893118, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84116, + "latitude": 40.798495, + "longitude": -111.999902, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84117, + "latitude": 40.655097, + "longitude": -111.833966, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84118, + "latitude": 40.650407, + "longitude": -112.005421, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84119, + "latitude": 40.633297, + "longitude": -111.913368, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84120, + "latitude": 40.695045, + "longitude": -112.000072, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84121, + "latitude": 40.622557, + "longitude": -111.777749, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84122, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84123, + "latitude": 40.65963, + "longitude": -111.919269, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84124, + "latitude": 40.653246, + "longitude": -111.820566, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84125, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84126, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84127, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84128, + "latitude": 40.697645, + "longitude": -112.037673, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84130, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84131, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84132, + "latitude": 40.772743, + "longitude": -111.838541, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84133, + "latitude": 40.769046, + "longitude": -111.889319, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84134, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84135, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84136, + "latitude": 40.768546, + "longitude": -111.887869, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84138, + "latitude": 40.671614, + "longitude": -111.74828, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84139, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84140, + "latitude": 40.771345, + "longitude": -111.93087, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84141, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84142, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84143, + "latitude": 40.786886, + "longitude": -111.900832, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84144, + "latitude": 40.767946, + "longitude": -111.890819, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84145, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84147, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84148, + "latitude": 40.756796, + "longitude": -111.837567, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84150, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84151, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84152, + "latitude": 40.728579, + "longitude": -111.66273, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84153, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84157, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84158, + "latitude": 40.768996, + "longitude": -111.762115, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84165, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84170, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84171, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84180, + "latitude": 40.769045, + "longitude": -111.900769, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84184, + "latitude": 40.676839, + "longitude": -111.956811, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84189, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84190, + "latitude": 40.668068, + "longitude": -111.908297, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84193, + "latitude": "", + "longitude": "", + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84194, + "latitude": "", + "longitude": "", + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84195, + "latitude": "", + "longitude": "", + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84199, + "latitude": 40.725946, + "longitude": -111.93942, + "city": "Salt Lake City", + "state": "UT", + "county": "Salt Lake" + }, + { + "zip_code": 84201, + "latitude": 41.244261, + "longitude": -112.007924, + "city": "Ogden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84244, + "latitude": 41.255285, + "longitude": -111.956721, + "city": "Ogden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84301, + "latitude": 41.609266, + "longitude": -112.124107, + "city": "Bear River City", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84302, + "latitude": 41.537922, + "longitude": -112.061761, + "city": "Brigham City", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84304, + "latitude": 41.816936, + "longitude": -111.998197, + "city": "Cache Junction", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84305, + "latitude": 41.919726, + "longitude": -112.030254, + "city": "Clarkston", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84306, + "latitude": 41.781268, + "longitude": -112.066608, + "city": "Collinston", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84307, + "latitude": 41.454713, + "longitude": -112.390322, + "city": "Corinne", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84308, + "latitude": 41.944253, + "longitude": -111.973275, + "city": "Cornish", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84309, + "latitude": 41.713643, + "longitude": -112.097195, + "city": "Deweyville", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84310, + "latitude": 41.339343, + "longitude": -111.738298, + "city": "Eden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84311, + "latitude": 41.628942, + "longitude": -112.094039, + "city": "Fielding", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84312, + "latitude": 41.798402, + "longitude": -112.140361, + "city": "Garland", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84313, + "latitude": 41.500586, + "longitude": -112.957875, + "city": "Grouse Creek", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84314, + "latitude": 41.651978, + "longitude": -112.104979, + "city": "Honeyville", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84315, + "latitude": 41.182343, + "longitude": -112.103475, + "city": "Hooper", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84316, + "latitude": 41.77328, + "longitude": -112.396755, + "city": "Howell", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84317, + "latitude": 41.266035, + "longitude": -111.715855, + "city": "Huntsville", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84318, + "latitude": 41.800028, + "longitude": -111.812321, + "city": "Hyde Park", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84319, + "latitude": 41.717589, + "longitude": -111.879653, + "city": "Hyrum", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84320, + "latitude": 41.816874, + "longitude": -111.874421, + "city": "Lewiston", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84321, + "latitude": 41.76695, + "longitude": -111.885084, + "city": "Logan", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84322, + "latitude": 41.641189, + "longitude": -111.896571, + "city": "Logan", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84323, + "latitude": 41.684253, + "longitude": -111.783783, + "city": "Logan", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84324, + "latitude": 41.492844, + "longitude": -111.9424, + "city": "Mantua", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84325, + "latitude": 41.724699, + "longitude": -111.989806, + "city": "Mendon", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84326, + "latitude": 41.675906, + "longitude": -111.818459, + "city": "Millville", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84327, + "latitude": 41.921329, + "longitude": -112.002633, + "city": "Newton", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84328, + "latitude": 41.548529, + "longitude": -111.81074, + "city": "Paradise", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84329, + "latitude": 41.808234, + "longitude": -113.523193, + "city": "Park Valley", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84330, + "latitude": 41.883058, + "longitude": -112.138837, + "city": "Plymouth", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84331, + "latitude": 41.906183, + "longitude": -112.180605, + "city": "Portage", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84332, + "latitude": 41.797849, + "longitude": -111.915564, + "city": "Providence", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84333, + "latitude": 41.883064, + "longitude": -111.798034, + "city": "Richmond", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84334, + "latitude": 41.786849, + "longitude": -112.146687, + "city": "Riverside", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84335, + "latitude": 41.801798, + "longitude": -111.910101, + "city": "Smithfield", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84336, + "latitude": 41.965964, + "longitude": -112.726895, + "city": "Snowville", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84337, + "latitude": 41.68849, + "longitude": -112.255453, + "city": "Tremonton", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84338, + "latitude": 41.92405, + "longitude": -111.925583, + "city": "Trenton", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84339, + "latitude": 41.637826, + "longitude": -111.917588, + "city": "Wellsville", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84340, + "latitude": 41.387828, + "longitude": -112.04765, + "city": "Willard", + "state": "UT", + "county": "Box Elder" + }, + { + "zip_code": 84341, + "latitude": 41.838005, + "longitude": -111.917217, + "city": "Logan", + "state": "UT", + "county": "Cache" + }, + { + "zip_code": 84401, + "latitude": 41.221328, + "longitude": -111.957685, + "city": "Ogden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84402, + "latitude": 41.255285, + "longitude": -111.956721, + "city": "Ogden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84403, + "latitude": 41.178343, + "longitude": -111.938216, + "city": "Ogden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84404, + "latitude": 41.279292, + "longitude": -112.079805, + "city": "Ogden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84405, + "latitude": 41.171493, + "longitude": -111.968874, + "city": "Ogden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84407, + "latitude": 41.238547, + "longitude": -111.965867, + "city": "Ogden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84408, + "latitude": 41.195593, + "longitude": -111.948474, + "city": "Ogden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84409, + "latitude": 41.255285, + "longitude": -111.956721, + "city": "Ogden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84412, + "latitude": 41.255285, + "longitude": -111.956721, + "city": "Ogden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84414, + "latitude": 41.309184, + "longitude": -111.92559, + "city": "Ogden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84415, + "latitude": 41.255285, + "longitude": -111.956721, + "city": "Ogden", + "state": "UT", + "county": "Weber" + }, + { + "zip_code": 84501, + "latitude": 39.567883, + "longitude": -110.650901, + "city": "Price", + "state": "UT", + "county": "Carbon" + }, + { + "zip_code": 84510, + "latitude": 37.748946, + "longitude": -110.22691, + "city": "Aneth", + "state": "UT", + "county": "San Juan" + }, + { + "zip_code": 84511, + "latitude": 37.566938, + "longitude": -109.44141, + "city": "Blanding", + "state": "UT", + "county": "San Juan" + }, + { + "zip_code": 84512, + "latitude": 37.624663, + "longitude": -109.479932, + "city": "Bluff", + "state": "UT", + "county": "San Juan" + }, + { + "zip_code": 84513, + "latitude": 39.196393, + "longitude": -111.052868, + "city": "Castle Dale", + "state": "UT", + "county": "Emery" + }, + { + "zip_code": 84515, + "latitude": 38.999877, + "longitude": -109.615008, + "city": "Cisco", + "state": "UT", + "county": "Grand" + }, + { + "zip_code": 84516, + "latitude": 39.119759, + "longitude": -111.100814, + "city": "Clawson", + "state": "UT", + "county": "Emery" + }, + { + "zip_code": 84518, + "latitude": 39.373583, + "longitude": -110.893573, + "city": "Cleveland", + "state": "UT", + "county": "Emery" + }, + { + "zip_code": 84520, + "latitude": 39.531795, + "longitude": -110.403536, + "city": "East Carbon", + "state": "UT", + "county": "Carbon" + }, + { + "zip_code": 84521, + "latitude": 39.403255, + "longitude": -110.810027, + "city": "Elmo", + "state": "UT", + "county": "Emery" + }, + { + "zip_code": 84522, + "latitude": 38.9226, + "longitude": -111.251238, + "city": "Emery", + "state": "UT", + "county": "Emery" + }, + { + "zip_code": 84523, + "latitude": 39.14373, + "longitude": -111.118572, + "city": "Ferron", + "state": "UT", + "county": "Emery" + }, + { + "zip_code": 84525, + "latitude": 39.020075, + "longitude": -110.213864, + "city": "Green River", + "state": "UT", + "county": "Emery" + }, + { + "zip_code": 84526, + "latitude": 39.637459, + "longitude": -110.77667, + "city": "Helper", + "state": "UT", + "county": "Carbon" + }, + { + "zip_code": 84527, + "latitude": 39.640779, + "longitude": -110.560697, + "city": "Hiawatha", + "state": "UT", + "county": "Carbon" + }, + { + "zip_code": 84528, + "latitude": 39.283156, + "longitude": -110.961933, + "city": "Huntington", + "state": "UT", + "county": "Emery" + }, + { + "zip_code": 84529, + "latitude": 39.688418, + "longitude": -110.80726, + "city": "Kenilworth", + "state": "UT", + "county": "Carbon" + }, + { + "zip_code": 84530, + "latitude": 37.748946, + "longitude": -110.22691, + "city": "La Sal", + "state": "UT", + "county": "San Juan" + }, + { + "zip_code": 84531, + "latitude": 37.748946, + "longitude": -110.22691, + "city": "Mexican Hat", + "state": "UT", + "county": "San Juan" + }, + { + "zip_code": 84532, + "latitude": 38.5804, + "longitude": -109.54019, + "city": "Moab", + "state": "UT", + "county": "Grand" + }, + { + "zip_code": 84533, + "latitude": 37.748946, + "longitude": -110.22691, + "city": "Lake Powell", + "state": "UT", + "county": "San Juan" + }, + { + "zip_code": 84534, + "latitude": 37.25391, + "longitude": -109.106079, + "city": "Montezuma Creek", + "state": "UT", + "county": "San Juan" + }, + { + "zip_code": 84535, + "latitude": 38.099745, + "longitude": -109.259108, + "city": "Monticello", + "state": "UT", + "county": "San Juan" + }, + { + "zip_code": 84536, + "latitude": 37.280022, + "longitude": -109.56809, + "city": "Monument Valley", + "state": "UT", + "county": "San Juan" + }, + { + "zip_code": 84537, + "latitude": 39.230155, + "longitude": -111.051827, + "city": "Orangeville", + "state": "UT", + "county": "Emery" + }, + { + "zip_code": 84539, + "latitude": 39.534651, + "longitude": -110.398832, + "city": "Sunnyside", + "state": "UT", + "county": "Carbon" + }, + { + "zip_code": 84540, + "latitude": 38.999877, + "longitude": -109.615008, + "city": "Thompson", + "state": "UT", + "county": "Grand" + }, + { + "zip_code": 84542, + "latitude": 39.614663, + "longitude": -110.641314, + "city": "Wellington", + "state": "UT", + "county": "Carbon" + }, + { + "zip_code": 84601, + "latitude": 40.235053, + "longitude": -111.695558, + "city": "Provo", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84602, + "latitude": 40.356343, + "longitude": -111.732476, + "city": "Provo", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84603, + "latitude": 40.203908, + "longitude": -111.626081, + "city": "Provo", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84604, + "latitude": 40.317059, + "longitude": -111.608241, + "city": "Provo", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84605, + "latitude": 40.176975, + "longitude": -111.536036, + "city": "Provo", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84606, + "latitude": 40.218905, + "longitude": -111.635353, + "city": "Provo", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84620, + "latitude": 38.959002, + "longitude": -111.904385, + "city": "Aurora", + "state": "UT", + "county": "Sevier" + }, + { + "zip_code": 84621, + "latitude": 39.192478, + "longitude": -111.719605, + "city": "Axtell", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84622, + "latitude": 39.109892, + "longitude": -111.823067, + "city": "Centerfield", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84623, + "latitude": 39.494319, + "longitude": -111.493217, + "city": "Chester", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84624, + "latitude": 39.247056, + "longitude": -112.526542, + "city": "Delta", + "state": "UT", + "county": "Millard" + }, + { + "zip_code": 84626, + "latitude": 40.176975, + "longitude": -111.536036, + "city": "Elberta", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84627, + "latitude": 39.373122, + "longitude": -111.62523, + "city": "Ephraim", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84628, + "latitude": 39.941737, + "longitude": -112.174424, + "city": "Eureka", + "state": "UT", + "county": "Juab" + }, + { + "zip_code": 84629, + "latitude": 39.697844, + "longitude": -111.430513, + "city": "Fairview", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84630, + "latitude": 39.21521, + "longitude": -111.879009, + "city": "Fayette", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84631, + "latitude": 39.055572, + "longitude": -112.467412, + "city": "Fillmore", + "state": "UT", + "county": "Millard" + }, + { + "zip_code": 84632, + "latitude": 39.392622, + "longitude": -111.729316, + "city": "Fountain Green", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84633, + "latitude": 40.029693, + "longitude": -111.764116, + "city": "Goshen", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84634, + "latitude": 39.136318, + "longitude": -111.845821, + "city": "Gunnison", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84635, + "latitude": 39.114202, + "longitude": -113.130306, + "city": "Hinckley", + "state": "UT", + "county": "Millard" + }, + { + "zip_code": 84636, + "latitude": 39.096372, + "longitude": -112.283443, + "city": "Holden", + "state": "UT", + "county": "Millard" + }, + { + "zip_code": 84637, + "latitude": 38.831824, + "longitude": -112.456072, + "city": "Kanosh", + "state": "UT", + "county": "Millard" + }, + { + "zip_code": 84638, + "latitude": 39.530246, + "longitude": -112.295191, + "city": "Leamington", + "state": "UT", + "county": "Millard" + }, + { + "zip_code": 84639, + "latitude": 39.521515, + "longitude": -111.943753, + "city": "Levan", + "state": "UT", + "county": "Juab" + }, + { + "zip_code": 84640, + "latitude": 39.494252, + "longitude": -112.397903, + "city": "Lynndyl", + "state": "UT", + "county": "Millard" + }, + { + "zip_code": 84642, + "latitude": 39.358358, + "longitude": -111.65769, + "city": "Manti", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84643, + "latitude": 39.11544, + "longitude": -111.690522, + "city": "Mayfield", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84644, + "latitude": 39.06433, + "longitude": -113.032141, + "city": "Meadow", + "state": "UT", + "county": "Millard" + }, + { + "zip_code": 84645, + "latitude": 39.848111, + "longitude": -111.850284, + "city": "Mona", + "state": "UT", + "county": "Juab" + }, + { + "zip_code": 84646, + "latitude": 39.510792, + "longitude": -111.560318, + "city": "Moroni", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84647, + "latitude": 39.348588, + "longitude": -111.605642, + "city": "Mount Pleasant", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84648, + "latitude": 39.757861, + "longitude": -111.841787, + "city": "Nephi", + "state": "UT", + "county": "Juab" + }, + { + "zip_code": 84649, + "latitude": 39.372902, + "longitude": -112.328797, + "city": "Oak City", + "state": "UT", + "county": "Millard" + }, + { + "zip_code": 84650, + "latitude": 39.29022, + "longitude": -112.628084, + "city": "Oasis", + "state": "UT", + "county": "Millard" + }, + { + "zip_code": 84651, + "latitude": 40.032911, + "longitude": -111.723974, + "city": "Payson", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84652, + "latitude": 38.906498, + "longitude": -111.975313, + "city": "Redmond", + "state": "UT", + "county": "Sevier" + }, + { + "zip_code": 84653, + "latitude": 40.011274, + "longitude": -111.599759, + "city": "Salem", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84654, + "latitude": 38.921403, + "longitude": -111.908156, + "city": "Salina", + "state": "UT", + "county": "Sevier" + }, + { + "zip_code": 84655, + "latitude": 40.003254, + "longitude": -111.812973, + "city": "Santaquin", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84656, + "latitude": 39.249513, + "longitude": -112.106366, + "city": "Scipio", + "state": "UT", + "county": "Millard" + }, + { + "zip_code": 84657, + "latitude": 38.848233, + "longitude": -111.973737, + "city": "Sigurd", + "state": "UT", + "county": "Sevier" + }, + { + "zip_code": 84660, + "latitude": 40.069946, + "longitude": -111.649086, + "city": "Spanish Fork", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84662, + "latitude": 39.467083, + "longitude": -111.46609, + "city": "Spring City", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84663, + "latitude": 40.180718, + "longitude": -111.562586, + "city": "Springville", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84664, + "latitude": 40.125168, + "longitude": -111.580197, + "city": "Mapleton", + "state": "UT", + "county": "Utah" + }, + { + "zip_code": 84665, + "latitude": 39.133489, + "longitude": -111.740853, + "city": "Sterling", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84667, + "latitude": 39.488381, + "longitude": -111.634051, + "city": "Wales", + "state": "UT", + "county": "Sanpete" + }, + { + "zip_code": 84701, + "latitude": 38.738771, + "longitude": -112.074362, + "city": "Richfield", + "state": "UT", + "county": "Sevier" + }, + { + "zip_code": 84710, + "latitude": 37.438637, + "longitude": -112.482285, + "city": "Alton", + "state": "UT", + "county": "Kane" + }, + { + "zip_code": 84711, + "latitude": 38.716845, + "longitude": -112.065687, + "city": "Annabella", + "state": "UT", + "county": "Sevier" + }, + { + "zip_code": 84712, + "latitude": 37.729535, + "longitude": -110.543374, + "city": "Antimony", + "state": "UT", + "county": "Garfield" + }, + { + "zip_code": 84713, + "latitude": 38.315334, + "longitude": -112.798228, + "city": "Beaver", + "state": "UT", + "county": "Beaver" + }, + { + "zip_code": 84714, + "latitude": 37.721369, + "longitude": -113.663891, + "city": "Beryl", + "state": "UT", + "county": "Iron" + }, + { + "zip_code": 84715, + "latitude": 38.327826, + "longitude": -111.526391, + "city": "Bicknell", + "state": "UT", + "county": "Wayne" + }, + { + "zip_code": 84716, + "latitude": 37.844777, + "longitude": -111.308206, + "city": "Boulder", + "state": "UT", + "county": "Garfield" + }, + { + "zip_code": 84717, + "latitude": 37.844777, + "longitude": -111.308206, + "city": "Bryce Canyon", + "state": "UT", + "county": "Garfield" + }, + { + "zip_code": 84718, + "latitude": 37.844777, + "longitude": -111.308206, + "city": "Cannonville", + "state": "UT", + "county": "Garfield" + }, + { + "zip_code": 84719, + "latitude": 37.735522, + "longitude": -112.839145, + "city": "Brian Head", + "state": "UT", + "county": "Iron" + }, + { + "zip_code": 84720, + "latitude": 37.694059, + "longitude": -113.192619, + "city": "Cedar City", + "state": "UT", + "county": "Iron" + }, + { + "zip_code": 84721, + "latitude": 37.656843, + "longitude": -113.3695, + "city": "Cedar City", + "state": "UT", + "county": "Iron" + }, + { + "zip_code": 84722, + "latitude": 37.46693, + "longitude": -113.624783, + "city": "Central", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84723, + "latitude": 38.182708, + "longitude": -112.232857, + "city": "Circleville", + "state": "UT", + "county": "Piute" + }, + { + "zip_code": 84724, + "latitude": 38.686192, + "longitude": -112.108495, + "city": "Elsinore", + "state": "UT", + "county": "Sevier" + }, + { + "zip_code": 84725, + "latitude": 37.579739, + "longitude": -113.689359, + "city": "Enterprise", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84726, + "latitude": 37.767764, + "longitude": -111.595666, + "city": "Escalante", + "state": "UT", + "county": "Garfield" + }, + { + "zip_code": 84728, + "latitude": 39.06433, + "longitude": -113.032141, + "city": "Garrison", + "state": "UT", + "county": "Millard" + }, + { + "zip_code": 84729, + "latitude": 37.311416, + "longitude": -112.601749, + "city": "Glendale", + "state": "UT", + "county": "Kane" + }, + { + "zip_code": 84730, + "latitude": 38.766687, + "longitude": -111.96278, + "city": "Glenwood", + "state": "UT", + "county": "Sevier" + }, + { + "zip_code": 84731, + "latitude": 38.235645, + "longitude": -112.783262, + "city": "Greenville", + "state": "UT", + "county": "Beaver" + }, + { + "zip_code": 84732, + "latitude": 38.328871, + "longitude": -112.142622, + "city": "Greenwich", + "state": "UT", + "county": "Piute" + }, + { + "zip_code": 84733, + "latitude": 37.287695, + "longitude": -113.760596, + "city": "Gunlock", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84734, + "latitude": 38.286909, + "longitude": -110.68796, + "city": "Hanksville", + "state": "UT", + "county": "Wayne" + }, + { + "zip_code": 84735, + "latitude": 37.717477, + "longitude": -112.477716, + "city": "Hatch", + "state": "UT", + "county": "Garfield" + }, + { + "zip_code": 84736, + "latitude": 37.844777, + "longitude": -111.308206, + "city": "Henrieville", + "state": "UT", + "county": "Garfield" + }, + { + "zip_code": 84737, + "latitude": 37.145366, + "longitude": -113.367458, + "city": "Hurricane", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84738, + "latitude": 37.218261, + "longitude": -113.545812, + "city": "Ivins", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84739, + "latitude": 38.683242, + "longitude": -112.115118, + "city": "Joseph", + "state": "UT", + "county": "Sevier" + }, + { + "zip_code": 84740, + "latitude": 38.243856, + "longitude": -112.223742, + "city": "Junction", + "state": "UT", + "county": "Piute" + }, + { + "zip_code": 84741, + "latitude": 37.265251, + "longitude": -111.687187, + "city": "Kanab", + "state": "UT", + "county": "Kane" + }, + { + "zip_code": 84742, + "latitude": 37.522753, + "longitude": -113.203633, + "city": "Kanarraville", + "state": "UT", + "county": "Iron" + }, + { + "zip_code": 84743, + "latitude": 38.227829, + "longitude": -112.20536, + "city": "Kingston", + "state": "UT", + "county": "Piute" + }, + { + "zip_code": 84744, + "latitude": 38.722109, + "longitude": -111.871305, + "city": "Koosharem", + "state": "UT", + "county": "Sevier" + }, + { + "zip_code": 84745, + "latitude": 37.222917, + "longitude": -113.316429, + "city": "La Verkin", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84746, + "latitude": 37.237225, + "longitude": -113.33562, + "city": "Leeds", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84747, + "latitude": 38.441473, + "longitude": -111.595751, + "city": "Loa", + "state": "UT", + "county": "Wayne" + }, + { + "zip_code": 84749, + "latitude": 38.398684, + "longitude": -111.592048, + "city": "Lyman", + "state": "UT", + "county": "Wayne" + }, + { + "zip_code": 84750, + "latitude": 38.434909, + "longitude": -112.206757, + "city": "Marysvale", + "state": "UT", + "county": "Piute" + }, + { + "zip_code": 84751, + "latitude": 38.305873, + "longitude": -113.250981, + "city": "Milford", + "state": "UT", + "county": "Beaver" + }, + { + "zip_code": 84752, + "latitude": 38.214874, + "longitude": -112.923106, + "city": "Minersville", + "state": "UT", + "county": "Beaver" + }, + { + "zip_code": 84753, + "latitude": 37.775781, + "longitude": -113.813634, + "city": "Modena", + "state": "UT", + "county": "Iron" + }, + { + "zip_code": 84754, + "latitude": 38.657847, + "longitude": -112.126117, + "city": "Monroe", + "state": "UT", + "county": "Sevier" + }, + { + "zip_code": 84755, + "latitude": 37.241269, + "longitude": -112.696938, + "city": "Mount Carmel", + "state": "UT", + "county": "Kane" + }, + { + "zip_code": 84756, + "latitude": 37.692401, + "longitude": -113.627239, + "city": "Newcastle", + "state": "UT", + "county": "Iron" + }, + { + "zip_code": 84757, + "latitude": 37.455047, + "longitude": -113.268012, + "city": "New Harmony", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84758, + "latitude": 37.272395, + "longitude": -112.716919, + "city": "Orderville", + "state": "UT", + "county": "Kane" + }, + { + "zip_code": 84759, + "latitude": 37.827846, + "longitude": -112.522595, + "city": "Panguitch", + "state": "UT", + "county": "Garfield" + }, + { + "zip_code": 84760, + "latitude": 37.886012, + "longitude": -112.791568, + "city": "Paragonah", + "state": "UT", + "county": "Iron" + }, + { + "zip_code": 84761, + "latitude": 37.823412, + "longitude": -112.849246, + "city": "Parowan", + "state": "UT", + "county": "Iron" + }, + { + "zip_code": 84762, + "latitude": 37.516889, + "longitude": -112.663612, + "city": "Duck Creek Village", + "state": "UT", + "county": "Kane" + }, + { + "zip_code": 84763, + "latitude": 37.160144, + "longitude": -113.042525, + "city": "Rockville", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84764, + "latitude": 37.844777, + "longitude": -111.308206, + "city": "Bryce", + "state": "UT", + "county": "Garfield" + }, + { + "zip_code": 84765, + "latitude": 37.345219, + "longitude": -113.676057, + "city": "Santa Clara", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84766, + "latitude": 38.578516, + "longitude": -112.310757, + "city": "Sevier", + "state": "UT", + "county": "Sevier" + }, + { + "zip_code": 84767, + "latitude": 37.186249, + "longitude": -113.013922, + "city": "Springdale", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84770, + "latitude": 37.306845, + "longitude": -113.355421, + "city": "Saint George", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84771, + "latitude": 37.309231, + "longitude": -113.476182, + "city": "Saint George", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84772, + "latitude": 37.815946, + "longitude": -112.900041, + "city": "Summit", + "state": "UT", + "county": "Iron" + }, + { + "zip_code": 84773, + "latitude": 38.272761, + "longitude": -111.464123, + "city": "Teasdale", + "state": "UT", + "county": "Wayne" + }, + { + "zip_code": 84774, + "latitude": 37.237701, + "longitude": -113.332321, + "city": "Toquerville", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84775, + "latitude": 38.296853, + "longitude": -111.413774, + "city": "Torrey", + "state": "UT", + "county": "Wayne" + }, + { + "zip_code": 84776, + "latitude": 37.626146, + "longitude": -112.083565, + "city": "Tropic", + "state": "UT", + "county": "Garfield" + }, + { + "zip_code": 84779, + "latitude": 37.202201, + "longitude": -113.185422, + "city": "Virgin", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84780, + "latitude": 37.322604, + "longitude": -113.583816, + "city": "Washington", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84781, + "latitude": 37.37104, + "longitude": -113.384806, + "city": "Pine Valley", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84782, + "latitude": 37.359958, + "longitude": -113.621344, + "city": "Veyo", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84783, + "latitude": 37.307734, + "longitude": -113.665249, + "city": "Dammeron Valley", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84784, + "latitude": 37.004364, + "longitude": -112.978418, + "city": "Hildale", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84790, + "latitude": 37.083098, + "longitude": -113.558068, + "city": "Saint George", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 84791, + "latitude": 37.309231, + "longitude": -113.476182, + "city": "Saint George", + "state": "UT", + "county": "Washington" + }, + { + "zip_code": 85001, + "latitude": 33.703967, + "longitude": -112.351835, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85002, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85003, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85004, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85005, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85006, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85007, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85008, + "latitude": 33.446797, + "longitude": -111.953512, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85009, + "latitude": 33.447489, + "longitude": -111.96942, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85010, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85011, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85012, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85013, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85014, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85015, + "latitude": 33.478293, + "longitude": -112.115805, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85016, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85017, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85018, + "latitude": 33.482033, + "longitude": -111.735322, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85019, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85020, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85021, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85022, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85023, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85024, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85025, + "latitude": 33.422621, + "longitude": -111.723635, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85026, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85027, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85028, + "latitude": 33.382744, + "longitude": -111.66139, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85029, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85030, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85031, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85032, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85033, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85034, + "latitude": 33.431304, + "longitude": -111.987383, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85035, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85036, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85037, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85038, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85039, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85040, + "latitude": 33.367267, + "longitude": -112.066878, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85041, + "latitude": 33.379728, + "longitude": -112.112254, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85042, + "latitude": "", + "longitude": "", + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85043, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85044, + "latitude": 33.338743, + "longitude": -111.97277, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85045, + "latitude": 33.302168, + "longitude": -112.122581, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85046, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85048, + "latitude": 33.316039, + "longitude": -112.066901, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85050, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85051, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85053, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85054, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85055, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85060, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85061, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85062, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85063, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85064, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85065, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85066, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85067, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85068, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85069, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85070, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85071, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85072, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85073, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85074, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85075, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85076, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85077, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85078, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85079, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85080, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85082, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85085, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85086, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85087, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "New River", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85098, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85099, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Phoenix", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85201, + "latitude": 33.440695, + "longitude": -111.856967, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85202, + "latitude": 33.393484, + "longitude": -111.804513, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85203, + "latitude": 33.448876, + "longitude": -111.824363, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85204, + "latitude": 33.397131, + "longitude": -111.787678, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85205, + "latitude": 33.443345, + "longitude": -111.732134, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85206, + "latitude": 33.390148, + "longitude": -111.717968, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85207, + "latitude": 33.443017, + "longitude": -111.743444, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85208, + "latitude": 33.395932, + "longitude": -111.663655, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85210, + "latitude": 33.387296, + "longitude": -111.840095, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85211, + "latitude": 33.466313, + "longitude": -111.837345, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85212, + "latitude": 33.342476, + "longitude": -111.635307, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85213, + "latitude": 33.448407, + "longitude": -111.830905, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85214, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85215, + "latitude": 33.470724, + "longitude": -111.718829, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85216, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85217, + "latitude": 33.393398, + "longitude": -111.478975, + "city": "Apache Junction", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85218, + "latitude": "", + "longitude": "", + "city": "Apache Junction", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85219, + "latitude": 33.361583, + "longitude": -111.279538, + "city": "Apache Junction", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85220, + "latitude": 33.408443, + "longitude": -111.535089, + "city": "Apache Junction", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85221, + "latitude": 33.225652, + "longitude": -111.476001, + "city": "Bapchule", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85222, + "latitude": 32.89055, + "longitude": -111.753991, + "city": "Casa Grande", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85223, + "latitude": 32.745169, + "longitude": -111.603327, + "city": "Arizona City", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85224, + "latitude": 33.298461, + "longitude": -111.85062, + "city": "Chandler", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85225, + "latitude": 33.325991, + "longitude": -111.824367, + "city": "Chandler", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85226, + "latitude": 33.303777, + "longitude": -111.932892, + "city": "Chandler", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85227, + "latitude": 33.212186, + "longitude": -111.686171, + "city": "Chandler Heights", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85228, + "latitude": 32.904485, + "longitude": -111.247908, + "city": "Coolidge", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85230, + "latitude": 32.815123, + "longitude": -111.705441, + "city": "Casa Grande", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85231, + "latitude": 32.914889, + "longitude": -111.261161, + "city": "Eloy", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85232, + "latitude": 32.982354, + "longitude": -111.424943, + "city": "Florence", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85233, + "latitude": 33.335401, + "longitude": -111.815281, + "city": "Gilbert", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85234, + "latitude": 33.352925, + "longitude": -111.780712, + "city": "Gilbert", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85235, + "latitude": 33.576401, + "longitude": -110.855618, + "city": "Hayden", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85236, + "latitude": 33.299317, + "longitude": -111.69546, + "city": "Higley", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85237, + "latitude": 33.145984, + "longitude": -111.064109, + "city": "Kearny", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85239, + "latitude": 32.957645, + "longitude": -112.053351, + "city": "Maricopa", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85241, + "latitude": 32.689594, + "longitude": -111.531036, + "city": "Picacho", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85242, + "latitude": 33.284844, + "longitude": -111.656128, + "city": "Queen Creek", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85244, + "latitude": 33.321316, + "longitude": -111.888824, + "city": "Chandler", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85245, + "latitude": 32.579972, + "longitude": -111.340953, + "city": "Red Rock", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85246, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Chandler", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85247, + "latitude": 33.141592, + "longitude": -111.714232, + "city": "Sacaton", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85248, + "latitude": 33.250947, + "longitude": -111.859308, + "city": "Chandler", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85249, + "latitude": 33.247861, + "longitude": -111.770161, + "city": "Chandler", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85250, + "latitude": 33.524143, + "longitude": -111.874248, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85251, + "latitude": 33.420061, + "longitude": -111.792658, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85252, + "latitude": 33.499529, + "longitude": -111.868432, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85253, + "latitude": 33.360896, + "longitude": -111.963149, + "city": "Paradise Valley", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85254, + "latitude": 33.483533, + "longitude": -111.83018, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85255, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85256, + "latitude": 33.507744, + "longitude": -111.80033, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85257, + "latitude": 33.465646, + "longitude": -111.894039, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85258, + "latitude": 33.553346, + "longitude": -111.879806, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85259, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85260, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85261, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85262, + "latitude": 33.407445, + "longitude": -111.915298, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85263, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Rio Verde", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85264, + "latitude": 33.625163, + "longitude": -111.677135, + "city": "Fort Mcdowell", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85266, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85267, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85268, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Fountain Hills", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85269, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Fountain Hills", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85271, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Scottsdale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85272, + "latitude": 32.895764, + "longitude": -111.957245, + "city": "Stanfield", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85273, + "latitude": 33.180583, + "longitude": -111.130022, + "city": "Superior", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85274, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85275, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85277, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Mesa", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85278, + "latitude": 32.983653, + "longitude": -111.326045, + "city": "Apache Junction", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85279, + "latitude": 32.983653, + "longitude": -111.326045, + "city": "Florence", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85280, + "latitude": 33.401395, + "longitude": -111.931298, + "city": "Tempe", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85281, + "latitude": 33.432844, + "longitude": -111.927219, + "city": "Tempe", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85282, + "latitude": 33.396736, + "longitude": -111.929253, + "city": "Tempe", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85283, + "latitude": 33.373723, + "longitude": -111.876915, + "city": "Tempe", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85284, + "latitude": 33.343546, + "longitude": -111.914127, + "city": "Tempe", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85285, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Tempe", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85287, + "latitude": 33.428511, + "longitude": -111.934865, + "city": "Tempe", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85289, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Tempe", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85290, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Tortilla Flat", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85291, + "latitude": 33.013502, + "longitude": -111.42979, + "city": "Valley Farms", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85292, + "latitude": 33.070467, + "longitude": -110.789035, + "city": "Winkelman", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85296, + "latitude": 33.314508, + "longitude": -111.748791, + "city": "Gilbert", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85297, + "latitude": "", + "longitude": "", + "city": "Gilbert", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85299, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Gilbert", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85301, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Glendale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85302, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Glendale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85303, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Glendale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85304, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Glendale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85305, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Glendale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85306, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Glendale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85307, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Glendale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85308, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Glendale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85309, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Luke Afb", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85310, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Glendale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85311, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Glendale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85312, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Glendale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85313, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Glendale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85318, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Glendale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85320, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Aguila", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85321, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Ajo", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85322, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Arlington", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85323, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Avondale", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85324, + "latitude": 34.075451, + "longitude": -112.134005, + "city": "Black Canyon City", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 85325, + "latitude": 33.95782, + "longitude": -114.003634, + "city": "Bouse", + "state": "AZ", + "county": "La Paz" + }, + { + "zip_code": 85326, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Buckeye", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85327, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Cave Creek", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85328, + "latitude": 33.672255, + "longitude": -114.03215, + "city": "Cibola", + "state": "AZ", + "county": "La Paz" + }, + { + "zip_code": 85329, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Cashion", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85331, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Cave Creek", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85332, + "latitude": 34.170305, + "longitude": -112.787686, + "city": "Congress", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 85333, + "latitude": 32.825705, + "longitude": -113.525199, + "city": "Dateland", + "state": "AZ", + "county": "Yuma" + }, + { + "zip_code": 85334, + "latitude": 33.61767, + "longitude": -114.507697, + "city": "Ehrenberg", + "state": "AZ", + "county": "La Paz" + }, + { + "zip_code": 85335, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "El Mirage", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85336, + "latitude": 32.530155, + "longitude": -114.774342, + "city": "Gadsden", + "state": "AZ", + "county": "Yuma" + }, + { + "zip_code": 85337, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Gila Bend", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85338, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Goodyear", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85339, + "latitude": 33.335057, + "longitude": -112.182248, + "city": "Laveen", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85340, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Litchfield Park", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85341, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Lukeville", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85342, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Morristown", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85343, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Palo Verde", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85344, + "latitude": 33.967712, + "longitude": -114.268073, + "city": "Parker", + "state": "AZ", + "county": "La Paz" + }, + { + "zip_code": 85345, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Peoria", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85346, + "latitude": 33.729219, + "longitude": -114.192454, + "city": "Quartzsite", + "state": "AZ", + "county": "La Paz" + }, + { + "zip_code": 85347, + "latitude": 32.752609, + "longitude": -113.798728, + "city": "Roll", + "state": "AZ", + "county": "Yuma" + }, + { + "zip_code": 85348, + "latitude": 33.64797, + "longitude": -113.662489, + "city": "Salome", + "state": "AZ", + "county": "La Paz" + }, + { + "zip_code": 85349, + "latitude": 32.540068, + "longitude": -114.754999, + "city": "San Luis", + "state": "AZ", + "county": "Yuma" + }, + { + "zip_code": 85350, + "latitude": 32.612408, + "longitude": -114.606214, + "city": "Somerton", + "state": "AZ", + "county": "Yuma" + }, + { + "zip_code": 85351, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Sun City", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85352, + "latitude": 32.693448, + "longitude": -113.976313, + "city": "Tacna", + "state": "AZ", + "county": "Yuma" + }, + { + "zip_code": 85353, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Tolleson", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85354, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Tonopah", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85355, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Waddell", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85356, + "latitude": 32.693461, + "longitude": -114.156058, + "city": "Wellton", + "state": "AZ", + "county": "Yuma" + }, + { + "zip_code": 85357, + "latitude": 34.042203, + "longitude": -113.458002, + "city": "Wenden", + "state": "AZ", + "county": "La Paz" + }, + { + "zip_code": 85358, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Wickenburg", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85359, + "latitude": 33.66688, + "longitude": -114.239557, + "city": "Quartzsite", + "state": "AZ", + "county": "La Paz" + }, + { + "zip_code": 85360, + "latitude": 35.74782, + "longitude": -113.8106, + "city": "Wikieup", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 85361, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Wittmann", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85362, + "latitude": 34.250781, + "longitude": -112.756652, + "city": "Yarnell", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 85363, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Youngtown", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85364, + "latitude": 32.615305, + "longitude": -114.648722, + "city": "Yuma", + "state": "AZ", + "county": "Yuma" + }, + { + "zip_code": 85365, + "latitude": 32.709332, + "longitude": -114.490471, + "city": "Yuma", + "state": "AZ", + "county": "Yuma" + }, + { + "zip_code": 85366, + "latitude": 32.609959, + "longitude": -114.631172, + "city": "Yuma", + "state": "AZ", + "county": "Yuma" + }, + { + "zip_code": 85367, + "latitude": 32.656575, + "longitude": -114.404216, + "city": "Yuma", + "state": "AZ", + "county": "Yuma" + }, + { + "zip_code": 85369, + "latitude": 32.751632, + "longitude": -114.074901, + "city": "Yuma", + "state": "AZ", + "county": "Yuma" + }, + { + "zip_code": 85371, + "latitude": 34.031791, + "longitude": -114.390171, + "city": "Poston", + "state": "AZ", + "county": "La Paz" + }, + { + "zip_code": 85372, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Sun City", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85373, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Sun City", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85374, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Surprise", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85375, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Sun City West", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85376, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Sun City West", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85377, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Carefree", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85378, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Surprise", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85379, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Surprise", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85380, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Peoria", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85381, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Peoria", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85382, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Peoria", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85383, + "latitude": "", + "longitude": "", + "city": "Peoria", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85385, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Peoria", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85387, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Surprise", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85390, + "latitude": 33.276539, + "longitude": -112.18717, + "city": "Wickenburg", + "state": "AZ", + "county": "Maricopa" + }, + { + "zip_code": 85501, + "latitude": 33.476884, + "longitude": -110.868076, + "city": "Globe", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85502, + "latitude": 33.421919, + "longitude": -110.81268, + "city": "Globe", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85530, + "latitude": 33.038678, + "longitude": -109.785973, + "city": "Bylas", + "state": "AZ", + "county": "Graham" + }, + { + "zip_code": 85531, + "latitude": 32.869243, + "longitude": -109.787778, + "city": "Central", + "state": "AZ", + "county": "Graham" + }, + { + "zip_code": 85532, + "latitude": 33.415409, + "longitude": -110.814893, + "city": "Claypool", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85533, + "latitude": 32.991251, + "longitude": -109.255872, + "city": "Clifton", + "state": "AZ", + "county": "Greenlee" + }, + { + "zip_code": 85534, + "latitude": 32.881003, + "longitude": -109.215723, + "city": "Duncan", + "state": "AZ", + "county": "Greenlee" + }, + { + "zip_code": 85535, + "latitude": 32.975112, + "longitude": -109.897401, + "city": "Eden", + "state": "AZ", + "county": "Graham" + }, + { + "zip_code": 85536, + "latitude": 33.033314, + "longitude": -109.971733, + "city": "Fort Thomas", + "state": "AZ", + "county": "Graham" + }, + { + "zip_code": 85539, + "latitude": 33.528204, + "longitude": -110.966562, + "city": "Miami", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85540, + "latitude": 33.054062, + "longitude": -109.326923, + "city": "Morenci", + "state": "AZ", + "county": "Greenlee" + }, + { + "zip_code": 85541, + "latitude": 33.864471, + "longitude": -111.075088, + "city": "Payson", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85542, + "latitude": 33.741518, + "longitude": -110.860653, + "city": "Peridot", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85543, + "latitude": 32.878042, + "longitude": -109.775698, + "city": "Pima", + "state": "AZ", + "county": "Graham" + }, + { + "zip_code": 85544, + "latitude": 34.320445, + "longitude": -111.396855, + "city": "Pine", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85545, + "latitude": 33.614316, + "longitude": -111.005928, + "city": "Roosevelt", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85546, + "latitude": 32.813612, + "longitude": -109.701631, + "city": "Safford", + "state": "AZ", + "county": "Graham" + }, + { + "zip_code": 85547, + "latitude": 34.257457, + "longitude": -111.28775, + "city": "Payson", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85548, + "latitude": 32.797009, + "longitude": -109.752196, + "city": "Safford", + "state": "AZ", + "county": "Graham" + }, + { + "zip_code": 85550, + "latitude": 33.289447, + "longitude": -110.491898, + "city": "San Carlos", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85551, + "latitude": 32.842769, + "longitude": -109.696449, + "city": "Solomon", + "state": "AZ", + "county": "Graham" + }, + { + "zip_code": 85552, + "latitude": 32.850436, + "longitude": -109.746133, + "city": "Thatcher", + "state": "AZ", + "county": "Graham" + }, + { + "zip_code": 85553, + "latitude": 33.741518, + "longitude": -110.860653, + "city": "Tonto Basin", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85554, + "latitude": 33.741518, + "longitude": -110.860653, + "city": "Young", + "state": "AZ", + "county": "Gila" + }, + { + "zip_code": 85601, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Arivaca", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85602, + "latitude": 32.035885, + "longitude": -110.262611, + "city": "Benson", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85603, + "latitude": 31.445577, + "longitude": -109.819216, + "city": "Bisbee", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85605, + "latitude": 31.891434, + "longitude": -109.706426, + "city": "Bowie", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85606, + "latitude": 32.043893, + "longitude": -109.835893, + "city": "Cochise", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85607, + "latitude": 31.604081, + "longitude": -109.866187, + "city": "Douglas", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85608, + "latitude": 31.415114, + "longitude": -109.596038, + "city": "Douglas", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85609, + "latitude": 32.040753, + "longitude": -109.818047, + "city": "Dragoon", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85610, + "latitude": 31.737711, + "longitude": -109.622175, + "city": "Elfrida", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85611, + "latitude": 31.609653, + "longitude": -110.563551, + "city": "Elgin", + "state": "AZ", + "county": "Santa Cruz" + }, + { + "zip_code": 85613, + "latitude": 31.559131, + "longitude": -110.318682, + "city": "Fort Huachuca", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85614, + "latitude": 31.838223, + "longitude": -110.955483, + "city": "Green Valley", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85615, + "latitude": 31.411921, + "longitude": -110.158573, + "city": "Hereford", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85616, + "latitude": 31.606087, + "longitude": -110.248009, + "city": "Huachuca City", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85617, + "latitude": 31.512083, + "longitude": -109.84377, + "city": "Mc Neal", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85618, + "latitude": 32.703898, + "longitude": -110.69592, + "city": "Mammoth", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85619, + "latitude": 32.376306, + "longitude": -110.760458, + "city": "Mount Lemmon", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85620, + "latitude": 31.385182, + "longitude": -109.919794, + "city": "Naco", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85621, + "latitude": 31.46327, + "longitude": -110.8819, + "city": "Nogales", + "state": "AZ", + "county": "Santa Cruz" + }, + { + "zip_code": 85622, + "latitude": 31.853334, + "longitude": -110.932803, + "city": "Green Valley", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85623, + "latitude": 32.64213, + "longitude": -110.850082, + "city": "Oracle", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85624, + "latitude": 31.523845, + "longitude": -110.675964, + "city": "Patagonia", + "state": "AZ", + "county": "Santa Cruz" + }, + { + "zip_code": 85625, + "latitude": 31.766243, + "longitude": -109.896053, + "city": "Pearce", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85626, + "latitude": 31.357528, + "longitude": -109.611545, + "city": "Pirtleville", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85627, + "latitude": 32.049456, + "longitude": -110.290892, + "city": "Pomerene", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85628, + "latitude": 31.531998, + "longitude": -110.909305, + "city": "Nogales", + "state": "AZ", + "county": "Santa Cruz" + }, + { + "zip_code": 85629, + "latitude": 31.932883, + "longitude": -110.895188, + "city": "Sahuarita", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85630, + "latitude": 31.891828, + "longitude": -110.170442, + "city": "Saint David", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85631, + "latitude": 32.620892, + "longitude": -110.599242, + "city": "San Manuel", + "state": "AZ", + "county": "Pinal" + }, + { + "zip_code": 85632, + "latitude": 31.880077, + "longitude": -109.754263, + "city": "San Simon", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85633, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Sasabe", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85634, + "latitude": 31.974033, + "longitude": -110.702027, + "city": "Sells", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85635, + "latitude": 31.810649, + "longitude": -109.997623, + "city": "Sierra Vista", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85636, + "latitude": 31.668685, + "longitude": -110.280111, + "city": "Sierra Vista", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85637, + "latitude": 31.673105, + "longitude": -110.618814, + "city": "Sonoita", + "state": "AZ", + "county": "Santa Cruz" + }, + { + "zip_code": 85638, + "latitude": 31.67106, + "longitude": -110.076564, + "city": "Tombstone", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85639, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Topawa", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85640, + "latitude": 31.616167, + "longitude": -111.051279, + "city": "Tumacacori", + "state": "AZ", + "county": "Santa Cruz" + }, + { + "zip_code": 85641, + "latitude": 32.002669, + "longitude": -110.705269, + "city": "Vail", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85643, + "latitude": 32.07005, + "longitude": -109.886546, + "city": "Willcox", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85644, + "latitude": 32.30069, + "longitude": -109.878211, + "city": "Willcox", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85645, + "latitude": 31.672252, + "longitude": -111.09862, + "city": "Amado", + "state": "AZ", + "county": "Santa Cruz" + }, + { + "zip_code": 85646, + "latitude": 31.593758, + "longitude": -111.066245, + "city": "Tubac", + "state": "AZ", + "county": "Santa Cruz" + }, + { + "zip_code": 85648, + "latitude": 31.508436, + "longitude": -111.075695, + "city": "Rio Rico", + "state": "AZ", + "county": "Santa Cruz" + }, + { + "zip_code": 85650, + "latitude": 31.489157, + "longitude": -110.215304, + "city": "Sierra Vista", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85652, + "latitude": 32.420055, + "longitude": -111.113178, + "city": "Cortaro", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85653, + "latitude": 32.442979, + "longitude": -111.159344, + "city": "Marana", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85654, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Rillito", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85655, + "latitude": 31.880077, + "longitude": -109.754263, + "city": "Douglas", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85662, + "latitude": 31.531998, + "longitude": -110.909305, + "city": "Nogales", + "state": "AZ", + "county": "Santa Cruz" + }, + { + "zip_code": 85670, + "latitude": 31.880077, + "longitude": -109.754263, + "city": "Fort Huachuca", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85671, + "latitude": 31.880077, + "longitude": -109.754263, + "city": "Sierra Vista", + "state": "AZ", + "county": "Cochise" + }, + { + "zip_code": 85701, + "latitude": 32.217975, + "longitude": -110.970869, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85702, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85703, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85704, + "latitude": 32.395222, + "longitude": -111.100062, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85705, + "latitude": 32.294945, + "longitude": -110.900395, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85706, + "latitude": 32.093314, + "longitude": -110.879684, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85707, + "latitude": 32.169577, + "longitude": -110.875093, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85708, + "latitude": 32.187559, + "longitude": -110.874973, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85709, + "latitude": 32.200813, + "longitude": -110.897966, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85710, + "latitude": 32.213926, + "longitude": -110.78934, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85711, + "latitude": 32.214075, + "longitude": -110.883744, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85712, + "latitude": 32.253714, + "longitude": -110.883744, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85713, + "latitude": 32.192676, + "longitude": -110.945048, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85714, + "latitude": 32.123064, + "longitude": -110.934945, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85715, + "latitude": 32.251875, + "longitude": -110.819977, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85716, + "latitude": 32.24425, + "longitude": -110.92318, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85717, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85718, + "latitude": 32.311724, + "longitude": -110.91898, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85719, + "latitude": 32.247175, + "longitude": -110.947541, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85720, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85721, + "latitude": 32.233761, + "longitude": -110.949996, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85722, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85723, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85724, + "latitude": 32.240571, + "longitude": -110.944343, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85725, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85726, + "latitude": 32.202726, + "longitude": -110.945346, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85728, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85730, + "latitude": 32.159829, + "longitude": -110.772728, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85731, + "latitude": 32.088034, + "longitude": -110.708174, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85732, + "latitude": 32.084775, + "longitude": -110.71225, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85733, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85734, + "latitude": 32.065082, + "longitude": -110.935337, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85735, + "latitude": 32.440968, + "longitude": -110.976006, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85736, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85737, + "latitude": 32.435158, + "longitude": -110.984499, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85738, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Catalina", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85739, + "latitude": 32.465013, + "longitude": -110.892213, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85740, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85741, + "latitude": 32.340073, + "longitude": -111.058754, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85742, + "latitude": 32.407562, + "longitude": -111.065029, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85743, + "latitude": 32.333438, + "longitude": -111.065869, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85744, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85745, + "latitude": 32.215967, + "longitude": -110.869052, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85746, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85747, + "latitude": 32.098362, + "longitude": -110.727183, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85748, + "latitude": 32.213246, + "longitude": -110.738517, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85749, + "latitude": 32.263975, + "longitude": -110.74667, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85750, + "latitude": 32.297374, + "longitude": -110.840422, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85751, + "latitude": 32.161972, + "longitude": -110.714678, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85752, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85754, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85775, + "latitude": 31.970131, + "longitude": -111.890713, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85777, + "latitude": 32.071764, + "longitude": -110.859106, + "city": "Tucson", + "state": "AZ", + "county": "Pima" + }, + { + "zip_code": 85901, + "latitude": 34.570811, + "longitude": -110.032025, + "city": "Show Low", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85902, + "latitude": 34.298092, + "longitude": -110.035185, + "city": "Show Low", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85911, + "latitude": 35.285746, + "longitude": -110.288704, + "city": "Cibecue", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85912, + "latitude": 34.266588, + "longitude": -110.203073, + "city": "White Mountain Lake", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85920, + "latitude": 34.177052, + "longitude": -109.240647, + "city": "Alpine", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 85922, + "latitude": 33.102464, + "longitude": -109.271169, + "city": "Blue", + "state": "AZ", + "county": "Greenlee" + }, + { + "zip_code": 85923, + "latitude": 35.285746, + "longitude": -110.288704, + "city": "Clay Springs", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85924, + "latitude": 34.468787, + "longitude": -109.742654, + "city": "Concho", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 85925, + "latitude": 34.107708, + "longitude": -109.293952, + "city": "Eagar", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 85926, + "latitude": 34.201164, + "longitude": -110.010612, + "city": "Fort Apache", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85927, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Greer", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 85928, + "latitude": 34.40998, + "longitude": -110.588287, + "city": "Heber", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85929, + "latitude": 34.175198, + "longitude": -109.972598, + "city": "Lakeside", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85930, + "latitude": 34.075359, + "longitude": -109.853192, + "city": "Mcnary", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 85931, + "latitude": 35.537441, + "longitude": -111.27586, + "city": "Forest Lakes", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 85932, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Nutrioso", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 85933, + "latitude": 34.408619, + "longitude": -110.560023, + "city": "Overgaard", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85934, + "latitude": 35.285746, + "longitude": -110.288704, + "city": "Pinedale", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85935, + "latitude": 34.141314, + "longitude": -109.935556, + "city": "Pinetop", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85936, + "latitude": 34.497709, + "longitude": -109.481543, + "city": "Saint Johns", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 85937, + "latitude": 34.521702, + "longitude": -110.110981, + "city": "Snowflake", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85938, + "latitude": 34.118938, + "longitude": -109.285553, + "city": "Springerville", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 85939, + "latitude": 34.314937, + "longitude": -110.002763, + "city": "Taylor", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85940, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Vernon", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 85941, + "latitude": 33.802071, + "longitude": -109.993738, + "city": "Whiteriver", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 85942, + "latitude": 34.647454, + "longitude": -110.080632, + "city": "Woodruff", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86001, + "latitude": 35.932116, + "longitude": -111.597853, + "city": "Flagstaff", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86002, + "latitude": 35.630842, + "longitude": -112.052427, + "city": "Flagstaff", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86003, + "latitude": 35.630842, + "longitude": -112.052427, + "city": "Flagstaff", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86004, + "latitude": 35.610905, + "longitude": -111.324353, + "city": "Flagstaff", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86011, + "latitude": 35.630842, + "longitude": -112.052427, + "city": "Flagstaff", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86015, + "latitude": 35.630842, + "longitude": -112.052427, + "city": "Bellemont", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86016, + "latitude": 35.630842, + "longitude": -112.052427, + "city": "Gray Mountain", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86017, + "latitude": 34.94122, + "longitude": -111.640991, + "city": "Munds Park", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86018, + "latitude": 35.256347, + "longitude": -111.95003, + "city": "Parks", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86020, + "latitude": 35.630842, + "longitude": -112.052427, + "city": "Cameron", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86021, + "latitude": 36.974658, + "longitude": -112.978914, + "city": "Colorado City", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86022, + "latitude": 36.96649, + "longitude": -112.524696, + "city": "Fredonia", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86023, + "latitude": 35.942057, + "longitude": -112.130937, + "city": "Grand Canyon", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86024, + "latitude": 35.630842, + "longitude": -112.052427, + "city": "Happy Jack", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86025, + "latitude": 34.776828, + "longitude": -110.089544, + "city": "Holbrook", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86028, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Petrified Forest Natl Pk", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86029, + "latitude": 35.285746, + "longitude": -110.288704, + "city": "Sun Valley", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86030, + "latitude": 35.285746, + "longitude": -110.288704, + "city": "Hotevilla", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86031, + "latitude": 35.285746, + "longitude": -110.288704, + "city": "Indian Wells", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86032, + "latitude": 34.981359, + "longitude": -110.337348, + "city": "Joseph City", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86033, + "latitude": 35.285746, + "longitude": -110.288704, + "city": "Kayenta", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86034, + "latitude": 35.285746, + "longitude": -110.288704, + "city": "Keams Canyon", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86035, + "latitude": 35.630842, + "longitude": -112.052427, + "city": "Leupp", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86036, + "latitude": 36.922976, + "longitude": -111.449889, + "city": "Marble Canyon", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86038, + "latitude": 34.908287, + "longitude": -111.463026, + "city": "Mormon Lake", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86039, + "latitude": 35.285746, + "longitude": -110.288704, + "city": "Kykotsmovi Village", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86040, + "latitude": 36.910804, + "longitude": -111.502009, + "city": "Page", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86042, + "latitude": 35.285746, + "longitude": -110.288704, + "city": "Polacca", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86043, + "latitude": 35.285746, + "longitude": -110.288704, + "city": "Second Mesa", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86044, + "latitude": 35.630842, + "longitude": -112.052427, + "city": "Tonalea", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86045, + "latitude": 36.132723, + "longitude": -111.241773, + "city": "Tuba City", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86046, + "latitude": 35.915563, + "longitude": -112.366031, + "city": "Williams", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86047, + "latitude": 34.633764, + "longitude": -110.35061, + "city": "Winslow", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86052, + "latitude": 35.630842, + "longitude": -112.052427, + "city": "North Rim", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86053, + "latitude": 36.910554, + "longitude": -111.451826, + "city": "Kaibito", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86054, + "latitude": 36.593079, + "longitude": -110.655526, + "city": "Shonto", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86301, + "latitude": 34.620826, + "longitude": -112.567165, + "city": "Prescott", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86302, + "latitude": 34.574921, + "longitude": -112.491528, + "city": "Prescott", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86303, + "latitude": 34.49579, + "longitude": -112.378309, + "city": "Prescott", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86304, + "latitude": 34.59668, + "longitude": -112.49066, + "city": "Prescott", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86305, + "latitude": 34.683235, + "longitude": -112.208914, + "city": "Prescott", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86312, + "latitude": 34.668291, + "longitude": -112.307777, + "city": "Prescott Valley", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86313, + "latitude": 34.706724, + "longitude": -112.39773, + "city": "Prescott", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86314, + "latitude": 34.627778, + "longitude": -112.262805, + "city": "Prescott Valley", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86320, + "latitude": 34.970209, + "longitude": -112.263974, + "city": "Ash Fork", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86321, + "latitude": 34.583624, + "longitude": -113.164742, + "city": "Bagdad", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86322, + "latitude": 34.569687, + "longitude": -111.809798, + "city": "Camp Verde", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86323, + "latitude": 34.755208, + "longitude": -112.171623, + "city": "Chino Valley", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86324, + "latitude": 34.659484, + "longitude": -112.13222, + "city": "Clarkdale", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86325, + "latitude": 34.735388, + "longitude": -111.927746, + "city": "Cornville", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86326, + "latitude": 34.643596, + "longitude": -112.043547, + "city": "Cottonwood", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86327, + "latitude": 34.55652, + "longitude": -112.284396, + "city": "Dewey", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86329, + "latitude": 34.518883, + "longitude": -112.25234, + "city": "Humboldt", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86330, + "latitude": 34.706724, + "longitude": -112.39773, + "city": "Iron Springs", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86331, + "latitude": 34.748589, + "longitude": -112.108626, + "city": "Jerome", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86332, + "latitude": 34.44395, + "longitude": -112.657865, + "city": "Kirkland", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86333, + "latitude": 34.414534, + "longitude": -112.163493, + "city": "Mayer", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86334, + "latitude": 34.80512, + "longitude": -112.537368, + "city": "Paulden", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86335, + "latitude": 34.64161, + "longitude": -111.796517, + "city": "Rimrock", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86336, + "latitude": 34.756885, + "longitude": -111.279927, + "city": "Sedona", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86337, + "latitude": 35.331088, + "longitude": -112.875402, + "city": "Seligman", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86338, + "latitude": 34.706724, + "longitude": -112.39773, + "city": "Skull Valley", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86339, + "latitude": 34.907188, + "longitude": -111.728572, + "city": "Sedona", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86340, + "latitude": 34.706724, + "longitude": -112.39773, + "city": "Sedona", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86341, + "latitude": 34.776648, + "longitude": -111.76788, + "city": "Sedona", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86342, + "latitude": 34.641736, + "longitude": -111.787154, + "city": "Lake Montezuma", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86343, + "latitude": 34.706724, + "longitude": -112.39773, + "city": "Crown King", + "state": "AZ", + "county": "Yavapai" + }, + { + "zip_code": 86351, + "latitude": 35.032371, + "longitude": -111.684752, + "city": "Sedona", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86401, + "latitude": 35.341456, + "longitude": -114.017106, + "city": "Kingman", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86402, + "latitude": 35.263249, + "longitude": -114.063651, + "city": "Kingman", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86403, + "latitude": 34.500556, + "longitude": -114.310294, + "city": "Lake Havasu City", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86404, + "latitude": 34.557533, + "longitude": -114.330704, + "city": "Lake Havasu City", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86405, + "latitude": 35.605301, + "longitude": -113.642712, + "city": "Lake Havasu City", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86406, + "latitude": 34.756714, + "longitude": -114.11897, + "city": "Lake Havasu City", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86411, + "latitude": 35.605301, + "longitude": -113.642712, + "city": "Hackberry", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86412, + "latitude": 35.397172, + "longitude": -113.843241, + "city": "Hualapai", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86413, + "latitude": 35.30024, + "longitude": -114.221531, + "city": "Golden Valley", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86426, + "latitude": 35.066454, + "longitude": -114.567333, + "city": "Fort Mohave", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86427, + "latitude": 35.00429, + "longitude": -114.581228, + "city": "Fort Mohave", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86429, + "latitude": 35.171497, + "longitude": -114.538599, + "city": "Bullhead City", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86430, + "latitude": 35.147264, + "longitude": -114.543299, + "city": "Bullhead City", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86431, + "latitude": 35.389575, + "longitude": -114.222136, + "city": "Chloride", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86432, + "latitude": 34.901161, + "longitude": -114.543288, + "city": "Littlefield", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86433, + "latitude": 35.028492, + "longitude": -114.383666, + "city": "Oatman", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86434, + "latitude": 35.540361, + "longitude": -113.415346, + "city": "Peach Springs", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86435, + "latitude": 35.630842, + "longitude": -112.052427, + "city": "Supai", + "state": "AZ", + "county": "Coconino" + }, + { + "zip_code": 86436, + "latitude": 34.779071, + "longitude": -114.482571, + "city": "Topock", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86437, + "latitude": 35.605301, + "longitude": -113.642712, + "city": "Valentine", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86438, + "latitude": 35.605301, + "longitude": -113.642712, + "city": "Yucca", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86439, + "latitude": 35.095848, + "longitude": -114.619445, + "city": "Bullhead City", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86440, + "latitude": 35.0524, + "longitude": -114.245399, + "city": "Mohave Valley", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86441, + "latitude": 35.269759, + "longitude": -114.243188, + "city": "Dolan Springs", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86442, + "latitude": 35.005498, + "longitude": -114.323801, + "city": "Bullhead City", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86443, + "latitude": 35.210634, + "longitude": -114.179228, + "city": "Temple Bar Marina", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86444, + "latitude": 35.982167, + "longitude": -114.077519, + "city": "Meadview", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86445, + "latitude": 35.605301, + "longitude": -113.642712, + "city": "Willow Beach", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86446, + "latitude": 34.849946, + "longitude": -114.591728, + "city": "Mohave Valley", + "state": "AZ", + "county": "Mohave" + }, + { + "zip_code": 86502, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Chambers", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86503, + "latitude": 36.527297, + "longitude": -109.691925, + "city": "Chinle", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86504, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Fort Defiance", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86505, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Ganado", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86506, + "latitude": 35.337124, + "longitude": -109.247759, + "city": "Houck", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86507, + "latitude": 36.398903, + "longitude": -109.259299, + "city": "Lukachukai", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86508, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Lupton", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86510, + "latitude": 35.962139, + "longitude": -110.308125, + "city": "Pinon", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86511, + "latitude": 35.903962, + "longitude": -109.308746, + "city": "Saint Michaels", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86512, + "latitude": 35.406729, + "longitude": -109.285537, + "city": "Sanders", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86514, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Teec Nos Pos", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86515, + "latitude": 35.667596, + "longitude": -109.07844, + "city": "Window Rock", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86520, + "latitude": 35.285746, + "longitude": -110.288704, + "city": "Blue Gap", + "state": "AZ", + "county": "Navajo" + }, + { + "zip_code": 86535, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Dennehotso", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86538, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Many Farms", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86540, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Nazlini", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86544, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Red Valley", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86545, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Rock Point", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86547, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Round Rock", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86549, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Sawmill", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 86556, + "latitude": 35.237487, + "longitude": -109.52295, + "city": "Tsaile", + "state": "AZ", + "county": "Apache" + }, + { + "zip_code": 87001, + "latitude": 35.337752, + "longitude": -106.392905, + "city": "Algodones", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87002, + "latitude": 34.651051, + "longitude": -106.695247, + "city": "Belen", + "state": "NM", + "county": "Valencia" + }, + { + "zip_code": 87004, + "latitude": 35.629445, + "longitude": -106.742896, + "city": "Bernalillo", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87005, + "latitude": 35.273985, + "longitude": -107.991394, + "city": "Bluewater", + "state": "NM", + "county": "Cibola" + }, + { + "zip_code": 87006, + "latitude": 34.613133, + "longitude": -106.786042, + "city": "Bosque", + "state": "NM", + "county": "Valencia" + }, + { + "zip_code": 87007, + "latitude": 34.962954, + "longitude": -108.056457, + "city": "Casa Blanca", + "state": "NM", + "county": "Cibola" + }, + { + "zip_code": 87008, + "latitude": 35.124363, + "longitude": -106.375103, + "city": "Cedar Crest", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87009, + "latitude": 34.650925, + "longitude": -105.880597, + "city": "Cedarvale", + "state": "NM", + "county": "Torrance" + }, + { + "zip_code": 87010, + "latitude": 35.264653, + "longitude": -106.083792, + "city": "Cerrillos", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87011, + "latitude": 34.230014, + "longitude": -107.374545, + "city": "Claunch", + "state": "NM", + "county": "Socorro" + }, + { + "zip_code": 87012, + "latitude": 36.230711, + "longitude": -107.070343, + "city": "Coyote", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87013, + "latitude": 36.021095, + "longitude": -106.888683, + "city": "Cuba", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87014, + "latitude": 34.962954, + "longitude": -108.056457, + "city": "Cubero", + "state": "NM", + "county": "Cibola" + }, + { + "zip_code": 87015, + "latitude": 35.134731, + "longitude": -106.125117, + "city": "Edgewood", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87016, + "latitude": 34.752146, + "longitude": -106.16066, + "city": "Estancia", + "state": "NM", + "county": "Torrance" + }, + { + "zip_code": 87017, + "latitude": 36.707545, + "longitude": -106.594795, + "city": "Gallina", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87018, + "latitude": 35.71742, + "longitude": -106.935844, + "city": "Counselor", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87020, + "latitude": 35.09985, + "longitude": -107.850191, + "city": "Grants", + "state": "NM", + "county": "Cibola" + }, + { + "zip_code": 87021, + "latitude": 35.192539, + "longitude": -107.893691, + "city": "Milan", + "state": "NM", + "county": "Cibola" + }, + { + "zip_code": 87022, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Isleta", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87023, + "latitude": 34.592043, + "longitude": -106.761096, + "city": "Jarales", + "state": "NM", + "county": "Valencia" + }, + { + "zip_code": 87024, + "latitude": 35.655141, + "longitude": -106.739455, + "city": "Jemez Pueblo", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87025, + "latitude": 35.786457, + "longitude": -106.648083, + "city": "Jemez Springs", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87026, + "latitude": 34.962954, + "longitude": -108.056457, + "city": "Laguna", + "state": "NM", + "county": "Cibola" + }, + { + "zip_code": 87027, + "latitude": 36.13338, + "longitude": -106.957116, + "city": "La Jara", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87028, + "latitude": 34.381271, + "longitude": -106.814971, + "city": "La Joya", + "state": "NM", + "county": "Socorro" + }, + { + "zip_code": 87029, + "latitude": 36.324857, + "longitude": -107.049527, + "city": "Lindrith", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87031, + "latitude": 34.76577, + "longitude": -106.712287, + "city": "Los Lunas", + "state": "NM", + "county": "Valencia" + }, + { + "zip_code": 87032, + "latitude": 34.851897, + "longitude": -106.052145, + "city": "Mc Intosh", + "state": "NM", + "county": "Torrance" + }, + { + "zip_code": 87034, + "latitude": 34.69753, + "longitude": -106.807824, + "city": "Pueblo Of Acoma", + "state": "NM", + "county": "Valencia" + }, + { + "zip_code": 87035, + "latitude": 34.94103, + "longitude": -106.055796, + "city": "Moriarty", + "state": "NM", + "county": "Torrance" + }, + { + "zip_code": 87036, + "latitude": 34.617468, + "longitude": -106.277208, + "city": "Mountainair", + "state": "NM", + "county": "Torrance" + }, + { + "zip_code": 87037, + "latitude": 36.711152, + "longitude": -107.974666, + "city": "Nageezi", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87038, + "latitude": 34.962954, + "longitude": -108.056457, + "city": "New Laguna", + "state": "NM", + "county": "Cibola" + }, + { + "zip_code": 87040, + "latitude": 34.962954, + "longitude": -108.056457, + "city": "Paguate", + "state": "NM", + "county": "Cibola" + }, + { + "zip_code": 87041, + "latitude": 35.59796, + "longitude": -106.349162, + "city": "Pena Blanca", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87042, + "latitude": 34.840061, + "longitude": -106.689807, + "city": "Peralta", + "state": "NM", + "county": "Valencia" + }, + { + "zip_code": 87043, + "latitude": 35.620401, + "longitude": -106.637422, + "city": "Placitas", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87044, + "latitude": 35.711701, + "longitude": -106.679604, + "city": "Ponderosa", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87045, + "latitude": 35.344949, + "longitude": -108.101102, + "city": "Prewitt", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87046, + "latitude": 35.71742, + "longitude": -106.935844, + "city": "Regina", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87047, + "latitude": 35.152995, + "longitude": -106.311441, + "city": "Sandia Park", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87048, + "latitude": 35.659583, + "longitude": -106.707978, + "city": "Corrales", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87049, + "latitude": 35.145372, + "longitude": -107.837307, + "city": "San Fidel", + "state": "NM", + "county": "Cibola" + }, + { + "zip_code": 87051, + "latitude": 35.15105, + "longitude": -107.87701, + "city": "San Rafael", + "state": "NM", + "county": "Cibola" + }, + { + "zip_code": 87052, + "latitude": 35.526918, + "longitude": -106.344467, + "city": "Santo Domingo Pueblo", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87053, + "latitude": 35.668248, + "longitude": -106.988531, + "city": "San Ysidro", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87056, + "latitude": 35.22779, + "longitude": -105.977313, + "city": "Stanley", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87057, + "latitude": 34.650925, + "longitude": -105.880597, + "city": "Tajique", + "state": "NM", + "county": "Torrance" + }, + { + "zip_code": 87059, + "latitude": 35.035534, + "longitude": -106.275342, + "city": "Tijeras", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87060, + "latitude": 34.742622, + "longitude": -106.732774, + "city": "Tome", + "state": "NM", + "county": "Valencia" + }, + { + "zip_code": 87061, + "latitude": 34.694759, + "longitude": -106.324694, + "city": "Torreon", + "state": "NM", + "county": "Torrance" + }, + { + "zip_code": 87062, + "latitude": 34.473522, + "longitude": -106.759591, + "city": "Veguita", + "state": "NM", + "county": "Socorro" + }, + { + "zip_code": 87063, + "latitude": 34.650925, + "longitude": -105.880597, + "city": "Willard", + "state": "NM", + "county": "Torrance" + }, + { + "zip_code": 87064, + "latitude": 36.181917, + "longitude": -106.589017, + "city": "Youngsville", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87068, + "latitude": 34.85765, + "longitude": -106.699567, + "city": "Bosque Farms", + "state": "NM", + "county": "Valencia" + }, + { + "zip_code": 87070, + "latitude": 35.022943, + "longitude": -105.979486, + "city": "Clines Corners", + "state": "NM", + "county": "Torrance" + }, + { + "zip_code": 87072, + "latitude": 35.608882, + "longitude": -106.351844, + "city": "Cochiti Pueblo", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87083, + "latitude": 35.630361, + "longitude": -106.339756, + "city": "Cochiti Lake", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87101, + "latitude": 35.199592, + "longitude": -106.644831, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87102, + "latitude": 35.069296, + "longitude": -106.64853, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87103, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87104, + "latitude": 35.104045, + "longitude": -106.671831, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87105, + "latitude": 35.028423, + "longitude": -106.664581, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87106, + "latitude": 35.04319, + "longitude": -106.489592, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87107, + "latitude": 35.140444, + "longitude": -106.638281, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87108, + "latitude": 35.069946, + "longitude": -106.577329, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87109, + "latitude": 35.127194, + "longitude": -106.58678, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87110, + "latitude": 35.129594, + "longitude": -106.62198, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87111, + "latitude": 35.071965, + "longitude": -106.454173, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87112, + "latitude": 35.085042, + "longitude": -106.444113, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87113, + "latitude": 35.145397, + "longitude": -106.50573, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87114, + "latitude": 35.186754, + "longitude": -106.665199, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87115, + "latitude": 35.054947, + "longitude": -106.546128, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87116, + "latitude": 35.054355, + "longitude": -106.561576, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87117, + "latitude": 35.056747, + "longitude": -106.571978, + "city": "Kirtland Afb", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87118, + "latitude": 35.056567, + "longitude": -106.569446, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87119, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87120, + "latitude": 35.119742, + "longitude": -106.704983, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87121, + "latitude": 35.059663, + "longitude": -106.805535, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87122, + "latitude": 35.18531, + "longitude": -106.5293, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87123, + "latitude": 35.069999, + "longitude": -106.457841, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87124, + "latitude": 35.282859, + "longitude": -106.712495, + "city": "Rio Rancho", + "state": "NM", + "county": "Sandoval" + }, + { + "zip_code": 87125, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87131, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87153, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87154, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87158, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87174, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Rio Rancho", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87176, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87181, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87184, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87185, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87187, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87190, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87191, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87192, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87193, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87194, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87195, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87196, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87197, + "latitude": 35.108573, + "longitude": -106.243911, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87198, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87199, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87201, + "latitude": 35.044339, + "longitude": -106.672872, + "city": "Albuquerque", + "state": "NM", + "county": "Bernalillo" + }, + { + "zip_code": 87301, + "latitude": 35.651526, + "longitude": -108.319497, + "city": "Gallup", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87302, + "latitude": 35.480924, + "longitude": -108.176693, + "city": "Gallup", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87305, + "latitude": 35.449852, + "longitude": -108.770522, + "city": "Gallup", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87310, + "latitude": 35.79583, + "longitude": -108.595495, + "city": "Brimhall", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87311, + "latitude": 35.480924, + "longitude": -108.176693, + "city": "Church Rock", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87312, + "latitude": 35.480924, + "longitude": -108.176693, + "city": "Continental Divide", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87313, + "latitude": 35.598506, + "longitude": -108.000168, + "city": "Crownpoint", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87315, + "latitude": 34.962954, + "longitude": -108.056457, + "city": "Fence Lake", + "state": "NM", + "county": "Cibola" + }, + { + "zip_code": 87316, + "latitude": 35.519129, + "longitude": -108.486407, + "city": "Fort Wingate", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87317, + "latitude": 35.576253, + "longitude": -108.762584, + "city": "Gamerco", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87319, + "latitude": 35.50425, + "longitude": -108.831686, + "city": "Mentmore", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87320, + "latitude": 35.480924, + "longitude": -108.176693, + "city": "Mexican Springs", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87321, + "latitude": 35.128655, + "longitude": -108.502673, + "city": "Ramah", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87322, + "latitude": 35.480924, + "longitude": -108.176693, + "city": "Rehoboth", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87323, + "latitude": 35.397643, + "longitude": -108.160405, + "city": "Thoreau", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87325, + "latitude": 35.884668, + "longitude": -108.880374, + "city": "Tohatchi", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87326, + "latitude": 35.350896, + "longitude": -108.698459, + "city": "Vanderwagen", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87327, + "latitude": 35.069064, + "longitude": -108.844495, + "city": "Zuni", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87328, + "latitude": 35.480924, + "longitude": -108.176693, + "city": "Navajo", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87347, + "latitude": 35.480924, + "longitude": -108.176693, + "city": "Jamestown", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87357, + "latitude": 34.962954, + "longitude": -108.056457, + "city": "Pinehill", + "state": "NM", + "county": "Cibola" + }, + { + "zip_code": 87364, + "latitude": 36.500162, + "longitude": -108.233548, + "city": "Sheep Springs", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87365, + "latitude": 35.480924, + "longitude": -108.176693, + "city": "Smith Lake", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87375, + "latitude": 35.480924, + "longitude": -108.176693, + "city": "Yatahey", + "state": "NM", + "county": "Mckinley" + }, + { + "zip_code": 87401, + "latitude": 36.826248, + "longitude": -108.100535, + "city": "Farmington", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87402, + "latitude": 36.775852, + "longitude": -108.101176, + "city": "Farmington", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87410, + "latitude": 36.842198, + "longitude": -107.818288, + "city": "Aztec", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87412, + "latitude": 36.742883, + "longitude": -108.059771, + "city": "Blanco", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87413, + "latitude": 36.613621, + "longitude": -108.016239, + "city": "Bloomfield", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87415, + "latitude": 36.813789, + "longitude": -108.047499, + "city": "Flora Vista", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87416, + "latitude": 36.761342, + "longitude": -108.159329, + "city": "Fruitland", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87417, + "latitude": 36.742972, + "longitude": -108.318698, + "city": "Kirtland", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87418, + "latitude": 36.927197, + "longitude": -108.188227, + "city": "La Plata", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87419, + "latitude": 36.868927, + "longitude": -107.652841, + "city": "Navajo Dam", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87420, + "latitude": 36.417185, + "longitude": -108.860539, + "city": "Shiprock", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87421, + "latitude": 36.750745, + "longitude": -108.203152, + "city": "Waterflow", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87455, + "latitude": 36.500162, + "longitude": -108.233548, + "city": "Newcomb", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87461, + "latitude": 36.500162, + "longitude": -108.233548, + "city": "Sanostee", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87499, + "latitude": 36.774472, + "longitude": -108.06925, + "city": "Farmington", + "state": "NM", + "county": "San Juan" + }, + { + "zip_code": 87500, + "latitude": "", + "longitude": "", + "city": "Santa Fe", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87501, + "latitude": 35.697473, + "longitude": -105.982146, + "city": "Santa Fe", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87502, + "latitude": 35.439937, + "longitude": -106.123698, + "city": "Santa Fe", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87503, + "latitude": 35.521181, + "longitude": -105.981847, + "city": "Santa Fe", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87504, + "latitude": 35.893597, + "longitude": -106.007499, + "city": "Santa Fe", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87505, + "latitude": 35.656638, + "longitude": -105.946155, + "city": "Santa Fe", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87506, + "latitude": 35.606283, + "longitude": -106.075722, + "city": "Santa Fe", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87507, + "latitude": "", + "longitude": "", + "city": "Santa Fe", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87508, + "latitude": "", + "longitude": "", + "city": "Santa Fe", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87509, + "latitude": 35.521181, + "longitude": -105.981847, + "city": "Santa Fe", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87510, + "latitude": 36.219921, + "longitude": -106.262778, + "city": "Abiquiu", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87511, + "latitude": 36.064687, + "longitude": -106.077688, + "city": "Alcalde", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87512, + "latitude": 36.803628, + "longitude": -105.585441, + "city": "Amalia", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87513, + "latitude": 36.53294, + "longitude": -105.656752, + "city": "Arroyo Hondo", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87514, + "latitude": 36.520002, + "longitude": -105.534027, + "city": "Arroyo Seco", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87515, + "latitude": 36.465416, + "longitude": -106.578513, + "city": "Canjilon", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87516, + "latitude": 36.181443, + "longitude": -106.437649, + "city": "Canones", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87517, + "latitude": 36.504515, + "longitude": -105.62924, + "city": "Carson", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87518, + "latitude": 36.465416, + "longitude": -106.578513, + "city": "Cebolla", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87519, + "latitude": 36.504515, + "longitude": -105.62924, + "city": "Cerro", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87520, + "latitude": 36.756297, + "longitude": -106.631567, + "city": "Chama", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87521, + "latitude": 36.131096, + "longitude": -105.738515, + "city": "Chamisal", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87522, + "latitude": 36.465416, + "longitude": -106.578513, + "city": "Chimayo", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87523, + "latitude": 36.005591, + "longitude": -105.903255, + "city": "Cordova", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87524, + "latitude": 36.504515, + "longitude": -105.62924, + "city": "Costilla", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87525, + "latitude": 36.536648, + "longitude": -105.580985, + "city": "Taos Ski Valley", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87527, + "latitude": 36.200125, + "longitude": -105.862272, + "city": "Dixon", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87528, + "latitude": 36.934793, + "longitude": -106.995107, + "city": "Dulce", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87529, + "latitude": 36.349198, + "longitude": -105.624393, + "city": "El Prado", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87530, + "latitude": 36.283096, + "longitude": -106.198853, + "city": "El Rito", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87531, + "latitude": 36.215288, + "longitude": -105.890075, + "city": "Embudo", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87532, + "latitude": 36.424214, + "longitude": -106.251469, + "city": "Espanola", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87533, + "latitude": 35.986585, + "longitude": -106.065392, + "city": "Espanola", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87535, + "latitude": 35.77837, + "longitude": -105.856714, + "city": "Glorieta", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87537, + "latitude": 36.074934, + "longitude": -106.126648, + "city": "Hernandez", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87538, + "latitude": 35.456288, + "longitude": -104.679611, + "city": "Ilfeld", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 87539, + "latitude": 36.465416, + "longitude": -106.578513, + "city": "La Madera", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87540, + "latitude": 35.45554, + "longitude": -105.874452, + "city": "Lamy", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87543, + "latitude": 36.148617, + "longitude": -105.664751, + "city": "Llano", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87544, + "latitude": 35.849514, + "longitude": -106.288482, + "city": "Los Alamos", + "state": "NM", + "county": "Los Alamos" + }, + { + "zip_code": 87545, + "latitude": 35.863858, + "longitude": -106.295255, + "city": "Los Alamos", + "state": "NM", + "county": "Los Alamos" + }, + { + "zip_code": 87548, + "latitude": 36.189247, + "longitude": -106.217575, + "city": "Medanales", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87549, + "latitude": 36.331253, + "longitude": -106.002778, + "city": "Ojo Caliente", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87551, + "latitude": 36.728938, + "longitude": -106.515714, + "city": "Los Ojos", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87552, + "latitude": 35.571588, + "longitude": -105.687047, + "city": "Pecos", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 87553, + "latitude": 36.176327, + "longitude": -105.710451, + "city": "Penasco", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87554, + "latitude": 36.465416, + "longitude": -106.578513, + "city": "Petaca", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87556, + "latitude": 36.758733, + "longitude": -105.59761, + "city": "Questa", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87557, + "latitude": 36.345971, + "longitude": -105.68471, + "city": "Ranchos De Taos", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87558, + "latitude": 36.665925, + "longitude": -105.469436, + "city": "Red River", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87560, + "latitude": 35.456288, + "longitude": -104.679611, + "city": "Ribera", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 87562, + "latitude": 35.456288, + "longitude": -104.679611, + "city": "Rowe", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 87564, + "latitude": 36.619304, + "longitude": -105.63093, + "city": "San Cristobal", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87565, + "latitude": 35.422716, + "longitude": -105.544995, + "city": "San Jose", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 87566, + "latitude": 36.065977, + "longitude": -106.086827, + "city": "San Juan Pueblo", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87567, + "latitude": 35.993095, + "longitude": -106.035116, + "city": "Santa Cruz", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87569, + "latitude": 35.456288, + "longitude": -104.679611, + "city": "Serafina", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 87571, + "latitude": 36.429239, + "longitude": -105.554532, + "city": "Taos", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87573, + "latitude": 35.456288, + "longitude": -104.679611, + "city": "Tererro", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 87574, + "latitude": 35.787442, + "longitude": -105.915713, + "city": "Tesuque", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87575, + "latitude": 36.696968, + "longitude": -106.576636, + "city": "Tierra Amarilla", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87576, + "latitude": 36.504515, + "longitude": -105.62924, + "city": "Trampas", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87577, + "latitude": 36.504515, + "longitude": -105.62924, + "city": "Tres Piedras", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87578, + "latitude": 36.044377, + "longitude": -105.812856, + "city": "Truchas", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87579, + "latitude": 36.133845, + "longitude": -105.571165, + "city": "Vadito", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87580, + "latitude": 36.613044, + "longitude": -105.590018, + "city": "Valdez", + "state": "NM", + "county": "Taos" + }, + { + "zip_code": 87581, + "latitude": 36.465416, + "longitude": -106.578513, + "city": "Vallecitos", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87582, + "latitude": 36.132101, + "longitude": -106.002201, + "city": "Velarde", + "state": "NM", + "county": "Rio Arriba" + }, + { + "zip_code": 87583, + "latitude": 35.456288, + "longitude": -104.679611, + "city": "Villanueva", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 87592, + "latitude": 35.521181, + "longitude": -105.981847, + "city": "Santa Fe", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87594, + "latitude": 35.521181, + "longitude": -105.981847, + "city": "Santa Fe", + "state": "NM", + "county": "Santa Fe" + }, + { + "zip_code": 87701, + "latitude": 35.551539, + "longitude": -104.985643, + "city": "Las Vegas", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 87710, + "latitude": 36.512495, + "longitude": -104.919697, + "city": "Angel Fire", + "state": "NM", + "county": "Colfax" + }, + { + "zip_code": 87711, + "latitude": 34.781908, + "longitude": -104.718891, + "city": "Anton Chico", + "state": "NM", + "county": "Guadalupe" + }, + { + "zip_code": 87712, + "latitude": 36.008302, + "longitude": -105.023886, + "city": "Buena Vista", + "state": "NM", + "county": "Mora" + }, + { + "zip_code": 87713, + "latitude": 36.008302, + "longitude": -105.023886, + "city": "Chacon", + "state": "NM", + "county": "Mora" + }, + { + "zip_code": 87714, + "latitude": 36.504216, + "longitude": -104.905419, + "city": "Cimarron", + "state": "NM", + "county": "Colfax" + }, + { + "zip_code": 87715, + "latitude": 36.007478, + "longitude": -105.382548, + "city": "Cleveland", + "state": "NM", + "county": "Mora" + }, + { + "zip_code": 87718, + "latitude": 36.547612, + "longitude": -105.283276, + "city": "Eagle Nest", + "state": "NM", + "county": "Colfax" + }, + { + "zip_code": 87722, + "latitude": 36.008302, + "longitude": -105.023886, + "city": "Guadalupita", + "state": "NM", + "county": "Mora" + }, + { + "zip_code": 87723, + "latitude": 36.008302, + "longitude": -105.023886, + "city": "Holman", + "state": "NM", + "county": "Mora" + }, + { + "zip_code": 87724, + "latitude": 34.781908, + "longitude": -104.718891, + "city": "La Loma", + "state": "NM", + "county": "Guadalupe" + }, + { + "zip_code": 87728, + "latitude": 36.539682, + "longitude": -104.559057, + "city": "Maxwell", + "state": "NM", + "county": "Colfax" + }, + { + "zip_code": 87729, + "latitude": 36.347987, + "longitude": -104.792032, + "city": "Miami", + "state": "NM", + "county": "Colfax" + }, + { + "zip_code": 87730, + "latitude": 35.804116, + "longitude": -103.902091, + "city": "Mills", + "state": "NM", + "county": "Harding" + }, + { + "zip_code": 87731, + "latitude": 35.649907, + "longitude": -105.253167, + "city": "Montezuma", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 87732, + "latitude": 36.008302, + "longitude": -105.023886, + "city": "Mora", + "state": "NM", + "county": "Mora" + }, + { + "zip_code": 87733, + "latitude": 35.804116, + "longitude": -103.902091, + "city": "Mosquero", + "state": "NM", + "county": "Harding" + }, + { + "zip_code": 87734, + "latitude": 36.008302, + "longitude": -105.023886, + "city": "Ocate", + "state": "NM", + "county": "Mora" + }, + { + "zip_code": 87735, + "latitude": 36.008302, + "longitude": -105.023886, + "city": "Ojo Feliz", + "state": "NM", + "county": "Mora" + }, + { + "zip_code": 87736, + "latitude": 36.008302, + "longitude": -105.023886, + "city": "Rainsville", + "state": "NM", + "county": "Mora" + }, + { + "zip_code": 87740, + "latitude": 36.662666, + "longitude": -104.815043, + "city": "Raton", + "state": "NM", + "county": "Colfax" + }, + { + "zip_code": 87742, + "latitude": 35.836395, + "longitude": -105.390777, + "city": "Rociada", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 87743, + "latitude": 35.93873, + "longitude": -104.195805, + "city": "Roy", + "state": "NM", + "county": "Harding" + }, + { + "zip_code": 87745, + "latitude": 35.456288, + "longitude": -104.679611, + "city": "Sapello", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 87746, + "latitude": 35.804116, + "longitude": -103.902091, + "city": "Solano", + "state": "NM", + "county": "Harding" + }, + { + "zip_code": 87747, + "latitude": 36.603697, + "longitude": -104.859182, + "city": "Springer", + "state": "NM", + "county": "Colfax" + }, + { + "zip_code": 87749, + "latitude": 36.606924, + "longitude": -104.692463, + "city": "Ute Park", + "state": "NM", + "county": "Colfax" + }, + { + "zip_code": 87750, + "latitude": 36.008302, + "longitude": -105.023886, + "city": "Valmora", + "state": "NM", + "county": "Mora" + }, + { + "zip_code": 87752, + "latitude": 36.005998, + "longitude": -104.707404, + "city": "Wagon Mound", + "state": "NM", + "county": "Mora" + }, + { + "zip_code": 87753, + "latitude": 36.008302, + "longitude": -105.023886, + "city": "Watrous", + "state": "NM", + "county": "Mora" + }, + { + "zip_code": 87801, + "latitude": 34.035975, + "longitude": -107.03802, + "city": "Socorro", + "state": "NM", + "county": "Socorro" + }, + { + "zip_code": 87820, + "latitude": 33.913868, + "longitude": -108.649811, + "city": "Aragon", + "state": "NM", + "county": "Catron" + }, + { + "zip_code": 87821, + "latitude": 33.890975, + "longitude": -108.379371, + "city": "Datil", + "state": "NM", + "county": "Catron" + }, + { + "zip_code": 87823, + "latitude": 34.153754, + "longitude": -106.912543, + "city": "Lemitar", + "state": "NM", + "county": "Socorro" + }, + { + "zip_code": 87824, + "latitude": 33.890975, + "longitude": -108.379371, + "city": "Luna", + "state": "NM", + "county": "Catron" + }, + { + "zip_code": 87825, + "latitude": 34.111424, + "longitude": -107.240895, + "city": "Magdalena", + "state": "NM", + "county": "Socorro" + }, + { + "zip_code": 87827, + "latitude": 33.890975, + "longitude": -108.379371, + "city": "Pie Town", + "state": "NM", + "county": "Catron" + }, + { + "zip_code": 87828, + "latitude": 34.18757, + "longitude": -106.919274, + "city": "Polvadera", + "state": "NM", + "county": "Socorro" + }, + { + "zip_code": 87829, + "latitude": 33.764949, + "longitude": -108.558785, + "city": "Quemado", + "state": "NM", + "county": "Catron" + }, + { + "zip_code": 87830, + "latitude": 33.681174, + "longitude": -108.859382, + "city": "Reserve", + "state": "NM", + "county": "Catron" + }, + { + "zip_code": 87831, + "latitude": 34.300124, + "longitude": -106.878808, + "city": "San Acacia", + "state": "NM", + "county": "Socorro" + }, + { + "zip_code": 87832, + "latitude": 33.963287, + "longitude": -106.87644, + "city": "San Antonio", + "state": "NM", + "county": "Socorro" + }, + { + "zip_code": 87901, + "latitude": 33.160602, + "longitude": -107.266914, + "city": "Truth Or Consequences", + "state": "NM", + "county": "Sierra" + }, + { + "zip_code": 87930, + "latitude": 33.042613, + "longitude": -107.170508, + "city": "Arrey", + "state": "NM", + "county": "Sierra" + }, + { + "zip_code": 87931, + "latitude": 33.042613, + "longitude": -107.170508, + "city": "Caballo", + "state": "NM", + "county": "Sierra" + }, + { + "zip_code": 87933, + "latitude": 33.042613, + "longitude": -107.170508, + "city": "Derry", + "state": "NM", + "county": "Sierra" + }, + { + "zip_code": 87935, + "latitude": 33.208962, + "longitude": -107.221209, + "city": "Elephant Butte", + "state": "NM", + "county": "Sierra" + }, + { + "zip_code": 87936, + "latitude": 32.52512, + "longitude": -107.100101, + "city": "Garfield", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 87937, + "latitude": 32.661331, + "longitude": -107.123524, + "city": "Hatch", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 87939, + "latitude": 33.042613, + "longitude": -107.170508, + "city": "Monticello", + "state": "NM", + "county": "Sierra" + }, + { + "zip_code": 87940, + "latitude": 32.41815, + "longitude": -106.820075, + "city": "Rincon", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 87941, + "latitude": 32.6957, + "longitude": -107.153465, + "city": "Salem", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 87942, + "latitude": 33.117058, + "longitude": -107.291475, + "city": "Williamsburg", + "state": "NM", + "county": "Sierra" + }, + { + "zip_code": 87943, + "latitude": 33.042613, + "longitude": -107.170508, + "city": "Winston", + "state": "NM", + "county": "Sierra" + }, + { + "zip_code": 88001, + "latitude": 32.41467, + "longitude": -106.854065, + "city": "Las Cruces", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88002, + "latitude": 32.383871, + "longitude": -106.493675, + "city": "White Sands Missile Range", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88003, + "latitude": 32.273778, + "longitude": -106.747176, + "city": "Las Cruces", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88004, + "latitude": 32.41815, + "longitude": -106.820075, + "city": "Las Cruces", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88005, + "latitude": 32.167296, + "longitude": -106.897176, + "city": "Las Cruces", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88006, + "latitude": 32.305193, + "longitude": -106.786259, + "city": "Las Cruces", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88008, + "latitude": 31.87054, + "longitude": -106.626892, + "city": "Santa Teresa", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88009, + "latitude": 32.055007, + "longitude": -108.62913, + "city": "Playas", + "state": "NM", + "county": "Hidalgo" + }, + { + "zip_code": 88011, + "latitude": 32.324407, + "longitude": -106.668287, + "city": "Las Cruces", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88012, + "latitude": 32.329638, + "longitude": -106.604677, + "city": "Las Cruces", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88020, + "latitude": 32.053042, + "longitude": -108.906944, + "city": "Animas", + "state": "NM", + "county": "Hidalgo" + }, + { + "zip_code": 88021, + "latitude": 32.068186, + "longitude": -106.570475, + "city": "Anthony", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88022, + "latitude": 32.783939, + "longitude": -108.185406, + "city": "Arenas Valley", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88023, + "latitude": 32.819788, + "longitude": -107.969586, + "city": "Bayard", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88024, + "latitude": 32.068164, + "longitude": -106.630951, + "city": "Berino", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88025, + "latitude": 33.06335, + "longitude": -108.695588, + "city": "Buckhorn", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88026, + "latitude": 32.793596, + "longitude": -108.075231, + "city": "Santa Clara", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88027, + "latitude": 32.017438, + "longitude": -106.66731, + "city": "Chamberino", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88028, + "latitude": 32.53667, + "longitude": -108.327898, + "city": "Cliff", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88029, + "latitude": 32.221057, + "longitude": -107.588344, + "city": "Columbus", + "state": "NM", + "county": "Luna" + }, + { + "zip_code": 88030, + "latitude": 32.079682, + "longitude": -107.683073, + "city": "Deming", + "state": "NM", + "county": "Luna" + }, + { + "zip_code": 88031, + "latitude": 32.239815, + "longitude": -107.74042, + "city": "Deming", + "state": "NM", + "county": "Luna" + }, + { + "zip_code": 88032, + "latitude": 32.393919, + "longitude": -106.800976, + "city": "Dona Ana", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88033, + "latitude": 32.29838, + "longitude": -106.881176, + "city": "Fairacres", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88034, + "latitude": 32.693536, + "longitude": -107.906536, + "city": "Faywood", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88036, + "latitude": 32.757427, + "longitude": -108.007527, + "city": "Fort Bayard", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88038, + "latitude": 32.53667, + "longitude": -108.327898, + "city": "Gila", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88039, + "latitude": 33.325458, + "longitude": -108.871953, + "city": "Glenwood", + "state": "NM", + "county": "Catron" + }, + { + "zip_code": 88040, + "latitude": 31.890411, + "longitude": -108.331605, + "city": "Hachita", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88041, + "latitude": 32.804493, + "longitude": -107.954524, + "city": "Hanover", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88042, + "latitude": 32.92029, + "longitude": -107.569856, + "city": "Hillsboro", + "state": "NM", + "county": "Sierra" + }, + { + "zip_code": 88043, + "latitude": 32.702887, + "longitude": -108.100988, + "city": "Hurley", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88044, + "latitude": 32.143754, + "longitude": -106.691214, + "city": "La Mesa", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88045, + "latitude": 32.315951, + "longitude": -108.723047, + "city": "Lordsburg", + "state": "NM", + "county": "Hidalgo" + }, + { + "zip_code": 88046, + "latitude": 32.267993, + "longitude": -106.805867, + "city": "Mesilla", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88047, + "latitude": 32.232085, + "longitude": -106.748341, + "city": "Mesilla Park", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88048, + "latitude": 31.990339, + "longitude": -106.652047, + "city": "Mesquite", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88049, + "latitude": 32.908986, + "longitude": -108.033173, + "city": "Mimbres", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88051, + "latitude": 33.107131, + "longitude": -108.903197, + "city": "Mule Creek", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88052, + "latitude": 32.425921, + "longitude": -106.613563, + "city": "Organ", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88053, + "latitude": 32.861433, + "longitude": -108.21919, + "city": "Pinos Altos", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88054, + "latitude": 32.488841, + "longitude": -106.914575, + "city": "Radium Springs", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88055, + "latitude": 32.53667, + "longitude": -108.327898, + "city": "Redrock", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88056, + "latitude": 32.055007, + "longitude": -108.62913, + "city": "Rodeo", + "state": "NM", + "county": "Hidalgo" + }, + { + "zip_code": 88058, + "latitude": 32.41815, + "longitude": -106.820075, + "city": "San Miguel", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88061, + "latitude": 32.853738, + "longitude": -108.330764, + "city": "Silver City", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88062, + "latitude": 32.728228, + "longitude": -108.137931, + "city": "Silver City", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88063, + "latitude": 31.880055, + "longitude": -106.599975, + "city": "Sunland Park", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88065, + "latitude": 32.619444, + "longitude": -108.37041, + "city": "Tyrone", + "state": "NM", + "county": "Grant" + }, + { + "zip_code": 88072, + "latitude": 32.11871, + "longitude": -106.648973, + "city": "Vado", + "state": "NM", + "county": "Dona Ana" + }, + { + "zip_code": 88101, + "latitude": 34.497241, + "longitude": -103.294978, + "city": "Clovis", + "state": "NM", + "county": "Curry" + }, + { + "zip_code": 88102, + "latitude": 34.628472, + "longitude": -103.391269, + "city": "Clovis", + "state": "NM", + "county": "Curry" + }, + { + "zip_code": 88103, + "latitude": 34.401452, + "longitude": -103.326445, + "city": "Cannon Afb", + "state": "NM", + "county": "Curry" + }, + { + "zip_code": 88112, + "latitude": 34.80789, + "longitude": -103.128229, + "city": "Broadview", + "state": "NM", + "county": "Curry" + }, + { + "zip_code": 88113, + "latitude": 33.928379, + "longitude": -103.274249, + "city": "Causey", + "state": "NM", + "county": "Roosevelt" + }, + { + "zip_code": 88114, + "latitude": 32.690034, + "longitude": -103.209405, + "city": "Crossroads", + "state": "NM", + "county": "Lea" + }, + { + "zip_code": 88115, + "latitude": 33.916566, + "longitude": -103.380387, + "city": "Dora", + "state": "NM", + "county": "Roosevelt" + }, + { + "zip_code": 88116, + "latitude": 33.985296, + "longitude": -103.494855, + "city": "Elida", + "state": "NM", + "county": "Roosevelt" + }, + { + "zip_code": 88118, + "latitude": 34.181943, + "longitude": -103.589732, + "city": "Floyd", + "state": "NM", + "county": "Roosevelt" + }, + { + "zip_code": 88119, + "latitude": 34.531467, + "longitude": -104.174298, + "city": "Fort Sumner", + "state": "NM", + "county": "De Baca" + }, + { + "zip_code": 88120, + "latitude": 34.817795, + "longitude": -103.354685, + "city": "Grady", + "state": "NM", + "county": "Curry" + }, + { + "zip_code": 88121, + "latitude": 34.753722, + "longitude": -103.970607, + "city": "House", + "state": "NM", + "county": "Quay" + }, + { + "zip_code": 88122, + "latitude": 33.883159, + "longitude": -103.709525, + "city": "Kenna", + "state": "NM", + "county": "Roosevelt" + }, + { + "zip_code": 88123, + "latitude": 33.717607, + "longitude": -103.145119, + "city": "Lingo", + "state": "NM", + "county": "Roosevelt" + }, + { + "zip_code": 88124, + "latitude": 34.50512, + "longitude": -103.564506, + "city": "Melrose", + "state": "NM", + "county": "Curry" + }, + { + "zip_code": 88125, + "latitude": 33.720554, + "longitude": -103.412259, + "city": "Milnesand", + "state": "NM", + "county": "Roosevelt" + }, + { + "zip_code": 88126, + "latitude": 33.805354, + "longitude": -103.288102, + "city": "Pep", + "state": "NM", + "county": "Roosevelt" + }, + { + "zip_code": 88130, + "latitude": 34.076964, + "longitude": -103.352595, + "city": "Portales", + "state": "NM", + "county": "Roosevelt" + }, + { + "zip_code": 88132, + "latitude": 33.921623, + "longitude": -103.189798, + "city": "Rogers", + "state": "NM", + "county": "Roosevelt" + }, + { + "zip_code": 88133, + "latitude": 34.475607, + "longitude": -103.46686, + "city": "Saint Vrain", + "state": "NM", + "county": "Curry" + }, + { + "zip_code": 88134, + "latitude": 34.387466, + "longitude": -104.419381, + "city": "Taiban", + "state": "NM", + "county": "De Baca" + }, + { + "zip_code": 88135, + "latitude": 34.518407, + "longitude": -103.128609, + "city": "Texico", + "state": "NM", + "county": "Curry" + }, + { + "zip_code": 88136, + "latitude": 34.387466, + "longitude": -104.419381, + "city": "Yeso", + "state": "NM", + "county": "De Baca" + }, + { + "zip_code": 88201, + "latitude": 33.346666, + "longitude": -104.593687, + "city": "Roswell", + "state": "NM", + "county": "Chaves" + }, + { + "zip_code": 88202, + "latitude": 33.303825, + "longitude": -104.431788, + "city": "Roswell", + "state": "NM", + "county": "Chaves" + }, + { + "zip_code": 88203, + "latitude": "", + "longitude": "", + "city": "Roswell", + "state": "NM", + "county": "Chaves" + }, + { + "zip_code": 88210, + "latitude": 32.622225, + "longitude": -104.433331, + "city": "Artesia", + "state": "NM", + "county": "Eddy" + }, + { + "zip_code": 88211, + "latitude": 32.753571, + "longitude": -104.328113, + "city": "Artesia", + "state": "NM", + "county": "Eddy" + }, + { + "zip_code": 88213, + "latitude": 32.785417, + "longitude": -103.433804, + "city": "Caprock", + "state": "NM", + "county": "Lea" + }, + { + "zip_code": 88220, + "latitude": 32.416897, + "longitude": -104.46539, + "city": "Carlsbad", + "state": "NM", + "county": "Eddy" + }, + { + "zip_code": 88221, + "latitude": 32.342033, + "longitude": -104.293691, + "city": "Carlsbad", + "state": "NM", + "county": "Eddy" + }, + { + "zip_code": 88230, + "latitude": 33.238749, + "longitude": -104.397276, + "city": "Dexter", + "state": "NM", + "county": "Chaves" + }, + { + "zip_code": 88231, + "latitude": 32.440629, + "longitude": -103.18336, + "city": "Eunice", + "state": "NM", + "county": "Lea" + }, + { + "zip_code": 88232, + "latitude": 33.101546, + "longitude": -104.356588, + "city": "Hagerman", + "state": "NM", + "county": "Chaves" + }, + { + "zip_code": 88240, + "latitude": 32.646864, + "longitude": -103.263575, + "city": "Hobbs", + "state": "NM", + "county": "Lea" + }, + { + "zip_code": 88241, + "latitude": 32.7475, + "longitude": -103.216516, + "city": "Hobbs", + "state": "NM", + "county": "Lea" + }, + { + "zip_code": 88242, + "latitude": 32.496641, + "longitude": -103.169754, + "city": "Hobbs", + "state": "NM", + "county": "Lea" + }, + { + "zip_code": 88244, + "latitude": 32.785417, + "longitude": -103.433804, + "city": "Hobbs", + "state": "NM", + "county": "Lea" + }, + { + "zip_code": 88250, + "latitude": 32.802309, + "longitude": -104.718722, + "city": "Hope", + "state": "NM", + "county": "Eddy" + }, + { + "zip_code": 88252, + "latitude": 32.094646, + "longitude": -103.193924, + "city": "Jal", + "state": "NM", + "county": "Lea" + }, + { + "zip_code": 88253, + "latitude": 33.026322, + "longitude": -104.491621, + "city": "Lake Arthur", + "state": "NM", + "county": "Chaves" + }, + { + "zip_code": 88254, + "latitude": 32.636247, + "longitude": -104.365038, + "city": "Lakewood", + "state": "NM", + "county": "Eddy" + }, + { + "zip_code": 88255, + "latitude": 32.482828, + "longitude": -104.287257, + "city": "Loco Hills", + "state": "NM", + "county": "Eddy" + }, + { + "zip_code": 88256, + "latitude": 32.272039, + "longitude": -104.147248, + "city": "Loving", + "state": "NM", + "county": "Eddy" + }, + { + "zip_code": 88260, + "latitude": 32.679494, + "longitude": -103.24708, + "city": "Lovington", + "state": "NM", + "county": "Lea" + }, + { + "zip_code": 88262, + "latitude": 32.785417, + "longitude": -103.433804, + "city": "Mc Donald", + "state": "NM", + "county": "Lea" + }, + { + "zip_code": 88263, + "latitude": 32.18132, + "longitude": -104.066791, + "city": "Malaga", + "state": "NM", + "county": "Eddy" + }, + { + "zip_code": 88264, + "latitude": 32.785417, + "longitude": -103.433804, + "city": "Maljamar", + "state": "NM", + "county": "Lea" + }, + { + "zip_code": 88265, + "latitude": 32.654163, + "longitude": -103.268907, + "city": "Monument", + "state": "NM", + "county": "Lea" + }, + { + "zip_code": 88267, + "latitude": 33.252178, + "longitude": -103.317675, + "city": "Tatum", + "state": "NM", + "county": "Lea" + }, + { + "zip_code": 88268, + "latitude": 32.482828, + "longitude": -104.287257, + "city": "Whites City", + "state": "NM", + "county": "Eddy" + }, + { + "zip_code": 88301, + "latitude": 33.641799, + "longitude": -105.875816, + "city": "Carrizozo", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88310, + "latitude": 32.870046, + "longitude": -105.948967, + "city": "Alamogordo", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88311, + "latitude": 32.695546, + "longitude": -105.612595, + "city": "Alamogordo", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88312, + "latitude": 33.388573, + "longitude": -105.652113, + "city": "Alto", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88314, + "latitude": 33.201167, + "longitude": -105.814309, + "city": "Bent", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88316, + "latitude": 33.501389, + "longitude": -105.612793, + "city": "Capitan", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88317, + "latitude": 32.889717, + "longitude": -105.674395, + "city": "Cloudcroft", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88318, + "latitude": 34.249031, + "longitude": -105.596655, + "city": "Corona", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88321, + "latitude": 34.650925, + "longitude": -105.880597, + "city": "Encino", + "state": "NM", + "county": "Torrance" + }, + { + "zip_code": 88323, + "latitude": 33.644358, + "longitude": -105.873956, + "city": "Fort Stanton", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88324, + "latitude": 33.739651, + "longitude": -105.629382, + "city": "Glencoe", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88325, + "latitude": 32.939582, + "longitude": -105.818942, + "city": "High Rolls Mountain Park", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88330, + "latitude": 32.863459, + "longitude": -106.000393, + "city": "Holloman Air Force Base", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88336, + "latitude": 33.739651, + "longitude": -105.629382, + "city": "Hondo", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88337, + "latitude": 32.985382, + "longitude": -105.923293, + "city": "La Luz", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88338, + "latitude": 33.739651, + "longitude": -105.629382, + "city": "Lincoln", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88339, + "latitude": 32.989936, + "longitude": -105.598225, + "city": "Mayhill", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88340, + "latitude": 33.154212, + "longitude": -105.803067, + "city": "Mescalero", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88341, + "latitude": 33.739651, + "longitude": -105.629382, + "city": "Nogal", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88342, + "latitude": 32.405061, + "longitude": -106.079686, + "city": "Orogrande", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88343, + "latitude": 33.336307, + "longitude": -105.640034, + "city": "Picacho", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88344, + "latitude": 32.609109, + "longitude": -105.437481, + "city": "Pinon", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88345, + "latitude": 33.474521, + "longitude": -105.688274, + "city": "Ruidoso", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88346, + "latitude": 33.353183, + "longitude": -105.620581, + "city": "Ruidoso Downs", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88347, + "latitude": 32.78753, + "longitude": -105.544431, + "city": "Sacramento", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88348, + "latitude": 33.739651, + "longitude": -105.629382, + "city": "San Patricio", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88349, + "latitude": 32.8672, + "longitude": -105.781129, + "city": "Sunspot", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88350, + "latitude": 32.629461, + "longitude": -105.694486, + "city": "Timberon", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88351, + "latitude": 33.739651, + "longitude": -105.629382, + "city": "Tinnie", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88352, + "latitude": 33.172467, + "longitude": -105.960356, + "city": "Tularosa", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88353, + "latitude": 34.600841, + "longitude": -105.205826, + "city": "Vaughn", + "state": "NM", + "county": "Guadalupe" + }, + { + "zip_code": 88354, + "latitude": 32.777584, + "longitude": -105.466283, + "city": "Weed", + "state": "NM", + "county": "Otero" + }, + { + "zip_code": 88355, + "latitude": 33.330502, + "longitude": -105.693322, + "city": "Ruidoso", + "state": "NM", + "county": "Lincoln" + }, + { + "zip_code": 88401, + "latitude": 35.114202, + "longitude": -103.615509, + "city": "Tucumcari", + "state": "NM", + "county": "Quay" + }, + { + "zip_code": 88410, + "latitude": 36.369783, + "longitude": -103.505541, + "city": "Amistad", + "state": "NM", + "county": "Union" + }, + { + "zip_code": 88411, + "latitude": 35.130266, + "longitude": -103.160497, + "city": "Bard", + "state": "NM", + "county": "Quay" + }, + { + "zip_code": 88414, + "latitude": 36.369783, + "longitude": -103.505541, + "city": "Capulin", + "state": "NM", + "county": "Union" + }, + { + "zip_code": 88415, + "latitude": 36.451155, + "longitude": -103.162935, + "city": "Clayton", + "state": "NM", + "county": "Union" + }, + { + "zip_code": 88416, + "latitude": 35.456288, + "longitude": -104.679611, + "city": "Conchas Dam", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 88417, + "latitude": 34.781908, + "longitude": -104.718891, + "city": "Cuervo", + "state": "NM", + "county": "Guadalupe" + }, + { + "zip_code": 88418, + "latitude": 36.369783, + "longitude": -103.505541, + "city": "Des Moines", + "state": "NM", + "county": "Union" + }, + { + "zip_code": 88419, + "latitude": 36.369783, + "longitude": -103.505541, + "city": "Folsom", + "state": "NM", + "county": "Union" + }, + { + "zip_code": 88421, + "latitude": 35.456288, + "longitude": -104.679611, + "city": "Garita", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 88422, + "latitude": 36.369783, + "longitude": -103.505541, + "city": "Gladstone", + "state": "NM", + "county": "Union" + }, + { + "zip_code": 88424, + "latitude": 36.369783, + "longitude": -103.505541, + "city": "Grenville", + "state": "NM", + "county": "Union" + }, + { + "zip_code": 88426, + "latitude": 35.52453, + "longitude": -103.264281, + "city": "Logan", + "state": "NM", + "county": "Quay" + }, + { + "zip_code": 88427, + "latitude": 34.7321, + "longitude": -103.653955, + "city": "Mc Alister", + "state": "NM", + "county": "Quay" + }, + { + "zip_code": 88429, + "latitude": 36.369783, + "longitude": -103.505541, + "city": "Mount Dora", + "state": "NM", + "county": "Union" + }, + { + "zip_code": 88430, + "latitude": 35.635105, + "longitude": -103.223523, + "city": "Nara Visa", + "state": "NM", + "county": "Quay" + }, + { + "zip_code": 88431, + "latitude": 34.781908, + "longitude": -104.718891, + "city": "Newkirk", + "state": "NM", + "county": "Guadalupe" + }, + { + "zip_code": 88433, + "latitude": 34.916697, + "longitude": -103.778184, + "city": "Quay", + "state": "NM", + "county": "Quay" + }, + { + "zip_code": 88434, + "latitude": 35.123423, + "longitude": -103.271136, + "city": "San Jon", + "state": "NM", + "county": "Quay" + }, + { + "zip_code": 88435, + "latitude": 34.852639, + "longitude": -104.589897, + "city": "Santa Rosa", + "state": "NM", + "county": "Guadalupe" + }, + { + "zip_code": 88436, + "latitude": 36.369783, + "longitude": -103.505541, + "city": "Sedan", + "state": "NM", + "county": "Union" + }, + { + "zip_code": 88437, + "latitude": 36.369783, + "longitude": -103.505541, + "city": "Seneca", + "state": "NM", + "county": "Union" + }, + { + "zip_code": 88439, + "latitude": 35.456288, + "longitude": -104.679611, + "city": "Trementina", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 88441, + "latitude": 35.456288, + "longitude": -104.679611, + "city": "Bell Ranch", + "state": "NM", + "county": "San Miguel" + }, + { + "zip_code": 88510, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88511, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88512, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88513, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88514, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88515, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88516, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88517, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88518, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88519, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88520, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88521, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88523, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88524, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88525, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88526, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88527, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88528, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88529, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88530, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88531, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88532, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88533, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88534, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88535, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88536, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88538, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88539, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88540, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88541, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88542, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88543, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88544, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88545, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88546, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88547, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88548, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88549, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88550, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88553, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88554, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88555, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88556, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88557, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88558, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88559, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88560, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88561, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88562, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88563, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88565, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88566, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88567, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88568, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88569, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88570, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88571, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88572, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88573, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88574, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88575, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88576, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88577, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88578, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88579, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88580, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88581, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88582, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88583, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88584, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88585, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88586, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88587, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88588, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88589, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88590, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88595, + "latitude": 31.694842, + "longitude": -106.299987, + "city": "El Paso", + "state": "TX", + "county": "El Paso" + }, + { + "zip_code": 88901, + "latitude": 36.322484, + "longitude": -114.819717, + "city": "The Lakes", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 88905, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "The Lakes", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89001, + "latitude": 37.472491, + "longitude": -115.143709, + "city": "Alamo", + "state": "NV", + "county": "Lincoln" + }, + { + "zip_code": 89003, + "latitude": 36.819857, + "longitude": -116.609372, + "city": "Beatty", + "state": "NV", + "county": "Nye" + }, + { + "zip_code": 89004, + "latitude": 36.088098, + "longitude": -115.608969, + "city": "Blue Diamond", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89005, + "latitude": 36.020563, + "longitude": -114.82952, + "city": "Boulder City", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89006, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Boulder City", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89007, + "latitude": 36.768399, + "longitude": -114.128106, + "city": "Bunkerville", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89008, + "latitude": 38.017162, + "longitude": -114.431896, + "city": "Caliente", + "state": "NV", + "county": "Lincoln" + }, + { + "zip_code": 89009, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Henderson", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89010, + "latitude": 37.585111, + "longitude": -117.604871, + "city": "Dyer", + "state": "NV", + "county": "Esmeralda" + }, + { + "zip_code": 89011, + "latitude": 36.106464, + "longitude": -114.919174, + "city": "Henderson", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89012, + "latitude": 36.075327, + "longitude": -115.141185, + "city": "Henderson", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89013, + "latitude": 37.722454, + "longitude": -117.796454, + "city": "Goldfield", + "state": "NV", + "county": "Esmeralda" + }, + { + "zip_code": 89014, + "latitude": 36.283135, + "longitude": -114.804393, + "city": "Henderson", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89015, + "latitude": 35.98395, + "longitude": -115.193902, + "city": "Henderson", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89016, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Henderson", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89017, + "latitude": 37.592635, + "longitude": -115.226154, + "city": "Hiko", + "state": "NV", + "county": "Lincoln" + }, + { + "zip_code": 89018, + "latitude": 36.431289, + "longitude": -115.535079, + "city": "Indian Springs", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89019, + "latitude": 35.736806, + "longitude": -115.540529, + "city": "Jean", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89020, + "latitude": 36.539018, + "longitude": -116.549634, + "city": "Amargosa Valley", + "state": "NV", + "county": "Nye" + }, + { + "zip_code": 89021, + "latitude": 36.593525, + "longitude": -114.468251, + "city": "Logandale", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89022, + "latitude": 38.702281, + "longitude": -116.310045, + "city": "Manhattan", + "state": "NV", + "county": "Nye" + }, + { + "zip_code": 89023, + "latitude": 37.583805, + "longitude": -116.598559, + "city": "Mercury", + "state": "NV", + "county": "Nye" + }, + { + "zip_code": 89024, + "latitude": 36.810062, + "longitude": -114.072236, + "city": "Mesquite", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89025, + "latitude": 36.691647, + "longitude": -114.651381, + "city": "Moapa", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89026, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Jean", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89027, + "latitude": 36.437362, + "longitude": -114.728855, + "city": "Mesquite", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89028, + "latitude": 35.160398, + "longitude": -114.746447, + "city": "Laughlin", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89029, + "latitude": 35.819678, + "longitude": -114.675298, + "city": "Laughlin", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89030, + "latitude": 36.225271, + "longitude": -115.15431, + "city": "North Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89031, + "latitude": 36.277966, + "longitude": -115.143685, + "city": "North Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89032, + "latitude": 36.217968, + "longitude": -115.170919, + "city": "North Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89033, + "latitude": 36.284511, + "longitude": -115.134488, + "city": "North Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89036, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "North Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89039, + "latitude": 35.252249, + "longitude": -114.871384, + "city": "Cal Nev Ari", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89040, + "latitude": 36.570259, + "longitude": -114.473191, + "city": "Overton", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89041, + "latitude": 36.655797, + "longitude": -116.004795, + "city": "Pahrump", + "state": "NV", + "county": "Nye" + }, + { + "zip_code": 89042, + "latitude": 37.759736, + "longitude": -114.972405, + "city": "Panaca", + "state": "NV", + "county": "Lincoln" + }, + { + "zip_code": 89043, + "latitude": 37.759736, + "longitude": -114.972405, + "city": "Pioche", + "state": "NV", + "county": "Lincoln" + }, + { + "zip_code": 89045, + "latitude": 37.583805, + "longitude": -116.598559, + "city": "Round Mountain", + "state": "NV", + "county": "Nye" + }, + { + "zip_code": 89046, + "latitude": 35.332725, + "longitude": -114.892999, + "city": "Searchlight", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89047, + "latitude": 37.722454, + "longitude": -117.796454, + "city": "Silverpeak", + "state": "NV", + "county": "Esmeralda" + }, + { + "zip_code": 89048, + "latitude": 36.242371, + "longitude": -116.160572, + "city": "Pahrump", + "state": "NV", + "county": "Nye" + }, + { + "zip_code": 89049, + "latitude": 38.262575, + "longitude": -116.624808, + "city": "Tonopah", + "state": "NV", + "county": "Nye" + }, + { + "zip_code": 89052, + "latitude": 35.987798, + "longitude": -115.116652, + "city": "Henderson", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89053, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Henderson", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89060, + "latitude": "", + "longitude": "", + "city": "Pahrump", + "state": "NV", + "county": "Nye" + }, + { + "zip_code": 89061, + "latitude": "", + "longitude": "", + "city": "Pahrump", + "state": "NV", + "county": "Nye" + }, + { + "zip_code": 89070, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Indian Springs", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89074, + "latitude": "", + "longitude": "", + "city": "Henderson", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89077, + "latitude": "", + "longitude": "", + "city": "Henderson", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89084, + "latitude": "", + "longitude": "", + "city": "North Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89086, + "latitude": "", + "longitude": "", + "city": "North Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89101, + "latitude": 36.17372, + "longitude": -115.10647, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89102, + "latitude": 36.281327, + "longitude": -115.390646, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89103, + "latitude": 36.33689, + "longitude": -114.891987, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89104, + "latitude": 36.113372, + "longitude": -115.106002, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89106, + "latitude": 36.181169, + "longitude": -115.167635, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89107, + "latitude": 36.169069, + "longitude": -115.208529, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89108, + "latitude": 36.218667, + "longitude": -115.214037, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89109, + "latitude": 35.989223, + "longitude": -115.40521, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89110, + "latitude": 36.183652, + "longitude": -115.125031, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89111, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89112, + "latitude": 36.157764, + "longitude": -115.025559, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89113, + "latitude": 36.057605, + "longitude": -115.289522, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89114, + "latitude": 36.011339, + "longitude": -115.101508, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89115, + "latitude": 36.220075, + "longitude": -115.064105, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89116, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89117, + "latitude": 36.130992, + "longitude": -115.217932, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89118, + "latitude": 36.030073, + "longitude": -115.233131, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89119, + "latitude": 36.089022, + "longitude": -115.148313, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89120, + "latitude": 36.310827, + "longitude": -115.367158, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89121, + "latitude": 36.122271, + "longitude": -115.09153, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89122, + "latitude": 36.111224, + "longitude": -114.989134, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89123, + "latitude": 35.988844, + "longitude": -115.157513, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89124, + "latitude": 36.167987, + "longitude": -115.369128, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89125, + "latitude": 36.223528, + "longitude": -115.265529, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89126, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89127, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89128, + "latitude": 36.119038, + "longitude": -115.24018, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89129, + "latitude": 35.794298, + "longitude": -115.178996, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89130, + "latitude": 36.246153, + "longitude": -115.222064, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89131, + "latitude": 36.343521, + "longitude": -115.253899, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89132, + "latitude": 36.018981, + "longitude": -115.151937, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89133, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89134, + "latitude": 36.126524, + "longitude": -115.342404, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89135, + "latitude": 36.137829, + "longitude": -115.326081, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89137, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89138, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89139, + "latitude": 36.012873, + "longitude": -115.211805, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89141, + "latitude": 36.010397, + "longitude": -115.20729, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89142, + "latitude": 36.147978, + "longitude": -115.040429, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89143, + "latitude": 36.317804, + "longitude": -115.261939, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89144, + "latitude": 36.178088, + "longitude": -115.31835, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89145, + "latitude": 36.169273, + "longitude": -115.282751, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89146, + "latitude": 36.142369, + "longitude": -115.224185, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89147, + "latitude": 36.159421, + "longitude": -115.243814, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89148, + "latitude": 36.062903, + "longitude": -115.272463, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89149, + "latitude": 36.276465, + "longitude": -115.288521, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89150, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89151, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89152, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89153, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89154, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89155, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89156, + "latitude": 36.20343, + "longitude": -115.036376, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89159, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89160, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89163, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "The Lakes", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89164, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89170, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89173, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89177, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89180, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89185, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89191, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Nellis Afb", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89193, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89195, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89199, + "latitude": 35.927901, + "longitude": -114.972061, + "city": "Las Vegas", + "state": "NV", + "county": "Clark" + }, + { + "zip_code": 89301, + "latitude": 39.314155, + "longitude": -114.840433, + "city": "Ely", + "state": "NV", + "county": "White Pine" + }, + { + "zip_code": 89310, + "latitude": 40.046976, + "longitude": -117.19669, + "city": "Austin", + "state": "NV", + "county": "Lander" + }, + { + "zip_code": 89311, + "latitude": 38.955899, + "longitude": -114.243831, + "city": "Baker", + "state": "NV", + "county": "White Pine" + }, + { + "zip_code": 89314, + "latitude": 39.402924, + "longitude": -114.977022, + "city": "Duckwater", + "state": "NV", + "county": "White Pine" + }, + { + "zip_code": 89315, + "latitude": 39.332636, + "longitude": -114.824507, + "city": "Ely", + "state": "NV", + "county": "White Pine" + }, + { + "zip_code": 89316, + "latitude": 39.547797, + "longitude": -115.993806, + "city": "Eureka", + "state": "NV", + "county": "Eureka" + }, + { + "zip_code": 89317, + "latitude": 38.864122, + "longitude": -115.006865, + "city": "Lund", + "state": "NV", + "county": "White Pine" + }, + { + "zip_code": 89318, + "latitude": 39.403429, + "longitude": -114.7791, + "city": "Mc Gill", + "state": "NV", + "county": "White Pine" + }, + { + "zip_code": 89319, + "latitude": 39.342631, + "longitude": -114.885945, + "city": "Ruth", + "state": "NV", + "county": "White Pine" + }, + { + "zip_code": 89402, + "latitude": 39.239457, + "longitude": -119.971133, + "city": "Crystal Bay", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89403, + "latitude": 39.103007, + "longitude": -119.482264, + "city": "Dayton", + "state": "NV", + "county": "Lyon" + }, + { + "zip_code": 89404, + "latitude": 41.263287, + "longitude": -118.174506, + "city": "Denio", + "state": "NV", + "county": "Humboldt" + }, + { + "zip_code": 89405, + "latitude": 40.613152, + "longitude": -119.348515, + "city": "Empire", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89406, + "latitude": 39.479393, + "longitude": -118.296879, + "city": "Fallon", + "state": "NV", + "county": "Churchill" + }, + { + "zip_code": 89407, + "latitude": 39.525628, + "longitude": -118.842431, + "city": "Fallon", + "state": "NV", + "county": "Churchill" + }, + { + "zip_code": 89408, + "latitude": 39.489212, + "longitude": -119.196644, + "city": "Fernley", + "state": "NV", + "county": "Lyon" + }, + { + "zip_code": 89409, + "latitude": 38.863664, + "longitude": -117.928173, + "city": "Gabbs", + "state": "NV", + "county": "Nye" + }, + { + "zip_code": 89410, + "latitude": 38.818277, + "longitude": -119.649498, + "city": "Gardnerville", + "state": "NV", + "county": "Douglas" + }, + { + "zip_code": 89411, + "latitude": 39.034129, + "longitude": -119.822837, + "city": "Genoa", + "state": "NV", + "county": "Douglas" + }, + { + "zip_code": 89412, + "latitude": 40.652505, + "longitude": -119.356505, + "city": "Gerlach", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89413, + "latitude": 39.050936, + "longitude": -119.942771, + "city": "Glenbrook", + "state": "NV", + "county": "Douglas" + }, + { + "zip_code": 89414, + "latitude": 40.950867, + "longitude": -117.494182, + "city": "Golconda", + "state": "NV", + "county": "Humboldt" + }, + { + "zip_code": 89415, + "latitude": 38.576848, + "longitude": -118.690644, + "city": "Hawthorne", + "state": "NV", + "county": "Mineral" + }, + { + "zip_code": 89418, + "latitude": 40.649475, + "longitude": -118.288693, + "city": "Imlay", + "state": "NV", + "county": "Pershing" + }, + { + "zip_code": 89419, + "latitude": 40.251285, + "longitude": -118.400276, + "city": "Lovelock", + "state": "NV", + "county": "Pershing" + }, + { + "zip_code": 89420, + "latitude": 38.484178, + "longitude": -118.423999, + "city": "Luning", + "state": "NV", + "county": "Mineral" + }, + { + "zip_code": 89421, + "latitude": 41.970838, + "longitude": -117.673683, + "city": "Mc Dermitt", + "state": "NV", + "county": "Humboldt" + }, + { + "zip_code": 89422, + "latitude": 38.387008, + "longitude": -118.109585, + "city": "Mina", + "state": "NV", + "county": "Mineral" + }, + { + "zip_code": 89423, + "latitude": 39.008718, + "longitude": -119.729731, + "city": "Minden", + "state": "NV", + "county": "Douglas" + }, + { + "zip_code": 89424, + "latitude": 39.827156, + "longitude": -119.360545, + "city": "Nixon", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89425, + "latitude": 41.263287, + "longitude": -118.174506, + "city": "Orovada", + "state": "NV", + "county": "Humboldt" + }, + { + "zip_code": 89426, + "latitude": 41.263287, + "longitude": -118.174506, + "city": "Paradise Valley", + "state": "NV", + "county": "Humboldt" + }, + { + "zip_code": 89427, + "latitude": 38.970781, + "longitude": -118.833128, + "city": "Schurz", + "state": "NV", + "county": "Mineral" + }, + { + "zip_code": 89428, + "latitude": 39.26524, + "longitude": -119.638802, + "city": "Silver City", + "state": "NV", + "county": "Lyon" + }, + { + "zip_code": 89429, + "latitude": 39.439405, + "longitude": -119.391468, + "city": "Silver Springs", + "state": "NV", + "county": "Lyon" + }, + { + "zip_code": 89430, + "latitude": 38.773292, + "longitude": -119.302929, + "city": "Smith", + "state": "NV", + "county": "Lyon" + }, + { + "zip_code": 89431, + "latitude": 40.039169, + "longitude": -119.640601, + "city": "Sparks", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89432, + "latitude": 40.541218, + "longitude": -119.586934, + "city": "Sparks", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89433, + "latitude": 39.748304, + "longitude": -119.804924, + "city": "Sun Valley", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89434, + "latitude": 39.591728, + "longitude": -119.716747, + "city": "Sparks", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89435, + "latitude": 40.541218, + "longitude": -119.586934, + "city": "Sparks", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89436, + "latitude": 39.651879, + "longitude": -119.659053, + "city": "Sparks", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89438, + "latitude": 41.263287, + "longitude": -118.174506, + "city": "Valmy", + "state": "NV", + "county": "Humboldt" + }, + { + "zip_code": 89439, + "latitude": 39.516486, + "longitude": -119.983252, + "city": "Verdi", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89440, + "latitude": 39.332488, + "longitude": -119.613509, + "city": "Virginia City", + "state": "NV", + "county": "Storey" + }, + { + "zip_code": 89442, + "latitude": 39.639846, + "longitude": -119.302787, + "city": "Wadsworth", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89444, + "latitude": 38.844747, + "longitude": -119.35228, + "city": "Wellington", + "state": "NV", + "county": "Lyon" + }, + { + "zip_code": 89445, + "latitude": 41.213481, + "longitude": -117.706799, + "city": "Winnemucca", + "state": "NV", + "county": "Humboldt" + }, + { + "zip_code": 89446, + "latitude": 41.076358, + "longitude": -117.760165, + "city": "Winnemucca", + "state": "NV", + "county": "Humboldt" + }, + { + "zip_code": 89447, + "latitude": 39.080415, + "longitude": -119.228631, + "city": "Yerington", + "state": "NV", + "county": "Lyon" + }, + { + "zip_code": 89448, + "latitude": 39.020403, + "longitude": -119.911397, + "city": "Zephyr Cove", + "state": "NV", + "county": "Douglas" + }, + { + "zip_code": 89449, + "latitude": 38.860647, + "longitude": -119.732977, + "city": "Stateline", + "state": "NV", + "county": "Douglas" + }, + { + "zip_code": 89450, + "latitude": 39.256357, + "longitude": -119.946371, + "city": "Incline Village", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89451, + "latitude": 39.253908, + "longitude": -119.935619, + "city": "Incline Village", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89452, + "latitude": 39.259103, + "longitude": -119.956585, + "city": "Incline Village", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89494, + "latitude": "", + "longitude": "", + "city": "Sparks", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89496, + "latitude": 39.537979, + "longitude": -118.343592, + "city": "Fallon", + "state": "NV", + "county": "Churchill" + }, + { + "zip_code": 89501, + "latitude": 39.65558, + "longitude": -119.704614, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89502, + "latitude": 39.579526, + "longitude": -119.753826, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89503, + "latitude": 39.547117, + "longitude": -119.901957, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89504, + "latitude": 40.541218, + "longitude": -119.586934, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89505, + "latitude": 39.52241, + "longitude": -119.835275, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89506, + "latitude": 39.695488, + "longitude": -119.811146, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89507, + "latitude": 39.54231, + "longitude": -119.816374, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89509, + "latitude": 39.413458, + "longitude": -119.857022, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89510, + "latitude": 39.906211, + "longitude": -119.604367, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89511, + "latitude": 39.360265, + "longitude": -119.8057, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89512, + "latitude": 39.545363, + "longitude": -119.879069, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89513, + "latitude": 39.631922, + "longitude": -119.293722, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89515, + "latitude": 40.541218, + "longitude": -119.586934, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89520, + "latitude": 40.541218, + "longitude": -119.586934, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89523, + "latitude": 39.549297, + "longitude": -119.639031, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89533, + "latitude": 39.543941, + "longitude": -119.906109, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89557, + "latitude": 40.541218, + "longitude": -119.586934, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89570, + "latitude": 40.541218, + "longitude": -119.586934, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89595, + "latitude": 40.541218, + "longitude": -119.586934, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89599, + "latitude": 40.541218, + "longitude": -119.586934, + "city": "Reno", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89701, + "latitude": 39.154485, + "longitude": -119.73074, + "city": "Carson City", + "state": "NV", + "county": "Carson City" + }, + { + "zip_code": 89702, + "latitude": 39.135503, + "longitude": -119.75875, + "city": "Carson City", + "state": "NV", + "county": "Carson City" + }, + { + "zip_code": 89703, + "latitude": 39.164225, + "longitude": -119.800294, + "city": "Carson City", + "state": "NV", + "county": "Carson City" + }, + { + "zip_code": 89704, + "latitude": 39.453739, + "longitude": -119.722803, + "city": "Washoe Valley", + "state": "NV", + "county": "Washoe" + }, + { + "zip_code": 89705, + "latitude": 39.055424, + "longitude": -119.805916, + "city": "Carson City", + "state": "NV", + "county": "Douglas" + }, + { + "zip_code": 89706, + "latitude": 39.202517, + "longitude": -119.752626, + "city": "Carson City", + "state": "NV", + "county": "Carson City" + }, + { + "zip_code": 89711, + "latitude": 39.167833, + "longitude": -119.776409, + "city": "Carson City", + "state": "NV", + "county": "Carson City" + }, + { + "zip_code": 89712, + "latitude": 39.167833, + "longitude": -119.776409, + "city": "Carson City", + "state": "NV", + "county": "Carson City" + }, + { + "zip_code": 89713, + "latitude": 39.167833, + "longitude": -119.776409, + "city": "Carson City", + "state": "NV", + "county": "Carson City" + }, + { + "zip_code": 89714, + "latitude": 39.167833, + "longitude": -119.776409, + "city": "Carson City", + "state": "NV", + "county": "Carson City" + }, + { + "zip_code": 89721, + "latitude": 39.167833, + "longitude": -119.776409, + "city": "Carson City", + "state": "NV", + "county": "Carson City" + }, + { + "zip_code": 89801, + "latitude": 40.905583, + "longitude": -115.534429, + "city": "Elko", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89802, + "latitude": 41.059414, + "longitude": -115.529596, + "city": "Elko", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89803, + "latitude": 41.059414, + "longitude": -115.529596, + "city": "Elko", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89815, + "latitude": 40.751905, + "longitude": -115.595581, + "city": "Spring Creek", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89820, + "latitude": 40.042115, + "longitude": -116.974803, + "city": "Battle Mountain", + "state": "NV", + "county": "Lander" + }, + { + "zip_code": 89821, + "latitude": 40.413793, + "longitude": -116.581275, + "city": "Crescent Valley", + "state": "NV", + "county": "Eureka" + }, + { + "zip_code": 89822, + "latitude": 40.715931, + "longitude": -116.103154, + "city": "Carlin", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89823, + "latitude": 41.059414, + "longitude": -115.529596, + "city": "Deeth", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89824, + "latitude": 41.059414, + "longitude": -115.529596, + "city": "Halleck", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89825, + "latitude": 41.059414, + "longitude": -115.529596, + "city": "Jackpot", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89826, + "latitude": 41.059414, + "longitude": -115.529596, + "city": "Jarbidge", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89828, + "latitude": 40.744704, + "longitude": -115.554233, + "city": "Lamoille", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89830, + "latitude": 41.059414, + "longitude": -115.529596, + "city": "Montello", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89831, + "latitude": 41.059414, + "longitude": -115.529596, + "city": "Mountain City", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89832, + "latitude": 41.74828, + "longitude": -116.007157, + "city": "Owyhee", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89833, + "latitude": 41.059414, + "longitude": -115.529596, + "city": "Ruby Valley", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89834, + "latitude": 41.059414, + "longitude": -115.529596, + "city": "Tuscarora", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89835, + "latitude": 41.543923, + "longitude": -114.821761, + "city": "Wells", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 89883, + "latitude": 40.504545, + "longitude": -114.412635, + "city": "West Wendover", + "state": "NV", + "county": "Elko" + }, + { + "zip_code": 90001, + "latitude": 33.973951, + "longitude": -118.248405, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90002, + "latitude": 33.950514, + "longitude": -118.245855, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90003, + "latitude": 33.949164, + "longitude": -118.273156, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90004, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90005, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90006, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90007, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90008, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90009, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90010, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90011, + "latitude": 33.989264, + "longitude": -118.250056, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90012, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90013, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90014, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90015, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90016, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90017, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90018, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90019, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90020, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90021, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90022, + "latitude": 33.896564, + "longitude": -118.176502, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90023, + "latitude": 34.008262, + "longitude": -118.196055, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90024, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90025, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90026, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90027, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90028, + "latitude": 34.014613, + "longitude": -118.225606, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90029, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90030, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90031, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90032, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90033, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90034, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90035, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90036, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90037, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90038, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90039, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90040, + "latitude": 33.990863, + "longitude": -118.153153, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90041, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90042, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90043, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90044, + "latitude": 33.938108, + "longitude": -118.285706, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90045, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90046, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90047, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90048, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90049, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90050, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90051, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90052, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90053, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90054, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90055, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90056, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90057, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90058, + "latitude": 33.999433, + "longitude": -118.213255, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90059, + "latitude": 33.921065, + "longitude": -118.244955, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90060, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90061, + "latitude": 33.920965, + "longitude": -118.275356, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90062, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90063, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90064, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90065, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90066, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90067, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90068, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90069, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "West Hollywood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90070, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90071, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90072, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90073, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90074, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90075, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90076, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90077, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90078, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90079, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90080, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90081, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90082, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90083, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90084, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90086, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90087, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90088, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90089, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90091, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90093, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90094, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90095, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90096, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90097, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90099, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90101, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90102, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90103, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90174, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90185, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Los Angeles", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90201, + "latitude": 33.976663, + "longitude": -118.168903, + "city": "Bell", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90202, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Bell Gardens", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90209, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Beverly Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90210, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Beverly Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90211, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Beverly Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90212, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Beverly Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90213, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Beverly Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90220, + "latitude": 33.874815, + "longitude": -118.240208, + "city": "Compton", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90221, + "latitude": 33.879565, + "longitude": -118.21681, + "city": "Compton", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90222, + "latitude": 33.909915, + "longitude": -118.235654, + "city": "Compton", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90223, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Compton", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90224, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Compton", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90230, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Culver City", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90231, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Culver City", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90232, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Culver City", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90233, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Culver City", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90239, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Downey", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90240, + "latitude": 33.946363, + "longitude": -118.119461, + "city": "Downey", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90241, + "latitude": 33.939164, + "longitude": -118.125851, + "city": "Downey", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90242, + "latitude": 33.922714, + "longitude": -118.139969, + "city": "Downey", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90245, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "El Segundo", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90247, + "latitude": 33.888315, + "longitude": -118.295256, + "city": "Gardena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90248, + "latitude": 33.877165, + "longitude": -118.269605, + "city": "Gardena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90249, + "latitude": 33.858866, + "longitude": -118.299106, + "city": "Gardena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90250, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Hawthorne", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90251, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Hawthorne", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90254, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Hermosa Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90255, + "latitude": 33.977987, + "longitude": -118.213137, + "city": "Huntington Park", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90260, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Lawndale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90261, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Lawndale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90262, + "latitude": 33.924538, + "longitude": -118.202954, + "city": "Lynwood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90263, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Malibu", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90264, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Malibu", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90265, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Malibu", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90266, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Manhattan Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90267, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Manhattan Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90270, + "latitude": 33.988463, + "longitude": -118.187376, + "city": "Maywood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90272, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pacific Palisades", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90274, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Palos Verdes Peninsula", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90275, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Rancho Palos Verdes", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90277, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Redondo Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90278, + "latitude": 33.987613, + "longitude": -118.179754, + "city": "Redondo Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90280, + "latitude": 33.937714, + "longitude": -118.193403, + "city": "South Gate", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90290, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Topanga", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90291, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Venice", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90292, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Marina Del Rey", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90293, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Playa Del Rey", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90294, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Venice", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90295, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Marina Del Rey", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90296, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Playa Del Rey", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90301, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90302, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90303, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90304, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90305, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90306, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90307, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90308, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90309, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90310, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90311, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90312, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90313, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90397, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90398, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Inglewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90401, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Monica", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90402, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Monica", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90403, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Monica", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90404, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Monica", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90405, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Monica", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90406, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Monica", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90407, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Monica", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90408, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Monica", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90409, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Monica", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90410, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Monica", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90411, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Monica", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90501, + "latitude": 33.835665, + "longitude": -118.303805, + "city": "Torrance", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90502, + "latitude": 33.833816, + "longitude": -118.293405, + "city": "Torrance", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90503, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Torrance", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90504, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Torrance", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90505, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Torrance", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90506, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Torrance", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90507, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Torrance", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90508, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Torrance", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90509, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Torrance", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90510, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Torrance", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90601, + "latitude": 34.004311, + "longitude": -118.0441, + "city": "Whittier", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90602, + "latitude": 33.971839, + "longitude": -118.036578, + "city": "Whittier", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90603, + "latitude": 33.947372, + "longitude": -117.995297, + "city": "Whittier", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90604, + "latitude": 33.932663, + "longitude": -118.009085, + "city": "Whittier", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90605, + "latitude": 33.944312, + "longitude": -118.017424, + "city": "Whittier", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90606, + "latitude": 33.967162, + "longitude": -118.036999, + "city": "Whittier", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90607, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Whittier", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90608, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Whittier", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90609, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Whittier", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90610, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Whittier", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90612, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Whittier", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90620, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Buena Park", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90621, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Buena Park", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90622, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Buena Park", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90623, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "La Palma", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90624, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Buena Park", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90630, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Cypress", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90631, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "La Habra", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90632, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "La Habra", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90633, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "La Habra", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90637, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "La Mirada", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90638, + "latitude": 33.900863, + "longitude": -118.007297, + "city": "La Mirada", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90639, + "latitude": 33.905813, + "longitude": -118.018247, + "city": "La Mirada", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90640, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Montebello", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90650, + "latitude": 33.906763, + "longitude": -118.076549, + "city": "Norwalk", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90651, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Norwalk", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90652, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Norwalk", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90659, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Norwalk", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90660, + "latitude": 33.985812, + "longitude": -118.088787, + "city": "Pico Rivera", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90661, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pico Rivera", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90662, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pico Rivera", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90665, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pico Rivera", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90670, + "latitude": 33.927063, + "longitude": -118.063698, + "city": "Santa Fe Springs", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90671, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Fe Springs", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90680, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Stanton", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90701, + "latitude": 33.865395, + "longitude": -118.073148, + "city": "Artesia", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90702, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Artesia", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90703, + "latitude": 33.866914, + "longitude": -118.068648, + "city": "Cerritos", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90704, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Avalon", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90706, + "latitude": 33.888014, + "longitude": -118.12965, + "city": "Bellflower", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90707, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Bellflower", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90710, + "latitude": 33.791267, + "longitude": -118.251554, + "city": "Harbor City", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90711, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Lakewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90712, + "latitude": 33.845624, + "longitude": -118.14645, + "city": "Lakewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90713, + "latitude": 33.850465, + "longitude": -118.109399, + "city": "Lakewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90714, + "latitude": 33.851215, + "longitude": -118.1339, + "city": "Lakewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90715, + "latitude": 33.840565, + "longitude": -118.078748, + "city": "Lakewood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90716, + "latitude": 33.830967, + "longitude": -118.072796, + "city": "Hawaiian Gardens", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90717, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Lomita", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90720, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Los Alamitos", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90721, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Los Alamitos", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90723, + "latitude": 33.899015, + "longitude": -118.165152, + "city": "Paramount", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90731, + "latitude": 33.753088, + "longitude": -118.253053, + "city": "San Pedro", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90732, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "San Pedro", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90733, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "San Pedro", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90734, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "San Pedro", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90740, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Seal Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90742, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Sunset Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90743, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Surfside", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 90744, + "latitude": 33.779417, + "longitude": -118.253853, + "city": "Wilmington", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90745, + "latitude": 33.813317, + "longitude": -118.261154, + "city": "Carson", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90746, + "latitude": 33.859716, + "longitude": -118.255204, + "city": "Carson", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90747, + "latitude": 33.867138, + "longitude": -118.253825, + "city": "Carson", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90748, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Wilmington", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90749, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Carson", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90801, + "latitude": 33.804309, + "longitude": -118.200957, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90802, + "latitude": 33.756024, + "longitude": -118.201101, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90803, + "latitude": 33.759885, + "longitude": -118.13016, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90804, + "latitude": 33.785666, + "longitude": -118.135699, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90805, + "latitude": 33.838815, + "longitude": -118.1576, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90806, + "latitude": 33.795016, + "longitude": -118.172801, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90807, + "latitude": 33.831466, + "longitude": -118.181102, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90808, + "latitude": 33.800266, + "longitude": -118.106132, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90809, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90810, + "latitude": 33.819266, + "longitude": -118.232453, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90813, + "latitude": 33.780017, + "longitude": -118.183701, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90814, + "latitude": 33.771301, + "longitude": -118.142654, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90815, + "latitude": 33.793516, + "longitude": -118.114612, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90822, + "latitude": 33.792666, + "longitude": -118.1638, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90831, + "latitude": 33.767817, + "longitude": -118.199401, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90832, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90833, + "latitude": 33.767817, + "longitude": -118.199401, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90834, + "latitude": 33.767817, + "longitude": -118.199401, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90835, + "latitude": 33.767817, + "longitude": -118.199401, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90840, + "latitude": 33.784266, + "longitude": -118.115698, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90842, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90844, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90845, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90846, + "latitude": 33.824918, + "longitude": -118.150352, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90847, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90848, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90853, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90888, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 90899, + "latitude": "", + "longitude": "", + "city": "Long Beach", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91001, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Altadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91003, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Altadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91006, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Arcadia", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91007, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Arcadia", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91009, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Duarte", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91010, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Duarte", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91011, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "La Canada Flintridge", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91012, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "La Canada Flintridge", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91016, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Monrovia", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91017, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Monrovia", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91020, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Montrose", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91021, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Montrose", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91023, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Mount Wilson", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91024, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Sierra Madre", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91025, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Sierra Madre", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91030, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "South Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91031, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "South Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91040, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Sunland", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91041, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Sunland", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91042, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Tujunga", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91043, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Tujunga", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91046, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Verdugo City", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91050, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91051, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91066, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Arcadia", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91077, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Arcadia", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91101, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91102, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91103, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91104, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91105, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91106, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91107, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91108, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "San Marino", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91109, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91110, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91114, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91115, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91116, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91117, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91118, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "San Marino", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91121, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91123, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91124, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91125, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91126, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91129, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91131, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91175, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91182, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91184, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91185, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91186, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91187, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91188, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91189, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91191, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pasadena", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91201, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91202, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91203, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91204, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91205, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91206, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91207, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91208, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91209, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91210, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91214, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "La Crescenta", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91221, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91222, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91224, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "La Crescenta", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91225, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91226, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91301, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Agoura Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91302, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Calabasas", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91303, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Canoga Park", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91304, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Canoga Park", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91305, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Canoga Park", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91306, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Winnetka", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91307, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "West Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91308, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "West Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91309, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Canoga Park", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91310, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Castaic", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91311, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Chatsworth", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91312, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Chatsworth", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91313, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Chatsworth", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91316, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Encino", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91319, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Newbury Park", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 91320, + "latitude": 34.175921, + "longitude": -118.905874, + "city": "Newbury Park", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 91321, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Newhall", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91322, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Newhall", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91324, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Northridge", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91325, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Northridge", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91326, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Northridge", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91327, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Northridge", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91328, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Northridge", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91329, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Northridge", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91330, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Northridge", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91331, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pacoima", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91333, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pacoima", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91334, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pacoima", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91335, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Reseda", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91337, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Reseda", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91340, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "San Fernando", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91341, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "San Fernando", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91342, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Sylmar", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91343, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "North Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91344, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Granada Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91345, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Mission Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91346, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Mission Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91350, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Clarita", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91351, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Canyon Country", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91352, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Sun Valley", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91353, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Sun Valley", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91354, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Valencia", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91355, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Valencia", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91356, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Tarzana", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91357, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Tarzana", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91358, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Thousand Oaks", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 91359, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Westlake Village", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 91360, + "latitude": 34.213403, + "longitude": -118.800204, + "city": "Thousand Oaks", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 91361, + "latitude": 34.141783, + "longitude": -118.847732, + "city": "Westlake Village", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 91362, + "latitude": 34.194756, + "longitude": -118.823177, + "city": "Thousand Oaks", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 91363, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Westlake Village", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91364, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Woodland Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91365, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Woodland Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91367, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Woodland Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91371, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Woodland Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91372, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Calabasas", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91376, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Agoura Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91377, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Oak Park", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 91380, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Clarita", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91381, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Stevenson Ranch", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91382, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Clarita", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91383, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Santa Clarita", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91384, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Castaic", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91385, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Valencia", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91386, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Canyon Country", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91387, + "latitude": "", + "longitude": "", + "city": "Canyon Country", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91388, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91390, + "latitude": "", + "longitude": "", + "city": "Santa Clarita", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91392, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Sylmar", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91393, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "North Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91394, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Granada Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91395, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Mission Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91396, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Winnetka", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91399, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Woodland Hills", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91401, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91402, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Panorama City", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91403, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Sherman Oaks", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91404, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91405, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91406, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91407, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91408, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91409, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91410, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91411, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91412, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Panorama City", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91413, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Sherman Oaks", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91416, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Encino", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91423, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Sherman Oaks", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91426, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Encino", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91436, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Encino", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91470, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91482, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91495, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Sherman Oaks", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91496, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91497, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91499, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Van Nuys", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91501, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Burbank", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91502, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Burbank", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91503, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Burbank", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91504, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Burbank", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91505, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Burbank", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91506, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Burbank", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91507, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Burbank", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91508, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Burbank", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91510, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Burbank", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91521, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Burbank", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91522, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Burbank", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91523, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Burbank", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91526, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Burbank", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91601, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "North Hollywood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91602, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "North Hollywood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91603, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "North Hollywood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91604, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Studio City", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91605, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "North Hollywood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91606, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "North Hollywood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91607, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Valley Village", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91608, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Universal City", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91609, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "North Hollywood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91610, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Toluca Lake", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91611, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "North Hollywood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91612, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "North Hollywood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91614, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Studio City", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91615, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "North Hollywood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91616, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "North Hollywood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91617, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Valley Village", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91618, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "North Hollywood", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91701, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Rancho Cucamonga", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91702, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Azusa", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91706, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Baldwin Park", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91708, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Chino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91709, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Chino Hills", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91710, + "latitude": 34.159844, + "longitude": -114.30117, + "city": "Chino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91711, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Claremont", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91714, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "City Of Industry", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91715, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "City Of Industry", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91716, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "City Of Industry", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91722, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Covina", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91723, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Covina", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91724, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Covina", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91729, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Rancho Cucamonga", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91730, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Rancho Cucamonga", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91731, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "El Monte", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91732, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "El Monte", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91733, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "South El Monte", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91734, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "El Monte", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91735, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "El Monte", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91737, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Rancho Cucamonga", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91739, + "latitude": 34.122307, + "longitude": -116.247005, + "city": "Rancho Cucamonga", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91740, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendora", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91741, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Glendora", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91743, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Guasti", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91744, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "La Puente", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91745, + "latitude": 33.976114, + "longitude": -117.981631, + "city": "Hacienda Heights", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91746, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "La Puente", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91747, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "La Puente", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91748, + "latitude": 33.966218, + "longitude": -117.91736, + "city": "Rowland Heights", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91749, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "La Puente", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91750, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "La Verne", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91752, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Mira Loma", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 91754, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Monterey Park", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91755, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Monterey Park", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91756, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Monterey Park", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91758, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Ontario", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91759, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Mt Baldy", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91761, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Ontario", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91762, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Ontario", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91763, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Montclair", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91764, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Ontario", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91765, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Diamond Bar", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91766, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pomona", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91767, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pomona", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91768, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pomona", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91769, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pomona", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91770, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Rosemead", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91771, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Rosemead", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91772, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Rosemead", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91773, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "San Dimas", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91775, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "San Gabriel", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91776, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "San Gabriel", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91778, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "San Gabriel", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91780, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Temple City", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91784, + "latitude": 34.128118, + "longitude": -116.246997, + "city": "Upland", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91785, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Upland", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91786, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Upland", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91788, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Walnut", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91789, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Walnut", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91790, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "West Covina", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91791, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "West Covina", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91792, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "West Covina", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91793, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "West Covina", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91795, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Walnut", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91797, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pomona", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91798, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Ontario", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 91799, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pomona", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91801, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Alhambra", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91802, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Alhambra", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91803, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Alhambra", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91804, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Alhambra", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91841, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Alhambra", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91896, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Alhambra", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91899, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Alhambra", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 91901, + "latitude": 32.74081, + "longitude": -116.976341, + "city": "Alpine", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91902, + "latitude": 32.67387, + "longitude": -117.020668, + "city": "Bonita", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91903, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Alpine", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91905, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Boulevard", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91906, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Campo", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91908, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Bonita", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91909, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Chula Vista", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91910, + "latitude": 32.636922, + "longitude": -117.050072, + "city": "Chula Vista", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91911, + "latitude": 32.615983, + "longitude": -117.034012, + "city": "Chula Vista", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91912, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Chula Vista", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91913, + "latitude": 32.639967, + "longitude": -116.984669, + "city": "Chula Vista", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91914, + "latitude": 32.656159, + "longitude": -116.966139, + "city": "Chula Vista", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91915, + "latitude": 32.629234, + "longitude": -116.948228, + "city": "Chula Vista", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91916, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Descanso", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91917, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Dulzura", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91921, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Chula Vista", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91931, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Guatay", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91932, + "latitude": 32.578991, + "longitude": -117.117351, + "city": "Imperial Beach", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91933, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Imperial Beach", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91934, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Jacumba", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91935, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Jamul", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91941, + "latitude": 32.76105, + "longitude": -116.998102, + "city": "La Mesa", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91942, + "latitude": 32.781084, + "longitude": -117.018638, + "city": "La Mesa", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91943, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "La Mesa", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91944, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "La Mesa", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91945, + "latitude": 32.732288, + "longitude": -117.037344, + "city": "Lemon Grove", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91946, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Lemon Grove", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91947, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Lincoln Acres", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91948, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Mount Laguna", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91950, + "latitude": 32.671194, + "longitude": -117.084353, + "city": "National City", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91951, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "National City", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91962, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Pine Valley", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91963, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Potrero", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91976, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Spring Valley", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91977, + "latitude": 32.718352, + "longitude": -117.000109, + "city": "Spring Valley", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91978, + "latitude": 32.733452, + "longitude": -116.957898, + "city": "Spring Valley", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91979, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Spring Valley", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91980, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Tecate", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91987, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Tecate", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 91990, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Potrero", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92003, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Bonsall", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92004, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Borrego Springs", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92007, + "latitude": 33.023042, + "longitude": -117.274469, + "city": "Cardiff By The Sea", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92008, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Carlsbad", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92009, + "latitude": 33.082192, + "longitude": -117.267169, + "city": "Carlsbad", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92013, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Carlsbad", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92014, + "latitude": 32.974074, + "longitude": -117.224167, + "city": "Del Mar", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92018, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Carlsbad", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92019, + "latitude": 32.865113, + "longitude": -117.041287, + "city": "El Cajon", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92020, + "latitude": 32.787514, + "longitude": -116.960836, + "city": "El Cajon", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92021, + "latitude": 32.822138, + "longitude": -116.885508, + "city": "El Cajon", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92022, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "El Cajon", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92023, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Encinitas", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92024, + "latitude": 33.054154, + "longitude": -117.250253, + "city": "Encinitas", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92025, + "latitude": 33.057128, + "longitude": -117.083403, + "city": "Escondido", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92026, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Escondido", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92027, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Escondido", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92028, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Fallbrook", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92029, + "latitude": 33.071941, + "longitude": -117.158497, + "city": "Escondido", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92030, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Escondido", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92033, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Escondido", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92036, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Julian", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92037, + "latitude": 32.898511, + "longitude": -117.225744, + "city": "La Jolla", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92038, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "La Jolla", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92039, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "La Jolla", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92040, + "latitude": 32.893498, + "longitude": -116.898945, + "city": "Lakeside", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92046, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Escondido", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92049, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Oceanside", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92051, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Oceanside", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92052, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Oceanside", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92054, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Oceanside", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92055, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Camp Pendleton", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92056, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Oceanside", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92057, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Oceanside", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92058, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Oceanside", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92059, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Pala", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92060, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Palomar Mountain", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92061, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Pauma Valley", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92064, + "latitude": 32.994097, + "longitude": -117.030299, + "city": "Poway", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92065, + "latitude": 33.031572, + "longitude": -116.976549, + "city": "Ramona", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92066, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Ranchita", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92067, + "latitude": 33.005026, + "longitude": -117.21569, + "city": "Rancho Santa Fe", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92068, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Luis Rey", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92069, + "latitude": 33.099573, + "longitude": -117.215112, + "city": "San Marcos", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92070, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Santa Ysabel", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92071, + "latitude": 32.843956, + "longitude": -116.994511, + "city": "Santee", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92072, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Santee", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92074, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Poway", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92075, + "latitude": 33.007075, + "longitude": -117.256769, + "city": "Solana Beach", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92078, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Marcos", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92079, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Marcos", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92082, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Valley Center", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92083, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Vista", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92084, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Vista", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92085, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Vista", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92086, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Warner Springs", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92088, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Fallbrook", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92090, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "El Cajon", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92091, + "latitude": 32.962307, + "longitude": -117.046183, + "city": "Rancho Santa Fe", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92092, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "La Jolla", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92093, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "La Jolla", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92096, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Marcos", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92101, + "latitude": 32.7211, + "longitude": -117.174366, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92102, + "latitude": 32.71712, + "longitude": -117.118604, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92103, + "latitude": 32.746085, + "longitude": -117.170517, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92104, + "latitude": 32.73875, + "longitude": -117.128908, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92105, + "latitude": 32.7374, + "longitude": -117.087313, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92106, + "latitude": 32.709355, + "longitude": -117.232764, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92107, + "latitude": 32.735, + "longitude": -117.202669, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92108, + "latitude": 32.774699, + "longitude": -117.148616, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92109, + "latitude": 32.794748, + "longitude": -117.239392, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92110, + "latitude": 32.775849, + "longitude": -117.207965, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92111, + "latitude": 32.803717, + "longitude": -117.16643, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92112, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92113, + "latitude": 32.694601, + "longitude": -117.121678, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92114, + "latitude": 32.70614, + "longitude": -117.051651, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92115, + "latitude": 32.7576, + "longitude": -117.070688, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92116, + "latitude": 32.7654, + "longitude": -117.127894, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92117, + "latitude": 32.818398, + "longitude": -117.197168, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92118, + "latitude": 32.656176, + "longitude": -117.160815, + "city": "Coronado", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92119, + "latitude": 32.815849, + "longitude": -117.033162, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92120, + "latitude": 32.794947, + "longitude": -117.079863, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92121, + "latitude": 32.90391, + "longitude": -117.207828, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92122, + "latitude": 32.856847, + "longitude": -117.208027, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92123, + "latitude": 32.810983, + "longitude": -117.136812, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92124, + "latitude": 32.818733, + "longitude": -117.082387, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92126, + "latitude": 32.899613, + "longitude": -117.144916, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92127, + "latitude": 33.021243, + "longitude": -117.120915, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92128, + "latitude": 32.995484, + "longitude": -117.07483, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92129, + "latitude": 32.965012, + "longitude": -117.126619, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92130, + "latitude": 32.952467, + "longitude": -117.161871, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92131, + "latitude": 32.874916, + "longitude": -117.088322, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92132, + "latitude": 32.643703, + "longitude": -117.138414, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92133, + "latitude": 32.733507, + "longitude": -117.216451, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92134, + "latitude": 32.562106, + "longitude": -117.07166, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92135, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92136, + "latitude": 32.68342, + "longitude": -117.121913, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92137, + "latitude": 32.85377, + "longitude": -117.119744, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92138, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92139, + "latitude": 32.68018, + "longitude": -117.047627, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92140, + "latitude": 32.74344, + "longitude": -117.200412, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92142, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92143, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Ysidro", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92145, + "latitude": 32.889139, + "longitude": -117.100486, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92147, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92149, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92150, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92152, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92153, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92154, + "latitude": 32.628038, + "longitude": -117.035225, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92155, + "latitude": 32.671602, + "longitude": -117.165665, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92158, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92159, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92160, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92161, + "latitude": 32.871846, + "longitude": -117.229119, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92162, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92163, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92164, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92165, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92166, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92167, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92168, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92169, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92170, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92171, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92172, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92173, + "latitude": 32.566356, + "longitude": -116.997475, + "city": "San Ysidro", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92174, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92175, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92176, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92177, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92178, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "Coronado", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92179, + "latitude": 32.572602, + "longitude": -116.918724, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92182, + "latitude": 32.775088, + "longitude": -117.076176, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92184, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92186, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92187, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92190, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92191, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92192, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92193, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92194, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92195, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92196, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92197, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92198, + "latitude": 33.016928, + "longitude": -116.846046, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92199, + "latitude": 32.751575, + "longitude": -117.191848, + "city": "San Diego", + "state": "CA", + "county": "San Diego" + }, + { + "zip_code": 92201, + "latitude": 33.728721, + "longitude": -116.035705, + "city": "Indio", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92202, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Indio", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92203, + "latitude": 33.75317, + "longitude": -116.26764, + "city": "Indio", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92210, + "latitude": 33.70271, + "longitude": -116.303759, + "city": "Indian Wells", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92211, + "latitude": 33.76437, + "longitude": -116.339766, + "city": "Palm Desert", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92220, + "latitude": 33.919215, + "longitude": -116.864197, + "city": "Banning", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92222, + "latitude": 32.782242, + "longitude": -114.561905, + "city": "Bard", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92223, + "latitude": 33.92703, + "longitude": -116.954753, + "city": "Beaumont", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92225, + "latitude": 33.756749, + "longitude": -115.723001, + "city": "Blythe", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92226, + "latitude": 33.59869, + "longitude": -114.652517, + "city": "Blythe", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92227, + "latitude": 33.096382, + "longitude": -115.280168, + "city": "Brawley", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92230, + "latitude": 33.842969, + "longitude": -116.607126, + "city": "Cabazon", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92231, + "latitude": 32.946832, + "longitude": -115.518355, + "city": "Calexico", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92232, + "latitude": 33.026203, + "longitude": -115.284581, + "city": "Calexico", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92233, + "latitude": 33.157664, + "longitude": -115.510284, + "city": "Calipatria", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92234, + "latitude": 33.647301, + "longitude": -116.277152, + "city": "Cathedral City", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92235, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Cathedral City", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92236, + "latitude": 33.646405, + "longitude": -116.143588, + "city": "Coachella", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92239, + "latitude": 33.809041, + "longitude": -115.366577, + "city": "Desert Center", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92240, + "latitude": 33.900103, + "longitude": -116.400701, + "city": "Desert Hot Springs", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92241, + "latitude": 33.876265, + "longitude": -116.354024, + "city": "Desert Hot Springs", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92242, + "latitude": 34.201506, + "longitude": -115.647775, + "city": "Earp", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92243, + "latitude": 32.900509, + "longitude": -115.503842, + "city": "El Centro", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92244, + "latitude": 32.79475, + "longitude": -115.692714, + "city": "El Centro", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92249, + "latitude": 32.72181, + "longitude": -115.438271, + "city": "Heber", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92250, + "latitude": 32.867317, + "longitude": -115.374769, + "city": "Holtville", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92251, + "latitude": 33.008903, + "longitude": -115.640538, + "city": "Imperial", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92252, + "latitude": 34.175713, + "longitude": -116.268415, + "city": "Joshua Tree", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92253, + "latitude": 33.670978, + "longitude": -116.259176, + "city": "La Quinta", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92254, + "latitude": 33.545034, + "longitude": -116.018731, + "city": "Mecca", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92255, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Palm Desert", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92256, + "latitude": 34.146607, + "longitude": -116.371498, + "city": "Morongo Valley", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92257, + "latitude": 33.124361, + "longitude": -115.641926, + "city": "Niland", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92258, + "latitude": 33.924967, + "longitude": -116.549645, + "city": "North Palm Springs", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92259, + "latitude": 32.98097, + "longitude": -115.823448, + "city": "Ocotillo", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92260, + "latitude": 33.680623, + "longitude": -116.402695, + "city": "Palm Desert", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92261, + "latitude": 33.660374, + "longitude": -116.408249, + "city": "Palm Desert", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92262, + "latitude": 33.842567, + "longitude": -116.527996, + "city": "Palm Springs", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92263, + "latitude": 33.761076, + "longitude": -116.535887, + "city": "Palm Springs", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92264, + "latitude": 33.797145, + "longitude": -116.511883, + "city": "Palm Springs", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92266, + "latitude": 33.369594, + "longitude": -114.735544, + "city": "Palo Verde", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92267, + "latitude": 34.249419, + "longitude": -114.210609, + "city": "Parker Dam", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92268, + "latitude": 34.188703, + "longitude": -116.504806, + "city": "Pioneertown", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92270, + "latitude": 33.703598, + "longitude": -116.431961, + "city": "Rancho Mirage", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92273, + "latitude": 32.79413, + "longitude": -115.694768, + "city": "Seeley", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92274, + "latitude": 33.5578, + "longitude": -116.157152, + "city": "Thermal", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92275, + "latitude": 33.309217, + "longitude": -115.957782, + "city": "Salton City", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92276, + "latitude": 33.843837, + "longitude": -116.393413, + "city": "Thousand Palms", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92277, + "latitude": 34.234411, + "longitude": -116.235073, + "city": "Twentynine Palms", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92278, + "latitude": 34.311015, + "longitude": -115.277758, + "city": "Twentynine Palms", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92280, + "latitude": 34.200026, + "longitude": -115.286691, + "city": "Vidal", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92281, + "latitude": 33.037976, + "longitude": -115.591387, + "city": "Westmorland", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92282, + "latitude": 33.945145, + "longitude": -116.649937, + "city": "White Water", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92283, + "latitude": 32.981774, + "longitude": -114.685417, + "city": "Winterhaven", + "state": "CA", + "county": "Imperial" + }, + { + "zip_code": 92284, + "latitude": 34.451263, + "longitude": -115.896753, + "city": "Yucca Valley", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92285, + "latitude": 34.310323, + "longitude": -116.524124, + "city": "Landers", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92286, + "latitude": 34.180251, + "longitude": -116.350003, + "city": "Yucca Valley", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92292, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Palm Springs", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92301, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Adelanto", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92304, + "latitude": 34.6122, + "longitude": -115.800458, + "city": "Amboy", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92305, + "latitude": 34.153818, + "longitude": -116.512262, + "city": "Angelus Oaks", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92307, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Apple Valley", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92308, + "latitude": 34.450143, + "longitude": -116.726751, + "city": "Apple Valley", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92309, + "latitude": 35.445323, + "longitude": -116.142146, + "city": "Baker", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92310, + "latitude": 35.262453, + "longitude": -116.696561, + "city": "Fort Irwin", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92311, + "latitude": 34.693608, + "longitude": -115.851819, + "city": "Barstow", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92312, + "latitude": 34.201638, + "longitude": -116.906215, + "city": "Barstow", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92313, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Grand Terrace", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92314, + "latitude": 34.50514, + "longitude": -116.110086, + "city": "Big Bear City", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92315, + "latitude": 34.223224, + "longitude": -116.847414, + "city": "Big Bear Lake", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92316, + "latitude": 34.248404, + "longitude": -116.849826, + "city": "Bloomington", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92317, + "latitude": 34.211175, + "longitude": -117.079624, + "city": "Blue Jay", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92318, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Bryn Mawr", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92320, + "latitude": 33.976814, + "longitude": -117.038262, + "city": "Calimesa", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92321, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Cedar Glen", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92322, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Cedarpines Park", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92323, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Cima", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92324, + "latitude": 34.151161, + "longitude": -116.900557, + "city": "Colton", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92325, + "latitude": 34.850671, + "longitude": -116.701168, + "city": "Crestline", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92326, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Crest Park", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92327, + "latitude": 34.899805, + "longitude": -116.77035, + "city": "Daggett", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92328, + "latitude": 36.235817, + "longitude": -117.144513, + "city": "Death Valley", + "state": "CA", + "county": "Inyo" + }, + { + "zip_code": 92329, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Phelan", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92332, + "latitude": 34.588133, + "longitude": -115.577138, + "city": "Essex", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92333, + "latitude": 34.258346, + "longitude": -116.951508, + "city": "Fawnskin", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92334, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Fontana", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92335, + "latitude": 34.159844, + "longitude": -114.301225, + "city": "Fontana", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92336, + "latitude": 34.122307, + "longitude": -116.247005, + "city": "Fontana", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92337, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Fontana", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92338, + "latitude": 34.932852, + "longitude": -115.802525, + "city": "Ludlow", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92339, + "latitude": 34.133057, + "longitude": -116.911711, + "city": "Forest Falls", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92340, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Hesperia", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92341, + "latitude": 34.241137, + "longitude": -116.938548, + "city": "Green Valley Lake", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92342, + "latitude": 34.496921, + "longitude": -116.378323, + "city": "Helendale", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92345, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Hesperia", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92346, + "latitude": 34.156543, + "longitude": -117.14027, + "city": "Highland", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92347, + "latitude": 35.012622, + "longitude": -116.191575, + "city": "Hinkley", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92350, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Loma Linda", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92352, + "latitude": 34.209221, + "longitude": -117.129213, + "city": "Lake Arrowhead", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92354, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Loma Linda", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92356, + "latitude": 34.770403, + "longitude": -116.206281, + "city": "Lucerne Valley", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92357, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Loma Linda", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92358, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Lytle Creek", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92359, + "latitude": 34.470317, + "longitude": -115.969627, + "city": "Mentone", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92363, + "latitude": 34.642102, + "longitude": -115.558733, + "city": "Needles", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92364, + "latitude": 35.337173, + "longitude": -115.628153, + "city": "Nipton", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92365, + "latitude": 34.90534, + "longitude": -115.932613, + "city": "Newberry Springs", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92366, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Mountain Pass", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92368, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Oro Grande", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92369, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Patton", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92371, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Phelan", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92372, + "latitude": 34.237294, + "longitude": -116.855056, + "city": "Pinon Hills", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92373, + "latitude": 34.2409, + "longitude": -116.889474, + "city": "Redlands", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92374, + "latitude": 34.153575, + "longitude": -116.898232, + "city": "Redlands", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92375, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Redlands", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92376, + "latitude": 34.202339, + "longitude": -115.567483, + "city": "Rialto", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92377, + "latitude": 34.141501, + "longitude": -116.982871, + "city": "Rialto", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92378, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Rimforest", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92382, + "latitude": 34.210229, + "longitude": -117.110941, + "city": "Running Springs", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92384, + "latitude": 35.977703, + "longitude": -116.270561, + "city": "Shoshone", + "state": "CA", + "county": "Inyo" + }, + { + "zip_code": 92385, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Skyforest", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92386, + "latitude": 34.247205, + "longitude": -116.818764, + "city": "Sugarloaf", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92389, + "latitude": 36.626033, + "longitude": -117.218616, + "city": "Tecopa", + "state": "CA", + "county": "Inyo" + }, + { + "zip_code": 92391, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Twin Peaks", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92392, + "latitude": 34.491985, + "longitude": -114.754916, + "city": "Victorville", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92393, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Victorville", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92394, + "latitude": 34.527103, + "longitude": -115.172471, + "city": "Victorville", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92397, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Wrightwood", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92398, + "latitude": 34.926948, + "longitude": -116.709279, + "city": "Yermo", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92399, + "latitude": 34.06226, + "longitude": -116.971138, + "city": "Yucaipa", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92401, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92402, + "latitude": 34.21392, + "longitude": -117.127166, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92403, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92404, + "latitude": 34.159076, + "longitude": -116.709044, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92405, + "latitude": 34.134794, + "longitude": -116.228393, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92406, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92407, + "latitude": 34.271173, + "longitude": -116.93655, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92408, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92410, + "latitude": 34.095956, + "longitude": -116.479963, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92411, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92412, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92413, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92414, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92415, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92418, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92420, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92423, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92424, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92427, + "latitude": 34.262243, + "longitude": -116.861506, + "city": "San Bernardino", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 92501, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92502, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92503, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92504, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92505, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92506, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92507, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92508, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92509, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92513, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92514, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92515, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92516, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92517, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92518, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "March Air Force Base", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92519, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92521, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92522, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Riverside", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92530, + "latitude": 33.658068, + "longitude": -116.649216, + "city": "Lake Elsinore", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92531, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Lake Elsinore", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92532, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Lake Elsinore", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92536, + "latitude": 33.519176, + "longitude": -116.802625, + "city": "Aguanga", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92539, + "latitude": 33.524988, + "longitude": -116.679174, + "city": "Anza", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92543, + "latitude": 33.651652, + "longitude": -116.777014, + "city": "Hemet", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92544, + "latitude": 33.617074, + "longitude": -116.786275, + "city": "Hemet", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92545, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Hemet", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92546, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Hemet", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92548, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Homeland", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92549, + "latitude": 33.741769, + "longitude": -116.721444, + "city": "Idyllwild", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92551, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Moreno Valley", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92552, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Moreno Valley", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92553, + "latitude": 33.857218, + "longitude": -116.720427, + "city": "Moreno Valley", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92554, + "latitude": 33.521993, + "longitude": -115.915905, + "city": "Moreno Valley", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92555, + "latitude": 33.855098, + "longitude": -116.920413, + "city": "Moreno Valley", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92556, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Moreno Valley", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92557, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Moreno Valley", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92561, + "latitude": 33.640142, + "longitude": -116.556695, + "city": "Mountain Center", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92562, + "latitude": 33.44204, + "longitude": -116.861027, + "city": "Murrieta", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92563, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Murrieta", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92564, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Murrieta", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92567, + "latitude": 33.628192, + "longitude": -116.406069, + "city": "Nuevo", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92570, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Perris", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92571, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Perris", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92572, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Perris", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92581, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "San Jacinto", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92582, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "San Jacinto", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92583, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "San Jacinto", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92584, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Menifee", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92585, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Sun City", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92586, + "latitude": 33.48777, + "longitude": -116.784521, + "city": "Sun City", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92587, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Sun City", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92589, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Temecula", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92590, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Temecula", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92591, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Temecula", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92592, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Temecula", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92593, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Temecula", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92595, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Wildomar", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92596, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Winchester", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92599, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Perris", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92602, + "latitude": 33.718018, + "longitude": -117.72222, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92603, + "latitude": 33.648871, + "longitude": -117.764637, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92604, + "latitude": 33.690475, + "longitude": -117.790059, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92605, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Huntington Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92606, + "latitude": 33.701121, + "longitude": -117.817338, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92607, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Laguna Niguel", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92609, + "latitude": "", + "longitude": "", + "city": "El Toro", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92610, + "latitude": 33.663011, + "longitude": -117.730745, + "city": "Foothill Ranch", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92612, + "latitude": 33.615525, + "longitude": -117.782805, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92614, + "latitude": 33.685319, + "longitude": -117.827913, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92615, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Huntington Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92616, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92618, + "latitude": 33.641579, + "longitude": -117.73269, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92619, + "latitude": 33.66985, + "longitude": -117.765939, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92620, + "latitude": 33.691619, + "longitude": -117.765186, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92623, + "latitude": 33.686519, + "longitude": -117.830788, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92624, + "latitude": 33.455277, + "longitude": -117.662824, + "city": "Capistrano Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92625, + "latitude": 33.599956, + "longitude": -117.865325, + "city": "Corona Del Mar", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92626, + "latitude": 33.6829, + "longitude": -117.778398, + "city": "Costa Mesa", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92627, + "latitude": 33.685069, + "longitude": -117.763886, + "city": "Costa Mesa", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92628, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Costa Mesa", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92629, + "latitude": 33.485903, + "longitude": -117.696366, + "city": "Dana Point", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92630, + "latitude": 33.64079, + "longitude": -117.693074, + "city": "Lake Forest", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92637, + "latitude": "", + "longitude": "", + "city": "Laguna Hills", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92646, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Huntington Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92647, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Huntington Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92648, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Huntington Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92649, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Huntington Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92650, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "East Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92651, + "latitude": 33.520941, + "longitude": -117.741315, + "city": "Laguna Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92652, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Laguna Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92653, + "latitude": 33.595714, + "longitude": -117.715535, + "city": "Laguna Hills", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92654, + "latitude": 33.601673, + "longitude": -117.716885, + "city": "Laguna Hills", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92655, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Midway City", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92656, + "latitude": 33.603459, + "longitude": -117.751341, + "city": "Aliso Viejo", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92657, + "latitude": 33.597128, + "longitude": -117.835987, + "city": "Newport Coast", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92658, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Newport Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92659, + "latitude": 33.611198, + "longitude": -117.886731, + "city": "Newport Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92660, + "latitude": 33.637771, + "longitude": -117.875189, + "city": "Newport Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92661, + "latitude": 33.555291, + "longitude": -117.833298, + "city": "Newport Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92662, + "latitude": 33.606521, + "longitude": -117.89274, + "city": "Newport Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92663, + "latitude": 33.61837, + "longitude": -117.91709, + "city": "Newport Beach", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92672, + "latitude": 33.568923, + "longitude": -117.616082, + "city": "San Clemente", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92673, + "latitude": 33.459745, + "longitude": -117.625076, + "city": "San Clemente", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92674, + "latitude": 33.438428, + "longitude": -117.623131, + "city": "San Clemente", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92675, + "latitude": 33.530631, + "longitude": -117.618932, + "city": "San Juan Capistrano", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92676, + "latitude": 33.741994, + "longitude": -117.727416, + "city": "Silverado", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92677, + "latitude": 33.532817, + "longitude": -117.710262, + "city": "Laguna Niguel", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92678, + "latitude": 33.673979, + "longitude": -117.59457, + "city": "Trabuco Canyon", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92679, + "latitude": 33.612322, + "longitude": -117.595826, + "city": "Trabuco Canyon", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92683, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Westminster", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92684, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Westminster", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92685, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Westminster", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92688, + "latitude": 33.601944, + "longitude": -117.603684, + "city": "Rancho Santa Margarita", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92690, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Mission Viejo", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92691, + "latitude": 33.605527, + "longitude": -117.667923, + "city": "Mission Viejo", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92692, + "latitude": 33.575026, + "longitude": -117.659899, + "city": "Mission Viejo", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92693, + "latitude": 33.555323, + "longitude": -117.564, + "city": "San Juan Capistrano", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92694, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Ladera Ranch", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92697, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92698, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Aliso Viejo", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92701, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Santa Ana", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92702, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Santa Ana", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92703, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Santa Ana", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92704, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Santa Ana", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92705, + "latitude": 33.707568, + "longitude": -117.845746, + "city": "Santa Ana", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92706, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Santa Ana", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92707, + "latitude": 33.679069, + "longitude": -117.876789, + "city": "Santa Ana", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92708, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Fountain Valley", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92709, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92710, + "latitude": 33.711552, + "longitude": -117.809881, + "city": "Irvine", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92711, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Santa Ana", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92712, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Santa Ana", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92728, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Fountain Valley", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92735, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Santa Ana", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92780, + "latitude": 33.579122, + "longitude": -117.731534, + "city": "Tustin", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92781, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Tustin", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92782, + "latitude": 33.705787, + "longitude": -117.816189, + "city": "Tustin", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92799, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Santa Ana", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92801, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92802, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92803, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92804, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92805, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92806, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92807, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92808, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92809, + "latitude": "", + "longitude": "", + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92811, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Atwood", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92812, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92814, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92815, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92816, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92817, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92821, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Brea", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92822, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Brea", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92823, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Brea", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92825, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92831, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Fullerton", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92832, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Fullerton", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92833, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Fullerton", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92834, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Fullerton", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92835, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Fullerton", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92836, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Fullerton", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92837, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Fullerton", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92838, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Fullerton", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92840, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Garden Grove", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92841, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Garden Grove", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92842, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Garden Grove", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92843, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Garden Grove", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92844, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Garden Grove", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92845, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Garden Grove", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92846, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Garden Grove", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92850, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92856, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Orange", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92857, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Orange", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92859, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Orange", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92860, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Norco", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92861, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Villa Park", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92862, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Orange", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92863, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Orange", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92864, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Orange", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92865, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Orange", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92866, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Orange", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92867, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Orange", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92868, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Orange", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92869, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Orange", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92870, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Placentia", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92871, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Placentia", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92877, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Corona", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92878, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Corona", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92879, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Corona", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92880, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Corona", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92881, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Corona", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92882, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Corona", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92883, + "latitude": 33.752886, + "longitude": -116.055617, + "city": "Corona", + "state": "CA", + "county": "Riverside" + }, + { + "zip_code": 92885, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Yorba Linda", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92886, + "latitude": 33.674044, + "longitude": -117.588233, + "city": "Yorba Linda", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92887, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Yorba Linda", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 92899, + "latitude": 33.640302, + "longitude": -117.769442, + "city": "Anaheim", + "state": "CA", + "county": "Orange" + }, + { + "zip_code": 93001, + "latitude": 34.330829, + "longitude": -119.358352, + "city": "Ventura", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93002, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Ventura", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93003, + "latitude": 34.230353, + "longitude": -119.221299, + "city": "Ventura", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93004, + "latitude": 34.278752, + "longitude": -119.16509, + "city": "Ventura", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93005, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Ventura", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93006, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Ventura", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93007, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Ventura", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93009, + "latitude": 34.356248, + "longitude": -119.146228, + "city": "Ventura", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93010, + "latitude": 34.307783, + "longitude": -119.084253, + "city": "Camarillo", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93011, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Camarillo", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93012, + "latitude": 34.204429, + "longitude": -118.974355, + "city": "Camarillo", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93013, + "latitude": 34.405045, + "longitude": -119.520525, + "city": "Carpinteria", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93014, + "latitude": 34.262834, + "longitude": -119.848555, + "city": "Carpinteria", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93015, + "latitude": 34.393387, + "longitude": -118.864285, + "city": "Fillmore", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93016, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Fillmore", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93020, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Moorpark", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93021, + "latitude": 34.301347, + "longitude": -118.901098, + "city": "Moorpark", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93022, + "latitude": 34.412169, + "longitude": -119.292335, + "city": "Oak View", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93023, + "latitude": 34.478806, + "longitude": -119.25876, + "city": "Ojai", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93024, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Ojai", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93030, + "latitude": 34.224892, + "longitude": -119.17749, + "city": "Oxnard", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93031, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Oxnard", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93032, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Oxnard", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93033, + "latitude": 34.154141, + "longitude": -119.131326, + "city": "Oxnard", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93034, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Oxnard", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93035, + "latitude": 34.221157, + "longitude": -119.202365, + "city": "Oxnard", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93040, + "latitude": 34.435224, + "longitude": -118.785517, + "city": "Piru", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93041, + "latitude": 34.148893, + "longitude": -119.15458, + "city": "Port Hueneme", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93042, + "latitude": 34.113389, + "longitude": -119.112432, + "city": "Point Mugu Nawc", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93043, + "latitude": 34.162124, + "longitude": -119.207364, + "city": "Port Hueneme Cbc Base", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93044, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Port Hueneme", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93060, + "latitude": 34.364943, + "longitude": -119.085704, + "city": "Santa Paula", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93061, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Santa Paula", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93062, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Simi Valley", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93063, + "latitude": 34.292301, + "longitude": -118.82033, + "city": "Simi Valley", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93064, + "latitude": 34.258203, + "longitude": -118.710724, + "city": "Brandeis", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93065, + "latitude": 34.272162, + "longitude": -118.733903, + "city": "Simi Valley", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93066, + "latitude": 34.304034, + "longitude": -119.039305, + "city": "Somis", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93067, + "latitude": 34.422045, + "longitude": -119.592561, + "city": "Summerland", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93093, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Simi Valley", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93094, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Simi Valley", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93099, + "latitude": 34.032383, + "longitude": -119.1343, + "city": "Simi Valley", + "state": "CA", + "county": "Ventura" + }, + { + "zip_code": 93101, + "latitude": 34.421897, + "longitude": -119.707135, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93102, + "latitude": 34.262834, + "longitude": -119.848555, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93103, + "latitude": 34.430908, + "longitude": -119.626863, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93105, + "latitude": 34.508099, + "longitude": -119.868622, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93106, + "latitude": 34.432896, + "longitude": -119.837072, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93107, + "latitude": 34.421795, + "longitude": -119.863722, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93108, + "latitude": 34.437795, + "longitude": -119.615862, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93109, + "latitude": 34.406997, + "longitude": -119.723668, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93110, + "latitude": 34.539027, + "longitude": -119.906198, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93111, + "latitude": 34.453046, + "longitude": -119.798472, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93116, + "latitude": 34.262834, + "longitude": -119.848555, + "city": "Goleta", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93117, + "latitude": 34.503802, + "longitude": -120.038806, + "city": "Goleta", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93118, + "latitude": 34.262834, + "longitude": -119.848555, + "city": "Goleta", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93120, + "latitude": 34.262834, + "longitude": -119.848555, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93121, + "latitude": 34.262834, + "longitude": -119.848555, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93130, + "latitude": 34.262834, + "longitude": -119.848555, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93140, + "latitude": 34.262834, + "longitude": -119.848555, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93150, + "latitude": 34.262834, + "longitude": -119.848555, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93160, + "latitude": 34.262834, + "longitude": -119.848555, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93190, + "latitude": 34.262834, + "longitude": -119.848555, + "city": "Santa Barbara", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93199, + "latitude": 34.262834, + "longitude": -119.848555, + "city": "Goleta", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93201, + "latitude": 35.85829, + "longitude": -119.303735, + "city": "Alpaugh", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93202, + "latitude": 36.316529, + "longitude": -119.704594, + "city": "Armona", + "state": "CA", + "county": "Kings" + }, + { + "zip_code": 93203, + "latitude": 35.311064, + "longitude": -118.659604, + "city": "Arvin", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93204, + "latitude": 36.003134, + "longitude": -120.128716, + "city": "Avenal", + "state": "CA", + "county": "Kings" + }, + { + "zip_code": 93205, + "latitude": 35.569608, + "longitude": -118.487681, + "city": "Bodfish", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93206, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Buttonwillow", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93207, + "latitude": 35.881776, + "longitude": -118.656086, + "city": "California Hot Springs", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93208, + "latitude": 36.139789, + "longitude": -118.694576, + "city": "Camp Nelson", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93210, + "latitude": 36.247025, + "longitude": -120.381432, + "city": "Coalinga", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93212, + "latitude": 36.067399, + "longitude": -119.622634, + "city": "Corcoran", + "state": "CA", + "county": "Kings" + }, + { + "zip_code": 93215, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Delano", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93216, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Delano", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93218, + "latitude": 36.082002, + "longitude": -119.036316, + "city": "Ducor", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93219, + "latitude": 35.875918, + "longitude": -119.262323, + "city": "Earlimart", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93220, + "latitude": 35.357018, + "longitude": -118.810069, + "city": "Edison", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93221, + "latitude": 36.344716, + "longitude": -119.088371, + "city": "Exeter", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93222, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Frazier Park", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93223, + "latitude": 36.304981, + "longitude": -119.202664, + "city": "Farmersville", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93224, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Fellows", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93225, + "latitude": 35.674205, + "longitude": -118.475381, + "city": "Frazier Park", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93226, + "latitude": 35.73296, + "longitude": -118.709978, + "city": "Glennville", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93227, + "latitude": 36.357151, + "longitude": -119.425371, + "city": "Goshen", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93230, + "latitude": 36.220468, + "longitude": -119.71776, + "city": "Hanford", + "state": "CA", + "county": "Kings" + }, + { + "zip_code": 93232, + "latitude": 36.138861, + "longitude": -119.894727, + "city": "Hanford", + "state": "CA", + "county": "Kings" + }, + { + "zip_code": 93234, + "latitude": 36.207165, + "longitude": -120.103363, + "city": "Huron", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93235, + "latitude": 36.375844, + "longitude": -119.134101, + "city": "Ivanhoe", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93237, + "latitude": 36.472713, + "longitude": -118.902899, + "city": "Kaweah", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93238, + "latitude": 35.708701, + "longitude": -118.405385, + "city": "Kernville", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93239, + "latitude": 36.005488, + "longitude": -120.027031, + "city": "Kettleman City", + "state": "CA", + "county": "Kings" + }, + { + "zip_code": 93240, + "latitude": 35.668987, + "longitude": -118.457002, + "city": "Lake Isabella", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93241, + "latitude": 35.405369, + "longitude": -118.699098, + "city": "Lamont", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93242, + "latitude": 36.445649, + "longitude": -119.696386, + "city": "Laton", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93243, + "latitude": 34.881773, + "longitude": -118.856562, + "city": "Lebec", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93244, + "latitude": 36.496901, + "longitude": -118.99412, + "city": "Lemon Cove", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93245, + "latitude": 36.268194, + "longitude": -119.817274, + "city": "Lemoore", + "state": "CA", + "county": "Kings" + }, + { + "zip_code": 93246, + "latitude": 36.138861, + "longitude": -119.894727, + "city": "Lemoore", + "state": "CA", + "county": "Kings" + }, + { + "zip_code": 93247, + "latitude": 36.073033, + "longitude": -119.129166, + "city": "Lindsay", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93249, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Lost Hills", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93250, + "latitude": 35.674813, + "longitude": -118.489938, + "city": "Mc Farland", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93251, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Mc Kittrick", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93252, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Maricopa", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93254, + "latitude": 34.922283, + "longitude": -119.590275, + "city": "New Cuyama", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93255, + "latitude": 35.63952, + "longitude": -117.988136, + "city": "Onyx", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93256, + "latitude": 35.959881, + "longitude": -119.13645, + "city": "Pixley", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93257, + "latitude": 35.973777, + "longitude": -118.703592, + "city": "Porterville", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93258, + "latitude": 36.033126, + "longitude": -119.007265, + "city": "Porterville", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93260, + "latitude": 35.819334, + "longitude": -118.730136, + "city": "Posey", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93261, + "latitude": 35.805046, + "longitude": -119.131527, + "city": "Richgrove", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93262, + "latitude": 36.36444, + "longitude": -118.722755, + "city": "Sequoia National Park", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93263, + "latitude": 35.763646, + "longitude": -118.435693, + "city": "Shafter", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93265, + "latitude": 36.126506, + "longitude": -118.928478, + "city": "Springville", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93266, + "latitude": 36.189441, + "longitude": -119.851865, + "city": "Stratford", + "state": "CA", + "county": "Kings" + }, + { + "zip_code": 93267, + "latitude": 36.137375, + "longitude": -119.039111, + "city": "Strathmore", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93268, + "latitude": 35.703306, + "longitude": -118.413077, + "city": "Taft", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93270, + "latitude": 35.904767, + "longitude": -119.044239, + "city": "Terra Bella", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93271, + "latitude": 36.435485, + "longitude": -118.82759, + "city": "Three Rivers", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93272, + "latitude": 36.005985, + "longitude": -119.333512, + "city": "Tipton", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93274, + "latitude": 36.133527, + "longitude": -119.299856, + "city": "Tulare", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93275, + "latitude": 36.26699, + "longitude": -118.776902, + "city": "Tulare", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93276, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Tupman", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93277, + "latitude": 36.13188, + "longitude": -119.355559, + "city": "Visalia", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93278, + "latitude": 36.126621, + "longitude": -118.819365, + "city": "Visalia", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93279, + "latitude": 36.393615, + "longitude": -119.118982, + "city": "Visalia", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93280, + "latitude": 35.467934, + "longitude": -118.704037, + "city": "Wasco", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93282, + "latitude": 36.129557, + "longitude": -119.516076, + "city": "Waukena", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93283, + "latitude": 35.54194, + "longitude": -118.578135, + "city": "Weldon", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93285, + "latitude": 35.472296, + "longitude": -118.552613, + "city": "Wofford Heights", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93286, + "latitude": 36.465943, + "longitude": -119.122283, + "city": "Woodlake", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93287, + "latitude": 35.608372, + "longitude": -118.79575, + "city": "Woody", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93291, + "latitude": 36.184014, + "longitude": -119.363349, + "city": "Visalia", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93292, + "latitude": 36.19457, + "longitude": -119.228324, + "city": "Visalia", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93301, + "latitude": 35.483501, + "longitude": -119.007662, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93302, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93303, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93304, + "latitude": 35.332109, + "longitude": -119.022134, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93305, + "latitude": 35.385489, + "longitude": -118.985984, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93306, + "latitude": 35.413048, + "longitude": -118.867478, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93307, + "latitude": 35.105383, + "longitude": -118.716613, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93308, + "latitude": 35.567657, + "longitude": -118.892932, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93309, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93311, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93312, + "latitude": 35.240577, + "longitude": -118.917413, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93313, + "latitude": 35.27581, + "longitude": -119.013543, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93380, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93381, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93382, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93383, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93384, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93385, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93386, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93387, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93388, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93389, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93390, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Bakersfield", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93401, + "latitude": 35.265573, + "longitude": -120.62122, + "city": "San Luis Obispo", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93402, + "latitude": 35.301041, + "longitude": -120.794897, + "city": "Los Osos", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93403, + "latitude": 35.347065, + "longitude": -120.455345, + "city": "San Luis Obispo", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93405, + "latitude": 35.363067, + "longitude": -120.703455, + "city": "San Luis Obispo", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93406, + "latitude": 35.347065, + "longitude": -120.455345, + "city": "San Luis Obispo", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93407, + "latitude": 35.347065, + "longitude": -120.455345, + "city": "San Luis Obispo", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93408, + "latitude": 35.347065, + "longitude": -120.455345, + "city": "San Luis Obispo", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93409, + "latitude": 35.221085, + "longitude": -120.636399, + "city": "San Luis Obispo", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93410, + "latitude": 35.347065, + "longitude": -120.455345, + "city": "San Luis Obispo", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93412, + "latitude": 35.347065, + "longitude": -120.455345, + "city": "Los Osos", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93420, + "latitude": 35.292432, + "longitude": -120.655743, + "city": "Arroyo Grande", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93421, + "latitude": 35.347065, + "longitude": -120.455345, + "city": "Arroyo Grande", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93422, + "latitude": 35.464793, + "longitude": -120.712459, + "city": "Atascadero", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93423, + "latitude": 35.428241, + "longitude": -120.769493, + "city": "Atascadero", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93424, + "latitude": 35.190349, + "longitude": -120.717769, + "city": "Avila Beach", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93426, + "latitude": 35.907585, + "longitude": -120.937371, + "city": "Bradley", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93427, + "latitude": 34.635927, + "longitude": -120.201469, + "city": "Buellton", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93428, + "latitude": 35.587748, + "longitude": -120.954454, + "city": "Cambria", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93429, + "latitude": 34.845765, + "longitude": -120.534979, + "city": "Casmalia", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93430, + "latitude": 35.473343, + "longitude": -120.908608, + "city": "Cayucos", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93432, + "latitude": 35.477945, + "longitude": -120.436119, + "city": "Creston", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93433, + "latitude": 35.38173, + "longitude": -120.50264, + "city": "Grover Beach", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93434, + "latitude": 34.938796, + "longitude": -120.57318, + "city": "Guadalupe", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93435, + "latitude": 35.491888, + "longitude": -120.976259, + "city": "Harmony", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93436, + "latitude": 34.629464, + "longitude": -120.336594, + "city": "Lompoc", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93437, + "latitude": 34.737289, + "longitude": -120.525706, + "city": "Lompoc", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93438, + "latitude": 34.262834, + "longitude": -119.848555, + "city": "Lompoc", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93440, + "latitude": 34.745715, + "longitude": -120.204944, + "city": "Los Alamos", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93441, + "latitude": 34.693012, + "longitude": -120.068487, + "city": "Los Olivos", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93442, + "latitude": 35.402295, + "longitude": -120.793742, + "city": "Morro Bay", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93443, + "latitude": 35.347065, + "longitude": -120.455345, + "city": "Morro Bay", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93444, + "latitude": 35.048397, + "longitude": -120.494812, + "city": "Nipomo", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93445, + "latitude": 35.106168, + "longitude": -120.611142, + "city": "Oceano", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93446, + "latitude": 35.640598, + "longitude": -120.700313, + "city": "Paso Robles", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93447, + "latitude": 35.75624, + "longitude": -120.693505, + "city": "Paso Robles", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93448, + "latitude": 35.347065, + "longitude": -120.455345, + "city": "Pismo Beach", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93449, + "latitude": 35.391719, + "longitude": -120.549178, + "city": "Pismo Beach", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93450, + "latitude": 35.982551, + "longitude": -120.828342, + "city": "San Ardo", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93451, + "latitude": 35.705546, + "longitude": -120.646803, + "city": "San Miguel", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93452, + "latitude": 35.575711, + "longitude": -120.888038, + "city": "San Simeon", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93453, + "latitude": 35.358427, + "longitude": -120.259602, + "city": "Santa Margarita", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93454, + "latitude": 34.875832, + "longitude": -120.340795, + "city": "Santa Maria", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93455, + "latitude": 34.883589, + "longitude": -120.377957, + "city": "Santa Maria", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93456, + "latitude": 35.027682, + "longitude": -120.196818, + "city": "Santa Maria", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93457, + "latitude": 34.836252, + "longitude": -120.53421, + "city": "Santa Maria", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93458, + "latitude": 34.953532, + "longitude": -120.495723, + "city": "Santa Maria", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93460, + "latitude": 34.646136, + "longitude": -120.091629, + "city": "Santa Ynez", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93461, + "latitude": 35.610073, + "longitude": -120.291994, + "city": "Shandon", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93463, + "latitude": 34.648841, + "longitude": -120.170111, + "city": "Solvang", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93464, + "latitude": 34.674436, + "longitude": -120.111465, + "city": "Solvang", + "state": "CA", + "county": "Santa Barbara" + }, + { + "zip_code": 93465, + "latitude": 35.517781, + "longitude": -120.65385, + "city": "Templeton", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93483, + "latitude": 35.347065, + "longitude": -120.455345, + "city": "Grover Beach", + "state": "CA", + "county": "San Luis Obispo" + }, + { + "zip_code": 93501, + "latitude": 35.038066, + "longitude": -118.31596, + "city": "Mojave", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93502, + "latitude": 35.068161, + "longitude": -118.224785, + "city": "Mojave", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93504, + "latitude": 35.187133, + "longitude": -117.885359, + "city": "California City", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93505, + "latitude": 35.144767, + "longitude": -117.897202, + "city": "California City", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93510, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Acton", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93512, + "latitude": 37.496842, + "longitude": -118.624903, + "city": "Benton", + "state": "CA", + "county": "Mono" + }, + { + "zip_code": 93513, + "latitude": 37.169602, + "longitude": -118.294915, + "city": "Big Pine", + "state": "CA", + "county": "Inyo" + }, + { + "zip_code": 93514, + "latitude": 37.026022, + "longitude": -118.334393, + "city": "Bishop", + "state": "CA", + "county": "Inyo" + }, + { + "zip_code": 93515, + "latitude": 36.626033, + "longitude": -117.218616, + "city": "Bishop", + "state": "CA", + "county": "Inyo" + }, + { + "zip_code": 93516, + "latitude": 35.215513, + "longitude": -118.056018, + "city": "Boron", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93517, + "latitude": 38.248505, + "longitude": -119.19876, + "city": "Bridgeport", + "state": "CA", + "county": "Mono" + }, + { + "zip_code": 93518, + "latitude": 35.488054, + "longitude": -118.609553, + "city": "Caliente", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93519, + "latitude": 35.177369, + "longitude": -118.035049, + "city": "Cantil", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93522, + "latitude": 36.626033, + "longitude": -117.218616, + "city": "Darwin", + "state": "CA", + "county": "Inyo" + }, + { + "zip_code": 93523, + "latitude": 35.258171, + "longitude": -118.130233, + "city": "Edwards", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93524, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Edwards", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93526, + "latitude": 36.831167, + "longitude": -118.235097, + "city": "Independence", + "state": "CA", + "county": "Inyo" + }, + { + "zip_code": 93527, + "latitude": 35.639715, + "longitude": -117.857026, + "city": "Inyokern", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93528, + "latitude": 35.370839, + "longitude": -117.642748, + "city": "Johannesburg", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93529, + "latitude": 37.711282, + "longitude": -119.054711, + "city": "June Lake", + "state": "CA", + "county": "Mono" + }, + { + "zip_code": 93530, + "latitude": 36.488612, + "longitude": -117.874104, + "city": "Keeler", + "state": "CA", + "county": "Inyo" + }, + { + "zip_code": 93531, + "latitude": 35.226499, + "longitude": -118.581032, + "city": "Keene", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93532, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Lake Hughes", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93534, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Lancaster", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93535, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Lancaster", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93536, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Lancaster", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93539, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Lancaster", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93541, + "latitude": 37.97823, + "longitude": -119.130361, + "city": "Lee Vining", + "state": "CA", + "county": "Mono" + }, + { + "zip_code": 93542, + "latitude": 36.626033, + "longitude": -117.218616, + "city": "Little Lake", + "state": "CA", + "county": "Inyo" + }, + { + "zip_code": 93543, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Littlerock", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93544, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Llano", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93545, + "latitude": 36.553842, + "longitude": -117.984465, + "city": "Lone Pine", + "state": "CA", + "county": "Inyo" + }, + { + "zip_code": 93546, + "latitude": 37.609434, + "longitude": -118.865636, + "city": "Mammoth Lakes", + "state": "CA", + "county": "Mono" + }, + { + "zip_code": 93549, + "latitude": 36.229962, + "longitude": -117.955189, + "city": "Olancha", + "state": "CA", + "county": "Inyo" + }, + { + "zip_code": 93550, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Palmdale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93551, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Palmdale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93552, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Palmdale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93553, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Pearblossom", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93554, + "latitude": 35.38661, + "longitude": -117.715928, + "city": "Randsburg", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93555, + "latitude": 35.540458, + "longitude": -117.794007, + "city": "Ridgecrest", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93556, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Ridgecrest", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93558, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Red Mountain", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 93560, + "latitude": 34.942862, + "longitude": -118.40041, + "city": "Rosamond", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93561, + "latitude": 35.043028, + "longitude": -118.502209, + "city": "Tehachapi", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93562, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Trona", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 93563, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Valyermo", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93581, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Tehachapi", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93584, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Lancaster", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93586, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Lancaster", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93590, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Palmdale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93591, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Palmdale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93592, + "latitude": 34.839964, + "longitude": -115.967051, + "city": "Trona", + "state": "CA", + "county": "San Bernardino" + }, + { + "zip_code": 93596, + "latitude": 35.294405, + "longitude": -118.905173, + "city": "Boron", + "state": "CA", + "county": "Kern" + }, + { + "zip_code": 93599, + "latitude": 33.786594, + "longitude": -118.298662, + "city": "Palmdale", + "state": "CA", + "county": "Los Angeles" + }, + { + "zip_code": 93601, + "latitude": 37.379045, + "longitude": -119.736326, + "city": "Ahwahnee", + "state": "CA", + "county": "Madera" + }, + { + "zip_code": 93602, + "latitude": 37.075671, + "longitude": -119.253991, + "city": "Auberry", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93603, + "latitude": 36.568312, + "longitude": -119.016197, + "city": "Badger", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93604, + "latitude": 37.299169, + "longitude": -119.547639, + "city": "Bass Lake", + "state": "CA", + "county": "Madera" + }, + { + "zip_code": 93605, + "latitude": 37.213607, + "longitude": -119.247413, + "city": "Big Creek", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93606, + "latitude": 36.799615, + "longitude": -120.018659, + "city": "Biola", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93607, + "latitude": 36.589797, + "longitude": -119.899405, + "city": "Burrel", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93608, + "latitude": 36.607941, + "longitude": -120.248963, + "city": "Cantua Creek", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93609, + "latitude": 36.528598, + "longitude": -120.049939, + "city": "Caruthers", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93610, + "latitude": 37.013396, + "longitude": -120.266097, + "city": "Chowchilla", + "state": "CA", + "county": "Madera" + }, + { + "zip_code": 93611, + "latitude": 36.832583, + "longitude": -119.592146, + "city": "Clovis", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93612, + "latitude": 36.878242, + "longitude": -119.585303, + "city": "Clovis", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93613, + "latitude": 37.036529, + "longitude": -119.511704, + "city": "Clovis", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93614, + "latitude": 37.158791, + "longitude": -119.716753, + "city": "Coarsegold", + "state": "CA", + "county": "Madera" + }, + { + "zip_code": 93615, + "latitude": 36.515805, + "longitude": -119.236871, + "city": "Cutler", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93616, + "latitude": 36.6524, + "longitude": -119.592015, + "city": "Del Rey", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93618, + "latitude": 36.509532, + "longitude": -119.395365, + "city": "Dinuba", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93620, + "latitude": 37.073301, + "longitude": -120.623363, + "city": "Dos Palos", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 93621, + "latitude": 36.723654, + "longitude": -119.051698, + "city": "Dunlap", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93622, + "latitude": 36.772741, + "longitude": -120.213442, + "city": "Firebaugh", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93623, + "latitude": 37.51165, + "longitude": -119.652872, + "city": "Fish Camp", + "state": "CA", + "county": "Mariposa" + }, + { + "zip_code": 93624, + "latitude": 36.33859, + "longitude": -120.111796, + "city": "Five Points", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93625, + "latitude": 36.623402, + "longitude": -119.691869, + "city": "Fowler", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93626, + "latitude": 36.839928, + "longitude": -119.668152, + "city": "Friant", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93627, + "latitude": 36.574499, + "longitude": -120.066008, + "city": "Helm", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93628, + "latitude": 36.751546, + "longitude": -118.957494, + "city": "Hume", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93630, + "latitude": 36.676147, + "longitude": -120.219522, + "city": "Kerman", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93631, + "latitude": 36.5249, + "longitude": -119.602863, + "city": "Kingsburg", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93633, + "latitude": 36.734051, + "longitude": -118.958777, + "city": "Kings Canyon National Pk", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93634, + "latitude": 37.167262, + "longitude": -119.243637, + "city": "Lakeshore", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93635, + "latitude": 37.103768, + "longitude": -120.847479, + "city": "Los Banos", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 93637, + "latitude": 36.928286, + "longitude": -120.182423, + "city": "Madera", + "state": "CA", + "county": "Madera" + }, + { + "zip_code": 93638, + "latitude": 37.023383, + "longitude": -119.977376, + "city": "Madera", + "state": "CA", + "county": "Madera" + }, + { + "zip_code": 93639, + "latitude": 37.160622, + "longitude": -119.945035, + "city": "Madera", + "state": "CA", + "county": "Madera" + }, + { + "zip_code": 93640, + "latitude": 36.676898, + "longitude": -120.393602, + "city": "Mendota", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93641, + "latitude": 36.698964, + "longitude": -119.049219, + "city": "Miramonte", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93642, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Mono Hot Springs", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93643, + "latitude": 37.2141, + "longitude": -119.496955, + "city": "North Fork", + "state": "CA", + "county": "Madera" + }, + { + "zip_code": 93644, + "latitude": 37.37586, + "longitude": -119.65238, + "city": "Oakhurst", + "state": "CA", + "county": "Madera" + }, + { + "zip_code": 93645, + "latitude": 37.163948, + "longitude": -119.665194, + "city": "O Neals", + "state": "CA", + "county": "Madera" + }, + { + "zip_code": 93646, + "latitude": 36.677384, + "longitude": -119.783475, + "city": "Orange Cove", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93647, + "latitude": 36.555602, + "longitude": -119.166499, + "city": "Orosi", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93648, + "latitude": 36.661358, + "longitude": -119.81608, + "city": "Parlier", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93649, + "latitude": 36.841665, + "longitude": -119.349639, + "city": "Piedra", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93650, + "latitude": 36.8411, + "longitude": -119.801015, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93651, + "latitude": 37.008796, + "longitude": -119.512686, + "city": "Prather", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93652, + "latitude": 36.591897, + "longitude": -119.902728, + "city": "Raisin", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93653, + "latitude": 37.242121, + "longitude": -119.859865, + "city": "Raymond", + "state": "CA", + "county": "Madera" + }, + { + "zip_code": 93654, + "latitude": 36.669807, + "longitude": -119.398857, + "city": "Reedley", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93656, + "latitude": 36.466514, + "longitude": -119.97768, + "city": "Riverdale", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93657, + "latitude": 36.897408, + "longitude": -119.829053, + "city": "Sanger", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93660, + "latitude": 36.458421, + "longitude": -120.202084, + "city": "San Joaquin", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93661, + "latitude": 37.186872, + "longitude": -120.650351, + "city": "Santa Rita Park", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 93662, + "latitude": 36.637507, + "longitude": -119.992005, + "city": "Selma", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93664, + "latitude": 37.098774, + "longitude": -119.166093, + "city": "Shaver Lake", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93665, + "latitude": 37.01349, + "longitude": -120.744668, + "city": "South Dos Palos", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 93666, + "latitude": 36.520998, + "longitude": -119.352004, + "city": "Sultana", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93667, + "latitude": 36.964156, + "longitude": -119.370436, + "city": "Tollhouse", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93668, + "latitude": 36.632595, + "longitude": -120.282776, + "city": "Tranquillity", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93669, + "latitude": 37.274585, + "longitude": -119.540624, + "city": "Wishon", + "state": "CA", + "county": "Madera" + }, + { + "zip_code": 93670, + "latitude": 36.471833, + "longitude": -119.259352, + "city": "Yettem", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93673, + "latitude": 36.444195, + "longitude": -119.471745, + "city": "Traver", + "state": "CA", + "county": "Tulare" + }, + { + "zip_code": 93675, + "latitude": 36.750265, + "longitude": -119.353631, + "city": "Squaw Valley", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93701, + "latitude": 36.782012, + "longitude": -119.822019, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93702, + "latitude": 36.770134, + "longitude": -119.808651, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93703, + "latitude": 36.768449, + "longitude": -119.761076, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93704, + "latitude": 36.92709, + "longitude": -119.670552, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93705, + "latitude": 36.795503, + "longitude": -119.847234, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93706, + "latitude": 36.648635, + "longitude": -119.998749, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93707, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93708, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93709, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93710, + "latitude": 36.896749, + "longitude": -119.750294, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93711, + "latitude": 36.830336, + "longitude": -119.82824, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93712, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93714, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93715, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93716, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93717, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93718, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93720, + "latitude": 36.850729, + "longitude": -119.802227, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93721, + "latitude": 36.729049, + "longitude": -119.771526, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93722, + "latitude": 36.793291, + "longitude": -119.931132, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93724, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93725, + "latitude": 36.620698, + "longitude": -119.730824, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93726, + "latitude": 36.726349, + "longitude": -119.759875, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93727, + "latitude": 36.763149, + "longitude": -119.673272, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93728, + "latitude": 36.756348, + "longitude": -119.817429, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93729, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93740, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93741, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93744, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93745, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93747, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93750, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93755, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93760, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93761, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93762, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93764, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93765, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93771, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93772, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93773, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93774, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93775, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93776, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93777, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93778, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93779, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93780, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93784, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93786, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93790, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93791, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93792, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93793, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93794, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93844, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93888, + "latitude": 36.746375, + "longitude": -119.639658, + "city": "Fresno", + "state": "CA", + "county": "Fresno" + }, + { + "zip_code": 93901, + "latitude": 36.441768, + "longitude": -121.416603, + "city": "Salinas", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93902, + "latitude": 36.35433, + "longitude": -121.132928, + "city": "Salinas", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93905, + "latitude": 36.682888, + "longitude": -121.612105, + "city": "Salinas", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93906, + "latitude": 36.620989, + "longitude": -121.487916, + "city": "Salinas", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93907, + "latitude": 36.756306, + "longitude": -121.67031, + "city": "Salinas", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93908, + "latitude": 36.641676, + "longitude": -121.63741, + "city": "Salinas", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93912, + "latitude": 36.35433, + "longitude": -121.132928, + "city": "Salinas", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93915, + "latitude": 36.35433, + "longitude": -121.132928, + "city": "Salinas", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93920, + "latitude": 36.054105, + "longitude": -121.607774, + "city": "Big Sur", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93921, + "latitude": 36.549729, + "longitude": -121.922515, + "city": "Carmel", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93922, + "latitude": 36.543261, + "longitude": -121.926315, + "city": "Carmel", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93923, + "latitude": 36.615248, + "longitude": -121.79501, + "city": "Carmel", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93924, + "latitude": 36.446043, + "longitude": -121.666999, + "city": "Carmel Valley", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93925, + "latitude": 36.583988, + "longitude": -121.4516, + "city": "Chualar", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93926, + "latitude": 36.502102, + "longitude": -121.408607, + "city": "Gonzales", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93927, + "latitude": 36.323971, + "longitude": -121.324308, + "city": "Greenfield", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93928, + "latitude": 36.023549, + "longitude": -121.21385, + "city": "Jolon", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93930, + "latitude": 36.201898, + "longitude": -121.05232, + "city": "King City", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93932, + "latitude": 35.949963, + "longitude": -121.062554, + "city": "Lockwood", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93933, + "latitude": 36.643259, + "longitude": -121.812711, + "city": "Marina", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93940, + "latitude": 36.521811, + "longitude": -121.688623, + "city": "Monterey", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93942, + "latitude": 36.35433, + "longitude": -121.132928, + "city": "Monterey", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93943, + "latitude": 36.35433, + "longitude": -121.132928, + "city": "Monterey", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93944, + "latitude": 36.606225, + "longitude": -121.908915, + "city": "Monterey", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93950, + "latitude": 36.408303, + "longitude": -121.544387, + "city": "Pacific Grove", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93953, + "latitude": 36.5831, + "longitude": -121.936365, + "city": "Pebble Beach", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93954, + "latitude": 36.457423, + "longitude": -121.290346, + "city": "San Lucas", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93955, + "latitude": 36.429013, + "longitude": -121.497712, + "city": "Seaside", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93960, + "latitude": 36.449485, + "longitude": -121.368127, + "city": "Soledad", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 93962, + "latitude": 36.626059, + "longitude": -121.655474, + "city": "Spreckels", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 94002, + "latitude": 37.516644, + "longitude": -122.29339, + "city": "Belmont", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94003, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "Belmont", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94005, + "latitude": 37.689182, + "longitude": -122.404332, + "city": "Brisbane", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94010, + "latitude": 37.567086, + "longitude": -122.367573, + "city": "Burlingame", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94011, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "Burlingame", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94012, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "Burlingame", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94013, + "latitude": "", + "longitude": "", + "city": "Daly City", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94014, + "latitude": 37.687509, + "longitude": -122.438783, + "city": "Daly City", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94015, + "latitude": 37.676864, + "longitude": -122.475234, + "city": "Daly City", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94016, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "Daly City", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94017, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "Daly City", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94018, + "latitude": 37.510085, + "longitude": -122.473404, + "city": "El Granada", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94019, + "latitude": 37.389057, + "longitude": -122.415566, + "city": "Half Moon Bay", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94020, + "latitude": 37.272556, + "longitude": -122.249528, + "city": "La Honda", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94021, + "latitude": 37.279692, + "longitude": -122.314831, + "city": "Loma Mar", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94022, + "latitude": 37.238842, + "longitude": -121.885066, + "city": "Los Altos", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94023, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Los Altos", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94024, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Los Altos", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94025, + "latitude": 37.439616, + "longitude": -122.186373, + "city": "Menlo Park", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94026, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "Menlo Park", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94027, + "latitude": 37.450627, + "longitude": -122.199439, + "city": "Atherton", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94028, + "latitude": 37.370194, + "longitude": -122.218176, + "city": "Portola Valley", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94029, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "Menlo Park", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94030, + "latitude": 37.598385, + "longitude": -122.400083, + "city": "Millbrae", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94031, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "Millbrae", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94035, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Mountain View", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94037, + "latitude": 37.542789, + "longitude": -122.505152, + "city": "Montara", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94038, + "latitude": 37.52019, + "longitude": -122.499618, + "city": "Moss Beach", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94039, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Mountain View", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94040, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Mountain View", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94041, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Mountain View", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94042, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Mountain View", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94043, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Mountain View", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94044, + "latitude": 37.616774, + "longitude": -122.480015, + "city": "Pacifica", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94045, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "Pacifica", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94059, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "Redwood City", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94060, + "latitude": 37.211194, + "longitude": -122.343782, + "city": "Pescadero", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94061, + "latitude": 37.462158, + "longitude": -122.235639, + "city": "Redwood City", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94062, + "latitude": 37.424539, + "longitude": -122.295997, + "city": "Redwood City", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94063, + "latitude": 37.490387, + "longitude": -122.212846, + "city": "Redwood City", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94064, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "Redwood City", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94065, + "latitude": 37.53256, + "longitude": -122.247806, + "city": "Redwood City", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94066, + "latitude": 37.623159, + "longitude": -122.436034, + "city": "San Bruno", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94067, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "San Bruno", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94070, + "latitude": 37.498586, + "longitude": -122.29815, + "city": "San Carlos", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94071, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "San Carlos", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94074, + "latitude": 37.328292, + "longitude": -122.360233, + "city": "San Gregorio", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94080, + "latitude": 37.657443, + "longitude": -122.423483, + "city": "South San Francisco", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94083, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "South San Francisco", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94085, + "latitude": "", + "longitude": "", + "city": "Sunnyvale", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94086, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Sunnyvale", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94087, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Sunnyvale", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94088, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Sunnyvale", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94089, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Sunnyvale", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94090, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Sunnyvale", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94096, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "San Bruno", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94098, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "San Bruno", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94099, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "South San Francisco", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94101, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94102, + "latitude": 37.779278, + "longitude": -122.416582, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94103, + "latitude": 37.775678, + "longitude": -122.412131, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94104, + "latitude": 37.790728, + "longitude": -122.401732, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94105, + "latitude": 37.789595, + "longitude": -122.395631, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94106, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94107, + "latitude": 37.769029, + "longitude": -122.393681, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94108, + "latitude": 37.791028, + "longitude": -122.408782, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94109, + "latitude": 37.795219, + "longitude": -122.420782, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94110, + "latitude": 37.748932, + "longitude": -122.416281, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94111, + "latitude": 37.773579, + "longitude": -122.405331, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94112, + "latitude": 37.721981, + "longitude": -122.439382, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94114, + "latitude": 37.758279, + "longitude": -122.439332, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94115, + "latitude": 37.786028, + "longitude": -122.437032, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94116, + "latitude": 37.743857, + "longitude": -122.483232, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94117, + "latitude": 37.769079, + "longitude": -122.443882, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94118, + "latitude": 37.778779, + "longitude": -122.459982, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94119, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94120, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94121, + "latitude": 37.777129, + "longitude": -122.491682, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94122, + "latitude": 37.761179, + "longitude": -122.475732, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94123, + "latitude": 37.79967, + "longitude": -122.435732, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94124, + "latitude": 37.73123, + "longitude": -122.382857, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94125, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94126, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94127, + "latitude": 37.73403, + "longitude": -122.458632, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94128, + "latitude": 37.621582, + "longitude": -122.392882, + "city": "San Francisco", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94129, + "latitude": 37.798878, + "longitude": -122.465682, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94130, + "latitude": 37.819763, + "longitude": -122.368433, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94131, + "latitude": 37.74363, + "longitude": -122.443182, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94132, + "latitude": 37.722631, + "longitude": -122.482483, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94133, + "latitude": 37.801928, + "longitude": -122.410182, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94134, + "latitude": 37.72168, + "longitude": -122.410832, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94135, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94136, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94137, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94138, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94139, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94140, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94141, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94142, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94143, + "latitude": 37.76313, + "longitude": -122.458582, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94144, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94145, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94146, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94147, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94150, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94151, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94152, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94153, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94154, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94155, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94156, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94157, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94159, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94160, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94161, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94162, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94163, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94164, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94165, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94166, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94167, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94168, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94169, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94170, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94171, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94172, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94175, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94177, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94188, + "latitude": 37.784827, + "longitude": -122.727802, + "city": "San Francisco", + "state": "CA", + "county": "San Francisco" + }, + { + "zip_code": 94203, + "latitude": 38.380456, + "longitude": -121.555406, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94204, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94205, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94206, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94207, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94208, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94209, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94211, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94229, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94230, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94232, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94234, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94235, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94236, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94237, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94239, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94240, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94243, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94244, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94245, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94246, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94247, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94248, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94249, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94250, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94252, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94253, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94254, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94256, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94257, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94258, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94259, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94261, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94262, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94263, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94267, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94268, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94269, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94271, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94273, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94274, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94277, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94278, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94279, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94280, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94282, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94283, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94284, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94285, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94286, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94287, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94288, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94289, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94290, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94291, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94293, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94294, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94295, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94296, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94297, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94298, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94299, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 94301, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Palo Alto", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94302, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Palo Alto", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94303, + "latitude": 37.467338, + "longitude": -122.138765, + "city": "Palo Alto", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94304, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Palo Alto", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94305, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Stanford", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94306, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Palo Alto", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94307, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "Palo Alto", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94308, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "Palo Alto", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94309, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Palo Alto", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94310, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Palo Alto", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 94401, + "latitude": 37.573485, + "longitude": -122.32253, + "city": "San Mateo", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94402, + "latitude": 37.541886, + "longitude": -122.33063, + "city": "San Mateo", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94403, + "latitude": 37.541486, + "longitude": -122.304079, + "city": "San Mateo", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94404, + "latitude": 37.553774, + "longitude": -122.269978, + "city": "San Mateo", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94405, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "San Mateo", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94406, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "San Mateo", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94407, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "San Mateo", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94408, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "San Mateo", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94409, + "latitude": 37.381144, + "longitude": -122.334825, + "city": "San Mateo", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94497, + "latitude": 37.534736, + "longitude": -122.32588, + "city": "San Mateo", + "state": "CA", + "county": "San Mateo" + }, + { + "zip_code": 94501, + "latitude": 37.770563, + "longitude": -122.264779, + "city": "Alameda", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94502, + "latitude": 37.735088, + "longitude": -122.243067, + "city": "Alameda", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94503, + "latitude": "", + "longitude": "", + "city": "American Canyon", + "state": "CA", + "county": "Napa" + }, + { + "zip_code": 94506, + "latitude": 37.832075, + "longitude": -121.916718, + "city": "Danville", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94507, + "latitude": 37.936723, + "longitude": -122.067431, + "city": "Alamo", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94508, + "latitude": 38.57145, + "longitude": -122.450215, + "city": "Angwin", + "state": "CA", + "county": "Napa" + }, + { + "zip_code": 94509, + "latitude": 37.931997, + "longitude": -121.906748, + "city": "Antioch", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94510, + "latitude": 38.1012, + "longitude": -122.032061, + "city": "Benicia", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 94511, + "latitude": 38.02662, + "longitude": -121.642463, + "city": "Bethel Island", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94512, + "latitude": 38.13293, + "longitude": -121.827733, + "city": "Birds Landing", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 94513, + "latitude": 37.912274, + "longitude": -121.843071, + "city": "Brentwood", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94514, + "latitude": 37.858925, + "longitude": -121.617002, + "city": "Byron", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94515, + "latitude": 38.615055, + "longitude": -122.507742, + "city": "Calistoga", + "state": "CA", + "county": "Napa" + }, + { + "zip_code": 94516, + "latitude": 37.777208, + "longitude": -121.955399, + "city": "Canyon", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94517, + "latitude": 37.897832, + "longitude": -121.784818, + "city": "Clayton", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94518, + "latitude": 37.953672, + "longitude": -122.022872, + "city": "Concord", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94519, + "latitude": 37.984821, + "longitude": -122.011272, + "city": "Concord", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94520, + "latitude": 37.988871, + "longitude": -122.013355, + "city": "Concord", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94521, + "latitude": 37.951661, + "longitude": -121.960045, + "city": "Concord", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94522, + "latitude": 37.777208, + "longitude": -121.955399, + "city": "Concord", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94523, + "latitude": 37.957572, + "longitude": -122.077774, + "city": "Pleasant Hill", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94524, + "latitude": 37.777208, + "longitude": -121.955399, + "city": "Concord", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94525, + "latitude": 37.958011, + "longitude": -122.152602, + "city": "Crockett", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94526, + "latitude": 37.914851, + "longitude": -122.053573, + "city": "Danville", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94527, + "latitude": 37.953542, + "longitude": -121.957778, + "city": "Concord", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94528, + "latitude": 37.838744, + "longitude": -121.96672, + "city": "Diablo", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94529, + "latitude": 37.777208, + "longitude": -121.955399, + "city": "Concord", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94530, + "latitude": 37.918024, + "longitude": -122.30248, + "city": "El Cerrito", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94531, + "latitude": 37.920852, + "longitude": -121.723919, + "city": "Antioch", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94533, + "latitude": 38.278428, + "longitude": -122.020276, + "city": "Fairfield", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 94535, + "latitude": 38.271218, + "longitude": -121.94123, + "city": "Travis Afb", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 94536, + "latitude": 37.565285, + "longitude": -121.982721, + "city": "Fremont", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94537, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Fremont", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94538, + "latitude": 37.509453, + "longitude": -121.95832, + "city": "Fremont", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94539, + "latitude": 37.520339, + "longitude": -121.912568, + "city": "Fremont", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94540, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Hayward", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94541, + "latitude": 37.67513, + "longitude": -121.97412, + "city": "Hayward", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94542, + "latitude": 37.662552, + "longitude": -122.051179, + "city": "Hayward", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94543, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Hayward", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94544, + "latitude": 37.613883, + "longitude": -122.061673, + "city": "Hayward", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94545, + "latitude": 37.635482, + "longitude": -122.092324, + "city": "Hayward", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94546, + "latitude": 37.731229, + "longitude": -122.066373, + "city": "Castro Valley", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94547, + "latitude": 38.008343, + "longitude": -122.262101, + "city": "Hercules", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94548, + "latitude": 37.972622, + "longitude": -121.665205, + "city": "Knightsen", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94549, + "latitude": 37.901223, + "longitude": -122.120089, + "city": "Lafayette", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94550, + "latitude": 37.676781, + "longitude": -121.91605, + "city": "Livermore", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94551, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Livermore", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94552, + "latitude": 37.68943, + "longitude": -121.9251, + "city": "Castro Valley", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94553, + "latitude": 37.986421, + "longitude": -122.134976, + "city": "Martinez", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94555, + "latitude": 37.570681, + "longitude": -122.063323, + "city": "Fremont", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94556, + "latitude": 37.838926, + "longitude": -122.099224, + "city": "Moraga", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94557, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Hayward", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94558, + "latitude": 38.516158, + "longitude": -122.311921, + "city": "Napa", + "state": "CA", + "county": "Napa" + }, + { + "zip_code": 94559, + "latitude": 38.256973, + "longitude": -122.311685, + "city": "Napa", + "state": "CA", + "county": "Napa" + }, + { + "zip_code": 94560, + "latitude": 37.534102, + "longitude": -122.025352, + "city": "Newark", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94561, + "latitude": 37.996516, + "longitude": -121.68972, + "city": "Oakley", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94562, + "latitude": 38.437887, + "longitude": -122.399101, + "city": "Oakville", + "state": "CA", + "county": "Napa" + }, + { + "zip_code": 94563, + "latitude": 37.893124, + "longitude": -122.144826, + "city": "Orinda", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94564, + "latitude": 37.990772, + "longitude": -122.243294, + "city": "Pinole", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94565, + "latitude": 38.00307, + "longitude": -121.917219, + "city": "Pittsburg", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94566, + "latitude": 37.646081, + "longitude": -121.862128, + "city": "Pleasanton", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94567, + "latitude": 38.649304, + "longitude": -122.44529, + "city": "Pope Valley", + "state": "CA", + "county": "Napa" + }, + { + "zip_code": 94568, + "latitude": 37.714402, + "longitude": -121.906329, + "city": "Dublin", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94569, + "latitude": 38.04697, + "longitude": -122.193028, + "city": "Port Costa", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94570, + "latitude": 37.777208, + "longitude": -121.955399, + "city": "Moraga", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94571, + "latitude": 38.209069, + "longitude": -121.777874, + "city": "Rio Vista", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 94572, + "latitude": 38.030821, + "longitude": -122.245129, + "city": "Rodeo", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94573, + "latitude": 38.466508, + "longitude": -122.414189, + "city": "Rutherford", + "state": "CA", + "county": "Napa" + }, + { + "zip_code": 94574, + "latitude": 38.537757, + "longitude": -122.401289, + "city": "Saint Helena", + "state": "CA", + "county": "Napa" + }, + { + "zip_code": 94575, + "latitude": 37.777208, + "longitude": -121.955399, + "city": "Moraga", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94576, + "latitude": 38.450909, + "longitude": -122.444889, + "city": "Deer Park", + "state": "CA", + "county": "Napa" + }, + { + "zip_code": 94577, + "latitude": 37.715629, + "longitude": -122.158621, + "city": "San Leandro", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94578, + "latitude": 37.704429, + "longitude": -122.124225, + "city": "San Leandro", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94579, + "latitude": 37.688518, + "longitude": -122.147425, + "city": "San Leandro", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94580, + "latitude": 37.68123, + "longitude": -122.133825, + "city": "San Lorenzo", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94581, + "latitude": 38.509569, + "longitude": -122.3539, + "city": "Napa", + "state": "CA", + "county": "Napa" + }, + { + "zip_code": 94583, + "latitude": 37.768556, + "longitude": -121.975531, + "city": "San Ramon", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94585, + "latitude": 38.195385, + "longitude": -121.994935, + "city": "Suisun City", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 94586, + "latitude": 37.585883, + "longitude": -121.883018, + "city": "Sunol", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94587, + "latitude": 37.589084, + "longitude": -121.97362, + "city": "Union City", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94588, + "latitude": 37.688244, + "longitude": -121.898741, + "city": "Pleasanton", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94589, + "latitude": 38.158221, + "longitude": -122.280383, + "city": "Vallejo", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 94590, + "latitude": 38.096719, + "longitude": -122.25328, + "city": "Vallejo", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 94591, + "latitude": 38.114249, + "longitude": -122.206292, + "city": "Vallejo", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 94592, + "latitude": 38.096788, + "longitude": -122.26986, + "city": "Vallejo", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 94595, + "latitude": 37.873343, + "longitude": -122.070625, + "city": "Walnut Creek", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94596, + "latitude": 37.952389, + "longitude": -121.864451, + "city": "Walnut Creek", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94597, + "latitude": 37.777208, + "longitude": -121.955399, + "city": "Walnut Creek", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94598, + "latitude": 37.906873, + "longitude": -122.037045, + "city": "Walnut Creek", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94599, + "latitude": 38.41611, + "longitude": -122.361587, + "city": "Yountville", + "state": "CA", + "county": "Napa" + }, + { + "zip_code": 94601, + "latitude": 37.786027, + "longitude": -122.223779, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94602, + "latitude": 37.802777, + "longitude": -122.204578, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94603, + "latitude": 37.761778, + "longitude": -122.198428, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94604, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94605, + "latitude": 37.759322, + "longitude": -122.156626, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94606, + "latitude": 37.789927, + "longitude": -122.243979, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94607, + "latitude": 37.807967, + "longitude": -122.29878, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94608, + "latitude": 37.833876, + "longitude": -122.29548, + "city": "Emeryville", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94609, + "latitude": 37.834776, + "longitude": -122.26328, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94610, + "latitude": 37.811277, + "longitude": -122.238779, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94611, + "latitude": 37.847076, + "longitude": -122.222278, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94612, + "latitude": 37.809435, + "longitude": -122.27018, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94613, + "latitude": 37.781098, + "longitude": -122.186573, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94614, + "latitude": 37.727739, + "longitude": -122.204573, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94615, + "latitude": 37.806677, + "longitude": -122.30038, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94617, + "latitude": 37.807827, + "longitude": -122.271652, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94618, + "latitude": 37.843126, + "longitude": -122.240179, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94619, + "latitude": 37.783877, + "longitude": -122.167126, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94620, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Piedmont", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94621, + "latitude": 37.742529, + "longitude": -122.196689, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94622, + "latitude": "", + "longitude": "", + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94623, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94624, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94625, + "latitude": 37.803927, + "longitude": -122.319655, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94626, + "latitude": 37.819314, + "longitude": -122.303136, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94627, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94643, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94649, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94659, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94660, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94661, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94662, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Emeryville", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94666, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Oakland", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94701, + "latitude": 37.860576, + "longitude": -122.29673, + "city": "Berkeley", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94702, + "latitude": 37.864425, + "longitude": -122.28713, + "city": "Berkeley", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94703, + "latitude": 37.865725, + "longitude": -122.27573, + "city": "Berkeley", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94704, + "latitude": 37.866975, + "longitude": -122.256729, + "city": "Berkeley", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94705, + "latitude": 37.85983, + "longitude": -122.242029, + "city": "Berkeley", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94706, + "latitude": 37.889525, + "longitude": -122.29828, + "city": "Albany", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94707, + "latitude": 37.892675, + "longitude": -122.27608, + "city": "Berkeley", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94708, + "latitude": 37.891825, + "longitude": -122.260429, + "city": "Berkeley", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94709, + "latitude": 37.879825, + "longitude": -122.26553, + "city": "Berkeley", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94710, + "latitude": 37.873366, + "longitude": -122.30273, + "city": "Berkeley", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94712, + "latitude": 37.680181, + "longitude": -121.921498, + "city": "Berkeley", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94720, + "latitude": 37.866825, + "longitude": -122.253582, + "city": "Berkeley", + "state": "CA", + "county": "Alameda" + }, + { + "zip_code": 94801, + "latitude": 37.947523, + "longitude": -122.384032, + "city": "Richmond", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94802, + "latitude": 37.777208, + "longitude": -121.955399, + "city": "Richmond", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94803, + "latitude": 37.966422, + "longitude": -122.206177, + "city": "El Sobrante", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94804, + "latitude": 37.925174, + "longitude": -122.344381, + "city": "Richmond", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94805, + "latitude": 37.929123, + "longitude": -122.30093, + "city": "Richmond", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94806, + "latitude": 37.959573, + "longitude": -122.334131, + "city": "San Pablo", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94807, + "latitude": 37.777208, + "longitude": -121.955399, + "city": "Richmond", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94808, + "latitude": 37.777208, + "longitude": -121.955399, + "city": "Richmond", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94820, + "latitude": 37.777208, + "longitude": -121.955399, + "city": "El Sobrante", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94850, + "latitude": 37.777208, + "longitude": -121.955399, + "city": "Richmond", + "state": "CA", + "county": "Contra Costa" + }, + { + "zip_code": 94901, + "latitude": 37.970948, + "longitude": -122.504286, + "city": "San Rafael", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94903, + "latitude": 38.033922, + "longitude": -122.58549, + "city": "San Rafael", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94904, + "latitude": 37.947874, + "longitude": -122.536337, + "city": "Greenbrae", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94912, + "latitude": 38.068036, + "longitude": -122.740988, + "city": "San Rafael", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94913, + "latitude": 38.068036, + "longitude": -122.740988, + "city": "San Rafael", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94914, + "latitude": 38.068036, + "longitude": -122.740988, + "city": "Kentfield", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94915, + "latitude": 38.07392, + "longitude": -122.55944, + "city": "San Rafael", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94920, + "latitude": 37.935324, + "longitude": -122.564439, + "city": "Belvedere Tiburon", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94922, + "latitude": 38.351416, + "longitude": -122.974134, + "city": "Bodega", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 94923, + "latitude": 38.367894, + "longitude": -123.048629, + "city": "Bodega Bay", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 94924, + "latitude": 38.001976, + "longitude": -122.77915, + "city": "Bolinas", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94925, + "latitude": 37.925039, + "longitude": -122.512035, + "city": "Corte Madera", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94926, + "latitude": 38.463088, + "longitude": -122.989975, + "city": "Cotati", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 94927, + "latitude": 38.463088, + "longitude": -122.989975, + "city": "Rohnert Park", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 94928, + "latitude": 38.345663, + "longitude": -122.698398, + "city": "Rohnert Park", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 94929, + "latitude": 38.246928, + "longitude": -122.956202, + "city": "Dillon Beach", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94930, + "latitude": 37.981723, + "longitude": -122.607791, + "city": "Fairfax", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94931, + "latitude": 38.323614, + "longitude": -122.710565, + "city": "Cotati", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 94933, + "latitude": 38.015803, + "longitude": -122.690302, + "city": "Forest Knolls", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94937, + "latitude": 38.112571, + "longitude": -122.887717, + "city": "Inverness", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94938, + "latitude": 38.022974, + "longitude": -122.699183, + "city": "Lagunitas", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94939, + "latitude": 37.936624, + "longitude": -122.534237, + "city": "Larkspur", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94940, + "latitude": 38.17087, + "longitude": -122.823185, + "city": "Marshall", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94941, + "latitude": 37.886325, + "longitude": -122.562937, + "city": "Mill Valley", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94942, + "latitude": 38.068036, + "longitude": -122.740988, + "city": "Mill Valley", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94945, + "latitude": 38.027654, + "longitude": -122.540951, + "city": "Novato", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94946, + "latitude": 38.008973, + "longitude": -122.685568, + "city": "Nicasio", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94947, + "latitude": 38.09502, + "longitude": -122.620893, + "city": "Novato", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94948, + "latitude": 38.148858, + "longitude": -122.573745, + "city": "Novato", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94949, + "latitude": 38.06372, + "longitude": -122.541739, + "city": "Novato", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94950, + "latitude": 38.046703, + "longitude": -122.769854, + "city": "Olema", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94951, + "latitude": 38.315342, + "longitude": -122.648346, + "city": "Penngrove", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 94952, + "latitude": 38.265366, + "longitude": -122.822588, + "city": "Petaluma", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 94953, + "latitude": 38.463088, + "longitude": -122.989975, + "city": "Petaluma", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 94954, + "latitude": 38.225816, + "longitude": -122.574526, + "city": "Petaluma", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 94955, + "latitude": 38.463088, + "longitude": -122.989975, + "city": "Petaluma", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 94956, + "latitude": 38.057934, + "longitude": -122.853421, + "city": "Point Reyes Station", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94957, + "latitude": 38.022322, + "longitude": -122.561689, + "city": "Ross", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94960, + "latitude": 37.986473, + "longitude": -122.59184, + "city": "San Anselmo", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94963, + "latitude": 38.016622, + "longitude": -122.659644, + "city": "San Geronimo", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94964, + "latitude": 37.941571, + "longitude": -122.48436, + "city": "San Quentin", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94965, + "latitude": 37.850417, + "longitude": -122.531423, + "city": "Sausalito", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94966, + "latitude": 38.068036, + "longitude": -122.740988, + "city": "Sausalito", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94970, + "latitude": 37.911625, + "longitude": -122.652043, + "city": "Stinson Beach", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94971, + "latitude": 38.242733, + "longitude": -122.91446, + "city": "Tomales", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94972, + "latitude": 38.307224, + "longitude": -122.855757, + "city": "Valley Ford", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 94973, + "latitude": 38.007172, + "longitude": -122.661691, + "city": "Woodacre", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94974, + "latitude": 38.068036, + "longitude": -122.740988, + "city": "San Quentin", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94975, + "latitude": 38.463088, + "longitude": -122.989975, + "city": "Petaluma", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 94976, + "latitude": 38.068036, + "longitude": -122.740988, + "city": "Corte Madera", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94977, + "latitude": 38.068036, + "longitude": -122.740988, + "city": "Larkspur", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94978, + "latitude": 38.068036, + "longitude": -122.740988, + "city": "Fairfax", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94979, + "latitude": 38.068036, + "longitude": -122.740988, + "city": "San Anselmo", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94998, + "latitude": 38.117269, + "longitude": -122.568442, + "city": "Novato", + "state": "CA", + "county": "Marin" + }, + { + "zip_code": 94999, + "latitude": 38.267466, + "longitude": -122.658097, + "city": "Petaluma", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95001, + "latitude": 37.05297, + "longitude": -121.949418, + "city": "Aptos", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95002, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Alviso", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95003, + "latitude": 37.024933, + "longitude": -121.879432, + "city": "Aptos", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95004, + "latitude": 36.864154, + "longitude": -121.647608, + "city": "Aromas", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 95005, + "latitude": 37.096297, + "longitude": -122.095525, + "city": "Ben Lomond", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95006, + "latitude": 37.176595, + "longitude": -122.130887, + "city": "Boulder Creek", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95007, + "latitude": 37.10604, + "longitude": -122.111546, + "city": "Brookdale", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95008, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Campbell", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95009, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Campbell", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95010, + "latitude": 37.012368, + "longitude": -122.000537, + "city": "Capitola", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95011, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Campbell", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95012, + "latitude": 36.782556, + "longitude": -121.735759, + "city": "Castroville", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 95013, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Coyote", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95014, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Cupertino", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95015, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Cupertino", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95017, + "latitude": 37.097536, + "longitude": -122.24338, + "city": "Davenport", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95018, + "latitude": 37.102414, + "longitude": -122.068323, + "city": "Felton", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95019, + "latitude": 36.937042, + "longitude": -121.780262, + "city": "Freedom", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95020, + "latitude": 37.023347, + "longitude": -121.493849, + "city": "Gilroy", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95021, + "latitude": 36.986148, + "longitude": -121.497349, + "city": "Gilroy", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95023, + "latitude": 36.828078, + "longitude": -121.3924, + "city": "Hollister", + "state": "CA", + "county": "San Benito" + }, + { + "zip_code": 95024, + "latitude": 36.85443, + "longitude": -121.411909, + "city": "Hollister", + "state": "CA", + "county": "San Benito" + }, + { + "zip_code": 95026, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Holy City", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95030, + "latitude": 37.107647, + "longitude": -121.842064, + "city": "Los Gatos", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95031, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Los Gatos", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95032, + "latitude": 37.070923, + "longitude": -121.66186, + "city": "Los Gatos", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95033, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Los Gatos", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95035, + "latitude": 37.436454, + "longitude": -121.861989, + "city": "Milpitas", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95036, + "latitude": 37.456807, + "longitude": -121.913632, + "city": "Milpitas", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95037, + "latitude": 37.130238, + "longitude": -121.681557, + "city": "Morgan Hill", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95038, + "latitude": 37.225787, + "longitude": -121.617894, + "city": "Morgan Hill", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95039, + "latitude": 36.797555, + "longitude": -121.76066, + "city": "Moss Landing", + "state": "CA", + "county": "Monterey" + }, + { + "zip_code": 95041, + "latitude": 37.052137, + "longitude": -122.058024, + "city": "Mount Hermon", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95042, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "New Almaden", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95043, + "latitude": 36.587379, + "longitude": -121.148586, + "city": "Paicines", + "state": "CA", + "county": "San Benito" + }, + { + "zip_code": 95044, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Redwood Estates", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95045, + "latitude": 36.831008, + "longitude": -121.442746, + "city": "San Juan Bautista", + "state": "CA", + "county": "San Benito" + }, + { + "zip_code": 95046, + "latitude": 37.090125, + "longitude": -121.606099, + "city": "San Martin", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95050, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Santa Clara", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95051, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Santa Clara", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95052, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Santa Clara", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95053, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Santa Clara", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95054, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Santa Clara", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95055, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Santa Clara", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95056, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Santa Clara", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95060, + "latitude": 37.052748, + "longitude": -122.111126, + "city": "Santa Cruz", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95061, + "latitude": 37.007399, + "longitude": -122.075125, + "city": "Santa Cruz", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95062, + "latitude": 36.971549, + "longitude": -121.990571, + "city": "Santa Cruz", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95063, + "latitude": 36.9634, + "longitude": -121.973771, + "city": "Santa Cruz", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95064, + "latitude": 36.988837, + "longitude": -122.059073, + "city": "Santa Cruz", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95065, + "latitude": 37.033568, + "longitude": -121.982632, + "city": "Santa Cruz", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95066, + "latitude": 37.071387, + "longitude": -122.006276, + "city": "Scotts Valley", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95067, + "latitude": 37.05297, + "longitude": -121.949418, + "city": "Scotts Valley", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95070, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Saratoga", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95071, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "Saratoga", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95073, + "latitude": 37.031948, + "longitude": -121.94972, + "city": "Soquel", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95075, + "latitude": 36.761702, + "longitude": -121.274795, + "city": "Tres Pinos", + "state": "CA", + "county": "San Benito" + }, + { + "zip_code": 95076, + "latitude": 36.98025, + "longitude": -121.74696, + "city": "Watsonville", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95077, + "latitude": 37.05297, + "longitude": -121.949418, + "city": "Watsonville", + "state": "CA", + "county": "Santa Cruz" + }, + { + "zip_code": 95101, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95102, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95103, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95106, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95108, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95109, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95110, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95111, + "latitude": 37.267947, + "longitude": -121.800001, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95112, + "latitude": 37.37004, + "longitude": -121.892093, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95113, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95114, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95115, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95116, + "latitude": 37.35504, + "longitude": -121.835344, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95117, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95118, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95119, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95120, + "latitude": 37.38478, + "longitude": -121.895798, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95121, + "latitude": 37.298592, + "longitude": -121.797977, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95122, + "latitude": 37.33074, + "longitude": -121.828333, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95123, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95124, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95125, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95126, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95127, + "latitude": 37.373903, + "longitude": -121.795913, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95128, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95129, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95130, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95131, + "latitude": 37.388389, + "longitude": -121.886316, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95132, + "latitude": 37.433587, + "longitude": -121.829615, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95133, + "latitude": 37.372239, + "longitude": -121.864265, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95134, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95135, + "latitude": 37.272289, + "longitude": -121.723862, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95136, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95137, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95138, + "latitude": 37.258733, + "longitude": -121.745159, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95139, + "latitude": 37.216394, + "longitude": -121.740059, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95140, + "latitude": 37.304321, + "longitude": -121.633457, + "city": "Mount Hamilton", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95141, + "latitude": 37.178745, + "longitude": -121.741809, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95142, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95148, + "latitude": 37.335928, + "longitude": -121.776861, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95150, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95151, + "latitude": 37.187349, + "longitude": -121.75722, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95152, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95153, + "latitude": 37.216184, + "longitude": -121.743632, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95154, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95155, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95156, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95157, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95158, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95159, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95160, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95161, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95164, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95170, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95171, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95172, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95173, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95190, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95191, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95192, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95193, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95194, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95196, + "latitude": 37.189396, + "longitude": -121.705327, + "city": "San Jose", + "state": "CA", + "county": "Santa Clara" + }, + { + "zip_code": 95201, + "latitude": 37.672196, + "longitude": -121.298794, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95202, + "latitude": 37.958573, + "longitude": -121.289206, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95203, + "latitude": 37.954573, + "longitude": -121.321707, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95204, + "latitude": 37.975473, + "longitude": -121.323758, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95205, + "latitude": 37.954773, + "longitude": -121.255405, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95206, + "latitude": 37.912324, + "longitude": -121.387007, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95207, + "latitude": 38.018146, + "longitude": -121.325487, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95208, + "latitude": 37.889849, + "longitude": -121.253872, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95209, + "latitude": 37.988691, + "longitude": -121.337187, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95210, + "latitude": 38.025472, + "longitude": -121.291628, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95211, + "latitude": 37.981073, + "longitude": -121.308008, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95212, + "latitude": 38.037321, + "longitude": -121.216156, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95213, + "latitude": 37.904777, + "longitude": -121.226782, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95215, + "latitude": 37.964123, + "longitude": -121.128903, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95219, + "latitude": 38.001613, + "longitude": -121.455259, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95220, + "latitude": 38.198666, + "longitude": -121.230207, + "city": "Acampo", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95221, + "latitude": 38.092294, + "longitude": -120.535316, + "city": "Altaville", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95222, + "latitude": 38.052816, + "longitude": -120.618608, + "city": "Angels Camp", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95223, + "latitude": 38.328969, + "longitude": -120.223837, + "city": "Arnold", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95224, + "latitude": 38.217249, + "longitude": -120.377348, + "city": "Avery", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95225, + "latitude": 38.191258, + "longitude": -120.910251, + "city": "Burson", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95226, + "latitude": 38.211495, + "longitude": -120.849106, + "city": "Campo Seco", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95227, + "latitude": 38.211127, + "longitude": -121.044252, + "city": "Clements", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95228, + "latitude": 37.971877, + "longitude": -120.649912, + "city": "Copperopolis", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95229, + "latitude": 38.110355, + "longitude": -120.45436, + "city": "Douglas Flat", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95230, + "latitude": 37.915075, + "longitude": -120.967398, + "city": "Farmington", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95231, + "latitude": 37.883775, + "longitude": -121.290405, + "city": "French Camp", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95232, + "latitude": 38.352793, + "longitude": -120.573947, + "city": "Glencoe", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95233, + "latitude": 38.183537, + "longitude": -120.388215, + "city": "Hathaway Pines", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95234, + "latitude": 37.889849, + "longitude": -121.253872, + "city": "Holt", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95236, + "latitude": 38.017322, + "longitude": -121.039852, + "city": "Linden", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95237, + "latitude": 38.141969, + "longitude": -121.152088, + "city": "Lockeford", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95240, + "latitude": 38.111356, + "longitude": -121.172415, + "city": "Lodi", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95241, + "latitude": 37.889849, + "longitude": -121.253872, + "city": "Lodi", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95242, + "latitude": 38.138318, + "longitude": -121.422011, + "city": "Lodi", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95245, + "latitude": 38.29138, + "longitude": -120.571875, + "city": "Mokelumne Hill", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95246, + "latitude": 38.279047, + "longitude": -120.536352, + "city": "Mountain Ranch", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95247, + "latitude": 38.131035, + "longitude": -120.454381, + "city": "Murphys", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95248, + "latitude": 38.325626, + "longitude": -120.485154, + "city": "Rail Road Flat", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95249, + "latitude": 38.190106, + "longitude": -120.616052, + "city": "San Andreas", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95250, + "latitude": 38.243158, + "longitude": -120.436953, + "city": "Sheep Ranch", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95251, + "latitude": 38.085205, + "longitude": -120.471841, + "city": "Vallecito", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95252, + "latitude": 38.190383, + "longitude": -120.733128, + "city": "Valley Springs", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95253, + "latitude": 38.114669, + "longitude": -121.203656, + "city": "Victor", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95254, + "latitude": 38.161589, + "longitude": -120.944264, + "city": "Wallace", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95255, + "latitude": 38.403007, + "longitude": -120.477467, + "city": "West Point", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95257, + "latitude": 38.390344, + "longitude": -120.490831, + "city": "Wilseyville", + "state": "CA", + "county": "Calaveras" + }, + { + "zip_code": 95258, + "latitude": 38.157962, + "longitude": -121.314909, + "city": "Woodbridge", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95267, + "latitude": 37.889849, + "longitude": -121.253872, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95269, + "latitude": 37.889849, + "longitude": -121.253872, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95290, + "latitude": 37.953473, + "longitude": -121.285257, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95296, + "latitude": 37.889849, + "longitude": -121.253872, + "city": "Lyoth", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95297, + "latitude": 37.889849, + "longitude": -121.253872, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95298, + "latitude": 37.889849, + "longitude": -121.253872, + "city": "Stockton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95301, + "latitude": 37.317255, + "longitude": -120.647347, + "city": "Atwater", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95303, + "latitude": 37.470114, + "longitude": -120.624564, + "city": "Ballico", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95304, + "latitude": 37.889849, + "longitude": -121.253872, + "city": "Tracy", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95305, + "latitude": 37.822025, + "longitude": -120.241685, + "city": "Big Oak Flat", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95306, + "latitude": 37.408643, + "longitude": -120.122715, + "city": "Catheys Valley", + "state": "CA", + "county": "Mariposa" + }, + { + "zip_code": 95307, + "latitude": 37.561889, + "longitude": -120.967976, + "city": "Ceres", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95309, + "latitude": 37.807938, + "longitude": -120.440467, + "city": "Chinese Camp", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95310, + "latitude": 38.061003, + "longitude": -120.363545, + "city": "Columbia", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95311, + "latitude": 37.700116, + "longitude": -120.155251, + "city": "Coulterville", + "state": "CA", + "county": "Mariposa" + }, + { + "zip_code": 95312, + "latitude": 37.422175, + "longitude": -120.627348, + "city": "Cressey", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95313, + "latitude": 37.429147, + "longitude": -121.054997, + "city": "Crows Landing", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95314, + "latitude": 38.033541, + "longitude": -119.92502, + "city": "Dardanelle", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95315, + "latitude": 37.429369, + "longitude": -120.762047, + "city": "Delhi", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95316, + "latitude": 37.55026, + "longitude": -120.718131, + "city": "Denair", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95317, + "latitude": 37.125735, + "longitude": -120.504934, + "city": "El Nido", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95318, + "latitude": 37.622232, + "longitude": -119.861258, + "city": "El Portal", + "state": "CA", + "county": "Mariposa" + }, + { + "zip_code": 95319, + "latitude": 37.637531, + "longitude": -120.906593, + "city": "Empire", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95320, + "latitude": 37.817826, + "longitude": -121.033598, + "city": "Escalon", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95321, + "latitude": 37.867634, + "longitude": -120.088197, + "city": "Groveland", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95322, + "latitude": 37.150438, + "longitude": -120.987196, + "city": "Gustine", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95323, + "latitude": 37.599514, + "longitude": -120.659136, + "city": "Hickman", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95324, + "latitude": 37.399608, + "longitude": -120.885973, + "city": "Hilmar", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95325, + "latitude": 37.555242, + "longitude": -120.226091, + "city": "Hornitos", + "state": "CA", + "county": "Mariposa" + }, + { + "zip_code": 95326, + "latitude": 37.545683, + "longitude": -120.966091, + "city": "Hughson", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95327, + "latitude": 37.883131, + "longitude": -120.419802, + "city": "Jamestown", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95328, + "latitude": 37.55928, + "longitude": -120.913846, + "city": "Keyes", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95329, + "latitude": 37.653226, + "longitude": -120.50941, + "city": "La Grange", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95330, + "latitude": 37.811976, + "longitude": -121.287362, + "city": "Lathrop", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95333, + "latitude": 37.264851, + "longitude": -120.231843, + "city": "Le Grand", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95334, + "latitude": 37.358769, + "longitude": -120.750082, + "city": "Livingston", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95335, + "latitude": 38.112838, + "longitude": -120.126643, + "city": "Long Barn", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95336, + "latitude": 37.807297, + "longitude": -121.177601, + "city": "Manteca", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95337, + "latitude": 37.743327, + "longitude": -121.227351, + "city": "Manteca", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95338, + "latitude": 37.572907, + "longitude": -120.018973, + "city": "Mariposa", + "state": "CA", + "county": "Mariposa" + }, + { + "zip_code": 95340, + "latitude": 37.338191, + "longitude": -120.475427, + "city": "Merced", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95341, + "latitude": 37.186872, + "longitude": -120.650351, + "city": "Merced", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95342, + "latitude": 37.367315, + "longitude": -120.570634, + "city": "Atwater", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95343, + "latitude": 37.186872, + "longitude": -120.650351, + "city": "Merced", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95344, + "latitude": 37.378234, + "longitude": -120.617808, + "city": "Merced", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95345, + "latitude": 37.564369, + "longitude": -119.962569, + "city": "Midpines", + "state": "CA", + "county": "Mariposa" + }, + { + "zip_code": 95346, + "latitude": 38.08455, + "longitude": -120.135262, + "city": "Mi Wuk Village", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95347, + "latitude": 37.805371, + "longitude": -120.375945, + "city": "Moccasin", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95348, + "latitude": 37.412623, + "longitude": -120.50975, + "city": "Merced", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95350, + "latitude": 37.669463, + "longitude": -121.016796, + "city": "Modesto", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95351, + "latitude": 37.636384, + "longitude": -121.082742, + "city": "Modesto", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95352, + "latitude": 37.60396, + "longitude": -120.937052, + "city": "Modesto", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95353, + "latitude": 37.60396, + "longitude": -120.937052, + "city": "Modesto", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95354, + "latitude": 37.533682, + "longitude": -121.090835, + "city": "Modesto", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95355, + "latitude": 37.685879, + "longitude": -120.948033, + "city": "Modesto", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95356, + "latitude": 37.722878, + "longitude": -121.035846, + "city": "Modesto", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95357, + "latitude": 37.679529, + "longitude": -120.875893, + "city": "Modesto", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95358, + "latitude": 37.611, + "longitude": -121.103547, + "city": "Modesto", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95360, + "latitude": 37.340337, + "longitude": -121.213529, + "city": "Newman", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95361, + "latitude": 37.839643, + "longitude": -120.698578, + "city": "Oakdale", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95363, + "latitude": 37.516383, + "longitude": -121.23848, + "city": "Patterson", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95364, + "latitude": 38.004532, + "longitude": -119.993941, + "city": "Pinecrest", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95365, + "latitude": 37.289085, + "longitude": -120.317156, + "city": "Planada", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95366, + "latitude": 37.765177, + "longitude": -121.115411, + "city": "Ripon", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95367, + "latitude": 37.69222, + "longitude": -120.865061, + "city": "Riverbank", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95368, + "latitude": 37.695359, + "longitude": -121.078608, + "city": "Salida", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95369, + "latitude": 37.483708, + "longitude": -120.463408, + "city": "Snelling", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95370, + "latitude": 37.96091, + "longitude": -120.343863, + "city": "Sonora", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95372, + "latitude": 38.010365, + "longitude": -120.230556, + "city": "Soulsbyville", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95373, + "latitude": 37.986377, + "longitude": -120.241412, + "city": "Standard", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95374, + "latitude": 37.324536, + "longitude": -120.864936, + "city": "Stevinson", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95375, + "latitude": 38.184096, + "longitude": -120.021342, + "city": "Strawberry", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95376, + "latitude": 37.688679, + "longitude": -121.407804, + "city": "Tracy", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95377, + "latitude": "", + "longitude": "", + "city": "Tracy", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95378, + "latitude": 37.889849, + "longitude": -121.253872, + "city": "Tracy", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95379, + "latitude": 37.921694, + "longitude": -120.267887, + "city": "Tuolumne", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95380, + "latitude": 37.540206, + "longitude": -120.844063, + "city": "Turlock", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95381, + "latitude": 37.60396, + "longitude": -120.937052, + "city": "Turlock", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95382, + "latitude": 37.530174, + "longitude": -120.851857, + "city": "Turlock", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95383, + "latitude": 38.085837, + "longitude": -120.176042, + "city": "Twain Harte", + "state": "CA", + "county": "Tuolumne" + }, + { + "zip_code": 95385, + "latitude": 37.889849, + "longitude": -121.253872, + "city": "Vernalis", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95386, + "latitude": 37.659644, + "longitude": -120.775617, + "city": "Waterford", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95387, + "latitude": 37.561682, + "longitude": -121.249449, + "city": "Westley", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95388, + "latitude": 37.411145, + "longitude": -120.55271, + "city": "Winton", + "state": "CA", + "county": "Merced" + }, + { + "zip_code": 95389, + "latitude": 37.63791, + "longitude": -119.694652, + "city": "Yosemite National Park", + "state": "CA", + "county": "Mariposa" + }, + { + "zip_code": 95390, + "latitude": 37.60396, + "longitude": -120.937052, + "city": "Riverbank", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95391, + "latitude": "", + "longitude": "", + "city": "Tracy", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95397, + "latitude": 37.60396, + "longitude": -120.937052, + "city": "Modesto", + "state": "CA", + "county": "Stanislaus" + }, + { + "zip_code": 95401, + "latitude": 38.450412, + "longitude": -122.783159, + "city": "Santa Rosa", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95402, + "latitude": 38.440061, + "longitude": -122.710598, + "city": "Santa Rosa", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95403, + "latitude": 38.477043, + "longitude": -122.810328, + "city": "Santa Rosa", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95404, + "latitude": 38.452642, + "longitude": -122.656296, + "city": "Santa Rosa", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95405, + "latitude": 38.444714, + "longitude": -122.786392, + "city": "Santa Rosa", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95406, + "latitude": 38.459575, + "longitude": -122.715654, + "city": "Santa Rosa", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95407, + "latitude": 38.389113, + "longitude": -122.741849, + "city": "Santa Rosa", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95408, + "latitude": 38.463088, + "longitude": -122.989975, + "city": "Santa Rosa", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95409, + "latitude": 38.462575, + "longitude": -122.626545, + "city": "Santa Rosa", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95410, + "latitude": 39.168027, + "longitude": -123.393401, + "city": "Albion", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95412, + "latitude": 38.710387, + "longitude": -123.386924, + "city": "Annapolis", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95415, + "latitude": 39.046943, + "longitude": -123.418728, + "city": "Boonville", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95416, + "latitude": 38.463088, + "longitude": -122.989975, + "city": "Boyes Hot Springs", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95417, + "latitude": 39.677625, + "longitude": -123.64746, + "city": "Branscomb", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95418, + "latitude": 39.213324, + "longitude": -123.277143, + "city": "Calpella", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95419, + "latitude": 38.417883, + "longitude": -122.959401, + "city": "Camp Meeker", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95420, + "latitude": 39.367286, + "longitude": -123.8042, + "city": "Caspar", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95421, + "latitude": 38.562107, + "longitude": -123.189714, + "city": "Cazadero", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95422, + "latitude": 38.946476, + "longitude": -122.657017, + "city": "Clearlake", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95423, + "latitude": 38.953387, + "longitude": -122.620832, + "city": "Clearlake Oaks", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95424, + "latitude": 38.985997, + "longitude": -122.661027, + "city": "Clearlake Park", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95425, + "latitude": 38.638928, + "longitude": -122.91333, + "city": "Cloverdale", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95426, + "latitude": 38.82677, + "longitude": -122.732911, + "city": "Cobb", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95427, + "latitude": 39.238683, + "longitude": -123.58761, + "city": "Comptche", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95428, + "latitude": 39.835096, + "longitude": -123.148437, + "city": "Covelo", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95429, + "latitude": 39.671989, + "longitude": -123.394207, + "city": "Dos Rios", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95430, + "latitude": 38.442735, + "longitude": -123.071403, + "city": "Duncans Mills", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95431, + "latitude": 38.463088, + "longitude": -122.989975, + "city": "Eldridge", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95432, + "latitude": 39.076371, + "longitude": -123.618031, + "city": "Elk", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95433, + "latitude": 38.313864, + "longitude": -122.513093, + "city": "El Verano", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95435, + "latitude": 39.00686, + "longitude": -122.859625, + "city": "Finley", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95436, + "latitude": 38.509736, + "longitude": -122.918385, + "city": "Forestville", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95437, + "latitude": 39.500634, + "longitude": -123.637284, + "city": "Fort Bragg", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95439, + "latitude": 38.49031, + "longitude": -122.776963, + "city": "Fulton", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95441, + "latitude": 38.707323, + "longitude": -123.006531, + "city": "Geyserville", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95442, + "latitude": 38.383854, + "longitude": -122.557253, + "city": "Glen Ellen", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95443, + "latitude": 39.034627, + "longitude": -122.748109, + "city": "Glenhaven", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95444, + "latitude": 38.434926, + "longitude": -122.868154, + "city": "Graton", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95445, + "latitude": 38.836933, + "longitude": -123.527323, + "city": "Gualala", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95446, + "latitude": 38.495554, + "longitude": -122.979355, + "city": "Guerneville", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95448, + "latitude": 38.512761, + "longitude": -122.787101, + "city": "Healdsburg", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95449, + "latitude": 38.965637, + "longitude": -123.138986, + "city": "Hopland", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95450, + "latitude": 38.546934, + "longitude": -123.227415, + "city": "Jenner", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95451, + "latitude": 38.930811, + "longitude": -122.793699, + "city": "Kelseyville", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95452, + "latitude": 38.413111, + "longitude": -122.548243, + "city": "Kenwood", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95453, + "latitude": 39.05345, + "longitude": -122.919291, + "city": "Lakeport", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95454, + "latitude": 39.772903, + "longitude": -123.573407, + "city": "Laytonville", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95456, + "latitude": 39.267235, + "longitude": -123.696392, + "city": "Littleriver", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95457, + "latitude": 38.89699, + "longitude": -122.625621, + "city": "Lower Lake", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95458, + "latitude": 39.157828, + "longitude": -122.809585, + "city": "Lucerne", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95459, + "latitude": 38.950236, + "longitude": -123.661507, + "city": "Manchester", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95460, + "latitude": 39.319949, + "longitude": -123.734377, + "city": "Mendocino", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95461, + "latitude": 39.040188, + "longitude": -122.719276, + "city": "Middletown", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95462, + "latitude": 38.459755, + "longitude": -123.000625, + "city": "Monte Rio", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95463, + "latitude": 39.128136, + "longitude": -123.486408, + "city": "Navarro", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95464, + "latitude": 39.276878, + "longitude": -122.868266, + "city": "Nice", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95465, + "latitude": 38.406676, + "longitude": -123.020406, + "city": "Occidental", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95466, + "latitude": 39.056598, + "longitude": -123.525375, + "city": "Philo", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95468, + "latitude": 38.919145, + "longitude": -123.540572, + "city": "Point Arena", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95469, + "latitude": 39.360935, + "longitude": -123.106751, + "city": "Potter Valley", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95470, + "latitude": 39.302446, + "longitude": -123.462532, + "city": "Redwood Valley", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95471, + "latitude": 38.523472, + "longitude": -122.982142, + "city": "Rio Nido", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95472, + "latitude": 38.407222, + "longitude": -122.869654, + "city": "Sebastopol", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95473, + "latitude": 38.325851, + "longitude": -122.505846, + "city": "Sebastopol", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95476, + "latitude": 38.255943, + "longitude": -122.476819, + "city": "Sonoma", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95480, + "latitude": 38.676694, + "longitude": -123.372059, + "city": "Stewarts Point", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95481, + "latitude": 39.127247, + "longitude": -123.164533, + "city": "Talmage", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95482, + "latitude": 39.403699, + "longitude": -123.321202, + "city": "Ukiah", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95485, + "latitude": 39.252489, + "longitude": -122.85643, + "city": "Upper Lake", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95486, + "latitude": 38.464487, + "longitude": -123.037996, + "city": "Villa Grande", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95487, + "latitude": 38.463088, + "longitude": -122.989975, + "city": "Vineburg", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95488, + "latitude": 39.660425, + "longitude": -123.786385, + "city": "Westport", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95490, + "latitude": 39.525958, + "longitude": -123.36573, + "city": "Willits", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95492, + "latitude": 38.532827, + "longitude": -122.8041, + "city": "Windsor", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95493, + "latitude": 39.185033, + "longitude": -122.965163, + "city": "Witter Springs", + "state": "CA", + "county": "Lake" + }, + { + "zip_code": 95494, + "latitude": 38.934552, + "longitude": -123.268378, + "city": "Yorkville", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95497, + "latitude": 38.717318, + "longitude": -123.463976, + "city": "The Sea Ranch", + "state": "CA", + "county": "Sonoma" + }, + { + "zip_code": 95501, + "latitude": 40.646324, + "longitude": -124.025773, + "city": "Eureka", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95502, + "latitude": 40.733552, + "longitude": -123.944021, + "city": "Eureka", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95503, + "latitude": 40.787799, + "longitude": -123.938685, + "city": "Eureka", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95511, + "latitude": 40.13049, + "longitude": -123.602161, + "city": "Alderpoint", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95514, + "latitude": 40.318601, + "longitude": -123.672124, + "city": "Blocksburg", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95518, + "latitude": 40.881383, + "longitude": -123.984232, + "city": "Arcata", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95519, + "latitude": 40.708094, + "longitude": -123.976234, + "city": "Mckinleyville", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95521, + "latitude": 40.564495, + "longitude": -123.935891, + "city": "Arcata", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95524, + "latitude": 40.823396, + "longitude": -124.041746, + "city": "Bayside", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95525, + "latitude": 40.961876, + "longitude": -123.88501, + "city": "Blue Lake", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95526, + "latitude": 40.484837, + "longitude": -123.753321, + "city": "Bridgeville", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95527, + "latitude": 40.477722, + "longitude": -123.107281, + "city": "Burnt Ranch", + "state": "CA", + "county": "Trinity" + }, + { + "zip_code": 95528, + "latitude": 40.501603, + "longitude": -123.952838, + "city": "Carlotta", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95531, + "latitude": 41.744452, + "longitude": -124.056897, + "city": "Crescent City", + "state": "CA", + "county": "Del Norte" + }, + { + "zip_code": 95532, + "latitude": 41.852985, + "longitude": -124.15721, + "city": "Crescent City", + "state": "CA", + "county": "Del Norte" + }, + { + "zip_code": 95534, + "latitude": 40.733552, + "longitude": -123.944021, + "city": "Cutten", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95536, + "latitude": 40.465229, + "longitude": -124.26879, + "city": "Ferndale", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95537, + "latitude": 40.72533, + "longitude": -124.21666, + "city": "Fields Landing", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95538, + "latitude": 41.892473, + "longitude": -124.145734, + "city": "Fort Dick", + "state": "CA", + "county": "Del Norte" + }, + { + "zip_code": 95540, + "latitude": 40.815265, + "longitude": -123.903317, + "city": "Fortuna", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95542, + "latitude": 40.65136, + "longitude": -123.862815, + "city": "Garberville", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95543, + "latitude": 41.912328, + "longitude": -123.810269, + "city": "Gasquet", + "state": "CA", + "county": "Del Norte" + }, + { + "zip_code": 95545, + "latitude": 40.25679, + "longitude": -124.151347, + "city": "Honeydew", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95546, + "latitude": 40.786924, + "longitude": -123.754058, + "city": "Hoopa", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95547, + "latitude": 40.548691, + "longitude": -124.09898, + "city": "Hydesville", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95548, + "latitude": 41.609872, + "longitude": -124.054355, + "city": "Klamath", + "state": "CA", + "county": "Del Norte" + }, + { + "zip_code": 95549, + "latitude": 40.647049, + "longitude": -123.913353, + "city": "Kneeland", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95550, + "latitude": 40.768799, + "longitude": -123.859218, + "city": "Korbel", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95551, + "latitude": 40.665179, + "longitude": -124.239192, + "city": "Loleta", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95552, + "latitude": 40.450929, + "longitude": -123.505623, + "city": "Mad River", + "state": "CA", + "county": "Trinity" + }, + { + "zip_code": 95553, + "latitude": 40.23548, + "longitude": -123.845935, + "city": "Miranda", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95554, + "latitude": 40.262278, + "longitude": -123.81444, + "city": "Myers Flat", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95555, + "latitude": 41.291871, + "longitude": -124.060455, + "city": "Orick", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95556, + "latitude": 41.304908, + "longitude": -123.557541, + "city": "Orleans", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95558, + "latitude": 40.303424, + "longitude": -124.21441, + "city": "Petrolia", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95559, + "latitude": 40.195018, + "longitude": -123.786863, + "city": "Phillipsville", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95560, + "latitude": 40.505478, + "longitude": -123.812063, + "city": "Redway", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95562, + "latitude": 40.314708, + "longitude": -123.984516, + "city": "Rio Dell", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95563, + "latitude": 40.672576, + "longitude": -123.034604, + "city": "Salyer", + "state": "CA", + "county": "Trinity" + }, + { + "zip_code": 95564, + "latitude": 40.795138, + "longitude": -124.199568, + "city": "Samoa", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95565, + "latitude": 40.440193, + "longitude": -124.022847, + "city": "Scotia", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95567, + "latitude": 41.925977, + "longitude": -124.159812, + "city": "Smith River", + "state": "CA", + "county": "Del Norte" + }, + { + "zip_code": 95568, + "latitude": 41.451129, + "longitude": -123.467024, + "city": "Somes Bar", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 95569, + "latitude": 40.36547, + "longitude": -123.895246, + "city": "Redcrest", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95570, + "latitude": 40.982322, + "longitude": -124.125506, + "city": "Trinidad", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95571, + "latitude": 40.323964, + "longitude": -123.882487, + "city": "Weott", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95573, + "latitude": 40.872068, + "longitude": -123.90987, + "city": "Willow Creek", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95585, + "latitude": 39.873214, + "longitude": -123.721407, + "city": "Leggett", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95587, + "latitude": 39.947575, + "longitude": -123.686938, + "city": "Piercy", + "state": "CA", + "county": "Mendocino" + }, + { + "zip_code": 95589, + "latitude": 40.47949, + "longitude": -123.847878, + "city": "Whitethorn", + "state": "CA", + "county": "Humboldt" + }, + { + "zip_code": 95595, + "latitude": 40.672576, + "longitude": -123.034604, + "city": "Zenia", + "state": "CA", + "county": "Trinity" + }, + { + "zip_code": 95601, + "latitude": 38.418568, + "longitude": -120.831845, + "city": "Amador City", + "state": "CA", + "county": "Amador" + }, + { + "zip_code": 95602, + "latitude": 39.014933, + "longitude": -121.07047, + "city": "Auburn", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95603, + "latitude": 38.973505, + "longitude": -121.067718, + "city": "Auburn", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95604, + "latitude": 39.106287, + "longitude": -120.536032, + "city": "Auburn", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95605, + "latitude": 38.591854, + "longitude": -121.537801, + "city": "West Sacramento", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95606, + "latitude": 38.799836, + "longitude": -122.181084, + "city": "Brooks", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95607, + "latitude": 38.785596, + "longitude": -122.140491, + "city": "Capay", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95608, + "latitude": 38.62136, + "longitude": -121.332191, + "city": "Carmichael", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95609, + "latitude": 38.650335, + "longitude": -121.327214, + "city": "Carmichael", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95610, + "latitude": 38.689802, + "longitude": -121.26736, + "city": "Citrus Heights", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95611, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Citrus Heights", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95612, + "latitude": 38.43141, + "longitude": -121.594875, + "city": "Clarksburg", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95613, + "latitude": 38.81419, + "longitude": -120.895188, + "city": "Coloma", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95614, + "latitude": 38.877956, + "longitude": -120.986029, + "city": "Cool", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95615, + "latitude": 38.338322, + "longitude": -121.5378, + "city": "Courtland", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95616, + "latitude": 38.521776, + "longitude": -121.749016, + "city": "Davis", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95617, + "latitude": 38.619545, + "longitude": -121.961532, + "city": "Davis", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95618, + "latitude": 38.54431, + "longitude": -121.685904, + "city": "El Macero", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95619, + "latitude": 38.629821, + "longitude": -120.820021, + "city": "Diamond Springs", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95620, + "latitude": 38.397372, + "longitude": -121.761419, + "city": "Dixon", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 95621, + "latitude": 38.693052, + "longitude": -121.309461, + "city": "Citrus Heights", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95623, + "latitude": 38.676272, + "longitude": -120.84598, + "city": "El Dorado", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95624, + "latitude": 38.44148, + "longitude": -121.307142, + "city": "Elk Grove", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95625, + "latitude": 38.348022, + "longitude": -121.90029, + "city": "Elmira", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 95626, + "latitude": 38.695702, + "longitude": -121.452097, + "city": "Elverta", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95627, + "latitude": 38.779509, + "longitude": -122.100884, + "city": "Esparto", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95628, + "latitude": 38.655263, + "longitude": -121.260709, + "city": "Fair Oaks", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95629, + "latitude": 38.510343, + "longitude": -120.708029, + "city": "Fiddletown", + "state": "CA", + "county": "Amador" + }, + { + "zip_code": 95630, + "latitude": 38.594181, + "longitude": -121.310796, + "city": "Folsom", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95631, + "latitude": 39.024453, + "longitude": -120.862663, + "city": "Foresthill", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95632, + "latitude": 38.289817, + "longitude": -121.313883, + "city": "Galt", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95633, + "latitude": 38.854672, + "longitude": -120.830282, + "city": "Garden Valley", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95634, + "latitude": 38.924378, + "longitude": -120.703303, + "city": "Georgetown", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95635, + "latitude": 38.909448, + "longitude": -120.889138, + "city": "Greenwood", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95636, + "latitude": 38.63765, + "longitude": -120.553399, + "city": "Grizzly Flats", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95637, + "latitude": 38.850382, + "longitude": -122.214722, + "city": "Guinda", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95638, + "latitude": 38.320561, + "longitude": -121.154808, + "city": "Herald", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95639, + "latitude": 38.357839, + "longitude": -121.541649, + "city": "Hood", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95640, + "latitude": 38.340647, + "longitude": -120.91473, + "city": "Ione", + "state": "CA", + "county": "Amador" + }, + { + "zip_code": 95641, + "latitude": 38.18394, + "longitude": -121.60164, + "city": "Isleton", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95642, + "latitude": 38.366959, + "longitude": -120.763365, + "city": "Jackson", + "state": "CA", + "county": "Amador" + }, + { + "zip_code": 95644, + "latitude": 38.463282, + "longitude": -120.550021, + "city": "Kit Carson", + "state": "CA", + "county": "Amador" + }, + { + "zip_code": 95645, + "latitude": 38.858483, + "longitude": -121.772472, + "city": "Knights Landing", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95646, + "latitude": 38.575433, + "longitude": -120.285021, + "city": "Kirkwood", + "state": "CA", + "county": "Alpine" + }, + { + "zip_code": 95648, + "latitude": 38.929305, + "longitude": -121.327143, + "city": "Lincoln", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95650, + "latitude": 38.814428, + "longitude": -121.176622, + "city": "Loomis", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95651, + "latitude": 38.888405, + "longitude": -120.842623, + "city": "Lotus", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95652, + "latitude": 38.666653, + "longitude": -121.389613, + "city": "Mcclellan", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95653, + "latitude": 38.671903, + "longitude": -121.972096, + "city": "Madison", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95654, + "latitude": 38.463282, + "longitude": -120.550021, + "city": "Martell", + "state": "CA", + "county": "Amador" + }, + { + "zip_code": 95655, + "latitude": 38.554406, + "longitude": -121.28181, + "city": "Mather", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95656, + "latitude": 38.54723, + "longitude": -120.707891, + "city": "Mount Aukum", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95658, + "latitude": 39.038217, + "longitude": -120.971166, + "city": "Newcastle", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95659, + "latitude": 38.837134, + "longitude": -121.551933, + "city": "Nicolaus", + "state": "CA", + "county": "Sutter" + }, + { + "zip_code": 95660, + "latitude": 38.667003, + "longitude": -121.387541, + "city": "North Highlands", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95661, + "latitude": 38.74073, + "longitude": -121.25603, + "city": "Roseville", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95662, + "latitude": 38.687103, + "longitude": -121.225369, + "city": "Orangevale", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95663, + "latitude": 38.852288, + "longitude": -121.180531, + "city": "Penryn", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95664, + "latitude": 38.75162, + "longitude": -120.979123, + "city": "Pilot Hill", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95665, + "latitude": 38.4038, + "longitude": -120.668334, + "city": "Pine Grove", + "state": "CA", + "county": "Amador" + }, + { + "zip_code": 95666, + "latitude": 38.556287, + "longitude": -120.352661, + "city": "Pioneer", + "state": "CA", + "county": "Amador" + }, + { + "zip_code": 95667, + "latitude": 38.730224, + "longitude": -120.797149, + "city": "Placerville", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95668, + "latitude": 38.830643, + "longitude": -121.534228, + "city": "Pleasant Grove", + "state": "CA", + "county": "Sutter" + }, + { + "zip_code": 95669, + "latitude": 38.486559, + "longitude": -120.86184, + "city": "Plymouth", + "state": "CA", + "county": "Amador" + }, + { + "zip_code": 95670, + "latitude": 38.597705, + "longitude": -121.270426, + "city": "Rancho Cordova", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95671, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Represa", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95672, + "latitude": 38.718327, + "longitude": -120.994305, + "city": "Rescue", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95673, + "latitude": 38.478399, + "longitude": -121.459135, + "city": "Rio Linda", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95674, + "latitude": 38.931318, + "longitude": -121.489882, + "city": "Rio Oso", + "state": "CA", + "county": "Sutter" + }, + { + "zip_code": 95675, + "latitude": 38.544557, + "longitude": -120.74279, + "city": "River Pines", + "state": "CA", + "county": "Amador" + }, + { + "zip_code": 95676, + "latitude": 38.868875, + "longitude": -121.70949, + "city": "Robbins", + "state": "CA", + "county": "Sutter" + }, + { + "zip_code": 95677, + "latitude": 38.801233, + "longitude": -121.230374, + "city": "Rocklin", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95678, + "latitude": 38.910488, + "longitude": -121.131309, + "city": "Roseville", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95679, + "latitude": 38.867147, + "longitude": -122.224813, + "city": "Rumsey", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95680, + "latitude": 38.232898, + "longitude": -121.568427, + "city": "Ryde", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95681, + "latitude": 38.989408, + "longitude": -121.346893, + "city": "Sheridan", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95682, + "latitude": 38.62183, + "longitude": -120.78801, + "city": "Shingle Springs", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95683, + "latitude": 38.51858, + "longitude": -121.125431, + "city": "Sloughhouse", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95684, + "latitude": 38.639336, + "longitude": -120.599848, + "city": "Somerset", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95685, + "latitude": 38.436584, + "longitude": -120.742839, + "city": "Sutter Creek", + "state": "CA", + "county": "Amador" + }, + { + "zip_code": 95686, + "latitude": 38.189865, + "longitude": -121.450953, + "city": "Thornton", + "state": "CA", + "county": "San Joaquin" + }, + { + "zip_code": 95687, + "latitude": 38.35056, + "longitude": -121.912773, + "city": "Vacaville", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 95688, + "latitude": 38.407405, + "longitude": -122.012778, + "city": "Vacaville", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 95689, + "latitude": 38.44727, + "longitude": -120.706876, + "city": "Volcano", + "state": "CA", + "county": "Amador" + }, + { + "zip_code": 95690, + "latitude": 38.181635, + "longitude": -121.578895, + "city": "Walnut Grove", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95691, + "latitude": 38.608615, + "longitude": -121.610919, + "city": "West Sacramento", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95692, + "latitude": 39.08337, + "longitude": -121.397892, + "city": "Wheatland", + "state": "CA", + "county": "Yuba" + }, + { + "zip_code": 95693, + "latitude": 38.405222, + "longitude": -121.239026, + "city": "Wilton", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95694, + "latitude": 38.622768, + "longitude": -121.923196, + "city": "Winters", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95695, + "latitude": 38.74388, + "longitude": -121.915653, + "city": "Woodland", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95696, + "latitude": 38.34896, + "longitude": -121.908324, + "city": "Vacaville", + "state": "CA", + "county": "Solano" + }, + { + "zip_code": 95697, + "latitude": 38.751038, + "longitude": -121.832156, + "city": "Yolo", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95698, + "latitude": 38.782731, + "longitude": -121.89811, + "city": "Zamora", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95699, + "latitude": 38.437001, + "longitude": -120.845706, + "city": "Drytown", + "state": "CA", + "county": "Amador" + }, + { + "zip_code": 95701, + "latitude": 39.214162, + "longitude": -120.795987, + "city": "Alta", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95703, + "latitude": 38.998186, + "longitude": -120.994598, + "city": "Applegate", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95709, + "latitude": 38.745549, + "longitude": -120.693072, + "city": "Camino", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95712, + "latitude": 39.167276, + "longitude": -120.964275, + "city": "Chicago Park", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 95713, + "latitude": 39.126473, + "longitude": -120.863763, + "city": "Colfax", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95714, + "latitude": 39.196515, + "longitude": -120.829762, + "city": "Dutch Flat", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95715, + "latitude": 39.254601, + "longitude": -120.721541, + "city": "Emigrant Gap", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95717, + "latitude": 39.168473, + "longitude": -120.802035, + "city": "Gold Run", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95720, + "latitude": 38.892518, + "longitude": -120.25249, + "city": "Kyburz", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95721, + "latitude": 38.83074, + "longitude": -120.055163, + "city": "Echo Lake", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95722, + "latitude": 39.001448, + "longitude": -121.034843, + "city": "Meadow Vista", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95724, + "latitude": 39.26599, + "longitude": -120.64145, + "city": "Norden", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 95726, + "latitude": 38.766276, + "longitude": -120.481278, + "city": "Pollock Pines", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95728, + "latitude": 39.31959, + "longitude": -120.435313, + "city": "Soda Springs", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 95735, + "latitude": 38.802139, + "longitude": -120.140714, + "city": "Twin Bridges", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95736, + "latitude": 39.01892, + "longitude": -120.962012, + "city": "Weimar", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95741, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Rancho Cordova", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95742, + "latitude": 38.579621, + "longitude": -121.20253, + "city": "Rancho Cordova", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95743, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Rancho Cordova", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95746, + "latitude": 38.756614, + "longitude": -121.183436, + "city": "Granite Bay", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95747, + "latitude": 38.779875, + "longitude": -121.335559, + "city": "Roseville", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95758, + "latitude": 38.347205, + "longitude": -121.428681, + "city": "Elk Grove", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95759, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Elk Grove", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95762, + "latitude": 38.686847, + "longitude": -121.044846, + "city": "El Dorado Hills", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 95763, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Folsom", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95765, + "latitude": 38.819795, + "longitude": -121.277439, + "city": "Rocklin", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 95776, + "latitude": 38.695895, + "longitude": -121.709713, + "city": "Woodland", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95798, + "latitude": 38.619545, + "longitude": -121.961532, + "city": "West Sacramento", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95799, + "latitude": 38.619545, + "longitude": -121.961532, + "city": "West Sacramento", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95812, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95813, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95814, + "latitude": 38.579055, + "longitude": -121.480905, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95815, + "latitude": 38.589505, + "longitude": -121.448665, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95816, + "latitude": 38.571505, + "longitude": -121.467549, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95817, + "latitude": 38.549232, + "longitude": -121.452264, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95818, + "latitude": 38.557255, + "longitude": -121.495915, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95819, + "latitude": 38.568305, + "longitude": -121.440764, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95820, + "latitude": 38.536606, + "longitude": -121.446414, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95821, + "latitude": 38.627204, + "longitude": -121.437964, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95822, + "latitude": 38.511356, + "longitude": -121.497716, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95823, + "latitude": 38.481354, + "longitude": -121.442071, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95824, + "latitude": 38.517256, + "longitude": -121.440764, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95825, + "latitude": 38.585804, + "longitude": -121.402213, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95826, + "latitude": 38.547639, + "longitude": -121.385459, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95827, + "latitude": 38.552752, + "longitude": -121.322653, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95828, + "latitude": 38.488446, + "longitude": -121.423245, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95829, + "latitude": 38.495328, + "longitude": -121.321524, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95830, + "latitude": 38.490022, + "longitude": -121.25614, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95831, + "latitude": 38.497863, + "longitude": -121.531332, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95832, + "latitude": 38.435014, + "longitude": -121.497276, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95833, + "latitude": 38.621802, + "longitude": -121.514016, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95834, + "latitude": 38.584193, + "longitude": -121.523566, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95835, + "latitude": 38.667783, + "longitude": -121.526051, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95836, + "latitude": 38.710901, + "longitude": -121.522717, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95837, + "latitude": 38.692855, + "longitude": -121.603038, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95838, + "latitude": 38.645103, + "longitude": -121.440015, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95840, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95841, + "latitude": 38.665385, + "longitude": -121.353862, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95842, + "latitude": 38.692752, + "longitude": -121.359009, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95843, + "latitude": 38.716091, + "longitude": -121.366613, + "city": "Antelope", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95851, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95852, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95853, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95857, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95860, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95864, + "latitude": 38.586554, + "longitude": -121.379467, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95865, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95866, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95867, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95873, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95887, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95894, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95899, + "latitude": 38.377411, + "longitude": -121.444429, + "city": "Sacramento", + "state": "CA", + "county": "Sacramento" + }, + { + "zip_code": 95901, + "latitude": 39.260878, + "longitude": -121.370959, + "city": "Marysville", + "state": "CA", + "county": "Yuba" + }, + { + "zip_code": 95903, + "latitude": 39.111453, + "longitude": -121.360957, + "city": "Beale Afb", + "state": "CA", + "county": "Yuba" + }, + { + "zip_code": 95910, + "latitude": 39.466324, + "longitude": -120.829633, + "city": "Alleghany", + "state": "CA", + "county": "Sierra" + }, + { + "zip_code": 95912, + "latitude": 39.0134, + "longitude": -121.996852, + "city": "Arbuckle", + "state": "CA", + "county": "Colusa" + }, + { + "zip_code": 95913, + "latitude": 39.698298, + "longitude": -122.168928, + "city": "Artois", + "state": "CA", + "county": "Glenn" + }, + { + "zip_code": 95914, + "latitude": 39.409669, + "longitude": -121.406274, + "city": "Bangor", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95915, + "latitude": 39.912222, + "longitude": -120.834958, + "city": "Belden", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 95916, + "latitude": 39.653813, + "longitude": -121.383744, + "city": "Berry Creek", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95917, + "latitude": 39.40672, + "longitude": -121.753522, + "city": "Biggs", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95918, + "latitude": 39.321808, + "longitude": -121.367758, + "city": "Browns Valley", + "state": "CA", + "county": "Yuba" + }, + { + "zip_code": 95919, + "latitude": 39.425005, + "longitude": -121.273889, + "city": "Brownsville", + "state": "CA", + "county": "Yuba" + }, + { + "zip_code": 95920, + "latitude": 39.458507, + "longitude": -121.934145, + "city": "Butte City", + "state": "CA", + "county": "Glenn" + }, + { + "zip_code": 95922, + "latitude": 39.414386, + "longitude": -121.111454, + "city": "Camptonville", + "state": "CA", + "county": "Yuba" + }, + { + "zip_code": 95923, + "latitude": 40.211176, + "longitude": -121.120635, + "city": "Canyondam", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 95924, + "latitude": 39.26599, + "longitude": -120.64145, + "city": "Cedar Ridge", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 95925, + "latitude": 39.467095, + "longitude": -121.204452, + "city": "Challenge", + "state": "CA", + "county": "Yuba" + }, + { + "zip_code": 95926, + "latitude": 39.746159, + "longitude": -121.840083, + "city": "Chico", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95927, + "latitude": 39.805255, + "longitude": -121.684124, + "city": "Chico", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95928, + "latitude": 39.687626, + "longitude": -121.799166, + "city": "Chico", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95929, + "latitude": 39.731406, + "longitude": -121.801215, + "city": "Chico", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95930, + "latitude": 39.543835, + "longitude": -121.220469, + "city": "Clipper Mills", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95931, + "latitude": 39.169245, + "longitude": -122.290204, + "city": "College City", + "state": "CA", + "county": "Colusa" + }, + { + "zip_code": 95932, + "latitude": 39.203958, + "longitude": -122.221269, + "city": "Colusa", + "state": "CA", + "county": "Colusa" + }, + { + "zip_code": 95934, + "latitude": 40.086309, + "longitude": -120.924541, + "city": "Crescent Mills", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 95935, + "latitude": 39.377751, + "longitude": -121.188917, + "city": "Dobbins", + "state": "CA", + "county": "Yuba" + }, + { + "zip_code": 95936, + "latitude": 39.558607, + "longitude": -120.853714, + "city": "Downieville", + "state": "CA", + "county": "Sierra" + }, + { + "zip_code": 95937, + "latitude": 38.835384, + "longitude": -122.057921, + "city": "Dunnigan", + "state": "CA", + "county": "Yolo" + }, + { + "zip_code": 95938, + "latitude": 39.626362, + "longitude": -121.777546, + "city": "Durham", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95939, + "latitude": 39.54842, + "longitude": -122.567428, + "city": "Elk Creek", + "state": "CA", + "county": "Glenn" + }, + { + "zip_code": 95940, + "latitude": 39.585648, + "longitude": -121.259009, + "city": "Feather Falls", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95941, + "latitude": 39.528374, + "longitude": -121.265237, + "city": "Forbestown", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95942, + "latitude": 39.947462, + "longitude": -121.582814, + "city": "Forest Ranch", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95943, + "latitude": 39.596546, + "longitude": -122.032181, + "city": "Glenn", + "state": "CA", + "county": "Glenn" + }, + { + "zip_code": 95944, + "latitude": 39.49253, + "longitude": -120.898248, + "city": "Goodyears Bar", + "state": "CA", + "county": "Sierra" + }, + { + "zip_code": 95945, + "latitude": 39.196288, + "longitude": -120.95855, + "city": "Grass Valley", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 95946, + "latitude": 39.21656, + "longitude": -121.117883, + "city": "Penn Valley", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 95947, + "latitude": 40.124832, + "longitude": -120.87884, + "city": "Greenville", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 95948, + "latitude": 39.355492, + "longitude": -121.724685, + "city": "Gridley", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95949, + "latitude": 39.110986, + "longitude": -121.128336, + "city": "Grass Valley", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 95950, + "latitude": 39.065895, + "longitude": -121.908208, + "city": "Grimes", + "state": "CA", + "county": "Colusa" + }, + { + "zip_code": 95951, + "latitude": 39.728209, + "longitude": -122.053823, + "city": "Hamilton City", + "state": "CA", + "county": "Glenn" + }, + { + "zip_code": 95953, + "latitude": 39.236141, + "longitude": -121.767177, + "city": "Live Oak", + "state": "CA", + "county": "Sutter" + }, + { + "zip_code": 95954, + "latitude": 39.867959, + "longitude": -121.599628, + "city": "Magalia", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95955, + "latitude": 39.2847, + "longitude": -122.210089, + "city": "Maxwell", + "state": "CA", + "county": "Colusa" + }, + { + "zip_code": 95956, + "latitude": 39.896259, + "longitude": -121.096023, + "city": "Meadow Valley", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 95957, + "latitude": 39.066931, + "longitude": -121.848565, + "city": "Meridian", + "state": "CA", + "county": "Sutter" + }, + { + "zip_code": 95958, + "latitude": 39.556251, + "longitude": -121.803777, + "city": "Nelson", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95959, + "latitude": 39.299606, + "longitude": -120.887965, + "city": "Nevada City", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 95960, + "latitude": 39.330529, + "longitude": -121.084241, + "city": "North San Juan", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 95961, + "latitude": 39.214767, + "longitude": -121.391149, + "city": "Olivehurst", + "state": "CA", + "county": "Yuba" + }, + { + "zip_code": 95962, + "latitude": 39.210524, + "longitude": -121.347605, + "city": "Oregon House", + "state": "CA", + "county": "Yuba" + }, + { + "zip_code": 95963, + "latitude": 39.631197, + "longitude": -122.327137, + "city": "Orland", + "state": "CA", + "county": "Glenn" + }, + { + "zip_code": 95965, + "latitude": 39.578352, + "longitude": -121.58212, + "city": "Oroville", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95966, + "latitude": 39.463113, + "longitude": -121.417372, + "city": "Oroville", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95967, + "latitude": 39.723898, + "longitude": -121.572986, + "city": "Paradise", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95968, + "latitude": 39.443039, + "longitude": -121.55118, + "city": "Palermo", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95969, + "latitude": 39.654279, + "longitude": -121.707265, + "city": "Paradise", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95970, + "latitude": 39.379166, + "longitude": -122.095709, + "city": "Princeton", + "state": "CA", + "county": "Colusa" + }, + { + "zip_code": 95971, + "latitude": 40.005131, + "longitude": -121.017725, + "city": "Quincy", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 95972, + "latitude": 39.44442, + "longitude": -121.318329, + "city": "Rackerby", + "state": "CA", + "county": "Yuba" + }, + { + "zip_code": 95973, + "latitude": 39.837577, + "longitude": -121.869949, + "city": "Chico", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95974, + "latitude": 39.50107, + "longitude": -121.754346, + "city": "Richvale", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95975, + "latitude": 39.225477, + "longitude": -121.148643, + "city": "Rough And Ready", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 95976, + "latitude": 39.723898, + "longitude": -121.572986, + "city": "Chico", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95977, + "latitude": 39.19443, + "longitude": -121.314435, + "city": "Smartville", + "state": "CA", + "county": "Yuba" + }, + { + "zip_code": 95978, + "latitude": 39.995078, + "longitude": -121.47936, + "city": "Stirling City", + "state": "CA", + "county": "Butte" + }, + { + "zip_code": 95979, + "latitude": 39.28207, + "longitude": -122.431045, + "city": "Stonyford", + "state": "CA", + "county": "Colusa" + }, + { + "zip_code": 95980, + "latitude": 39.918503, + "longitude": -121.337404, + "city": "Storrie", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 95981, + "latitude": 39.577329, + "longitude": -121.101562, + "city": "Strawberry Valley", + "state": "CA", + "county": "Yuba" + }, + { + "zip_code": 95982, + "latitude": 39.172636, + "longitude": -121.80251, + "city": "Sutter", + "state": "CA", + "county": "Sutter" + }, + { + "zip_code": 95983, + "latitude": 39.963458, + "longitude": -120.77591, + "city": "Taylorsville", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 95984, + "latitude": 39.950913, + "longitude": -121.094912, + "city": "Twain", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 95986, + "latitude": 39.352343, + "longitude": -120.79118, + "city": "Washington", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 95987, + "latitude": 39.142737, + "longitude": -122.243739, + "city": "Williams", + "state": "CA", + "county": "Colusa" + }, + { + "zip_code": 95988, + "latitude": 39.519386, + "longitude": -122.292996, + "city": "Willows", + "state": "CA", + "county": "Glenn" + }, + { + "zip_code": 95991, + "latitude": 39.048854, + "longitude": -121.612481, + "city": "Yuba City", + "state": "CA", + "county": "Sutter" + }, + { + "zip_code": 95992, + "latitude": 39.020133, + "longitude": -121.681345, + "city": "Yuba City", + "state": "CA", + "county": "Sutter" + }, + { + "zip_code": 95993, + "latitude": 39.130338, + "longitude": -121.737911, + "city": "Yuba City", + "state": "CA", + "county": "Sutter" + }, + { + "zip_code": 96001, + "latitude": 40.675738, + "longitude": -122.456982, + "city": "Redding", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96002, + "latitude": 40.624448, + "longitude": -122.3076, + "city": "Redding", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96003, + "latitude": 40.71711, + "longitude": -122.279493, + "city": "Redding", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96006, + "latitude": 41.236677, + "longitude": -120.932949, + "city": "Adin", + "state": "CA", + "county": "Modoc" + }, + { + "zip_code": 96007, + "latitude": 40.469324, + "longitude": -122.278404, + "city": "Anderson", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96008, + "latitude": 40.715565, + "longitude": -122.11939, + "city": "Bella Vista", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96009, + "latitude": 41.131506, + "longitude": -121.128616, + "city": "Bieber", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96010, + "latitude": 40.672576, + "longitude": -123.034604, + "city": "Big Bar", + "state": "CA", + "county": "Trinity" + }, + { + "zip_code": 96011, + "latitude": 40.974917, + "longitude": -121.82502, + "city": "Big Bend", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96013, + "latitude": 40.942396, + "longitude": -121.687076, + "city": "Burney", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96014, + "latitude": 41.281549, + "longitude": -122.875526, + "city": "Callahan", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96015, + "latitude": 41.458738, + "longitude": -120.80293, + "city": "Canby", + "state": "CA", + "county": "Modoc" + }, + { + "zip_code": 96016, + "latitude": 40.933652, + "longitude": -121.56766, + "city": "Cassel", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96017, + "latitude": 41.110338, + "longitude": -122.316052, + "city": "Castella", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96019, + "latitude": 40.69686, + "longitude": -122.368263, + "city": "Shasta Lake", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96020, + "latitude": 40.277282, + "longitude": -121.200726, + "city": "Chester", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 96021, + "latitude": 40.125399, + "longitude": -122.135411, + "city": "Corning", + "state": "CA", + "county": "Tehama" + }, + { + "zip_code": 96022, + "latitude": 40.439989, + "longitude": -122.429495, + "city": "Cottonwood", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96023, + "latitude": 41.919428, + "longitude": -121.973887, + "city": "Dorris", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96024, + "latitude": 40.668853, + "longitude": -122.942468, + "city": "Douglas City", + "state": "CA", + "county": "Trinity" + }, + { + "zip_code": 96025, + "latitude": 41.45574, + "longitude": -122.390196, + "city": "Dunsmuir", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96027, + "latitude": 41.44631, + "longitude": -123.010024, + "city": "Etna", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96028, + "latitude": 41.034309, + "longitude": -121.471061, + "city": "Fall River Mills", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96029, + "latitude": 39.902424, + "longitude": -122.491767, + "city": "Flournoy", + "state": "CA", + "county": "Tehama" + }, + { + "zip_code": 96031, + "latitude": 41.219117, + "longitude": -123.23633, + "city": "Forks Of Salmon", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96032, + "latitude": 41.581383, + "longitude": -122.824847, + "city": "Fort Jones", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96033, + "latitude": 40.689232, + "longitude": -122.58753, + "city": "French Gulch", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96034, + "latitude": 41.441483, + "longitude": -122.699937, + "city": "Gazelle", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96035, + "latitude": 40.049209, + "longitude": -122.209437, + "city": "Gerber", + "state": "CA", + "county": "Tehama" + }, + { + "zip_code": 96037, + "latitude": 41.540332, + "longitude": -122.936575, + "city": "Greenview", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96038, + "latitude": 41.63468, + "longitude": -122.46953, + "city": "Grenada", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96039, + "latitude": 41.666514, + "longitude": -123.421603, + "city": "Happy Camp", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96040, + "latitude": 40.808623, + "longitude": -121.499992, + "city": "Hat Creek", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96041, + "latitude": 40.500622, + "longitude": -123.167247, + "city": "Hayfork", + "state": "CA", + "county": "Trinity" + }, + { + "zip_code": 96044, + "latitude": 41.939792, + "longitude": -122.525589, + "city": "Hornbrook", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96046, + "latitude": 40.613736, + "longitude": -123.448823, + "city": "Hyampom", + "state": "CA", + "county": "Trinity" + }, + { + "zip_code": 96047, + "latitude": 40.478246, + "longitude": -122.722296, + "city": "Igo", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96048, + "latitude": 40.741117, + "longitude": -123.071788, + "city": "Junction City", + "state": "CA", + "county": "Trinity" + }, + { + "zip_code": 96049, + "latitude": 40.709783, + "longitude": -122.311628, + "city": "Redding", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96050, + "latitude": 41.871172, + "longitude": -122.977919, + "city": "Klamath River", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96051, + "latitude": 40.910481, + "longitude": -122.410576, + "city": "Lakehead", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96052, + "latitude": 40.736068, + "longitude": -122.837262, + "city": "Lewiston", + "state": "CA", + "county": "Trinity" + }, + { + "zip_code": 96054, + "latitude": 41.234693, + "longitude": -121.215582, + "city": "Lookout", + "state": "CA", + "county": "Modoc" + }, + { + "zip_code": 96055, + "latitude": 40.039203, + "longitude": -122.13374, + "city": "Los Molinos", + "state": "CA", + "county": "Tehama" + }, + { + "zip_code": 96056, + "latitude": 41.096751, + "longitude": -121.436822, + "city": "Mcarthur", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96057, + "latitude": 41.247548, + "longitude": -122.112813, + "city": "Mccloud", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96058, + "latitude": 41.787881, + "longitude": -121.911394, + "city": "Macdoel", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96059, + "latitude": 40.420879, + "longitude": -121.864689, + "city": "Manton", + "state": "CA", + "county": "Tehama" + }, + { + "zip_code": 96061, + "latitude": 40.343925, + "longitude": -121.503495, + "city": "Mill Creek", + "state": "CA", + "county": "Tehama" + }, + { + "zip_code": 96062, + "latitude": 40.570081, + "longitude": -122.067214, + "city": "Millville", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96063, + "latitude": 40.356403, + "longitude": -121.57102, + "city": "Mineral", + "state": "CA", + "county": "Tehama" + }, + { + "zip_code": 96064, + "latitude": 41.757491, + "longitude": -122.196783, + "city": "Montague", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96065, + "latitude": 40.900945, + "longitude": -121.916728, + "city": "Montgomery Creek", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96067, + "latitude": 41.427158, + "longitude": -122.473307, + "city": "Mount Shasta", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96068, + "latitude": 41.129955, + "longitude": -121.134222, + "city": "Nubieber", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96069, + "latitude": 40.691529, + "longitude": -122.042324, + "city": "Oak Run", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96070, + "latitude": 40.735153, + "longitude": -122.1944, + "city": "Obrien", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96071, + "latitude": 40.658943, + "longitude": -121.449467, + "city": "Old Station", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96073, + "latitude": 40.56844, + "longitude": -122.201552, + "city": "Palo Cedro", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96074, + "latitude": 39.877198, + "longitude": -122.581386, + "city": "Paskenta", + "state": "CA", + "county": "Tehama" + }, + { + "zip_code": 96075, + "latitude": 40.364148, + "longitude": -121.841348, + "city": "Paynes Creek", + "state": "CA", + "county": "Tehama" + }, + { + "zip_code": 96076, + "latitude": 40.375954, + "longitude": -122.936967, + "city": "Platina", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96078, + "latitude": 40.12517, + "longitude": -122.204141, + "city": "Proberta", + "state": "CA", + "county": "Tehama" + }, + { + "zip_code": 96079, + "latitude": 40.686639, + "longitude": -122.334778, + "city": "Shasta Lake", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96080, + "latitude": 40.142907, + "longitude": -122.340888, + "city": "Red Bluff", + "state": "CA", + "county": "Tehama" + }, + { + "zip_code": 96084, + "latitude": 40.762944, + "longitude": -122.171093, + "city": "Round Mountain", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96085, + "latitude": 41.728874, + "longitude": -123.03007, + "city": "Scott Bar", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96086, + "latitude": 41.833921, + "longitude": -123.235079, + "city": "Seiad Valley", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96087, + "latitude": 40.601263, + "longitude": -122.494455, + "city": "Shasta", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96088, + "latitude": 40.488664, + "longitude": -121.960944, + "city": "Shingletown", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96089, + "latitude": 40.657893, + "longitude": -122.427333, + "city": "Shasta Lake", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96090, + "latitude": 40.021383, + "longitude": -122.118643, + "city": "Tehama", + "state": "CA", + "county": "Tehama" + }, + { + "zip_code": 96091, + "latitude": 41.050081, + "longitude": -122.686387, + "city": "Trinity Center", + "state": "CA", + "county": "Trinity" + }, + { + "zip_code": 96092, + "latitude": 39.927203, + "longitude": -122.025047, + "city": "Vina", + "state": "CA", + "county": "Tehama" + }, + { + "zip_code": 96093, + "latitude": 40.704907, + "longitude": -122.956559, + "city": "Weaverville", + "state": "CA", + "county": "Trinity" + }, + { + "zip_code": 96094, + "latitude": 41.6661, + "longitude": -122.408583, + "city": "Weed", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96095, + "latitude": 40.735153, + "longitude": -122.1944, + "city": "Whiskeytown", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96096, + "latitude": 40.575131, + "longitude": -121.86265, + "city": "Whitmore", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96097, + "latitude": 41.623828, + "longitude": -122.440389, + "city": "Yreka", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96099, + "latitude": 40.704337, + "longitude": -122.387808, + "city": "Redding", + "state": "CA", + "county": "Shasta" + }, + { + "zip_code": 96101, + "latitude": 41.433984, + "longitude": -120.640865, + "city": "Alturas", + "state": "CA", + "county": "Modoc" + }, + { + "zip_code": 96103, + "latitude": 39.812686, + "longitude": -120.640497, + "city": "Blairsden-Graeagle", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 96104, + "latitude": 41.42426, + "longitude": -120.111396, + "city": "Cedarville", + "state": "CA", + "county": "Modoc" + }, + { + "zip_code": 96105, + "latitude": 39.794136, + "longitude": -120.132207, + "city": "Chilcoot", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 96106, + "latitude": 39.754627, + "longitude": -120.595092, + "city": "Clio", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 96107, + "latitude": 38.533336, + "longitude": -119.485034, + "city": "Coleville", + "state": "CA", + "county": "Mono" + }, + { + "zip_code": 96108, + "latitude": 41.590548, + "longitude": -120.727706, + "city": "Davis Creek", + "state": "CA", + "county": "Modoc" + }, + { + "zip_code": 96109, + "latitude": 39.962841, + "longitude": -120.20247, + "city": "Doyle", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96110, + "latitude": 41.590548, + "longitude": -120.727706, + "city": "Eagleville", + "state": "CA", + "county": "Modoc" + }, + { + "zip_code": 96111, + "latitude": 39.392752, + "longitude": -120.021212, + "city": "Floriston", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 96112, + "latitude": 41.590548, + "longitude": -120.727706, + "city": "Fort Bidwell", + "state": "CA", + "county": "Modoc" + }, + { + "zip_code": 96113, + "latitude": 40.101514, + "longitude": -120.244727, + "city": "Herlong", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96114, + "latitude": 40.298255, + "longitude": -120.506184, + "city": "Janesville", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96115, + "latitude": 41.763674, + "longitude": -120.179132, + "city": "Lake City", + "state": "CA", + "county": "Modoc" + }, + { + "zip_code": 96116, + "latitude": 41.232908, + "longitude": -120.507888, + "city": "Likely", + "state": "CA", + "county": "Modoc" + }, + { + "zip_code": 96117, + "latitude": 40.407309, + "longitude": -120.40921, + "city": "Litchfield", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96118, + "latitude": 39.613008, + "longitude": -120.285676, + "city": "Loyalton", + "state": "CA", + "county": "Sierra" + }, + { + "zip_code": 96119, + "latitude": 40.97664, + "longitude": -120.554754, + "city": "Madeline", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96120, + "latitude": 38.771319, + "longitude": -119.832669, + "city": "Markleeville", + "state": "CA", + "county": "Alpine" + }, + { + "zip_code": 96121, + "latitude": 40.196745, + "longitude": -120.367586, + "city": "Milford", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96122, + "latitude": 39.800456, + "longitude": -120.542224, + "city": "Portola", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 96123, + "latitude": 40.776154, + "longitude": -120.326259, + "city": "Ravendale", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96124, + "latitude": 39.613937, + "longitude": -120.404625, + "city": "Calpine", + "state": "CA", + "county": "Sierra" + }, + { + "zip_code": 96125, + "latitude": 39.593596, + "longitude": -120.626908, + "city": "Sierra City", + "state": "CA", + "county": "Sierra" + }, + { + "zip_code": 96126, + "latitude": 39.582462, + "longitude": -120.371073, + "city": "Sierraville", + "state": "CA", + "county": "Sierra" + }, + { + "zip_code": 96127, + "latitude": 40.446063, + "longitude": -120.664132, + "city": "Susanville", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96128, + "latitude": 40.341664, + "longitude": -120.423118, + "city": "Standish", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96129, + "latitude": 39.772064, + "longitude": -120.405095, + "city": "Beckwourth", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 96130, + "latitude": 40.548881, + "longitude": -120.719159, + "city": "Susanville", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96132, + "latitude": 40.950868, + "longitude": -120.612954, + "city": "Termo", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96133, + "latitude": 38.617086, + "longitude": -119.506094, + "city": "Topaz", + "state": "CA", + "county": "Mono" + }, + { + "zip_code": 96134, + "latitude": 41.93519, + "longitude": -121.58865, + "city": "Tulelake", + "state": "CA", + "county": "Siskiyou" + }, + { + "zip_code": 96135, + "latitude": 40.02349, + "longitude": -120.79861, + "city": "Vinton", + "state": "CA", + "county": "Plumas" + }, + { + "zip_code": 96136, + "latitude": 40.34056, + "longitude": -120.282398, + "city": "Wendel", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96137, + "latitude": 40.303792, + "longitude": -121.022584, + "city": "Westwood", + "state": "CA", + "county": "Lassen" + }, + { + "zip_code": 96140, + "latitude": 39.229978, + "longitude": -120.066235, + "city": "Carnelian Bay", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 96141, + "latitude": 39.122962, + "longitude": -120.178327, + "city": "Homewood", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 96142, + "latitude": 38.998714, + "longitude": -120.107955, + "city": "Tahoma", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 96143, + "latitude": 39.201123, + "longitude": -120.083236, + "city": "Kings Beach", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 96145, + "latitude": 39.163631, + "longitude": -120.131614, + "city": "Tahoe City", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 96146, + "latitude": 39.175186, + "longitude": -120.19544, + "city": "Olympic Valley", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 96148, + "latitude": 39.2226, + "longitude": -120.068988, + "city": "Tahoe Vista", + "state": "CA", + "county": "Placer" + }, + { + "zip_code": 96150, + "latitude": 38.927507, + "longitude": -120.039632, + "city": "South Lake Tahoe", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 96151, + "latitude": 38.90392, + "longitude": -119.995024, + "city": "South Lake Tahoe", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 96152, + "latitude": 38.927149, + "longitude": -119.999032, + "city": "South Lake Tahoe", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 96154, + "latitude": 38.87529, + "longitude": -120.0188, + "city": "South Lake Tahoe", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 96155, + "latitude": 38.844909, + "longitude": -120.042996, + "city": "South Lake Tahoe", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 96156, + "latitude": 38.935245, + "longitude": -119.967631, + "city": "South Lake Tahoe", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 96157, + "latitude": 38.934409, + "longitude": -119.976707, + "city": "South Lake Tahoe", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 96158, + "latitude": 38.898142, + "longitude": -119.998419, + "city": "South Lake Tahoe", + "state": "CA", + "county": "El Dorado" + }, + { + "zip_code": 96160, + "latitude": 39.3781, + "longitude": -120.186383, + "city": "Truckee", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 96161, + "latitude": 39.377677, + "longitude": -120.407502, + "city": "Truckee", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 96162, + "latitude": 39.26599, + "longitude": -120.64145, + "city": "Truckee", + "state": "CA", + "county": "Nevada" + }, + { + "zip_code": 96201, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96202, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96203, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96204, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96205, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96206, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96207, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96208, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96212, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96213, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96214, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96215, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96217, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96218, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96219, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96220, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96221, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96224, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96251, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96257, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96258, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96259, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96260, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96262, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96264, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96266, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96267, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96269, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96271, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96275, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96276, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96278, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96283, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96284, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96297, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96306, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96309, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96310, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96311, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96313, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96319, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96321, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96322, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96323, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96325, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96326, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96328, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96330, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96336, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96337, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96338, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96343, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96347, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96348, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96349, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96350, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96351, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96362, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96364, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96365, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96367, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96368, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96370, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96372, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96373, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96374, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96375, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96376, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96377, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96378, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96379, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96384, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96386, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96387, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96388, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96403, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96490, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96505, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96506, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96507, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96508, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96511, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96512, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96515, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96517, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96518, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96520, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96521, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96522, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96529, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96530, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96531, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96534, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96535, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96536, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96537, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96538, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96539, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96540, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96541, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96542, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96543, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96544, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96545, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96546, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96547, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96548, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96549, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96551, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96552, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96553, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96554, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96555, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96557, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96558, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96575, + "latitude": "", + "longitude": "", + "city": "APO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96580, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96594, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96595, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96596, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96597, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96598, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96599, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96601, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96602, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96603, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96604, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96605, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96606, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96607, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96608, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96609, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96610, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96611, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96612, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96615, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96617, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96621, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96622, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96623, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96624, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96626, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96627, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96628, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96629, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96634, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96635, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96642, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96643, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96644, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96647, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96648, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96649, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96657, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96660, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96661, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96662, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96663, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96664, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96665, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96666, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96667, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96668, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96669, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96670, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96671, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96672, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96673, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96674, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96675, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96676, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96677, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96678, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96679, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96681, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96682, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96683, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96684, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96686, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96687, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96698, + "latitude": "", + "longitude": "", + "city": "FPO", + "state": "AP", + "county": "" + }, + { + "zip_code": 96701, + "latitude": 21.39065, + "longitude": -157.927829, + "city": "Aiea", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96703, + "latitude": 22.055787, + "longitude": -159.454519, + "city": "Anahola", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96704, + "latitude": 19.269226, + "longitude": -155.757929, + "city": "Captain Cook", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96705, + "latitude": 21.937654, + "longitude": -159.645162, + "city": "Eleele", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96706, + "latitude": 21.34455, + "longitude": -158.01395, + "city": "Ewa Beach", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96707, + "latitude": 21.341784, + "longitude": -158.091383, + "city": "Kapolei", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96708, + "latitude": 20.849675, + "longitude": -156.165622, + "city": "Haiku", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96709, + "latitude": 23.573339, + "longitude": -164.701172, + "city": "Kapolei", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96710, + "latitude": 19.911689, + "longitude": -155.148483, + "city": "Hakalau", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96712, + "latitude": 21.63185, + "longitude": -158.03645, + "city": "Haleiwa", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96713, + "latitude": 20.725172, + "longitude": -156.02293, + "city": "Hana", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96714, + "latitude": 22.213592, + "longitude": -159.482796, + "city": "Hanalei", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96715, + "latitude": 21.979991, + "longitude": -159.512392, + "city": "Hanamaulu", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96716, + "latitude": 22.020489, + "longitude": -159.617765, + "city": "Hanapepe", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96717, + "latitude": 21.583507, + "longitude": -157.882511, + "city": "Hauula", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96718, + "latitude": 19.593456, + "longitude": -155.438015, + "city": "Hawaii National Park", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96719, + "latitude": 20.222737, + "longitude": -155.818291, + "city": "Hawi", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96720, + "latitude": 19.564519, + "longitude": -155.26203, + "city": "Hilo", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96721, + "latitude": 19.593456, + "longitude": -155.438015, + "city": "Hilo", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96722, + "latitude": 22.219231, + "longitude": -159.486562, + "city": "Princeville", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96725, + "latitude": 19.618904, + "longitude": -155.948308, + "city": "Holualoa", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96726, + "latitude": 19.278298, + "longitude": -155.845329, + "city": "Honaunau", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96727, + "latitude": 20.079156, + "longitude": -155.507938, + "city": "Honokaa", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96728, + "latitude": 19.593456, + "longitude": -155.438015, + "city": "Honomu", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96729, + "latitude": 21.163056, + "longitude": -157.0766, + "city": "Hoolehua", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96730, + "latitude": 21.585127, + "longitude": -157.883316, + "city": "Kaaawa", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96731, + "latitude": 21.6277, + "longitude": -157.935304, + "city": "Kahuku", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96732, + "latitude": 20.859244, + "longitude": -156.259166, + "city": "Kahului", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96733, + "latitude": 20.866638, + "longitude": -156.646667, + "city": "Kahului", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96734, + "latitude": 21.595644, + "longitude": -158.039121, + "city": "Kailua", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96737, + "latitude": 19.100167, + "longitude": -155.725803, + "city": "Ocean View", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96738, + "latitude": 19.972371, + "longitude": -155.817987, + "city": "Waikoloa", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96739, + "latitude": 19.593456, + "longitude": -155.438015, + "city": "Keauhou", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96740, + "latitude": 19.674123, + "longitude": -155.936565, + "city": "Kailua Kona", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96741, + "latitude": 21.925909, + "longitude": -159.530254, + "city": "Kalaheo", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96742, + "latitude": 20.866638, + "longitude": -156.646667, + "city": "Kalaupapa", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96743, + "latitude": 19.887872, + "longitude": -155.751907, + "city": "Kamuela", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96744, + "latitude": 21.66875, + "longitude": -157.93955, + "city": "Kaneohe", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96745, + "latitude": 19.593456, + "longitude": -155.438015, + "city": "Kailua Kona", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96746, + "latitude": 22.074197, + "longitude": -159.406197, + "city": "Kapaa", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96747, + "latitude": 21.945428, + "longitude": -159.921351, + "city": "Kaumakani", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96748, + "latitude": 21.092266, + "longitude": -157.012533, + "city": "Kaunakakai", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96749, + "latitude": 19.581873, + "longitude": -155.032104, + "city": "Keaau", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96750, + "latitude": 19.343913, + "longitude": -155.874923, + "city": "Kealakekua", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96751, + "latitude": 22.105955, + "longitude": -159.308471, + "city": "Kealia", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96752, + "latitude": 21.971285, + "longitude": -159.713792, + "city": "Kekaha", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96753, + "latitude": 20.723542, + "longitude": -156.469915, + "city": "Kihei", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96754, + "latitude": 22.207314, + "longitude": -159.395386, + "city": "Kilauea", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96755, + "latitude": 20.226101, + "longitude": -155.776957, + "city": "Kapaau", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96756, + "latitude": 22.028379, + "longitude": -159.432992, + "city": "Koloa", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96757, + "latitude": 21.16101, + "longitude": -157.02544, + "city": "Kualapuu", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96759, + "latitude": 21.463, + "longitude": -158.06385, + "city": "Kunia", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96760, + "latitude": 19.569277, + "longitude": -155.034859, + "city": "Kurtistown", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96761, + "latitude": 20.919823, + "longitude": -156.717614, + "city": "Lahaina", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96762, + "latitude": 21.61095, + "longitude": -157.90205, + "city": "Laie", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96763, + "latitude": 20.812854, + "longitude": -156.95283, + "city": "Lanai City", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96764, + "latitude": 19.985166, + "longitude": -155.248429, + "city": "Laupahoehoe", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96765, + "latitude": 21.930922, + "longitude": -159.499342, + "city": "Lawai", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96766, + "latitude": 22.070553, + "longitude": -159.430328, + "city": "Lihue", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96767, + "latitude": 20.866638, + "longitude": -156.646667, + "city": "Lahaina", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96768, + "latitude": 20.832664, + "longitude": -156.320242, + "city": "Makawao", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96769, + "latitude": 21.945428, + "longitude": -159.921351, + "city": "Makaweli", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96770, + "latitude": 21.176357, + "longitude": -157.257157, + "city": "Maunaloa", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96771, + "latitude": 19.534945, + "longitude": -155.125657, + "city": "Mountain View", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96772, + "latitude": 19.052137, + "longitude": -155.622528, + "city": "Naalehu", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96773, + "latitude": 19.935047, + "longitude": -155.166821, + "city": "Ninole", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96774, + "latitude": 20.01506, + "longitude": -155.280974, + "city": "Ookala", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96775, + "latitude": 19.593456, + "longitude": -155.438015, + "city": "Paauhau", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96776, + "latitude": 20.035356, + "longitude": -155.377961, + "city": "Paauilo", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96777, + "latitude": 19.593456, + "longitude": -155.438015, + "city": "Pahala", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96778, + "latitude": 19.390023, + "longitude": -155.152268, + "city": "Pahoa", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96779, + "latitude": 20.904275, + "longitude": -156.373506, + "city": "Paia", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96780, + "latitude": 19.964138, + "longitude": -155.201267, + "city": "Papaaloa", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96781, + "latitude": 19.798878, + "longitude": -155.116093, + "city": "Papaikou", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96782, + "latitude": 21.51195, + "longitude": -157.994662, + "city": "Pearl City", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96783, + "latitude": 19.819475, + "longitude": -155.106308, + "city": "Pepeekeo", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96784, + "latitude": 20.866638, + "longitude": -156.646667, + "city": "Puunene", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96785, + "latitude": 19.440523, + "longitude": -155.250569, + "city": "Volcano", + "state": "HI", + "county": "Hawaii" + }, + { + "zip_code": 96786, + "latitude": 21.5324, + "longitude": -158.047735, + "city": "Wahiawa", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96788, + "latitude": 20.855864, + "longitude": -156.325923, + "city": "Pukalani", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96789, + "latitude": 21.458855, + "longitude": -158.012322, + "city": "Mililani", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96790, + "latitude": 20.753763, + "longitude": -156.329499, + "city": "Kula", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96791, + "latitude": 21.55325, + "longitude": -158.163415, + "city": "Waialua", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96792, + "latitude": 21.437389, + "longitude": -158.181356, + "city": "Waianae", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96793, + "latitude": 20.901536, + "longitude": -156.566493, + "city": "Wailuku", + "state": "HI", + "county": "Maui" + }, + { + "zip_code": 96795, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Waimanalo", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96796, + "latitude": 21.966709, + "longitude": -159.686193, + "city": "Waimea", + "state": "HI", + "county": "Kauai" + }, + { + "zip_code": 96797, + "latitude": 21.399548, + "longitude": -158.015151, + "city": "Waipahu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96799, + "latitude": -7.209975, + "longitude": -170.7716, + "city": "Pago Pago", + "state": "AS", + "county": "American Samoa" + }, + { + "zip_code": 96801, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96802, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96803, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96804, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96805, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96806, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96807, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96808, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96809, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96810, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96811, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96812, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96813, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96814, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96815, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96816, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96817, + "latitude": 21.65098, + "longitude": -157.922303, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96818, + "latitude": 21.347951, + "longitude": -157.93965, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96819, + "latitude": 21.373179, + "longitude": -157.901979, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96820, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96821, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96822, + "latitude": 21.67115, + "longitude": -157.94085, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96823, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96824, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96825, + "latitude": 21.670926, + "longitude": -157.940731, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96826, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96827, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96828, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96830, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96835, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96836, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96837, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96838, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96839, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96840, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96841, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96842, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96843, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96844, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96845, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96846, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96847, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96848, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96849, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96850, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Honolulu", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96853, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Hickam Afb", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96854, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Wheeler Army Airfield", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96857, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Schofield Barracks", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96858, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Fort Shafter", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96859, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Tripler Army Medical Ctr", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96860, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Pearl Harbor", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96861, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Camp H M Smith", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96862, + "latitude": 21.319, + "longitude": -158.0749, + "city": "Barbers Point", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96863, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "M C B H Kaneohe Bay", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96898, + "latitude": 24.859832, + "longitude": -168.021815, + "city": "Wake Island", + "state": "HI", + "county": "Honolulu" + }, + { + "zip_code": 96910, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Hagatna", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96911, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Tamuning", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96912, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Dededo", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96913, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Barrigada", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96914, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Yona", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96915, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Santa Rita", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96916, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Merizo", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96917, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Inarajan", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96918, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Umatac", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96919, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Agana Heights", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96921, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Barrigada", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96922, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Asan", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96923, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Mangilao", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96925, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Piti", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96926, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Sinajana", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96927, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Mongmong", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96928, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Agat", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96929, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Yigo", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96930, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Talofofo", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96931, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Tamuning", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96932, + "latitude": 13.444257, + "longitude": 144.786297, + "city": "Hagatna", + "state": "GU", + "county": "Guam" + }, + { + "zip_code": 96940, + "latitude": 7.225664, + "longitude": 134.362169, + "city": "Palau", + "state": "PW", + "county": "Palau" + }, + { + "zip_code": 96941, + "latitude": 7.138297, + "longitude": 151.503116, + "city": "Pohnpei", + "state": "FM", + "county": "Federated States Of Micro" + }, + { + "zip_code": 96942, + "latitude": 7.138297, + "longitude": 151.503116, + "city": "Chuuk", + "state": "FM", + "county": "Federated States Of Micro" + }, + { + "zip_code": 96943, + "latitude": 7.138297, + "longitude": 151.503116, + "city": "Yap", + "state": "FM", + "county": "Federated States Of Micro" + }, + { + "zip_code": 96944, + "latitude": 7.138297, + "longitude": 151.503116, + "city": "Kosrae", + "state": "FM", + "county": "Federated States Of Micro" + }, + { + "zip_code": 96950, + "latitude": 15.190135, + "longitude": 145.740804, + "city": "Saipan", + "state": "MP", + "county": "Northern Mariana Islands" + }, + { + "zip_code": 96951, + "latitude": 15.190135, + "longitude": 145.740804, + "city": "Rota", + "state": "MP", + "county": "Northern Mariana Islands" + }, + { + "zip_code": 96952, + "latitude": 15.190135, + "longitude": 145.740804, + "city": "Tinian", + "state": "MP", + "county": "Northern Mariana Islands" + }, + { + "zip_code": 96960, + "latitude": 11.140496, + "longitude": 166.410291, + "city": "Majuro", + "state": "MH", + "county": "Marshall Islands" + }, + { + "zip_code": 96970, + "latitude": 11.140496, + "longitude": 166.410291, + "city": "Ebeye", + "state": "MH", + "county": "Marshall Islands" + }, + { + "zip_code": 97001, + "latitude": 45.263301, + "longitude": -121.088513, + "city": "Antelope", + "state": "OR", + "county": "Wasco" + }, + { + "zip_code": 97002, + "latitude": 45.224241, + "longitude": -122.8198, + "city": "Aurora", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97004, + "latitude": 45.247636, + "longitude": -122.468991, + "city": "Beavercreek", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97005, + "latitude": 45.496289, + "longitude": -122.800146, + "city": "Beaverton", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97006, + "latitude": 45.52013, + "longitude": -122.860376, + "city": "Beaverton", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97007, + "latitude": 45.450489, + "longitude": -122.865171, + "city": "Beaverton", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97008, + "latitude": 45.45602, + "longitude": -122.799559, + "city": "Beaverton", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97009, + "latitude": 45.411842, + "longitude": -122.37642, + "city": "Boring", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97010, + "latitude": 45.582981, + "longitude": -122.101103, + "city": "Bridal Veil", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97011, + "latitude": 45.359095, + "longitude": -121.998736, + "city": "Brightwood", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97013, + "latitude": 45.214288, + "longitude": -122.661593, + "city": "Canby", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97014, + "latitude": 45.671017, + "longitude": -121.868565, + "city": "Cascade Locks", + "state": "OR", + "county": "Hood River" + }, + { + "zip_code": 97015, + "latitude": 45.415038, + "longitude": -122.499461, + "city": "Clackamas", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97016, + "latitude": 46.066499, + "longitude": -123.205886, + "city": "Clatskanie", + "state": "OR", + "county": "Columbia" + }, + { + "zip_code": 97017, + "latitude": 45.1887, + "longitude": -122.397774, + "city": "Colton", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97018, + "latitude": 45.892304, + "longitude": -122.814191, + "city": "Columbia City", + "state": "OR", + "county": "Columbia" + }, + { + "zip_code": 97019, + "latitude": 45.51827, + "longitude": -122.229299, + "city": "Corbett", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97020, + "latitude": 45.219924, + "longitude": -122.840536, + "city": "Donald", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97021, + "latitude": 45.391278, + "longitude": -121.143152, + "city": "Dufur", + "state": "OR", + "county": "Wasco" + }, + { + "zip_code": 97022, + "latitude": 45.346076, + "longitude": -122.312496, + "city": "Eagle Creek", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97023, + "latitude": 45.226738, + "longitude": -122.247547, + "city": "Estacada", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97024, + "latitude": 45.544407, + "longitude": -122.53636, + "city": "Fairview", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97026, + "latitude": 45.120045, + "longitude": -122.935106, + "city": "Gervais", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97027, + "latitude": 45.390442, + "longitude": -122.59322, + "city": "Gladstone", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97028, + "latitude": 45.297173, + "longitude": -121.739004, + "city": "Government Camp", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97029, + "latitude": 45.306543, + "longitude": -120.797313, + "city": "Grass Valley", + "state": "OR", + "county": "Sherman" + }, + { + "zip_code": 97030, + "latitude": 45.508117, + "longitude": -122.430233, + "city": "Gresham", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97031, + "latitude": 45.638312, + "longitude": -121.677126, + "city": "Hood River", + "state": "OR", + "county": "Hood River" + }, + { + "zip_code": 97032, + "latitude": 45.1969, + "longitude": -122.812012, + "city": "Hubbard", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97033, + "latitude": 45.237277, + "longitude": -120.626298, + "city": "Kent", + "state": "OR", + "county": "Sherman" + }, + { + "zip_code": 97034, + "latitude": 45.408374, + "longitude": -122.691388, + "city": "Lake Oswego", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97035, + "latitude": 45.408077, + "longitude": -122.723058, + "city": "Lake Oswego", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97036, + "latitude": 45.173284, + "longitude": -122.259861, + "city": "Marylhurst", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97037, + "latitude": 45.155868, + "longitude": -121.338132, + "city": "Maupin", + "state": "OR", + "county": "Wasco" + }, + { + "zip_code": 97038, + "latitude": 45.078408, + "longitude": -122.565028, + "city": "Molalla", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97039, + "latitude": 45.502564, + "longitude": -120.684499, + "city": "Moro", + "state": "OR", + "county": "Sherman" + }, + { + "zip_code": 97040, + "latitude": 45.65079, + "longitude": -121.37902, + "city": "Mosier", + "state": "OR", + "county": "Wasco" + }, + { + "zip_code": 97041, + "latitude": 45.492879, + "longitude": -121.598308, + "city": "Mount Hood Parkdale", + "state": "OR", + "county": "Hood River" + }, + { + "zip_code": 97042, + "latitude": 45.201439, + "longitude": -122.537939, + "city": "Mulino", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97044, + "latitude": 45.643738, + "longitude": -121.536658, + "city": "Odell", + "state": "OR", + "county": "Hood River" + }, + { + "zip_code": 97045, + "latitude": 45.317893, + "longitude": -122.523602, + "city": "Oregon City", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97048, + "latitude": 46.038342, + "longitude": -122.972651, + "city": "Rainier", + "state": "OR", + "county": "Columbia" + }, + { + "zip_code": 97049, + "latitude": 45.346537, + "longitude": -121.915134, + "city": "Rhododendron", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97050, + "latitude": 45.647067, + "longitude": -120.76413, + "city": "Rufus", + "state": "OR", + "county": "Sherman" + }, + { + "zip_code": 97051, + "latitude": 45.887794, + "longitude": -122.919935, + "city": "Saint Helens", + "state": "OR", + "county": "Columbia" + }, + { + "zip_code": 97053, + "latitude": 45.824213, + "longitude": -122.874601, + "city": "Warren", + "state": "OR", + "county": "Columbia" + }, + { + "zip_code": 97054, + "latitude": 45.942286, + "longitude": -122.919248, + "city": "Deer Island", + "state": "OR", + "county": "Columbia" + }, + { + "zip_code": 97055, + "latitude": 45.388551, + "longitude": -122.172544, + "city": "Sandy", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97056, + "latitude": 45.811578, + "longitude": -122.974184, + "city": "Scappoose", + "state": "OR", + "county": "Columbia" + }, + { + "zip_code": 97057, + "latitude": 45.263301, + "longitude": -121.088513, + "city": "Shaniko", + "state": "OR", + "county": "Wasco" + }, + { + "zip_code": 97058, + "latitude": 45.554978, + "longitude": -121.18703, + "city": "The Dalles", + "state": "OR", + "county": "Wasco" + }, + { + "zip_code": 97060, + "latitude": 45.525007, + "longitude": -122.390049, + "city": "Troutdale", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97062, + "latitude": 45.366608, + "longitude": -122.783887, + "city": "Tualatin", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97063, + "latitude": 45.297105, + "longitude": -121.233727, + "city": "Tygh Valley", + "state": "OR", + "county": "Wasco" + }, + { + "zip_code": 97064, + "latitude": 45.888246, + "longitude": -123.209056, + "city": "Vernonia", + "state": "OR", + "county": "Columbia" + }, + { + "zip_code": 97065, + "latitude": 45.403298, + "longitude": -120.710276, + "city": "Wasco", + "state": "OR", + "county": "Sherman" + }, + { + "zip_code": 97067, + "latitude": 45.327305, + "longitude": -121.973561, + "city": "Welches", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97068, + "latitude": 45.343615, + "longitude": -122.664926, + "city": "West Linn", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97070, + "latitude": 45.308493, + "longitude": -122.785518, + "city": "Wilsonville", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97071, + "latitude": 45.148007, + "longitude": -122.876205, + "city": "Woodburn", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97075, + "latitude": 45.548616, + "longitude": -123.114725, + "city": "Beaverton", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97076, + "latitude": 45.548616, + "longitude": -123.114725, + "city": "Beaverton", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97077, + "latitude": 45.548616, + "longitude": -123.114725, + "city": "Beaverton", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97078, + "latitude": 45.451976, + "longitude": -122.789257, + "city": "Beaverton", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97080, + "latitude": 45.481252, + "longitude": -122.38675, + "city": "Gresham", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97101, + "latitude": 45.121454, + "longitude": -123.191368, + "city": "Amity", + "state": "OR", + "county": "Yamhill" + }, + { + "zip_code": 97102, + "latitude": 45.810934, + "longitude": -123.962989, + "city": "Arch Cape", + "state": "OR", + "county": "Clatsop" + }, + { + "zip_code": 97103, + "latitude": 46.142206, + "longitude": -123.795996, + "city": "Astoria", + "state": "OR", + "county": "Clatsop" + }, + { + "zip_code": 97106, + "latitude": 45.594526, + "longitude": -123.138952, + "city": "Banks", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97107, + "latitude": 45.609399, + "longitude": -123.894297, + "city": "Bay City", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97108, + "latitude": 45.278621, + "longitude": -123.746717, + "city": "Beaver", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97109, + "latitude": 45.728555, + "longitude": -123.177864, + "city": "Buxton", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97110, + "latitude": 45.946617, + "longitude": -123.931458, + "city": "Cannon Beach", + "state": "OR", + "county": "Clatsop" + }, + { + "zip_code": 97111, + "latitude": 45.282393, + "longitude": -123.218624, + "city": "Carlton", + "state": "OR", + "county": "Yamhill" + }, + { + "zip_code": 97112, + "latitude": 45.21636, + "longitude": -123.876339, + "city": "Cloverdale", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97113, + "latitude": 45.600635, + "longitude": -122.920629, + "city": "Cornelius", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97114, + "latitude": 45.187141, + "longitude": -123.077797, + "city": "Dayton", + "state": "OR", + "county": "Yamhill" + }, + { + "zip_code": 97115, + "latitude": 45.27237, + "longitude": -123.02067, + "city": "Dundee", + "state": "OR", + "county": "Yamhill" + }, + { + "zip_code": 97116, + "latitude": 45.598052, + "longitude": -123.1818, + "city": "Forest Grove", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97117, + "latitude": 45.604204, + "longitude": -123.26958, + "city": "Gales Creek", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97118, + "latitude": 45.562572, + "longitude": -123.900072, + "city": "Garibaldi", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97119, + "latitude": 45.466171, + "longitude": -123.149974, + "city": "Gaston", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97121, + "latitude": 46.182894, + "longitude": -123.95135, + "city": "Hammond", + "state": "OR", + "county": "Clatsop" + }, + { + "zip_code": 97122, + "latitude": 45.176795, + "longitude": -123.846, + "city": "Hebo", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97123, + "latitude": 45.458397, + "longitude": -122.977963, + "city": "Hillsboro", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97124, + "latitude": 45.62337, + "longitude": -122.953316, + "city": "Hillsboro", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97125, + "latitude": 45.659193, + "longitude": -123.191739, + "city": "Manning", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97127, + "latitude": 45.232882, + "longitude": -123.110948, + "city": "Lafayette", + "state": "OR", + "county": "Yamhill" + }, + { + "zip_code": 97128, + "latitude": 45.187444, + "longitude": -123.237145, + "city": "Mcminnville", + "state": "OR", + "county": "Yamhill" + }, + { + "zip_code": 97130, + "latitude": 45.736552, + "longitude": -123.923108, + "city": "Manzanita", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97131, + "latitude": 45.651933, + "longitude": -123.853529, + "city": "Nehalem", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97132, + "latitude": 45.329475, + "longitude": -122.981045, + "city": "Newberg", + "state": "OR", + "county": "Yamhill" + }, + { + "zip_code": 97133, + "latitude": 45.668573, + "longitude": -123.028124, + "city": "North Plains", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97134, + "latitude": 45.454855, + "longitude": -123.965029, + "city": "Oceanside", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97135, + "latitude": 45.204976, + "longitude": -123.95897, + "city": "Pacific City", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97136, + "latitude": 45.635205, + "longitude": -123.913048, + "city": "Rockaway Beach", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97137, + "latitude": 45.208263, + "longitude": -122.948636, + "city": "Saint Paul", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97138, + "latitude": 45.97677, + "longitude": -123.857394, + "city": "Seaside", + "state": "OR", + "county": "Clatsop" + }, + { + "zip_code": 97140, + "latitude": 45.371478, + "longitude": -122.874613, + "city": "Sherwood", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97141, + "latitude": 45.461952, + "longitude": -123.740874, + "city": "Tillamook", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97143, + "latitude": 45.434049, + "longitude": -123.945785, + "city": "Netarts", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97144, + "latitude": 45.740988, + "longitude": -123.299311, + "city": "Timber", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97145, + "latitude": 45.866346, + "longitude": -123.959518, + "city": "Tolovana Park", + "state": "OR", + "county": "Clatsop" + }, + { + "zip_code": 97146, + "latitude": 46.125267, + "longitude": -123.905174, + "city": "Warrenton", + "state": "OR", + "county": "Clatsop" + }, + { + "zip_code": 97147, + "latitude": 45.397283, + "longitude": -123.916076, + "city": "Wheeler", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97148, + "latitude": 45.351892, + "longitude": -123.23484, + "city": "Yamhill", + "state": "OR", + "county": "Yamhill" + }, + { + "zip_code": 97149, + "latitude": 45.097011, + "longitude": -123.943418, + "city": "Neskowin", + "state": "OR", + "county": "Tillamook" + }, + { + "zip_code": 97201, + "latitude": 45.498931, + "longitude": -122.693157, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97202, + "latitude": 45.48169, + "longitude": -122.637331, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97203, + "latitude": 45.604838, + "longitude": -122.743737, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97204, + "latitude": 45.51809, + "longitude": -122.675106, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97205, + "latitude": 45.51949, + "longitude": -122.690157, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97206, + "latitude": 45.483341, + "longitude": -122.596154, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97207, + "latitude": 45.480324, + "longitude": -122.711117, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97208, + "latitude": 45.532165, + "longitude": -122.564824, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97209, + "latitude": 45.53199, + "longitude": -122.683826, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97210, + "latitude": 45.547339, + "longitude": -122.732358, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97211, + "latitude": 45.577289, + "longitude": -122.615906, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97212, + "latitude": 45.54374, + "longitude": -122.643106, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97213, + "latitude": 45.53909, + "longitude": -122.599751, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97214, + "latitude": 45.51444, + "longitude": -122.642305, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97215, + "latitude": 45.51894, + "longitude": -122.599104, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97216, + "latitude": 45.515341, + "longitude": -122.558003, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97217, + "latitude": 45.594589, + "longitude": -122.704308, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97218, + "latitude": 45.575689, + "longitude": -122.605205, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97219, + "latitude": 45.45509, + "longitude": -122.696724, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97220, + "latitude": 45.55634, + "longitude": -122.556104, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97221, + "latitude": 45.50655, + "longitude": -122.733888, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97222, + "latitude": 45.437341, + "longitude": -122.614703, + "city": "Portland", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97223, + "latitude": 45.44739, + "longitude": -122.795294, + "city": "Portland", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97224, + "latitude": 45.409448, + "longitude": -122.8014, + "city": "Portland", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97225, + "latitude": 45.498473, + "longitude": -122.778659, + "city": "Portland", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97227, + "latitude": 45.545039, + "longitude": -122.680007, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97228, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97229, + "latitude": 45.548317, + "longitude": -122.827561, + "city": "Portland", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97230, + "latitude": 45.547173, + "longitude": -122.500053, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97231, + "latitude": 45.652987, + "longitude": -122.839778, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97232, + "latitude": 45.52369, + "longitude": -122.642655, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97233, + "latitude": 45.515121, + "longitude": -122.496052, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97236, + "latitude": 45.484594, + "longitude": -122.504175, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97238, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97240, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97242, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97251, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97253, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97254, + "latitude": 45.596678, + "longitude": -122.59418, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97255, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97256, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97258, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97259, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97266, + "latitude": 45.482949, + "longitude": -122.557502, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97267, + "latitude": 45.402142, + "longitude": -122.614353, + "city": "Portland", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97268, + "latitude": 45.173284, + "longitude": -122.259861, + "city": "Portland", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97269, + "latitude": 45.173284, + "longitude": -122.259861, + "city": "Portland", + "state": "OR", + "county": "Clackamas" + }, + { + "zip_code": 97271, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97272, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97280, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97281, + "latitude": 45.548616, + "longitude": -123.114725, + "city": "Portland", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97282, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97283, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97286, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97290, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97291, + "latitude": 45.548616, + "longitude": -123.114725, + "city": "Portland", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97292, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97293, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97294, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97296, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97298, + "latitude": 45.548616, + "longitude": -123.114725, + "city": "Portland", + "state": "OR", + "county": "Washington" + }, + { + "zip_code": 97299, + "latitude": 45.580557, + "longitude": -122.374776, + "city": "Portland", + "state": "OR", + "county": "Multnomah" + }, + { + "zip_code": 97301, + "latitude": 44.90472, + "longitude": -122.921721, + "city": "Salem", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97302, + "latitude": 44.890486, + "longitude": -123.082192, + "city": "Salem", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97303, + "latitude": 44.992731, + "longitude": -123.01672, + "city": "Salem", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97304, + "latitude": 44.99351, + "longitude": -123.107442, + "city": "Salem", + "state": "OR", + "county": "Polk" + }, + { + "zip_code": 97305, + "latitude": 44.996133, + "longitude": -122.91239, + "city": "Salem", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97306, + "latitude": 44.856786, + "longitude": -123.088297, + "city": "Salem", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97307, + "latitude": 44.984465, + "longitude": -122.457024, + "city": "Keizer", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97308, + "latitude": 44.984465, + "longitude": -122.457024, + "city": "Salem", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97309, + "latitude": 44.984465, + "longitude": -122.457024, + "city": "Salem", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97310, + "latitude": 44.927141, + "longitude": -122.986105, + "city": "Salem", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97311, + "latitude": 44.943841, + "longitude": -123.028607, + "city": "Salem", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97312, + "latitude": 44.936357, + "longitude": -123.038116, + "city": "Salem", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97313, + "latitude": 44.984941, + "longitude": -122.998756, + "city": "Salem", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97314, + "latitude": 44.965541, + "longitude": -123.006606, + "city": "Salem", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97321, + "latitude": 44.594489, + "longitude": -122.581676, + "city": "Albany", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97324, + "latitude": 44.377113, + "longitude": -123.588271, + "city": "Alsea", + "state": "OR", + "county": "Benton" + }, + { + "zip_code": 97325, + "latitude": 44.799503, + "longitude": -122.900739, + "city": "Aumsville", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97326, + "latitude": 44.638187, + "longitude": -123.538238, + "city": "Blodgett", + "state": "OR", + "county": "Benton" + }, + { + "zip_code": 97327, + "latitude": 44.378703, + "longitude": -122.942438, + "city": "Brownsville", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97329, + "latitude": 44.399487, + "longitude": -122.363606, + "city": "Cascadia", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97330, + "latitude": 44.639931, + "longitude": -123.275969, + "city": "Corvallis", + "state": "OR", + "county": "Benton" + }, + { + "zip_code": 97331, + "latitude": 44.565613, + "longitude": -123.278957, + "city": "Corvallis", + "state": "OR", + "county": "Benton" + }, + { + "zip_code": 97333, + "latitude": 44.467218, + "longitude": -123.337762, + "city": "Corvallis", + "state": "OR", + "county": "Benton" + }, + { + "zip_code": 97335, + "latitude": 44.634439, + "longitude": -122.893292, + "city": "Crabtree", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97336, + "latitude": 44.359301, + "longitude": -122.850752, + "city": "Crawfordsville", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97338, + "latitude": 44.928092, + "longitude": -123.337291, + "city": "Dallas", + "state": "OR", + "county": "Polk" + }, + { + "zip_code": 97339, + "latitude": 44.49893, + "longitude": -123.445033, + "city": "Corvallis", + "state": "OR", + "county": "Benton" + }, + { + "zip_code": 97341, + "latitude": 44.832205, + "longitude": -124.050272, + "city": "Depoe Bay", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97342, + "latitude": 44.735834, + "longitude": -122.066865, + "city": "Detroit", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97343, + "latitude": 44.604237, + "longitude": -123.736099, + "city": "Eddyville", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97344, + "latitude": 44.870977, + "longitude": -123.473276, + "city": "Falls City", + "state": "OR", + "county": "Polk" + }, + { + "zip_code": 97345, + "latitude": 44.430866, + "longitude": -122.400143, + "city": "Foster", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97346, + "latitude": 44.762578, + "longitude": -122.372622, + "city": "Gates", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97347, + "latitude": 45.053757, + "longitude": -123.648356, + "city": "Grand Ronde", + "state": "OR", + "county": "Polk" + }, + { + "zip_code": 97348, + "latitude": 44.385837, + "longitude": -123.115961, + "city": "Halsey", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97350, + "latitude": 44.700127, + "longitude": -122.074043, + "city": "Idanha", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97351, + "latitude": 44.836951, + "longitude": -123.165523, + "city": "Independence", + "state": "OR", + "county": "Polk" + }, + { + "zip_code": 97352, + "latitude": 44.768025, + "longitude": -123.003516, + "city": "Jefferson", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97355, + "latitude": 44.526381, + "longitude": -122.827457, + "city": "Lebanon", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97357, + "latitude": 44.70824, + "longitude": -123.805124, + "city": "Logsden", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97358, + "latitude": 44.749921, + "longitude": -122.594993, + "city": "Lyons", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97359, + "latitude": 44.984465, + "longitude": -122.457024, + "city": "Marion", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97360, + "latitude": 44.621679, + "longitude": -122.5785, + "city": "Mill City", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97361, + "latitude": 44.808768, + "longitude": -123.326075, + "city": "Monmouth", + "state": "OR", + "county": "Polk" + }, + { + "zip_code": 97362, + "latitude": 44.934698, + "longitude": -122.655118, + "city": "Mount Angel", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97364, + "latitude": 44.99821, + "longitude": -123.974717, + "city": "Neotsu", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97365, + "latitude": 44.552413, + "longitude": -124.024426, + "city": "Newport", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97366, + "latitude": 44.574645, + "longitude": -124.043287, + "city": "South Beach", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97367, + "latitude": 44.908891, + "longitude": -123.98885, + "city": "Lincoln City", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97368, + "latitude": 45.002157, + "longitude": -123.905622, + "city": "Otis", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97369, + "latitude": 44.758819, + "longitude": -124.06328, + "city": "Otter Rock", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97370, + "latitude": 44.555144, + "longitude": -123.439249, + "city": "Philomath", + "state": "OR", + "county": "Benton" + }, + { + "zip_code": 97371, + "latitude": 44.991024, + "longitude": -123.209356, + "city": "Rickreall", + "state": "OR", + "county": "Polk" + }, + { + "zip_code": 97372, + "latitude": 44.659979, + "longitude": -123.892016, + "city": "Rose Lodge", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97373, + "latitude": 44.984465, + "longitude": -122.457024, + "city": "Saint Benedict", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97374, + "latitude": 44.689609, + "longitude": -122.748639, + "city": "Scio", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97375, + "latitude": 44.989702, + "longitude": -122.618718, + "city": "Scotts Mills", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97376, + "latitude": 44.487404, + "longitude": -123.956719, + "city": "Seal Rock", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97377, + "latitude": 44.435988, + "longitude": -123.106034, + "city": "Shedd", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97378, + "latitude": 45.145945, + "longitude": -123.385904, + "city": "Sheridan", + "state": "OR", + "county": "Yamhill" + }, + { + "zip_code": 97380, + "latitude": 44.746459, + "longitude": -123.84463, + "city": "Siletz", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97381, + "latitude": 44.954501, + "longitude": -122.748442, + "city": "Silverton", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97383, + "latitude": 44.807707, + "longitude": -122.726619, + "city": "Stayton", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97384, + "latitude": 44.790267, + "longitude": -122.618719, + "city": "Mehama", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97385, + "latitude": 44.886618, + "longitude": -122.740264, + "city": "Sublimity", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97386, + "latitude": 44.380262, + "longitude": -122.698954, + "city": "Sweet Home", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97388, + "latitude": 44.885, + "longitude": -123.994219, + "city": "Gleneden Beach", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97389, + "latitude": 44.533934, + "longitude": -123.081664, + "city": "Tangent", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97390, + "latitude": 44.36178, + "longitude": -123.891668, + "city": "Tidewater", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97391, + "latitude": 44.65719, + "longitude": -123.932758, + "city": "Toledo", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97392, + "latitude": 44.7952, + "longitude": -122.94221, + "city": "Turner", + "state": "OR", + "county": "Marion" + }, + { + "zip_code": 97394, + "latitude": 44.395907, + "longitude": -123.980384, + "city": "Waldport", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97396, + "latitude": 45.145011, + "longitude": -123.523136, + "city": "Willamina", + "state": "OR", + "county": "Yamhill" + }, + { + "zip_code": 97401, + "latitude": 44.117868, + "longitude": -123.074193, + "city": "Eugene", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97402, + "latitude": 44.033642, + "longitude": -123.073186, + "city": "Eugene", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97403, + "latitude": 44.032396, + "longitude": -123.095799, + "city": "Eugene", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97404, + "latitude": 44.100192, + "longitude": -123.168807, + "city": "Eugene", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97405, + "latitude": 43.935009, + "longitude": -123.166429, + "city": "Eugene", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97406, + "latitude": 42.656925, + "longitude": -124.133206, + "city": "Agness", + "state": "OR", + "county": "Curry" + }, + { + "zip_code": 97407, + "latitude": 43.246918, + "longitude": -124.231068, + "city": "Allegany", + "state": "OR", + "county": "Coos" + }, + { + "zip_code": 97408, + "latitude": 44.141548, + "longitude": -123.125468, + "city": "Eugene", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97409, + "latitude": 44.127631, + "longitude": -123.266648, + "city": "Alvadore", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97410, + "latitude": 42.834139, + "longitude": -123.13216, + "city": "Azalea", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97411, + "latitude": 43.088824, + "longitude": -124.389936, + "city": "Bandon", + "state": "OR", + "county": "Coos" + }, + { + "zip_code": 97412, + "latitude": 44.174264, + "longitude": -123.571057, + "city": "Blachly", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97413, + "latitude": 44.175516, + "longitude": -122.12169, + "city": "Blue River", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97414, + "latitude": 43.138755, + "longitude": -124.127089, + "city": "Broadbent", + "state": "OR", + "county": "Coos" + }, + { + "zip_code": 97415, + "latitude": 42.137789, + "longitude": -124.249196, + "city": "Brookings", + "state": "OR", + "county": "Curry" + }, + { + "zip_code": 97416, + "latitude": 43.040527, + "longitude": -123.653799, + "city": "Camas Valley", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97417, + "latitude": 42.95096, + "longitude": -123.258975, + "city": "Canyonville", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97419, + "latitude": 44.210177, + "longitude": -123.368242, + "city": "Cheshire", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97420, + "latitude": 43.215143, + "longitude": -124.198358, + "city": "Coos Bay", + "state": "OR", + "county": "Coos" + }, + { + "zip_code": 97423, + "latitude": 43.232318, + "longitude": -124.22419, + "city": "Coquille", + "state": "OR", + "county": "Coos" + }, + { + "zip_code": 97424, + "latitude": 43.72893, + "longitude": -123.049498, + "city": "Cottage Grove", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97425, + "latitude": 43.51799, + "longitude": -121.949514, + "city": "Crescent Lake", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97426, + "latitude": 43.895976, + "longitude": -123.041968, + "city": "Creswell", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97427, + "latitude": 43.657939, + "longitude": -122.787122, + "city": "Culp Creek", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97428, + "latitude": 43.747559, + "longitude": -123.196161, + "city": "Curtin", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97429, + "latitude": 42.972697, + "longitude": -123.088917, + "city": "Days Creek", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97430, + "latitude": 44.146196, + "longitude": -123.681581, + "city": "Deadwood", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97431, + "latitude": 43.968007, + "longitude": -123.424918, + "city": "Dexter", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97432, + "latitude": 43.113502, + "longitude": -123.418068, + "city": "Dillard", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97434, + "latitude": 43.736115, + "longitude": -122.894601, + "city": "Dorena", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97435, + "latitude": 43.716624, + "longitude": -123.334749, + "city": "Drain", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97436, + "latitude": 43.573594, + "longitude": -123.556893, + "city": "Elkton", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97437, + "latitude": 44.097363, + "longitude": -123.388216, + "city": "Elmira", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97438, + "latitude": 43.9823, + "longitude": -122.76915, + "city": "Fall Creek", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97439, + "latitude": 44.064723, + "longitude": -123.996747, + "city": "Florence", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97440, + "latitude": 43.863845, + "longitude": -122.99879, + "city": "Eugene", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97441, + "latitude": 43.75114, + "longitude": -124.123806, + "city": "Gardiner", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97442, + "latitude": 42.761476, + "longitude": -123.39135, + "city": "Glendale", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97443, + "latitude": 43.26595, + "longitude": -123.018231, + "city": "Glide", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97444, + "latitude": 42.410099, + "longitude": -124.334383, + "city": "Gold Beach", + "state": "OR", + "county": "Curry" + }, + { + "zip_code": 97446, + "latitude": 44.273684, + "longitude": -123.108438, + "city": "Harrisburg", + "state": "OR", + "county": "Linn" + }, + { + "zip_code": 97447, + "latitude": 43.065884, + "longitude": -122.869705, + "city": "Idleyld Park", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97448, + "latitude": 44.192567, + "longitude": -123.273576, + "city": "Junction City", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97449, + "latitude": 43.583767, + "longitude": -124.122749, + "city": "Lakeside", + "state": "OR", + "county": "Coos" + }, + { + "zip_code": 97450, + "latitude": 42.893126, + "longitude": -124.406262, + "city": "Langlois", + "state": "OR", + "county": "Curry" + }, + { + "zip_code": 97451, + "latitude": 43.817721, + "longitude": -123.273366, + "city": "Lorane", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97452, + "latitude": 43.885422, + "longitude": -122.694091, + "city": "Lowell", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97453, + "latitude": 44.010088, + "longitude": -123.901261, + "city": "Mapleton", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97454, + "latitude": 44.212732, + "longitude": -122.812544, + "city": "Marcola", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97455, + "latitude": 43.967356, + "longitude": -122.915417, + "city": "Pleasant Hill", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97456, + "latitude": 44.346783, + "longitude": -123.325952, + "city": "Monroe", + "state": "OR", + "county": "Benton" + }, + { + "zip_code": 97457, + "latitude": 43.300361, + "longitude": -123.225556, + "city": "Myrtle Creek", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97458, + "latitude": 43.020023, + "longitude": -124.136075, + "city": "Myrtle Point", + "state": "OR", + "county": "Coos" + }, + { + "zip_code": 97459, + "latitude": 43.241489, + "longitude": -124.163469, + "city": "North Bend", + "state": "OR", + "county": "Coos" + }, + { + "zip_code": 97460, + "latitude": 43.138755, + "longitude": -124.127089, + "city": "Norway", + "state": "OR", + "county": "Coos" + }, + { + "zip_code": 97461, + "latitude": 44.099169, + "longitude": -123.468389, + "city": "Noti", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97462, + "latitude": 43.503232, + "longitude": -123.414079, + "city": "Oakland", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97463, + "latitude": 43.737605, + "longitude": -122.437723, + "city": "Oakridge", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97464, + "latitude": 42.739889, + "longitude": -124.51056, + "city": "Ophir", + "state": "OR", + "county": "Curry" + }, + { + "zip_code": 97465, + "latitude": 42.703155, + "longitude": -124.45094, + "city": "Port Orford", + "state": "OR", + "county": "Curry" + }, + { + "zip_code": 97466, + "latitude": 42.879975, + "longitude": -124.070945, + "city": "Powers", + "state": "OR", + "county": "Coos" + }, + { + "zip_code": 97467, + "latitude": 43.449523, + "longitude": -123.745579, + "city": "Reedsport", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97469, + "latitude": 43.267918, + "longitude": -123.42545, + "city": "Riddle", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97470, + "latitude": 43.053573, + "longitude": -123.360805, + "city": "Roseburg", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97472, + "latitude": 43.863845, + "longitude": -122.99879, + "city": "Saginaw", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97473, + "latitude": 43.671853, + "longitude": -123.825751, + "city": "Scottsburg", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97476, + "latitude": 42.800135, + "longitude": -124.433374, + "city": "Sixes", + "state": "OR", + "county": "Curry" + }, + { + "zip_code": 97477, + "latitude": 43.937276, + "longitude": -123.444371, + "city": "Springfield", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97478, + "latitude": 44.095761, + "longitude": -122.872806, + "city": "Springfield", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97479, + "latitude": 43.345559, + "longitude": -123.208273, + "city": "Sutherlin", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97480, + "latitude": 44.101084, + "longitude": -123.732051, + "city": "Swisshome", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97481, + "latitude": 43.11405, + "longitude": -123.529417, + "city": "Tenmile", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97482, + "latitude": 43.863845, + "longitude": -122.99879, + "city": "Thurston", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97484, + "latitude": 42.91767, + "longitude": -122.907864, + "city": "Tiller", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97486, + "latitude": 43.393775, + "longitude": -123.516847, + "city": "Umpqua", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97487, + "latitude": 44.003051, + "longitude": -123.367371, + "city": "Veneta", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97488, + "latitude": 44.162401, + "longitude": -122.870723, + "city": "Vida", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97489, + "latitude": 44.128776, + "longitude": -122.637619, + "city": "Walterville", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97490, + "latitude": 44.000245, + "longitude": -123.615073, + "city": "Walton", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97491, + "latitude": 42.609252, + "longitude": -124.388576, + "city": "Wedderburn", + "state": "OR", + "county": "Curry" + }, + { + "zip_code": 97492, + "latitude": 43.757499, + "longitude": -122.481043, + "city": "Westfir", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97493, + "latitude": 43.91587, + "longitude": -124.031752, + "city": "Westlake", + "state": "OR", + "county": "Lane" + }, + { + "zip_code": 97494, + "latitude": 43.32843, + "longitude": -123.333177, + "city": "Wilbur", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97495, + "latitude": 43.333141, + "longitude": -123.325617, + "city": "Winchester", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97496, + "latitude": 43.306579, + "longitude": -123.45342, + "city": "Winston", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97497, + "latitude": 42.652236, + "longitude": -123.425008, + "city": "Wolf Creek", + "state": "OR", + "county": "Josephine" + }, + { + "zip_code": 97498, + "latitude": 44.333892, + "longitude": -124.024246, + "city": "Yachats", + "state": "OR", + "county": "Lincoln" + }, + { + "zip_code": 97499, + "latitude": 43.308689, + "longitude": -123.165395, + "city": "Yoncalla", + "state": "OR", + "county": "Douglas" + }, + { + "zip_code": 97501, + "latitude": 42.482623, + "longitude": -122.72255, + "city": "Medford", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97502, + "latitude": 42.416384, + "longitude": -122.917383, + "city": "Central Point", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97503, + "latitude": 42.537028, + "longitude": -122.883923, + "city": "White City", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97504, + "latitude": 42.322392, + "longitude": -122.793659, + "city": "Medford", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97520, + "latitude": 42.148098, + "longitude": -122.537356, + "city": "Ashland", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97522, + "latitude": 42.530813, + "longitude": -122.554633, + "city": "Butte Falls", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97523, + "latitude": 42.273683, + "longitude": -123.554046, + "city": "Cave Junction", + "state": "OR", + "county": "Josephine" + }, + { + "zip_code": 97524, + "latitude": 42.478023, + "longitude": -122.635695, + "city": "Eagle Point", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97525, + "latitude": 42.440993, + "longitude": -123.029161, + "city": "Gold Hill", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97526, + "latitude": 42.402144, + "longitude": -123.416119, + "city": "Grants Pass", + "state": "OR", + "county": "Josephine" + }, + { + "zip_code": 97527, + "latitude": 42.345125, + "longitude": -123.440456, + "city": "Grants Pass", + "state": "OR", + "county": "Josephine" + }, + { + "zip_code": 97528, + "latitude": 42.396421, + "longitude": -123.535027, + "city": "Grants Pass", + "state": "OR", + "county": "Josephine" + }, + { + "zip_code": 97530, + "latitude": 42.181333, + "longitude": -123.0241, + "city": "Jacksonville", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97531, + "latitude": 42.212141, + "longitude": -123.624688, + "city": "Kerby", + "state": "OR", + "county": "Josephine" + }, + { + "zip_code": 97532, + "latitude": 42.400936, + "longitude": -123.525826, + "city": "Merlin", + "state": "OR", + "county": "Josephine" + }, + { + "zip_code": 97533, + "latitude": 42.308007, + "longitude": -123.327323, + "city": "Murphy", + "state": "OR", + "county": "Josephine" + }, + { + "zip_code": 97534, + "latitude": 42.087941, + "longitude": -123.688998, + "city": "O Brien", + "state": "OR", + "county": "Josephine" + }, + { + "zip_code": 97535, + "latitude": 42.262556, + "longitude": -122.81464, + "city": "Phoenix", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97536, + "latitude": 42.787066, + "longitude": -122.506046, + "city": "Prospect", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97537, + "latitude": 42.533003, + "longitude": -123.097269, + "city": "Rogue River", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97538, + "latitude": 42.265435, + "longitude": -123.551451, + "city": "Selma", + "state": "OR", + "county": "Josephine" + }, + { + "zip_code": 97539, + "latitude": 42.621218, + "longitude": -122.756141, + "city": "Shady Cove", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97540, + "latitude": 42.221879, + "longitude": -122.770093, + "city": "Talent", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97541, + "latitude": 42.697957, + "longitude": -122.769269, + "city": "Trail", + "state": "OR", + "county": "Jackson" + }, + { + "zip_code": 97543, + "latitude": 42.292694, + "longitude": -123.548618, + "city": "Wilderville", + "state": "OR", + "county": "Josephine" + }, + { + "zip_code": 97544, + "latitude": 42.357375, + "longitude": -123.321239, + "city": "Williams", + "state": "OR", + "county": "Josephine" + }, + { + "zip_code": 97601, + "latitude": 42.293293, + "longitude": -121.816873, + "city": "Klamath Falls", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97602, + "latitude": 42.804981, + "longitude": -121.584833, + "city": "Klamath Falls", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97603, + "latitude": 42.61276, + "longitude": -121.685853, + "city": "Klamath Falls", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97604, + "latitude": 42.733365, + "longitude": -121.987076, + "city": "Crater Lake", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97620, + "latitude": 42.805272, + "longitude": -120.355294, + "city": "Adel", + "state": "OR", + "county": "Lake" + }, + { + "zip_code": 97621, + "latitude": 42.464842, + "longitude": -121.259056, + "city": "Beatty", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97622, + "latitude": 42.399541, + "longitude": -121.080557, + "city": "Bly", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97623, + "latitude": 42.193652, + "longitude": -121.33006, + "city": "Bonanza", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97624, + "latitude": 42.72222, + "longitude": -121.878916, + "city": "Chiloquin", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97625, + "latitude": 42.291015, + "longitude": -121.507834, + "city": "Dairy", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97626, + "latitude": 42.641537, + "longitude": -122.037995, + "city": "Fort Klamath", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97627, + "latitude": 42.119398, + "longitude": -122.008124, + "city": "Keno", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97630, + "latitude": 42.180763, + "longitude": -120.369607, + "city": "Lakeview", + "state": "OR", + "county": "Lake" + }, + { + "zip_code": 97632, + "latitude": 42.095447, + "longitude": -121.387408, + "city": "Malin", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97633, + "latitude": 42.055503, + "longitude": -121.522384, + "city": "Merrill", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97634, + "latitude": 42.128418, + "longitude": -121.870983, + "city": "Midland", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97635, + "latitude": 42.805272, + "longitude": -120.355294, + "city": "New Pine Creek", + "state": "OR", + "county": "Lake" + }, + { + "zip_code": 97636, + "latitude": 42.775198, + "longitude": -120.330349, + "city": "Paisley", + "state": "OR", + "county": "Lake" + }, + { + "zip_code": 97637, + "latitude": 42.805272, + "longitude": -120.355294, + "city": "Plush", + "state": "OR", + "county": "Lake" + }, + { + "zip_code": 97638, + "latitude": 42.805272, + "longitude": -120.355294, + "city": "Silver Lake", + "state": "OR", + "county": "Lake" + }, + { + "zip_code": 97639, + "latitude": 42.486975, + "longitude": -121.531087, + "city": "Sprague River", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97640, + "latitude": 42.944694, + "longitude": -120.794615, + "city": "Summer Lake", + "state": "OR", + "county": "Lake" + }, + { + "zip_code": 97641, + "latitude": 43.157855, + "longitude": -120.724397, + "city": "Christmas Valley", + "state": "OR", + "county": "Lake" + }, + { + "zip_code": 97701, + "latitude": 44.082037, + "longitude": -121.227125, + "city": "Bend", + "state": "OR", + "county": "Deschutes" + }, + { + "zip_code": 97702, + "latitude": 43.998448, + "longitude": -121.260298, + "city": "Bend", + "state": "OR", + "county": "Deschutes" + }, + { + "zip_code": 97707, + "latitude": 43.843071, + "longitude": -121.576423, + "city": "Bend", + "state": "OR", + "county": "Deschutes" + }, + { + "zip_code": 97708, + "latitude": 44.001834, + "longitude": -120.94952, + "city": "Bend", + "state": "OR", + "county": "Deschutes" + }, + { + "zip_code": 97709, + "latitude": 44.001834, + "longitude": -120.94952, + "city": "Bend", + "state": "OR", + "county": "Deschutes" + }, + { + "zip_code": 97710, + "latitude": 43.019785, + "longitude": -119.069624, + "city": "Fields", + "state": "OR", + "county": "Harney" + }, + { + "zip_code": 97711, + "latitude": 44.538351, + "longitude": -121.321903, + "city": "Ashwood", + "state": "OR", + "county": "Jefferson" + }, + { + "zip_code": 97712, + "latitude": 43.665917, + "longitude": -120.225618, + "city": "Brothers", + "state": "OR", + "county": "Deschutes" + }, + { + "zip_code": 97720, + "latitude": 43.554287, + "longitude": -118.874273, + "city": "Burns", + "state": "OR", + "county": "Harney" + }, + { + "zip_code": 97721, + "latitude": 43.019785, + "longitude": -119.069624, + "city": "Princeton", + "state": "OR", + "county": "Harney" + }, + { + "zip_code": 97722, + "latitude": 43.019785, + "longitude": -119.069624, + "city": "Diamond", + "state": "OR", + "county": "Harney" + }, + { + "zip_code": 97730, + "latitude": 44.443474, + "longitude": -121.659909, + "city": "Camp Sherman", + "state": "OR", + "county": "Jefferson" + }, + { + "zip_code": 97731, + "latitude": 42.804981, + "longitude": -121.584833, + "city": "Chemult", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97732, + "latitude": 43.019785, + "longitude": -119.069624, + "city": "Crane", + "state": "OR", + "county": "Harney" + }, + { + "zip_code": 97733, + "latitude": 43.444217, + "longitude": -121.710925, + "city": "Crescent", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97734, + "latitude": 44.499106, + "longitude": -121.267976, + "city": "Culver", + "state": "OR", + "county": "Jefferson" + }, + { + "zip_code": 97735, + "latitude": 42.805272, + "longitude": -120.355294, + "city": "Fort Rock", + "state": "OR", + "county": "Lake" + }, + { + "zip_code": 97736, + "latitude": 43.56203, + "longitude": -119.078609, + "city": "Frenchglen", + "state": "OR", + "county": "Harney" + }, + { + "zip_code": 97737, + "latitude": 43.372529, + "longitude": -121.658336, + "city": "Gilchrist", + "state": "OR", + "county": "Klamath" + }, + { + "zip_code": 97738, + "latitude": 43.555768, + "longitude": -119.081558, + "city": "Hines", + "state": "OR", + "county": "Harney" + }, + { + "zip_code": 97739, + "latitude": 43.692193, + "longitude": -121.565187, + "city": "La Pine", + "state": "OR", + "county": "Deschutes" + }, + { + "zip_code": 97740, + "latitude": 43.019785, + "longitude": -119.069624, + "city": "Lawen", + "state": "OR", + "county": "Harney" + }, + { + "zip_code": 97741, + "latitude": 44.62616, + "longitude": -121.128106, + "city": "Madras", + "state": "OR", + "county": "Jefferson" + }, + { + "zip_code": 97750, + "latitude": 44.644668, + "longitude": -120.014665, + "city": "Mitchell", + "state": "OR", + "county": "Wheeler" + }, + { + "zip_code": 97751, + "latitude": 44.127641, + "longitude": -119.864655, + "city": "Paulina", + "state": "OR", + "county": "Crook" + }, + { + "zip_code": 97752, + "latitude": 44.085051, + "longitude": -120.276069, + "city": "Post", + "state": "OR", + "county": "Crook" + }, + { + "zip_code": 97753, + "latitude": 44.232525, + "longitude": -121.008489, + "city": "Powell Butte", + "state": "OR", + "county": "Crook" + }, + { + "zip_code": 97754, + "latitude": 44.16805, + "longitude": -120.660334, + "city": "Prineville", + "state": "OR", + "county": "Crook" + }, + { + "zip_code": 97756, + "latitude": 44.268862, + "longitude": -121.266414, + "city": "Redmond", + "state": "OR", + "county": "Deschutes" + }, + { + "zip_code": 97758, + "latitude": 43.019785, + "longitude": -119.069624, + "city": "Riley", + "state": "OR", + "county": "Harney" + }, + { + "zip_code": 97759, + "latitude": 44.31648, + "longitude": -121.509124, + "city": "Sisters", + "state": "OR", + "county": "Deschutes" + }, + { + "zip_code": 97760, + "latitude": 44.349792, + "longitude": -121.245224, + "city": "Terrebonne", + "state": "OR", + "county": "Deschutes" + }, + { + "zip_code": 97761, + "latitude": 44.771108, + "longitude": -121.334786, + "city": "Warm Springs", + "state": "OR", + "county": "Jefferson" + }, + { + "zip_code": 97801, + "latitude": 45.711814, + "longitude": -118.637974, + "city": "Pendleton", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97810, + "latitude": 45.724767, + "longitude": -118.490788, + "city": "Adams", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97812, + "latitude": 45.567282, + "longitude": -120.275127, + "city": "Arlington", + "state": "OR", + "county": "Gilliam" + }, + { + "zip_code": 97813, + "latitude": 45.82394, + "longitude": -118.524881, + "city": "Athena", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97814, + "latitude": 44.754237, + "longitude": -117.742659, + "city": "Baker City", + "state": "OR", + "county": "Baker" + }, + { + "zip_code": 97817, + "latitude": 44.477794, + "longitude": -118.947769, + "city": "Bates", + "state": "OR", + "county": "Grant" + }, + { + "zip_code": 97818, + "latitude": 45.419841, + "longitude": -119.6575, + "city": "Boardman", + "state": "OR", + "county": "Morrow" + }, + { + "zip_code": 97819, + "latitude": 44.493135, + "longitude": -117.765498, + "city": "Bridgeport", + "state": "OR", + "county": "Baker" + }, + { + "zip_code": 97820, + "latitude": 44.391149, + "longitude": -118.946498, + "city": "Canyon City", + "state": "OR", + "county": "Grant" + }, + { + "zip_code": 97821, + "latitude": 45.683276, + "longitude": -118.45808, + "city": "Cayuse", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97823, + "latitude": 45.255099, + "longitude": -120.140937, + "city": "Condon", + "state": "OR", + "county": "Gilliam" + }, + { + "zip_code": 97824, + "latitude": 45.341881, + "longitude": -117.872662, + "city": "Cove", + "state": "OR", + "county": "Union" + }, + { + "zip_code": 97825, + "latitude": 44.465268, + "longitude": -119.533402, + "city": "Dayville", + "state": "OR", + "county": "Grant" + }, + { + "zip_code": 97826, + "latitude": 45.692754, + "longitude": -119.198798, + "city": "Echo", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97827, + "latitude": 45.612664, + "longitude": -117.907539, + "city": "Elgin", + "state": "OR", + "county": "Union" + }, + { + "zip_code": 97828, + "latitude": 45.648199, + "longitude": -117.169858, + "city": "Enterprise", + "state": "OR", + "county": "Wallowa" + }, + { + "zip_code": 97830, + "latitude": 44.928579, + "longitude": -120.130869, + "city": "Fossil", + "state": "OR", + "county": "Wheeler" + }, + { + "zip_code": 97831, + "latitude": 44.477794, + "longitude": -118.947769, + "city": "Fox", + "state": "OR", + "county": "Grant" + }, + { + "zip_code": 97833, + "latitude": 44.941557, + "longitude": -117.987928, + "city": "Haines", + "state": "OR", + "county": "Baker" + }, + { + "zip_code": 97834, + "latitude": 44.952248, + "longitude": -117.123753, + "city": "Halfway", + "state": "OR", + "county": "Baker" + }, + { + "zip_code": 97835, + "latitude": 45.909854, + "longitude": -118.755877, + "city": "Helix", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97836, + "latitude": 45.301332, + "longitude": -119.577731, + "city": "Heppner", + "state": "OR", + "county": "Morrow" + }, + { + "zip_code": 97837, + "latitude": 44.530415, + "longitude": -118.029277, + "city": "Hereford", + "state": "OR", + "county": "Baker" + }, + { + "zip_code": 97838, + "latitude": 45.699986, + "longitude": -119.100692, + "city": "Hermiston", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97839, + "latitude": 45.493821, + "longitude": -119.638037, + "city": "Lexington", + "state": "OR", + "county": "Morrow" + }, + { + "zip_code": 97840, + "latitude": 44.963341, + "longitude": -116.84359, + "city": "Oxbow", + "state": "OR", + "county": "Baker" + }, + { + "zip_code": 97841, + "latitude": 45.474915, + "longitude": -117.957463, + "city": "Imbler", + "state": "OR", + "county": "Union" + }, + { + "zip_code": 97842, + "latitude": 45.503578, + "longitude": -116.807469, + "city": "Imnaha", + "state": "OR", + "county": "Wallowa" + }, + { + "zip_code": 97843, + "latitude": 45.456534, + "longitude": -119.842256, + "city": "Ione", + "state": "OR", + "county": "Morrow" + }, + { + "zip_code": 97844, + "latitude": 45.707049, + "longitude": -119.631097, + "city": "Irrigon", + "state": "OR", + "county": "Morrow" + }, + { + "zip_code": 97845, + "latitude": 44.550033, + "longitude": -118.914774, + "city": "John Day", + "state": "OR", + "county": "Grant" + }, + { + "zip_code": 97846, + "latitude": 45.406071, + "longitude": -117.073337, + "city": "Joseph", + "state": "OR", + "county": "Wallowa" + }, + { + "zip_code": 97848, + "latitude": 44.477794, + "longitude": -118.947769, + "city": "Kimberly", + "state": "OR", + "county": "Grant" + }, + { + "zip_code": 97850, + "latitude": 45.29535, + "longitude": -118.164822, + "city": "La Grande", + "state": "OR", + "county": "Union" + }, + { + "zip_code": 97856, + "latitude": 44.713688, + "longitude": -119.090832, + "city": "Long Creek", + "state": "OR", + "county": "Grant" + }, + { + "zip_code": 97857, + "latitude": 45.465083, + "longitude": -117.457163, + "city": "Lostine", + "state": "OR", + "county": "Wallowa" + }, + { + "zip_code": 97859, + "latitude": 45.521453, + "longitude": -118.433494, + "city": "Meacham", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97861, + "latitude": 45.438822, + "longitude": -120.206698, + "city": "Mikkalo", + "state": "OR", + "county": "Gilliam" + }, + { + "zip_code": 97862, + "latitude": 45.740766, + "longitude": -118.50432, + "city": "Milton Freewater", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97864, + "latitude": 44.818887, + "longitude": -119.419221, + "city": "Monument", + "state": "OR", + "county": "Grant" + }, + { + "zip_code": 97865, + "latitude": 44.446986, + "longitude": -119.09743, + "city": "Mount Vernon", + "state": "OR", + "county": "Grant" + }, + { + "zip_code": 97867, + "latitude": 45.043975, + "longitude": -117.981498, + "city": "North Powder", + "state": "OR", + "county": "Union" + }, + { + "zip_code": 97868, + "latitude": 45.42115, + "longitude": -118.8603, + "city": "Pilot Rock", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97869, + "latitude": 44.459922, + "longitude": -118.704035, + "city": "Prairie City", + "state": "OR", + "county": "Grant" + }, + { + "zip_code": 97870, + "latitude": 44.794629, + "longitude": -117.229802, + "city": "Richland", + "state": "OR", + "county": "Baker" + }, + { + "zip_code": 97872, + "latitude": 44.477794, + "longitude": -118.947769, + "city": "Ritter", + "state": "OR", + "county": "Grant" + }, + { + "zip_code": 97873, + "latitude": 44.119638, + "longitude": -119.122317, + "city": "Seneca", + "state": "OR", + "county": "Grant" + }, + { + "zip_code": 97874, + "latitude": 44.780103, + "longitude": -119.914072, + "city": "Spray", + "state": "OR", + "county": "Wheeler" + }, + { + "zip_code": 97875, + "latitude": 45.806358, + "longitude": -119.176169, + "city": "Stanfield", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97876, + "latitude": 45.295599, + "longitude": -118.000258, + "city": "Summerville", + "state": "OR", + "county": "Union" + }, + { + "zip_code": 97877, + "latitude": 44.72563, + "longitude": -118.181033, + "city": "Sumpter", + "state": "OR", + "county": "Baker" + }, + { + "zip_code": 97880, + "latitude": 45.498472, + "longitude": -118.704081, + "city": "Ukiah", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97882, + "latitude": 45.869529, + "longitude": -118.95693, + "city": "Umatilla", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97883, + "latitude": 45.162055, + "longitude": -117.848982, + "city": "Union", + "state": "OR", + "county": "Union" + }, + { + "zip_code": 97884, + "latitude": 44.456084, + "longitude": -118.195489, + "city": "Unity", + "state": "OR", + "county": "Baker" + }, + { + "zip_code": 97885, + "latitude": 45.655005, + "longitude": -117.511052, + "city": "Wallowa", + "state": "OR", + "county": "Wallowa" + }, + { + "zip_code": 97886, + "latitude": 45.788782, + "longitude": -118.300068, + "city": "Weston", + "state": "OR", + "county": "Umatilla" + }, + { + "zip_code": 97901, + "latitude": 43.785214, + "longitude": -117.368446, + "city": "Adrian", + "state": "OR", + "county": "Malheur" + }, + { + "zip_code": 97902, + "latitude": 42.915641, + "longitude": -117.497988, + "city": "Arock", + "state": "OR", + "county": "Malheur" + }, + { + "zip_code": 97903, + "latitude": 44.248595, + "longitude": -117.563891, + "city": "Brogan", + "state": "OR", + "county": "Malheur" + }, + { + "zip_code": 97904, + "latitude": 43.019785, + "longitude": -119.069624, + "city": "Drewsey", + "state": "OR", + "county": "Harney" + }, + { + "zip_code": 97905, + "latitude": 44.498826, + "longitude": -117.412907, + "city": "Durkee", + "state": "OR", + "county": "Baker" + }, + { + "zip_code": 97906, + "latitude": 43.830263, + "longitude": -117.626175, + "city": "Harper", + "state": "OR", + "county": "Malheur" + }, + { + "zip_code": 97907, + "latitude": 44.432748, + "longitude": -117.389163, + "city": "Huntington", + "state": "OR", + "county": "Baker" + }, + { + "zip_code": 97908, + "latitude": 44.341058, + "longitude": -117.818949, + "city": "Ironside", + "state": "OR", + "county": "Malheur" + }, + { + "zip_code": 97909, + "latitude": 44.216093, + "longitude": -117.481258, + "city": "Jamieson", + "state": "OR", + "county": "Malheur" + }, + { + "zip_code": 97910, + "latitude": 42.951169, + "longitude": -117.469061, + "city": "Jordan Valley", + "state": "OR", + "county": "Malheur" + }, + { + "zip_code": 97911, + "latitude": 43.820762, + "longitude": -118.036522, + "city": "Juntura", + "state": "OR", + "county": "Malheur" + }, + { + "zip_code": 97913, + "latitude": 43.627554, + "longitude": -117.207823, + "city": "Nyssa", + "state": "OR", + "county": "Malheur" + }, + { + "zip_code": 97914, + "latitude": 44.093127, + "longitude": -117.079896, + "city": "Ontario", + "state": "OR", + "county": "Malheur" + }, + { + "zip_code": 97917, + "latitude": 43.509919, + "longitude": -118.098586, + "city": "Riverside", + "state": "OR", + "county": "Malheur" + }, + { + "zip_code": 97918, + "latitude": 44.052329, + "longitude": -117.283258, + "city": "Vale", + "state": "OR", + "county": "Malheur" + }, + { + "zip_code": 97920, + "latitude": 43.966853, + "longitude": -117.709928, + "city": "Westfall", + "state": "OR", + "county": "Malheur" + }, + { + "zip_code": 98001, + "latitude": 47.465495, + "longitude": -121.821908, + "city": "Auburn", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98002, + "latitude": 47.315422, + "longitude": -122.20423, + "city": "Auburn", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98003, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Federal Way", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98004, + "latitude": 47.615471, + "longitude": -122.207221, + "city": "Bellevue", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98005, + "latitude": 47.620471, + "longitude": -122.178883, + "city": "Bellevue", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98006, + "latitude": 47.551771, + "longitude": -122.144727, + "city": "Bellevue", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98007, + "latitude": 47.620152, + "longitude": -122.142282, + "city": "Bellevue", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98008, + "latitude": 47.605867, + "longitude": -122.111082, + "city": "Bellevue", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98009, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Bellevue", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98010, + "latitude": 47.310568, + "longitude": -121.998721, + "city": "Black Diamond", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98011, + "latitude": 47.750689, + "longitude": -122.214376, + "city": "Bothell", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98012, + "latitude": 47.840068, + "longitude": -122.197238, + "city": "Bothell", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98013, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Burton", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98014, + "latitude": 47.661862, + "longitude": -121.927236, + "city": "Carnation", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98015, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Bellevue", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98019, + "latitude": 47.73459, + "longitude": -121.931974, + "city": "Duvall", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98020, + "latitude": 47.806068, + "longitude": -122.372401, + "city": "Edmonds", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98021, + "latitude": 47.794519, + "longitude": -122.194276, + "city": "Bothell", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98022, + "latitude": 47.234107, + "longitude": -121.903936, + "city": "Enumclaw", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98023, + "latitude": 47.775627, + "longitude": -122.240337, + "city": "Federal Way", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98024, + "latitude": 47.483051, + "longitude": -121.987813, + "city": "Fall City", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98025, + "latitude": 47.591564, + "longitude": -122.056013, + "city": "Hobart", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98026, + "latitude": 47.835318, + "longitude": -122.326981, + "city": "Edmonds", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98027, + "latitude": 47.497419, + "longitude": -122.010699, + "city": "Issaquah", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98028, + "latitude": 47.754219, + "longitude": -122.124643, + "city": "Kenmore", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98029, + "latitude": 47.565587, + "longitude": -122.025754, + "city": "Issaquah", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98031, + "latitude": 47.379972, + "longitude": -122.16538, + "city": "Kent", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98032, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Kent", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98033, + "latitude": 47.673263, + "longitude": -122.187029, + "city": "Kirkland", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98034, + "latitude": 47.725139, + "longitude": -122.205646, + "city": "Kirkland", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98035, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Kent", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98036, + "latitude": 47.804869, + "longitude": -122.285481, + "city": "Lynnwood", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98037, + "latitude": 47.857022, + "longitude": -122.28301, + "city": "Lynnwood", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98038, + "latitude": 47.409304, + "longitude": -121.969445, + "city": "Maple Valley", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98039, + "latitude": 47.62692, + "longitude": -122.231389, + "city": "Medina", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98040, + "latitude": 47.56025, + "longitude": -122.228083, + "city": "Mercer Island", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98041, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Bothell", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98042, + "latitude": 47.353456, + "longitude": -122.091718, + "city": "Kent", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98043, + "latitude": 47.793269, + "longitude": -122.30764, + "city": "Mountlake Terrace", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98045, + "latitude": 47.467224, + "longitude": -121.687506, + "city": "North Bend", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98046, + "latitude": 48.037258, + "longitude": -121.682271, + "city": "Lynnwood", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98047, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Pacific", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98050, + "latitude": 47.536015, + "longitude": -121.931195, + "city": "Preston", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98051, + "latitude": 47.274764, + "longitude": -121.932232, + "city": "Ravensdale", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98052, + "latitude": 47.678756, + "longitude": -122.121034, + "city": "Redmond", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98053, + "latitude": 47.648626, + "longitude": -122.02106, + "city": "Redmond", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98054, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Redondo", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98055, + "latitude": 47.485348, + "longitude": -122.02967, + "city": "Renton", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98056, + "latitude": 47.514671, + "longitude": -122.186447, + "city": "Renton", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98057, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Renton", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98058, + "latitude": 47.432927, + "longitude": -122.117999, + "city": "Renton", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98059, + "latitude": 47.505822, + "longitude": -122.115699, + "city": "Renton", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98061, + "latitude": 47.680763, + "longitude": -122.576199, + "city": "Rollingbay", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98062, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seahurst", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98063, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Federal Way", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98064, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Kent", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98065, + "latitude": 47.534473, + "longitude": -121.816158, + "city": "Snoqualmie", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98068, + "latitude": 47.445171, + "longitude": -121.431033, + "city": "Snoqualmie Pass", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98070, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Vashon", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98071, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Auburn", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98072, + "latitude": 47.740741, + "longitude": -122.090874, + "city": "Woodinville", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98073, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Redmond", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98074, + "latitude": "", + "longitude": "", + "city": "Sammamish", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98075, + "latitude": "", + "longitude": "", + "city": "Sammamish", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98082, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Bothell", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98083, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Kirkland", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98092, + "latitude": 47.288362, + "longitude": -122.097976, + "city": "Auburn", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98093, + "latitude": 47.311041, + "longitude": -122.113791, + "city": "Federal Way", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98101, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98102, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98103, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98104, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98105, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98106, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98107, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98108, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98109, + "latitude": 47.583868, + "longitude": -122.052333, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98110, + "latitude": 47.647774, + "longitude": -122.538016, + "city": "Bainbridge Island", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98111, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98112, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98114, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98115, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98116, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98117, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98118, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98119, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98121, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98122, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98124, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98125, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98126, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98129, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98131, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98132, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98133, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98134, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98136, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98138, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98144, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98145, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98146, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98148, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98151, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98154, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98155, + "latitude": 47.767169, + "longitude": -122.259737, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98158, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98160, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98161, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98164, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98166, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98168, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98170, + "latitude": "", + "longitude": "", + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98171, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98174, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98177, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98178, + "latitude": 47.492385, + "longitude": -122.235856, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98181, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98184, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98185, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98188, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98190, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98191, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98195, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98198, + "latitude": 47.432251, + "longitude": -121.803388, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98199, + "latitude": 47.776875, + "longitude": -122.264256, + "city": "Seattle", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98201, + "latitude": 47.988661, + "longitude": -122.199795, + "city": "Everett", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98203, + "latitude": 47.946017, + "longitude": -122.231795, + "city": "Everett", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98204, + "latitude": 47.899696, + "longitude": -122.255522, + "city": "Everett", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98205, + "latitude": 47.953523, + "longitude": -122.123325, + "city": "Everett", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98206, + "latitude": 47.859918, + "longitude": -122.284785, + "city": "Everett", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98207, + "latitude": 48.037258, + "longitude": -121.682271, + "city": "Everett", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98208, + "latitude": 47.897284, + "longitude": -122.190392, + "city": "Everett", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98220, + "latitude": 48.688554, + "longitude": -122.186966, + "city": "Acme", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98221, + "latitude": 48.499172, + "longitude": -122.607111, + "city": "Anacortes", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98222, + "latitude": 48.610644, + "longitude": -122.921551, + "city": "Blakely Island", + "state": "WA", + "county": "San Juan" + }, + { + "zip_code": 98223, + "latitude": 48.181498, + "longitude": -121.959469, + "city": "Arlington", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98224, + "latitude": 47.767103, + "longitude": -121.481395, + "city": "Baring", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98225, + "latitude": 48.747687, + "longitude": -122.454297, + "city": "Bellingham", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98226, + "latitude": 48.768396, + "longitude": -122.486483, + "city": "Bellingham", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98227, + "latitude": 48.814753, + "longitude": -121.988548, + "city": "Bellingham", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98228, + "latitude": 48.814753, + "longitude": -121.988548, + "city": "Bellingham", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98230, + "latitude": 48.935767, + "longitude": -122.366448, + "city": "Blaine", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98231, + "latitude": 48.814753, + "longitude": -121.988548, + "city": "Blaine", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98232, + "latitude": 48.565955, + "longitude": -122.448358, + "city": "Bow", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98233, + "latitude": 48.533616, + "longitude": -122.362337, + "city": "Burlington", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98235, + "latitude": 48.470099, + "longitude": -122.238754, + "city": "Clearlake", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98236, + "latitude": 47.956934, + "longitude": -122.417721, + "city": "Clinton", + "state": "WA", + "county": "Island" + }, + { + "zip_code": 98237, + "latitude": 48.508868, + "longitude": -121.697178, + "city": "Concrete", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98238, + "latitude": 48.340002, + "longitude": -122.345571, + "city": "Conway", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98239, + "latitude": 48.1894, + "longitude": -122.66765, + "city": "Coupeville", + "state": "WA", + "county": "Island" + }, + { + "zip_code": 98240, + "latitude": 48.941068, + "longitude": -122.625235, + "city": "Custer", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98241, + "latitude": 48.239542, + "longitude": -121.589209, + "city": "Darrington", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98243, + "latitude": 48.557824, + "longitude": -122.983742, + "city": "Deer Harbor", + "state": "WA", + "county": "San Juan" + }, + { + "zip_code": 98244, + "latitude": 48.80177, + "longitude": -122.091834, + "city": "Deming", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98245, + "latitude": 48.659128, + "longitude": -122.867603, + "city": "Eastsound", + "state": "WA", + "county": "San Juan" + }, + { + "zip_code": 98247, + "latitude": 48.904384, + "longitude": -122.321834, + "city": "Everson", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98248, + "latitude": 48.861113, + "longitude": -122.608561, + "city": "Ferndale", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98249, + "latitude": 48.019581, + "longitude": -122.540489, + "city": "Freeland", + "state": "WA", + "county": "Island" + }, + { + "zip_code": 98250, + "latitude": 48.538181, + "longitude": -123.068323, + "city": "Friday Harbor", + "state": "WA", + "county": "San Juan" + }, + { + "zip_code": 98251, + "latitude": 47.833114, + "longitude": -121.636528, + "city": "Gold Bar", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98252, + "latitude": 48.074894, + "longitude": -121.798489, + "city": "Granite Falls", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98253, + "latitude": 48.100424, + "longitude": -122.57612, + "city": "Greenbank", + "state": "WA", + "county": "Island" + }, + { + "zip_code": 98255, + "latitude": 48.525461, + "longitude": -121.9887, + "city": "Hamilton", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98256, + "latitude": 47.81179, + "longitude": -121.549712, + "city": "Index", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98257, + "latitude": 48.414123, + "longitude": -122.508364, + "city": "La Conner", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98258, + "latitude": 48.046751, + "longitude": -122.056379, + "city": "Lake Stevens", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98259, + "latitude": 48.037258, + "longitude": -121.682271, + "city": "North Lakewood", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98260, + "latitude": 48.031815, + "longitude": -122.458831, + "city": "Langley", + "state": "WA", + "county": "Island" + }, + { + "zip_code": 98261, + "latitude": 48.498773, + "longitude": -122.874334, + "city": "Lopez Island", + "state": "WA", + "county": "San Juan" + }, + { + "zip_code": 98262, + "latitude": 48.713022, + "longitude": -122.67647, + "city": "Lummi Island", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98263, + "latitude": 48.534462, + "longitude": -122.058644, + "city": "Lyman", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98264, + "latitude": 48.932328, + "longitude": -122.436249, + "city": "Lynden", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98266, + "latitude": 48.853213, + "longitude": -122.247881, + "city": "Maple Falls", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98267, + "latitude": 48.537813, + "longitude": -121.47384, + "city": "Marblemount", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98270, + "latitude": 48.049576, + "longitude": -122.161951, + "city": "Marysville", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98271, + "latitude": 48.079149, + "longitude": -122.234168, + "city": "Marysville", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98272, + "latitude": 47.863149, + "longitude": -121.88433, + "city": "Monroe", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98273, + "latitude": 48.435248, + "longitude": -122.208184, + "city": "Mount Vernon", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98274, + "latitude": 48.364253, + "longitude": -122.140311, + "city": "Mount Vernon", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98275, + "latitude": 47.912402, + "longitude": -122.302114, + "city": "Mukilteo", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98276, + "latitude": 48.834208, + "longitude": -122.335734, + "city": "Nooksack", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98277, + "latitude": 48.319858, + "longitude": -122.629353, + "city": "Oak Harbor", + "state": "WA", + "county": "Island" + }, + { + "zip_code": 98278, + "latitude": 48.310127, + "longitude": -122.655862, + "city": "Oak Harbor", + "state": "WA", + "county": "Island" + }, + { + "zip_code": 98279, + "latitude": 48.557824, + "longitude": -122.983742, + "city": "Olga", + "state": "WA", + "county": "San Juan" + }, + { + "zip_code": 98280, + "latitude": 48.590114, + "longitude": -122.940972, + "city": "Orcas", + "state": "WA", + "county": "San Juan" + }, + { + "zip_code": 98281, + "latitude": 48.987386, + "longitude": -123.058243, + "city": "Point Roberts", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98282, + "latitude": "", + "longitude": "", + "city": "Camano Island", + "state": "WA", + "county": "Island" + }, + { + "zip_code": 98283, + "latitude": 48.428261, + "longitude": -121.609872, + "city": "Rockport", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98284, + "latitude": 48.486147, + "longitude": -122.137243, + "city": "Sedro Woolley", + "state": "WA", + "county": "Skagit" + }, + { + "zip_code": 98286, + "latitude": 48.557824, + "longitude": -122.983742, + "city": "Shaw Island", + "state": "WA", + "county": "San Juan" + }, + { + "zip_code": 98287, + "latitude": 48.037258, + "longitude": -121.682271, + "city": "Silvana", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98288, + "latitude": 47.722245, + "longitude": -121.369352, + "city": "Skykomish", + "state": "WA", + "county": "King" + }, + { + "zip_code": 98290, + "latitude": 47.954558, + "longitude": -122.014722, + "city": "Snohomish", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98291, + "latitude": 47.909511, + "longitude": -122.050108, + "city": "Snohomish", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98292, + "latitude": 48.080148, + "longitude": -122.1064, + "city": "Stanwood", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98293, + "latitude": 47.870275, + "longitude": -121.76849, + "city": "Startup", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98294, + "latitude": 47.869494, + "longitude": -121.731275, + "city": "Sultan", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98295, + "latitude": 48.953377, + "longitude": -122.19886, + "city": "Sumas", + "state": "WA", + "county": "Whatcom" + }, + { + "zip_code": 98296, + "latitude": 47.857915, + "longitude": -122.092025, + "city": "Snohomish", + "state": "WA", + "county": "Snohomish" + }, + { + "zip_code": 98297, + "latitude": 48.557824, + "longitude": -122.983742, + "city": "Waldron", + "state": "WA", + "county": "San Juan" + }, + { + "zip_code": 98303, + "latitude": 47.156263, + "longitude": -122.706706, + "city": "Anderson Island", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98304, + "latitude": 46.752611, + "longitude": -122.05517, + "city": "Ashford", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98305, + "latitude": 48.006094, + "longitude": -124.360572, + "city": "Beaver", + "state": "WA", + "county": "Clallam" + }, + { + "zip_code": 98310, + "latitude": 47.606478, + "longitude": -122.634712, + "city": "Bremerton", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98311, + "latitude": 47.627129, + "longitude": -122.637276, + "city": "Bremerton", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98312, + "latitude": 47.578921, + "longitude": -122.79859, + "city": "Bremerton", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98314, + "latitude": 47.559317, + "longitude": -122.64915, + "city": "Bremerton", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98315, + "latitude": 47.690048, + "longitude": -122.712678, + "city": "Silverdale", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98320, + "latitude": 47.698291, + "longitude": -122.943809, + "city": "Brinnon", + "state": "WA", + "county": "Jefferson" + }, + { + "zip_code": 98321, + "latitude": 47.152347, + "longitude": -122.079177, + "city": "Buckley", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98322, + "latitude": 47.687971, + "longitude": -122.729304, + "city": "Burley", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98323, + "latitude": 47.05221, + "longitude": -122.025502, + "city": "Carbonado", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98324, + "latitude": 48.18315, + "longitude": -123.872972, + "city": "Carlsborg", + "state": "WA", + "county": "Clallam" + }, + { + "zip_code": 98325, + "latitude": 47.915272, + "longitude": -122.815701, + "city": "Chimacum", + "state": "WA", + "county": "Jefferson" + }, + { + "zip_code": 98326, + "latitude": 48.199745, + "longitude": -124.390233, + "city": "Clallam Bay", + "state": "WA", + "county": "Clallam" + }, + { + "zip_code": 98327, + "latitude": 47.090904, + "longitude": -122.656691, + "city": "Dupont", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98328, + "latitude": 46.904844, + "longitude": -122.30141, + "city": "Eatonville", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98329, + "latitude": 47.369501, + "longitude": -122.715346, + "city": "Gig Harbor", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98330, + "latitude": 46.777707, + "longitude": -122.202297, + "city": "Elbe", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98331, + "latitude": 47.976301, + "longitude": -124.369332, + "city": "Forks", + "state": "WA", + "county": "Clallam" + }, + { + "zip_code": 98332, + "latitude": 47.363745, + "longitude": -122.603703, + "city": "Gig Harbor", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98333, + "latitude": 47.248013, + "longitude": -122.628989, + "city": "Fox Island", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98335, + "latitude": 47.293619, + "longitude": -122.623504, + "city": "Gig Harbor", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98336, + "latitude": 46.53912, + "longitude": -122.100372, + "city": "Glenoma", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98337, + "latitude": 47.568617, + "longitude": -122.63735, + "city": "Bremerton", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98338, + "latitude": 46.96608, + "longitude": -122.384322, + "city": "Graham", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98339, + "latitude": 47.955331, + "longitude": -122.791259, + "city": "Port Hadlock", + "state": "WA", + "county": "Jefferson" + }, + { + "zip_code": 98340, + "latitude": 47.868952, + "longitude": -122.557486, + "city": "Hansville", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98342, + "latitude": 47.753544, + "longitude": -122.566561, + "city": "Indianola", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98343, + "latitude": 48.18315, + "longitude": -123.872972, + "city": "Joyce", + "state": "WA", + "county": "Clallam" + }, + { + "zip_code": 98344, + "latitude": 46.989916, + "longitude": -122.222642, + "city": "Kapowsin", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98345, + "latitude": 47.698025, + "longitude": -122.625529, + "city": "Keyport", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98346, + "latitude": 47.834483, + "longitude": -122.547078, + "city": "Kingston", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98348, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "La Grande", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98349, + "latitude": 47.288589, + "longitude": -122.777592, + "city": "Lakebay", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98350, + "latitude": 47.905203, + "longitude": -124.62608, + "city": "La Push", + "state": "WA", + "county": "Clallam" + }, + { + "zip_code": 98351, + "latitude": 47.207364, + "longitude": -122.772012, + "city": "Longbranch", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98352, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Sumner", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98353, + "latitude": 47.595155, + "longitude": -122.622513, + "city": "Manchester", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98354, + "latitude": 47.245769, + "longitude": -122.311073, + "city": "Milton", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98355, + "latitude": 46.713843, + "longitude": -122.093813, + "city": "Mineral", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98356, + "latitude": 46.591038, + "longitude": -122.068418, + "city": "Morton", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98357, + "latitude": 48.327961, + "longitude": -124.615051, + "city": "Neah Bay", + "state": "WA", + "county": "Clallam" + }, + { + "zip_code": 98358, + "latitude": 48.057776, + "longitude": -122.691213, + "city": "Nordland", + "state": "WA", + "county": "Jefferson" + }, + { + "zip_code": 98359, + "latitude": 47.435986, + "longitude": -122.580554, + "city": "Olalla", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98360, + "latitude": 47.006578, + "longitude": -122.118676, + "city": "Orting", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98361, + "latitude": 46.621697, + "longitude": -121.652807, + "city": "Packwood", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98362, + "latitude": 48.051108, + "longitude": -123.360411, + "city": "Port Angeles", + "state": "WA", + "county": "Clallam" + }, + { + "zip_code": 98363, + "latitude": 48.055733, + "longitude": -123.91784, + "city": "Port Angeles", + "state": "WA", + "county": "Clallam" + }, + { + "zip_code": 98364, + "latitude": 47.834431, + "longitude": -122.592763, + "city": "Port Gamble", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98365, + "latitude": 47.911892, + "longitude": -122.709606, + "city": "Port Ludlow", + "state": "WA", + "county": "Jefferson" + }, + { + "zip_code": 98366, + "latitude": 47.542664, + "longitude": -122.587102, + "city": "Port Orchard", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98367, + "latitude": 47.470651, + "longitude": -122.650972, + "city": "Port Orchard", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98368, + "latitude": 48.018572, + "longitude": -122.849683, + "city": "Port Townsend", + "state": "WA", + "county": "Jefferson" + }, + { + "zip_code": 98370, + "latitude": 47.751046, + "longitude": -122.614094, + "city": "Poulsbo", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98371, + "latitude": 47.212822, + "longitude": -122.317148, + "city": "Puyallup", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98372, + "latitude": 47.197581, + "longitude": -122.162076, + "city": "Puyallup", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98373, + "latitude": 47.145817, + "longitude": -122.309704, + "city": "Puyallup", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98374, + "latitude": 47.139095, + "longitude": -122.258646, + "city": "Puyallup", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98375, + "latitude": 47.098845, + "longitude": -122.36393, + "city": "Puyallup", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98376, + "latitude": 47.828495, + "longitude": -122.838769, + "city": "Quilcene", + "state": "WA", + "county": "Jefferson" + }, + { + "zip_code": 98377, + "latitude": 46.516754, + "longitude": -121.894411, + "city": "Randle", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98378, + "latitude": 47.687971, + "longitude": -122.729304, + "city": "Retsil", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98380, + "latitude": 47.591261, + "longitude": -122.868581, + "city": "Seabeck", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98381, + "latitude": 48.288633, + "longitude": -124.397803, + "city": "Sekiu", + "state": "WA", + "county": "Clallam" + }, + { + "zip_code": 98382, + "latitude": 48.06773, + "longitude": -123.080362, + "city": "Sequim", + "state": "WA", + "county": "Clallam" + }, + { + "zip_code": 98383, + "latitude": 47.672498, + "longitude": -122.707982, + "city": "Silverdale", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98384, + "latitude": 47.521803, + "longitude": -122.539637, + "city": "South Colby", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98385, + "latitude": 47.138271, + "longitude": -122.096799, + "city": "South Prairie", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98386, + "latitude": 47.51037, + "longitude": -122.499139, + "city": "Southworth", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98387, + "latitude": 47.058452, + "longitude": -122.41648, + "city": "Spanaway", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98388, + "latitude": 47.132671, + "longitude": -122.331781, + "city": "Steilacoom", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98390, + "latitude": 47.176966, + "longitude": -122.15982, + "city": "Sumner", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98392, + "latitude": 47.732624, + "longitude": -122.564557, + "city": "Suquamish", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98393, + "latitude": 47.626717, + "longitude": -122.649953, + "city": "Tracyton", + "state": "WA", + "county": "Kitsap" + }, + { + "zip_code": 98394, + "latitude": 47.311117, + "longitude": -122.772503, + "city": "Vaughn", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98395, + "latitude": 47.266017, + "longitude": -122.832799, + "city": "Wauna", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98396, + "latitude": 47.109524, + "longitude": -122.037015, + "city": "Wilkeson", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98397, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Longmire", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98398, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Paradise Inn", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98401, + "latitude": 47.253671, + "longitude": -122.444335, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98402, + "latitude": 47.261502, + "longitude": -122.463308, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98403, + "latitude": 47.265371, + "longitude": -122.457087, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98404, + "latitude": 47.209131, + "longitude": -122.397929, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98405, + "latitude": 47.247871, + "longitude": -122.472793, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98406, + "latitude": 47.259216, + "longitude": -122.509235, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98407, + "latitude": 47.287606, + "longitude": -122.500486, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98408, + "latitude": 47.206871, + "longitude": -122.448534, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98409, + "latitude": 47.205777, + "longitude": -122.321095, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98411, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98412, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98413, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98415, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98416, + "latitude": 47.264577, + "longitude": -122.482076, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98418, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98421, + "latitude": 47.254021, + "longitude": -122.400133, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98422, + "latitude": 47.283379, + "longitude": -122.388781, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98424, + "latitude": 47.232513, + "longitude": -122.359432, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98430, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Camp Murray", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98431, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98433, + "latitude": 47.126735, + "longitude": -122.491749, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98438, + "latitude": 47.151297, + "longitude": -122.567631, + "city": "Mcchord Afb", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98439, + "latitude": 47.128671, + "longitude": -122.510316, + "city": "Lakewood", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98442, + "latitude": 47.308061, + "longitude": -122.418495, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98443, + "latitude": 47.207371, + "longitude": -122.373466, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98444, + "latitude": 47.146371, + "longitude": -122.457172, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98445, + "latitude": 47.129145, + "longitude": -122.409355, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98446, + "latitude": 47.128485, + "longitude": -122.373631, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98447, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98450, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98455, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98460, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98464, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98465, + "latitude": 47.254749, + "longitude": -122.530336, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98466, + "latitude": 47.243075, + "longitude": -122.53936, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98467, + "latitude": 47.18717, + "longitude": -122.532335, + "city": "University Place", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98471, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98477, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98481, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98492, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Lakewood", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98493, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Tacoma", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98497, + "latitude": 47.066193, + "longitude": -122.113223, + "city": "Lakewood", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98498, + "latitude": 47.159149, + "longitude": -122.548486, + "city": "Lakewood", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98499, + "latitude": 47.16772, + "longitude": -122.50236, + "city": "Lakewood", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98501, + "latitude": 46.984767, + "longitude": -122.869079, + "city": "Olympia", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98502, + "latitude": 47.104269, + "longitude": -123.055153, + "city": "Olympia", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98503, + "latitude": 47.026418, + "longitude": -122.796695, + "city": "Lacey", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98504, + "latitude": 46.978118, + "longitude": -122.702393, + "city": "Olympia", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98505, + "latitude": 47.065404, + "longitude": -122.976187, + "city": "Olympia", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98506, + "latitude": 47.104227, + "longitude": -122.870043, + "city": "Olympia", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98507, + "latitude": 46.978118, + "longitude": -122.702393, + "city": "Olympia", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98508, + "latitude": 46.978118, + "longitude": -122.702393, + "city": "Olympia", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98509, + "latitude": 46.978118, + "longitude": -122.702393, + "city": "Lacey", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98511, + "latitude": "", + "longitude": "", + "city": "Tumwater", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98512, + "latitude": 46.949776, + "longitude": -123.021207, + "city": "Olympia", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98513, + "latitude": 46.993897, + "longitude": -122.743016, + "city": "Olympia", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98516, + "latitude": 47.112575, + "longitude": -122.779419, + "city": "Olympia", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98520, + "latitude": 47.002735, + "longitude": -123.67129, + "city": "Aberdeen", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98522, + "latitude": 46.571323, + "longitude": -123.298384, + "city": "Adna", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98524, + "latitude": 47.322429, + "longitude": -122.984003, + "city": "Allyn", + "state": "WA", + "county": "Mason" + }, + { + "zip_code": 98526, + "latitude": 47.485913, + "longitude": -123.920555, + "city": "Amanda Park", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98527, + "latitude": 46.637057, + "longitude": -123.884996, + "city": "Bay Center", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98528, + "latitude": 47.432465, + "longitude": -122.928877, + "city": "Belfair", + "state": "WA", + "county": "Mason" + }, + { + "zip_code": 98530, + "latitude": 46.798216, + "longitude": -122.871798, + "city": "Bucoda", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98531, + "latitude": 46.713822, + "longitude": -123.01046, + "city": "Centralia", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98532, + "latitude": 46.615653, + "longitude": -123.024845, + "city": "Chehalis", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98533, + "latitude": 46.579292, + "longitude": -122.568709, + "city": "Cinebar", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98535, + "latitude": 47.149086, + "longitude": -124.139665, + "city": "Copalis Beach", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98536, + "latitude": 47.159136, + "longitude": -124.135203, + "city": "Copalis Crossing", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98537, + "latitude": 46.878164, + "longitude": -123.64539, + "city": "Cosmopolis", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98538, + "latitude": 46.495639, + "longitude": -123.146764, + "city": "Curtis", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98539, + "latitude": 46.637834, + "longitude": -123.280421, + "city": "Doty", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98540, + "latitude": 46.978118, + "longitude": -122.702393, + "city": "East Olympia", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98541, + "latitude": 47.16, + "longitude": -123.736287, + "city": "Elma", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98542, + "latitude": 46.530022, + "longitude": -122.724004, + "city": "Ethel", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98544, + "latitude": 46.734909, + "longitude": -123.02536, + "city": "Galvin", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98546, + "latitude": 47.327254, + "longitude": -122.916256, + "city": "Grapeview", + "state": "WA", + "county": "Mason" + }, + { + "zip_code": 98547, + "latitude": 46.826407, + "longitude": -124.094009, + "city": "Grayland", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98548, + "latitude": 47.446972, + "longitude": -123.198634, + "city": "Hoodsport", + "state": "WA", + "county": "Mason" + }, + { + "zip_code": 98550, + "latitude": 47.101202, + "longitude": -123.731611, + "city": "Hoquiam", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98552, + "latitude": 47.342898, + "longitude": -123.929112, + "city": "Humptulips", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98554, + "latitude": 46.561375, + "longitude": -123.54788, + "city": "Lebam", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98555, + "latitude": 47.532281, + "longitude": -123.049632, + "city": "Lilliwaup", + "state": "WA", + "county": "Mason" + }, + { + "zip_code": 98556, + "latitude": 46.902376, + "longitude": -123.017043, + "city": "Littlerock", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98557, + "latitude": 47.029716, + "longitude": -123.272999, + "city": "Mccleary", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98558, + "latitude": 46.955863, + "longitude": -122.55585, + "city": "Mckenna", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98559, + "latitude": 46.958918, + "longitude": -123.326762, + "city": "Malone", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98560, + "latitude": 47.263601, + "longitude": -123.441178, + "city": "Matlock", + "state": "WA", + "county": "Mason" + }, + { + "zip_code": 98561, + "latitude": 46.514625, + "longitude": -123.76903, + "city": "Menlo", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98562, + "latitude": 47.162482, + "longitude": -123.794069, + "city": "Moclips", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98563, + "latitude": 47.015536, + "longitude": -123.719565, + "city": "Montesano", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98564, + "latitude": 46.50281, + "longitude": -122.468293, + "city": "Mossyrock", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98565, + "latitude": 46.579281, + "longitude": -122.909666, + "city": "Napavine", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98566, + "latitude": 47.387674, + "longitude": -123.890317, + "city": "Neilton", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98568, + "latitude": 46.866084, + "longitude": -123.283859, + "city": "Oakville", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98569, + "latitude": 47.071971, + "longitude": -124.152461, + "city": "Ocean Shores", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98570, + "latitude": 46.563491, + "longitude": -122.690491, + "city": "Onalaska", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98571, + "latitude": 47.219468, + "longitude": -124.191502, + "city": "Pacific Beach", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98572, + "latitude": 46.582897, + "longitude": -123.314715, + "city": "Pe Ell", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98575, + "latitude": 47.46028, + "longitude": -123.830676, + "city": "Quinault", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98576, + "latitude": 46.873509, + "longitude": -122.661394, + "city": "Rainier", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98577, + "latitude": 46.653496, + "longitude": -123.657572, + "city": "Raymond", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98579, + "latitude": 46.832816, + "longitude": -123.05927, + "city": "Rochester", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98580, + "latitude": 46.93823, + "longitude": -122.468087, + "city": "Roy", + "state": "WA", + "county": "Pierce" + }, + { + "zip_code": 98581, + "latitude": 46.379714, + "longitude": -123.056039, + "city": "Ryderwood", + "state": "WA", + "county": "Cowlitz" + }, + { + "zip_code": 98582, + "latitude": 46.514633, + "longitude": -122.648072, + "city": "Salkum", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98583, + "latitude": 47.002178, + "longitude": -123.483596, + "city": "Satsop", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98584, + "latitude": 47.263255, + "longitude": -123.159683, + "city": "Shelton", + "state": "WA", + "county": "Mason" + }, + { + "zip_code": 98585, + "latitude": 46.546091, + "longitude": -122.487578, + "city": "Silver Creek", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98586, + "latitude": 46.588006, + "longitude": -123.834262, + "city": "South Bend", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98587, + "latitude": 47.230148, + "longitude": -124.232056, + "city": "Taholah", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98588, + "latitude": 47.434953, + "longitude": -123.096769, + "city": "Tahuya", + "state": "WA", + "county": "Mason" + }, + { + "zip_code": 98589, + "latitude": 46.84275, + "longitude": -122.849451, + "city": "Tenino", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98590, + "latitude": 46.730891, + "longitude": -124.027885, + "city": "Tokeland", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98591, + "latitude": 46.456038, + "longitude": -122.79498, + "city": "Toledo", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98592, + "latitude": 47.336838, + "longitude": -123.074952, + "city": "Union", + "state": "WA", + "county": "Mason" + }, + { + "zip_code": 98593, + "latitude": 46.423038, + "longitude": -122.973972, + "city": "Vader", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98595, + "latitude": 46.894327, + "longitude": -123.965158, + "city": "Westport", + "state": "WA", + "county": "Grays Harbor" + }, + { + "zip_code": 98596, + "latitude": 46.490874, + "longitude": -122.879917, + "city": "Winlock", + "state": "WA", + "county": "Lewis" + }, + { + "zip_code": 98597, + "latitude": 46.882364, + "longitude": -122.562689, + "city": "Yelm", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98599, + "latitude": 46.978118, + "longitude": -122.702393, + "city": "Olympia", + "state": "WA", + "county": "Thurston" + }, + { + "zip_code": 98601, + "latitude": 45.923556, + "longitude": -122.450194, + "city": "Amboy", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98602, + "latitude": 45.850437, + "longitude": -121.312852, + "city": "Appleton", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 98603, + "latitude": 45.999338, + "longitude": -122.442472, + "city": "Ariel", + "state": "WA", + "county": "Cowlitz" + }, + { + "zip_code": 98604, + "latitude": 45.803592, + "longitude": -122.531645, + "city": "Battle Ground", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98605, + "latitude": 45.721519, + "longitude": -121.447323, + "city": "Bingen", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 98606, + "latitude": 45.731631, + "longitude": -122.477093, + "city": "Brush Prairie", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98607, + "latitude": 45.656489, + "longitude": -122.399341, + "city": "Camas", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98609, + "latitude": 46.071482, + "longitude": -122.864838, + "city": "Carrolls", + "state": "WA", + "county": "Cowlitz" + }, + { + "zip_code": 98610, + "latitude": 45.784205, + "longitude": -121.841736, + "city": "Carson", + "state": "WA", + "county": "Skamania" + }, + { + "zip_code": 98611, + "latitude": 46.220778, + "longitude": -122.673021, + "city": "Castle Rock", + "state": "WA", + "county": "Cowlitz" + }, + { + "zip_code": 98612, + "latitude": 46.214628, + "longitude": -123.334899, + "city": "Cathlamet", + "state": "WA", + "county": "Wahkiakum" + }, + { + "zip_code": 98613, + "latitude": 45.738205, + "longitude": -120.993902, + "city": "Centerville", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 98614, + "latitude": 46.263023, + "longitude": -123.933161, + "city": "Chinook", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98616, + "latitude": 46.025434, + "longitude": -122.359589, + "city": "Cougar", + "state": "WA", + "county": "Cowlitz" + }, + { + "zip_code": 98617, + "latitude": 45.632681, + "longitude": -121.17169, + "city": "Dallesport", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 98619, + "latitude": 45.989951, + "longitude": -121.282054, + "city": "Glenwood", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 98620, + "latitude": 45.840666, + "longitude": -120.768762, + "city": "Goldendale", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 98621, + "latitude": 46.355461, + "longitude": -123.597874, + "city": "Grays River", + "state": "WA", + "county": "Wahkiakum" + }, + { + "zip_code": 98622, + "latitude": 45.801586, + "longitude": -122.520347, + "city": "Heisson", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98623, + "latitude": 45.807631, + "longitude": -121.487682, + "city": "Husum", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 98624, + "latitude": 46.317185, + "longitude": -123.999449, + "city": "Ilwaco", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98625, + "latitude": 46.002114, + "longitude": -122.72175, + "city": "Kalama", + "state": "WA", + "county": "Cowlitz" + }, + { + "zip_code": 98626, + "latitude": 46.147274, + "longitude": -122.825047, + "city": "Kelso", + "state": "WA", + "county": "Cowlitz" + }, + { + "zip_code": 98628, + "latitude": 45.856217, + "longitude": -121.044345, + "city": "Klickitat", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 98629, + "latitude": 45.881459, + "longitude": -122.615416, + "city": "La Center", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98631, + "latitude": 46.376798, + "longitude": -123.995591, + "city": "Long Beach", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98632, + "latitude": 46.181872, + "longitude": -123.057597, + "city": "Longview", + "state": "WA", + "county": "Cowlitz" + }, + { + "zip_code": 98635, + "latitude": 45.822789, + "longitude": -121.213705, + "city": "Lyle", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 98637, + "latitude": 46.514625, + "longitude": -123.76903, + "city": "Nahcotta", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98638, + "latitude": 46.342219, + "longitude": -123.802552, + "city": "Naselle", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98639, + "latitude": 45.641704, + "longitude": -122.005783, + "city": "North Bonneville", + "state": "WA", + "county": "Skamania" + }, + { + "zip_code": 98640, + "latitude": 46.495565, + "longitude": -124.040389, + "city": "Ocean Park", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98641, + "latitude": 46.544789, + "longitude": -124.042671, + "city": "Oysterville", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98642, + "latitude": 45.756797, + "longitude": -122.620162, + "city": "Ridgefield", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98643, + "latitude": 46.310011, + "longitude": -123.614319, + "city": "Rosburg", + "state": "WA", + "county": "Wahkiakum" + }, + { + "zip_code": 98644, + "latitude": 46.330755, + "longitude": -124.04553, + "city": "Seaview", + "state": "WA", + "county": "Pacific" + }, + { + "zip_code": 98645, + "latitude": 46.314662, + "longitude": -122.728835, + "city": "Silverlake", + "state": "WA", + "county": "Cowlitz" + }, + { + "zip_code": 98647, + "latitude": 46.300349, + "longitude": -123.456145, + "city": "Skamokawa", + "state": "WA", + "county": "Wahkiakum" + }, + { + "zip_code": 98648, + "latitude": 45.673707, + "longitude": -121.912581, + "city": "Stevenson", + "state": "WA", + "county": "Skamania" + }, + { + "zip_code": 98649, + "latitude": 46.334539, + "longitude": -122.647324, + "city": "Toutle", + "state": "WA", + "county": "Cowlitz" + }, + { + "zip_code": 98650, + "latitude": 45.958949, + "longitude": -121.53564, + "city": "Trout Lake", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 98651, + "latitude": 45.75826, + "longitude": -121.576567, + "city": "Underwood", + "state": "WA", + "county": "Skamania" + }, + { + "zip_code": 98660, + "latitude": 45.74327, + "longitude": -122.713366, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98661, + "latitude": 45.769989, + "longitude": -122.643658, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98662, + "latitude": 45.691419, + "longitude": -122.580457, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98663, + "latitude": 45.650488, + "longitude": -122.663608, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98664, + "latitude": 45.620669, + "longitude": -122.576413, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98665, + "latitude": 45.689187, + "longitude": -122.661608, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98666, + "latitude": 45.801586, + "longitude": -122.520347, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98667, + "latitude": 45.801586, + "longitude": -122.520347, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98668, + "latitude": 45.801586, + "longitude": -122.520347, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98670, + "latitude": 45.810317, + "longitude": -121.302305, + "city": "Wahkiacus", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 98671, + "latitude": 45.611697, + "longitude": -122.315559, + "city": "Washougal", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98672, + "latitude": 45.828588, + "longitude": -121.405863, + "city": "White Salmon", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 98673, + "latitude": 45.641548, + "longitude": -121.07317, + "city": "Wishram", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 98674, + "latitude": 45.937521, + "longitude": -122.686548, + "city": "Woodland", + "state": "WA", + "county": "Cowlitz" + }, + { + "zip_code": 98675, + "latitude": 45.824611, + "longitude": -122.498993, + "city": "Yacolt", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98682, + "latitude": 45.678782, + "longitude": -122.478845, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98683, + "latitude": 45.603216, + "longitude": -122.513318, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98684, + "latitude": 45.6359, + "longitude": -122.515538, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98685, + "latitude": 45.754637, + "longitude": -122.696001, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98686, + "latitude": 45.705566, + "longitude": -122.572193, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98687, + "latitude": 45.801586, + "longitude": -122.520347, + "city": "Vancouver", + "state": "WA", + "county": "Clark" + }, + { + "zip_code": 98801, + "latitude": 47.573816, + "longitude": -120.351884, + "city": "Wenatchee", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98802, + "latitude": 47.497831, + "longitude": -120.214402, + "city": "East Wenatchee", + "state": "WA", + "county": "Douglas" + }, + { + "zip_code": 98807, + "latitude": 47.905787, + "longitude": -120.520211, + "city": "Wenatchee", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98811, + "latitude": 47.708473, + "longitude": -120.329107, + "city": "Ardenvoir", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98812, + "latitude": 48.365236, + "longitude": -119.829391, + "city": "Brewster", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98813, + "latitude": 47.735893, + "longitude": -119.891998, + "city": "Bridgeport", + "state": "WA", + "county": "Douglas" + }, + { + "zip_code": 98814, + "latitude": 48.551984, + "longitude": -119.812938, + "city": "Carlton", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98815, + "latitude": 47.6329, + "longitude": -120.348064, + "city": "Cashmere", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98816, + "latitude": 47.876985, + "longitude": -120.07775, + "city": "Chelan", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98817, + "latitude": 47.841829, + "longitude": -119.957918, + "city": "Chelan Falls", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98819, + "latitude": 48.546905, + "longitude": -119.75262, + "city": "Conconully", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98821, + "latitude": 47.582186, + "longitude": -120.595955, + "city": "Dryden", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98822, + "latitude": 47.774872, + "longitude": -120.356279, + "city": "Entiat", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98823, + "latitude": 47.177565, + "longitude": -119.401958, + "city": "Ephrata", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 98824, + "latitude": 47.079243, + "longitude": -119.860117, + "city": "George", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 98826, + "latitude": 47.695101, + "longitude": -120.799413, + "city": "Leavenworth", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98827, + "latitude": 48.892514, + "longitude": -119.721016, + "city": "Loomis", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98828, + "latitude": 47.319535, + "longitude": -120.173347, + "city": "Malaga", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98829, + "latitude": 48.248002, + "longitude": -119.75246, + "city": "Malott", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98830, + "latitude": 47.847735, + "longitude": -119.525987, + "city": "Mansfield", + "state": "WA", + "county": "Douglas" + }, + { + "zip_code": 98831, + "latitude": 47.817133, + "longitude": -120.080148, + "city": "Manson", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98832, + "latitude": 47.301392, + "longitude": -119.063956, + "city": "Marlin", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 98833, + "latitude": 48.619527, + "longitude": -120.457954, + "city": "Mazama", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98834, + "latitude": 48.139518, + "longitude": -120.046348, + "city": "Methow", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98836, + "latitude": 47.485197, + "longitude": -120.415773, + "city": "Monitor", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98837, + "latitude": 47.180684, + "longitude": -119.298979, + "city": "Moses Lake", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 98840, + "latitude": 48.577378, + "longitude": -119.956787, + "city": "Okanogan", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98841, + "latitude": 48.426942, + "longitude": -119.560672, + "city": "Omak", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98843, + "latitude": 47.73051, + "longitude": -120.045781, + "city": "Orondo", + "state": "WA", + "county": "Douglas" + }, + { + "zip_code": 98844, + "latitude": 48.681342, + "longitude": -119.579107, + "city": "Oroville", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98845, + "latitude": 47.393566, + "longitude": -119.90361, + "city": "Palisades", + "state": "WA", + "county": "Douglas" + }, + { + "zip_code": 98846, + "latitude": 48.411234, + "longitude": -119.742154, + "city": "Pateros", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98847, + "latitude": 47.545758, + "longitude": -120.596146, + "city": "Peshastin", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98848, + "latitude": 47.182173, + "longitude": -119.754143, + "city": "Quincy", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 98849, + "latitude": 48.518361, + "longitude": -119.434674, + "city": "Riverside", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98850, + "latitude": 47.312058, + "longitude": -120.103205, + "city": "Rock Island", + "state": "WA", + "county": "Douglas" + }, + { + "zip_code": 98851, + "latitude": 47.404594, + "longitude": -119.442377, + "city": "Soap Lake", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 98852, + "latitude": 47.905787, + "longitude": -120.520211, + "city": "Stehekin", + "state": "WA", + "county": "Chelan" + }, + { + "zip_code": 98853, + "latitude": 47.404308, + "longitude": -119.312977, + "city": "Stratford", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 98855, + "latitude": 48.502603, + "longitude": -119.542935, + "city": "Tonasket", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98856, + "latitude": 48.446836, + "longitude": -119.811252, + "city": "Twisp", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98857, + "latitude": 47.013759, + "longitude": -119.087915, + "city": "Warden", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 98858, + "latitude": 47.701979, + "longitude": -119.86123, + "city": "Waterville", + "state": "WA", + "county": "Douglas" + }, + { + "zip_code": 98859, + "latitude": 48.798456, + "longitude": -119.025578, + "city": "Wauconda", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98860, + "latitude": 47.473874, + "longitude": -119.18473, + "city": "Wilson Creek", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 98862, + "latitude": 48.500635, + "longitude": -120.372447, + "city": "Winthrop", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 98901, + "latitude": 46.644476, + "longitude": -120.725557, + "city": "Yakima", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98902, + "latitude": 46.420138, + "longitude": -120.29712, + "city": "Yakima", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98903, + "latitude": 46.544506, + "longitude": -120.744393, + "city": "Yakima", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98904, + "latitude": 46.56451, + "longitude": -120.694658, + "city": "Yakima", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98907, + "latitude": 46.628757, + "longitude": -120.573967, + "city": "Yakima", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98908, + "latitude": 46.527811, + "longitude": -120.687412, + "city": "Yakima", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98909, + "latitude": 46.637538, + "longitude": -120.794978, + "city": "Yakima", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98920, + "latitude": 46.56451, + "longitude": -120.694658, + "city": "Brownstown", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98921, + "latitude": 46.421218, + "longitude": -120.315141, + "city": "Buena", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98922, + "latitude": 47.156558, + "longitude": -120.806926, + "city": "Cle Elum", + "state": "WA", + "county": "Kittitas" + }, + { + "zip_code": 98923, + "latitude": 46.678192, + "longitude": -120.753007, + "city": "Cowiche", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98925, + "latitude": 47.232953, + "longitude": -121.177187, + "city": "Easton", + "state": "WA", + "county": "Kittitas" + }, + { + "zip_code": 98926, + "latitude": 47.028084, + "longitude": -120.48998, + "city": "Ellensburg", + "state": "WA", + "county": "Kittitas" + }, + { + "zip_code": 98929, + "latitude": 46.915735, + "longitude": -121.241591, + "city": "Goose Prairie", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98930, + "latitude": 46.45594, + "longitude": -120.312088, + "city": "Grandview", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98932, + "latitude": 46.340157, + "longitude": -120.15493, + "city": "Granger", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98933, + "latitude": 46.323528, + "longitude": -120.375459, + "city": "Harrah", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98934, + "latitude": 46.980645, + "longitude": -120.416259, + "city": "Kittitas", + "state": "WA", + "county": "Kittitas" + }, + { + "zip_code": 98935, + "latitude": 46.165237, + "longitude": -120.050377, + "city": "Mabton", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98936, + "latitude": 46.410236, + "longitude": -120.233518, + "city": "Moxee", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98937, + "latitude": 46.805796, + "longitude": -120.992096, + "city": "Naches", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98938, + "latitude": 46.366004, + "longitude": -120.119917, + "city": "Outlook", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98939, + "latitude": 46.56451, + "longitude": -120.694658, + "city": "Parker", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98940, + "latitude": 47.250307, + "longitude": -121.045575, + "city": "Ronald", + "state": "WA", + "county": "Kittitas" + }, + { + "zip_code": 98941, + "latitude": 47.223287, + "longitude": -121.002513, + "city": "Roslyn", + "state": "WA", + "county": "Kittitas" + }, + { + "zip_code": 98942, + "latitude": 46.544316, + "longitude": -120.396038, + "city": "Selah", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98943, + "latitude": 47.188645, + "longitude": -120.95368, + "city": "South Cle Elum", + "state": "WA", + "county": "Kittitas" + }, + { + "zip_code": 98944, + "latitude": 46.373611, + "longitude": -120.01059, + "city": "Sunnyside", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98946, + "latitude": 47.073905, + "longitude": -120.758301, + "city": "Thorp", + "state": "WA", + "county": "Kittitas" + }, + { + "zip_code": 98947, + "latitude": 46.740371, + "longitude": -120.693103, + "city": "Tieton", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98948, + "latitude": 46.328522, + "longitude": -120.370257, + "city": "Toppenish", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98950, + "latitude": 46.871354, + "longitude": -119.985869, + "city": "Vantage", + "state": "WA", + "county": "Kittitas" + }, + { + "zip_code": 98951, + "latitude": 46.522398, + "longitude": -120.508444, + "city": "Wapato", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98952, + "latitude": 46.449869, + "longitude": -120.667145, + "city": "White Swan", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 98953, + "latitude": 46.419838, + "longitude": -120.231713, + "city": "Zillah", + "state": "WA", + "county": "Yakima" + }, + { + "zip_code": 99001, + "latitude": 47.643803, + "longitude": -117.59205, + "city": "Airway Heights", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99003, + "latitude": 47.92167, + "longitude": -117.262989, + "city": "Chattaroy", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99004, + "latitude": 47.6067, + "longitude": -117.500285, + "city": "Cheney", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99005, + "latitude": 47.852847, + "longitude": -117.337529, + "city": "Colbert", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99006, + "latitude": 47.73874, + "longitude": -117.442395, + "city": "Deer Park", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99008, + "latitude": 47.60894, + "longitude": -118.399551, + "city": "Edwall", + "state": "WA", + "county": "Lincoln" + }, + { + "zip_code": 99009, + "latitude": 47.992362, + "longitude": -117.26615, + "city": "Elk", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99011, + "latitude": 47.633161, + "longitude": -117.654603, + "city": "Fairchild Air Force Base", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99012, + "latitude": 47.405253, + "longitude": -117.17253, + "city": "Fairfield", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99013, + "latitude": 47.913372, + "longitude": -117.797447, + "city": "Ford", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99014, + "latitude": 47.55988, + "longitude": -117.595751, + "city": "Four Lakes", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99015, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Freeman", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99016, + "latitude": 47.622784, + "longitude": -117.138178, + "city": "Greenacres", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99017, + "latitude": 46.96178, + "longitude": -117.687163, + "city": "Lamont", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99018, + "latitude": 47.299889, + "longitude": -117.139491, + "city": "Latah", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99019, + "latitude": 47.651635, + "longitude": -117.085845, + "city": "Liberty Lake", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99020, + "latitude": 47.617665, + "longitude": -117.592591, + "city": "Marshall", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99021, + "latitude": 47.834074, + "longitude": -117.240392, + "city": "Mead", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99022, + "latitude": 47.615007, + "longitude": -117.703977, + "city": "Medical Lake", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99023, + "latitude": 47.557733, + "longitude": -117.183637, + "city": "Mica", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99025, + "latitude": 47.76727, + "longitude": -117.090112, + "city": "Newman Lake", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99026, + "latitude": 47.799507, + "longitude": -117.619375, + "city": "Nine Mile Falls", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99027, + "latitude": 47.734728, + "longitude": -117.107735, + "city": "Otis Orchards", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99029, + "latitude": 47.701645, + "longitude": -117.755268, + "city": "Reardan", + "state": "WA", + "county": "Lincoln" + }, + { + "zip_code": 99030, + "latitude": 47.672177, + "longitude": -117.255465, + "city": "Rockford", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99031, + "latitude": 47.438748, + "longitude": -117.370017, + "city": "Spangle", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99032, + "latitude": 47.299844, + "longitude": -117.977732, + "city": "Sprague", + "state": "WA", + "county": "Lincoln" + }, + { + "zip_code": 99033, + "latitude": 47.226641, + "longitude": -117.096157, + "city": "Tekoa", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99034, + "latitude": 47.894108, + "longitude": -117.753629, + "city": "Tumtum", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99036, + "latitude": 47.520107, + "longitude": -117.270216, + "city": "Valleyford", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99037, + "latitude": 47.636834, + "longitude": -117.199587, + "city": "Veradale", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99039, + "latitude": 47.329704, + "longitude": -117.244981, + "city": "Waverly", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99040, + "latitude": 47.881367, + "longitude": -117.933742, + "city": "Wellpinit", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99101, + "latitude": 48.336378, + "longitude": -117.957926, + "city": "Addy", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99102, + "latitude": 46.934379, + "longitude": -117.412136, + "city": "Albion", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99103, + "latitude": 47.529705, + "longitude": -118.599193, + "city": "Almira", + "state": "WA", + "county": "Lincoln" + }, + { + "zip_code": 99104, + "latitude": 47.079345, + "longitude": -117.176954, + "city": "Belmont", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99105, + "latitude": 46.859127, + "longitude": -118.161058, + "city": "Benge", + "state": "WA", + "county": "Adams" + }, + { + "zip_code": 99107, + "latitude": 48.84269, + "longitude": -118.182764, + "city": "Boyds", + "state": "WA", + "county": "Ferry" + }, + { + "zip_code": 99109, + "latitude": 48.293181, + "longitude": -117.739245, + "city": "Chewelah", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99110, + "latitude": 48.007138, + "longitude": -117.557907, + "city": "Clayton", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99111, + "latitude": 46.959127, + "longitude": -117.505163, + "city": "Colfax", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99113, + "latitude": 46.575075, + "longitude": -117.206588, + "city": "Colton", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99114, + "latitude": 48.676916, + "longitude": -117.809315, + "city": "Colville", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99115, + "latitude": 47.737206, + "longitude": -119.227032, + "city": "Coulee City", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 99116, + "latitude": 48.037889, + "longitude": -118.941876, + "city": "Coulee Dam", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 99117, + "latitude": 47.644181, + "longitude": -118.450679, + "city": "Creston", + "state": "WA", + "county": "Lincoln" + }, + { + "zip_code": 99118, + "latitude": 48.894734, + "longitude": -118.669864, + "city": "Curlew", + "state": "WA", + "county": "Ferry" + }, + { + "zip_code": 99119, + "latitude": 48.510409, + "longitude": -117.348383, + "city": "Cusick", + "state": "WA", + "county": "Pend Oreille" + }, + { + "zip_code": 99121, + "latitude": 48.954016, + "longitude": -118.505768, + "city": "Danville", + "state": "WA", + "county": "Ferry" + }, + { + "zip_code": 99122, + "latitude": 47.712295, + "longitude": -118.122173, + "city": "Davenport", + "state": "WA", + "county": "Lincoln" + }, + { + "zip_code": 99123, + "latitude": 47.913065, + "longitude": -119.042562, + "city": "Electric City", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 99124, + "latitude": 48.015361, + "longitude": -118.954893, + "city": "Elmer City", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 99125, + "latitude": 46.911972, + "longitude": -117.702655, + "city": "Endicott", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99126, + "latitude": 48.740671, + "longitude": -117.972888, + "city": "Evans", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99127, + "latitude": 46.838747, + "longitude": -117.644337, + "city": "Saint John", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99128, + "latitude": 47.066613, + "longitude": -117.361435, + "city": "Farmington", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99129, + "latitude": 48.005075, + "longitude": -118.228564, + "city": "Fruitland", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99130, + "latitude": 46.929426, + "longitude": -117.170603, + "city": "Garfield", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99131, + "latitude": 48.268511, + "longitude": -118.113552, + "city": "Gifford", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99133, + "latitude": 47.822463, + "longitude": -119.042714, + "city": "Grand Coulee", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 99134, + "latitude": 47.478233, + "longitude": -118.254439, + "city": "Harrington", + "state": "WA", + "county": "Lincoln" + }, + { + "zip_code": 99135, + "latitude": 47.611505, + "longitude": -119.084131, + "city": "Hartline", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 99136, + "latitude": 46.697296, + "longitude": -117.941665, + "city": "Hay", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99137, + "latitude": 48.150398, + "longitude": -118.077422, + "city": "Hunters", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99138, + "latitude": 48.268566, + "longitude": -118.305461, + "city": "Inchelium", + "state": "WA", + "county": "Ferry" + }, + { + "zip_code": 99139, + "latitude": 48.737714, + "longitude": -117.36469, + "city": "Ione", + "state": "WA", + "county": "Pend Oreille" + }, + { + "zip_code": 99140, + "latitude": 48.889691, + "longitude": -118.217849, + "city": "Keller", + "state": "WA", + "county": "Ferry" + }, + { + "zip_code": 99141, + "latitude": 48.695338, + "longitude": -117.966943, + "city": "Kettle Falls", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99143, + "latitude": 46.759878, + "longitude": -117.728679, + "city": "Lacrosse", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99144, + "latitude": 47.60894, + "longitude": -118.399551, + "city": "Lamona", + "state": "WA", + "county": "Lincoln" + }, + { + "zip_code": 99146, + "latitude": 48.975272, + "longitude": -118.220816, + "city": "Laurier", + "state": "WA", + "county": "Ferry" + }, + { + "zip_code": 99147, + "latitude": 47.60894, + "longitude": -118.399551, + "city": "Lincoln", + "state": "WA", + "county": "Lincoln" + }, + { + "zip_code": 99148, + "latitude": 48.107165, + "longitude": -117.627815, + "city": "Loon Lake", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99149, + "latitude": 47.0101, + "longitude": -117.476605, + "city": "Malden", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99150, + "latitude": 48.810999, + "longitude": -118.604355, + "city": "Malo", + "state": "WA", + "county": "Ferry" + }, + { + "zip_code": 99151, + "latitude": 48.786802, + "longitude": -117.924021, + "city": "Marcus", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99152, + "latitude": 48.484729, + "longitude": -117.22144, + "city": "Metaline", + "state": "WA", + "county": "Pend Oreille" + }, + { + "zip_code": 99153, + "latitude": 48.731121, + "longitude": -117.339995, + "city": "Metaline Falls", + "state": "WA", + "county": "Pend Oreille" + }, + { + "zip_code": 99154, + "latitude": 47.60894, + "longitude": -118.399551, + "city": "Mohler", + "state": "WA", + "county": "Lincoln" + }, + { + "zip_code": 99155, + "latitude": 48.143441, + "longitude": -119.00938, + "city": "Nespelem", + "state": "WA", + "county": "Okanogan" + }, + { + "zip_code": 99156, + "latitude": 48.448981, + "longitude": -117.228067, + "city": "Newport", + "state": "WA", + "county": "Pend Oreille" + }, + { + "zip_code": 99157, + "latitude": 48.905142, + "longitude": -117.851127, + "city": "Northport", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99158, + "latitude": 47.079658, + "longitude": -117.41146, + "city": "Oakesdale", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99159, + "latitude": 47.344402, + "longitude": -118.658816, + "city": "Odessa", + "state": "WA", + "county": "Lincoln" + }, + { + "zip_code": 99160, + "latitude": 48.887781, + "longitude": -118.210467, + "city": "Orient", + "state": "WA", + "county": "Ferry" + }, + { + "zip_code": 99161, + "latitude": 46.770141, + "longitude": -117.157476, + "city": "Palouse", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99163, + "latitude": 46.82748, + "longitude": -117.317741, + "city": "Pullman", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99164, + "latitude": 46.838747, + "longitude": -117.644337, + "city": "Pullman", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99165, + "latitude": 46.838747, + "longitude": -117.644337, + "city": "Pullman", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99166, + "latitude": 48.667659, + "longitude": -118.680631, + "city": "Republic", + "state": "WA", + "county": "Ferry" + }, + { + "zip_code": 99167, + "latitude": 48.42424, + "longitude": -118.100693, + "city": "Rice", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99169, + "latitude": 47.087055, + "longitude": -118.4813, + "city": "Ritzville", + "state": "WA", + "county": "Adams" + }, + { + "zip_code": 99170, + "latitude": 47.034713, + "longitude": -117.4646, + "city": "Rosalia", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99171, + "latitude": 47.123718, + "longitude": -117.676432, + "city": "Saint John", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99173, + "latitude": 48.002188, + "longitude": -117.828964, + "city": "Springdale", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99174, + "latitude": 46.838747, + "longitude": -117.644337, + "city": "Steptoe", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99176, + "latitude": 47.12196, + "longitude": -117.433708, + "city": "Thornton", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99179, + "latitude": 46.545655, + "longitude": -117.10797, + "city": "Uniontown", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99180, + "latitude": 48.25013, + "longitude": -117.353111, + "city": "Usk", + "state": "WA", + "county": "Pend Oreille" + }, + { + "zip_code": 99181, + "latitude": 48.124594, + "longitude": -117.762554, + "city": "Valley", + "state": "WA", + "county": "Stevens" + }, + { + "zip_code": 99185, + "latitude": 47.761025, + "longitude": -118.729143, + "city": "Wilbur", + "state": "WA", + "county": "Lincoln" + }, + { + "zip_code": 99201, + "latitude": 47.66264, + "longitude": -117.435997, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99202, + "latitude": 47.613475, + "longitude": -117.515897, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99203, + "latitude": 47.629341, + "longitude": -117.406269, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99204, + "latitude": 47.650091, + "longitude": -117.429846, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99205, + "latitude": 47.693501, + "longitude": -117.44995, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99206, + "latitude": 47.665198, + "longitude": -117.373399, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99207, + "latitude": 47.693766, + "longitude": -117.379096, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99208, + "latitude": 47.780541, + "longitude": -117.455375, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99209, + "latitude": 47.646148, + "longitude": -117.793734, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99210, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99211, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99212, + "latitude": 47.670693, + "longitude": -117.310991, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99213, + "latitude": 47.656726, + "longitude": -117.282483, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99214, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99215, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99216, + "latitude": 47.671164, + "longitude": -117.19926, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99217, + "latitude": 47.737957, + "longitude": -117.25569, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99218, + "latitude": 47.75754, + "longitude": -117.407552, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99219, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99220, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99223, + "latitude": 47.592452, + "longitude": -117.34212, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99224, + "latitude": 47.628858, + "longitude": -117.551291, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99228, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99251, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99252, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99256, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99258, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99260, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99299, + "latitude": 47.653568, + "longitude": -117.431742, + "city": "Spokane", + "state": "WA", + "county": "Spokane" + }, + { + "zip_code": 99301, + "latitude": 46.42066, + "longitude": -118.899447, + "city": "Pasco", + "state": "WA", + "county": "Franklin" + }, + { + "zip_code": 99302, + "latitude": 46.234957, + "longitude": -119.094271, + "city": "Pasco", + "state": "WA", + "county": "Franklin" + }, + { + "zip_code": 99320, + "latitude": 46.24204, + "longitude": -119.483517, + "city": "Benton City", + "state": "WA", + "county": "Benton" + }, + { + "zip_code": 99321, + "latitude": 46.844992, + "longitude": -119.935689, + "city": "Beverly", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 99322, + "latitude": 45.887647, + "longitude": -120.281675, + "city": "Bickleton", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 99323, + "latitude": 46.196597, + "longitude": -118.901678, + "city": "Burbank", + "state": "WA", + "county": "Walla Walla" + }, + { + "zip_code": 99324, + "latitude": 46.047069, + "longitude": -118.409275, + "city": "College Place", + "state": "WA", + "county": "Walla Walla" + }, + { + "zip_code": 99326, + "latitude": 46.590118, + "longitude": -118.897786, + "city": "Connell", + "state": "WA", + "county": "Franklin" + }, + { + "zip_code": 99327, + "latitude": 46.828931, + "longitude": -118.829153, + "city": "Cunningham", + "state": "WA", + "county": "Adams" + }, + { + "zip_code": 99328, + "latitude": 46.392683, + "longitude": -117.94953, + "city": "Dayton", + "state": "WA", + "county": "Columbia" + }, + { + "zip_code": 99329, + "latitude": 46.140821, + "longitude": -118.153064, + "city": "Dixie", + "state": "WA", + "county": "Walla Walla" + }, + { + "zip_code": 99330, + "latitude": 46.508917, + "longitude": -118.992619, + "city": "Eltopia", + "state": "WA", + "county": "Franklin" + }, + { + "zip_code": 99332, + "latitude": 46.77062, + "longitude": -118.800049, + "city": "Hatton", + "state": "WA", + "county": "Adams" + }, + { + "zip_code": 99333, + "latitude": 46.838747, + "longitude": -117.644337, + "city": "Hooper", + "state": "WA", + "county": "Whitman" + }, + { + "zip_code": 99335, + "latitude": 46.677852, + "longitude": -118.53374, + "city": "Kahlotus", + "state": "WA", + "county": "Franklin" + }, + { + "zip_code": 99336, + "latitude": 46.212306, + "longitude": -119.155671, + "city": "Kennewick", + "state": "WA", + "county": "Benton" + }, + { + "zip_code": 99337, + "latitude": 46.117122, + "longitude": -119.090676, + "city": "Kennewick", + "state": "WA", + "county": "Benton" + }, + { + "zip_code": 99338, + "latitude": 46.155994, + "longitude": -119.263991, + "city": "Kennewick", + "state": "WA", + "county": "Benton" + }, + { + "zip_code": 99341, + "latitude": 46.904229, + "longitude": -118.690546, + "city": "Lind", + "state": "WA", + "county": "Adams" + }, + { + "zip_code": 99343, + "latitude": 46.577941, + "longitude": -119.162115, + "city": "Mesa", + "state": "WA", + "county": "Franklin" + }, + { + "zip_code": 99344, + "latitude": 46.852708, + "longitude": -118.993182, + "city": "Othello", + "state": "WA", + "county": "Adams" + }, + { + "zip_code": 99345, + "latitude": 45.859058, + "longitude": -119.857639, + "city": "Paterson", + "state": "WA", + "county": "Benton" + }, + { + "zip_code": 99346, + "latitude": 45.930067, + "longitude": -119.402276, + "city": "Plymouth", + "state": "WA", + "county": "Benton" + }, + { + "zip_code": 99347, + "latitude": 46.475341, + "longitude": -117.537763, + "city": "Pomeroy", + "state": "WA", + "county": "Garfield" + }, + { + "zip_code": 99348, + "latitude": 46.354972, + "longitude": -118.455541, + "city": "Prescott", + "state": "WA", + "county": "Walla Walla" + }, + { + "zip_code": 99349, + "latitude": 46.730957, + "longitude": -119.778257, + "city": "Mattawa", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 99350, + "latitude": 46.148328, + "longitude": -119.559674, + "city": "Prosser", + "state": "WA", + "county": "Benton" + }, + { + "zip_code": 99352, + "latitude": 46.282031, + "longitude": -119.491659, + "city": "Richland", + "state": "WA", + "county": "Benton" + }, + { + "zip_code": 99353, + "latitude": 46.315267, + "longitude": -119.371393, + "city": "West Richland", + "state": "WA", + "county": "Benton" + }, + { + "zip_code": 99356, + "latitude": 45.851428, + "longitude": -120.354257, + "city": "Roosevelt", + "state": "WA", + "county": "Klickitat" + }, + { + "zip_code": 99357, + "latitude": 46.897589, + "longitude": -119.686316, + "city": "Royal City", + "state": "WA", + "county": "Grant" + }, + { + "zip_code": 99359, + "latitude": 46.512828, + "longitude": -118.10237, + "city": "Starbuck", + "state": "WA", + "county": "Columbia" + }, + { + "zip_code": 99360, + "latitude": 46.134445, + "longitude": -118.461436, + "city": "Touchet", + "state": "WA", + "county": "Walla Walla" + }, + { + "zip_code": 99361, + "latitude": 46.159844, + "longitude": -118.139822, + "city": "Waitsburg", + "state": "WA", + "county": "Walla Walla" + }, + { + "zip_code": 99362, + "latitude": 46.1341, + "longitude": -118.291407, + "city": "Walla Walla", + "state": "WA", + "county": "Walla Walla" + }, + { + "zip_code": 99363, + "latitude": 46.084584, + "longitude": -118.906079, + "city": "Wallula", + "state": "WA", + "county": "Walla Walla" + }, + { + "zip_code": 99371, + "latitude": 46.815306, + "longitude": -118.338081, + "city": "Washtucna", + "state": "WA", + "county": "Adams" + }, + { + "zip_code": 99401, + "latitude": 46.121593, + "longitude": -117.17858, + "city": "Anatone", + "state": "WA", + "county": "Asotin" + }, + { + "zip_code": 99402, + "latitude": 46.174099, + "longitude": -117.118489, + "city": "Asotin", + "state": "WA", + "county": "Asotin" + }, + { + "zip_code": 99403, + "latitude": 46.369711, + "longitude": -117.225934, + "city": "Clarkston", + "state": "WA", + "county": "Asotin" + }, + { + "zip_code": 99501, + "latitude": 61.287624, + "longitude": -149.486981, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99502, + "latitude": 61.166069, + "longitude": -149.960008, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99503, + "latitude": 61.188411, + "longitude": -149.893867, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99504, + "latitude": 61.205284, + "longitude": -149.771928, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99505, + "latitude": 61.259092, + "longitude": -149.690318, + "city": "Fort Richardson", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99506, + "latitude": 61.257409, + "longitude": -149.804165, + "city": "Elmendorf Afb", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99507, + "latitude": 61.151903, + "longitude": -149.776157, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99508, + "latitude": 61.205076, + "longitude": -149.823203, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99509, + "latitude": 61.108864, + "longitude": -149.440311, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99510, + "latitude": 61.144568, + "longitude": -149.878418, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99511, + "latitude": 61.068324, + "longitude": -149.800476, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99512, + "latitude": 61.203954, + "longitude": -149.808426, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99513, + "latitude": 61.214877, + "longitude": -149.886174, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99514, + "latitude": 61.108864, + "longitude": -149.440311, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99515, + "latitude": 61.115754, + "longitude": -149.912019, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99516, + "latitude": 61.091201, + "longitude": -149.762371, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99517, + "latitude": 61.189494, + "longitude": -149.93809, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99518, + "latitude": 61.157813, + "longitude": -149.894338, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99519, + "latitude": 61.108864, + "longitude": -149.440311, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99520, + "latitude": 61.108864, + "longitude": -149.440311, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99521, + "latitude": 61.108864, + "longitude": -149.440311, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99522, + "latitude": 61.108864, + "longitude": -149.440311, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99523, + "latitude": 61.108864, + "longitude": -149.440311, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99524, + "latitude": 61.108864, + "longitude": -149.440311, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99540, + "latitude": 61.108864, + "longitude": -149.440311, + "city": "Indian", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99546, + "latitude": 54.24018, + "longitude": -176.787412, + "city": "Adak", + "state": "AK", + "county": "Aleutians West" + }, + { + "zip_code": 99547, + "latitude": 54.24018, + "longitude": -176.787412, + "city": "Atka", + "state": "AK", + "county": "Aleutians West" + }, + { + "zip_code": 99548, + "latitude": 58.268704, + "longitude": -156.648418, + "city": "Chignik Lake", + "state": "AK", + "county": "Lake And Peninsula" + }, + { + "zip_code": 99549, + "latitude": 58.268704, + "longitude": -156.648418, + "city": "Port Heiden", + "state": "AK", + "county": "Lake And Peninsula" + }, + { + "zip_code": 99550, + "latitude": 57.701171, + "longitude": -153.505567, + "city": "Port Lions", + "state": "AK", + "county": "Kodiak Island" + }, + { + "zip_code": 99551, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Akiachak", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99552, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Akiak", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99553, + "latitude": 55.430594, + "longitude": -162.55813, + "city": "Akutan", + "state": "AK", + "county": "Aleutians East" + }, + { + "zip_code": 99554, + "latitude": 62.117231, + "longitude": -163.237636, + "city": "Alakanuk", + "state": "AK", + "county": "Wade Hampton" + }, + { + "zip_code": 99555, + "latitude": 58.962101, + "longitude": -163.118947, + "city": "Aleknagik", + "state": "AK", + "county": "Dillingham" + }, + { + "zip_code": 99556, + "latitude": 59.837116, + "longitude": -151.70781, + "city": "Anchor Point", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99557, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Aniak", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99558, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Anvik", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99559, + "latitude": 60.129979, + "longitude": -162.173906, + "city": "Bethel", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99561, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Chefornak", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99563, + "latitude": 62.117231, + "longitude": -163.237636, + "city": "Chevak", + "state": "AK", + "county": "Wade Hampton" + }, + { + "zip_code": 99564, + "latitude": 58.268704, + "longitude": -156.648418, + "city": "Chignik", + "state": "AK", + "county": "Lake And Peninsula" + }, + { + "zip_code": 99565, + "latitude": 58.268704, + "longitude": -156.648418, + "city": "Chignik Lagoon", + "state": "AK", + "county": "Lake And Peninsula" + }, + { + "zip_code": 99566, + "latitude": 61.470966, + "longitude": -144.991027, + "city": "Chitina", + "state": "AK", + "county": "Valdez Cordova" + }, + { + "zip_code": 99567, + "latitude": 61.393834, + "longitude": -149.424631, + "city": "Chugiak", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99568, + "latitude": 60.187496, + "longitude": -151.442983, + "city": "Clam Gulch", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99569, + "latitude": 58.962101, + "longitude": -163.118947, + "city": "Clarks Point", + "state": "AK", + "county": "Dillingham" + }, + { + "zip_code": 99571, + "latitude": 55.650875, + "longitude": -160.654522, + "city": "Cold Bay", + "state": "AK", + "county": "Aleutians East" + }, + { + "zip_code": 99572, + "latitude": 60.491478, + "longitude": -149.770159, + "city": "Cooper Landing", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99573, + "latitude": 61.470966, + "longitude": -144.991027, + "city": "Copper Center", + "state": "AK", + "county": "Valdez Cordova" + }, + { + "zip_code": 99574, + "latitude": 60.536166, + "longitude": -145.75335, + "city": "Cordova", + "state": "AK", + "county": "Valdez Cordova" + }, + { + "zip_code": 99575, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Crooked Creek", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99576, + "latitude": 59.040181, + "longitude": -158.523138, + "city": "Dillingham", + "state": "AK", + "county": "Dillingham" + }, + { + "zip_code": 99577, + "latitude": 61.303131, + "longitude": -149.424518, + "city": "Eagle River", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99578, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Eek", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99579, + "latitude": 58.268704, + "longitude": -156.648418, + "city": "Egegik", + "state": "AK", + "county": "Lake And Peninsula" + }, + { + "zip_code": 99580, + "latitude": 58.962101, + "longitude": -163.118947, + "city": "Ekwok", + "state": "AK", + "county": "Dillingham" + }, + { + "zip_code": 99581, + "latitude": 62.117231, + "longitude": -163.237636, + "city": "Emmonak", + "state": "AK", + "county": "Wade Hampton" + }, + { + "zip_code": 99583, + "latitude": 55.430594, + "longitude": -162.55813, + "city": "False Pass", + "state": "AK", + "county": "Aleutians East" + }, + { + "zip_code": 99584, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Flat", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99585, + "latitude": 62.117231, + "longitude": -163.237636, + "city": "Marshall", + "state": "AK", + "county": "Wade Hampton" + }, + { + "zip_code": 99586, + "latitude": 61.470966, + "longitude": -144.991027, + "city": "Gakona", + "state": "AK", + "county": "Valdez Cordova" + }, + { + "zip_code": 99587, + "latitude": 60.957674, + "longitude": -149.140623, + "city": "Girdwood", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99588, + "latitude": 61.470966, + "longitude": -144.991027, + "city": "Glennallen", + "state": "AK", + "county": "Valdez Cordova" + }, + { + "zip_code": 99589, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Goodnews Bay", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99590, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Grayling", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99591, + "latitude": 54.24018, + "longitude": -176.787412, + "city": "Saint George Island", + "state": "AK", + "county": "Aleutians West" + }, + { + "zip_code": 99599, + "latitude": 61.187188, + "longitude": -149.880393, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99602, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Holy Cross", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99603, + "latitude": 60.056453, + "longitude": -151.362422, + "city": "Homer", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99604, + "latitude": 62.117231, + "longitude": -163.237636, + "city": "Hooper Bay", + "state": "AK", + "county": "Wade Hampton" + }, + { + "zip_code": 99605, + "latitude": 60.036583, + "longitude": -151.655567, + "city": "Hope", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99606, + "latitude": 59.752463, + "longitude": -154.823629, + "city": "Iliamna", + "state": "AK", + "county": "Lake And Peninsula" + }, + { + "zip_code": 99607, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Kalskag", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99608, + "latitude": 58.268704, + "longitude": -155.797078, + "city": "Karluk", + "state": "AK", + "county": "Kodiak Island" + }, + { + "zip_code": 99609, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Kasigluk", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99610, + "latitude": 60.352575, + "longitude": -151.116301, + "city": "Kasilof", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99611, + "latitude": 60.422041, + "longitude": -150.407958, + "city": "Kenai", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99612, + "latitude": 55.430594, + "longitude": -162.55813, + "city": "King Cove", + "state": "AK", + "county": "Aleutians East" + }, + { + "zip_code": 99613, + "latitude": 58.745599, + "longitude": -157.159459, + "city": "King Salmon", + "state": "AK", + "county": "Lake And Peninsula" + }, + { + "zip_code": 99614, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Kipnuk", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99615, + "latitude": 57.762816, + "longitude": -152.472876, + "city": "Kodiak", + "state": "AK", + "county": "Kodiak Island" + }, + { + "zip_code": 99619, + "latitude": 58.268704, + "longitude": -155.797078, + "city": "Kodiak", + "state": "AK", + "county": "Kodiak Island" + }, + { + "zip_code": 99620, + "latitude": 62.117231, + "longitude": -163.237636, + "city": "Kotlik", + "state": "AK", + "county": "Wade Hampton" + }, + { + "zip_code": 99621, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Kwethluk", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99622, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Kwigillingok", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99624, + "latitude": 58.268704, + "longitude": -155.797078, + "city": "Larsen Bay", + "state": "AK", + "county": "Kodiak Island" + }, + { + "zip_code": 99625, + "latitude": 58.268704, + "longitude": -156.648418, + "city": "Levelock", + "state": "AK", + "county": "Lake And Peninsula" + }, + { + "zip_code": 99626, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Lower Kalskag", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99627, + "latitude": 62.945716, + "longitude": -155.5712, + "city": "Mc Grath", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99628, + "latitude": 58.962101, + "longitude": -163.118947, + "city": "Manokotak", + "state": "AK", + "county": "Dillingham" + }, + { + "zip_code": 99630, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Mekoryuk", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99631, + "latitude": 60.036583, + "longitude": -151.655567, + "city": "Moose Pass", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99632, + "latitude": 62.332461, + "longitude": -164.287228, + "city": "Mountain Village", + "state": "AK", + "county": "Wade Hampton" + }, + { + "zip_code": 99633, + "latitude": 58.655425, + "longitude": -156.788199, + "city": "Naknek", + "state": "AK", + "county": "Bristol Bay" + }, + { + "zip_code": 99634, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Napakiak", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99635, + "latitude": 60.700696, + "longitude": -151.276633, + "city": "Nikiski", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99636, + "latitude": 58.962101, + "longitude": -163.118947, + "city": "New Stuyahok", + "state": "AK", + "county": "Dillingham" + }, + { + "zip_code": 99637, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Toksook Bay", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99638, + "latitude": 54.24018, + "longitude": -176.787412, + "city": "Nikolski", + "state": "AK", + "county": "Aleutians West" + }, + { + "zip_code": 99639, + "latitude": 60.04914, + "longitude": -151.517286, + "city": "Ninilchik", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99640, + "latitude": 58.268704, + "longitude": -156.648418, + "city": "Nondalton", + "state": "AK", + "county": "Lake And Peninsula" + }, + { + "zip_code": 99641, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Nunapitchuk", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99643, + "latitude": 58.268704, + "longitude": -155.797078, + "city": "Old Harbor", + "state": "AK", + "county": "Kodiak Island" + }, + { + "zip_code": 99644, + "latitude": 58.268704, + "longitude": -155.797078, + "city": "Ouzinkie", + "state": "AK", + "county": "Kodiak Island" + }, + { + "zip_code": 99645, + "latitude": 62.257284, + "longitude": -149.633916, + "city": "Palmer", + "state": "AK", + "county": "Matanuska Susitna" + }, + { + "zip_code": 99647, + "latitude": 58.268704, + "longitude": -156.648418, + "city": "Pedro Bay", + "state": "AK", + "county": "Lake And Peninsula" + }, + { + "zip_code": 99648, + "latitude": 58.268704, + "longitude": -156.648418, + "city": "Perryville", + "state": "AK", + "county": "Lake And Peninsula" + }, + { + "zip_code": 99649, + "latitude": 57.528787, + "longitude": -157.485781, + "city": "Pilot Point", + "state": "AK", + "county": "Lake And Peninsula" + }, + { + "zip_code": 99650, + "latitude": 62.117231, + "longitude": -163.237636, + "city": "Pilot Station", + "state": "AK", + "county": "Wade Hampton" + }, + { + "zip_code": 99651, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Platinum", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99652, + "latitude": 61.523043, + "longitude": -149.728806, + "city": "Big Lake", + "state": "AK", + "county": "Matanuska Susitna" + }, + { + "zip_code": 99653, + "latitude": 58.268704, + "longitude": -156.648418, + "city": "Port Alsworth", + "state": "AK", + "county": "Lake And Peninsula" + }, + { + "zip_code": 99654, + "latitude": 61.581305, + "longitude": -149.374335, + "city": "Wasilla", + "state": "AK", + "county": "Matanuska Susitna" + }, + { + "zip_code": 99655, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Quinhagak", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99656, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Red Devil", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99657, + "latitude": 62.117231, + "longitude": -163.237636, + "city": "Russian Mission", + "state": "AK", + "county": "Wade Hampton" + }, + { + "zip_code": 99658, + "latitude": 62.117231, + "longitude": -163.237636, + "city": "Saint Marys", + "state": "AK", + "county": "Wade Hampton" + }, + { + "zip_code": 99659, + "latitude": 64.755604, + "longitude": -165.672344, + "city": "Saint Michael", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99660, + "latitude": 54.24018, + "longitude": -176.787412, + "city": "Saint Paul Island", + "state": "AK", + "county": "Aleutians West" + }, + { + "zip_code": 99661, + "latitude": 55.350356, + "longitude": -160.485506, + "city": "Sand Point", + "state": "AK", + "county": "Aleutians East" + }, + { + "zip_code": 99662, + "latitude": 62.117231, + "longitude": -163.237636, + "city": "Scammon Bay", + "state": "AK", + "county": "Wade Hampton" + }, + { + "zip_code": 99663, + "latitude": 59.449486, + "longitude": -151.700915, + "city": "Seldovia", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99664, + "latitude": 60.25281, + "longitude": -149.402123, + "city": "Seward", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99665, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Shageluk", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99666, + "latitude": 62.117231, + "longitude": -163.237636, + "city": "Nunam Iqua", + "state": "AK", + "county": "Wade Hampton" + }, + { + "zip_code": 99667, + "latitude": 62.280436, + "longitude": -149.715167, + "city": "Skwentna", + "state": "AK", + "county": "Matanuska Susitna" + }, + { + "zip_code": 99668, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Sleetmute", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99669, + "latitude": 60.110034, + "longitude": -151.247935, + "city": "Soldotna", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99670, + "latitude": 58.745599, + "longitude": -157.159459, + "city": "South Naknek", + "state": "AK", + "county": "Bristol Bay" + }, + { + "zip_code": 99671, + "latitude": 64.755604, + "longitude": -165.672344, + "city": "Stebbins", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99672, + "latitude": 60.513614, + "longitude": -150.853238, + "city": "Sterling", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99674, + "latitude": 61.732741, + "longitude": -148.783687, + "city": "Sutton", + "state": "AK", + "county": "Matanuska Susitna" + }, + { + "zip_code": 99675, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Takotna", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99676, + "latitude": 62.280436, + "longitude": -149.715167, + "city": "Talkeetna", + "state": "AK", + "county": "Matanuska Susitna" + }, + { + "zip_code": 99677, + "latitude": 61.470966, + "longitude": -144.991027, + "city": "Tatitlek", + "state": "AK", + "county": "Valdez Cordova" + }, + { + "zip_code": 99678, + "latitude": 58.962101, + "longitude": -163.118947, + "city": "Togiak", + "state": "AK", + "county": "Dillingham" + }, + { + "zip_code": 99679, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Tuluksak", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99680, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Tuntutuliak", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99681, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Tununak", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99682, + "latitude": 60.036583, + "longitude": -151.655567, + "city": "Tyonek", + "state": "AK", + "county": "Kenai Peninsula" + }, + { + "zip_code": 99683, + "latitude": 61.720499, + "longitude": -150.009239, + "city": "Trapper Creek", + "state": "AK", + "county": "Matanuska Susitna" + }, + { + "zip_code": 99684, + "latitude": 64.755604, + "longitude": -165.672344, + "city": "Unalakleet", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99685, + "latitude": 53.85513, + "longitude": -166.518069, + "city": "Unalaska", + "state": "AK", + "county": "Aleutians West" + }, + { + "zip_code": 99686, + "latitude": 61.68557, + "longitude": -145.775152, + "city": "Valdez", + "state": "AK", + "county": "Valdez Cordova" + }, + { + "zip_code": 99687, + "latitude": 61.531298, + "longitude": -149.478398, + "city": "Wasilla", + "state": "AK", + "county": "Matanuska Susitna" + }, + { + "zip_code": 99688, + "latitude": 61.896608, + "longitude": -150.003758, + "city": "Willow", + "state": "AK", + "county": "Matanuska Susitna" + }, + { + "zip_code": 99689, + "latitude": 58.331798, + "longitude": -135.181256, + "city": "Yakutat", + "state": "AK", + "county": "Yakutat" + }, + { + "zip_code": 99690, + "latitude": 60.314735, + "longitude": -163.118947, + "city": "Nightmute", + "state": "AK", + "county": "Bethel" + }, + { + "zip_code": 99691, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Nikolai", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99692, + "latitude": 53.865295, + "longitude": -166.525333, + "city": "Dutch Harbor", + "state": "AK", + "county": "Aleutians West" + }, + { + "zip_code": 99693, + "latitude": 61.470966, + "longitude": -144.991027, + "city": "Whittier", + "state": "AK", + "county": "Valdez Cordova" + }, + { + "zip_code": 99694, + "latitude": 62.280436, + "longitude": -149.715167, + "city": "Houston", + "state": "AK", + "county": "Matanuska Susitna" + }, + { + "zip_code": 99695, + "latitude": 61.108864, + "longitude": -149.440311, + "city": "Anchorage", + "state": "AK", + "county": "Anchorage" + }, + { + "zip_code": 99697, + "latitude": 58.268704, + "longitude": -155.797078, + "city": "Kodiak", + "state": "AK", + "county": "Kodiak Island" + }, + { + "zip_code": 99701, + "latitude": 64.644047, + "longitude": -147.522052, + "city": "Fairbanks", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99702, + "latitude": 64.790803, + "longitude": -147.463336, + "city": "Eielson Afb", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99703, + "latitude": 64.832821, + "longitude": -147.64418, + "city": "Fort Wainwright", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99704, + "latitude": 63.543571, + "longitude": -149.986676, + "city": "Clear", + "state": "AK", + "county": "Denali" + }, + { + "zip_code": 99705, + "latitude": 64.780765, + "longitude": -147.207748, + "city": "North Pole", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99706, + "latitude": 64.852055, + "longitude": -147.937747, + "city": "Fairbanks", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99707, + "latitude": 64.699839, + "longitude": -147.405134, + "city": "Fairbanks", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99708, + "latitude": 64.947462, + "longitude": -147.856443, + "city": "Fairbanks", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99709, + "latitude": 64.860126, + "longitude": -147.999791, + "city": "Fairbanks", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99710, + "latitude": 64.948648, + "longitude": -147.535549, + "city": "Fairbanks", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99711, + "latitude": 64.826445, + "longitude": -147.38884, + "city": "Fairbanks", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99712, + "latitude": 65.036453, + "longitude": -147.156588, + "city": "Fairbanks", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99714, + "latitude": 64.489102, + "longitude": -146.924788, + "city": "Salcha", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99716, + "latitude": 64.874591, + "longitude": -146.898195, + "city": "Two Rivers", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99720, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Allakaket", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99721, + "latitude": 66.693255, + "longitude": -153.993988, + "city": "Anaktuvuk Pass", + "state": "AK", + "county": "North Slope" + }, + { + "zip_code": 99722, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Arctic Village", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99723, + "latitude": 70.220472, + "longitude": -150.238942, + "city": "Barrow", + "state": "AK", + "county": "North Slope" + }, + { + "zip_code": 99724, + "latitude": 66.929746, + "longitude": -149.19301, + "city": "Beaver", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99725, + "latitude": 64.870974, + "longitude": -148.09493, + "city": "Ester", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99726, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Bettles Field", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99727, + "latitude": 66.868442, + "longitude": -159.843924, + "city": "Buckland", + "state": "AK", + "county": "Northwest Arctic" + }, + { + "zip_code": 99729, + "latitude": 63.543571, + "longitude": -149.986676, + "city": "Cantwell", + "state": "AK", + "county": "Denali" + }, + { + "zip_code": 99730, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Central", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99732, + "latitude": 63.870552, + "longitude": -144.002648, + "city": "Chicken", + "state": "AK", + "county": "Southeast Fairbanks" + }, + { + "zip_code": 99733, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Circle", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99734, + "latitude": 66.693255, + "longitude": -153.993988, + "city": "Prudhoe Bay", + "state": "AK", + "county": "North Slope" + }, + { + "zip_code": 99736, + "latitude": 66.868442, + "longitude": -159.843924, + "city": "Deering", + "state": "AK", + "county": "Northwest Arctic" + }, + { + "zip_code": 99737, + "latitude": 63.107461, + "longitude": -143.422478, + "city": "Delta Junction", + "state": "AK", + "county": "Southeast Fairbanks" + }, + { + "zip_code": 99738, + "latitude": 63.870552, + "longitude": -144.002648, + "city": "Eagle", + "state": "AK", + "county": "Southeast Fairbanks" + }, + { + "zip_code": 99739, + "latitude": 64.755604, + "longitude": -165.672344, + "city": "Elim", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99740, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Fort Yukon", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99741, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Galena", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99742, + "latitude": 64.755604, + "longitude": -165.672344, + "city": "Gambell", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99743, + "latitude": 63.543571, + "longitude": -149.986676, + "city": "Healy", + "state": "AK", + "county": "Denali" + }, + { + "zip_code": 99744, + "latitude": 63.543571, + "longitude": -149.986676, + "city": "Anderson", + "state": "AK", + "county": "Denali" + }, + { + "zip_code": 99745, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Hughes", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99746, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Huslia", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99747, + "latitude": 66.693255, + "longitude": -153.993988, + "city": "Kaktovik", + "state": "AK", + "county": "North Slope" + }, + { + "zip_code": 99748, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Kaltag", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99749, + "latitude": 66.868442, + "longitude": -159.843924, + "city": "Kiana", + "state": "AK", + "county": "Northwest Arctic" + }, + { + "zip_code": 99750, + "latitude": 66.868442, + "longitude": -159.843924, + "city": "Kivalina", + "state": "AK", + "county": "Northwest Arctic" + }, + { + "zip_code": 99751, + "latitude": 66.868442, + "longitude": -159.843924, + "city": "Kobuk", + "state": "AK", + "county": "Northwest Arctic" + }, + { + "zip_code": 99752, + "latitude": 66.865256, + "longitude": -161.780844, + "city": "Kotzebue", + "state": "AK", + "county": "Northwest Arctic" + }, + { + "zip_code": 99753, + "latitude": 64.755604, + "longitude": -165.672344, + "city": "Koyuk", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99754, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Koyukuk", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99755, + "latitude": 63.543571, + "longitude": -149.986676, + "city": "Denali National Park", + "state": "AK", + "county": "Denali" + }, + { + "zip_code": 99756, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Manley Hot Springs", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99757, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Lake Minchumina", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99758, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Minto", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99759, + "latitude": 68.887048, + "longitude": -164.249713, + "city": "Point Lay", + "state": "AK", + "county": "North Slope" + }, + { + "zip_code": 99760, + "latitude": 64.117464, + "longitude": -153.451125, + "city": "Nenana", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99761, + "latitude": 66.868442, + "longitude": -159.843924, + "city": "Noatak", + "state": "AK", + "county": "Northwest Arctic" + }, + { + "zip_code": 99762, + "latitude": 63.888671, + "longitude": -163.80076, + "city": "Nome", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99763, + "latitude": 66.868442, + "longitude": -159.843924, + "city": "Noorvik", + "state": "AK", + "county": "Northwest Arctic" + }, + { + "zip_code": 99764, + "latitude": 63.870552, + "longitude": -144.002648, + "city": "Northway", + "state": "AK", + "county": "Southeast Fairbanks" + }, + { + "zip_code": 99765, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Nulato", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99766, + "latitude": 66.693255, + "longitude": -153.993988, + "city": "Point Hope", + "state": "AK", + "county": "North Slope" + }, + { + "zip_code": 99767, + "latitude": 65.509038, + "longitude": -150.161868, + "city": "Rampart", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99768, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Ruby", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99769, + "latitude": 64.755604, + "longitude": -165.672344, + "city": "Savoonga", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99770, + "latitude": 66.868442, + "longitude": -159.843924, + "city": "Selawik", + "state": "AK", + "county": "Northwest Arctic" + }, + { + "zip_code": 99771, + "latitude": 64.755604, + "longitude": -165.672344, + "city": "Shaktoolik", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99772, + "latitude": 64.755604, + "longitude": -165.672344, + "city": "Shishmaref", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99773, + "latitude": 66.868442, + "longitude": -159.843924, + "city": "Shungnak", + "state": "AK", + "county": "Northwest Arctic" + }, + { + "zip_code": 99774, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Stevens Village", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99775, + "latitude": 64.859078, + "longitude": -147.826709, + "city": "Fairbanks", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99776, + "latitude": 63.870552, + "longitude": -144.002648, + "city": "Tanacross", + "state": "AK", + "county": "Southeast Fairbanks" + }, + { + "zip_code": 99777, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Tanana", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99778, + "latitude": 64.755604, + "longitude": -165.672344, + "city": "Teller", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99779, + "latitude": 63.870552, + "longitude": -144.002648, + "city": "Tetlin", + "state": "AK", + "county": "Southeast Fairbanks" + }, + { + "zip_code": 99780, + "latitude": 63.870552, + "longitude": -144.002648, + "city": "Tok", + "state": "AK", + "county": "Southeast Fairbanks" + }, + { + "zip_code": 99781, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Venetie", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99782, + "latitude": 66.693255, + "longitude": -153.993988, + "city": "Wainwright", + "state": "AK", + "county": "North Slope" + }, + { + "zip_code": 99783, + "latitude": 64.755604, + "longitude": -165.672344, + "city": "Wales", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99784, + "latitude": 64.755604, + "longitude": -165.672344, + "city": "White Mountain", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99785, + "latitude": 64.755604, + "longitude": -165.672344, + "city": "Brevig Mission", + "state": "AK", + "county": "Nome" + }, + { + "zip_code": 99786, + "latitude": 66.868442, + "longitude": -159.843924, + "city": "Ambler", + "state": "AK", + "county": "Northwest Arctic" + }, + { + "zip_code": 99788, + "latitude": 65.226375, + "longitude": -151.025085, + "city": "Chalkyitsik", + "state": "AK", + "county": "Yukon Koyukuk" + }, + { + "zip_code": 99789, + "latitude": 66.693255, + "longitude": -153.993988, + "city": "Nuiqsut", + "state": "AK", + "county": "North Slope" + }, + { + "zip_code": 99790, + "latitude": 64.856055, + "longitude": -146.27598, + "city": "Fairbanks", + "state": "AK", + "county": "Fairbanks North Star" + }, + { + "zip_code": 99791, + "latitude": 70.494693, + "longitude": -157.441073, + "city": "Atqasuk", + "state": "AK", + "county": "North Slope" + }, + { + "zip_code": 99801, + "latitude": 58.373561, + "longitude": -134.523946, + "city": "Juneau", + "state": "AK", + "county": "Juneau" + }, + { + "zip_code": 99802, + "latitude": 58.405657, + "longitude": -134.58969, + "city": "Juneau", + "state": "AK", + "county": "Juneau" + }, + { + "zip_code": 99803, + "latitude": 58.377074, + "longitude": -134.617383, + "city": "Juneau", + "state": "AK", + "county": "Juneau" + }, + { + "zip_code": 99811, + "latitude": 58.38348, + "longitude": -134.197786, + "city": "Juneau", + "state": "AK", + "county": "Juneau" + }, + { + "zip_code": 99820, + "latitude": 57.500525, + "longitude": -134.585954, + "city": "Angoon", + "state": "AK", + "county": "Skagway Hoonah Angoon" + }, + { + "zip_code": 99821, + "latitude": 58.449413, + "longitude": -134.700348, + "city": "Auke Bay", + "state": "AK", + "county": "Juneau" + }, + { + "zip_code": 99824, + "latitude": 58.276308, + "longitude": -134.397642, + "city": "Douglas", + "state": "AK", + "county": "Juneau" + }, + { + "zip_code": 99825, + "latitude": 58.331798, + "longitude": -135.181256, + "city": "Elfin Cove", + "state": "AK", + "county": "Skagway Hoonah Angoon" + }, + { + "zip_code": 99826, + "latitude": 58.331798, + "longitude": -135.181256, + "city": "Gustavus", + "state": "AK", + "county": "Skagway Hoonah Angoon" + }, + { + "zip_code": 99827, + "latitude": 59.312688, + "longitude": -135.681153, + "city": "Haines", + "state": "AK", + "county": "Haines" + }, + { + "zip_code": 99829, + "latitude": 58.097655, + "longitude": -135.431561, + "city": "Hoonah", + "state": "AK", + "county": "Skagway Hoonah Angoon" + }, + { + "zip_code": 99830, + "latitude": 56.973554, + "longitude": -133.935996, + "city": "Kake", + "state": "AK", + "county": "Wrangell Petersburg" + }, + { + "zip_code": 99832, + "latitude": 58.331798, + "longitude": -135.181256, + "city": "Pelican", + "state": "AK", + "county": "Skagway Hoonah Angoon" + }, + { + "zip_code": 99833, + "latitude": 56.767056, + "longitude": -132.93195, + "city": "Petersburg", + "state": "AK", + "county": "Wrangell Petersburg" + }, + { + "zip_code": 99835, + "latitude": 57.080818, + "longitude": -135.318348, + "city": "Sitka", + "state": "AK", + "county": "Sitka" + }, + { + "zip_code": 99836, + "latitude": 56.53595, + "longitude": -132.827948, + "city": "Port Alexander", + "state": "AK", + "county": "Wrangell Petersburg" + }, + { + "zip_code": 99840, + "latitude": 59.456753, + "longitude": -135.314852, + "city": "Skagway", + "state": "AK", + "county": "Skagway Hoonah Angoon" + }, + { + "zip_code": 99841, + "latitude": 57.798249, + "longitude": -135.285061, + "city": "Tenakee Springs", + "state": "AK", + "county": "Skagway Hoonah Angoon" + }, + { + "zip_code": 99850, + "latitude": 58.38348, + "longitude": -134.197786, + "city": "Juneau", + "state": "AK", + "county": "Juneau" + }, + { + "zip_code": 99901, + "latitude": 55.400674, + "longitude": -131.67409, + "city": "Ketchikan", + "state": "AK", + "county": "Ketchikan Gateway" + }, + { + "zip_code": 99903, + "latitude": 55.517921, + "longitude": -132.003244, + "city": "Meyers Chuck", + "state": "AK", + "county": "Prince Wales Ketchikan" + }, + { + "zip_code": 99918, + "latitude": 55.517921, + "longitude": -132.003244, + "city": "Coffman Cove", + "state": "AK", + "county": "Prince Wales Ketchikan" + }, + { + "zip_code": 99919, + "latitude": 55.126774, + "longitude": -131.580407, + "city": "Thorne Bay", + "state": "AK", + "county": "Prince Wales Ketchikan" + }, + { + "zip_code": 99921, + "latitude": 55.513301, + "longitude": -133.117022, + "city": "Craig", + "state": "AK", + "county": "Prince Wales Ketchikan" + }, + { + "zip_code": 99922, + "latitude": 55.208706, + "longitude": -132.825903, + "city": "Hydaburg", + "state": "AK", + "county": "Prince Wales Ketchikan" + }, + { + "zip_code": 99923, + "latitude": 55.517921, + "longitude": -132.003244, + "city": "Hyder", + "state": "AK", + "county": "Prince Wales Ketchikan" + }, + { + "zip_code": 99925, + "latitude": 55.554393, + "longitude": -133.09068, + "city": "Klawock", + "state": "AK", + "county": "Prince Wales Ketchikan" + }, + { + "zip_code": 99926, + "latitude": 55.094325, + "longitude": -131.566827, + "city": "Metlakatla", + "state": "AK", + "county": "Prince Wales Ketchikan" + }, + { + "zip_code": 99927, + "latitude": 55.517921, + "longitude": -132.003244, + "city": "Point Baker", + "state": "AK", + "county": "Prince Wales Ketchikan" + }, + { + "zip_code": 99928, + "latitude": 55.395359, + "longitude": -131.67537, + "city": "Ward Cove", + "state": "AK", + "county": "Ketchikan Gateway" + }, + { + "zip_code": 99929, + "latitude": 56.449893, + "longitude": -132.364407, + "city": "Wrangell", + "state": "AK", + "county": "Wrangell Petersburg" + }, + { + "zip_code": 99950, + "latitude": 55.542007, + "longitude": -131.432682, + "city": "Ketchikan", + "state": "AK", + "county": "Ketchikan Gateway" + } + ] \ No newline at end of file diff --git a/apps/showcase/static/data/zip_codes.json b/apps/showcase/static/data/zip_codes.json new file mode 100644 index 000000000..cda85b461 --- /dev/null +++ b/apps/showcase/static/data/zip_codes.json @@ -0,0 +1 @@ +[501, 544, 601, 602, 603, 604, 605, 606, 610, 611, 612, 613, 614, 616, 617, 622, 623, 624, 627, 631, 636, 637, 638, 641, 646, 647, 650, 652, 653, 656, 659, 660, 662, 664, 667, 669, 670, 674, 676, 677, 678, 680, 681, 682, 683, 685, 687, 688, 690, 692, 693, 694, 698, 703, 704, 705, 707, 714, 715, 716, 717, 718, 719, 720, 721, 723, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 744, 745, 751, 754, 757, 765, 766, 767, 769, 771, 772, 773, 775, 777, 778, 780, 782, 783, 784, 785, 786, 791, 792, 794, 795, 801, 802, 803, 804, 805, 820, 821, 822, 823, 824, 830, 831, 840, 841, 850, 851, 901, 902, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 933, 934, 935, 936, 937, 938, 939, 940, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 965, 966, 968, 969, 970, 971, 975, 976, 977, 978, 979, 981, 982, 983, 984, 985, 986, 987, 988, 1001, 1002, 1003, 1004, 1005, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1020, 1021, 1022, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1050, 1053, 1054, 1056, 1057, 1059, 1060, 1061, 1062, 1063, 1066, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1077, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1088, 1089, 1090, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1111, 1114, 1115, 1116, 1118, 1119, 1128, 1129, 1133, 1138, 1139, 1144, 1151, 1152, 1199, 1201, 1202, 1203, 1220, 1222, 1223, 1224, 1225, 1226, 1227, 1229, 1230, 1235, 1236, 1237, 1238, 1240, 1242, 1243, 1244, 1245, 1247, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1262, 1263, 1264, 1266, 1267, 1270, 1301, 1302, 1330, 1331, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1346, 1347, 1349, 1350, 1351, 1354, 1355, 1360, 1364, 1366, 1367, 1368, 1369, 1370, 1373, 1375, 1376, 1378, 1379, 1380, 1420, 1430, 1431, 1432, 1436, 1438, 1440, 1441, 1450, 1451, 1452, 1453, 1460, 1462, 1463, 1464, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1477, 1501, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1529, 1531, 1532, 1534, 1535, 1536, 1537, 1538, 1540, 1541, 1542, 1543, 1545, 1546, 1550, 1560, 1561, 1562, 1564, 1566, 1568, 1569, 1570, 1571, 1580, 1581, 1582, 1583, 1585, 1586, 1588, 1590, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1653, 1654, 1655, 1701, 1702, 1703, 1704, 1705, 1718, 1719, 1720, 1721, 1730, 1731, 1740, 1741, 1742, 1745, 1746, 1747, 1748, 1749, 1752, 1754, 1756, 1757, 1760, 1770, 1772, 1773, 1775, 1776, 1778, 1784, 1801, 1803, 1805, 1806, 1807, 1808, 1810, 1812, 1813, 1815, 1821, 1822, 1824, 1826, 1827, 1830, 1831, 1832, 1833, 1834, 1835, 1840, 1841, 1842, 1843, 1844, 1845, 1850, 1851, 1852, 1853, 1854, 1860, 1862, 1863, 1864, 1865, 1866, 1867, 1876, 1879, 1880, 1885, 1886, 1887, 1888, 1889, 1890, 1899, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1910, 1913, 1915, 1921, 1922, 1923, 1929, 1930, 1931, 1936, 1937, 1938, 1940, 1944, 1945, 1949, 1950, 1951, 1952, 1960, 1961, 1965, 1966, 1969, 1970, 1971, 1982, 1983, 1984, 1985, 2018, 2019, 2020, 2021, 2025, 2026, 2027, 2030, 2031, 2032, 2035, 2038, 2040, 2041, 2043, 2044, 2045, 2047, 2048, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2059, 2060, 2061, 2062, 2065, 2066, 2067, 2070, 2071, 2072, 2081, 2090, 2093, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2148, 2149, 2150, 2151, 2152, 2153, 2155, 2156, 2163, 2169, 2170, 2171, 2176, 2177, 2180, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2196, 2199, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2215, 2216, 2217, 2222, 2228, 2238, 2239, 2241, 2266, 2269, 2283, 2284, 2293, 2295, 2297, 2301, 2302, 2303, 2304, 2305, 2322, 2324, 2325, 2327, 2330, 2331, 2332, 2333, 2334, 2337, 2338, 2339, 2340, 2341, 2343, 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2355, 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2364, 2366, 2367, 2368, 2370, 2375, 2379, 2381, 2382, 2420, 2421, 2445, 2446, 2447, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2464, 2465, 2466, 2467, 2468, 2471, 2472, 2474, 2475, 2476, 2477, 2478, 2479, 2481, 2482, 2492, 2493, 2494, 2495, 2532, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 2552, 2553, 2554, 2556, 2557, 2558, 2559, 2561, 2562, 2563, 2564, 2565, 2568, 2571, 2573, 2574, 2575, 2576, 2584, 2601, 2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651, 2652, 2653, 2655, 2657, 2659, 2660, 2661, 2662, 2663, 2664, 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2675, 2702, 2703, 2712, 2713, 2714, 2715, 2717, 2718, 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2760, 2761, 2762, 2763, 2764, 2766, 2767, 2768, 2769, 2770, 2771, 2777, 2779, 2780, 2783, 2790, 2791, 2801, 2802, 2804, 2806, 2807, 2808, 2809, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, 2833, 2835, 2836, 2837, 2838, 2839, 2840, 2841, 2842, 2852, 2854, 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2885, 2886, 2887, 2888, 2889, 2891, 2892, 2893, 2894, 2895, 2896, 2898, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2940, 3031, 3032, 3033, 3034, 3036, 3037, 3038, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049, 3051, 3052, 3053, 3054, 3055, 3057, 3060, 3061, 3062, 3063, 3064, 3070, 3071, 3073, 3076, 3077, 3079, 3082, 3084, 3086, 3087, 3101, 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3215, 3216, 3217, 3218, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3227, 3229, 3230, 3231, 3232, 3233, 3234, 3235, 3237, 3238, 3240, 3241, 3242, 3243, 3244, 3245, 3246, 3247, 3249, 3251, 3252, 3253, 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3263, 3264, 3266, 3268, 3269, 3272, 3273, 3274, 3275, 3276, 3278, 3279, 3280, 3281, 3282, 3284, 3287, 3289, 3290, 3291, 3293, 3298, 3299, 3301, 3302, 3303, 3304, 3305, 3307, 3431, 3435, 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3449, 3450, 3451, 3452, 3455, 3456, 3457, 3458, 3461, 3462, 3464, 3465, 3466, 3467, 3468, 3469, 3470, 3561, 3570, 3574, 3575, 3576, 3579, 3580, 3581, 3582, 3583, 3584, 3585, 3587, 3588, 3589, 3590, 3592, 3595, 3597, 3598, 3601, 3602, 3603, 3604, 3605, 3607, 3608, 3609, 3740, 3741, 3743, 3745, 3746, 3748, 3749, 3750, 3751, 3752, 3753, 3754, 3755, 3756, 3765, 3766, 3768, 3769, 3770, 3771, 3773, 3774, 3777, 3779, 3780, 3781, 3782, 3784, 3785, 3801, 3802, 3803, 3804, 3805, 3809, 3810, 3811, 3812, 3813, 3814, 3815, 3816, 3817, 3818, 3819, 3820, 3821, 3822, 3824, 3825, 3826, 3827, 3830, 3832, 3833, 3835, 3836, 3837, 3838, 3839, 3840, 3841, 3842, 3843, 3844, 3845, 3846, 3847, 3848, 3849, 3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, 3859, 3860, 3862, 3864, 3865, 3866, 3867, 3868, 3869, 3870, 3871, 3872, 3873, 3874, 3875, 3878, 3882, 3883, 3884, 3885, 3886, 3887, 3890, 3894, 3896, 3897, 3901, 3902, 3903, 3904, 3905, 3906, 3907, 3908, 3909, 3910, 3911, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009, 4010, 4011, 4013, 4014, 4015, 4016, 4017, 4019, 4020, 4021, 4022, 4024, 4027, 4028, 4029, 4030, 4032, 4033, 4034, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4046, 4047, 4048, 4049, 4050, 4051, 4053, 4054, 4055, 4056, 4057, 4061, 4062, 4063, 4064, 4066, 4068, 4069, 4070, 4071, 4072, 4073, 4074, 4075, 4076, 4077, 4078, 4079, 4081, 4082, 4083, 4084, 4085, 4086, 4087, 4088, 4090, 4091, 4092, 4093, 4094, 4095, 4096, 4097, 4098, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4110, 4112, 4116, 4122, 4123, 4124, 4210, 4211, 4212, 4216, 4217, 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, 4227, 4228, 4230, 4231, 4234, 4236, 4237, 4238, 4239, 4240, 4241, 4243, 4250, 4252, 4253, 4254, 4255, 4256, 4257, 4258, 4259, 4260, 4261, 4262, 4263, 4265, 4266, 4267, 4268, 4270, 4271, 4274, 4275, 4276, 4278, 4280, 4281, 4282, 4283, 4284, 4285, 4286, 4287, 4288, 4289, 4290, 4291, 4292, 4294, 4330, 4332, 4333, 4336, 4338, 4341, 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354, 4355, 4357, 4358, 4359, 4360, 4363, 4364, 4401, 4402, 4406, 4408, 4410, 4411, 4412, 4413, 4414, 4415, 4416, 4417, 4418, 4419, 4420, 4421, 4422, 4423, 4424, 4426, 4427, 4428, 4429, 4430, 4431, 4434, 4435, 4438, 4441, 4442, 4443, 4444, 4448, 4449, 4450, 4451, 4453, 4454, 4455, 4456, 4457, 4459, 4460, 4461, 4462, 4463, 4464, 4467, 4468, 4469, 4471, 4472, 4473, 4474, 4475, 4476, 4478, 4479, 4481, 4485, 4487, 4488, 4489, 4490, 4491, 4492, 4493, 4495, 4496, 4497, 4530, 4535, 4536, 4537, 4538, 4539, 4541, 4543, 4544, 4547, 4548, 4549, 4551, 4552, 4553, 4554, 4555, 4556, 4558, 4562, 4563, 4564, 4565, 4567, 4568, 4570, 4571, 4572, 4573, 4574, 4575, 4576, 4578, 4579, 4605, 4606, 4607, 4609, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4619, 4622, 4623, 4624, 4625, 4626, 4627, 4628, 4629, 4630, 4631, 4634, 4635, 4637, 4640, 4642, 4643, 4644, 4645, 4646, 4648, 4649, 4650, 4652, 4653, 4654, 4655, 4656, 4657, 4658, 4660, 4662, 4664, 4665, 4666, 4667, 4668, 4669, 4671, 4672, 4673, 4674, 4675, 4676, 4677, 4679, 4680, 4681, 4683, 4684, 4685, 4686, 4690, 4691, 4693, 4694, 4730, 4732, 4733, 4734, 4735, 4736, 4737, 4738, 4739, 4740, 4741, 4742, 4743, 4744, 4745, 4746, 4747, 4750, 4751, 4756, 4757, 4758, 4759, 4760, 4761, 4762, 4763, 4764, 4765, 4766, 4768, 4769, 4770, 4772, 4773, 4774, 4775, 4776, 4777, 4779, 4780, 4781, 4782, 4783, 4785, 4786, 4787, 4788, 4841, 4843, 4846, 4847, 4848, 4849, 4850, 4851, 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859, 4860, 4861, 4862, 4863, 4864, 4865, 4901, 4903, 4910, 4911, 4912, 4915, 4917, 4918, 4920, 4921, 4922, 4923, 4924, 4925, 4926, 4927, 4928, 4929, 4930, 4932, 4933, 4935, 4936, 4937, 4938, 4939, 4940, 4941, 4942, 4943, 4944, 4945, 4947, 4949, 4950, 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4961, 4962, 4963, 4964, 4965, 4966, 4967, 4969, 4970, 4971, 4972, 4973, 4974, 4975, 4976, 4978, 4979, 4981, 4982, 4983, 4984, 4985, 4986, 4987, 4988, 4989, 4992, 5001, 5009, 5030, 5031, 5032, 5033, 5034, 5035, 5036, 5037, 5038, 5039, 5040, 5041, 5042, 5043, 5045, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 5055, 5056, 5058, 5059, 5060, 5061, 5062, 5065, 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5074, 5075, 5076, 5077, 5079, 5081, 5083, 5084, 5085, 5086, 5088, 5089, 5091, 5101, 5141, 5142, 5143, 5144, 5146, 5148, 5149, 5150, 5151, 5152, 5153, 5154, 5155, 5156, 5158, 5159, 5161, 5201, 5250, 5251, 5252, 5253, 5254, 5255, 5257, 5260, 5261, 5262, 5301, 5302, 5303, 5304, 5340, 5341, 5342, 5343, 5344, 5345, 5346, 5350, 5351, 5352, 5353, 5354, 5355, 5356, 5357, 5358, 5359, 5360, 5361, 5362, 5363, 5401, 5402, 5403, 5404, 5405, 5406, 5407, 5439, 5440, 5441, 5442, 5443, 5444, 5445, 5446, 5447, 5448, 5449, 5450, 5451, 5452, 5453, 5454, 5455, 5456, 5457, 5458, 5459, 5460, 5461, 5462, 5463, 5464, 5465, 5466, 5468, 5469, 5470, 5471, 5472, 5473, 5474, 5476, 5477, 5478, 5479, 5481, 5482, 5483, 5485, 5486, 5487, 5488, 5489, 5490, 5491, 5492, 5494, 5495, 5501, 5544, 5601, 5602, 5603, 5604, 5609, 5620, 5633, 5640, 5641, 5647, 5648, 5649, 5650, 5651, 5652, 5653, 5654, 5655, 5656, 5657, 5658, 5660, 5661, 5662, 5663, 5664, 5665, 5666, 5667, 5669, 5670, 5671, 5672, 5673, 5674, 5675, 5676, 5677, 5678, 5679, 5680, 5681, 5682, 5701, 5702, 5730, 5731, 5732, 5733, 5734, 5735, 5736, 5737, 5738, 5739, 5740, 5741, 5742, 5743, 5744, 5745, 5746, 5747, 5748, 5750, 5751, 5753, 5757, 5758, 5759, 5760, 5761, 5762, 5763, 5764, 5765, 5766, 5767, 5768, 5769, 5770, 5772, 5773, 5774, 5775, 5776, 5777, 5778, 5819, 5820, 5821, 5822, 5823, 5824, 5825, 5826, 5827, 5828, 5829, 5830, 5832, 5833, 5836, 5837, 5838, 5839, 5840, 5841, 5842, 5843, 5845, 5846, 5847, 5848, 5849, 5850, 5851, 5853, 5855, 5857, 5858, 5859, 5860, 5861, 5862, 5863, 5866, 5867, 5868, 5871, 5872, 5873, 5874, 5875, 5901, 5902, 5903, 5904, 5905, 5906, 5907, 6001, 6002, 6006, 6010, 6011, 6013, 6016, 6018, 6019, 6020, 6021, 6022, 6023, 6024, 6025, 6026, 6027, 6028, 6029, 6030, 6031, 6032, 6033, 6034, 6035, 6037, 6039, 6040, 6041, 6043, 6045, 6049, 6050, 6051, 6052, 6053, 6057, 6058, 6059, 6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069, 6070, 6071, 6072, 6073, 6074, 6075, 6076, 6077, 6078, 6079, 6080, 6081, 6082, 6083, 6084, 6085, 6087, 6088, 6089, 6090, 6091, 6092, 6093, 6094, 6095, 6096, 6098, 6101, 6102, 6103, 6104, 6105, 6106, 6107, 6108, 6109, 6110, 6111, 6112, 6114, 6115, 6117, 6118, 6119, 6120, 6123, 6126, 6127, 6128, 6129, 6131, 6132, 6133, 6134, 6137, 6138, 6140, 6141, 6142, 6143, 6144, 6145, 6146, 6147, 6150, 6151, 6152, 6153, 6154, 6155, 6156, 6160, 6161, 6167, 6176, 6180, 6183, 6199, 6226, 6230, 6231, 6232, 6233, 6234, 6235, 6237, 6238, 6239, 6241, 6242, 6243, 6244, 6245, 6246, 6247, 6248, 6249, 6250, 6251, 6254, 6255, 6256, 6258, 6259, 6260, 6262, 6263, 6264, 6265, 6266, 6267, 6268, 6269, 6277, 6278, 6279, 6280, 6281, 6282, 6320, 6330, 6331, 6332, 6333, 6334, 6335, 6336, 6337, 6339, 6340, 6349, 6350, 6351, 6353, 6354, 6355, 6357, 6359, 6360, 6365, 6370, 6371, 6372, 6373, 6374, 6375, 6376, 6377, 6378, 6379, 6380, 6382, 6383, 6384, 6385, 6386, 6387, 6388, 6389, 6390, 6401, 6403, 6404, 6405, 6408, 6409, 6410, 6411, 6412, 6413, 6414, 6415, 6416, 6417, 6418, 6419, 6420, 6422, 6423, 6424, 6426, 6430, 6431, 6432, 6436, 6437, 6438, 6439, 6440, 6441, 6442, 6443, 6444, 6447, 6450, 6451, 6454, 6455, 6456, 6457, 6459, 6460, 6467, 6468, 6469, 6470, 6471, 6472, 6473, 6474, 6475, 6477, 6478, 6479, 6480, 6481, 6482, 6483, 6484, 6487, 6488, 6489, 6490, 6491, 6492, 6493, 6494, 6495, 6497, 6498, 6501, 6502, 6503, 6504, 6505, 6506, 6507, 6508, 6509, 6510, 6511, 6512, 6513, 6514, 6515, 6516, 6517, 6518, 6519, 6520, 6521, 6524, 6525, 6530, 6531, 6532, 6533, 6534, 6535, 6536, 6537, 6538, 6540, 6601, 6602, 6604, 6605, 6606, 6607, 6608, 6610, 6611, 6612, 6614, 6615, 6650, 6673, 6699, 6701, 6702, 6703, 6704, 6705, 6706, 6708, 6710, 6712, 6716, 6720, 6721, 6722, 6723, 6724, 6725, 6726, 6749, 6750, 6751, 6752, 6753, 6754, 6755, 6756, 6757, 6758, 6759, 6762, 6763, 6770, 6776, 6777, 6778, 6779, 6781, 6782, 6783, 6784, 6785, 6786, 6787, 6790, 6791, 6793, 6794, 6795, 6796, 6798, 6801, 6804, 6807, 6810, 6811, 6812, 6813, 6814, 6816, 6817, 6820, 6829, 6830, 6831, 6832, 6836, 6840, 6842, 6850, 6851, 6852, 6853, 6854, 6855, 6856, 6857, 6858, 6859, 6860, 6870, 6875, 6876, 6877, 6878, 6879, 6880, 6881, 6883, 6888, 6889, 6896, 6897, 6901, 6902, 6903, 6904, 6905, 6906, 6907, 6910, 6911, 6912, 6913, 6914, 6920, 6921, 6922, 6925, 6926, 6927, 6928, 7001, 7002, 7003, 7004, 7005, 7006, 7007, 7008, 7009, 7010, 7011, 7012, 7013, 7014, 7015, 7016, 7017, 7018, 7019, 7020, 7021, 7022, 7023, 7024, 7026, 7027, 7028, 7029, 7030, 7031, 7032, 7033, 7034, 7035, 7036, 7039, 7040, 7041, 7042, 7043, 7044, 7045, 7046, 7047, 7050, 7051, 7052, 7054, 7055, 7057, 7058, 7059, 7060, 7061, 7062, 7063, 7064, 7065, 7066, 7067, 7068, 7069, 7070, 7071, 7072, 7073, 7074, 7075, 7076, 7077, 7078, 7079, 7080, 7081, 7082, 7083, 7086, 7087, 7088, 7090, 7091, 7092, 7093, 7094, 7095, 7096, 7097, 7099, 7101, 7102, 7103, 7104, 7105, 7106, 7107, 7108, 7109, 7110, 7111, 7112, 7114, 7175, 7182, 7184, 7188, 7189, 7191, 7192, 7193, 7194, 7195, 7197, 7198, 7199, 7201, 7202, 7203, 7204, 7205, 7206, 7207, 7208, 7302, 7303, 7304, 7305, 7306, 7307, 7308, 7309, 7310, 7311, 7399, 7401, 7403, 7405, 7407, 7410, 7416, 7417, 7418, 7419, 7420, 7421, 7422, 7423, 7424, 7428, 7430, 7432, 7435, 7436, 7438, 7439, 7440, 7442, 7444, 7446, 7450, 7451, 7452, 7456, 7457, 7458, 7460, 7461, 7462, 7463, 7465, 7470, 7474, 7477, 7480, 7481, 7495, 7498, 7501, 7502, 7503, 7504, 7505, 7506, 7507, 7508, 7509, 7510, 7511, 7512, 7513, 7514, 7522, 7524, 7533, 7538, 7543, 7544, 7601, 7602, 7603, 7604, 7605, 7606, 7607, 7608, 7620, 7621, 7624, 7626, 7627, 7628, 7630, 7631, 7632, 7640, 7641, 7642, 7643, 7644, 7645, 7646, 7647, 7648, 7649, 7650, 7652, 7653, 7656, 7657, 7660, 7661, 7662, 7663, 7666, 7670, 7675, 7676, 7677, 7701, 7702, 7703, 7704, 7709, 7710, 7711, 7712, 7715, 7716, 7717, 7718, 7719, 7720, 7721, 7722, 7723, 7724, 7726, 7727, 7728, 7730, 7731, 7732, 7733, 7734, 7735, 7737, 7738, 7739, 7740, 7746, 7747, 7748, 7750, 7751, 7752, 7753, 7754, 7755, 7756, 7757, 7758, 7760, 7762, 7763, 7764, 7765, 7777, 7799, 7801, 7802, 7803, 7806, 7820, 7821, 7822, 7823, 7825, 7826, 7827, 7828, 7829, 7830, 7831, 7832, 7833, 7834, 7836, 7837, 7838, 7839, 7840, 7842, 7843, 7844, 7845, 7846, 7847, 7848, 7849, 7850, 7851, 7852, 7853, 7855, 7856, 7857, 7860, 7863, 7865, 7866, 7869, 7870, 7871, 7874, 7875, 7876, 7877, 7878, 7879, 7880, 7881, 7882, 7885, 7890, 7901, 7902, 7920, 7921, 7922, 7924, 7926, 7927, 7928, 7930, 7931, 7932, 7933, 7934, 7935, 7936, 7938, 7939, 7940, 7945, 7946, 7950, 7960, 7961, 7962, 7963, 7970, 7974, 7976, 7977, 7978, 7979, 7980, 7981, 7983, 7999, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8014, 8015, 8016, 8018, 8019, 8020, 8021, 8022, 8023, 8025, 8026, 8027, 8028, 8029, 8030, 8031, 8032, 8033, 8034, 8035, 8036, 8037, 8038, 8039, 8041, 8042, 8043, 8045, 8046, 8048, 8049, 8050, 8051, 8052, 8053, 8054, 8055, 8056, 8057, 8059, 8060, 8061, 8062, 8063, 8064, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8078, 8079, 8080, 8081, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8091, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099, 8101, 8102, 8103, 8104, 8105, 8106, 8107, 8108, 8109, 8110, 8201, 8202, 8203, 8204, 8205, 8210, 8212, 8213, 8214, 8215, 8217, 8218, 8219, 8220, 8221, 8223, 8224, 8225, 8226, 8230, 8231, 8232, 8234, 8240, 8241, 8242, 8243, 8244, 8245, 8246, 8247, 8248, 8250, 8251, 8252, 8260, 8270, 8302, 8310, 8311, 8312, 8313, 8314, 8315, 8316, 8317, 8318, 8319, 8320, 8321, 8322, 8323, 8324, 8326, 8327, 8328, 8329, 8330, 8332, 8340, 8341, 8342, 8343, 8344, 8345, 8346, 8347, 8348, 8349, 8350, 8352, 8353, 8360, 8361, 8362, 8401, 8402, 8403, 8404, 8405, 8406, 8501, 8502, 8504, 8505, 8510, 8511, 8512, 8514, 8515, 8518, 8520, 8525, 8526, 8527, 8528, 8530, 8533, 8534, 8535, 8536, 8540, 8541, 8542, 8543, 8544, 8550, 8551, 8553, 8554, 8555, 8556, 8557, 8558, 8559, 8560, 8561, 8562, 8570, 8601, 8602, 8603, 8604, 8605, 8606, 8607, 8608, 8609, 8610, 8611, 8618, 8619, 8620, 8625, 8628, 8629, 8638, 8640, 8641, 8645, 8646, 8647, 8648, 8650, 8666, 8677, 8690, 8691, 8695, 8701, 8720, 8721, 8722, 8723, 8724, 8730, 8731, 8732, 8733, 8734, 8735, 8736, 8738, 8739, 8740, 8741, 8742, 8750, 8751, 8752, 8753, 8754, 8755, 8756, 8757, 8758, 8759, 8801, 8802, 8803, 8804, 8805, 8807, 8808, 8809, 8810, 8812, 8816, 8817, 8818, 8820, 8821, 8822, 8823, 8824, 8825, 8826, 8827, 8828, 8829, 8830, 8831, 8832, 8833, 8834, 8835, 8836, 8837, 8840, 8844, 8846, 8848, 8850, 8852, 8853, 8854, 8855, 8857, 8858, 8859, 8861, 8862, 8863, 8865, 8867, 8868, 8869, 8870, 8871, 8872, 8873, 8875, 8876, 8877, 8878, 8879, 8880, 8882, 8884, 8885, 8886, 8887, 8888, 8889, 8890, 8896, 8899, 8901, 8902, 8903, 8904, 8905, 8906, 8922, 8933, 8988, 8989, 9007, 9009, 9012, 9013, 9014, 9021, 9028, 9029, 9031, 9033, 9034, 9036, 9037, 9042, 9045, 9046, 9050, 9053, 9054, 9056, 9058, 9059, 9060, 9063, 9067, 9069, 9072, 9074, 9076, 9080, 9081, 9086, 9089, 9090, 9094, 9095, 9096, 9098, 9099, 9100, 9102, 9103, 9104, 9106, 9107, 9110, 9111, 9112, 9114, 9123, 9126, 9128, 9131, 9136, 9137, 9138, 9139, 9140, 9142, 9143, 9154, 9157, 9164, 9165, 9166, 9169, 9172, 9173, 9175, 9177, 9178, 9180, 9182, 9183, 9185, 9186, 9189, 9211, 9212, 9213, 9214, 9220, 9222, 9225, 9226, 9227, 9229, 9234, 9237, 9239, 9244, 9245, 9250, 9252, 9262, 9263, 9264, 9265, 9266, 9267, 9269, 9275, 9302, 9303, 9304, 9305, 9340, 9391, 9396, 9397, 9398, 9409, 9419, 9420, 9421, 9447, 9448, 9449, 9454, 9456, 9459, 9461, 9463, 9464, 9468, 9469, 9470, 9494, 9496, 9498, 9499, 9501, 9502, 9503, 9504, 9505, 9506, 9507, 9508, 9509, 9510, 9511, 9517, 9521, 9524, 9532, 9534, 9536, 9543, 9544, 9545, 9549, 9550, 9551, 9554, 9556, 9557, 9558, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9581, 9582, 9586, 9587, 9588, 9589, 9590, 9591, 9593, 9594, 9595, 9596, 9599, 9601, 9603, 9604, 9609, 9610, 9612, 9613, 9617, 9618, 9619, 9620, 9621, 9622, 9623, 9624, 9625, 9626, 9627, 9628, 9630, 9631, 9636, 9638, 9642, 9643, 9644, 9645, 9647, 9649, 9703, 9704, 9705, 9706, 9707, 9708, 9709, 9710, 9711, 9713, 9714, 9715, 9716, 9717, 9718, 9720, 9721, 9722, 9723, 9724, 9725, 9726, 9727, 9728, 9729, 9730, 9731, 9732, 9733, 9734, 9735, 9777, 9779, 9780, 9782, 9783, 9784, 9789, 9790, 9791, 9792, 9793, 9795, 9796, 9797, 9802, 9803, 9804, 9805, 9808, 9809, 9810, 9811, 9812, 9813, 9814, 9815, 9816, 9819, 9821, 9822, 9823, 9824, 9825, 9826, 9827, 9828, 9829, 9830, 9831, 9832, 9833, 9834, 9835, 9836, 9837, 9838, 9839, 9841, 9842, 9843, 9844, 9852, 9853, 9854, 9855, 9858, 9865, 9866, 9867, 9868, 9871, 9876, 9880, 9882, 9888, 9889, 9890, 9892, 9894, 9898, 9899, 10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008, 10009, 10010, 10011, 10012, 10013, 10014, 10015, 10016, 10017, 10018, 10019, 10020, 10021, 10022, 10023, 10024, 10025, 10026, 10027, 10028, 10029, 10030, 10031, 10032, 10033, 10034, 10035, 10036, 10037, 10038, 10039, 10040, 10041, 10043, 10044, 10045, 10046, 10047, 10048, 10055, 10060, 10069, 10072, 10079, 10080, 10081, 10082, 10087, 10090, 10094, 10095, 10096, 10098, 10099, 10101, 10102, 10103, 10104, 10105, 10106, 10107, 10108, 10109, 10110, 10111, 10112, 10113, 10114, 10115, 10116, 10117, 10118, 10119, 10120, 10121, 10122, 10123, 10124, 10125, 10126, 10128, 10129, 10130, 10131, 10132, 10133, 10138, 10149, 10150, 10151, 10152, 10153, 10154, 10155, 10156, 10157, 10158, 10159, 10160, 10161, 10162, 10163, 10164, 10165, 10166, 10167, 10168, 10169, 10170, 10171, 10172, 10173, 10174, 10175, 10176, 10177, 10178, 10179, 10184, 10185, 10196, 10197, 10199, 10203, 10211, 10212, 10213, 10242, 10249, 10256, 10257, 10258, 10259, 10260, 10261, 10265, 10268, 10269, 10270, 10271, 10272, 10273, 10274, 10275, 10276, 10277, 10278, 10279, 10280, 10281, 10282, 10285, 10286, 10292, 10301, 10302, 10303, 10304, 10305, 10306, 10307, 10308, 10309, 10310, 10311, 10312, 10313, 10314, 10451, 10452, 10453, 10454, 10455, 10456, 10457, 10458, 10459, 10460, 10461, 10462, 10463, 10464, 10465, 10466, 10467, 10468, 10469, 10470, 10471, 10472, 10473, 10474, 10475, 10499, 10501, 10502, 10503, 10504, 10505, 10506, 10507, 10509, 10510, 10511, 10512, 10514, 10516, 10517, 10518, 10519, 10520, 10521, 10522, 10523, 10524, 10526, 10527, 10528, 10530, 10532, 10533, 10535, 10536, 10537, 10538, 10540, 10541, 10542, 10543, 10545, 10546, 10547, 10548, 10549, 10550, 10551, 10552, 10553, 10557, 10558, 10559, 10560, 10562, 10566, 10567, 10570, 10571, 10572, 10573, 10576, 10577, 10578, 10579, 10580, 10581, 10583, 10587, 10588, 10589, 10590, 10591, 10592, 10594, 10595, 10596, 10597, 10598, 10601, 10602, 10603, 10604, 10605, 10606, 10607, 10610, 10625, 10629, 10633, 10650, 10701, 10702, 10703, 10704, 10705, 10706, 10707, 10708, 10709, 10710, 10801, 10802, 10803, 10804, 10805, 10901, 10910, 10911, 10912, 10913, 10914, 10915, 10916, 10917, 10918, 10919, 10920, 10921, 10922, 10923, 10924, 10925, 10926, 10927, 10928, 10930, 10931, 10932, 10933, 10940, 10941, 10943, 10950, 10952, 10953, 10954, 10956, 10958, 10959, 10960, 10962, 10963, 10964, 10965, 10968, 10969, 10970, 10973, 10974, 10975, 10976, 10977, 10979, 10980, 10981, 10982, 10983, 10984, 10985, 10986, 10987, 10988, 10989, 10990, 10992, 10993, 10994, 10995, 10996, 10997, 10998, 11001, 11002, 11003, 11004, 11005, 11010, 11020, 11021, 11022, 11023, 11024, 11025, 11026, 11027, 11030, 11040, 11041, 11042, 11043, 11044, 11050, 11051, 11052, 11053, 11054, 11055, 11096, 11099, 11101, 11102, 11103, 11104, 11105, 11106, 11109, 11120, 11201, 11202, 11203, 11204, 11205, 11206, 11207, 11208, 11209, 11210, 11211, 11212, 11213, 11214, 11215, 11216, 11217, 11218, 11219, 11220, 11221, 11222, 11223, 11224, 11225, 11226, 11228, 11229, 11230, 11231, 11232, 11233, 11234, 11235, 11236, 11237, 11238, 11239, 11240, 11241, 11242, 11243, 11244, 11245, 11247, 11248, 11249, 11251, 11252, 11254, 11255, 11256, 11351, 11352, 11354, 11355, 11356, 11357, 11358, 11359, 11360, 11361, 11362, 11363, 11364, 11365, 11366, 11367, 11368, 11369, 11370, 11371, 11372, 11373, 11374, 11375, 11377, 11378, 11379, 11380, 11381, 11385, 11386, 11390, 11405, 11411, 11412, 11413, 11414, 11415, 11416, 11417, 11418, 11419, 11420, 11421, 11422, 11423, 11424, 11425, 11426, 11427, 11428, 11429, 11430, 11431, 11432, 11433, 11434, 11435, 11436, 11439, 11451, 11484, 11499, 11501, 11507, 11509, 11510, 11514, 11516, 11518, 11520, 11530, 11531, 11535, 11536, 11542, 11545, 11547, 11548, 11549, 11550, 11551, 11552, 11553, 11554, 11555, 11556, 11557, 11558, 11559, 11560, 11561, 11563, 11564, 11565, 11566, 11568, 11569, 11570, 11571, 11572, 11575, 11576, 11577, 11579, 11580, 11581, 11582, 11583, 11588, 11590, 11592, 11593, 11594, 11595, 11596, 11597, 11598, 11599, 11690, 11691, 11692, 11693, 11694, 11695, 11697, 11701, 11702, 11703, 11704, 11705, 11706, 11707, 11708, 11709, 11710, 11713, 11714, 11715, 11716, 11717, 11718, 11719, 11720, 11721, 11722, 11724, 11725, 11726, 11727, 11729, 11730, 11731, 11732, 11733, 11735, 11736, 11737, 11738, 11739, 11740, 11741, 11742, 11743, 11745, 11746, 11747, 11749, 11750, 11751, 11752, 11753, 11754, 11755, 11756, 11757, 11758, 11760, 11762, 11763, 11764, 11765, 11766, 11767, 11768, 11769, 11770, 11771, 11772, 11773, 11774, 11775, 11776, 11777, 11778, 11779, 11780, 11782, 11783, 11784, 11786, 11787, 11788, 11789, 11790, 11791, 11792, 11793, 11794, 11795, 11796, 11797, 11798, 11801, 11802, 11803, 11804, 11805, 11815, 11819, 11853, 11854, 11855, 11901, 11930, 11931, 11932, 11933, 11934, 11935, 11937, 11939, 11940, 11941, 11942, 11944, 11946, 11947, 11948, 11949, 11950, 11951, 11952, 11953, 11954, 11955, 11956, 11957, 11958, 11959, 11960, 11961, 11962, 11963, 11964, 11965, 11967, 11968, 11969, 11970, 11971, 11972, 11973, 11975, 11976, 11977, 11978, 11980, 12007, 12008, 12009, 12010, 12015, 12016, 12017, 12018, 12019, 12020, 12022, 12023, 12024, 12025, 12027, 12028, 12029, 12031, 12032, 12033, 12035, 12036, 12037, 12040, 12041, 12042, 12043, 12045, 12046, 12047, 12050, 12051, 12052, 12053, 12054, 12055, 12056, 12057, 12058, 12059, 12060, 12061, 12062, 12063, 12064, 12065, 12066, 12067, 12068, 12069, 12070, 12071, 12072, 12073, 12074, 12075, 12076, 12077, 12078, 12082, 12083, 12084, 12085, 12086, 12087, 12089, 12090, 12092, 12093, 12094, 12095, 12106, 12107, 12108, 12110, 12111, 12115, 12116, 12117, 12118, 12120, 12121, 12122, 12123, 12124, 12125, 12128, 12130, 12131, 12132, 12133, 12134, 12136, 12137, 12138, 12139, 12140, 12141, 12143, 12144, 12147, 12148, 12149, 12150, 12151, 12153, 12154, 12155, 12156, 12157, 12158, 12159, 12160, 12161, 12164, 12165, 12166, 12167, 12168, 12169, 12170, 12172, 12173, 12174, 12175, 12176, 12177, 12179, 12180, 12181, 12182, 12183, 12184, 12185, 12186, 12187, 12188, 12189, 12190, 12192, 12193, 12194, 12195, 12196, 12197, 12198, 12201, 12202, 12203, 12204, 12205, 12206, 12207, 12208, 12209, 12210, 12211, 12212, 12214, 12220, 12222, 12223, 12224, 12225, 12226, 12227, 12228, 12229, 12230, 12231, 12232, 12233, 12234, 12235, 12236, 12237, 12238, 12239, 12240, 12241, 12242, 12243, 12244, 12245, 12246, 12247, 12248, 12249, 12250, 12252, 12255, 12256, 12257, 12260, 12261, 12262, 12288, 12301, 12302, 12303, 12304, 12305, 12306, 12307, 12308, 12309, 12325, 12345, 12401, 12402, 12404, 12405, 12406, 12407, 12409, 12410, 12411, 12412, 12413, 12414, 12416, 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 12436, 12438, 12439, 12440, 12441, 12442, 12443, 12444, 12446, 12448, 12449, 12450, 12451, 12452, 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12463, 12464, 12465, 12466, 12468, 12469, 12470, 12471, 12472, 12473, 12474, 12475, 12477, 12480, 12481, 12482, 12483, 12484, 12485, 12486, 12487, 12489, 12490, 12491, 12492, 12493, 12494, 12495, 12496, 12498, 12501, 12502, 12503, 12504, 12506, 12507, 12508, 12510, 12511, 12512, 12513, 12514, 12515, 12516, 12517, 12518, 12520, 12521, 12522, 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12533, 12534, 12537, 12538, 12540, 12541, 12542, 12543, 12544, 12545, 12546, 12547, 12548, 12549, 12550, 12551, 12552, 12553, 12555, 12561, 12563, 12564, 12565, 12566, 12567, 12568, 12569, 12570, 12571, 12572, 12574, 12575, 12577, 12578, 12580, 12581, 12582, 12583, 12584, 12585, 12586, 12588, 12589, 12590, 12592, 12593, 12594, 12601, 12602, 12603, 12604, 12701, 12719, 12720, 12721, 12722, 12723, 12724, 12725, 12726, 12727, 12729, 12732, 12733, 12734, 12736, 12737, 12738, 12739, 12740, 12741, 12742, 12743, 12745, 12746, 12747, 12748, 12749, 12750, 12751, 12752, 12754, 12758, 12759, 12760, 12762, 12763, 12764, 12765, 12766, 12767, 12768, 12769, 12770, 12771, 12775, 12776, 12777, 12778, 12779, 12780, 12781, 12782, 12783, 12784, 12785, 12786, 12787, 12788, 12789, 12790, 12791, 12792, 12801, 12803, 12804, 12808, 12809, 12810, 12811, 12812, 12814, 12815, 12816, 12817, 12819, 12820, 12821, 12822, 12823, 12824, 12827, 12828, 12831, 12832, 12833, 12834, 12835, 12836, 12837, 12838, 12839, 12841, 12842, 12843, 12844, 12845, 12846, 12847, 12848, 12849, 12850, 12851, 12852, 12853, 12854, 12855, 12856, 12857, 12858, 12859, 12860, 12861, 12862, 12863, 12864, 12865, 12866, 12870, 12871, 12872, 12873, 12874, 12878, 12879, 12883, 12884, 12885, 12886, 12887, 12901, 12903, 12910, 12911, 12912, 12913, 12914, 12915, 12916, 12917, 12918, 12919, 12920, 12921, 12922, 12923, 12924, 12926, 12927, 12928, 12929, 12930, 12932, 12933, 12934, 12935, 12936, 12937, 12939, 12941, 12942, 12943, 12944, 12945, 12946, 12949, 12950, 12952, 12953, 12955, 12956, 12957, 12958, 12959, 12960, 12961, 12962, 12964, 12965, 12966, 12967, 12969, 12970, 12972, 12973, 12974, 12975, 12976, 12977, 12978, 12979, 12980, 12981, 12983, 12985, 12986, 12987, 12989, 12992, 12993, 12995, 12996, 12997, 12998, 13020, 13021, 13022, 13024, 13026, 13027, 13028, 13029, 13030, 13031, 13032, 13033, 13034, 13035, 13036, 13037, 13039, 13040, 13041, 13042, 13043, 13044, 13045, 13051, 13052, 13053, 13054, 13056, 13057, 13060, 13061, 13062, 13063, 13064, 13065, 13066, 13068, 13069, 13071, 13072, 13073, 13074, 13076, 13077, 13078, 13080, 13081, 13082, 13083, 13084, 13087, 13088, 13089, 13090, 13092, 13093, 13101, 13102, 13103, 13104, 13107, 13108, 13110, 13111, 13112, 13113, 13114, 13115, 13116, 13117, 13118, 13119, 13120, 13121, 13122, 13123, 13124, 13126, 13129, 13131, 13132, 13134, 13135, 13136, 13137, 13138, 13139, 13140, 13141, 13142, 13143, 13144, 13145, 13146, 13147, 13148, 13152, 13153, 13154, 13155, 13156, 13157, 13158, 13159, 13160, 13162, 13163, 13164, 13165, 13166, 13167, 13201, 13202, 13203, 13204, 13205, 13206, 13207, 13208, 13209, 13210, 13211, 13212, 13214, 13215, 13217, 13218, 13219, 13220, 13221, 13224, 13225, 13235, 13244, 13250, 13251, 13252, 13260, 13261, 13290, 13301, 13302, 13303, 13304, 13305, 13308, 13309, 13310, 13312, 13313, 13314, 13315, 13316, 13317, 13318, 13319, 13320, 13321, 13322, 13323, 13324, 13325, 13326, 13327, 13328, 13329, 13331, 13332, 13333, 13334, 13335, 13337, 13338, 13339, 13340, 13341, 13342, 13343, 13345, 13346, 13348, 13350, 13352, 13353, 13354, 13355, 13357, 13360, 13361, 13362, 13363, 13364, 13365, 13367, 13368, 13401, 13402, 13403, 13404, 13406, 13407, 13408, 13409, 13410, 13411, 13413, 13415, 13416, 13417, 13418, 13420, 13421, 13424, 13425, 13426, 13428, 13431, 13433, 13435, 13436, 13437, 13438, 13439, 13440, 13441, 13442, 13449, 13450, 13452, 13454, 13455, 13456, 13457, 13459, 13460, 13461, 13464, 13465, 13468, 13469, 13470, 13471, 13472, 13473, 13475, 13476, 13477, 13478, 13479, 13480, 13482, 13483, 13484, 13485, 13486, 13488, 13489, 13490, 13491, 13492, 13493, 13494, 13495, 13501, 13502, 13503, 13504, 13505, 13599, 13601, 13602, 13603, 13605, 13606, 13607, 13608, 13611, 13612, 13613, 13614, 13615, 13616, 13617, 13618, 13619, 13620, 13621, 13622, 13623, 13624, 13625, 13626, 13627, 13628, 13630, 13631, 13632, 13633, 13634, 13635, 13636, 13637, 13638, 13639, 13640, 13641, 13642, 13643, 13645, 13646, 13647, 13648, 13649, 13650, 13651, 13652, 13654, 13655, 13656, 13657, 13658, 13659, 13660, 13661, 13662, 13664, 13665, 13666, 13667, 13668, 13669, 13670, 13671, 13672, 13673, 13674, 13675, 13676, 13677, 13678, 13679, 13680, 13681, 13682, 13683, 13684, 13685, 13687, 13688, 13690, 13691, 13692, 13693, 13694, 13695, 13696, 13697, 13699, 13730, 13731, 13732, 13733, 13734, 13736, 13737, 13738, 13739, 13740, 13743, 13744, 13745, 13746, 13747, 13748, 13749, 13750, 13751, 13752, 13753, 13754, 13755, 13756, 13757, 13758, 13760, 13761, 13762, 13763, 13774, 13775, 13776, 13777, 13778, 13780, 13782, 13783, 13784, 13786, 13787, 13788, 13790, 13794, 13795, 13796, 13797, 13801, 13802, 13803, 13804, 13806, 13807, 13808, 13809, 13810, 13811, 13812, 13813, 13814, 13815, 13820, 13825, 13826, 13827, 13830, 13832, 13833, 13834, 13835, 13837, 13838, 13839, 13840, 13841, 13842, 13843, 13844, 13845, 13846, 13847, 13848, 13849, 13850, 13851, 13856, 13859, 13860, 13861, 13862, 13863, 13864, 13865, 13901, 13902, 13903, 13904, 13905, 14001, 14003, 14004, 14005, 14006, 14008, 14009, 14010, 14011, 14012, 14013, 14020, 14021, 14024, 14025, 14026, 14027, 14028, 14029, 14030, 14031, 14032, 14033, 14034, 14035, 14036, 14037, 14038, 14039, 14040, 14041, 14042, 14043, 14047, 14048, 14051, 14052, 14054, 14055, 14056, 14057, 14058, 14059, 14060, 14061, 14062, 14063, 14065, 14066, 14067, 14068, 14069, 14070, 14072, 14075, 14080, 14081, 14082, 14083, 14085, 14086, 14091, 14092, 14094, 14095, 14098, 14101, 14102, 14103, 14105, 14107, 14108, 14109, 14110, 14111, 14112, 14113, 14120, 14125, 14126, 14127, 14129, 14130, 14131, 14132, 14133, 14134, 14135, 14136, 14138, 14139, 14140, 14141, 14143, 14144, 14145, 14150, 14151, 14166, 14167, 14168, 14169, 14170, 14171, 14172, 14173, 14174, 14201, 14202, 14203, 14204, 14205, 14206, 14207, 14208, 14209, 14210, 14211, 14212, 14213, 14214, 14215, 14216, 14217, 14218, 14219, 14220, 14221, 14222, 14223, 14224, 14225, 14226, 14227, 14228, 14231, 14233, 14240, 14241, 14260, 14261, 14263, 14264, 14265, 14267, 14269, 14270, 14272, 14273, 14276, 14280, 14301, 14302, 14303, 14304, 14305, 14410, 14411, 14413, 14414, 14415, 14416, 14418, 14420, 14422, 14423, 14424, 14425, 14427, 14428, 14429, 14430, 14432, 14433, 14435, 14437, 14441, 14443, 14445, 14449, 14450, 14452, 14453, 14454, 14456, 14461, 14462, 14463, 14464, 14466, 14467, 14468, 14469, 14470, 14471, 14472, 14475, 14476, 14477, 14478, 14479, 14480, 14481, 14482, 14485, 14486, 14487, 14488, 14489, 14502, 14504, 14505, 14506, 14507, 14508, 14510, 14511, 14512, 14513, 14514, 14515, 14516, 14517, 14518, 14519, 14520, 14521, 14522, 14525, 14526, 14527, 14529, 14530, 14532, 14533, 14534, 14536, 14537, 14538, 14539, 14541, 14542, 14543, 14544, 14545, 14546, 14547, 14548, 14549, 14550, 14551, 14555, 14556, 14557, 14558, 14559, 14560, 14561, 14563, 14564, 14568, 14569, 14571, 14572, 14580, 14585, 14586, 14588, 14589, 14590, 14591, 14592, 14601, 14602, 14603, 14604, 14605, 14606, 14607, 14608, 14609, 14610, 14611, 14612, 14613, 14614, 14615, 14616, 14617, 14618, 14619, 14620, 14621, 14622, 14623, 14624, 14625, 14626, 14627, 14638, 14639, 14642, 14643, 14644, 14645, 14646, 14647, 14649, 14650, 14651, 14652, 14653, 14660, 14664, 14673, 14683, 14692, 14694, 14701, 14702, 14703, 14704, 14706, 14707, 14708, 14709, 14710, 14711, 14712, 14714, 14715, 14716, 14717, 14718, 14719, 14720, 14721, 14722, 14723, 14724, 14726, 14727, 14728, 14729, 14730, 14731, 14732, 14733, 14735, 14736, 14737, 14738, 14739, 14740, 14741, 14742, 14743, 14744, 14745, 14747, 14748, 14750, 14751, 14752, 14753, 14754, 14755, 14756, 14757, 14758, 14760, 14766, 14767, 14769, 14770, 14772, 14774, 14775, 14777, 14778, 14779, 14781, 14782, 14783, 14784, 14785, 14786, 14787, 14788, 14801, 14802, 14803, 14804, 14805, 14806, 14807, 14808, 14809, 14810, 14812, 14813, 14814, 14815, 14816, 14817, 14818, 14819, 14820, 14821, 14822, 14823, 14824, 14825, 14826, 14827, 14830, 14831, 14836, 14837, 14838, 14839, 14840, 14841, 14842, 14843, 14844, 14845, 14846, 14847, 14850, 14851, 14852, 14853, 14854, 14855, 14856, 14857, 14858, 14859, 14860, 14861, 14863, 14864, 14865, 14867, 14869, 14870, 14871, 14872, 14873, 14874, 14876, 14877, 14878, 14879, 14880, 14881, 14882, 14883, 14884, 14885, 14886, 14887, 14889, 14891, 14892, 14893, 14894, 14895, 14897, 14898, 14901, 14902, 14903, 14904, 14905, 14925, 15001, 15003, 15004, 15005, 15006, 15007, 15009, 15010, 15012, 15014, 15015, 15017, 15018, 15019, 15020, 15021, 15022, 15024, 15025, 15026, 15027, 15028, 15030, 15031, 15032, 15033, 15034, 15035, 15036, 15037, 15038, 15042, 15043, 15044, 15045, 15046, 15047, 15049, 15050, 15051, 15052, 15053, 15054, 15055, 15056, 15057, 15059, 15060, 15061, 15062, 15063, 15064, 15065, 15066, 15067, 15068, 15069, 15071, 15072, 15074, 15075, 15076, 15077, 15078, 15081, 15082, 15083, 15084, 15085, 15086, 15087, 15088, 15089, 15090, 15091, 15095, 15096, 15101, 15102, 15104, 15106, 15108, 15110, 15112, 15116, 15120, 15122, 15123, 15126, 15127, 15129, 15130, 15131, 15132, 15133, 15134, 15135, 15136, 15137, 15139, 15140, 15142, 15143, 15144, 15145, 15146, 15147, 15148, 15189, 15201, 15202, 15203, 15204, 15205, 15206, 15207, 15208, 15209, 15210, 15211, 15212, 15213, 15214, 15215, 15216, 15217, 15218, 15219, 15220, 15221, 15222, 15223, 15224, 15225, 15226, 15227, 15228, 15229, 15230, 15231, 15232, 15233, 15234, 15235, 15236, 15237, 15238, 15239, 15240, 15241, 15242, 15243, 15244, 15250, 15251, 15252, 15253, 15254, 15255, 15257, 15258, 15259, 15260, 15261, 15262, 15263, 15264, 15265, 15266, 15267, 15268, 15270, 15272, 15274, 15275, 15276, 15277, 15278, 15279, 15281, 15282, 15283, 15285, 15286, 15290, 15295, 15301, 15310, 15311, 15312, 15313, 15314, 15315, 15316, 15317, 15320, 15321, 15322, 15323, 15324, 15325, 15327, 15329, 15330, 15331, 15332, 15333, 15334, 15336, 15337, 15338, 15339, 15340, 15341, 15342, 15344, 15345, 15346, 15347, 15348, 15349, 15350, 15351, 15352, 15353, 15354, 15357, 15358, 15359, 15360, 15361, 15362, 15363, 15364, 15365, 15366, 15367, 15368, 15370, 15376, 15377, 15378, 15379, 15380, 15401, 15410, 15411, 15412, 15413, 15415, 15416, 15417, 15419, 15420, 15421, 15422, 15423, 15424, 15425, 15427, 15428, 15429, 15430, 15431, 15432, 15433, 15434, 15435, 15436, 15437, 15438, 15439, 15440, 15442, 15443, 15444, 15445, 15446, 15447, 15448, 15449, 15450, 15451, 15454, 15455, 15456, 15458, 15459, 15460, 15461, 15462, 15463, 15464, 15465, 15466, 15467, 15468, 15469, 15470, 15472, 15473, 15474, 15475, 15476, 15477, 15478, 15479, 15480, 15482, 15483, 15484, 15485, 15486, 15488, 15489, 15490, 15492, 15501, 15502, 15510, 15520, 15521, 15522, 15530, 15531, 15532, 15533, 15534, 15535, 15536, 15537, 15538, 15539, 15540, 15541, 15542, 15544, 15545, 15546, 15547, 15548, 15549, 15550, 15551, 15552, 15553, 15554, 15555, 15557, 15558, 15559, 15560, 15561, 15562, 15563, 15564, 15565, 15601, 15605, 15606, 15610, 15611, 15612, 15613, 15615, 15616, 15617, 15618, 15619, 15620, 15621, 15622, 15623, 15624, 15625, 15626, 15627, 15628, 15629, 15630, 15631, 15632, 15633, 15634, 15635, 15636, 15637, 15638, 15639, 15640, 15641, 15642, 15644, 15646, 15647, 15650, 15655, 15656, 15658, 15660, 15661, 15662, 15663, 15664, 15665, 15666, 15668, 15670, 15671, 15672, 15673, 15674, 15675, 15676, 15677, 15678, 15679, 15680, 15681, 15682, 15683, 15684, 15685, 15686, 15687, 15688, 15689, 15690, 15691, 15692, 15693, 15695, 15696, 15697, 15698, 15701, 15705, 15710, 15711, 15712, 15713, 15714, 15715, 15716, 15717, 15720, 15721, 15722, 15723, 15724, 15725, 15727, 15728, 15729, 15730, 15731, 15732, 15733, 15734, 15736, 15737, 15738, 15739, 15740, 15741, 15742, 15744, 15745, 15746, 15747, 15748, 15750, 15751, 15752, 15753, 15754, 15756, 15757, 15758, 15759, 15760, 15761, 15762, 15763, 15764, 15765, 15767, 15770, 15771, 15772, 15773, 15774, 15775, 15776, 15777, 15778, 15779, 15780, 15781, 15783, 15784, 15801, 15821, 15822, 15823, 15824, 15825, 15827, 15828, 15829, 15831, 15832, 15834, 15840, 15841, 15845, 15846, 15847, 15848, 15849, 15851, 15853, 15856, 15857, 15860, 15861, 15863, 15864, 15865, 15866, 15868, 15870, 15901, 15902, 15904, 15905, 15906, 15907, 15909, 15915, 15920, 15921, 15922, 15923, 15924, 15925, 15926, 15927, 15928, 15929, 15930, 15931, 15934, 15935, 15936, 15937, 15938, 15940, 15942, 15943, 15944, 15945, 15946, 15948, 15949, 15951, 15952, 15953, 15954, 15955, 15956, 15957, 15958, 15959, 15960, 15961, 15962, 15963, 16001, 16002, 16003, 16016, 16017, 16018, 16020, 16021, 16022, 16023, 16024, 16025, 16027, 16028, 16029, 16030, 16033, 16034, 16035, 16036, 16037, 16038, 16039, 16040, 16041, 16045, 16046, 16048, 16049, 16050, 16051, 16052, 16053, 16054, 16055, 16056, 16057, 16058, 16059, 16061, 16063, 16066, 16101, 16102, 16103, 16105, 16107, 16108, 16110, 16111, 16112, 16113, 16114, 16115, 16116, 16117, 16120, 16121, 16123, 16124, 16125, 16127, 16130, 16131, 16132, 16133, 16134, 16136, 16137, 16140, 16141, 16142, 16143, 16145, 16146, 16148, 16150, 16151, 16153, 16154, 16155, 16156, 16157, 16159, 16160, 16161, 16172, 16201, 16210, 16211, 16212, 16213, 16214, 16215, 16216, 16217, 16218, 16220, 16221, 16222, 16223, 16224, 16225, 16226, 16228, 16229, 16230, 16232, 16233, 16234, 16235, 16236, 16238, 16239, 16240, 16242, 16244, 16245, 16246, 16248, 16249, 16250, 16253, 16254, 16255, 16256, 16257, 16258, 16259, 16260, 16261, 16262, 16263, 16301, 16311, 16312, 16313, 16314, 16316, 16317, 16319, 16321, 16322, 16323, 16326, 16327, 16328, 16329, 16331, 16332, 16333, 16334, 16335, 16340, 16341, 16342, 16343, 16344, 16345, 16346, 16347, 16350, 16351, 16352, 16353, 16354, 16360, 16361, 16362, 16364, 16365, 16366, 16367, 16368, 16369, 16370, 16371, 16372, 16373, 16374, 16375, 16388, 16401, 16402, 16403, 16404, 16405, 16406, 16407, 16410, 16411, 16412, 16413, 16415, 16416, 16417, 16420, 16421, 16422, 16423, 16424, 16426, 16427, 16428, 16430, 16432, 16433, 16434, 16435, 16436, 16438, 16440, 16441, 16442, 16443, 16444, 16475, 16501, 16502, 16503, 16504, 16505, 16506, 16507, 16508, 16509, 16510, 16511, 16512, 16514, 16515, 16522, 16530, 16531, 16532, 16533, 16534, 16538, 16541, 16544, 16546, 16550, 16553, 16554, 16558, 16563, 16565, 16601, 16602, 16603, 16611, 16613, 16614, 16616, 16617, 16619, 16620, 16621, 16622, 16623, 16624, 16625, 16627, 16629, 16630, 16631, 16633, 16634, 16635, 16636, 16637, 16638, 16639, 16640, 16641, 16644, 16645, 16646, 16647, 16648, 16650, 16651, 16652, 16654, 16655, 16656, 16657, 16659, 16660, 16661, 16662, 16663, 16664, 16665, 16666, 16667, 16668, 16669, 16670, 16671, 16672, 16673, 16674, 16675, 16677, 16678, 16679, 16680, 16681, 16682, 16683, 16684, 16685, 16686, 16689, 16691, 16692, 16693, 16694, 16695, 16698, 16699, 16701, 16720, 16724, 16725, 16726, 16727, 16728, 16729, 16730, 16731, 16732, 16733, 16734, 16735, 16738, 16740, 16743, 16744, 16745, 16746, 16748, 16749, 16750, 16751, 16801, 16802, 16803, 16804, 16805, 16820, 16821, 16822, 16823, 16825, 16826, 16827, 16828, 16829, 16830, 16832, 16833, 16834, 16835, 16836, 16837, 16838, 16839, 16840, 16841, 16843, 16844, 16845, 16847, 16848, 16849, 16850, 16851, 16852, 16853, 16854, 16855, 16856, 16858, 16859, 16860, 16861, 16863, 16864, 16865, 16866, 16868, 16870, 16871, 16872, 16873, 16874, 16875, 16876, 16877, 16878, 16879, 16881, 16882, 16901, 16910, 16911, 16912, 16914, 16915, 16917, 16918, 16920, 16921, 16922, 16923, 16925, 16926, 16927, 16928, 16929, 16930, 16932, 16933, 16935, 16936, 16937, 16938, 16939, 16940, 16941, 16942, 16943, 16945, 16946, 16947, 16948, 16950, 17001, 17002, 17003, 17004, 17005, 17006, 17007, 17008, 17009, 17010, 17011, 17012, 17013, 17014, 17016, 17017, 17018, 17019, 17020, 17021, 17022, 17023, 17024, 17025, 17026, 17027, 17028, 17029, 17030, 17031, 17032, 17033, 17034, 17035, 17036, 17037, 17038, 17039, 17040, 17041, 17042, 17043, 17044, 17045, 17046, 17047, 17048, 17049, 17050, 17051, 17052, 17053, 17054, 17055, 17056, 17057, 17058, 17059, 17060, 17061, 17062, 17063, 17064, 17065, 17066, 17067, 17068, 17069, 17070, 17071, 17072, 17073, 17074, 17075, 17076, 17077, 17078, 17080, 17081, 17082, 17083, 17084, 17085, 17086, 17087, 17088, 17089, 17090, 17091, 17093, 17094, 17097, 17098, 17099, 17101, 17102, 17103, 17104, 17105, 17106, 17107, 17108, 17109, 17110, 17111, 17112, 17113, 17120, 17121, 17122, 17123, 17124, 17125, 17126, 17127, 17128, 17129, 17130, 17140, 17177, 17201, 17210, 17211, 17212, 17213, 17214, 17215, 17217, 17219, 17220, 17221, 17222, 17223, 17224, 17225, 17228, 17229, 17231, 17232, 17233, 17235, 17236, 17237, 17238, 17239, 17240, 17241, 17243, 17244, 17246, 17247, 17249, 17250, 17251, 17252, 17253, 17254, 17255, 17256, 17257, 17260, 17261, 17262, 17263, 17264, 17265, 17266, 17267, 17268, 17270, 17271, 17272, 17301, 17302, 17303, 17304, 17306, 17307, 17309, 17310, 17311, 17312, 17313, 17314, 17315, 17316, 17317, 17318, 17319, 17320, 17321, 17322, 17323, 17324, 17325, 17326, 17327, 17329, 17331, 17332, 17333, 17334, 17337, 17339, 17340, 17342, 17343, 17344, 17345, 17347, 17349, 17350, 17352, 17353, 17354, 17355, 17356, 17358, 17360, 17361, 17362, 17363, 17364, 17365, 17366, 17368, 17370, 17371, 17372, 17375, 17401, 17402, 17403, 17404, 17405, 17406, 17407, 17415, 17501, 17502, 17503, 17504, 17505, 17506, 17507, 17508, 17509, 17512, 17516, 17517, 17518, 17519, 17520, 17521, 17522, 17527, 17528, 17529, 17532, 17533, 17534, 17535, 17536, 17537, 17538, 17540, 17543, 17545, 17547, 17549, 17550, 17551, 17552, 17554, 17555, 17557, 17560, 17562, 17563, 17564, 17565, 17566, 17567, 17568, 17569, 17570, 17572, 17573, 17575, 17576, 17577, 17578, 17579, 17580, 17581, 17582, 17583, 17584, 17585, 17601, 17602, 17603, 17604, 17605, 17606, 17607, 17608, 17699, 17701, 17702, 17703, 17705, 17720, 17721, 17722, 17723, 17724, 17726, 17727, 17728, 17729, 17730, 17731, 17735, 17737, 17738, 17739, 17740, 17742, 17743, 17744, 17745, 17747, 17748, 17749, 17750, 17751, 17752, 17754, 17756, 17758, 17759, 17760, 17762, 17763, 17764, 17765, 17767, 17768, 17769, 17771, 17772, 17773, 17774, 17776, 17777, 17778, 17779, 17801, 17810, 17812, 17813, 17814, 17815, 17820, 17821, 17822, 17823, 17824, 17825, 17827, 17828, 17829, 17830, 17831, 17832, 17833, 17834, 17835, 17836, 17837, 17839, 17840, 17841, 17842, 17843, 17844, 17845, 17846, 17847, 17850, 17851, 17853, 17855, 17856, 17857, 17858, 17859, 17860, 17861, 17862, 17864, 17865, 17866, 17867, 17868, 17870, 17872, 17876, 17877, 17878, 17880, 17881, 17882, 17883, 17884, 17885, 17886, 17887, 17888, 17889, 17901, 17920, 17921, 17922, 17923, 17925, 17927, 17929, 17930, 17931, 17932, 17933, 17934, 17935, 17936, 17938, 17941, 17942, 17943, 17944, 17945, 17946, 17948, 17949, 17951, 17952, 17953, 17954, 17957, 17959, 17960, 17961, 17963, 17964, 17965, 17966, 17967, 17968, 17970, 17972, 17974, 17976, 17978, 17979, 17980, 17981, 17982, 17983, 17985, 18001, 18002, 18003, 18010, 18011, 18012, 18013, 18014, 18015, 18016, 18017, 18018, 18020, 18025, 18030, 18031, 18032, 18034, 18035, 18036, 18037, 18038, 18039, 18040, 18041, 18042, 18043, 18044, 18045, 18046, 18049, 18050, 18051, 18052, 18053, 18054, 18055, 18056, 18058, 18059, 18060, 18062, 18063, 18064, 18065, 18066, 18067, 18068, 18069, 18070, 18071, 18072, 18073, 18074, 18076, 18077, 18078, 18079, 18080, 18081, 18083, 18084, 18085, 18086, 18087, 18088, 18091, 18092, 18098, 18099, 18101, 18102, 18103, 18104, 18105, 18106, 18109, 18175, 18195, 18201, 18202, 18210, 18211, 18212, 18214, 18216, 18218, 18219, 18220, 18221, 18222, 18223, 18224, 18225, 18229, 18230, 18231, 18232, 18234, 18235, 18237, 18239, 18240, 18241, 18242, 18243, 18244, 18245, 18246, 18247, 18248, 18249, 18250, 18251, 18252, 18254, 18255, 18256, 18301, 18320, 18321, 18322, 18323, 18324, 18325, 18326, 18327, 18328, 18330, 18331, 18332, 18333, 18334, 18335, 18336, 18337, 18340, 18341, 18342, 18343, 18344, 18346, 18347, 18348, 18349, 18350, 18351, 18352, 18353, 18354, 18355, 18356, 18357, 18360, 18370, 18371, 18372, 18373, 18401, 18403, 18405, 18407, 18410, 18411, 18413, 18414, 18415, 18416, 18417, 18419, 18420, 18421, 18424, 18425, 18426, 18427, 18428, 18430, 18431, 18433, 18434, 18435, 18436, 18437, 18438, 18439, 18440, 18441, 18443, 18444, 18445, 18446, 18447, 18448, 18449, 18451, 18452, 18453, 18454, 18455, 18456, 18457, 18458, 18459, 18460, 18461, 18462, 18463, 18464, 18465, 18466, 18469, 18470, 18471, 18472, 18473, 18501, 18502, 18503, 18504, 18505, 18507, 18508, 18509, 18510, 18512, 18514, 18515, 18517, 18518, 18519, 18522, 18540, 18577, 18601, 18602, 18603, 18610, 18611, 18612, 18614, 18615, 18616, 18617, 18618, 18619, 18621, 18622, 18623, 18624, 18625, 18626, 18627, 18628, 18629, 18630, 18631, 18632, 18634, 18635, 18636, 18640, 18641, 18642, 18643, 18644, 18651, 18653, 18654, 18655, 18656, 18657, 18660, 18661, 18690, 18701, 18702, 18703, 18704, 18705, 18706, 18707, 18708, 18709, 18710, 18711, 18761, 18762, 18763, 18764, 18765, 18766, 18767, 18768, 18769, 18773, 18774, 18801, 18810, 18812, 18813, 18814, 18815, 18816, 18817, 18818, 18820, 18821, 18822, 18823, 18824, 18825, 18826, 18827, 18828, 18829, 18830, 18831, 18832, 18833, 18834, 18837, 18839, 18840, 18842, 18843, 18844, 18845, 18846, 18847, 18848, 18850, 18851, 18853, 18854, 18901, 18910, 18911, 18912, 18913, 18914, 18915, 18916, 18917, 18918, 18920, 18921, 18922, 18923, 18924, 18925, 18926, 18927, 18928, 18929, 18930, 18931, 18932, 18933, 18934, 18935, 18936, 18938, 18940, 18942, 18943, 18944, 18946, 18947, 18949, 18950, 18951, 18953, 18954, 18955, 18956, 18957, 18958, 18960, 18962, 18963, 18964, 18966, 18968, 18969, 18970, 18971, 18972, 18974, 18976, 18977, 18979, 18980, 18981, 18991, 19001, 19002, 19003, 19004, 19006, 19007, 19008, 19009, 19010, 19012, 19013, 19014, 19015, 19016, 19017, 19018, 19019, 19020, 19021, 19022, 19023, 19025, 19026, 19027, 19028, 19029, 19030, 19031, 19032, 19033, 19034, 19035, 19036, 19037, 19038, 19039, 19040, 19041, 19043, 19044, 19046, 19047, 19048, 19049, 19050, 19052, 19053, 19054, 19055, 19056, 19057, 19058, 19059, 19061, 19063, 19064, 19065, 19066, 19067, 19070, 19072, 19073, 19074, 19075, 19076, 19078, 19079, 19080, 19081, 19082, 19083, 19085, 19086, 19087, 19088, 19089, 19090, 19091, 19092, 19093, 19094, 19095, 19096, 19098, 19099, 19101, 19102, 19103, 19104, 19105, 19106, 19107, 19108, 19109, 19110, 19111, 19112, 19113, 19114, 19115, 19116, 19118, 19119, 19120, 19121, 19122, 19123, 19124, 19125, 19126, 19127, 19128, 19129, 19130, 19131, 19132, 19133, 19134, 19135, 19136, 19137, 19138, 19139, 19140, 19141, 19142, 19143, 19144, 19145, 19146, 19147, 19148, 19149, 19150, 19151, 19152, 19153, 19154, 19155, 19160, 19161, 19162, 19170, 19171, 19172, 19173, 19175, 19177, 19178, 19179, 19181, 19182, 19183, 19184, 19185, 19187, 19188, 19191, 19192, 19193, 19194, 19196, 19197, 19244, 19255, 19301, 19310, 19311, 19312, 19316, 19317, 19318, 19319, 19320, 19330, 19331, 19333, 19335, 19339, 19340, 19341, 19342, 19343, 19344, 19345, 19346, 19347, 19348, 19350, 19351, 19352, 19353, 19354, 19355, 19357, 19358, 19360, 19362, 19363, 19365, 19366, 19367, 19369, 19370, 19371, 19372, 19373, 19374, 19375, 19376, 19380, 19381, 19382, 19383, 19390, 19395, 19397, 19398, 19399, 19401, 19403, 19404, 19405, 19406, 19407, 19408, 19409, 19415, 19420, 19421, 19422, 19423, 19424, 19425, 19426, 19428, 19429, 19430, 19432, 19435, 19436, 19437, 19438, 19440, 19441, 19442, 19443, 19444, 19446, 19450, 19451, 19452, 19453, 19454, 19455, 19456, 19457, 19460, 19462, 19464, 19465, 19468, 19470, 19472, 19473, 19474, 19475, 19477, 19478, 19480, 19481, 19482, 19483, 19484, 19485, 19486, 19487, 19488, 19489, 19490, 19492, 19493, 19494, 19495, 19496, 19501, 19503, 19504, 19505, 19506, 19507, 19508, 19510, 19511, 19512, 19516, 19518, 19519, 19520, 19522, 19523, 19525, 19526, 19529, 19530, 19533, 19534, 19535, 19536, 19538, 19539, 19540, 19541, 19542, 19543, 19544, 19545, 19547, 19548, 19549, 19550, 19551, 19554, 19555, 19557, 19559, 19560, 19562, 19564, 19565, 19567, 19601, 19602, 19603, 19604, 19605, 19606, 19607, 19608, 19609, 19610, 19611, 19612, 19640, 19701, 19702, 19703, 19706, 19707, 19708, 19709, 19710, 19711, 19712, 19713, 19714, 19715, 19716, 19717, 19718, 19720, 19721, 19725, 19726, 19730, 19731, 19732, 19733, 19734, 19735, 19736, 19801, 19802, 19803, 19804, 19805, 19806, 19807, 19808, 19809, 19810, 19850, 19880, 19884, 19885, 19886, 19887, 19889, 19890, 19891, 19892, 19893, 19894, 19895, 19896, 19897, 19898, 19899, 19901, 19902, 19903, 19904, 19905, 19906, 19930, 19931, 19933, 19934, 19936, 19938, 19939, 19940, 19941, 19943, 19944, 19945, 19946, 19947, 19950, 19951, 19952, 19953, 19954, 19955, 19956, 19958, 19960, 19961, 19962, 19963, 19964, 19966, 19967, 19968, 19969, 19970, 19971, 19973, 19975, 19977, 19979, 19980, 20001, 20002, 20003, 20004, 20005, 20006, 20007, 20008, 20009, 20010, 20011, 20012, 20013, 20015, 20016, 20017, 20018, 20019, 20020, 20024, 20026, 20029, 20030, 20032, 20033, 20035, 20036, 20037, 20038, 20039, 20040, 20041, 20042, 20043, 20044, 20045, 20046, 20047, 20049, 20050, 20051, 20052, 20053, 20055, 20056, 20057, 20058, 20059, 20060, 20061, 20062, 20063, 20064, 20065, 20066, 20067, 20068, 20069, 20070, 20071, 20073, 20074, 20075, 20076, 20077, 20078, 20080, 20081, 20082, 20088, 20090, 20091, 20097, 20098, 20099, 20101, 20102, 20103, 20104, 20105, 20106, 20107, 20108, 20109, 20110, 20111, 20112, 20113, 20115, 20116, 20117, 20118, 20119, 20120, 20121, 20122, 20124, 20128, 20129, 20130, 20131, 20132, 20134, 20135, 20136, 20137, 20138, 20139, 20140, 20141, 20142, 20143, 20144, 20146, 20147, 20148, 20149, 20151, 20152, 20153, 20155, 20156, 20158, 20159, 20160, 20163, 20164, 20165, 20166, 20167, 20168, 20169, 20170, 20171, 20172, 20175, 20176, 20177, 20178, 20180, 20181, 20182, 20184, 20185, 20186, 20187, 20188, 20190, 20191, 20192, 20193, 20194, 20195, 20196, 20197, 20198, 20199, 20201, 20202, 20203, 20204, 20206, 20207, 20208, 20210, 20211, 20212, 20213, 20214, 20215, 20216, 20217, 20218, 20219, 20220, 20221, 20222, 20223, 20224, 20226, 20227, 20228, 20229, 20230, 20231, 20232, 20233, 20235, 20237, 20238, 20239, 20240, 20241, 20242, 20244, 20245, 20250, 20251, 20254, 20260, 20261, 20262, 20265, 20266, 20268, 20270, 20277, 20289, 20299, 20301, 20303, 20306, 20307, 20310, 20314, 20315, 20317, 20318, 20319, 20330, 20332, 20336, 20337, 20338, 20340, 20350, 20370, 20372, 20373, 20374, 20375, 20376, 20380, 20388, 20389, 20390, 20391, 20392, 20393, 20394, 20395, 20398, 20401, 20402, 20403, 20404, 20405, 20406, 20407, 20408, 20409, 20410, 20411, 20412, 20413, 20414, 20415, 20416, 20418, 20419, 20420, 20421, 20422, 20423, 20424, 20425, 20426, 20427, 20428, 20429, 20431, 20433, 20434, 20435, 20436, 20437, 20439, 20440, 20441, 20442, 20444, 20447, 20451, 20453, 20456, 20460, 20463, 20468, 20469, 20470, 20472, 20500, 20501, 20502, 20503, 20504, 20505, 20506, 20507, 20508, 20510, 20515, 20520, 20521, 20522, 20523, 20524, 20525, 20526, 20527, 20530, 20531, 20532, 20533, 20534, 20535, 20536, 20537, 20538, 20539, 20540, 20541, 20542, 20543, 20544, 20546, 20547, 20548, 20549, 20550, 20551, 20552, 20553, 20554, 20555, 20557, 20558, 20559, 20560, 20565, 20566, 20570, 20571, 20572, 20573, 20575, 20576, 20577, 20578, 20579, 20580, 20581, 20585, 20586, 20590, 20591, 20593, 20594, 20597, 20599, 20601, 20602, 20603, 20604, 20606, 20607, 20608, 20609, 20610, 20611, 20612, 20613, 20615, 20616, 20617, 20618, 20619, 20620, 20621, 20622, 20623, 20624, 20625, 20626, 20627, 20628, 20629, 20630, 20632, 20634, 20635, 20636, 20637, 20639, 20640, 20643, 20645, 20646, 20650, 20653, 20656, 20657, 20658, 20659, 20660, 20661, 20662, 20664, 20667, 20670, 20674, 20675, 20676, 20677, 20678, 20680, 20682, 20684, 20685, 20686, 20687, 20688, 20689, 20690, 20692, 20693, 20695, 20697, 20701, 20703, 20704, 20705, 20706, 20707, 20708, 20709, 20710, 20711, 20712, 20714, 20715, 20716, 20717, 20718, 20719, 20720, 20721, 20722, 20723, 20724, 20725, 20726, 20731, 20732, 20733, 20735, 20736, 20737, 20738, 20740, 20741, 20742, 20743, 20744, 20745, 20746, 20747, 20748, 20749, 20750, 20751, 20752, 20753, 20754, 20755, 20757, 20758, 20759, 20762, 20763, 20764, 20765, 20768, 20769, 20770, 20771, 20772, 20773, 20774, 20775, 20776, 20777, 20778, 20779, 20781, 20782, 20783, 20784, 20785, 20787, 20788, 20790, 20791, 20792, 20794, 20797, 20799, 20812, 20813, 20814, 20815, 20816, 20817, 20818, 20824, 20825, 20827, 20830, 20832, 20833, 20837, 20838, 20839, 20841, 20842, 20847, 20848, 20849, 20850, 20851, 20852, 20853, 20854, 20855, 20857, 20859, 20860, 20861, 20862, 20866, 20868, 20871, 20872, 20874, 20875, 20876, 20877, 20878, 20879, 20880, 20882, 20883, 20884, 20885, 20886, 20889, 20891, 20892, 20894, 20895, 20896, 20897, 20898, 20899, 20901, 20902, 20903, 20904, 20905, 20906, 20907, 20908, 20910, 20911, 20912, 20913, 20914, 20915, 20916, 20918, 20997, 21001, 21005, 21009, 21010, 21012, 21013, 21014, 21015, 21017, 21018, 21020, 21022, 21023, 21027, 21028, 21029, 21030, 21031, 21032, 21034, 21035, 21036, 21037, 21040, 21041, 21042, 21043, 21044, 21045, 21046, 21047, 21048, 21050, 21051, 21052, 21053, 21054, 21055, 21056, 21057, 21060, 21061, 21062, 21071, 21074, 21075, 21076, 21077, 21078, 21080, 21082, 21084, 21085, 21087, 21088, 21090, 21092, 21093, 21094, 21098, 21102, 21104, 21105, 21106, 21108, 21111, 21113, 21114, 21117, 21120, 21122, 21123, 21128, 21130, 21131, 21132, 21133, 21136, 21139, 21140, 21144, 21146, 21150, 21152, 21153, 21154, 21155, 21156, 21157, 21158, 21160, 21161, 21162, 21163, 21201, 21202, 21203, 21204, 21205, 21206, 21207, 21208, 21209, 21210, 21211, 21212, 21213, 21214, 21215, 21216, 21217, 21218, 21219, 21220, 21221, 21222, 21223, 21224, 21225, 21226, 21227, 21228, 21229, 21230, 21231, 21233, 21234, 21235, 21236, 21237, 21239, 21240, 21241, 21244, 21250, 21251, 21252, 21263, 21264, 21265, 21268, 21270, 21273, 21274, 21275, 21278, 21279, 21280, 21281, 21282, 21283, 21284, 21285, 21286, 21287, 21288, 21289, 21290, 21297, 21298, 21401, 21402, 21403, 21404, 21405, 21411, 21412, 21501, 21502, 21503, 21504, 21505, 21520, 21521, 21522, 21523, 21524, 21528, 21529, 21530, 21531, 21532, 21536, 21538, 21539, 21540, 21541, 21542, 21543, 21545, 21550, 21555, 21556, 21557, 21560, 21561, 21562, 21601, 21606, 21607, 21609, 21610, 21612, 21613, 21617, 21619, 21620, 21622, 21623, 21624, 21625, 21626, 21627, 21628, 21629, 21631, 21632, 21634, 21635, 21636, 21638, 21639, 21640, 21641, 21643, 21644, 21645, 21647, 21648, 21649, 21650, 21651, 21652, 21653, 21654, 21655, 21656, 21657, 21658, 21659, 21660, 21661, 21662, 21663, 21664, 21665, 21666, 21667, 21668, 21669, 21670, 21671, 21672, 21673, 21675, 21676, 21677, 21678, 21679, 21681, 21682, 21683, 21684, 21685, 21686, 21687, 21688, 21690, 21701, 21702, 21703, 21704, 21705, 21709, 21710, 21711, 21713, 21714, 21715, 21716, 21717, 21718, 21719, 21720, 21721, 21722, 21723, 21727, 21733, 21734, 21736, 21737, 21738, 21740, 21741, 21742, 21746, 21747, 21748, 21749, 21750, 21754, 21755, 21756, 21757, 21758, 21759, 21762, 21764, 21765, 21766, 21767, 21769, 21770, 21771, 21773, 21774, 21775, 21776, 21777, 21778, 21779, 21780, 21781, 21782, 21783, 21784, 21787, 21788, 21790, 21791, 21792, 21793, 21794, 21795, 21797, 21798, 21801, 21802, 21803, 21804, 21810, 21811, 21813, 21814, 21817, 21821, 21822, 21824, 21826, 21829, 21830, 21835, 21836, 21837, 21838, 21840, 21841, 21842, 21843, 21849, 21850, 21851, 21852, 21853, 21856, 21857, 21861, 21862, 21863, 21864, 21865, 21866, 21867, 21869, 21870, 21871, 21872, 21874, 21875, 21890, 21901, 21902, 21903, 21904, 21911, 21912, 21913, 21914, 21915, 21916, 21917, 21918, 21919, 21920, 21921, 21922, 21930, 22002, 22003, 22009, 22015, 22026, 22027, 22030, 22031, 22032, 22033, 22034, 22035, 22036, 22037, 22038, 22039, 22040, 22041, 22042, 22043, 22044, 22046, 22047, 22060, 22066, 22067, 22079, 22081, 22082, 22092, 22093, 22095, 22096, 22101, 22102, 22103, 22106, 22107, 22108, 22109, 22116, 22118, 22119, 22120, 22121, 22122, 22124, 22125, 22134, 22135, 22150, 22151, 22152, 22153, 22156, 22158, 22159, 22160, 22161, 22172, 22180, 22181, 22182, 22183, 22184, 22185, 22191, 22192, 22193, 22194, 22195, 22199, 22201, 22202, 22203, 22204, 22205, 22206, 22207, 22209, 22210, 22211, 22212, 22213, 22214, 22215, 22216, 22217, 22218, 22219, 22222, 22223, 22225, 22226, 22227, 22229, 22230, 22234, 22240, 22241, 22242, 22243, 22244, 22245, 22246, 22301, 22302, 22303, 22304, 22305, 22306, 22307, 22308, 22309, 22310, 22311, 22312, 22313, 22314, 22315, 22320, 22321, 22331, 22332, 22333, 22334, 22336, 22401, 22402, 22403, 22404, 22405, 22406, 22407, 22408, 22412, 22427, 22428, 22430, 22432, 22433, 22435, 22436, 22437, 22438, 22442, 22443, 22446, 22448, 22451, 22454, 22456, 22460, 22463, 22469, 22471, 22472, 22473, 22476, 22480, 22481, 22482, 22485, 22488, 22501, 22503, 22504, 22507, 22508, 22509, 22511, 22513, 22514, 22517, 22520, 22523, 22524, 22526, 22528, 22529, 22530, 22534, 22535, 22538, 22539, 22542, 22544, 22545, 22546, 22547, 22548, 22552, 22553, 22554, 22555, 22558, 22560, 22565, 22567, 22570, 22572, 22576, 22577, 22578, 22579, 22580, 22581, 22601, 22602, 22603, 22604, 22610, 22611, 22620, 22622, 22623, 22624, 22625, 22626, 22627, 22630, 22637, 22638, 22639, 22640, 22641, 22642, 22643, 22644, 22645, 22646, 22649, 22650, 22652, 22654, 22655, 22656, 22657, 22660, 22663, 22664, 22701, 22709, 22711, 22712, 22713, 22714, 22715, 22716, 22718, 22719, 22720, 22721, 22722, 22723, 22724, 22725, 22726, 22727, 22728, 22729, 22730, 22731, 22732, 22733, 22734, 22735, 22736, 22737, 22738, 22739, 22740, 22741, 22742, 22743, 22746, 22747, 22748, 22749, 22801, 22802, 22803, 22807, 22810, 22811, 22812, 22815, 22820, 22821, 22824, 22827, 22830, 22831, 22832, 22833, 22834, 22835, 22840, 22841, 22842, 22843, 22844, 22845, 22846, 22847, 22848, 22849, 22850, 22851, 22853, 22901, 22902, 22903, 22904, 22905, 22906, 22907, 22908, 22909, 22910, 22911, 22920, 22922, 22923, 22924, 22931, 22932, 22935, 22936, 22937, 22938, 22939, 22940, 22942, 22943, 22945, 22946, 22947, 22948, 22949, 22952, 22953, 22954, 22957, 22958, 22959, 22960, 22963, 22964, 22965, 22967, 22968, 22969, 22971, 22972, 22973, 22974, 22976, 22980, 22987, 22989, 23001, 23002, 23003, 23004, 23005, 23009, 23011, 23014, 23015, 23017, 23018, 23021, 23022, 23023, 23024, 23025, 23027, 23030, 23031, 23032, 23035, 23038, 23039, 23040, 23043, 23045, 23047, 23050, 23054, 23055, 23056, 23058, 23059, 23060, 23061, 23062, 23063, 23064, 23065, 23066, 23067, 23068, 23069, 23070, 23071, 23072, 23075, 23076, 23079, 23081, 23083, 23084, 23085, 23086, 23089, 23090, 23091, 23092, 23093, 23101, 23102, 23103, 23105, 23106, 23107, 23108, 23109, 23110, 23111, 23112, 23113, 23114, 23115, 23116, 23117, 23119, 23120, 23123, 23124, 23125, 23126, 23127, 23128, 23129, 23130, 23131, 23138, 23139, 23140, 23141, 23146, 23147, 23148, 23149, 23150, 23153, 23154, 23155, 23156, 23160, 23161, 23162, 23163, 23168, 23169, 23170, 23173, 23175, 23176, 23177, 23178, 23180, 23181, 23183, 23184, 23185, 23186, 23187, 23188, 23190, 23191, 23192, 23218, 23219, 23220, 23221, 23222, 23223, 23224, 23225, 23226, 23227, 23228, 23229, 23230, 23231, 23232, 23233, 23234, 23235, 23236, 23237, 23238, 23240, 23241, 23242, 23249, 23250, 23255, 23260, 23261, 23266, 23269, 23270, 23272, 23273, 23274, 23275, 23276, 23278, 23279, 23280, 23282, 23284, 23285, 23286, 23288, 23289, 23290, 23291, 23292, 23293, 23294, 23295, 23297, 23298, 23301, 23302, 23303, 23304, 23306, 23307, 23308, 23310, 23313, 23314, 23315, 23316, 23320, 23321, 23322, 23323, 23324, 23325, 23326, 23327, 23328, 23336, 23337, 23341, 23345, 23347, 23350, 23354, 23356, 23357, 23358, 23359, 23389, 23395, 23396, 23397, 23398, 23399, 23401, 23404, 23405, 23407, 23408, 23409, 23410, 23412, 23413, 23414, 23415, 23416, 23417, 23418, 23419, 23420, 23421, 23422, 23423, 23424, 23426, 23427, 23429, 23430, 23431, 23432, 23433, 23434, 23435, 23436, 23437, 23438, 23439, 23440, 23441, 23442, 23443, 23450, 23451, 23452, 23454, 23455, 23456, 23457, 23458, 23459, 23460, 23461, 23462, 23463, 23464, 23465, 23466, 23467, 23468, 23471, 23479, 23480, 23482, 23483, 23486, 23487, 23488, 23501, 23502, 23503, 23504, 23505, 23506, 23507, 23508, 23509, 23510, 23511, 23512, 23513, 23514, 23515, 23517, 23518, 23519, 23520, 23521, 23523, 23529, 23530, 23541, 23551, 23601, 23602, 23603, 23604, 23605, 23606, 23607, 23608, 23609, 23612, 23628, 23630, 23631, 23651, 23653, 23661, 23662, 23663, 23664, 23665, 23666, 23667, 23668, 23669, 23670, 23681, 23690, 23691, 23692, 23693, 23694, 23696, 23701, 23702, 23703, 23704, 23705, 23707, 23708, 23709, 23801, 23803, 23804, 23805, 23806, 23821, 23822, 23824, 23827, 23828, 23829, 23830, 23831, 23832, 23833, 23834, 23836, 23837, 23838, 23839, 23840, 23841, 23842, 23843, 23844, 23845, 23846, 23847, 23850, 23851, 23856, 23857, 23860, 23866, 23867, 23868, 23870, 23872, 23873, 23874, 23875, 23876, 23878, 23879, 23881, 23882, 23883, 23884, 23885, 23887, 23888, 23889, 23890, 23891, 23893, 23894, 23897, 23898, 23899, 23901, 23909, 23915, 23917, 23919, 23920, 23921, 23922, 23923, 23924, 23927, 23930, 23934, 23936, 23937, 23938, 23939, 23941, 23942, 23943, 23944, 23947, 23950, 23952, 23954, 23955, 23958, 23959, 23960, 23962, 23963, 23964, 23966, 23967, 23968, 23970, 23974, 23976, 24001, 24002, 24003, 24004, 24005, 24006, 24007, 24008, 24009, 24010, 24011, 24012, 24013, 24014, 24015, 24016, 24017, 24018, 24019, 24020, 24022, 24023, 24024, 24025, 24026, 24027, 24028, 24029, 24030, 24031, 24032, 24033, 24034, 24035, 24036, 24037, 24038, 24040, 24042, 24043, 24044, 24045, 24048, 24050, 24053, 24054, 24055, 24058, 24059, 24060, 24061, 24062, 24063, 24064, 24065, 24066, 24067, 24068, 24069, 24070, 24072, 24073, 24076, 24077, 24078, 24079, 24082, 24083, 24084, 24085, 24086, 24087, 24088, 24089, 24090, 24091, 24092, 24093, 24094, 24095, 24101, 24102, 24104, 24105, 24111, 24112, 24113, 24114, 24115, 24120, 24121, 24122, 24124, 24126, 24127, 24128, 24129, 24130, 24131, 24132, 24133, 24134, 24136, 24137, 24138, 24139, 24141, 24142, 24143, 24146, 24147, 24148, 24149, 24150, 24151, 24153, 24155, 24156, 24157, 24161, 24162, 24165, 24167, 24168, 24171, 24174, 24175, 24176, 24177, 24178, 24179, 24184, 24185, 24201, 24202, 24203, 24209, 24210, 24211, 24212, 24215, 24216, 24217, 24218, 24219, 24220, 24221, 24224, 24225, 24226, 24228, 24230, 24236, 24237, 24239, 24243, 24244, 24245, 24246, 24248, 24250, 24251, 24256, 24258, 24260, 24263, 24265, 24266, 24269, 24270, 24271, 24272, 24273, 24277, 24279, 24280, 24281, 24282, 24283, 24285, 24289, 24290, 24292, 24293, 24301, 24311, 24312, 24313, 24314, 24315, 24316, 24317, 24318, 24319, 24322, 24323, 24324, 24325, 24326, 24327, 24328, 24330, 24333, 24340, 24343, 24347, 24348, 24350, 24351, 24352, 24354, 24360, 24361, 24363, 24366, 24368, 24370, 24373, 24374, 24375, 24377, 24378, 24379, 24380, 24381, 24382, 24401, 24402, 24407, 24411, 24412, 24413, 24415, 24416, 24421, 24422, 24426, 24430, 24431, 24432, 24433, 24435, 24437, 24438, 24439, 24440, 24441, 24442, 24445, 24448, 24450, 24457, 24458, 24459, 24460, 24463, 24464, 24465, 24467, 24468, 24469, 24471, 24472, 24473, 24474, 24476, 24477, 24479, 24482, 24483, 24484, 24485, 24486, 24487, 24501, 24502, 24503, 24504, 24505, 24506, 24512, 24513, 24514, 24515, 24517, 24520, 24521, 24522, 24523, 24526, 24527, 24528, 24529, 24530, 24531, 24533, 24534, 24535, 24536, 24538, 24539, 24540, 24541, 24543, 24544, 24549, 24550, 24551, 24553, 24554, 24555, 24556, 24557, 24558, 24562, 24563, 24565, 24566, 24569, 24570, 24571, 24572, 24574, 24576, 24577, 24578, 24579, 24580, 24581, 24585, 24586, 24588, 24589, 24590, 24592, 24593, 24594, 24595, 24597, 24598, 24599, 24601, 24602, 24603, 24604, 24605, 24606, 24607, 24608, 24609, 24612, 24613, 24614, 24618, 24619, 24620, 24622, 24624, 24627, 24628, 24630, 24631, 24634, 24635, 24637, 24639, 24640, 24641, 24646, 24647, 24649, 24651, 24656, 24657, 24658, 24701, 24712, 24714, 24715, 24716, 24719, 24724, 24726, 24729, 24731, 24732, 24733, 24736, 24737, 24738, 24739, 24740, 24747, 24751, 24801, 24808, 24811, 24813, 24815, 24816, 24817, 24818, 24820, 24821, 24822, 24823, 24824, 24825, 24826, 24827, 24828, 24829, 24830, 24831, 24832, 24834, 24836, 24839, 24841, 24842, 24843, 24844, 24845, 24846, 24847, 24848, 24849, 24850, 24851, 24852, 24853, 24854, 24855, 24856, 24857, 24859, 24860, 24861, 24862, 24866, 24867, 24868, 24869, 24870, 24871, 24872, 24873, 24874, 24877, 24878, 24879, 24880, 24881, 24882, 24883, 24884, 24887, 24888, 24889, 24892, 24894, 24895, 24896, 24897, 24898, 24899, 24901, 24902, 24910, 24915, 24916, 24917, 24918, 24919, 24920, 24924, 24925, 24927, 24931, 24934, 24935, 24936, 24938, 24941, 24942, 24943, 24944, 24945, 24946, 24950, 24951, 24954, 24957, 24958, 24961, 24962, 24963, 24966, 24970, 24974, 24976, 24977, 24981, 24983, 24984, 24985, 24986, 24991, 24993, 25002, 25003, 25004, 25005, 25007, 25008, 25009, 25010, 25011, 25015, 25018, 25019, 25021, 25022, 25024, 25025, 25026, 25028, 25030, 25031, 25033, 25035, 25036, 25039, 25040, 25043, 25044, 25045, 25046, 25047, 25048, 25049, 25051, 25053, 25054, 25057, 25059, 25060, 25061, 25062, 25063, 25064, 25067, 25070, 25071, 25075, 25076, 25079, 25081, 25082, 25083, 25085, 25086, 25088, 25090, 25093, 25095, 25102, 25103, 25106, 25107, 25108, 25109, 25110, 25111, 25112, 25113, 25114, 25115, 25118, 25119, 25121, 25122, 25123, 25124, 25125, 25126, 25130, 25132, 25133, 25134, 25136, 25139, 25140, 25141, 25142, 25143, 25147, 25148, 25149, 25150, 25152, 25154, 25156, 25159, 25160, 25161, 25162, 25164, 25165, 25168, 25169, 25173, 25174, 25177, 25180, 25181, 25182, 25183, 25185, 25186, 25187, 25193, 25201, 25202, 25203, 25204, 25205, 25206, 25208, 25209, 25211, 25213, 25214, 25231, 25234, 25235, 25239, 25241, 25243, 25244, 25245, 25247, 25248, 25250, 25251, 25252, 25253, 25256, 25258, 25259, 25260, 25261, 25262, 25264, 25265, 25266, 25267, 25268, 25270, 25271, 25275, 25276, 25279, 25281, 25283, 25285, 25286, 25287, 25301, 25302, 25303, 25304, 25305, 25306, 25309, 25311, 25312, 25313, 25314, 25315, 25317, 25320, 25321, 25322, 25323, 25324, 25325, 25326, 25327, 25328, 25329, 25330, 25331, 25332, 25333, 25334, 25335, 25336, 25337, 25338, 25339, 25350, 25356, 25357, 25358, 25360, 25361, 25362, 25364, 25365, 25375, 25387, 25389, 25392, 25396, 25401, 25402, 25410, 25411, 25413, 25414, 25419, 25420, 25421, 25422, 25423, 25425, 25427, 25428, 25429, 25430, 25431, 25432, 25434, 25437, 25438, 25440, 25441, 25442, 25443, 25444, 25446, 25501, 25502, 25503, 25504, 25505, 25506, 25507, 25508, 25510, 25511, 25512, 25514, 25515, 25517, 25519, 25520, 25521, 25523, 25524, 25526, 25529, 25530, 25534, 25535, 25537, 25540, 25541, 25544, 25545, 25547, 25550, 25555, 25557, 25559, 25560, 25562, 25564, 25565, 25567, 25569, 25570, 25571, 25572, 25573, 25601, 25606, 25607, 25608, 25611, 25612, 25614, 25617, 25621, 25623, 25624, 25625, 25628, 25630, 25632, 25634, 25635, 25636, 25637, 25638, 25639, 25644, 25645, 25646, 25647, 25649, 25650, 25651, 25652, 25653, 25654, 25661, 25665, 25666, 25667, 25669, 25670, 25671, 25672, 25674, 25676, 25678, 25682, 25685, 25686, 25687, 25688, 25690, 25691, 25692, 25694, 25696, 25697, 25699, 25701, 25702, 25703, 25704, 25705, 25706, 25707, 25708, 25709, 25710, 25711, 25712, 25713, 25714, 25715, 25716, 25717, 25718, 25719, 25720, 25721, 25722, 25723, 25724, 25725, 25726, 25727, 25728, 25729, 25755, 25770, 25771, 25772, 25773, 25774, 25775, 25776, 25777, 25778, 25779, 25801, 25802, 25810, 25811, 25812, 25813, 25816, 25817, 25818, 25820, 25823, 25825, 25826, 25827, 25831, 25832, 25833, 25836, 25837, 25839, 25840, 25841, 25843, 25844, 25845, 25846, 25847, 25848, 25849, 25851, 25853, 25854, 25855, 25856, 25857, 25859, 25860, 25862, 25864, 25865, 25866, 25868, 25870, 25871, 25873, 25875, 25876, 25878, 25879, 25880, 25882, 25901, 25902, 25904, 25906, 25907, 25908, 25909, 25911, 25912, 25913, 25914, 25915, 25916, 25917, 25918, 25919, 25920, 25921, 25922, 25926, 25927, 25928, 25931, 25932, 25934, 25936, 25938, 25942, 25943, 25951, 25958, 25961, 25962, 25965, 25966, 25967, 25969, 25971, 25972, 25976, 25977, 25978, 25979, 25981, 25984, 25985, 25986, 25988, 25989, 26003, 26030, 26031, 26032, 26033, 26034, 26035, 26036, 26037, 26038, 26039, 26040, 26041, 26047, 26050, 26055, 26056, 26058, 26059, 26060, 26062, 26070, 26074, 26075, 26101, 26102, 26103, 26104, 26105, 26106, 26120, 26121, 26133, 26134, 26135, 26136, 26137, 26138, 26141, 26142, 26143, 26146, 26147, 26148, 26149, 26150, 26151, 26152, 26155, 26159, 26160, 26161, 26162, 26164, 26167, 26169, 26170, 26173, 26175, 26178, 26180, 26181, 26184, 26186, 26187, 26201, 26202, 26203, 26205, 26206, 26208, 26209, 26210, 26215, 26217, 26218, 26219, 26222, 26224, 26228, 26229, 26230, 26234, 26236, 26237, 26238, 26241, 26250, 26253, 26254, 26257, 26259, 26260, 26261, 26263, 26264, 26266, 26267, 26268, 26269, 26270, 26271, 26273, 26275, 26276, 26278, 26280, 26282, 26283, 26285, 26287, 26288, 26289, 26291, 26292, 26293, 26294, 26296, 26298, 26301, 26302, 26306, 26320, 26321, 26323, 26325, 26327, 26328, 26330, 26332, 26334, 26335, 26337, 26338, 26339, 26342, 26343, 26346, 26347, 26348, 26349, 26350, 26351, 26354, 26361, 26362, 26366, 26369, 26372, 26374, 26375, 26376, 26377, 26378, 26384, 26385, 26386, 26404, 26405, 26407, 26408, 26410, 26411, 26412, 26415, 26416, 26419, 26421, 26422, 26424, 26425, 26426, 26430, 26431, 26434, 26435, 26436, 26437, 26438, 26440, 26443, 26444, 26447, 26448, 26451, 26452, 26456, 26461, 26463, 26501, 26502, 26503, 26504, 26505, 26506, 26507, 26508, 26519, 26520, 26521, 26522, 26524, 26525, 26527, 26529, 26531, 26533, 26534, 26535, 26537, 26541, 26542, 26543, 26544, 26546, 26547, 26554, 26555, 26559, 26560, 26561, 26562, 26563, 26566, 26568, 26570, 26571, 26572, 26574, 26575, 26576, 26578, 26581, 26582, 26585, 26586, 26587, 26588, 26589, 26590, 26591, 26601, 26610, 26611, 26612, 26615, 26617, 26618, 26619, 26621, 26623, 26624, 26627, 26629, 26631, 26634, 26636, 26638, 26639, 26641, 26651, 26656, 26660, 26662, 26667, 26671, 26674, 26675, 26676, 26678, 26679, 26680, 26681, 26684, 26690, 26691, 26704, 26705, 26707, 26710, 26711, 26714, 26716, 26717, 26719, 26720, 26722, 26726, 26731, 26734, 26739, 26743, 26750, 26753, 26755, 26757, 26761, 26763, 26764, 26767, 26801, 26802, 26804, 26807, 26808, 26810, 26812, 26814, 26815, 26817, 26818, 26823, 26824, 26833, 26836, 26838, 26845, 26847, 26851, 26852, 26855, 26865, 26866, 26884, 26886, 27006, 27007, 27009, 27010, 27011, 27012, 27013, 27014, 27016, 27017, 27018, 27019, 27020, 27021, 27022, 27023, 27024, 27025, 27027, 27028, 27030, 27031, 27040, 27041, 27042, 27043, 27045, 27046, 27047, 27048, 27049, 27050, 27051, 27052, 27053, 27054, 27055, 27094, 27098, 27099, 27101, 27102, 27103, 27104, 27105, 27106, 27107, 27108, 27109, 27110, 27111, 27113, 27114, 27115, 27116, 27117, 27120, 27127, 27130, 27150, 27151, 27152, 27155, 27156, 27157, 27198, 27199, 27201, 27202, 27203, 27204, 27205, 27207, 27208, 27209, 27212, 27213, 27214, 27215, 27216, 27217, 27220, 27228, 27229, 27230, 27231, 27233, 27235, 27237, 27239, 27242, 27243, 27244, 27247, 27248, 27249, 27252, 27253, 27256, 27258, 27259, 27260, 27261, 27262, 27263, 27264, 27265, 27278, 27281, 27282, 27283, 27284, 27285, 27288, 27289, 27291, 27292, 27293, 27294, 27295, 27298, 27299, 27301, 27302, 27305, 27306, 27310, 27311, 27312, 27313, 27314, 27315, 27316, 27317, 27320, 27321, 27322, 27323, 27325, 27326, 27330, 27331, 27332, 27340, 27341, 27342, 27343, 27344, 27349, 27350, 27351, 27355, 27356, 27357, 27358, 27359, 27360, 27361, 27370, 27371, 27373, 27374, 27375, 27376, 27377, 27379, 27401, 27402, 27403, 27404, 27405, 27406, 27407, 27408, 27409, 27410, 27411, 27412, 27413, 27415, 27416, 27417, 27419, 27420, 27425, 27427, 27429, 27435, 27438, 27455, 27480, 27495, 27498, 27499, 27501, 27502, 27503, 27504, 27505, 27506, 27507, 27508, 27509, 27510, 27511, 27512, 27513, 27514, 27515, 27516, 27517, 27518, 27519, 27520, 27521, 27522, 27524, 27525, 27526, 27529, 27530, 27531, 27532, 27533, 27534, 27536, 27537, 27540, 27541, 27542, 27543, 27544, 27545, 27546, 27549, 27551, 27552, 27553, 27555, 27556, 27557, 27559, 27560, 27562, 27563, 27564, 27565, 27568, 27569, 27570, 27571, 27572, 27573, 27576, 27577, 27581, 27582, 27583, 27584, 27586, 27587, 27588, 27589, 27591, 27592, 27593, 27594, 27596, 27597, 27599, 27601, 27602, 27603, 27604, 27605, 27606, 27607, 27608, 27609, 27610, 27611, 27612, 27613, 27614, 27615, 27616, 27617, 27619, 27620, 27621, 27622, 27623, 27624, 27625, 27626, 27627, 27628, 27629, 27634, 27635, 27636, 27640, 27650, 27656, 27658, 27661, 27668, 27675, 27676, 27690, 27695, 27697, 27698, 27699, 27701, 27702, 27703, 27704, 27705, 27706, 27707, 27708, 27709, 27710, 27711, 27712, 27713, 27715, 27717, 27722, 27801, 27802, 27803, 27804, 27805, 27806, 27807, 27808, 27809, 27810, 27811, 27812, 27813, 27814, 27816, 27817, 27818, 27819, 27820, 27821, 27822, 27823, 27824, 27825, 27826, 27827, 27828, 27829, 27830, 27831, 27832, 27833, 27834, 27835, 27836, 27837, 27838, 27839, 27840, 27841, 27842, 27843, 27844, 27845, 27846, 27847, 27849, 27850, 27851, 27852, 27853, 27854, 27855, 27856, 27857, 27858, 27860, 27861, 27862, 27863, 27864, 27865, 27866, 27867, 27868, 27869, 27870, 27871, 27872, 27873, 27874, 27875, 27876, 27877, 27878, 27879, 27880, 27881, 27882, 27883, 27884, 27885, 27886, 27887, 27888, 27889, 27890, 27891, 27892, 27893, 27894, 27895, 27896, 27897, 27906, 27907, 27909, 27910, 27915, 27916, 27917, 27919, 27920, 27921, 27922, 27923, 27924, 27925, 27926, 27927, 27928, 27929, 27930, 27932, 27935, 27936, 27937, 27938, 27939, 27941, 27942, 27943, 27944, 27946, 27947, 27948, 27949, 27950, 27953, 27954, 27956, 27957, 27958, 27959, 27960, 27962, 27964, 27965, 27966, 27967, 27968, 27969, 27970, 27972, 27973, 27974, 27976, 27978, 27979, 27980, 27981, 27982, 27983, 27985, 27986, 28001, 28002, 28006, 28007, 28009, 28010, 28012, 28016, 28017, 28018, 28019, 28020, 28021, 28023, 28024, 28025, 28026, 28027, 28031, 28032, 28033, 28034, 28036, 28037, 28038, 28039, 28040, 28041, 28042, 28043, 28052, 28053, 28054, 28055, 28056, 28070, 28071, 28072, 28073, 28074, 28075, 28076, 28077, 28078, 28079, 28080, 28081, 28082, 28083, 28086, 28088, 28089, 28090, 28091, 28092, 28093, 28097, 28098, 28101, 28102, 28103, 28104, 28105, 28106, 28107, 28108, 28109, 28110, 28111, 28112, 28114, 28115, 28117, 28119, 28120, 28123, 28124, 28125, 28126, 28127, 28128, 28129, 28130, 28133, 28134, 28135, 28136, 28137, 28138, 28139, 28144, 28145, 28146, 28147, 28150, 28151, 28152, 28159, 28160, 28163, 28164, 28166, 28167, 28168, 28169, 28170, 28173, 28174, 28201, 28202, 28203, 28204, 28205, 28206, 28207, 28208, 28209, 28210, 28211, 28212, 28213, 28214, 28215, 28216, 28217, 28218, 28219, 28220, 28221, 28222, 28223, 28224, 28225, 28226, 28227, 28228, 28229, 28230, 28231, 28232, 28233, 28234, 28235, 28236, 28237, 28240, 28241, 28242, 28243, 28244, 28246, 28247, 28250, 28253, 28254, 28255, 28256, 28258, 28260, 28261, 28262, 28265, 28266, 28269, 28270, 28271, 28272, 28273, 28274, 28275, 28277, 28278, 28280, 28281, 28282, 28283, 28284, 28285, 28286, 28287, 28288, 28289, 28290, 28296, 28297, 28299, 28301, 28302, 28303, 28304, 28305, 28306, 28307, 28308, 28309, 28310, 28311, 28314, 28315, 28318, 28319, 28320, 28323, 28325, 28326, 28327, 28328, 28329, 28330, 28331, 28332, 28333, 28334, 28335, 28337, 28338, 28339, 28340, 28341, 28342, 28343, 28344, 28345, 28347, 28348, 28349, 28350, 28351, 28352, 28353, 28355, 28356, 28357, 28358, 28359, 28360, 28361, 28362, 28363, 28364, 28365, 28366, 28367, 28368, 28369, 28370, 28371, 28372, 28373, 28374, 28375, 28376, 28377, 28378, 28379, 28380, 28382, 28383, 28384, 28385, 28386, 28387, 28388, 28390, 28391, 28392, 28393, 28394, 28395, 28396, 28398, 28399, 28401, 28402, 28403, 28404, 28405, 28406, 28407, 28408, 28409, 28410, 28411, 28412, 28420, 28421, 28422, 28423, 28424, 28425, 28428, 28429, 28430, 28431, 28432, 28433, 28434, 28435, 28436, 28438, 28439, 28441, 28442, 28443, 28444, 28445, 28446, 28447, 28448, 28449, 28450, 28451, 28452, 28453, 28454, 28455, 28456, 28457, 28458, 28459, 28460, 28461, 28462, 28463, 28464, 28465, 28466, 28467, 28468, 28469, 28470, 28471, 28472, 28478, 28479, 28480, 28501, 28502, 28503, 28504, 28508, 28509, 28510, 28511, 28512, 28513, 28515, 28516, 28518, 28519, 28520, 28521, 28522, 28523, 28524, 28525, 28526, 28527, 28528, 28529, 28530, 28531, 28532, 28533, 28537, 28538, 28539, 28540, 28541, 28542, 28543, 28544, 28545, 28546, 28547, 28551, 28552, 28553, 28554, 28555, 28556, 28557, 28560, 28561, 28562, 28563, 28564, 28570, 28571, 28572, 28573, 28574, 28575, 28577, 28578, 28579, 28580, 28581, 28582, 28583, 28584, 28585, 28586, 28587, 28589, 28590, 28594, 28601, 28602, 28603, 28604, 28605, 28606, 28607, 28608, 28609, 28610, 28611, 28612, 28613, 28615, 28616, 28617, 28618, 28619, 28621, 28622, 28623, 28624, 28625, 28626, 28627, 28628, 28629, 28630, 28631, 28633, 28634, 28635, 28636, 28637, 28638, 28640, 28641, 28642, 28643, 28644, 28645, 28646, 28647, 28649, 28650, 28651, 28652, 28653, 28654, 28655, 28656, 28657, 28658, 28659, 28660, 28661, 28662, 28663, 28664, 28665, 28666, 28667, 28668, 28669, 28670, 28671, 28672, 28673, 28674, 28675, 28676, 28677, 28678, 28679, 28680, 28681, 28682, 28683, 28684, 28685, 28687, 28688, 28689, 28690, 28691, 28692, 28693, 28694, 28697, 28698, 28699, 28701, 28702, 28704, 28705, 28707, 28708, 28709, 28710, 28711, 28712, 28713, 28714, 28715, 28716, 28717, 28718, 28719, 28720, 28721, 28722, 28723, 28724, 28725, 28726, 28727, 28728, 28729, 28730, 28731, 28732, 28733, 28734, 28735, 28736, 28737, 28738, 28739, 28740, 28741, 28742, 28743, 28744, 28745, 28746, 28747, 28748, 28749, 28750, 28751, 28752, 28753, 28754, 28755, 28756, 28757, 28758, 28760, 28761, 28762, 28763, 28765, 28766, 28768, 28770, 28771, 28772, 28773, 28774, 28775, 28776, 28777, 28778, 28779, 28781, 28782, 28783, 28784, 28785, 28786, 28787, 28788, 28789, 28790, 28791, 28792, 28793, 28801, 28802, 28803, 28804, 28805, 28806, 28810, 28813, 28814, 28815, 28816, 28901, 28902, 28903, 28904, 28905, 28906, 28909, 29001, 29002, 29003, 29006, 29009, 29010, 29014, 29015, 29016, 29018, 29020, 29030, 29031, 29032, 29033, 29036, 29037, 29038, 29039, 29040, 29041, 29042, 29044, 29045, 29046, 29047, 29048, 29051, 29052, 29053, 29054, 29055, 29056, 29058, 29059, 29061, 29062, 29063, 29065, 29067, 29069, 29070, 29071, 29072, 29073, 29074, 29075, 29078, 29079, 29080, 29081, 29082, 29101, 29102, 29104, 29105, 29106, 29107, 29108, 29111, 29112, 29113, 29114, 29115, 29116, 29117, 29118, 29122, 29123, 29125, 29126, 29127, 29128, 29129, 29130, 29132, 29133, 29135, 29137, 29138, 29142, 29143, 29145, 29146, 29147, 29148, 29150, 29151, 29152, 29153, 29154, 29160, 29161, 29162, 29163, 29164, 29166, 29168, 29169, 29170, 29171, 29172, 29175, 29176, 29177, 29178, 29180, 29201, 29202, 29203, 29204, 29205, 29206, 29207, 29208, 29209, 29210, 29211, 29212, 29214, 29215, 29216, 29217, 29218, 29219, 29220, 29221, 29222, 29223, 29224, 29225, 29226, 29227, 29228, 29229, 29230, 29240, 29250, 29260, 29290, 29292, 29301, 29302, 29303, 29304, 29305, 29306, 29307, 29316, 29318, 29319, 29320, 29321, 29322, 29323, 29324, 29325, 29329, 29330, 29331, 29332, 29333, 29334, 29335, 29336, 29338, 29340, 29341, 29342, 29346, 29348, 29349, 29351, 29353, 29355, 29356, 29360, 29364, 29365, 29368, 29369, 29370, 29372, 29373, 29374, 29375, 29376, 29377, 29378, 29379, 29384, 29385, 29386, 29388, 29390, 29391, 29395, 29401, 29402, 29403, 29404, 29405, 29406, 29407, 29409, 29410, 29412, 29413, 29414, 29415, 29416, 29417, 29418, 29419, 29420, 29422, 29423, 29424, 29425, 29426, 29429, 29430, 29431, 29432, 29433, 29434, 29435, 29436, 29437, 29438, 29439, 29440, 29442, 29445, 29446, 29447, 29448, 29449, 29450, 29451, 29452, 29453, 29455, 29456, 29457, 29458, 29461, 29464, 29465, 29466, 29468, 29469, 29470, 29471, 29472, 29474, 29475, 29476, 29477, 29479, 29481, 29482, 29483, 29484, 29485, 29487, 29488, 29492, 29493, 29501, 29502, 29503, 29504, 29505, 29506, 29510, 29511, 29512, 29516, 29518, 29519, 29520, 29525, 29526, 29527, 29528, 29530, 29532, 29536, 29540, 29541, 29542, 29543, 29544, 29545, 29546, 29547, 29550, 29551, 29554, 29555, 29556, 29560, 29563, 29564, 29565, 29566, 29567, 29568, 29569, 29570, 29571, 29572, 29573, 29574, 29575, 29576, 29577, 29578, 29579, 29580, 29581, 29582, 29583, 29584, 29585, 29587, 29588, 29589, 29590, 29591, 29592, 29593, 29594, 29596, 29597, 29598, 29601, 29602, 29603, 29604, 29605, 29606, 29607, 29608, 29609, 29610, 29611, 29612, 29613, 29614, 29615, 29616, 29617, 29620, 29621, 29622, 29623, 29624, 29625, 29626, 29627, 29628, 29630, 29631, 29632, 29633, 29634, 29635, 29636, 29638, 29639, 29640, 29641, 29642, 29643, 29644, 29645, 29646, 29647, 29648, 29649, 29650, 29651, 29652, 29653, 29654, 29655, 29656, 29657, 29658, 29659, 29661, 29662, 29664, 29665, 29666, 29667, 29669, 29670, 29671, 29672, 29673, 29675, 29676, 29677, 29678, 29679, 29680, 29681, 29682, 29683, 29684, 29685, 29686, 29687, 29688, 29689, 29690, 29691, 29692, 29693, 29695, 29696, 29697, 29698, 29702, 29703, 29704, 29706, 29708, 29709, 29710, 29712, 29714, 29715, 29716, 29717, 29718, 29720, 29721, 29722, 29724, 29726, 29727, 29728, 29729, 29730, 29731, 29732, 29733, 29734, 29741, 29742, 29743, 29744, 29745, 29801, 29802, 29803, 29804, 29805, 29808, 29809, 29810, 29812, 29813, 29816, 29817, 29819, 29821, 29822, 29824, 29826, 29827, 29828, 29829, 29831, 29832, 29834, 29835, 29836, 29838, 29839, 29840, 29841, 29842, 29843, 29844, 29845, 29846, 29847, 29848, 29849, 29850, 29851, 29853, 29856, 29860, 29861, 29899, 29901, 29902, 29903, 29904, 29905, 29906, 29910, 29911, 29912, 29913, 29914, 29915, 29916, 29918, 29920, 29921, 29922, 29923, 29924, 29925, 29926, 29927, 29928, 29929, 29931, 29932, 29933, 29934, 29935, 29936, 29938, 29939, 29940, 29941, 29943, 29944, 29945, 30002, 30003, 30004, 30005, 30006, 30007, 30008, 30009, 30010, 30011, 30012, 30013, 30014, 30015, 30016, 30017, 30018, 30019, 30021, 30022, 30023, 30024, 30025, 30026, 30028, 30029, 30030, 30031, 30032, 30033, 30034, 30035, 30036, 30037, 30038, 30039, 30040, 30041, 30042, 30043, 30044, 30045, 30046, 30047, 30048, 30049, 30052, 30054, 30055, 30056, 30058, 30060, 30061, 30062, 30063, 30064, 30065, 30066, 30067, 30068, 30069, 30070, 30071, 30072, 30074, 30075, 30076, 30077, 30078, 30079, 30080, 30081, 30082, 30083, 30084, 30085, 30086, 30087, 30088, 30090, 30091, 30092, 30093, 30094, 30095, 30096, 30097, 30098, 30099, 30101, 30102, 30103, 30104, 30105, 30106, 30107, 30108, 30109, 30110, 30111, 30113, 30114, 30115, 30116, 30117, 30118, 30119, 30120, 30121, 30122, 30123, 30124, 30125, 30126, 30127, 30129, 30132, 30133, 30134, 30135, 30137, 30138, 30139, 30140, 30141, 30142, 30143, 30144, 30145, 30146, 30147, 30148, 30149, 30150, 30151, 30152, 30153, 30154, 30156, 30157, 30160, 30161, 30162, 30163, 30164, 30165, 30168, 30170, 30171, 30172, 30173, 30175, 30176, 30177, 30178, 30179, 30180, 30182, 30183, 30184, 30185, 30187, 30188, 30189, 30204, 30205, 30206, 30212, 30213, 30214, 30215, 30216, 30217, 30218, 30219, 30220, 30222, 30223, 30224, 30228, 30229, 30230, 30232, 30233, 30234, 30236, 30237, 30238, 30240, 30241, 30248, 30250, 30251, 30252, 30253, 30256, 30257, 30258, 30259, 30260, 30261, 30263, 30264, 30265, 30266, 30268, 30269, 30271, 30272, 30273, 30274, 30275, 30276, 30277, 30281, 30284, 30285, 30286, 30287, 30288, 30289, 30290, 30291, 30292, 30293, 30294, 30295, 30296, 30297, 30298, 30301, 30302, 30303, 30304, 30305, 30306, 30307, 30308, 30309, 30310, 30311, 30312, 30313, 30314, 30315, 30316, 30317, 30318, 30319, 30320, 30321, 30322, 30324, 30325, 30326, 30327, 30328, 30329, 30330, 30331, 30332, 30333, 30334, 30336, 30337, 30338, 30339, 30340, 30341, 30342, 30343, 30344, 30345, 30346, 30347, 30348, 30349, 30350, 30353, 30354, 30355, 30356, 30357, 30358, 30359, 30360, 30361, 30362, 30364, 30366, 30368, 30369, 30370, 30371, 30374, 30375, 30376, 30377, 30378, 30379, 30380, 30384, 30385, 30386, 30387, 30388, 30389, 30390, 30392, 30394, 30396, 30398, 30399, 30401, 30410, 30411, 30412, 30413, 30414, 30415, 30417, 30420, 30421, 30423, 30424, 30425, 30426, 30427, 30428, 30429, 30434, 30436, 30438, 30439, 30441, 30442, 30445, 30446, 30447, 30448, 30449, 30450, 30451, 30452, 30453, 30454, 30455, 30456, 30457, 30458, 30459, 30460, 30461, 30464, 30467, 30470, 30471, 30473, 30474, 30475, 30477, 30499, 30501, 30502, 30503, 30504, 30506, 30507, 30510, 30511, 30512, 30513, 30514, 30515, 30516, 30517, 30518, 30519, 30520, 30521, 30522, 30523, 30525, 30527, 30528, 30529, 30530, 30531, 30533, 30534, 30535, 30537, 30538, 30539, 30540, 30541, 30542, 30543, 30544, 30545, 30546, 30547, 30548, 30549, 30552, 30553, 30554, 30555, 30557, 30558, 30559, 30560, 30562, 30563, 30564, 30565, 30566, 30567, 30568, 30571, 30572, 30573, 30575, 30576, 30577, 30580, 30581, 30582, 30596, 30597, 30598, 30599, 30601, 30602, 30603, 30604, 30605, 30606, 30607, 30608, 30609, 30612, 30619, 30620, 30621, 30622, 30623, 30624, 30625, 30627, 30628, 30629, 30630, 30631, 30633, 30634, 30635, 30638, 30639, 30641, 30642, 30643, 30645, 30646, 30647, 30648, 30650, 30655, 30656, 30660, 30662, 30663, 30664, 30665, 30666, 30667, 30668, 30669, 30671, 30673, 30677, 30678, 30680, 30683, 30701, 30703, 30705, 30707, 30708, 30710, 30711, 30719, 30720, 30721, 30722, 30724, 30725, 30726, 30728, 30730, 30731, 30732, 30733, 30734, 30735, 30736, 30738, 30739, 30740, 30741, 30742, 30746, 30747, 30750, 30751, 30752, 30753, 30755, 30756, 30757, 30802, 30803, 30805, 30806, 30807, 30808, 30809, 30810, 30811, 30812, 30813, 30814, 30815, 30816, 30817, 30818, 30819, 30820, 30821, 30822, 30823, 30824, 30828, 30830, 30833, 30901, 30903, 30904, 30905, 30906, 30907, 30909, 30910, 30911, 30912, 30913, 30914, 30916, 30917, 30919, 30999, 31001, 31002, 31003, 31004, 31005, 31006, 31007, 31008, 31009, 31010, 31011, 31012, 31013, 31014, 31015, 31016, 31017, 31018, 31019, 31020, 31021, 31022, 31023, 31024, 31025, 31027, 31028, 31029, 31030, 31031, 31032, 31033, 31034, 31035, 31036, 31037, 31038, 31039, 31040, 31041, 31042, 31044, 31045, 31046, 31047, 31049, 31050, 31051, 31052, 31054, 31055, 31057, 31058, 31059, 31060, 31061, 31062, 31063, 31064, 31065, 31066, 31067, 31068, 31069, 31070, 31071, 31072, 31073, 31075, 31076, 31077, 31078, 31079, 31081, 31082, 31083, 31084, 31085, 31086, 31087, 31088, 31089, 31090, 31091, 31092, 31093, 31094, 31095, 31096, 31097, 31098, 31099, 31106, 31107, 31119, 31126, 31131, 31139, 31141, 31145, 31146, 31150, 31156, 31191, 31192, 31193, 31195, 31196, 31197, 31198, 31199, 31201, 31202, 31203, 31204, 31205, 31206, 31207, 31208, 31209, 31210, 31211, 31212, 31213, 31216, 31217, 31220, 31221, 31294, 31295, 31296, 31297, 31298, 31299, 31301, 31302, 31303, 31304, 31305, 31307, 31308, 31309, 31310, 31312, 31313, 31314, 31315, 31316, 31318, 31319, 31320, 31321, 31322, 31323, 31324, 31326, 31327, 31328, 31329, 31331, 31333, 31401, 31402, 31403, 31404, 31405, 31406, 31407, 31408, 31409, 31410, 31411, 31412, 31414, 31415, 31416, 31418, 31419, 31420, 31421, 31422, 31498, 31499, 31501, 31502, 31503, 31510, 31512, 31513, 31515, 31516, 31518, 31519, 31520, 31521, 31522, 31523, 31524, 31525, 31527, 31532, 31533, 31534, 31535, 31537, 31539, 31542, 31543, 31544, 31545, 31546, 31547, 31548, 31549, 31550, 31551, 31552, 31553, 31554, 31555, 31556, 31557, 31558, 31560, 31561, 31563, 31564, 31565, 31566, 31567, 31568, 31569, 31598, 31599, 31601, 31602, 31603, 31604, 31605, 31606, 31620, 31622, 31623, 31624, 31625, 31626, 31627, 31629, 31630, 31631, 31632, 31634, 31635, 31636, 31637, 31638, 31639, 31641, 31642, 31643, 31645, 31646, 31647, 31648, 31649, 31650, 31698, 31699, 31701, 31702, 31703, 31704, 31705, 31706, 31707, 31708, 31709, 31710, 31711, 31712, 31713, 31714, 31715, 31716, 31717, 31718, 31720, 31722, 31723, 31724, 31725, 31726, 31727, 31728, 31729, 31730, 31732, 31733, 31734, 31735, 31736, 31737, 31738, 31739, 31740, 31741, 31742, 31743, 31744, 31745, 31746, 31747, 31749, 31750, 31751, 31752, 31753, 31754, 31756, 31757, 31758, 31759, 31760, 31761, 31762, 31763, 31764, 31765, 31766, 31767, 31768, 31769, 31770, 31771, 31772, 31773, 31774, 31775, 31776, 31777, 31778, 31779, 31780, 31781, 31782, 31783, 31784, 31785, 31786, 31787, 31789, 31790, 31791, 31792, 31793, 31794, 31795, 31796, 31797, 31798, 31799, 31801, 31803, 31804, 31805, 31806, 31807, 31808, 31810, 31811, 31812, 31814, 31815, 31816, 31820, 31821, 31822, 31823, 31824, 31825, 31826, 31827, 31829, 31830, 31831, 31832, 31833, 31836, 31901, 31902, 31903, 31904, 31905, 31906, 31907, 31908, 31909, 31914, 31917, 31993, 31994, 31995, 31997, 31998, 31999, 32003, 32004, 32007, 32008, 32009, 32011, 32013, 32024, 32025, 32030, 32033, 32034, 32035, 32038, 32040, 32041, 32042, 32043, 32044, 32046, 32050, 32052, 32053, 32054, 32055, 32056, 32058, 32059, 32060, 32061, 32062, 32063, 32064, 32065, 32066, 32067, 32068, 32071, 32072, 32073, 32079, 32080, 32082, 32083, 32084, 32085, 32086, 32087, 32091, 32092, 32094, 32095, 32096, 32097, 32099, 32102, 32105, 32110, 32111, 32112, 32113, 32114, 32115, 32116, 32117, 32118, 32119, 32120, 32121, 32122, 32123, 32124, 32125, 32126, 32127, 32128, 32129, 32130, 32131, 32132, 32133, 32134, 32135, 32136, 32137, 32138, 32139, 32140, 32141, 32142, 32145, 32147, 32148, 32149, 32151, 32157, 32158, 32159, 32160, 32162, 32164, 32168, 32169, 32170, 32173, 32174, 32175, 32176, 32177, 32178, 32179, 32180, 32181, 32182, 32183, 32185, 32187, 32189, 32190, 32192, 32193, 32195, 32198, 32201, 32202, 32203, 32204, 32205, 32206, 32207, 32208, 32209, 32210, 32211, 32212, 32214, 32215, 32216, 32217, 32218, 32219, 32220, 32221, 32222, 32223, 32224, 32225, 32226, 32227, 32228, 32229, 32230, 32231, 32232, 32233, 32234, 32235, 32236, 32237, 32238, 32239, 32240, 32241, 32244, 32245, 32246, 32247, 32250, 32254, 32255, 32256, 32257, 32258, 32259, 32260, 32266, 32267, 32276, 32277, 32290, 32301, 32302, 32303, 32304, 32305, 32306, 32307, 32308, 32309, 32310, 32311, 32312, 32313, 32314, 32315, 32316, 32317, 32318, 32320, 32321, 32322, 32323, 32324, 32326, 32327, 32328, 32329, 32330, 32331, 32332, 32333, 32334, 32335, 32336, 32337, 32340, 32341, 32343, 32344, 32345, 32346, 32347, 32348, 32350, 32351, 32352, 32353, 32355, 32356, 32357, 32358, 32359, 32360, 32361, 32362, 32395, 32399, 32401, 32402, 32403, 32404, 32405, 32406, 32407, 32408, 32409, 32410, 32411, 32412, 32413, 32417, 32420, 32421, 32422, 32423, 32424, 32425, 32426, 32427, 32428, 32430, 32431, 32432, 32433, 32434, 32435, 32437, 32438, 32439, 32440, 32442, 32443, 32444, 32445, 32446, 32447, 32448, 32449, 32452, 32454, 32455, 32456, 32457, 32459, 32460, 32461, 32462, 32463, 32464, 32465, 32466, 32501, 32502, 32503, 32504, 32505, 32506, 32507, 32508, 32509, 32511, 32512, 32513, 32514, 32516, 32520, 32521, 32522, 32523, 32524, 32526, 32530, 32531, 32533, 32534, 32535, 32536, 32537, 32538, 32539, 32540, 32541, 32542, 32544, 32547, 32548, 32549, 32550, 32559, 32560, 32561, 32562, 32563, 32564, 32565, 32566, 32567, 32568, 32569, 32570, 32571, 32572, 32573, 32574, 32575, 32576, 32577, 32578, 32579, 32580, 32581, 32582, 32583, 32588, 32589, 32590, 32591, 32592, 32593, 32594, 32595, 32596, 32597, 32598, 32601, 32602, 32603, 32604, 32605, 32606, 32607, 32608, 32609, 32610, 32611, 32612, 32613, 32614, 32615, 32616, 32617, 32618, 32619, 32621, 32622, 32625, 32626, 32627, 32628, 32631, 32633, 32634, 32635, 32639, 32640, 32641, 32643, 32644, 32648, 32653, 32654, 32655, 32656, 32658, 32662, 32663, 32664, 32666, 32667, 32668, 32669, 32680, 32681, 32683, 32686, 32692, 32693, 32694, 32696, 32697, 32701, 32702, 32703, 32704, 32706, 32707, 32708, 32709, 32710, 32712, 32713, 32714, 32715, 32716, 32718, 32719, 32720, 32721, 32722, 32724, 32725, 32726, 32727, 32728, 32730, 32732, 32733, 32735, 32736, 32738, 32739, 32744, 32746, 32747, 32750, 32751, 32752, 32753, 32754, 32756, 32757, 32759, 32762, 32763, 32764, 32765, 32766, 32767, 32768, 32771, 32772, 32773, 32774, 32775, 32776, 32777, 32778, 32779, 32780, 32781, 32782, 32783, 32784, 32789, 32790, 32791, 32792, 32793, 32794, 32795, 32796, 32798, 32799, 32801, 32802, 32803, 32804, 32805, 32806, 32807, 32808, 32809, 32810, 32811, 32812, 32814, 32815, 32816, 32817, 32818, 32819, 32820, 32821, 32822, 32824, 32825, 32826, 32827, 32828, 32829, 32830, 32831, 32832, 32833, 32834, 32835, 32836, 32837, 32839, 32853, 32854, 32855, 32856, 32857, 32858, 32859, 32860, 32861, 32862, 32867, 32868, 32869, 32872, 32877, 32878, 32886, 32887, 32890, 32891, 32893, 32897, 32898, 32899, 32901, 32902, 32903, 32904, 32905, 32906, 32907, 32908, 32909, 32910, 32911, 32912, 32919, 32920, 32922, 32923, 32924, 32925, 32926, 32927, 32931, 32932, 32934, 32935, 32936, 32937, 32940, 32941, 32948, 32949, 32950, 32951, 32952, 32953, 32954, 32955, 32956, 32957, 32958, 32959, 32960, 32961, 32962, 32963, 32964, 32965, 32966, 32967, 32968, 32969, 32970, 32971, 32976, 32978, 33001, 33002, 33004, 33008, 33009, 33010, 33011, 33012, 33013, 33014, 33015, 33016, 33017, 33018, 33019, 33020, 33021, 33022, 33023, 33024, 33025, 33026, 33027, 33028, 33029, 33030, 33031, 33032, 33033, 33034, 33035, 33036, 33037, 33039, 33040, 33041, 33042, 33043, 33044, 33045, 33050, 33051, 33052, 33054, 33055, 33056, 33060, 33061, 33062, 33063, 33064, 33065, 33066, 33067, 33068, 33069, 33070, 33071, 33072, 33073, 33074, 33075, 33076, 33077, 33081, 33082, 33083, 33084, 33090, 33092, 33093, 33097, 33101, 33102, 33107, 33109, 33110, 33111, 33112, 33114, 33116, 33119, 33121, 33122, 33124, 33125, 33126, 33127, 33128, 33129, 33130, 33131, 33132, 33133, 33134, 33135, 33136, 33137, 33138, 33139, 33140, 33141, 33142, 33143, 33144, 33145, 33146, 33147, 33148, 33149, 33150, 33151, 33152, 33153, 33154, 33155, 33156, 33157, 33158, 33159, 33160, 33161, 33162, 33163, 33164, 33165, 33166, 33167, 33168, 33169, 33170, 33172, 33173, 33174, 33175, 33176, 33177, 33178, 33179, 33180, 33181, 33182, 33183, 33184, 33185, 33186, 33187, 33188, 33189, 33190, 33192, 33193, 33194, 33195, 33196, 33197, 33199, 33231, 33233, 33234, 33238, 33239, 33242, 33243, 33245, 33247, 33255, 33256, 33257, 33261, 33265, 33266, 33269, 33280, 33283, 33296, 33299, 33301, 33302, 33303, 33304, 33305, 33306, 33307, 33308, 33309, 33310, 33311, 33312, 33313, 33314, 33315, 33316, 33317, 33318, 33319, 33320, 33321, 33322, 33323, 33324, 33325, 33326, 33327, 33328, 33329, 33330, 33331, 33332, 33334, 33335, 33337, 33338, 33339, 33340, 33345, 33346, 33348, 33349, 33351, 33355, 33359, 33388, 33394, 33401, 33402, 33403, 33404, 33405, 33406, 33407, 33408, 33409, 33410, 33411, 33412, 33413, 33414, 33415, 33416, 33417, 33418, 33419, 33420, 33421, 33422, 33424, 33425, 33426, 33427, 33428, 33429, 33430, 33431, 33432, 33433, 33434, 33435, 33436, 33437, 33438, 33439, 33440, 33441, 33442, 33443, 33444, 33445, 33446, 33447, 33448, 33454, 33455, 33458, 33459, 33460, 33461, 33462, 33463, 33464, 33465, 33466, 33467, 33468, 33469, 33470, 33471, 33474, 33475, 33476, 33477, 33478, 33480, 33481, 33482, 33483, 33484, 33486, 33487, 33488, 33493, 33496, 33497, 33498, 33499, 33503, 33508, 33509, 33510, 33511, 33513, 33514, 33521, 33523, 33524, 33525, 33526, 33527, 33530, 33534, 33537, 33538, 33539, 33540, 33541, 33543, 33544, 33547, 33548, 33549, 33550, 33556, 33558, 33559, 33564, 33565, 33566, 33567, 33568, 33569, 33570, 33571, 33572, 33573, 33574, 33576, 33583, 33584, 33585, 33586, 33587, 33592, 33593, 33594, 33595, 33597, 33598, 33601, 33602, 33603, 33604, 33605, 33606, 33607, 33608, 33609, 33610, 33611, 33612, 33613, 33614, 33615, 33616, 33617, 33618, 33619, 33620, 33621, 33622, 33623, 33624, 33625, 33626, 33629, 33630, 33631, 33633, 33634, 33635, 33637, 33647, 33650, 33651, 33655, 33660, 33661, 33662, 33663, 33664, 33672, 33673, 33674, 33675, 33677, 33679, 33680, 33681, 33682, 33684, 33685, 33686, 33687, 33688, 33689, 33690, 33694, 33697, 33701, 33702, 33703, 33704, 33705, 33706, 33707, 33708, 33709, 33710, 33711, 33712, 33713, 33714, 33715, 33716, 33728, 33729, 33730, 33731, 33732, 33733, 33734, 33736, 33737, 33738, 33740, 33741, 33742, 33743, 33744, 33747, 33755, 33756, 33757, 33758, 33759, 33760, 33761, 33762, 33763, 33764, 33765, 33766, 33767, 33769, 33770, 33771, 33772, 33773, 33774, 33775, 33776, 33777, 33778, 33779, 33780, 33781, 33782, 33784, 33785, 33786, 33801, 33802, 33803, 33804, 33805, 33806, 33807, 33809, 33810, 33811, 33813, 33815, 33820, 33823, 33825, 33826, 33827, 33830, 33831, 33834, 33835, 33836, 33837, 33838, 33839, 33840, 33841, 33843, 33844, 33845, 33846, 33847, 33848, 33849, 33850, 33851, 33852, 33853, 33854, 33855, 33856, 33857, 33858, 33859, 33860, 33862, 33863, 33865, 33867, 33868, 33870, 33871, 33872, 33873, 33875, 33876, 33877, 33880, 33881, 33882, 33883, 33884, 33885, 33888, 33890, 33896, 33897, 33898, 33901, 33902, 33903, 33904, 33905, 33906, 33907, 33908, 33909, 33910, 33911, 33912, 33913, 33914, 33915, 33916, 33917, 33918, 33919, 33920, 33921, 33922, 33924, 33927, 33928, 33930, 33931, 33932, 33935, 33936, 33938, 33944, 33945, 33946, 33947, 33948, 33949, 33950, 33951, 33952, 33953, 33954, 33955, 33956, 33957, 33960, 33965, 33970, 33971, 33972, 33975, 33980, 33981, 33982, 33983, 33990, 33991, 33993, 33994, 34002, 34003, 34009, 34020, 34021, 34022, 34023, 34024, 34025, 34030, 34031, 34032, 34033, 34034, 34035, 34036, 34037, 34038, 34039, 34040, 34041, 34042, 34050, 34051, 34053, 34054, 34055, 34058, 34060, 34071, 34077, 34078, 34079, 34086, 34090, 34091, 34092, 34093, 34095, 34098, 34099, 34101, 34102, 34103, 34104, 34105, 34106, 34107, 34108, 34109, 34110, 34112, 34113, 34114, 34116, 34117, 34119, 34120, 34133, 34134, 34135, 34136, 34137, 34138, 34139, 34140, 34141, 34142, 34143, 34145, 34146, 34201, 34202, 34203, 34204, 34205, 34206, 34207, 34208, 34209, 34210, 34211, 34212, 34215, 34216, 34217, 34218, 34219, 34220, 34221, 34222, 34223, 34224, 34228, 34229, 34230, 34231, 34232, 34233, 34234, 34235, 34236, 34237, 34238, 34239, 34240, 34241, 34242, 34243, 34250, 34251, 34260, 34264, 34265, 34266, 34267, 34268, 34269, 34270, 34272, 34274, 34275, 34276, 34277, 34278, 34280, 34281, 34282, 34284, 34285, 34286, 34287, 34288, 34289, 34292, 34293, 34295, 34420, 34421, 34423, 34428, 34429, 34430, 34431, 34432, 34433, 34434, 34436, 34442, 34445, 34446, 34447, 34448, 34449, 34450, 34451, 34452, 34453, 34460, 34461, 34464, 34465, 34470, 34471, 34472, 34473, 34474, 34475, 34476, 34477, 34478, 34479, 34480, 34481, 34482, 34483, 34484, 34487, 34488, 34489, 34491, 34492, 34498, 34601, 34602, 34603, 34604, 34605, 34606, 34607, 34608, 34609, 34610, 34611, 34613, 34614, 34636, 34639, 34652, 34653, 34654, 34655, 34656, 34660, 34661, 34667, 34668, 34669, 34673, 34674, 34677, 34679, 34680, 34681, 34682, 34683, 34684, 34685, 34688, 34689, 34690, 34691, 34695, 34697, 34698, 34705, 34711, 34712, 34713, 34729, 34731, 34734, 34736, 34737, 34739, 34740, 34741, 34742, 34743, 34744, 34745, 34746, 34747, 34748, 34749, 34753, 34755, 34756, 34758, 34759, 34760, 34761, 34762, 34769, 34770, 34771, 34772, 34773, 34777, 34778, 34785, 34786, 34787, 34788, 34789, 34797, 34945, 34946, 34947, 34948, 34949, 34950, 34951, 34952, 34953, 34954, 34956, 34957, 34958, 34972, 34973, 34974, 34979, 34981, 34982, 34983, 34984, 34985, 34986, 34987, 34988, 34990, 34991, 34992, 34994, 34995, 34996, 34997, 35004, 35005, 35006, 35007, 35010, 35011, 35013, 35014, 35015, 35016, 35019, 35020, 35021, 35022, 35023, 35031, 35032, 35033, 35034, 35035, 35036, 35038, 35040, 35041, 35042, 35043, 35044, 35045, 35046, 35048, 35049, 35051, 35052, 35053, 35054, 35055, 35056, 35057, 35058, 35060, 35061, 35062, 35063, 35064, 35068, 35070, 35071, 35072, 35073, 35074, 35077, 35078, 35079, 35080, 35082, 35083, 35085, 35087, 35089, 35091, 35094, 35096, 35097, 35098, 35111, 35112, 35114, 35115, 35116, 35117, 35118, 35119, 35120, 35121, 35123, 35124, 35125, 35126, 35127, 35128, 35130, 35131, 35133, 35135, 35136, 35137, 35139, 35142, 35143, 35144, 35146, 35147, 35148, 35149, 35150, 35151, 35160, 35161, 35171, 35172, 35173, 35175, 35176, 35178, 35179, 35180, 35181, 35182, 35183, 35184, 35185, 35186, 35187, 35188, 35201, 35202, 35203, 35204, 35205, 35206, 35207, 35208, 35209, 35210, 35211, 35212, 35213, 35214, 35215, 35216, 35217, 35218, 35219, 35220, 35221, 35222, 35223, 35224, 35225, 35226, 35228, 35229, 35230, 35231, 35232, 35233, 35234, 35235, 35236, 35237, 35238, 35240, 35242, 35243, 35244, 35245, 35246, 35249, 35253, 35254, 35255, 35259, 35260, 35261, 35263, 35266, 35277, 35278, 35279, 35280, 35281, 35282, 35283, 35285, 35286, 35287, 35288, 35289, 35290, 35291, 35292, 35293, 35294, 35295, 35296, 35297, 35298, 35299, 35401, 35402, 35403, 35404, 35405, 35406, 35407, 35440, 35441, 35442, 35443, 35444, 35446, 35447, 35448, 35449, 35452, 35453, 35456, 35457, 35458, 35459, 35460, 35461, 35462, 35463, 35464, 35466, 35468, 35469, 35470, 35471, 35473, 35474, 35475, 35476, 35477, 35478, 35480, 35481, 35482, 35485, 35486, 35487, 35490, 35491, 35501, 35502, 35503, 35504, 35540, 35541, 35542, 35543, 35544, 35545, 35546, 35548, 35549, 35550, 35551, 35552, 35553, 35554, 35555, 35559, 35560, 35563, 35564, 35565, 35570, 35571, 35572, 35573, 35574, 35575, 35576, 35577, 35578, 35579, 35580, 35581, 35582, 35584, 35585, 35586, 35587, 35592, 35593, 35594, 35601, 35602, 35603, 35609, 35610, 35611, 35612, 35613, 35614, 35615, 35616, 35617, 35618, 35619, 35620, 35621, 35622, 35630, 35631, 35632, 35633, 35634, 35640, 35643, 35645, 35646, 35647, 35648, 35649, 35650, 35651, 35652, 35653, 35654, 35660, 35661, 35662, 35670, 35671, 35672, 35673, 35674, 35677, 35699, 35739, 35740, 35741, 35742, 35744, 35745, 35746, 35747, 35748, 35749, 35750, 35751, 35752, 35754, 35755, 35756, 35757, 35758, 35759, 35760, 35761, 35762, 35763, 35764, 35765, 35766, 35767, 35768, 35769, 35771, 35772, 35773, 35774, 35775, 35776, 35801, 35802, 35803, 35804, 35805, 35806, 35807, 35808, 35809, 35810, 35811, 35812, 35813, 35814, 35815, 35816, 35824, 35893, 35894, 35895, 35896, 35897, 35898, 35899, 35901, 35902, 35903, 35904, 35905, 35906, 35907, 35950, 35951, 35952, 35953, 35954, 35956, 35957, 35958, 35959, 35960, 35961, 35962, 35963, 35964, 35966, 35967, 35968, 35971, 35972, 35973, 35974, 35975, 35976, 35978, 35979, 35980, 35981, 35983, 35984, 35986, 35987, 35988, 35989, 35990, 36003, 36005, 36006, 36008, 36009, 36010, 36013, 36015, 36016, 36017, 36020, 36022, 36023, 36024, 36025, 36026, 36027, 36028, 36029, 36030, 36031, 36032, 36033, 36034, 36035, 36036, 36037, 36038, 36039, 36040, 36041, 36042, 36043, 36045, 36046, 36047, 36048, 36049, 36051, 36052, 36053, 36054, 36057, 36061, 36062, 36064, 36065, 36066, 36067, 36068, 36069, 36071, 36072, 36075, 36078, 36079, 36080, 36081, 36082, 36083, 36087, 36088, 36089, 36091, 36092, 36093, 36101, 36102, 36103, 36104, 36105, 36106, 36107, 36108, 36109, 36110, 36111, 36112, 36113, 36114, 36115, 36116, 36117, 36118, 36119, 36120, 36121, 36123, 36124, 36125, 36130, 36131, 36132, 36133, 36134, 36135, 36140, 36141, 36142, 36177, 36191, 36201, 36202, 36203, 36204, 36205, 36206, 36207, 36250, 36251, 36253, 36254, 36255, 36256, 36257, 36258, 36260, 36261, 36262, 36263, 36264, 36265, 36266, 36267, 36268, 36269, 36270, 36271, 36272, 36273, 36274, 36275, 36276, 36277, 36278, 36279, 36280, 36301, 36302, 36303, 36304, 36305, 36310, 36311, 36312, 36313, 36314, 36316, 36317, 36318, 36319, 36320, 36321, 36322, 36323, 36330, 36331, 36340, 36343, 36344, 36345, 36346, 36349, 36350, 36351, 36352, 36353, 36360, 36361, 36362, 36370, 36371, 36373, 36374, 36375, 36376, 36401, 36420, 36425, 36426, 36427, 36429, 36431, 36432, 36435, 36436, 36439, 36441, 36442, 36444, 36445, 36446, 36449, 36451, 36453, 36454, 36455, 36456, 36457, 36458, 36460, 36461, 36462, 36467, 36470, 36471, 36473, 36474, 36475, 36476, 36477, 36480, 36481, 36482, 36483, 36501, 36502, 36503, 36504, 36505, 36507, 36509, 36511, 36512, 36513, 36515, 36518, 36521, 36522, 36523, 36524, 36525, 36526, 36527, 36528, 36529, 36530, 36532, 36533, 36535, 36536, 36538, 36539, 36540, 36541, 36542, 36543, 36544, 36545, 36547, 36548, 36549, 36550, 36551, 36553, 36555, 36556, 36558, 36559, 36560, 36561, 36562, 36564, 36567, 36568, 36569, 36570, 36571, 36572, 36574, 36575, 36576, 36577, 36578, 36579, 36580, 36581, 36582, 36583, 36584, 36585, 36586, 36587, 36590, 36601, 36602, 36603, 36604, 36605, 36606, 36607, 36608, 36609, 36610, 36611, 36612, 36613, 36614, 36615, 36616, 36617, 36618, 36619, 36621, 36622, 36623, 36625, 36626, 36628, 36630, 36631, 36633, 36640, 36641, 36644, 36652, 36660, 36663, 36670, 36671, 36675, 36685, 36688, 36689, 36690, 36691, 36693, 36695, 36701, 36702, 36703, 36720, 36721, 36722, 36723, 36726, 36727, 36728, 36732, 36736, 36738, 36740, 36741, 36742, 36744, 36745, 36748, 36749, 36750, 36751, 36752, 36753, 36754, 36756, 36758, 36759, 36761, 36762, 36763, 36764, 36765, 36766, 36767, 36768, 36769, 36773, 36775, 36776, 36778, 36779, 36782, 36783, 36784, 36785, 36786, 36790, 36792, 36793, 36801, 36802, 36803, 36804, 36830, 36831, 36832, 36849, 36850, 36851, 36852, 36853, 36854, 36855, 36856, 36858, 36859, 36860, 36861, 36862, 36863, 36865, 36866, 36867, 36868, 36869, 36870, 36871, 36872, 36874, 36875, 36877, 36879, 36901, 36904, 36906, 36907, 36908, 36910, 36912, 36913, 36915, 36916, 36919, 36921, 36922, 36925, 37010, 37011, 37012, 37013, 37014, 37015, 37016, 37018, 37019, 37020, 37022, 37023, 37024, 37025, 37026, 37027, 37028, 37029, 37030, 37031, 37032, 37033, 37034, 37035, 37036, 37037, 37040, 37041, 37042, 37043, 37044, 37046, 37047, 37048, 37049, 37050, 37051, 37052, 37055, 37056, 37057, 37058, 37059, 37060, 37061, 37062, 37063, 37064, 37065, 37066, 37067, 37068, 37069, 37070, 37071, 37072, 37073, 37074, 37075, 37076, 37077, 37078, 37079, 37080, 37082, 37083, 37085, 37086, 37087, 37088, 37089, 37090, 37091, 37095, 37096, 37097, 37098, 37101, 37110, 37111, 37115, 37116, 37118, 37119, 37121, 37122, 37127, 37128, 37129, 37130, 37131, 37132, 37133, 37134, 37135, 37136, 37137, 37138, 37140, 37141, 37142, 37143, 37144, 37145, 37146, 37147, 37148, 37149, 37150, 37151, 37152, 37153, 37155, 37160, 37161, 37162, 37165, 37166, 37167, 37171, 37172, 37174, 37175, 37178, 37179, 37180, 37181, 37183, 37184, 37185, 37186, 37187, 37188, 37189, 37190, 37191, 37201, 37202, 37203, 37204, 37205, 37206, 37207, 37208, 37209, 37210, 37211, 37212, 37213, 37214, 37215, 37216, 37217, 37218, 37219, 37220, 37221, 37222, 37224, 37227, 37228, 37229, 37230, 37232, 37234, 37235, 37236, 37237, 37238, 37239, 37240, 37241, 37242, 37243, 37244, 37245, 37246, 37247, 37248, 37249, 37250, 37301, 37302, 37303, 37304, 37305, 37306, 37307, 37308, 37309, 37310, 37311, 37312, 37313, 37314, 37315, 37316, 37317, 37318, 37320, 37321, 37322, 37323, 37324, 37325, 37326, 37327, 37328, 37329, 37330, 37331, 37332, 37333, 37334, 37335, 37336, 37337, 37338, 37339, 37340, 37341, 37342, 37343, 37345, 37347, 37348, 37349, 37350, 37351, 37352, 37353, 37354, 37355, 37356, 37357, 37359, 37360, 37361, 37362, 37363, 37364, 37365, 37366, 37367, 37369, 37370, 37371, 37372, 37373, 37374, 37375, 37376, 37377, 37378, 37379, 37380, 37381, 37382, 37383, 37384, 37385, 37387, 37388, 37389, 37391, 37394, 37395, 37396, 37397, 37398, 37401, 37402, 37403, 37404, 37405, 37406, 37407, 37408, 37409, 37410, 37411, 37412, 37414, 37415, 37416, 37419, 37421, 37422, 37424, 37450, 37501, 37601, 37602, 37604, 37605, 37614, 37615, 37616, 37617, 37618, 37620, 37621, 37625, 37640, 37641, 37642, 37643, 37644, 37645, 37650, 37656, 37657, 37658, 37659, 37660, 37662, 37663, 37664, 37665, 37669, 37680, 37681, 37682, 37683, 37684, 37686, 37687, 37688, 37690, 37691, 37692, 37694, 37699, 37701, 37705, 37707, 37708, 37709, 37710, 37711, 37713, 37714, 37715, 37716, 37717, 37719, 37721, 37722, 37723, 37724, 37725, 37726, 37727, 37729, 37730, 37731, 37732, 37733, 37737, 37738, 37742, 37743, 37744, 37745, 37748, 37752, 37753, 37754, 37755, 37756, 37757, 37760, 37762, 37763, 37764, 37765, 37766, 37769, 37770, 37771, 37772, 37773, 37774, 37777, 37778, 37779, 37801, 37802, 37803, 37804, 37806, 37807, 37809, 37810, 37811, 37813, 37814, 37815, 37816, 37818, 37819, 37820, 37821, 37822, 37824, 37825, 37826, 37828, 37829, 37830, 37831, 37840, 37841, 37842, 37843, 37845, 37846, 37847, 37848, 37849, 37851, 37852, 37853, 37854, 37857, 37860, 37861, 37862, 37863, 37864, 37865, 37866, 37867, 37868, 37869, 37870, 37871, 37872, 37873, 37874, 37876, 37877, 37878, 37879, 37880, 37881, 37882, 37885, 37886, 37887, 37888, 37890, 37891, 37892, 37901, 37902, 37909, 37912, 37914, 37915, 37916, 37917, 37918, 37919, 37920, 37921, 37922, 37923, 37924, 37927, 37928, 37929, 37930, 37931, 37932, 37933, 37938, 37939, 37940, 37950, 37990, 37995, 37996, 37997, 37998, 38001, 38002, 38004, 38006, 38007, 38008, 38010, 38011, 38012, 38014, 38015, 38016, 38017, 38018, 38019, 38021, 38023, 38024, 38025, 38027, 38028, 38029, 38030, 38034, 38036, 38037, 38039, 38040, 38041, 38042, 38044, 38045, 38046, 38047, 38048, 38049, 38050, 38052, 38053, 38054, 38055, 38056, 38057, 38058, 38059, 38060, 38061, 38063, 38066, 38067, 38068, 38069, 38070, 38071, 38074, 38075, 38076, 38077, 38079, 38080, 38083, 38088, 38101, 38103, 38104, 38105, 38106, 38107, 38108, 38109, 38110, 38111, 38112, 38113, 38114, 38115, 38116, 38117, 38118, 38119, 38120, 38122, 38124, 38125, 38126, 38127, 38128, 38130, 38131, 38132, 38133, 38134, 38135, 38136, 38137, 38138, 38139, 38140, 38141, 38142, 38143, 38145, 38146, 38147, 38148, 38150, 38151, 38152, 38157, 38159, 38161, 38163, 38165, 38166, 38167, 38168, 38173, 38174, 38175, 38177, 38181, 38182, 38183, 38184, 38186, 38187, 38188, 38190, 38193, 38194, 38195, 38197, 38201, 38220, 38221, 38222, 38223, 38224, 38225, 38226, 38229, 38230, 38231, 38232, 38233, 38235, 38236, 38237, 38238, 38240, 38241, 38242, 38251, 38253, 38254, 38255, 38256, 38257, 38258, 38259, 38260, 38261, 38271, 38281, 38301, 38302, 38303, 38305, 38308, 38310, 38311, 38313, 38314, 38315, 38316, 38317, 38318, 38320, 38321, 38324, 38326, 38327, 38328, 38329, 38330, 38331, 38332, 38333, 38334, 38336, 38337, 38338, 38339, 38340, 38341, 38342, 38343, 38344, 38345, 38346, 38347, 38348, 38351, 38352, 38355, 38356, 38357, 38358, 38359, 38361, 38362, 38363, 38365, 38366, 38367, 38368, 38369, 38370, 38371, 38372, 38374, 38375, 38376, 38377, 38378, 38379, 38380, 38381, 38382, 38387, 38388, 38389, 38390, 38391, 38392, 38393, 38401, 38402, 38425, 38449, 38450, 38451, 38452, 38453, 38454, 38455, 38456, 38457, 38459, 38460, 38461, 38462, 38463, 38464, 38468, 38469, 38471, 38472, 38473, 38474, 38475, 38476, 38477, 38478, 38481, 38482, 38483, 38485, 38486, 38487, 38488, 38501, 38502, 38503, 38504, 38505, 38506, 38541, 38542, 38543, 38544, 38545, 38547, 38548, 38549, 38550, 38551, 38552, 38553, 38554, 38555, 38556, 38557, 38558, 38559, 38560, 38562, 38563, 38564, 38565, 38567, 38568, 38569, 38570, 38571, 38572, 38573, 38574, 38575, 38577, 38578, 38579, 38580, 38581, 38582, 38583, 38585, 38587, 38588, 38589, 38601, 38602, 38603, 38606, 38609, 38610, 38611, 38614, 38617, 38618, 38619, 38620, 38621, 38622, 38623, 38625, 38626, 38627, 38628, 38629, 38630, 38631, 38632, 38633, 38634, 38635, 38637, 38638, 38639, 38641, 38642, 38643, 38644, 38645, 38646, 38647, 38649, 38650, 38651, 38652, 38654, 38655, 38658, 38659, 38661, 38663, 38664, 38665, 38666, 38668, 38669, 38670, 38671, 38672, 38673, 38674, 38675, 38676, 38677, 38679, 38680, 38683, 38685, 38686, 38701, 38702, 38703, 38704, 38720, 38721, 38722, 38723, 38725, 38726, 38730, 38731, 38732, 38733, 38736, 38737, 38738, 38739, 38740, 38744, 38745, 38746, 38748, 38749, 38751, 38753, 38754, 38756, 38758, 38759, 38760, 38761, 38762, 38763, 38764, 38765, 38767, 38768, 38769, 38771, 38772, 38773, 38774, 38776, 38778, 38780, 38781, 38782, 38801, 38802, 38803, 38804, 38820, 38821, 38824, 38825, 38826, 38827, 38828, 38829, 38833, 38834, 38835, 38838, 38839, 38841, 38843, 38844, 38846, 38847, 38848, 38849, 38850, 38851, 38852, 38854, 38855, 38856, 38857, 38858, 38859, 38860, 38862, 38863, 38864, 38865, 38866, 38868, 38869, 38870, 38871, 38873, 38874, 38875, 38876, 38877, 38878, 38879, 38880, 38901, 38902, 38912, 38913, 38914, 38915, 38916, 38917, 38920, 38921, 38922, 38923, 38924, 38925, 38926, 38927, 38928, 38929, 38930, 38935, 38940, 38941, 38943, 38944, 38945, 38946, 38947, 38948, 38949, 38950, 38951, 38952, 38953, 38954, 38955, 38957, 38958, 38959, 38960, 38961, 38962, 38963, 38964, 38965, 38966, 38967, 39038, 39039, 39040, 39041, 39042, 39043, 39044, 39045, 39046, 39047, 39051, 39054, 39056, 39057, 39058, 39059, 39060, 39061, 39062, 39063, 39066, 39067, 39069, 39071, 39072, 39073, 39074, 39077, 39078, 39079, 39080, 39081, 39082, 39083, 39086, 39087, 39088, 39090, 39092, 39094, 39095, 39096, 39097, 39098, 39107, 39108, 39109, 39110, 39111, 39112, 39113, 39114, 39115, 39116, 39117, 39119, 39120, 39121, 39122, 39130, 39140, 39144, 39145, 39146, 39148, 39149, 39150, 39151, 39152, 39153, 39154, 39156, 39157, 39158, 39159, 39160, 39161, 39162, 39163, 39165, 39166, 39167, 39168, 39169, 39170, 39171, 39173, 39174, 39175, 39176, 39177, 39179, 39180, 39181, 39182, 39183, 39189, 39190, 39191, 39192, 39193, 39194, 39201, 39202, 39203, 39204, 39205, 39206, 39207, 39208, 39209, 39210, 39211, 39212, 39213, 39215, 39216, 39217, 39218, 39225, 39232, 39235, 39236, 39250, 39269, 39271, 39272, 39282, 39283, 39284, 39286, 39288, 39289, 39296, 39298, 39301, 39302, 39303, 39304, 39305, 39307, 39309, 39320, 39322, 39323, 39324, 39325, 39326, 39327, 39328, 39330, 39332, 39335, 39336, 39337, 39338, 39339, 39341, 39342, 39345, 39346, 39347, 39348, 39350, 39352, 39354, 39355, 39356, 39358, 39359, 39360, 39361, 39362, 39363, 39364, 39365, 39366, 39367, 39401, 39402, 39403, 39404, 39406, 39407, 39421, 39422, 39423, 39425, 39426, 39427, 39428, 39429, 39436, 39437, 39439, 39440, 39441, 39442, 39443, 39451, 39452, 39455, 39456, 39457, 39459, 39460, 39461, 39462, 39463, 39464, 39465, 39466, 39470, 39474, 39475, 39476, 39477, 39478, 39479, 39480, 39481, 39482, 39483, 39501, 39502, 39503, 39505, 39506, 39507, 39520, 39521, 39522, 39525, 39529, 39530, 39531, 39532, 39533, 39534, 39535, 39540, 39552, 39553, 39555, 39556, 39558, 39560, 39561, 39562, 39563, 39564, 39565, 39566, 39567, 39568, 39569, 39571, 39572, 39573, 39574, 39576, 39577, 39581, 39595, 39601, 39602, 39603, 39629, 39630, 39631, 39632, 39633, 39635, 39638, 39641, 39643, 39645, 39647, 39648, 39649, 39652, 39653, 39654, 39656, 39657, 39661, 39662, 39663, 39664, 39665, 39666, 39667, 39668, 39669, 39701, 39702, 39703, 39704, 39705, 39710, 39730, 39735, 39736, 39737, 39739, 39740, 39741, 39743, 39744, 39745, 39746, 39747, 39750, 39751, 39752, 39753, 39754, 39755, 39756, 39759, 39760, 39762, 39766, 39767, 39769, 39771, 39772, 39773, 39776, 39901, 40003, 40004, 40006, 40007, 40008, 40009, 40010, 40011, 40012, 40013, 40014, 40018, 40019, 40020, 40022, 40023, 40025, 40026, 40027, 40031, 40032, 40033, 40036, 40037, 40040, 40041, 40045, 40046, 40047, 40048, 40049, 40050, 40051, 40052, 40055, 40056, 40057, 40058, 40059, 40060, 40061, 40062, 40063, 40065, 40066, 40067, 40068, 40069, 40070, 40071, 40075, 40076, 40077, 40078, 40104, 40107, 40108, 40109, 40110, 40111, 40115, 40117, 40118, 40119, 40121, 40129, 40140, 40142, 40143, 40144, 40145, 40146, 40150, 40152, 40153, 40155, 40157, 40159, 40160, 40161, 40162, 40164, 40165, 40170, 40171, 40175, 40176, 40177, 40178, 40201, 40202, 40203, 40204, 40205, 40206, 40207, 40208, 40209, 40210, 40211, 40212, 40213, 40214, 40215, 40216, 40217, 40218, 40219, 40220, 40221, 40222, 40223, 40224, 40225, 40228, 40229, 40231, 40232, 40233, 40241, 40242, 40243, 40245, 40250, 40251, 40252, 40253, 40255, 40256, 40257, 40258, 40259, 40261, 40266, 40268, 40269, 40270, 40272, 40280, 40281, 40282, 40283, 40285, 40287, 40289, 40290, 40291, 40292, 40293, 40294, 40295, 40296, 40297, 40298, 40299, 40310, 40311, 40312, 40313, 40316, 40317, 40319, 40320, 40322, 40324, 40328, 40329, 40330, 40334, 40336, 40337, 40339, 40340, 40342, 40346, 40347, 40348, 40350, 40351, 40353, 40355, 40356, 40357, 40358, 40359, 40360, 40361, 40362, 40363, 40366, 40370, 40371, 40372, 40374, 40376, 40379, 40380, 40383, 40384, 40385, 40386, 40387, 40390, 40391, 40392, 40402, 40403, 40404, 40405, 40409, 40410, 40419, 40421, 40422, 40423, 40434, 40437, 40440, 40442, 40444, 40445, 40446, 40447, 40448, 40452, 40456, 40460, 40461, 40464, 40467, 40468, 40472, 40473, 40475, 40476, 40481, 40484, 40486, 40488, 40489, 40492, 40495, 40502, 40503, 40504, 40505, 40506, 40507, 40508, 40509, 40510, 40511, 40512, 40513, 40514, 40515, 40516, 40517, 40522, 40523, 40524, 40526, 40533, 40536, 40544, 40546, 40550, 40555, 40574, 40575, 40576, 40577, 40578, 40579, 40580, 40581, 40582, 40583, 40584, 40585, 40586, 40587, 40588, 40589, 40590, 40591, 40592, 40593, 40594, 40595, 40596, 40601, 40602, 40603, 40604, 40618, 40619, 40620, 40621, 40622, 40701, 40702, 40724, 40729, 40730, 40734, 40737, 40740, 40741, 40742, 40743, 40744, 40745, 40751, 40754, 40755, 40759, 40763, 40769, 40771, 40801, 40803, 40806, 40807, 40808, 40810, 40813, 40815, 40816, 40818, 40819, 40820, 40823, 40824, 40826, 40827, 40828, 40829, 40830, 40831, 40840, 40843, 40844, 40845, 40847, 40849, 40854, 40855, 40856, 40858, 40862, 40863, 40865, 40868, 40870, 40873, 40874, 40902, 40903, 40906, 40913, 40914, 40915, 40921, 40923, 40927, 40930, 40931, 40932, 40935, 40939, 40940, 40941, 40943, 40944, 40946, 40949, 40951, 40953, 40955, 40958, 40962, 40964, 40965, 40972, 40977, 40979, 40981, 40982, 40983, 40988, 40995, 40997, 40999, 41001, 41002, 41003, 41004, 41005, 41006, 41007, 41008, 41010, 41011, 41012, 41014, 41015, 41016, 41017, 41018, 41019, 41022, 41030, 41031, 41033, 41034, 41035, 41037, 41039, 41040, 41041, 41042, 41043, 41044, 41045, 41046, 41048, 41049, 41051, 41052, 41053, 41054, 41055, 41056, 41059, 41061, 41062, 41063, 41064, 41065, 41071, 41072, 41073, 41074, 41075, 41076, 41080, 41081, 41083, 41085, 41086, 41091, 41092, 41093, 41094, 41095, 41096, 41097, 41098, 41099, 41101, 41102, 41105, 41114, 41121, 41124, 41127, 41128, 41129, 41132, 41135, 41137, 41139, 41141, 41142, 41143, 41144, 41146, 41149, 41150, 41156, 41159, 41160, 41164, 41166, 41168, 41169, 41170, 41171, 41173, 41174, 41175, 41179, 41180, 41181, 41183, 41189, 41201, 41203, 41204, 41214, 41215, 41216, 41219, 41222, 41224, 41226, 41228, 41230, 41231, 41232, 41234, 41238, 41240, 41250, 41254, 41255, 41256, 41257, 41260, 41262, 41263, 41264, 41265, 41267, 41268, 41271, 41274, 41301, 41307, 41310, 41311, 41313, 41314, 41317, 41332, 41333, 41338, 41339, 41342, 41344, 41347, 41348, 41351, 41352, 41360, 41362, 41364, 41365, 41366, 41367, 41368, 41377, 41385, 41386, 41390, 41397, 41408, 41410, 41413, 41419, 41421, 41422, 41425, 41426, 41433, 41444, 41451, 41459, 41464, 41465, 41472, 41477, 41501, 41502, 41503, 41512, 41513, 41514, 41517, 41519, 41520, 41522, 41524, 41526, 41527, 41528, 41531, 41534, 41535, 41537, 41538, 41539, 41540, 41542, 41543, 41544, 41546, 41547, 41548, 41549, 41553, 41554, 41555, 41557, 41558, 41559, 41560, 41561, 41562, 41563, 41564, 41566, 41567, 41568, 41569, 41571, 41572, 41601, 41602, 41603, 41604, 41605, 41606, 41607, 41612, 41615, 41616, 41619, 41621, 41622, 41630, 41631, 41632, 41635, 41636, 41640, 41642, 41643, 41645, 41647, 41649, 41650, 41651, 41653, 41655, 41659, 41660, 41663, 41666, 41667, 41669, 41701, 41702, 41712, 41713, 41714, 41719, 41721, 41722, 41723, 41725, 41727, 41729, 41730, 41731, 41735, 41736, 41739, 41740, 41743, 41745, 41746, 41747, 41749, 41751, 41754, 41759, 41760, 41762, 41763, 41764, 41766, 41772, 41773, 41774, 41775, 41776, 41777, 41778, 41804, 41810, 41812, 41815, 41817, 41819, 41821, 41822, 41824, 41825, 41826, 41828, 41831, 41832, 41833, 41834, 41835, 41836, 41837, 41838, 41839, 41840, 41843, 41844, 41845, 41847, 41848, 41849, 41855, 41858, 41859, 41861, 41862, 41901, 41902, 41903, 41904, 41905, 41906, 42001, 42002, 42003, 42020, 42021, 42022, 42023, 42024, 42025, 42027, 42028, 42029, 42031, 42032, 42033, 42035, 42036, 42037, 42038, 42039, 42040, 42041, 42044, 42045, 42046, 42047, 42048, 42049, 42050, 42051, 42053, 42054, 42055, 42056, 42058, 42060, 42061, 42063, 42064, 42066, 42069, 42070, 42071, 42076, 42078, 42079, 42081, 42082, 42083, 42084, 42085, 42086, 42087, 42088, 42101, 42102, 42103, 42104, 42120, 42122, 42123, 42124, 42127, 42128, 42129, 42130, 42131, 42133, 42134, 42135, 42140, 42141, 42142, 42150, 42151, 42152, 42153, 42154, 42156, 42157, 42159, 42160, 42163, 42164, 42166, 42167, 42170, 42171, 42201, 42202, 42203, 42204, 42206, 42207, 42209, 42210, 42211, 42214, 42215, 42216, 42217, 42219, 42220, 42221, 42223, 42232, 42234, 42235, 42236, 42240, 42241, 42251, 42252, 42254, 42256, 42257, 42259, 42261, 42262, 42265, 42266, 42267, 42270, 42273, 42274, 42275, 42276, 42280, 42283, 42285, 42286, 42287, 42288, 42301, 42302, 42303, 42304, 42320, 42321, 42322, 42323, 42324, 42325, 42326, 42327, 42328, 42330, 42332, 42333, 42334, 42337, 42338, 42339, 42343, 42344, 42345, 42347, 42348, 42349, 42350, 42351, 42352, 42354, 42355, 42356, 42361, 42364, 42365, 42366, 42367, 42368, 42369, 42370, 42371, 42372, 42374, 42375, 42376, 42377, 42378, 42402, 42403, 42404, 42406, 42408, 42409, 42410, 42411, 42413, 42419, 42420, 42431, 42436, 42437, 42440, 42441, 42442, 42444, 42445, 42450, 42451, 42452, 42453, 42455, 42456, 42457, 42458, 42459, 42460, 42461, 42462, 42463, 42464, 42501, 42502, 42503, 42516, 42518, 42519, 42528, 42533, 42539, 42541, 42544, 42553, 42558, 42564, 42565, 42566, 42567, 42602, 42603, 42629, 42631, 42632, 42633, 42634, 42635, 42638, 42642, 42647, 42649, 42653, 42701, 42702, 42711, 42712, 42713, 42715, 42716, 42717, 42718, 42719, 42720, 42721, 42722, 42724, 42726, 42728, 42729, 42731, 42732, 42733, 42735, 42740, 42741, 42742, 42743, 42746, 42748, 42749, 42753, 42754, 42755, 42757, 42758, 42759, 42761, 42762, 42764, 42765, 42776, 42782, 42783, 42784, 42786, 42788, 43001, 43002, 43003, 43004, 43005, 43006, 43007, 43008, 43009, 43010, 43011, 43013, 43014, 43015, 43016, 43017, 43018, 43019, 43021, 43022, 43023, 43025, 43026, 43027, 43028, 43029, 43030, 43031, 43032, 43033, 43035, 43036, 43037, 43040, 43041, 43044, 43045, 43046, 43047, 43048, 43050, 43054, 43055, 43056, 43058, 43060, 43061, 43062, 43064, 43065, 43066, 43067, 43068, 43070, 43071, 43072, 43073, 43074, 43076, 43077, 43078, 43080, 43081, 43082, 43083, 43084, 43085, 43086, 43093, 43098, 43101, 43102, 43103, 43105, 43106, 43107, 43109, 43110, 43111, 43112, 43113, 43115, 43116, 43117, 43119, 43123, 43125, 43126, 43127, 43128, 43130, 43135, 43136, 43137, 43138, 43140, 43142, 43143, 43144, 43145, 43146, 43147, 43148, 43149, 43150, 43151, 43152, 43153, 43154, 43155, 43156, 43157, 43158, 43160, 43162, 43163, 43164, 43196, 43198, 43199, 43201, 43202, 43203, 43204, 43205, 43206, 43207, 43209, 43210, 43211, 43212, 43213, 43214, 43215, 43216, 43217, 43218, 43219, 43220, 43221, 43222, 43223, 43224, 43226, 43227, 43228, 43229, 43230, 43231, 43232, 43234, 43235, 43236, 43240, 43251, 43260, 43265, 43266, 43268, 43270, 43271, 43272, 43279, 43287, 43291, 43299, 43301, 43302, 43306, 43307, 43310, 43311, 43314, 43315, 43316, 43317, 43318, 43319, 43320, 43321, 43322, 43323, 43324, 43325, 43326, 43330, 43331, 43332, 43333, 43334, 43335, 43336, 43337, 43338, 43340, 43341, 43342, 43343, 43344, 43345, 43346, 43347, 43348, 43349, 43350, 43351, 43356, 43357, 43358, 43359, 43360, 43402, 43403, 43406, 43407, 43408, 43410, 43412, 43413, 43414, 43416, 43420, 43430, 43431, 43432, 43433, 43434, 43435, 43436, 43437, 43438, 43439, 43440, 43441, 43442, 43443, 43445, 43446, 43447, 43449, 43450, 43451, 43452, 43456, 43457, 43458, 43460, 43462, 43463, 43464, 43465, 43466, 43467, 43468, 43469, 43501, 43502, 43504, 43505, 43506, 43510, 43511, 43512, 43515, 43516, 43517, 43518, 43519, 43520, 43521, 43522, 43523, 43524, 43525, 43526, 43527, 43528, 43529, 43530, 43531, 43532, 43533, 43534, 43535, 43536, 43537, 43540, 43541, 43542, 43543, 43545, 43547, 43548, 43549, 43550, 43551, 43552, 43553, 43554, 43555, 43556, 43557, 43558, 43560, 43565, 43566, 43567, 43569, 43570, 43571, 43601, 43602, 43603, 43604, 43605, 43606, 43607, 43608, 43609, 43610, 43611, 43612, 43613, 43614, 43615, 43616, 43617, 43618, 43619, 43620, 43623, 43624, 43635, 43652, 43653, 43654, 43655, 43656, 43657, 43659, 43660, 43661, 43666, 43667, 43681, 43682, 43697, 43699, 43701, 43702, 43711, 43713, 43716, 43717, 43718, 43719, 43720, 43721, 43722, 43723, 43724, 43725, 43727, 43728, 43730, 43731, 43732, 43733, 43734, 43735, 43736, 43738, 43739, 43740, 43746, 43747, 43748, 43749, 43750, 43752, 43754, 43755, 43756, 43757, 43758, 43759, 43760, 43761, 43762, 43764, 43766, 43767, 43768, 43771, 43772, 43773, 43777, 43778, 43779, 43780, 43782, 43783, 43786, 43787, 43788, 43789, 43791, 43793, 43802, 43803, 43804, 43805, 43811, 43812, 43821, 43822, 43824, 43828, 43830, 43832, 43836, 43837, 43840, 43842, 43843, 43844, 43845, 43901, 43902, 43903, 43905, 43906, 43907, 43908, 43909, 43910, 43912, 43913, 43914, 43915, 43916, 43917, 43920, 43925, 43926, 43927, 43928, 43930, 43931, 43932, 43933, 43934, 43935, 43937, 43938, 43939, 43940, 43941, 43942, 43943, 43944, 43945, 43946, 43947, 43948, 43950, 43951, 43952, 43953, 43961, 43962, 43963, 43964, 43966, 43967, 43968, 43970, 43971, 43972, 43973, 43974, 43976, 43977, 43981, 43983, 43984, 43985, 43986, 43988, 43989, 44001, 44003, 44004, 44005, 44010, 44011, 44012, 44017, 44021, 44022, 44023, 44024, 44026, 44028, 44030, 44032, 44033, 44035, 44036, 44039, 44040, 44041, 44044, 44045, 44046, 44047, 44048, 44049, 44050, 44052, 44053, 44054, 44055, 44056, 44057, 44060, 44061, 44062, 44064, 44065, 44067, 44068, 44070, 44072, 44073, 44074, 44076, 44077, 44080, 44081, 44082, 44084, 44085, 44086, 44087, 44088, 44089, 44090, 44092, 44093, 44094, 44095, 44096, 44097, 44099, 44101, 44102, 44103, 44104, 44105, 44106, 44107, 44108, 44109, 44110, 44111, 44112, 44113, 44114, 44115, 44116, 44117, 44118, 44119, 44120, 44121, 44122, 44123, 44124, 44125, 44126, 44127, 44128, 44129, 44130, 44131, 44132, 44133, 44134, 44135, 44136, 44137, 44138, 44139, 44140, 44141, 44142, 44143, 44144, 44145, 44146, 44147, 44149, 44177, 44178, 44179, 44181, 44184, 44185, 44186, 44188, 44189, 44190, 44191, 44192, 44193, 44194, 44195, 44197, 44198, 44199, 44201, 44202, 44203, 44210, 44211, 44212, 44214, 44215, 44216, 44217, 44221, 44222, 44223, 44224, 44230, 44231, 44232, 44233, 44234, 44235, 44236, 44237, 44238, 44240, 44241, 44242, 44243, 44250, 44251, 44253, 44254, 44255, 44256, 44258, 44260, 44262, 44264, 44265, 44266, 44270, 44272, 44273, 44274, 44275, 44276, 44278, 44280, 44281, 44282, 44285, 44286, 44287, 44288, 44301, 44302, 44303, 44304, 44305, 44306, 44307, 44308, 44309, 44310, 44311, 44312, 44313, 44314, 44315, 44316, 44317, 44319, 44320, 44321, 44322, 44325, 44326, 44328, 44333, 44334, 44372, 44393, 44396, 44397, 44398, 44399, 44401, 44402, 44403, 44404, 44405, 44406, 44408, 44410, 44411, 44412, 44413, 44415, 44416, 44417, 44418, 44420, 44422, 44423, 44424, 44425, 44427, 44428, 44429, 44430, 44431, 44432, 44436, 44437, 44438, 44439, 44440, 44441, 44442, 44443, 44444, 44445, 44446, 44449, 44450, 44451, 44452, 44453, 44454, 44455, 44460, 44470, 44471, 44473, 44481, 44482, 44483, 44484, 44485, 44486, 44487, 44488, 44490, 44491, 44492, 44493, 44501, 44502, 44503, 44504, 44505, 44506, 44507, 44509, 44510, 44511, 44512, 44513, 44514, 44515, 44555, 44598, 44599, 44601, 44606, 44607, 44608, 44609, 44610, 44611, 44612, 44613, 44614, 44615, 44617, 44618, 44619, 44620, 44621, 44622, 44624, 44625, 44626, 44627, 44628, 44629, 44630, 44631, 44632, 44633, 44634, 44636, 44637, 44638, 44639, 44640, 44641, 44643, 44644, 44645, 44646, 44647, 44648, 44650, 44651, 44652, 44653, 44654, 44656, 44657, 44659, 44660, 44661, 44662, 44663, 44665, 44666, 44667, 44669, 44670, 44671, 44672, 44675, 44676, 44677, 44678, 44679, 44680, 44681, 44682, 44683, 44685, 44687, 44688, 44689, 44690, 44691, 44693, 44695, 44697, 44699, 44701, 44702, 44703, 44704, 44705, 44706, 44707, 44708, 44709, 44710, 44711, 44712, 44714, 44718, 44720, 44721, 44730, 44735, 44750, 44760, 44767, 44798, 44799, 44801, 44802, 44803, 44804, 44805, 44807, 44809, 44811, 44813, 44814, 44815, 44816, 44817, 44818, 44820, 44822, 44824, 44825, 44826, 44827, 44828, 44830, 44833, 44836, 44837, 44838, 44839, 44840, 44841, 44842, 44843, 44844, 44845, 44846, 44847, 44848, 44849, 44850, 44851, 44853, 44854, 44855, 44856, 44857, 44859, 44860, 44861, 44862, 44864, 44865, 44866, 44867, 44870, 44871, 44874, 44875, 44878, 44880, 44881, 44882, 44883, 44887, 44888, 44889, 44890, 44901, 44902, 44903, 44904, 44905, 44906, 44907, 44999, 45001, 45002, 45003, 45004, 45005, 45011, 45012, 45013, 45014, 45015, 45018, 45020, 45023, 45025, 45026, 45030, 45032, 45033, 45034, 45036, 45039, 45040, 45041, 45042, 45043, 45044, 45050, 45051, 45052, 45053, 45054, 45055, 45056, 45061, 45062, 45063, 45064, 45065, 45066, 45067, 45068, 45069, 45070, 45071, 45073, 45099, 45101, 45102, 45103, 45105, 45106, 45107, 45110, 45111, 45112, 45113, 45114, 45115, 45118, 45119, 45120, 45121, 45122, 45123, 45130, 45131, 45132, 45133, 45135, 45138, 45140, 45142, 45144, 45145, 45146, 45147, 45148, 45150, 45152, 45153, 45154, 45155, 45156, 45157, 45158, 45159, 45160, 45162, 45164, 45165, 45166, 45167, 45168, 45169, 45171, 45172, 45174, 45176, 45177, 45201, 45202, 45203, 45204, 45205, 45206, 45207, 45208, 45209, 45210, 45211, 45212, 45213, 45214, 45215, 45216, 45217, 45218, 45219, 45220, 45221, 45222, 45223, 45224, 45225, 45226, 45227, 45228, 45229, 45230, 45231, 45232, 45233, 45234, 45235, 45236, 45237, 45238, 45239, 45240, 45241, 45242, 45243, 45244, 45245, 45246, 45247, 45248, 45249, 45250, 45251, 45252, 45253, 45254, 45255, 45258, 45262, 45263, 45264, 45267, 45268, 45269, 45270, 45271, 45273, 45274, 45275, 45277, 45280, 45296, 45298, 45299, 45301, 45302, 45303, 45304, 45305, 45306, 45307, 45308, 45309, 45310, 45311, 45312, 45314, 45315, 45316, 45317, 45318, 45319, 45320, 45321, 45322, 45323, 45324, 45325, 45326, 45327, 45328, 45330, 45331, 45332, 45333, 45334, 45335, 45336, 45337, 45338, 45339, 45340, 45341, 45342, 45343, 45344, 45345, 45346, 45347, 45348, 45349, 45350, 45351, 45352, 45353, 45354, 45356, 45358, 45359, 45360, 45361, 45362, 45363, 45365, 45367, 45368, 45369, 45370, 45371, 45372, 45373, 45374, 45377, 45378, 45380, 45381, 45382, 45383, 45384, 45385, 45387, 45388, 45389, 45390, 45401, 45402, 45403, 45404, 45405, 45406, 45407, 45408, 45409, 45410, 45412, 45413, 45414, 45415, 45416, 45417, 45418, 45419, 45420, 45422, 45423, 45424, 45426, 45427, 45428, 45429, 45430, 45431, 45432, 45433, 45434, 45435, 45437, 45439, 45440, 45441, 45448, 45449, 45454, 45458, 45459, 45463, 45469, 45470, 45475, 45479, 45481, 45482, 45490, 45501, 45502, 45503, 45504, 45505, 45506, 45601, 45612, 45613, 45614, 45616, 45617, 45618, 45619, 45620, 45621, 45622, 45623, 45624, 45628, 45629, 45630, 45631, 45633, 45634, 45636, 45638, 45640, 45642, 45643, 45644, 45645, 45646, 45647, 45648, 45650, 45651, 45652, 45653, 45654, 45656, 45657, 45658, 45659, 45660, 45661, 45662, 45663, 45669, 45671, 45672, 45673, 45674, 45675, 45677, 45678, 45679, 45680, 45681, 45682, 45683, 45684, 45685, 45686, 45687, 45688, 45690, 45692, 45693, 45694, 45695, 45696, 45697, 45698, 45699, 45701, 45710, 45711, 45712, 45713, 45714, 45715, 45716, 45717, 45719, 45720, 45721, 45723, 45724, 45727, 45729, 45732, 45734, 45735, 45739, 45740, 45741, 45742, 45743, 45744, 45745, 45746, 45750, 45760, 45761, 45764, 45766, 45767, 45768, 45769, 45770, 45771, 45772, 45773, 45775, 45776, 45777, 45778, 45779, 45780, 45781, 45782, 45783, 45784, 45786, 45787, 45788, 45789, 45801, 45802, 45804, 45805, 45806, 45807, 45808, 45809, 45810, 45812, 45813, 45814, 45815, 45816, 45817, 45819, 45820, 45821, 45822, 45826, 45827, 45828, 45830, 45831, 45832, 45833, 45835, 45836, 45837, 45838, 45839, 45840, 45841, 45843, 45844, 45845, 45846, 45848, 45849, 45850, 45851, 45853, 45854, 45855, 45856, 45858, 45859, 45860, 45861, 45862, 45863, 45864, 45865, 45866, 45867, 45868, 45869, 45870, 45871, 45872, 45873, 45874, 45875, 45876, 45877, 45879, 45880, 45881, 45882, 45883, 45884, 45885, 45886, 45887, 45888, 45889, 45890, 45891, 45893, 45894, 45895, 45896, 45897, 45898, 45899, 45944, 45999, 46001, 46011, 46012, 46013, 46014, 46015, 46016, 46017, 46018, 46030, 46031, 46032, 46033, 46034, 46035, 46036, 46038, 46039, 46040, 46041, 46044, 46045, 46046, 46047, 46048, 46049, 46050, 46051, 46052, 46055, 46056, 46057, 46058, 46060, 46061, 46063, 46064, 46065, 46067, 46068, 46069, 46070, 46071, 46072, 46074, 46075, 46076, 46077, 46082, 46102, 46103, 46104, 46105, 46106, 46107, 46110, 46111, 46112, 46113, 46114, 46115, 46117, 46118, 46120, 46121, 46122, 46123, 46124, 46125, 46126, 46127, 46128, 46129, 46130, 46131, 46133, 46135, 46140, 46142, 46143, 46144, 46146, 46147, 46148, 46149, 46150, 46151, 46154, 46155, 46156, 46157, 46158, 46160, 46161, 46162, 46163, 46164, 46165, 46166, 46167, 46168, 46170, 46171, 46172, 46173, 46175, 46176, 46180, 46181, 46182, 46183, 46184, 46186, 46201, 46202, 46203, 46204, 46205, 46206, 46207, 46208, 46209, 46211, 46214, 46216, 46217, 46218, 46219, 46220, 46221, 46222, 46223, 46224, 46225, 46226, 46227, 46228, 46229, 46230, 46231, 46234, 46235, 46236, 46237, 46239, 46240, 46241, 46242, 46244, 46247, 46249, 46250, 46251, 46253, 46254, 46255, 46256, 46259, 46260, 46266, 46268, 46274, 46275, 46277, 46278, 46280, 46282, 46283, 46285, 46290, 46291, 46295, 46296, 46298, 46301, 46302, 46303, 46304, 46307, 46308, 46310, 46311, 46312, 46319, 46320, 46321, 46322, 46323, 46324, 46325, 46327, 46340, 46341, 46342, 46345, 46346, 46347, 46348, 46349, 46350, 46352, 46355, 46356, 46360, 46361, 46365, 46366, 46368, 46371, 46372, 46373, 46374, 46375, 46376, 46377, 46379, 46380, 46381, 46382, 46383, 46384, 46385, 46390, 46391, 46392, 46393, 46394, 46401, 46402, 46403, 46404, 46405, 46406, 46407, 46408, 46409, 46410, 46411, 46501, 46502, 46504, 46506, 46507, 46508, 46510, 46511, 46513, 46514, 46515, 46516, 46517, 46524, 46526, 46527, 46528, 46530, 46531, 46532, 46534, 46536, 46537, 46538, 46539, 46540, 46542, 46543, 46544, 46545, 46546, 46550, 46552, 46553, 46554, 46555, 46556, 46561, 46562, 46563, 46565, 46566, 46567, 46570, 46571, 46572, 46573, 46574, 46580, 46581, 46582, 46590, 46595, 46601, 46604, 46612, 46613, 46614, 46615, 46616, 46617, 46619, 46620, 46624, 46626, 46628, 46629, 46634, 46635, 46637, 46660, 46680, 46699, 46701, 46702, 46703, 46704, 46705, 46706, 46710, 46711, 46713, 46714, 46720, 46721, 46723, 46725, 46730, 46731, 46732, 46733, 46737, 46738, 46740, 46741, 46742, 46743, 46745, 46746, 46747, 46748, 46750, 46755, 46759, 46760, 46761, 46763, 46764, 46765, 46766, 46767, 46769, 46770, 46771, 46772, 46773, 46774, 46776, 46777, 46778, 46779, 46780, 46781, 46782, 46783, 46784, 46785, 46786, 46787, 46788, 46789, 46791, 46792, 46793, 46794, 46795, 46796, 46797, 46798, 46799, 46801, 46802, 46803, 46804, 46805, 46806, 46807, 46808, 46809, 46814, 46815, 46816, 46818, 46819, 46825, 46835, 46845, 46850, 46851, 46852, 46853, 46854, 46855, 46856, 46857, 46858, 46859, 46860, 46861, 46862, 46863, 46864, 46865, 46866, 46867, 46868, 46869, 46885, 46895, 46896, 46897, 46898, 46899, 46901, 46902, 46903, 46904, 46910, 46911, 46912, 46913, 46914, 46915, 46916, 46917, 46919, 46920, 46921, 46922, 46923, 46926, 46928, 46929, 46930, 46931, 46932, 46933, 46935, 46936, 46937, 46938, 46939, 46940, 46941, 46942, 46943, 46945, 46946, 46947, 46950, 46951, 46952, 46953, 46957, 46958, 46959, 46960, 46961, 46962, 46965, 46967, 46968, 46970, 46971, 46974, 46975, 46977, 46978, 46979, 46980, 46982, 46984, 46985, 46986, 46987, 46988, 46989, 46990, 46991, 46992, 46994, 46995, 46996, 46998, 47001, 47003, 47006, 47010, 47011, 47012, 47016, 47017, 47018, 47019, 47020, 47021, 47022, 47023, 47024, 47025, 47030, 47031, 47032, 47033, 47034, 47035, 47036, 47037, 47038, 47039, 47040, 47041, 47042, 47043, 47060, 47102, 47104, 47106, 47107, 47108, 47110, 47111, 47112, 47114, 47115, 47116, 47117, 47118, 47119, 47120, 47122, 47123, 47124, 47125, 47126, 47129, 47130, 47131, 47132, 47133, 47134, 47135, 47136, 47137, 47138, 47139, 47140, 47141, 47142, 47143, 47144, 47145, 47146, 47147, 47150, 47151, 47160, 47161, 47162, 47163, 47164, 47165, 47166, 47167, 47170, 47172, 47174, 47175, 47177, 47199, 47201, 47202, 47203, 47220, 47223, 47224, 47225, 47226, 47227, 47228, 47229, 47230, 47231, 47232, 47234, 47235, 47236, 47240, 47243, 47244, 47245, 47246, 47247, 47249, 47250, 47260, 47261, 47262, 47263, 47264, 47265, 47270, 47272, 47273, 47274, 47280, 47281, 47282, 47283, 47302, 47303, 47304, 47305, 47306, 47307, 47308, 47320, 47322, 47324, 47325, 47326, 47327, 47330, 47331, 47334, 47335, 47336, 47337, 47338, 47339, 47340, 47341, 47342, 47344, 47345, 47346, 47348, 47351, 47352, 47353, 47354, 47355, 47356, 47357, 47358, 47359, 47360, 47361, 47362, 47366, 47367, 47368, 47369, 47370, 47371, 47373, 47374, 47375, 47380, 47381, 47382, 47383, 47384, 47385, 47386, 47387, 47388, 47390, 47392, 47393, 47394, 47396, 47401, 47402, 47403, 47404, 47405, 47406, 47407, 47408, 47420, 47421, 47424, 47426, 47427, 47429, 47430, 47431, 47432, 47433, 47434, 47435, 47436, 47437, 47438, 47439, 47441, 47443, 47445, 47446, 47448, 47449, 47451, 47452, 47453, 47454, 47455, 47456, 47457, 47458, 47459, 47460, 47462, 47463, 47464, 47465, 47467, 47468, 47469, 47470, 47471, 47490, 47501, 47512, 47513, 47514, 47515, 47516, 47519, 47520, 47521, 47522, 47523, 47524, 47525, 47527, 47528, 47529, 47531, 47532, 47535, 47536, 47537, 47541, 47542, 47545, 47546, 47547, 47549, 47550, 47551, 47552, 47553, 47556, 47557, 47558, 47561, 47562, 47564, 47567, 47568, 47573, 47574, 47575, 47576, 47577, 47578, 47579, 47580, 47581, 47584, 47585, 47586, 47588, 47590, 47591, 47596, 47597, 47598, 47601, 47610, 47611, 47612, 47613, 47614, 47615, 47616, 47617, 47618, 47619, 47620, 47629, 47630, 47631, 47633, 47634, 47635, 47637, 47638, 47639, 47640, 47647, 47648, 47649, 47654, 47660, 47665, 47666, 47670, 47683, 47701, 47702, 47703, 47704, 47705, 47706, 47708, 47710, 47711, 47712, 47713, 47714, 47715, 47716, 47719, 47720, 47721, 47722, 47724, 47725, 47727, 47728, 47730, 47731, 47732, 47733, 47734, 47735, 47736, 47737, 47739, 47740, 47741, 47744, 47747, 47750, 47801, 47802, 47803, 47804, 47805, 47807, 47808, 47809, 47811, 47812, 47813, 47814, 47830, 47831, 47832, 47833, 47834, 47836, 47837, 47838, 47840, 47841, 47842, 47845, 47846, 47847, 47848, 47849, 47850, 47851, 47852, 47853, 47854, 47855, 47856, 47857, 47858, 47859, 47860, 47861, 47862, 47863, 47864, 47865, 47866, 47868, 47869, 47870, 47871, 47872, 47874, 47875, 47876, 47878, 47879, 47880, 47881, 47882, 47884, 47885, 47901, 47902, 47903, 47904, 47905, 47906, 47907, 47909, 47916, 47917, 47918, 47920, 47921, 47922, 47923, 47924, 47925, 47926, 47928, 47929, 47930, 47932, 47933, 47934, 47935, 47936, 47937, 47938, 47939, 47940, 47941, 47942, 47943, 47944, 47946, 47948, 47949, 47950, 47951, 47952, 47954, 47955, 47957, 47958, 47959, 47960, 47962, 47963, 47964, 47965, 47966, 47967, 47968, 47969, 47970, 47971, 47974, 47975, 47977, 47978, 47980, 47981, 47982, 47983, 47984, 47986, 47987, 47988, 47989, 47990, 47991, 47992, 47993, 47994, 47995, 47996, 47997, 48001, 48002, 48003, 48004, 48005, 48006, 48007, 48009, 48012, 48014, 48015, 48017, 48021, 48022, 48023, 48025, 48026, 48027, 48028, 48030, 48032, 48034, 48035, 48036, 48037, 48038, 48039, 48040, 48041, 48042, 48043, 48044, 48045, 48046, 48047, 48048, 48049, 48050, 48051, 48054, 48059, 48060, 48061, 48062, 48063, 48064, 48065, 48066, 48067, 48068, 48069, 48070, 48071, 48072, 48073, 48074, 48075, 48076, 48079, 48080, 48081, 48082, 48083, 48084, 48085, 48086, 48088, 48089, 48090, 48091, 48092, 48093, 48094, 48095, 48096, 48097, 48098, 48099, 48101, 48103, 48104, 48105, 48106, 48107, 48108, 48109, 48110, 48111, 48112, 48113, 48114, 48115, 48116, 48117, 48118, 48120, 48121, 48122, 48123, 48124, 48125, 48126, 48127, 48128, 48130, 48131, 48133, 48134, 48135, 48136, 48137, 48138, 48139, 48140, 48141, 48143, 48144, 48145, 48146, 48150, 48151, 48152, 48153, 48154, 48157, 48158, 48159, 48160, 48161, 48162, 48164, 48165, 48166, 48167, 48169, 48170, 48173, 48174, 48175, 48176, 48177, 48178, 48179, 48180, 48182, 48183, 48184, 48185, 48186, 48187, 48188, 48189, 48190, 48191, 48192, 48195, 48197, 48198, 48201, 48202, 48203, 48204, 48205, 48206, 48207, 48208, 48209, 48210, 48211, 48212, 48213, 48214, 48215, 48216, 48217, 48218, 48219, 48220, 48221, 48222, 48223, 48224, 48225, 48226, 48227, 48228, 48229, 48230, 48231, 48232, 48233, 48234, 48235, 48236, 48237, 48238, 48239, 48240, 48242, 48243, 48244, 48255, 48260, 48264, 48265, 48266, 48267, 48268, 48269, 48272, 48275, 48277, 48278, 48279, 48288, 48301, 48302, 48303, 48304, 48306, 48307, 48308, 48309, 48310, 48311, 48312, 48313, 48314, 48315, 48316, 48317, 48318, 48320, 48321, 48322, 48323, 48324, 48325, 48326, 48327, 48328, 48329, 48330, 48331, 48332, 48333, 48334, 48335, 48336, 48340, 48341, 48342, 48343, 48346, 48347, 48348, 48350, 48353, 48356, 48357, 48359, 48360, 48361, 48362, 48363, 48366, 48367, 48370, 48371, 48374, 48375, 48376, 48377, 48380, 48381, 48382, 48383, 48386, 48387, 48390, 48391, 48393, 48397, 48398, 48401, 48410, 48411, 48412, 48413, 48414, 48415, 48416, 48417, 48418, 48419, 48420, 48421, 48422, 48423, 48426, 48427, 48428, 48429, 48430, 48432, 48433, 48434, 48435, 48436, 48437, 48438, 48439, 48440, 48441, 48442, 48444, 48445, 48446, 48449, 48450, 48451, 48453, 48454, 48455, 48456, 48457, 48458, 48460, 48461, 48462, 48463, 48464, 48465, 48466, 48467, 48468, 48469, 48470, 48471, 48472, 48473, 48475, 48476, 48501, 48502, 48503, 48504, 48505, 48506, 48507, 48509, 48519, 48529, 48531, 48532, 48550, 48551, 48552, 48553, 48554, 48555, 48556, 48557, 48559, 48601, 48602, 48603, 48604, 48605, 48606, 48607, 48608, 48609, 48610, 48611, 48612, 48613, 48614, 48615, 48616, 48617, 48618, 48619, 48620, 48621, 48622, 48623, 48624, 48625, 48626, 48627, 48628, 48629, 48630, 48631, 48632, 48633, 48634, 48635, 48636, 48637, 48640, 48641, 48642, 48647, 48649, 48650, 48651, 48652, 48653, 48654, 48655, 48656, 48657, 48658, 48659, 48661, 48662, 48663, 48667, 48670, 48674, 48686, 48701, 48703, 48705, 48706, 48707, 48708, 48710, 48720, 48721, 48722, 48723, 48724, 48725, 48726, 48727, 48728, 48729, 48730, 48731, 48732, 48733, 48734, 48735, 48736, 48737, 48738, 48739, 48740, 48741, 48742, 48743, 48744, 48745, 48746, 48747, 48748, 48749, 48750, 48754, 48755, 48756, 48757, 48758, 48759, 48760, 48761, 48762, 48763, 48764, 48765, 48766, 48767, 48768, 48769, 48770, 48787, 48801, 48802, 48804, 48805, 48806, 48807, 48808, 48809, 48811, 48812, 48813, 48815, 48816, 48817, 48818, 48819, 48820, 48821, 48822, 48823, 48824, 48825, 48826, 48827, 48829, 48830, 48831, 48832, 48833, 48834, 48835, 48836, 48837, 48838, 48840, 48841, 48842, 48843, 48844, 48845, 48846, 48847, 48848, 48849, 48850, 48851, 48852, 48853, 48854, 48856, 48857, 48858, 48859, 48860, 48861, 48862, 48863, 48864, 48865, 48866, 48867, 48870, 48871, 48872, 48873, 48874, 48875, 48876, 48877, 48878, 48879, 48880, 48881, 48882, 48883, 48884, 48885, 48886, 48887, 48888, 48889, 48890, 48891, 48892, 48893, 48894, 48895, 48896, 48897, 48901, 48906, 48907, 48908, 48909, 48910, 48911, 48912, 48913, 48915, 48916, 48917, 48918, 48919, 48921, 48922, 48924, 48929, 48930, 48933, 48937, 48950, 48951, 48956, 48980, 49001, 49002, 49003, 49004, 49005, 49006, 49007, 49008, 49009, 49010, 49011, 49012, 49013, 49014, 49015, 49016, 49017, 49018, 49019, 49020, 49021, 49022, 49023, 49024, 49026, 49027, 49028, 49029, 49030, 49031, 49032, 49033, 49034, 49035, 49036, 49038, 49039, 49040, 49041, 49042, 49043, 49045, 49046, 49047, 49048, 49050, 49051, 49052, 49053, 49055, 49056, 49057, 49058, 49060, 49061, 49062, 49063, 49064, 49065, 49066, 49067, 49068, 49069, 49070, 49071, 49072, 49073, 49074, 49075, 49076, 49077, 49078, 49079, 49080, 49081, 49082, 49083, 49084, 49085, 49087, 49088, 49089, 49090, 49091, 49092, 49093, 49094, 49095, 49096, 49097, 49098, 49099, 49101, 49102, 49103, 49104, 49106, 49107, 49111, 49112, 49113, 49115, 49116, 49117, 49119, 49120, 49121, 49125, 49126, 49127, 49128, 49129, 49130, 49201, 49202, 49203, 49204, 49220, 49221, 49224, 49227, 49228, 49229, 49230, 49232, 49233, 49234, 49235, 49236, 49237, 49238, 49239, 49240, 49241, 49242, 49245, 49246, 49247, 49248, 49249, 49250, 49251, 49252, 49253, 49254, 49255, 49256, 49257, 49258, 49259, 49261, 49262, 49263, 49264, 49265, 49266, 49267, 49268, 49269, 49270, 49271, 49272, 49274, 49275, 49276, 49277, 49278, 49279, 49280, 49281, 49282, 49283, 49284, 49285, 49286, 49287, 49288, 49289, 49301, 49302, 49303, 49304, 49305, 49306, 49307, 49309, 49310, 49311, 49312, 49314, 49315, 49316, 49317, 49318, 49319, 49320, 49321, 49322, 49323, 49325, 49326, 49327, 49328, 49329, 49330, 49331, 49332, 49333, 49335, 49336, 49337, 49338, 49339, 49340, 49341, 49342, 49343, 49344, 49345, 49346, 49347, 49348, 49349, 49351, 49355, 49356, 49357, 49401, 49402, 49403, 49404, 49405, 49406, 49408, 49409, 49410, 49411, 49412, 49413, 49415, 49416, 49417, 49418, 49419, 49420, 49421, 49422, 49423, 49424, 49425, 49426, 49427, 49428, 49429, 49430, 49431, 49434, 49435, 49436, 49437, 49440, 49441, 49442, 49443, 49444, 49445, 49446, 49448, 49449, 49450, 49451, 49452, 49453, 49454, 49455, 49456, 49457, 49458, 49459, 49460, 49461, 49463, 49464, 49468, 49501, 49502, 49503, 49504, 49505, 49506, 49507, 49508, 49509, 49510, 49512, 49514, 49515, 49516, 49518, 49523, 49525, 49530, 49544, 49546, 49548, 49550, 49555, 49560, 49588, 49599, 49601, 49610, 49611, 49612, 49613, 49614, 49615, 49616, 49617, 49618, 49619, 49620, 49621, 49622, 49623, 49625, 49626, 49627, 49628, 49629, 49630, 49631, 49632, 49633, 49634, 49635, 49636, 49637, 49638, 49639, 49640, 49642, 49643, 49644, 49645, 49646, 49648, 49649, 49650, 49651, 49653, 49654, 49655, 49656, 49657, 49659, 49660, 49663, 49664, 49665, 49666, 49667, 49668, 49670, 49673, 49674, 49675, 49676, 49677, 49679, 49680, 49682, 49683, 49684, 49685, 49686, 49688, 49689, 49690, 49696, 49701, 49705, 49706, 49707, 49709, 49710, 49711, 49712, 49713, 49715, 49716, 49717, 49718, 49719, 49720, 49721, 49722, 49723, 49724, 49725, 49726, 49727, 49728, 49729, 49730, 49733, 49734, 49735, 49736, 49737, 49738, 49739, 49740, 49743, 49744, 49745, 49746, 49747, 49748, 49749, 49751, 49752, 49753, 49755, 49756, 49757, 49759, 49760, 49761, 49762, 49764, 49765, 49766, 49768, 49769, 49770, 49774, 49775, 49776, 49777, 49778, 49779, 49780, 49781, 49782, 49783, 49784, 49785, 49786, 49788, 49790, 49791, 49792, 49793, 49795, 49796, 49797, 49799, 49801, 49802, 49805, 49806, 49807, 49808, 49812, 49813, 49814, 49815, 49816, 49817, 49818, 49819, 49820, 49821, 49822, 49825, 49826, 49827, 49829, 49831, 49833, 49834, 49835, 49836, 49837, 49838, 49839, 49840, 49841, 49845, 49847, 49848, 49849, 49852, 49853, 49854, 49855, 49858, 49861, 49862, 49863, 49864, 49865, 49866, 49868, 49870, 49871, 49872, 49873, 49874, 49876, 49877, 49878, 49879, 49880, 49881, 49883, 49884, 49885, 49886, 49887, 49891, 49892, 49893, 49894, 49895, 49896, 49901, 49902, 49903, 49905, 49908, 49910, 49911, 49912, 49913, 49915, 49916, 49917, 49918, 49919, 49920, 49921, 49922, 49925, 49927, 49929, 49930, 49931, 49934, 49935, 49938, 49942, 49945, 49946, 49947, 49948, 49950, 49952, 49953, 49955, 49958, 49959, 49960, 49961, 49962, 49963, 49964, 49965, 49967, 49968, 49969, 49970, 49971, 50001, 50002, 50003, 50005, 50006, 50007, 50008, 50009, 50010, 50011, 50012, 50013, 50014, 50015, 50020, 50021, 50022, 50025, 50026, 50027, 50028, 50029, 50031, 50032, 50033, 50034, 50035, 50036, 50037, 50038, 50039, 50040, 50041, 50042, 50043, 50044, 50046, 50047, 50048, 50049, 50050, 50051, 50052, 50054, 50055, 50056, 50057, 50058, 50059, 50060, 50061, 50062, 50063, 50064, 50065, 50066, 50067, 50068, 50069, 50070, 50071, 50072, 50073, 50074, 50075, 50076, 50078, 50101, 50102, 50103, 50104, 50105, 50106, 50107, 50108, 50109, 50110, 50111, 50112, 50115, 50116, 50117, 50118, 50119, 50120, 50122, 50123, 50124, 50125, 50126, 50127, 50128, 50129, 50130, 50131, 50132, 50133, 50134, 50135, 50136, 50137, 50138, 50139, 50140, 50141, 50142, 50143, 50144, 50145, 50146, 50147, 50148, 50149, 50150, 50151, 50152, 50153, 50154, 50155, 50156, 50157, 50158, 50160, 50161, 50162, 50163, 50164, 50165, 50166, 50167, 50168, 50169, 50170, 50171, 50173, 50174, 50177, 50197, 50198, 50201, 50206, 50207, 50208, 50210, 50211, 50212, 50213, 50214, 50216, 50217, 50218, 50219, 50220, 50222, 50223, 50225, 50226, 50227, 50228, 50229, 50230, 50231, 50232, 50233, 50234, 50235, 50236, 50237, 50238, 50239, 50240, 50241, 50242, 50243, 50244, 50246, 50247, 50248, 50249, 50250, 50251, 50252, 50254, 50255, 50256, 50257, 50258, 50259, 50261, 50262, 50263, 50264, 50265, 50266, 50268, 50269, 50271, 50272, 50273, 50274, 50275, 50276, 50277, 50278, 50301, 50302, 50303, 50304, 50305, 50306, 50307, 50308, 50309, 50310, 50311, 50312, 50313, 50314, 50315, 50316, 50317, 50318, 50319, 50320, 50321, 50322, 50323, 50325, 50327, 50328, 50329, 50330, 50331, 50332, 50333, 50334, 50335, 50336, 50338, 50339, 50340, 50347, 50350, 50359, 50360, 50361, 50362, 50363, 50364, 50367, 50368, 50369, 50380, 50381, 50391, 50392, 50393, 50394, 50395, 50396, 50397, 50398, 50401, 50402, 50420, 50421, 50423, 50424, 50426, 50427, 50428, 50430, 50431, 50432, 50433, 50434, 50435, 50436, 50438, 50439, 50440, 50441, 50444, 50446, 50447, 50448, 50449, 50450, 50451, 50452, 50453, 50454, 50455, 50456, 50457, 50458, 50459, 50460, 50461, 50464, 50465, 50466, 50467, 50468, 50469, 50470, 50471, 50472, 50473, 50475, 50476, 50477, 50478, 50479, 50480, 50481, 50482, 50483, 50484, 50501, 50510, 50511, 50514, 50515, 50516, 50517, 50518, 50519, 50520, 50521, 50522, 50523, 50524, 50525, 50526, 50527, 50528, 50529, 50530, 50531, 50532, 50533, 50535, 50536, 50538, 50539, 50540, 50541, 50542, 50543, 50544, 50545, 50546, 50548, 50551, 50552, 50554, 50556, 50557, 50558, 50559, 50560, 50561, 50562, 50563, 50565, 50566, 50567, 50568, 50569, 50570, 50571, 50573, 50574, 50575, 50576, 50577, 50578, 50579, 50581, 50582, 50583, 50585, 50586, 50588, 50590, 50591, 50592, 50593, 50594, 50595, 50597, 50598, 50599, 50601, 50602, 50603, 50604, 50605, 50606, 50607, 50608, 50609, 50611, 50612, 50613, 50614, 50616, 50619, 50620, 50621, 50622, 50623, 50624, 50625, 50626, 50627, 50628, 50629, 50630, 50631, 50632, 50633, 50634, 50635, 50636, 50638, 50641, 50642, 50643, 50644, 50645, 50647, 50648, 50649, 50650, 50651, 50652, 50653, 50654, 50655, 50657, 50658, 50659, 50660, 50661, 50662, 50664, 50665, 50666, 50667, 50668, 50669, 50670, 50671, 50672, 50673, 50674, 50675, 50676, 50677, 50680, 50681, 50682, 50701, 50702, 50703, 50704, 50706, 50707, 50799, 50801, 50830, 50831, 50833, 50835, 50836, 50837, 50839, 50840, 50841, 50842, 50843, 50845, 50846, 50847, 50848, 50849, 50851, 50853, 50854, 50857, 50858, 50859, 50860, 50861, 50862, 50863, 50864, 50936, 50940, 50947, 50950, 50980, 50981, 51001, 51002, 51003, 51004, 51005, 51006, 51007, 51008, 51009, 51010, 51011, 51012, 51014, 51015, 51016, 51017, 51018, 51019, 51020, 51022, 51023, 51024, 51025, 51026, 51027, 51028, 51029, 51030, 51031, 51033, 51034, 51035, 51036, 51037, 51038, 51039, 51040, 51041, 51044, 51045, 51046, 51047, 51048, 51049, 51050, 51051, 51052, 51053, 51054, 51055, 51056, 51058, 51059, 51060, 51061, 51062, 51063, 51101, 51102, 51103, 51104, 51105, 51106, 51108, 51109, 51111, 51201, 51230, 51231, 51232, 51234, 51235, 51237, 51238, 51239, 51240, 51241, 51242, 51243, 51244, 51245, 51246, 51247, 51248, 51249, 51250, 51301, 51330, 51331, 51333, 51334, 51338, 51340, 51341, 51342, 51343, 51344, 51345, 51346, 51347, 51349, 51350, 51351, 51354, 51355, 51357, 51358, 51360, 51363, 51364, 51365, 51366, 51401, 51430, 51431, 51432, 51433, 51436, 51439, 51440, 51441, 51442, 51443, 51444, 51445, 51446, 51447, 51448, 51449, 51450, 51451, 51452, 51453, 51454, 51455, 51458, 51459, 51460, 51461, 51462, 51463, 51465, 51466, 51467, 51501, 51502, 51503, 51510, 51520, 51521, 51523, 51525, 51526, 51527, 51528, 51529, 51530, 51531, 51532, 51533, 51534, 51535, 51536, 51537, 51540, 51541, 51542, 51543, 51544, 51545, 51546, 51548, 51549, 51550, 51551, 51552, 51553, 51554, 51555, 51556, 51557, 51558, 51559, 51560, 51561, 51562, 51563, 51564, 51565, 51566, 51570, 51571, 51572, 51573, 51574, 51575, 51576, 51577, 51578, 51579, 51591, 51593, 51601, 51602, 51603, 51630, 51631, 51632, 51636, 51637, 51638, 51639, 51640, 51645, 51646, 51647, 51648, 51649, 51650, 51651, 51652, 51653, 51654, 51656, 52001, 52002, 52003, 52004, 52030, 52031, 52032, 52033, 52035, 52036, 52037, 52038, 52039, 52040, 52041, 52042, 52043, 52044, 52045, 52046, 52047, 52048, 52049, 52050, 52052, 52053, 52054, 52055, 52056, 52057, 52060, 52064, 52065, 52066, 52068, 52069, 52070, 52071, 52072, 52073, 52074, 52075, 52076, 52077, 52078, 52079, 52099, 52101, 52132, 52133, 52134, 52135, 52136, 52140, 52141, 52142, 52144, 52146, 52147, 52149, 52151, 52154, 52155, 52156, 52157, 52158, 52159, 52160, 52161, 52162, 52163, 52164, 52165, 52166, 52168, 52169, 52170, 52171, 52172, 52175, 52201, 52202, 52203, 52204, 52205, 52206, 52207, 52208, 52209, 52210, 52211, 52212, 52213, 52214, 52215, 52216, 52217, 52218, 52219, 52220, 52221, 52222, 52223, 52224, 52225, 52226, 52227, 52228, 52229, 52231, 52232, 52233, 52235, 52236, 52237, 52240, 52241, 52242, 52243, 52244, 52245, 52246, 52247, 52248, 52249, 52251, 52252, 52253, 52254, 52255, 52257, 52301, 52302, 52305, 52306, 52307, 52308, 52309, 52310, 52312, 52313, 52314, 52315, 52316, 52317, 52318, 52319, 52320, 52321, 52322, 52323, 52324, 52325, 52326, 52327, 52328, 52329, 52330, 52332, 52333, 52334, 52335, 52336, 52337, 52338, 52339, 52340, 52341, 52342, 52344, 52345, 52346, 52347, 52348, 52349, 52350, 52351, 52352, 52353, 52354, 52355, 52356, 52358, 52359, 52361, 52362, 52401, 52402, 52403, 52404, 52405, 52406, 52407, 52408, 52409, 52410, 52411, 52497, 52498, 52499, 52501, 52530, 52531, 52533, 52534, 52535, 52536, 52537, 52538, 52540, 52542, 52543, 52544, 52548, 52549, 52550, 52551, 52552, 52553, 52554, 52555, 52556, 52557, 52560, 52561, 52562, 52563, 52565, 52566, 52567, 52568, 52569, 52570, 52571, 52572, 52573, 52574, 52576, 52577, 52580, 52581, 52583, 52584, 52585, 52586, 52588, 52590, 52591, 52593, 52594, 52595, 52601, 52619, 52620, 52621, 52623, 52624, 52625, 52626, 52627, 52630, 52631, 52632, 52635, 52637, 52638, 52639, 52640, 52641, 52642, 52644, 52645, 52646, 52647, 52648, 52649, 52650, 52651, 52652, 52653, 52654, 52655, 52656, 52657, 52658, 52659, 52660, 52701, 52720, 52721, 52722, 52726, 52727, 52728, 52729, 52730, 52731, 52732, 52733, 52736, 52737, 52738, 52739, 52742, 52745, 52746, 52747, 52748, 52749, 52750, 52751, 52752, 52753, 52754, 52755, 52756, 52757, 52758, 52759, 52760, 52761, 52765, 52766, 52767, 52768, 52769, 52771, 52772, 52773, 52774, 52776, 52777, 52778, 52801, 52802, 52803, 52804, 52805, 52806, 52807, 52808, 52809, 53001, 53002, 53003, 53004, 53005, 53006, 53007, 53008, 53010, 53011, 53012, 53013, 53014, 53015, 53016, 53017, 53018, 53019, 53020, 53021, 53022, 53023, 53024, 53026, 53027, 53029, 53031, 53032, 53033, 53034, 53035, 53036, 53037, 53038, 53039, 53040, 53042, 53044, 53045, 53046, 53047, 53048, 53049, 53050, 53051, 53052, 53056, 53057, 53058, 53059, 53060, 53061, 53062, 53063, 53064, 53065, 53066, 53069, 53070, 53072, 53073, 53074, 53075, 53076, 53078, 53079, 53080, 53081, 53082, 53083, 53085, 53086, 53088, 53089, 53090, 53091, 53092, 53093, 53094, 53095, 53097, 53098, 53099, 53101, 53102, 53103, 53104, 53105, 53108, 53109, 53110, 53114, 53115, 53118, 53119, 53120, 53121, 53122, 53125, 53126, 53127, 53128, 53129, 53130, 53132, 53137, 53138, 53139, 53140, 53141, 53142, 53143, 53144, 53146, 53147, 53148, 53149, 53150, 53151, 53152, 53153, 53154, 53156, 53157, 53158, 53159, 53167, 53168, 53170, 53171, 53172, 53176, 53177, 53178, 53179, 53181, 53182, 53183, 53184, 53185, 53186, 53187, 53188, 53189, 53190, 53191, 53192, 53194, 53195, 53201, 53202, 53203, 53204, 53205, 53206, 53207, 53208, 53209, 53210, 53211, 53212, 53213, 53214, 53215, 53216, 53217, 53218, 53219, 53220, 53221, 53222, 53223, 53224, 53225, 53226, 53227, 53228, 53233, 53234, 53235, 53237, 53259, 53263, 53267, 53268, 53270, 53274, 53277, 53278, 53280, 53281, 53284, 53285, 53288, 53290, 53293, 53295, 53401, 53402, 53403, 53404, 53405, 53406, 53407, 53408, 53490, 53501, 53502, 53503, 53504, 53505, 53506, 53507, 53508, 53510, 53511, 53512, 53515, 53516, 53517, 53518, 53520, 53521, 53522, 53523, 53525, 53526, 53527, 53528, 53529, 53530, 53531, 53532, 53533, 53534, 53535, 53536, 53537, 53538, 53540, 53541, 53542, 53543, 53544, 53545, 53546, 53547, 53549, 53550, 53551, 53553, 53554, 53555, 53556, 53557, 53558, 53559, 53560, 53561, 53562, 53563, 53565, 53566, 53569, 53570, 53571, 53572, 53573, 53574, 53575, 53576, 53577, 53578, 53579, 53580, 53581, 53582, 53583, 53584, 53585, 53586, 53587, 53588, 53589, 53590, 53591, 53593, 53594, 53595, 53596, 53597, 53598, 53599, 53701, 53702, 53703, 53704, 53705, 53706, 53707, 53708, 53709, 53710, 53711, 53713, 53714, 53715, 53716, 53717, 53718, 53719, 53725, 53726, 53744, 53777, 53778, 53779, 53780, 53782, 53783, 53784, 53785, 53786, 53787, 53788, 53789, 53790, 53791, 53792, 53793, 53794, 53801, 53802, 53803, 53804, 53805, 53806, 53807, 53808, 53809, 53810, 53811, 53812, 53813, 53816, 53817, 53818, 53820, 53821, 53824, 53825, 53826, 53827, 53901, 53910, 53911, 53913, 53916, 53917, 53919, 53920, 53922, 53923, 53924, 53925, 53926, 53927, 53928, 53929, 53930, 53931, 53932, 53933, 53934, 53935, 53936, 53937, 53939, 53940, 53941, 53942, 53943, 53944, 53946, 53947, 53948, 53949, 53950, 53951, 53952, 53953, 53954, 53955, 53956, 53957, 53958, 53959, 53960, 53961, 53962, 53963, 53964, 53965, 53968, 53969, 54001, 54002, 54003, 54004, 54005, 54006, 54007, 54009, 54010, 54011, 54012, 54013, 54014, 54015, 54016, 54017, 54020, 54021, 54022, 54023, 54024, 54025, 54026, 54027, 54028, 54082, 54101, 54102, 54103, 54104, 54106, 54107, 54110, 54111, 54112, 54113, 54114, 54115, 54119, 54120, 54121, 54123, 54124, 54125, 54126, 54127, 54128, 54129, 54130, 54131, 54135, 54136, 54137, 54138, 54139, 54140, 54141, 54143, 54149, 54150, 54151, 54152, 54153, 54154, 54155, 54156, 54157, 54159, 54160, 54161, 54162, 54165, 54166, 54169, 54170, 54171, 54173, 54174, 54175, 54177, 54180, 54182, 54201, 54202, 54203, 54204, 54205, 54207, 54208, 54209, 54210, 54211, 54212, 54213, 54214, 54215, 54216, 54217, 54220, 54221, 54226, 54227, 54228, 54229, 54230, 54232, 54234, 54235, 54240, 54241, 54245, 54246, 54247, 54301, 54302, 54303, 54304, 54305, 54306, 54307, 54308, 54311, 54313, 54324, 54344, 54401, 54402, 54403, 54404, 54405, 54406, 54407, 54408, 54409, 54410, 54411, 54412, 54413, 54414, 54415, 54416, 54417, 54418, 54420, 54421, 54422, 54423, 54424, 54425, 54426, 54427, 54428, 54429, 54430, 54432, 54433, 54434, 54435, 54436, 54437, 54439, 54440, 54441, 54442, 54443, 54444, 54446, 54447, 54448, 54449, 54450, 54451, 54452, 54454, 54455, 54456, 54457, 54458, 54459, 54460, 54462, 54463, 54464, 54465, 54466, 54467, 54469, 54470, 54471, 54472, 54473, 54474, 54475, 54476, 54479, 54480, 54481, 54484, 54485, 54486, 54487, 54488, 54489, 54490, 54491, 54492, 54493, 54494, 54495, 54498, 54499, 54501, 54511, 54512, 54513, 54514, 54515, 54517, 54519, 54520, 54521, 54524, 54525, 54526, 54527, 54529, 54530, 54531, 54532, 54534, 54536, 54537, 54538, 54539, 54540, 54541, 54542, 54543, 54545, 54546, 54547, 54548, 54550, 54552, 54554, 54555, 54556, 54557, 54558, 54559, 54560, 54561, 54562, 54563, 54564, 54565, 54566, 54568, 54601, 54602, 54603, 54610, 54611, 54612, 54613, 54614, 54615, 54616, 54618, 54619, 54620, 54621, 54622, 54623, 54624, 54625, 54626, 54627, 54628, 54629, 54630, 54631, 54632, 54634, 54635, 54636, 54637, 54638, 54639, 54640, 54641, 54642, 54643, 54644, 54645, 54646, 54648, 54649, 54650, 54651, 54652, 54653, 54654, 54655, 54656, 54657, 54658, 54659, 54660, 54661, 54662, 54664, 54665, 54666, 54667, 54669, 54670, 54701, 54702, 54703, 54720, 54721, 54722, 54723, 54724, 54725, 54726, 54727, 54728, 54729, 54730, 54731, 54732, 54733, 54734, 54735, 54736, 54737, 54738, 54739, 54740, 54741, 54742, 54743, 54744, 54745, 54746, 54747, 54748, 54749, 54750, 54751, 54754, 54755, 54756, 54757, 54758, 54759, 54760, 54761, 54762, 54763, 54764, 54765, 54766, 54767, 54768, 54769, 54770, 54771, 54772, 54773, 54774, 54801, 54805, 54806, 54810, 54812, 54813, 54814, 54816, 54817, 54818, 54819, 54820, 54821, 54822, 54824, 54826, 54827, 54828, 54829, 54830, 54832, 54834, 54835, 54836, 54837, 54838, 54839, 54840, 54841, 54842, 54843, 54844, 54845, 54846, 54847, 54848, 54849, 54850, 54851, 54853, 54854, 54855, 54856, 54857, 54858, 54859, 54861, 54862, 54864, 54865, 54867, 54868, 54870, 54871, 54872, 54873, 54874, 54875, 54876, 54880, 54888, 54889, 54890, 54891, 54893, 54895, 54896, 54901, 54902, 54903, 54904, 54906, 54909, 54911, 54912, 54913, 54914, 54915, 54919, 54921, 54922, 54923, 54926, 54927, 54928, 54929, 54930, 54931, 54932, 54933, 54934, 54935, 54936, 54937, 54940, 54941, 54942, 54943, 54944, 54945, 54946, 54947, 54948, 54949, 54950, 54951, 54952, 54956, 54957, 54960, 54961, 54962, 54963, 54964, 54965, 54966, 54967, 54968, 54969, 54970, 54971, 54974, 54975, 54976, 54977, 54978, 54979, 54980, 54981, 54982, 54983, 54984, 54985, 54986, 54990, 55001, 55002, 55003, 55005, 55006, 55007, 55008, 55009, 55010, 55011, 55012, 55013, 55014, 55016, 55017, 55018, 55019, 55020, 55021, 55024, 55025, 55026, 55027, 55029, 55030, 55031, 55032, 55033, 55036, 55037, 55038, 55040, 55041, 55042, 55043, 55044, 55045, 55046, 55047, 55049, 55051, 55052, 55053, 55054, 55055, 55056, 55057, 55060, 55063, 55065, 55066, 55067, 55068, 55069, 55070, 55071, 55072, 55073, 55074, 55075, 55076, 55077, 55078, 55079, 55080, 55082, 55083, 55084, 55085, 55087, 55088, 55089, 55090, 55092, 55101, 55102, 55103, 55104, 55105, 55106, 55107, 55108, 55109, 55110, 55111, 55112, 55113, 55114, 55115, 55116, 55117, 55118, 55119, 55120, 55121, 55122, 55123, 55124, 55125, 55126, 55127, 55128, 55129, 55133, 55144, 55145, 55146, 55150, 55155, 55161, 55164, 55165, 55166, 55168, 55169, 55170, 55171, 55172, 55175, 55177, 55182, 55187, 55188, 55190, 55191, 55301, 55302, 55303, 55304, 55305, 55306, 55307, 55308, 55309, 55310, 55311, 55312, 55313, 55314, 55315, 55316, 55317, 55318, 55319, 55320, 55321, 55322, 55323, 55324, 55325, 55327, 55328, 55329, 55330, 55331, 55332, 55333, 55334, 55335, 55336, 55337, 55338, 55339, 55340, 55341, 55342, 55343, 55344, 55345, 55346, 55347, 55348, 55349, 55350, 55352, 55353, 55354, 55355, 55356, 55357, 55358, 55359, 55360, 55361, 55362, 55363, 55364, 55365, 55366, 55367, 55368, 55369, 55370, 55371, 55372, 55373, 55374, 55375, 55376, 55377, 55378, 55379, 55380, 55381, 55382, 55383, 55384, 55385, 55386, 55387, 55388, 55389, 55390, 55391, 55392, 55393, 55394, 55395, 55396, 55397, 55398, 55399, 55401, 55402, 55403, 55404, 55405, 55406, 55407, 55408, 55409, 55410, 55411, 55412, 55413, 55414, 55415, 55416, 55417, 55418, 55419, 55420, 55421, 55422, 55423, 55424, 55425, 55426, 55427, 55428, 55429, 55430, 55431, 55432, 55433, 55434, 55435, 55436, 55437, 55438, 55439, 55440, 55441, 55442, 55443, 55444, 55445, 55446, 55447, 55448, 55449, 55450, 55454, 55455, 55458, 55459, 55460, 55468, 55470, 55472, 55473, 55474, 55478, 55479, 55480, 55483, 55484, 55485, 55486, 55487, 55488, 55550, 55551, 55552, 55553, 55554, 55555, 55556, 55557, 55558, 55559, 55560, 55561, 55562, 55563, 55564, 55565, 55566, 55567, 55568, 55569, 55570, 55571, 55572, 55573, 55574, 55575, 55576, 55577, 55578, 55579, 55580, 55581, 55582, 55583, 55584, 55585, 55586, 55587, 55588, 55589, 55590, 55591, 55592, 55593, 55594, 55595, 55596, 55597, 55598, 55599, 55601, 55602, 55603, 55604, 55605, 55606, 55607, 55609, 55612, 55613, 55614, 55615, 55616, 55701, 55702, 55703, 55704, 55705, 55706, 55707, 55708, 55709, 55710, 55711, 55712, 55713, 55716, 55717, 55718, 55719, 55720, 55721, 55722, 55723, 55724, 55725, 55726, 55730, 55731, 55732, 55733, 55734, 55735, 55736, 55738, 55741, 55742, 55744, 55745, 55746, 55747, 55748, 55749, 55750, 55751, 55752, 55753, 55756, 55757, 55758, 55760, 55763, 55764, 55765, 55766, 55767, 55768, 55769, 55771, 55772, 55775, 55777, 55779, 55780, 55781, 55782, 55783, 55784, 55785, 55786, 55787, 55790, 55791, 55792, 55793, 55795, 55796, 55797, 55798, 55801, 55802, 55803, 55804, 55805, 55806, 55807, 55808, 55810, 55811, 55812, 55814, 55815, 55816, 55901, 55902, 55903, 55904, 55905, 55906, 55909, 55910, 55912, 55917, 55918, 55919, 55920, 55921, 55922, 55923, 55924, 55925, 55926, 55927, 55929, 55931, 55932, 55933, 55934, 55935, 55936, 55939, 55940, 55941, 55942, 55943, 55944, 55945, 55946, 55947, 55949, 55950, 55951, 55952, 55953, 55954, 55955, 55956, 55957, 55959, 55960, 55961, 55962, 55963, 55964, 55965, 55967, 55968, 55969, 55970, 55971, 55972, 55973, 55974, 55975, 55976, 55977, 55979, 55981, 55982, 55983, 55985, 55987, 55988, 55990, 55991, 55992, 56001, 56002, 56003, 56006, 56007, 56009, 56010, 56011, 56013, 56014, 56016, 56017, 56019, 56020, 56021, 56022, 56023, 56024, 56025, 56026, 56027, 56028, 56029, 56030, 56031, 56032, 56033, 56034, 56035, 56036, 56037, 56039, 56041, 56042, 56043, 56044, 56045, 56046, 56047, 56048, 56050, 56051, 56052, 56054, 56055, 56056, 56057, 56058, 56060, 56062, 56063, 56064, 56065, 56068, 56069, 56071, 56072, 56073, 56074, 56075, 56076, 56078, 56080, 56081, 56082, 56083, 56084, 56085, 56087, 56088, 56089, 56090, 56091, 56093, 56096, 56097, 56098, 56101, 56110, 56111, 56113, 56114, 56115, 56116, 56117, 56118, 56119, 56120, 56121, 56122, 56123, 56125, 56127, 56128, 56129, 56131, 56132, 56134, 56136, 56137, 56138, 56139, 56140, 56141, 56142, 56143, 56144, 56145, 56146, 56147, 56149, 56150, 56151, 56152, 56153, 56155, 56156, 56157, 56158, 56159, 56160, 56161, 56162, 56164, 56165, 56166, 56167, 56168, 56169, 56170, 56171, 56172, 56173, 56174, 56175, 56176, 56177, 56178, 56180, 56181, 56183, 56185, 56186, 56187, 56201, 56207, 56208, 56209, 56210, 56211, 56212, 56214, 56215, 56216, 56218, 56219, 56220, 56221, 56222, 56223, 56224, 56225, 56226, 56227, 56228, 56229, 56230, 56231, 56232, 56235, 56236, 56237, 56239, 56240, 56241, 56243, 56244, 56245, 56246, 56248, 56249, 56251, 56252, 56253, 56255, 56256, 56257, 56258, 56260, 56262, 56263, 56264, 56265, 56266, 56267, 56270, 56271, 56273, 56274, 56276, 56277, 56278, 56279, 56280, 56281, 56282, 56283, 56284, 56285, 56287, 56288, 56289, 56291, 56292, 56293, 56294, 56295, 56296, 56297, 56301, 56302, 56303, 56304, 56307, 56308, 56309, 56310, 56311, 56312, 56313, 56314, 56315, 56316, 56317, 56318, 56319, 56320, 56321, 56323, 56324, 56325, 56326, 56327, 56328, 56329, 56330, 56331, 56332, 56333, 56334, 56335, 56336, 56338, 56339, 56340, 56341, 56342, 56343, 56344, 56345, 56347, 56349, 56350, 56352, 56353, 56354, 56355, 56356, 56357, 56358, 56359, 56360, 56361, 56362, 56363, 56364, 56367, 56368, 56369, 56371, 56372, 56373, 56374, 56375, 56376, 56377, 56378, 56379, 56381, 56382, 56384, 56385, 56386, 56387, 56388, 56389, 56393, 56395, 56396, 56397, 56398, 56399, 56401, 56425, 56430, 56431, 56433, 56434, 56435, 56436, 56437, 56438, 56440, 56441, 56442, 56443, 56444, 56446, 56447, 56448, 56449, 56450, 56452, 56453, 56455, 56456, 56458, 56459, 56461, 56464, 56465, 56466, 56467, 56468, 56469, 56470, 56472, 56473, 56474, 56475, 56477, 56478, 56479, 56481, 56482, 56484, 56501, 56502, 56510, 56511, 56513, 56514, 56515, 56516, 56517, 56518, 56519, 56520, 56521, 56522, 56523, 56524, 56525, 56527, 56528, 56529, 56531, 56533, 56534, 56535, 56536, 56537, 56538, 56540, 56541, 56542, 56543, 56544, 56545, 56546, 56547, 56548, 56549, 56550, 56551, 56552, 56553, 56554, 56556, 56557, 56560, 56561, 56562, 56563, 56565, 56566, 56567, 56568, 56569, 56570, 56571, 56572, 56573, 56574, 56575, 56576, 56577, 56578, 56579, 56580, 56581, 56583, 56584, 56585, 56586, 56587, 56588, 56589, 56590, 56591, 56592, 56593, 56594, 56601, 56619, 56621, 56623, 56626, 56627, 56628, 56629, 56630, 56631, 56633, 56634, 56636, 56637, 56639, 56641, 56644, 56646, 56647, 56649, 56650, 56651, 56652, 56653, 56654, 56655, 56657, 56658, 56659, 56660, 56661, 56662, 56663, 56666, 56667, 56668, 56669, 56670, 56671, 56672, 56673, 56676, 56678, 56679, 56680, 56681, 56682, 56683, 56684, 56685, 56686, 56687, 56688, 56701, 56710, 56711, 56712, 56713, 56714, 56715, 56716, 56720, 56721, 56722, 56723, 56724, 56725, 56726, 56727, 56728, 56729, 56731, 56732, 56733, 56734, 56735, 56736, 56737, 56738, 56740, 56741, 56742, 56744, 56748, 56750, 56751, 56754, 56755, 56756, 56757, 56758, 56759, 56760, 56761, 56762, 56763, 57001, 57002, 57003, 57004, 57005, 57006, 57007, 57010, 57012, 57013, 57014, 57015, 57016, 57017, 57018, 57020, 57021, 57022, 57024, 57025, 57026, 57027, 57028, 57029, 57030, 57031, 57032, 57033, 57034, 57035, 57036, 57037, 57038, 57039, 57040, 57041, 57042, 57043, 57044, 57045, 57046, 57047, 57048, 57049, 57050, 57051, 57052, 57053, 57054, 57055, 57056, 57057, 57058, 57059, 57061, 57062, 57063, 57064, 57065, 57066, 57067, 57068, 57069, 57070, 57071, 57072, 57073, 57075, 57076, 57077, 57078, 57079, 57101, 57103, 57104, 57105, 57106, 57107, 57108, 57109, 57110, 57115, 57117, 57118, 57186, 57188, 57189, 57192, 57193, 57194, 57195, 57196, 57197, 57198, 57201, 57202, 57212, 57213, 57214, 57216, 57217, 57218, 57219, 57220, 57221, 57223, 57224, 57225, 57226, 57227, 57231, 57232, 57233, 57234, 57235, 57236, 57237, 57238, 57239, 57241, 57242, 57243, 57244, 57245, 57246, 57247, 57248, 57249, 57251, 57252, 57253, 57255, 57256, 57257, 57258, 57259, 57260, 57261, 57262, 57263, 57264, 57265, 57266, 57268, 57269, 57270, 57271, 57272, 57273, 57274, 57276, 57278, 57279, 57301, 57311, 57312, 57313, 57314, 57315, 57317, 57319, 57321, 57322, 57323, 57324, 57325, 57326, 57328, 57329, 57330, 57331, 57332, 57334, 57335, 57337, 57339, 57340, 57341, 57342, 57344, 57345, 57346, 57348, 57349, 57350, 57353, 57354, 57355, 57356, 57357, 57358, 57359, 57361, 57362, 57363, 57364, 57365, 57366, 57367, 57368, 57369, 57370, 57371, 57373, 57374, 57375, 57376, 57379, 57380, 57381, 57382, 57383, 57384, 57385, 57386, 57399, 57401, 57402, 57420, 57421, 57422, 57424, 57426, 57427, 57428, 57429, 57430, 57432, 57433, 57434, 57435, 57436, 57437, 57438, 57439, 57440, 57441, 57442, 57445, 57446, 57448, 57449, 57450, 57451, 57452, 57454, 57455, 57456, 57457, 57460, 57461, 57462, 57465, 57466, 57467, 57468, 57469, 57470, 57471, 57472, 57473, 57474, 57475, 57476, 57477, 57479, 57481, 57501, 57520, 57521, 57522, 57523, 57526, 57528, 57529, 57531, 57532, 57533, 57534, 57536, 57537, 57538, 57540, 57541, 57542, 57543, 57544, 57547, 57548, 57551, 57552, 57553, 57555, 57557, 57559, 57560, 57562, 57563, 57564, 57566, 57567, 57568, 57569, 57570, 57571, 57572, 57574, 57576, 57577, 57578, 57579, 57580, 57584, 57585, 57601, 57620, 57621, 57622, 57623, 57625, 57626, 57628, 57629, 57630, 57631, 57632, 57633, 57634, 57636, 57638, 57639, 57640, 57641, 57642, 57643, 57644, 57645, 57646, 57647, 57648, 57649, 57650, 57651, 57652, 57653, 57656, 57657, 57658, 57659, 57660, 57661, 57701, 57702, 57703, 57706, 57709, 57714, 57716, 57717, 57718, 57719, 57720, 57722, 57724, 57725, 57729, 57730, 57732, 57735, 57736, 57737, 57738, 57741, 57742, 57744, 57745, 57747, 57748, 57750, 57751, 57752, 57754, 57755, 57756, 57758, 57759, 57760, 57761, 57762, 57763, 57764, 57765, 57766, 57767, 57769, 57770, 57772, 57773, 57774, 57775, 57776, 57777, 57778, 57779, 57780, 57782, 57783, 57785, 57787, 57788, 57790, 57791, 57792, 57793, 57794, 57799, 58001, 58002, 58004, 58005, 58006, 58007, 58008, 58009, 58011, 58012, 58013, 58014, 58015, 58016, 58017, 58018, 58021, 58027, 58029, 58030, 58031, 58032, 58033, 58035, 58036, 58038, 58039, 58040, 58041, 58042, 58043, 58045, 58046, 58047, 58048, 58049, 58051, 58052, 58053, 58054, 58056, 58057, 58058, 58059, 58060, 58061, 58062, 58063, 58064, 58065, 58067, 58068, 58069, 58071, 58072, 58074, 58075, 58076, 58077, 58078, 58079, 58081, 58102, 58103, 58104, 58105, 58106, 58107, 58108, 58109, 58121, 58122, 58123, 58124, 58125, 58126, 58201, 58202, 58203, 58204, 58205, 58206, 58207, 58208, 58210, 58212, 58213, 58214, 58216, 58218, 58219, 58220, 58222, 58223, 58224, 58225, 58227, 58228, 58229, 58230, 58231, 58233, 58235, 58236, 58237, 58238, 58239, 58240, 58241, 58243, 58244, 58249, 58250, 58251, 58254, 58255, 58256, 58257, 58258, 58259, 58260, 58261, 58262, 58265, 58266, 58267, 58269, 58270, 58271, 58272, 58273, 58274, 58275, 58276, 58277, 58278, 58281, 58282, 58301, 58310, 58311, 58313, 58316, 58317, 58318, 58319, 58320, 58321, 58323, 58324, 58325, 58327, 58329, 58330, 58331, 58332, 58335, 58337, 58338, 58339, 58341, 58343, 58344, 58345, 58346, 58348, 58351, 58352, 58353, 58355, 58356, 58357, 58359, 58361, 58362, 58363, 58365, 58366, 58367, 58368, 58369, 58370, 58372, 58374, 58377, 58379, 58380, 58381, 58382, 58384, 58385, 58386, 58401, 58402, 58405, 58413, 58415, 58416, 58418, 58420, 58421, 58422, 58423, 58424, 58425, 58426, 58428, 58429, 58430, 58431, 58432, 58433, 58436, 58438, 58439, 58440, 58441, 58442, 58443, 58444, 58445, 58448, 58451, 58452, 58454, 58455, 58456, 58458, 58460, 58461, 58463, 58464, 58466, 58467, 58472, 58474, 58475, 58476, 58477, 58478, 58479, 58480, 58481, 58482, 58483, 58484, 58486, 58487, 58488, 58489, 58490, 58492, 58494, 58495, 58496, 58497, 58501, 58502, 58503, 58504, 58505, 58506, 58507, 58520, 58521, 58523, 58524, 58528, 58529, 58530, 58531, 58532, 58533, 58535, 58538, 58540, 58541, 58542, 58544, 58545, 58549, 58552, 58553, 58554, 58558, 58559, 58560, 58561, 58562, 58563, 58564, 58565, 58566, 58568, 58569, 58570, 58571, 58572, 58573, 58575, 58576, 58577, 58579, 58580, 58581, 58601, 58602, 58620, 58621, 58622, 58623, 58625, 58626, 58627, 58630, 58631, 58632, 58634, 58636, 58638, 58639, 58640, 58641, 58642, 58643, 58644, 58645, 58646, 58647, 58649, 58650, 58651, 58652, 58653, 58654, 58655, 58656, 58701, 58702, 58703, 58704, 58705, 58707, 58710, 58711, 58712, 58713, 58716, 58718, 58721, 58722, 58723, 58725, 58727, 58730, 58731, 58733, 58734, 58735, 58736, 58737, 58740, 58741, 58744, 58746, 58747, 58748, 58750, 58752, 58755, 58756, 58757, 58758, 58759, 58760, 58761, 58762, 58763, 58765, 58768, 58769, 58770, 58771, 58772, 58773, 58775, 58776, 58778, 58779, 58781, 58782, 58783, 58784, 58785, 58787, 58788, 58789, 58790, 58792, 58793, 58794, 58795, 58801, 58802, 58830, 58831, 58833, 58835, 58838, 58843, 58844, 58845, 58847, 58849, 58852, 58853, 58854, 58856, 59001, 59002, 59003, 59004, 59006, 59007, 59008, 59010, 59011, 59012, 59013, 59014, 59015, 59016, 59018, 59019, 59020, 59022, 59024, 59025, 59026, 59027, 59028, 59029, 59030, 59031, 59032, 59033, 59034, 59035, 59036, 59037, 59038, 59039, 59041, 59043, 59044, 59046, 59047, 59050, 59052, 59053, 59054, 59055, 59057, 59058, 59059, 59061, 59062, 59063, 59064, 59065, 59066, 59067, 59068, 59069, 59070, 59071, 59072, 59073, 59074, 59075, 59076, 59077, 59078, 59079, 59081, 59082, 59083, 59084, 59085, 59086, 59087, 59088, 59089, 59101, 59102, 59103, 59104, 59105, 59106, 59107, 59108, 59111, 59112, 59114, 59115, 59116, 59117, 59201, 59211, 59212, 59213, 59214, 59215, 59217, 59218, 59219, 59221, 59222, 59223, 59225, 59226, 59230, 59231, 59240, 59241, 59242, 59243, 59244, 59245, 59247, 59248, 59250, 59252, 59253, 59254, 59255, 59256, 59257, 59258, 59259, 59260, 59261, 59262, 59263, 59270, 59273, 59274, 59275, 59276, 59301, 59311, 59312, 59313, 59314, 59315, 59316, 59317, 59318, 59319, 59322, 59323, 59324, 59326, 59327, 59330, 59332, 59333, 59336, 59337, 59338, 59339, 59341, 59343, 59344, 59345, 59347, 59348, 59349, 59351, 59353, 59354, 59401, 59402, 59403, 59404, 59405, 59406, 59410, 59411, 59412, 59414, 59416, 59417, 59418, 59419, 59420, 59421, 59422, 59424, 59425, 59427, 59430, 59432, 59433, 59434, 59435, 59436, 59440, 59441, 59442, 59443, 59444, 59445, 59446, 59447, 59448, 59450, 59451, 59452, 59453, 59454, 59456, 59457, 59460, 59461, 59462, 59463, 59464, 59465, 59466, 59467, 59468, 59469, 59471, 59472, 59473, 59474, 59477, 59479, 59480, 59482, 59483, 59484, 59485, 59486, 59487, 59489, 59501, 59520, 59521, 59522, 59523, 59524, 59525, 59526, 59527, 59528, 59529, 59530, 59531, 59532, 59535, 59537, 59538, 59540, 59542, 59544, 59545, 59546, 59547, 59601, 59602, 59604, 59620, 59623, 59624, 59625, 59626, 59631, 59632, 59633, 59634, 59635, 59636, 59638, 59639, 59640, 59641, 59642, 59643, 59644, 59645, 59647, 59648, 59701, 59702, 59703, 59707, 59710, 59711, 59713, 59714, 59715, 59716, 59717, 59718, 59719, 59720, 59721, 59722, 59724, 59725, 59727, 59728, 59729, 59730, 59731, 59732, 59733, 59735, 59736, 59739, 59740, 59741, 59743, 59745, 59746, 59747, 59748, 59749, 59750, 59751, 59752, 59754, 59755, 59756, 59758, 59759, 59760, 59761, 59762, 59771, 59772, 59773, 59801, 59802, 59803, 59804, 59806, 59807, 59808, 59812, 59820, 59821, 59823, 59824, 59825, 59826, 59827, 59828, 59829, 59830, 59831, 59832, 59833, 59834, 59835, 59836, 59837, 59840, 59841, 59842, 59843, 59844, 59845, 59846, 59847, 59848, 59851, 59853, 59854, 59855, 59856, 59858, 59859, 59860, 59863, 59864, 59865, 59866, 59867, 59868, 59870, 59871, 59872, 59873, 59874, 59875, 59901, 59902, 59903, 59904, 59910, 59911, 59912, 59913, 59914, 59915, 59916, 59917, 59918, 59919, 59920, 59921, 59922, 59923, 59925, 59926, 59927, 59928, 59929, 59930, 59931, 59932, 59933, 59934, 59935, 59936, 59937, 60001, 60002, 60004, 60005, 60006, 60007, 60008, 60009, 60010, 60011, 60012, 60013, 60014, 60015, 60016, 60017, 60018, 60019, 60020, 60021, 60022, 60025, 60026, 60029, 60030, 60031, 60033, 60034, 60035, 60037, 60038, 60039, 60040, 60041, 60042, 60043, 60044, 60045, 60046, 60047, 60048, 60049, 60050, 60051, 60053, 60055, 60056, 60060, 60061, 60062, 60064, 60065, 60067, 60068, 60069, 60070, 60071, 60072, 60073, 60074, 60075, 60076, 60077, 60078, 60079, 60080, 60081, 60082, 60083, 60084, 60085, 60086, 60087, 60088, 60089, 60090, 60091, 60092, 60093, 60094, 60095, 60096, 60097, 60098, 60099, 60101, 60102, 60103, 60104, 60105, 60106, 60107, 60108, 60109, 60110, 60111, 60112, 60113, 60115, 60116, 60117, 60118, 60119, 60120, 60121, 60122, 60123, 60125, 60126, 60128, 60129, 60130, 60131, 60132, 60133, 60134, 60135, 60136, 60137, 60138, 60139, 60140, 60141, 60142, 60143, 60144, 60145, 60146, 60147, 60148, 60150, 60151, 60152, 60153, 60154, 60155, 60156, 60157, 60159, 60160, 60161, 60162, 60163, 60164, 60165, 60168, 60170, 60171, 60172, 60173, 60174, 60175, 60176, 60177, 60178, 60179, 60180, 60181, 60182, 60183, 60184, 60185, 60186, 60187, 60188, 60189, 60190, 60191, 60192, 60193, 60194, 60195, 60196, 60197, 60199, 60201, 60202, 60203, 60204, 60208, 60209, 60301, 60302, 60303, 60304, 60305, 60399, 60401, 60402, 60406, 60407, 60408, 60409, 60410, 60411, 60412, 60415, 60416, 60417, 60419, 60420, 60421, 60422, 60423, 60424, 60425, 60426, 60429, 60430, 60431, 60432, 60433, 60434, 60435, 60436, 60437, 60438, 60439, 60440, 60441, 60442, 60443, 60444, 60445, 60446, 60447, 60448, 60449, 60450, 60451, 60452, 60453, 60454, 60455, 60456, 60457, 60458, 60459, 60460, 60461, 60462, 60463, 60464, 60465, 60466, 60467, 60468, 60469, 60470, 60471, 60472, 60473, 60474, 60475, 60476, 60477, 60478, 60479, 60480, 60481, 60482, 60490, 60499, 60501, 60504, 60505, 60506, 60507, 60510, 60511, 60512, 60513, 60514, 60515, 60516, 60517, 60518, 60519, 60520, 60521, 60522, 60523, 60525, 60526, 60527, 60530, 60531, 60532, 60534, 60536, 60537, 60538, 60539, 60540, 60541, 60542, 60543, 60544, 60545, 60546, 60548, 60549, 60550, 60551, 60552, 60553, 60554, 60555, 60556, 60557, 60558, 60559, 60560, 60561, 60563, 60564, 60565, 60566, 60567, 60568, 60570, 60572, 60597, 60598, 60599, 60601, 60602, 60603, 60604, 60605, 60606, 60607, 60608, 60609, 60610, 60611, 60612, 60613, 60614, 60615, 60616, 60617, 60618, 60619, 60620, 60621, 60622, 60623, 60624, 60625, 60626, 60628, 60629, 60630, 60631, 60632, 60633, 60634, 60636, 60637, 60638, 60639, 60640, 60641, 60643, 60644, 60645, 60646, 60647, 60649, 60651, 60652, 60653, 60654, 60655, 60656, 60657, 60659, 60660, 60661, 60663, 60664, 60665, 60666, 60667, 60668, 60669, 60670, 60671, 60672, 60673, 60674, 60675, 60677, 60678, 60679, 60680, 60681, 60683, 60684, 60685, 60687, 60688, 60690, 60691, 60693, 60694, 60696, 60697, 60699, 60701, 60706, 60707, 60712, 60714, 60803, 60804, 60805, 60827, 60901, 60902, 60910, 60911, 60912, 60913, 60914, 60915, 60917, 60918, 60919, 60920, 60921, 60922, 60924, 60926, 60927, 60928, 60929, 60930, 60931, 60932, 60933, 60934, 60935, 60936, 60938, 60939, 60940, 60941, 60942, 60944, 60945, 60946, 60948, 60949, 60950, 60951, 60952, 60953, 60954, 60955, 60956, 60957, 60959, 60960, 60961, 60962, 60963, 60964, 60966, 60967, 60968, 60969, 60970, 60973, 60974, 61001, 61006, 61007, 61008, 61010, 61011, 61012, 61013, 61014, 61015, 61016, 61018, 61019, 61020, 61021, 61024, 61025, 61027, 61028, 61030, 61031, 61032, 61036, 61037, 61038, 61039, 61041, 61042, 61043, 61044, 61046, 61047, 61048, 61049, 61050, 61051, 61052, 61053, 61054, 61057, 61058, 61059, 61060, 61061, 61062, 61063, 61064, 61065, 61067, 61068, 61070, 61071, 61072, 61073, 61074, 61075, 61076, 61077, 61078, 61079, 61080, 61081, 61084, 61085, 61087, 61088, 61089, 61091, 61101, 61102, 61103, 61104, 61105, 61106, 61107, 61108, 61109, 61110, 61111, 61112, 61114, 61115, 61125, 61126, 61130, 61131, 61132, 61201, 61204, 61230, 61231, 61232, 61233, 61234, 61235, 61236, 61237, 61238, 61239, 61240, 61241, 61242, 61243, 61244, 61250, 61251, 61252, 61254, 61256, 61257, 61258, 61259, 61260, 61261, 61262, 61263, 61264, 61265, 61266, 61270, 61272, 61273, 61274, 61275, 61276, 61277, 61278, 61279, 61281, 61282, 61283, 61284, 61285, 61299, 61301, 61310, 61311, 61312, 61313, 61314, 61315, 61316, 61317, 61318, 61319, 61320, 61321, 61322, 61323, 61324, 61325, 61326, 61327, 61328, 61329, 61330, 61331, 61332, 61333, 61334, 61335, 61336, 61337, 61338, 61340, 61341, 61342, 61344, 61345, 61346, 61348, 61349, 61350, 61353, 61354, 61356, 61358, 61359, 61360, 61361, 61362, 61363, 61364, 61367, 61368, 61369, 61370, 61371, 61372, 61373, 61374, 61375, 61376, 61377, 61378, 61379, 61401, 61402, 61410, 61411, 61412, 61413, 61414, 61415, 61416, 61417, 61418, 61419, 61420, 61421, 61422, 61423, 61424, 61425, 61426, 61427, 61428, 61430, 61431, 61432, 61433, 61434, 61435, 61436, 61437, 61438, 61439, 61440, 61441, 61442, 61443, 61447, 61448, 61449, 61450, 61451, 61452, 61453, 61454, 61455, 61458, 61459, 61460, 61462, 61465, 61466, 61467, 61468, 61469, 61470, 61471, 61472, 61473, 61474, 61475, 61476, 61477, 61478, 61479, 61480, 61482, 61483, 61484, 61485, 61486, 61488, 61489, 61490, 61491, 61501, 61516, 61517, 61519, 61520, 61523, 61524, 61525, 61526, 61528, 61529, 61530, 61531, 61532, 61533, 61534, 61535, 61536, 61537, 61539, 61540, 61541, 61542, 61543, 61544, 61545, 61546, 61547, 61548, 61550, 61552, 61553, 61554, 61555, 61558, 61559, 61560, 61561, 61562, 61563, 61564, 61565, 61567, 61568, 61569, 61570, 61571, 61572, 61601, 61602, 61603, 61604, 61605, 61606, 61607, 61610, 61611, 61612, 61613, 61614, 61615, 61616, 61625, 61628, 61629, 61630, 61632, 61633, 61634, 61635, 61636, 61637, 61638, 61639, 61640, 61641, 61643, 61644, 61650, 61651, 61652, 61653, 61654, 61655, 61656, 61701, 61702, 61704, 61709, 61710, 61720, 61721, 61722, 61723, 61724, 61725, 61726, 61727, 61728, 61729, 61730, 61731, 61732, 61733, 61734, 61735, 61736, 61737, 61738, 61739, 61740, 61741, 61742, 61743, 61744, 61745, 61747, 61748, 61749, 61750, 61751, 61752, 61753, 61754, 61755, 61756, 61758, 61759, 61760, 61761, 61764, 61769, 61770, 61771, 61772, 61773, 61774, 61775, 61776, 61777, 61778, 61790, 61791, 61799, 61801, 61802, 61803, 61810, 61811, 61812, 61813, 61814, 61815, 61816, 61817, 61818, 61820, 61821, 61822, 61824, 61825, 61826, 61830, 61831, 61832, 61833, 61834, 61839, 61840, 61841, 61842, 61843, 61844, 61845, 61846, 61847, 61848, 61849, 61850, 61851, 61852, 61853, 61854, 61855, 61856, 61857, 61858, 61859, 61862, 61863, 61864, 61865, 61866, 61870, 61871, 61872, 61873, 61874, 61875, 61876, 61877, 61878, 61880, 61882, 61883, 61884, 61910, 61911, 61912, 61913, 61914, 61917, 61919, 61920, 61924, 61925, 61928, 61929, 61930, 61931, 61932, 61933, 61936, 61937, 61938, 61940, 61941, 61942, 61943, 61944, 61949, 61951, 61953, 61955, 61956, 61957, 62001, 62002, 62006, 62009, 62010, 62011, 62012, 62013, 62014, 62015, 62016, 62017, 62018, 62019, 62021, 62022, 62023, 62024, 62025, 62026, 62027, 62028, 62030, 62031, 62032, 62033, 62034, 62035, 62036, 62037, 62040, 62044, 62045, 62046, 62047, 62048, 62049, 62050, 62051, 62052, 62053, 62054, 62056, 62058, 62059, 62060, 62061, 62062, 62063, 62065, 62067, 62069, 62070, 62071, 62074, 62075, 62076, 62077, 62078, 62079, 62080, 62081, 62082, 62083, 62084, 62085, 62086, 62087, 62088, 62089, 62090, 62091, 62092, 62093, 62094, 62095, 62097, 62098, 62201, 62202, 62203, 62204, 62205, 62206, 62207, 62208, 62214, 62215, 62216, 62217, 62218, 62219, 62220, 62221, 62222, 62223, 62224, 62225, 62226, 62230, 62231, 62232, 62233, 62234, 62236, 62237, 62238, 62239, 62240, 62241, 62242, 62243, 62244, 62245, 62246, 62247, 62248, 62249, 62250, 62252, 62253, 62254, 62255, 62256, 62257, 62258, 62259, 62260, 62261, 62262, 62263, 62264, 62265, 62266, 62268, 62269, 62271, 62272, 62273, 62274, 62275, 62277, 62278, 62279, 62280, 62281, 62282, 62283, 62284, 62285, 62286, 62288, 62289, 62292, 62293, 62294, 62295, 62297, 62298, 62301, 62305, 62306, 62310, 62311, 62312, 62313, 62314, 62316, 62318, 62319, 62320, 62321, 62323, 62324, 62325, 62326, 62329, 62330, 62334, 62336, 62338, 62339, 62340, 62341, 62343, 62344, 62345, 62346, 62347, 62348, 62349, 62351, 62352, 62353, 62354, 62355, 62356, 62357, 62358, 62359, 62360, 62361, 62362, 62363, 62365, 62366, 62367, 62370, 62373, 62374, 62375, 62376, 62378, 62379, 62380, 62401, 62410, 62411, 62413, 62414, 62415, 62417, 62418, 62419, 62420, 62421, 62422, 62423, 62424, 62425, 62426, 62427, 62428, 62431, 62432, 62433, 62434, 62435, 62436, 62438, 62439, 62440, 62441, 62442, 62443, 62444, 62445, 62446, 62447, 62448, 62449, 62450, 62451, 62452, 62454, 62458, 62459, 62460, 62461, 62462, 62463, 62464, 62465, 62466, 62467, 62468, 62469, 62471, 62473, 62474, 62475, 62476, 62477, 62478, 62479, 62480, 62481, 62501, 62510, 62511, 62512, 62513, 62514, 62515, 62517, 62518, 62519, 62520, 62521, 62522, 62523, 62524, 62525, 62526, 62527, 62530, 62531, 62532, 62533, 62534, 62535, 62536, 62537, 62538, 62539, 62540, 62541, 62543, 62544, 62545, 62546, 62547, 62548, 62549, 62550, 62551, 62552, 62553, 62554, 62555, 62556, 62557, 62558, 62560, 62561, 62563, 62565, 62567, 62568, 62570, 62571, 62572, 62573, 62601, 62610, 62611, 62612, 62613, 62615, 62617, 62618, 62621, 62622, 62624, 62625, 62626, 62627, 62628, 62629, 62630, 62631, 62633, 62634, 62635, 62638, 62639, 62640, 62642, 62643, 62644, 62649, 62650, 62651, 62655, 62656, 62659, 62660, 62661, 62662, 62663, 62664, 62665, 62666, 62667, 62668, 62670, 62671, 62672, 62673, 62674, 62675, 62677, 62681, 62682, 62683, 62684, 62685, 62686, 62688, 62689, 62690, 62691, 62692, 62693, 62694, 62695, 62701, 62702, 62703, 62704, 62705, 62706, 62707, 62708, 62709, 62713, 62715, 62716, 62718, 62719, 62720, 62721, 62722, 62723, 62726, 62736, 62739, 62746, 62756, 62757, 62761, 62762, 62763, 62764, 62765, 62766, 62767, 62769, 62776, 62777, 62781, 62786, 62791, 62794, 62796, 62801, 62803, 62805, 62806, 62807, 62808, 62809, 62810, 62811, 62812, 62814, 62815, 62816, 62817, 62818, 62819, 62820, 62821, 62822, 62823, 62824, 62825, 62827, 62828, 62829, 62830, 62831, 62832, 62833, 62834, 62835, 62836, 62837, 62838, 62839, 62840, 62841, 62842, 62843, 62844, 62845, 62846, 62847, 62848, 62849, 62850, 62851, 62852, 62853, 62854, 62855, 62856, 62857, 62858, 62859, 62860, 62861, 62862, 62863, 62864, 62865, 62866, 62867, 62868, 62869, 62870, 62871, 62872, 62874, 62875, 62876, 62877, 62878, 62879, 62880, 62881, 62882, 62883, 62884, 62885, 62886, 62887, 62888, 62889, 62890, 62891, 62892, 62893, 62894, 62895, 62896, 62897, 62898, 62899, 62901, 62902, 62903, 62905, 62906, 62907, 62908, 62909, 62910, 62912, 62913, 62914, 62915, 62916, 62917, 62918, 62919, 62920, 62921, 62922, 62923, 62924, 62926, 62927, 62928, 62930, 62931, 62932, 62933, 62934, 62935, 62938, 62939, 62940, 62941, 62942, 62943, 62944, 62946, 62947, 62948, 62949, 62950, 62951, 62952, 62953, 62954, 62955, 62956, 62957, 62958, 62959, 62960, 62961, 62962, 62963, 62964, 62965, 62966, 62967, 62969, 62970, 62971, 62972, 62973, 62974, 62975, 62976, 62977, 62979, 62982, 62983, 62984, 62985, 62987, 62988, 62990, 62991, 62992, 62993, 62994, 62995, 62996, 62997, 62998, 62999, 63001, 63005, 63006, 63010, 63011, 63012, 63013, 63014, 63015, 63016, 63017, 63019, 63020, 63021, 63022, 63023, 63024, 63025, 63026, 63028, 63030, 63031, 63032, 63033, 63034, 63036, 63037, 63038, 63039, 63040, 63041, 63042, 63043, 63044, 63045, 63047, 63048, 63049, 63050, 63051, 63052, 63053, 63055, 63056, 63057, 63060, 63061, 63065, 63066, 63068, 63069, 63070, 63071, 63072, 63073, 63074, 63077, 63079, 63080, 63084, 63087, 63088, 63089, 63090, 63091, 63099, 63101, 63102, 63103, 63104, 63105, 63106, 63107, 63108, 63109, 63110, 63111, 63112, 63113, 63114, 63115, 63116, 63117, 63118, 63119, 63120, 63121, 63122, 63123, 63124, 63125, 63126, 63127, 63128, 63129, 63130, 63131, 63132, 63133, 63134, 63135, 63136, 63137, 63138, 63139, 63140, 63141, 63143, 63144, 63145, 63146, 63147, 63150, 63151, 63155, 63156, 63157, 63158, 63160, 63163, 63164, 63166, 63167, 63169, 63171, 63177, 63178, 63179, 63180, 63182, 63188, 63190, 63195, 63196, 63197, 63198, 63199, 63301, 63302, 63303, 63304, 63330, 63332, 63333, 63334, 63336, 63338, 63339, 63341, 63342, 63343, 63344, 63345, 63346, 63347, 63348, 63349, 63350, 63351, 63352, 63353, 63357, 63359, 63361, 63362, 63363, 63365, 63366, 63367, 63369, 63370, 63373, 63376, 63377, 63378, 63379, 63381, 63382, 63383, 63384, 63385, 63386, 63387, 63388, 63389, 63390, 63401, 63430, 63431, 63432, 63433, 63434, 63435, 63436, 63437, 63438, 63439, 63440, 63441, 63442, 63443, 63445, 63446, 63447, 63448, 63450, 63451, 63452, 63453, 63454, 63456, 63457, 63458, 63459, 63460, 63461, 63462, 63463, 63464, 63465, 63466, 63467, 63468, 63469, 63471, 63472, 63473, 63474, 63501, 63530, 63531, 63532, 63533, 63534, 63535, 63536, 63537, 63538, 63539, 63540, 63541, 63543, 63544, 63545, 63546, 63547, 63548, 63549, 63551, 63552, 63555, 63556, 63557, 63558, 63559, 63560, 63561, 63563, 63565, 63566, 63567, 63601, 63620, 63621, 63622, 63623, 63624, 63625, 63626, 63627, 63628, 63629, 63630, 63631, 63632, 63633, 63636, 63637, 63638, 63640, 63645, 63646, 63648, 63650, 63651, 63653, 63654, 63655, 63656, 63660, 63661, 63662, 63663, 63664, 63665, 63666, 63670, 63673, 63674, 63675, 63701, 63702, 63703, 63705, 63730, 63732, 63735, 63736, 63737, 63738, 63739, 63740, 63742, 63743, 63744, 63745, 63746, 63747, 63748, 63750, 63751, 63752, 63753, 63755, 63758, 63760, 63763, 63764, 63766, 63767, 63769, 63770, 63771, 63772, 63774, 63775, 63776, 63779, 63780, 63781, 63782, 63783, 63784, 63785, 63787, 63801, 63820, 63821, 63822, 63823, 63824, 63825, 63826, 63827, 63828, 63829, 63830, 63833, 63834, 63837, 63838, 63839, 63840, 63841, 63845, 63846, 63847, 63848, 63849, 63850, 63851, 63852, 63853, 63855, 63857, 63860, 63862, 63863, 63866, 63867, 63868, 63869, 63870, 63871, 63873, 63874, 63875, 63876, 63877, 63878, 63879, 63880, 63881, 63882, 63901, 63902, 63931, 63932, 63933, 63934, 63935, 63936, 63937, 63938, 63939, 63940, 63941, 63942, 63943, 63944, 63945, 63947, 63950, 63951, 63952, 63953, 63954, 63955, 63956, 63957, 63960, 63961, 63962, 63963, 63964, 63965, 63966, 63967, 64001, 64011, 64012, 64013, 64014, 64015, 64016, 64017, 64018, 64019, 64020, 64021, 64022, 64024, 64028, 64029, 64030, 64034, 64035, 64036, 64037, 64040, 64048, 64050, 64051, 64052, 64053, 64054, 64055, 64056, 64057, 64058, 64060, 64061, 64062, 64063, 64064, 64065, 64066, 64067, 64068, 64069, 64070, 64071, 64072, 64073, 64074, 64075, 64076, 64077, 64078, 64079, 64080, 64081, 64082, 64083, 64084, 64085, 64086, 64087, 64088, 64089, 64090, 64092, 64093, 64096, 64097, 64098, 64101, 64102, 64105, 64106, 64108, 64109, 64110, 64111, 64112, 64113, 64114, 64116, 64117, 64118, 64119, 64120, 64121, 64123, 64124, 64125, 64126, 64127, 64128, 64129, 64130, 64131, 64132, 64133, 64134, 64136, 64137, 64138, 64139, 64141, 64142, 64144, 64145, 64146, 64147, 64148, 64149, 64150, 64151, 64152, 64153, 64154, 64155, 64156, 64157, 64158, 64160, 64161, 64163, 64164, 64165, 64166, 64167, 64168, 64170, 64171, 64172, 64173, 64179, 64180, 64183, 64184, 64185, 64187, 64188, 64189, 64190, 64191, 64192, 64193, 64194, 64195, 64196, 64197, 64198, 64199, 64401, 64402, 64420, 64421, 64422, 64423, 64424, 64426, 64427, 64428, 64429, 64430, 64431, 64432, 64433, 64434, 64436, 64437, 64438, 64439, 64440, 64441, 64442, 64443, 64444, 64445, 64446, 64447, 64448, 64449, 64451, 64453, 64454, 64455, 64456, 64457, 64458, 64459, 64461, 64463, 64465, 64466, 64467, 64468, 64469, 64470, 64471, 64473, 64474, 64475, 64476, 64477, 64478, 64479, 64480, 64481, 64482, 64483, 64484, 64485, 64486, 64487, 64489, 64490, 64491, 64492, 64493, 64494, 64496, 64497, 64498, 64499, 64501, 64502, 64503, 64504, 64505, 64506, 64507, 64508, 64601, 64620, 64622, 64623, 64624, 64625, 64628, 64630, 64631, 64632, 64633, 64635, 64636, 64637, 64638, 64639, 64640, 64641, 64642, 64643, 64644, 64645, 64646, 64647, 64648, 64649, 64650, 64651, 64652, 64653, 64654, 64655, 64656, 64657, 64658, 64659, 64660, 64661, 64664, 64667, 64668, 64670, 64671, 64672, 64673, 64674, 64676, 64679, 64680, 64681, 64682, 64683, 64686, 64687, 64688, 64689, 64701, 64720, 64722, 64723, 64724, 64725, 64726, 64728, 64730, 64733, 64734, 64735, 64738, 64739, 64740, 64741, 64742, 64743, 64744, 64745, 64746, 64747, 64748, 64750, 64751, 64752, 64755, 64756, 64759, 64761, 64762, 64763, 64765, 64766, 64767, 64769, 64770, 64771, 64772, 64776, 64777, 64778, 64779, 64780, 64781, 64783, 64784, 64788, 64789, 64790, 64801, 64802, 64803, 64804, 64830, 64831, 64832, 64833, 64834, 64835, 64836, 64840, 64841, 64842, 64843, 64844, 64847, 64848, 64849, 64850, 64853, 64854, 64855, 64856, 64857, 64858, 64859, 64861, 64862, 64863, 64864, 64865, 64866, 64867, 64868, 64869, 64870, 64873, 64874, 64944, 64999, 65001, 65010, 65011, 65013, 65014, 65016, 65017, 65018, 65020, 65022, 65023, 65024, 65025, 65026, 65031, 65032, 65034, 65035, 65036, 65037, 65038, 65039, 65040, 65041, 65042, 65043, 65046, 65047, 65048, 65049, 65050, 65051, 65052, 65053, 65054, 65055, 65058, 65059, 65061, 65062, 65063, 65064, 65065, 65066, 65067, 65068, 65069, 65072, 65074, 65075, 65076, 65077, 65078, 65079, 65080, 65081, 65082, 65083, 65084, 65085, 65101, 65102, 65103, 65104, 65105, 65106, 65107, 65108, 65109, 65110, 65111, 65201, 65202, 65203, 65205, 65211, 65212, 65215, 65216, 65217, 65218, 65230, 65231, 65232, 65233, 65236, 65237, 65239, 65240, 65243, 65244, 65246, 65247, 65248, 65250, 65251, 65254, 65255, 65256, 65257, 65258, 65259, 65260, 65261, 65262, 65263, 65264, 65265, 65270, 65274, 65275, 65276, 65278, 65279, 65280, 65281, 65282, 65283, 65284, 65285, 65286, 65287, 65299, 65301, 65302, 65305, 65320, 65321, 65322, 65323, 65324, 65325, 65326, 65327, 65329, 65330, 65332, 65333, 65334, 65335, 65336, 65337, 65338, 65339, 65340, 65344, 65345, 65347, 65348, 65349, 65350, 65351, 65354, 65355, 65360, 65401, 65402, 65409, 65433, 65436, 65438, 65439, 65440, 65441, 65443, 65444, 65446, 65449, 65452, 65453, 65456, 65457, 65459, 65461, 65462, 65463, 65464, 65466, 65468, 65470, 65473, 65479, 65483, 65484, 65486, 65501, 65529, 65532, 65534, 65535, 65536, 65540, 65541, 65542, 65543, 65546, 65548, 65550, 65552, 65555, 65556, 65557, 65559, 65560, 65564, 65565, 65566, 65567, 65570, 65571, 65572, 65573, 65580, 65582, 65583, 65584, 65586, 65588, 65589, 65590, 65591, 65601, 65603, 65604, 65605, 65606, 65607, 65608, 65609, 65610, 65611, 65612, 65613, 65614, 65615, 65616, 65617, 65618, 65619, 65620, 65622, 65623, 65624, 65625, 65626, 65627, 65629, 65630, 65631, 65632, 65633, 65634, 65635, 65636, 65637, 65638, 65640, 65641, 65644, 65645, 65646, 65647, 65648, 65649, 65650, 65652, 65653, 65654, 65655, 65656, 65657, 65658, 65659, 65660, 65661, 65662, 65663, 65664, 65666, 65667, 65668, 65669, 65672, 65673, 65674, 65675, 65676, 65679, 65680, 65681, 65682, 65685, 65686, 65688, 65689, 65690, 65692, 65701, 65702, 65704, 65705, 65706, 65707, 65708, 65710, 65711, 65712, 65713, 65714, 65715, 65717, 65720, 65721, 65722, 65723, 65724, 65725, 65726, 65727, 65728, 65729, 65730, 65731, 65732, 65733, 65734, 65735, 65737, 65738, 65739, 65740, 65741, 65742, 65744, 65745, 65746, 65747, 65752, 65753, 65754, 65755, 65756, 65757, 65759, 65760, 65761, 65762, 65764, 65765, 65766, 65767, 65768, 65769, 65770, 65771, 65772, 65773, 65774, 65775, 65776, 65777, 65778, 65779, 65781, 65783, 65784, 65785, 65786, 65787, 65788, 65789, 65790, 65791, 65793, 65801, 65802, 65803, 65804, 65805, 65806, 65807, 65808, 65809, 65810, 65814, 65817, 65890, 65898, 65899, 66002, 66006, 66007, 66008, 66010, 66012, 66013, 66014, 66015, 66016, 66017, 66018, 66019, 66020, 66021, 66023, 66024, 66025, 66026, 66027, 66030, 66031, 66032, 66033, 66035, 66036, 66039, 66040, 66041, 66042, 66043, 66044, 66045, 66046, 66047, 66048, 66049, 66050, 66051, 66052, 66053, 66054, 66056, 66058, 66060, 66061, 66062, 66063, 66064, 66066, 66067, 66070, 66071, 66072, 66073, 66075, 66076, 66077, 66078, 66079, 66080, 66083, 66085, 66086, 66087, 66088, 66090, 66091, 66092, 66093, 66094, 66095, 66097, 66101, 66102, 66103, 66104, 66105, 66106, 66109, 66110, 66111, 66112, 66113, 66115, 66117, 66118, 66119, 66160, 66201, 66202, 66203, 66204, 66205, 66206, 66207, 66208, 66209, 66210, 66211, 66212, 66213, 66214, 66215, 66216, 66217, 66218, 66219, 66220, 66221, 66222, 66223, 66224, 66225, 66226, 66227, 66250, 66251, 66276, 66279, 66282, 66283, 66285, 66286, 66401, 66402, 66403, 66404, 66406, 66407, 66408, 66409, 66411, 66412, 66413, 66414, 66415, 66416, 66417, 66418, 66419, 66420, 66422, 66423, 66424, 66425, 66426, 66427, 66428, 66429, 66431, 66432, 66434, 66436, 66438, 66439, 66440, 66441, 66442, 66449, 66450, 66451, 66501, 66502, 66503, 66505, 66506, 66507, 66508, 66509, 66510, 66512, 66514, 66515, 66516, 66517, 66518, 66520, 66521, 66522, 66523, 66524, 66526, 66527, 66528, 66531, 66532, 66533, 66534, 66535, 66536, 66537, 66538, 66539, 66540, 66541, 66542, 66543, 66544, 66546, 66547, 66548, 66549, 66550, 66551, 66552, 66554, 66555, 66601, 66603, 66604, 66605, 66606, 66607, 66608, 66609, 66610, 66611, 66612, 66614, 66615, 66616, 66617, 66618, 66619, 66620, 66621, 66622, 66624, 66625, 66626, 66628, 66629, 66634, 66636, 66637, 66638, 66642, 66647, 66652, 66653, 66658, 66667, 66675, 66683, 66686, 66692, 66699, 66701, 66710, 66711, 66712, 66713, 66714, 66716, 66717, 66720, 66724, 66725, 66727, 66728, 66732, 66733, 66734, 66735, 66736, 66738, 66739, 66740, 66741, 66742, 66743, 66746, 66748, 66749, 66751, 66753, 66754, 66755, 66756, 66757, 66758, 66759, 66760, 66761, 66762, 66763, 66767, 66769, 66770, 66771, 66772, 66773, 66775, 66776, 66777, 66778, 66779, 66780, 66781, 66782, 66783, 66801, 66830, 66833, 66834, 66835, 66838, 66839, 66840, 66842, 66843, 66845, 66846, 66849, 66850, 66851, 66852, 66853, 66854, 66855, 66856, 66857, 66858, 66859, 66860, 66861, 66862, 66863, 66864, 66865, 66866, 66868, 66869, 66870, 66871, 66872, 66873, 66901, 66930, 66932, 66933, 66935, 66936, 66937, 66938, 66939, 66940, 66941, 66942, 66943, 66944, 66945, 66946, 66948, 66949, 66951, 66952, 66953, 66955, 66956, 66958, 66959, 66960, 66961, 66962, 66963, 66964, 66966, 66967, 66968, 66970, 67001, 67002, 67003, 67004, 67005, 67008, 67009, 67010, 67012, 67013, 67016, 67017, 67018, 67019, 67020, 67021, 67022, 67023, 67024, 67025, 67026, 67028, 67029, 67030, 67031, 67035, 67036, 67037, 67038, 67039, 67041, 67042, 67045, 67047, 67049, 67050, 67051, 67052, 67053, 67054, 67055, 67056, 67057, 67058, 67059, 67060, 67061, 67062, 67063, 67065, 67066, 67067, 67068, 67070, 67071, 67072, 67073, 67074, 67101, 67102, 67103, 67104, 67105, 67106, 67107, 67108, 67109, 67110, 67111, 67112, 67114, 67117, 67118, 67119, 67120, 67122, 67123, 67124, 67127, 67128, 67131, 67132, 67133, 67134, 67135, 67137, 67138, 67140, 67142, 67143, 67144, 67146, 67147, 67149, 67150, 67151, 67152, 67154, 67155, 67156, 67159, 67201, 67202, 67203, 67204, 67205, 67206, 67207, 67208, 67209, 67210, 67211, 67212, 67213, 67214, 67215, 67216, 67217, 67218, 67219, 67220, 67221, 67223, 67226, 67227, 67228, 67230, 67231, 67232, 67233, 67235, 67236, 67251, 67256, 67257, 67259, 67260, 67275, 67276, 67277, 67278, 67301, 67330, 67332, 67333, 67334, 67335, 67336, 67337, 67340, 67341, 67342, 67344, 67345, 67346, 67347, 67349, 67351, 67352, 67353, 67354, 67355, 67356, 67357, 67360, 67361, 67363, 67364, 67401, 67402, 67410, 67416, 67417, 67418, 67420, 67422, 67423, 67425, 67427, 67428, 67430, 67431, 67432, 67436, 67437, 67438, 67439, 67441, 67442, 67443, 67444, 67445, 67446, 67447, 67448, 67449, 67450, 67451, 67452, 67454, 67455, 67456, 67457, 67458, 67459, 67460, 67464, 67466, 67467, 67468, 67470, 67473, 67474, 67475, 67476, 67478, 67480, 67481, 67482, 67483, 67484, 67485, 67487, 67490, 67491, 67492, 67501, 67502, 67504, 67505, 67510, 67511, 67512, 67513, 67514, 67515, 67516, 67518, 67519, 67520, 67521, 67522, 67523, 67524, 67525, 67526, 67529, 67530, 67543, 67544, 67545, 67546, 67547, 67548, 67550, 67552, 67553, 67554, 67556, 67557, 67559, 67560, 67561, 67563, 67564, 67565, 67566, 67567, 67568, 67570, 67572, 67573, 67574, 67575, 67576, 67578, 67579, 67581, 67583, 67584, 67585, 67601, 67621, 67622, 67623, 67625, 67626, 67627, 67628, 67629, 67631, 67632, 67634, 67635, 67637, 67638, 67639, 67640, 67642, 67643, 67644, 67645, 67646, 67647, 67648, 67649, 67650, 67651, 67653, 67654, 67656, 67657, 67658, 67659, 67660, 67661, 67663, 67664, 67665, 67667, 67669, 67670, 67671, 67672, 67673, 67674, 67675, 67701, 67730, 67731, 67732, 67733, 67734, 67735, 67736, 67737, 67738, 67739, 67740, 67741, 67743, 67744, 67745, 67747, 67748, 67749, 67751, 67752, 67753, 67756, 67757, 67758, 67761, 67762, 67764, 67801, 67831, 67834, 67835, 67836, 67837, 67838, 67839, 67840, 67841, 67842, 67844, 67846, 67849, 67850, 67851, 67853, 67854, 67855, 67857, 67859, 67860, 67861, 67862, 67863, 67864, 67865, 67867, 67868, 67869, 67870, 67871, 67876, 67877, 67878, 67879, 67880, 67882, 67901, 67905, 67950, 67951, 67952, 67953, 67954, 68001, 68002, 68003, 68004, 68005, 68007, 68008, 68009, 68010, 68014, 68015, 68016, 68017, 68018, 68019, 68020, 68022, 68023, 68025, 68026, 68028, 68029, 68030, 68031, 68033, 68034, 68035, 68036, 68037, 68038, 68039, 68040, 68041, 68042, 68044, 68045, 68046, 68047, 68048, 68050, 68054, 68055, 68056, 68057, 68058, 68059, 68061, 68062, 68063, 68064, 68065, 68066, 68067, 68068, 68069, 68070, 68071, 68072, 68073, 68101, 68102, 68103, 68104, 68105, 68106, 68107, 68108, 68109, 68110, 68111, 68112, 68113, 68114, 68116, 68117, 68118, 68119, 68120, 68122, 68123, 68124, 68127, 68128, 68130, 68131, 68132, 68133, 68134, 68135, 68136, 68137, 68138, 68139, 68142, 68144, 68145, 68147, 68152, 68154, 68155, 68157, 68164, 68172, 68175, 68176, 68178, 68179, 68180, 68181, 68182, 68183, 68197, 68198, 68301, 68303, 68304, 68305, 68307, 68309, 68310, 68313, 68314, 68315, 68316, 68317, 68318, 68319, 68320, 68321, 68322, 68323, 68324, 68325, 68326, 68327, 68328, 68329, 68330, 68331, 68332, 68333, 68335, 68336, 68337, 68338, 68339, 68340, 68341, 68342, 68343, 68344, 68345, 68346, 68347, 68348, 68349, 68350, 68351, 68352, 68354, 68355, 68357, 68358, 68359, 68360, 68361, 68362, 68364, 68365, 68366, 68367, 68368, 68370, 68371, 68372, 68375, 68376, 68377, 68378, 68380, 68381, 68382, 68401, 68402, 68403, 68404, 68405, 68406, 68407, 68409, 68410, 68413, 68414, 68415, 68416, 68417, 68418, 68419, 68420, 68421, 68422, 68423, 68424, 68428, 68429, 68430, 68431, 68433, 68434, 68436, 68437, 68438, 68439, 68440, 68441, 68442, 68443, 68444, 68445, 68446, 68447, 68448, 68450, 68452, 68453, 68454, 68455, 68456, 68457, 68458, 68460, 68461, 68462, 68463, 68464, 68465, 68466, 68467, 68501, 68502, 68503, 68504, 68505, 68506, 68507, 68508, 68509, 68510, 68512, 68514, 68516, 68517, 68520, 68521, 68522, 68523, 68524, 68526, 68527, 68528, 68529, 68531, 68532, 68542, 68583, 68588, 68601, 68602, 68620, 68621, 68622, 68623, 68624, 68626, 68627, 68628, 68629, 68631, 68632, 68633, 68634, 68635, 68636, 68637, 68638, 68640, 68641, 68642, 68643, 68644, 68647, 68648, 68649, 68651, 68652, 68653, 68654, 68655, 68658, 68659, 68660, 68661, 68662, 68663, 68664, 68665, 68666, 68667, 68669, 68701, 68702, 68710, 68711, 68713, 68714, 68715, 68716, 68717, 68718, 68719, 68720, 68722, 68723, 68724, 68725, 68726, 68727, 68728, 68729, 68730, 68731, 68732, 68733, 68734, 68735, 68736, 68737, 68738, 68739, 68740, 68741, 68742, 68743, 68745, 68746, 68747, 68748, 68749, 68751, 68752, 68753, 68755, 68756, 68757, 68758, 68759, 68760, 68761, 68763, 68764, 68765, 68766, 68767, 68768, 68769, 68770, 68771, 68772, 68773, 68774, 68776, 68777, 68778, 68779, 68780, 68781, 68783, 68784, 68785, 68786, 68787, 68788, 68789, 68790, 68791, 68792, 68801, 68802, 68803, 68810, 68812, 68813, 68814, 68815, 68816, 68817, 68818, 68819, 68820, 68821, 68822, 68823, 68824, 68825, 68826, 68827, 68828, 68831, 68832, 68833, 68834, 68835, 68836, 68837, 68838, 68840, 68841, 68842, 68843, 68844, 68845, 68846, 68847, 68848, 68849, 68850, 68852, 68853, 68854, 68855, 68856, 68858, 68859, 68860, 68861, 68862, 68863, 68864, 68865, 68866, 68869, 68870, 68871, 68872, 68873, 68874, 68875, 68876, 68878, 68879, 68880, 68881, 68882, 68883, 68901, 68902, 68920, 68922, 68923, 68924, 68925, 68926, 68927, 68928, 68929, 68930, 68932, 68933, 68934, 68935, 68936, 68937, 68938, 68939, 68940, 68941, 68942, 68943, 68944, 68945, 68946, 68947, 68948, 68949, 68950, 68952, 68954, 68955, 68956, 68957, 68958, 68959, 68960, 68961, 68963, 68964, 68966, 68967, 68969, 68970, 68971, 68972, 68973, 68974, 68975, 68976, 68977, 68978, 68979, 68980, 68981, 68982, 69001, 69020, 69021, 69022, 69023, 69024, 69025, 69026, 69027, 69028, 69029, 69030, 69031, 69032, 69033, 69034, 69036, 69037, 69038, 69039, 69040, 69041, 69042, 69043, 69044, 69045, 69046, 69101, 69103, 69120, 69121, 69122, 69123, 69125, 69127, 69128, 69129, 69130, 69131, 69132, 69133, 69134, 69135, 69138, 69140, 69141, 69142, 69143, 69144, 69145, 69146, 69147, 69148, 69149, 69150, 69151, 69152, 69153, 69154, 69155, 69156, 69157, 69160, 69161, 69162, 69163, 69165, 69166, 69167, 69168, 69169, 69170, 69171, 69190, 69201, 69210, 69211, 69212, 69214, 69216, 69217, 69218, 69219, 69220, 69221, 69301, 69331, 69333, 69334, 69335, 69336, 69337, 69339, 69340, 69341, 69343, 69345, 69346, 69347, 69348, 69349, 69350, 69351, 69352, 69353, 69354, 69355, 69356, 69357, 69358, 69360, 69361, 69363, 69365, 69366, 69367, 70001, 70002, 70003, 70004, 70005, 70006, 70009, 70010, 70011, 70030, 70031, 70032, 70033, 70036, 70037, 70038, 70039, 70040, 70041, 70042, 70043, 70044, 70046, 70047, 70049, 70050, 70051, 70052, 70053, 70054, 70055, 70056, 70057, 70058, 70059, 70060, 70062, 70063, 70064, 70065, 70066, 70067, 70068, 70069, 70070, 70071, 70072, 70073, 70075, 70076, 70078, 70079, 70080, 70081, 70082, 70083, 70084, 70085, 70086, 70087, 70090, 70091, 70092, 70094, 70096, 70112, 70113, 70114, 70115, 70116, 70117, 70118, 70119, 70121, 70122, 70123, 70124, 70125, 70126, 70127, 70128, 70129, 70130, 70131, 70139, 70140, 70141, 70142, 70143, 70145, 70146, 70148, 70149, 70150, 70151, 70152, 70153, 70154, 70156, 70157, 70158, 70159, 70160, 70161, 70162, 70163, 70164, 70165, 70166, 70167, 70170, 70172, 70174, 70175, 70176, 70177, 70178, 70179, 70181, 70182, 70183, 70184, 70185, 70186, 70187, 70189, 70190, 70195, 70301, 70302, 70310, 70339, 70340, 70341, 70342, 70343, 70344, 70345, 70346, 70352, 70353, 70354, 70355, 70356, 70357, 70358, 70359, 70360, 70361, 70363, 70364, 70371, 70372, 70373, 70374, 70375, 70376, 70377, 70380, 70381, 70390, 70391, 70392, 70393, 70394, 70395, 70397, 70401, 70402, 70403, 70404, 70420, 70421, 70422, 70426, 70427, 70429, 70431, 70433, 70434, 70435, 70436, 70437, 70438, 70441, 70442, 70443, 70444, 70445, 70446, 70447, 70448, 70449, 70450, 70451, 70452, 70453, 70454, 70455, 70456, 70457, 70458, 70459, 70460, 70461, 70462, 70463, 70464, 70465, 70466, 70467, 70469, 70470, 70471, 70501, 70502, 70503, 70504, 70505, 70506, 70507, 70508, 70509, 70510, 70511, 70512, 70513, 70514, 70515, 70516, 70517, 70518, 70519, 70520, 70521, 70522, 70523, 70524, 70525, 70526, 70527, 70528, 70529, 70531, 70532, 70533, 70534, 70535, 70537, 70538, 70540, 70541, 70542, 70543, 70544, 70546, 70548, 70549, 70550, 70551, 70552, 70554, 70555, 70556, 70558, 70559, 70560, 70562, 70563, 70569, 70570, 70571, 70575, 70576, 70577, 70578, 70580, 70581, 70582, 70583, 70584, 70585, 70586, 70589, 70591, 70592, 70593, 70596, 70598, 70601, 70602, 70605, 70606, 70607, 70609, 70611, 70612, 70615, 70616, 70629, 70630, 70631, 70632, 70633, 70634, 70637, 70638, 70639, 70640, 70642, 70643, 70644, 70645, 70646, 70647, 70648, 70650, 70651, 70652, 70653, 70654, 70655, 70656, 70657, 70658, 70659, 70660, 70661, 70662, 70663, 70664, 70665, 70668, 70669, 70704, 70706, 70707, 70710, 70711, 70712, 70714, 70715, 70716, 70717, 70718, 70719, 70720, 70721, 70722, 70723, 70725, 70726, 70727, 70728, 70729, 70730, 70732, 70733, 70734, 70736, 70737, 70738, 70739, 70740, 70743, 70744, 70747, 70748, 70749, 70750, 70751, 70752, 70753, 70754, 70755, 70756, 70757, 70759, 70760, 70761, 70762, 70763, 70764, 70765, 70767, 70769, 70770, 70772, 70773, 70774, 70775, 70776, 70777, 70778, 70780, 70781, 70782, 70783, 70784, 70785, 70786, 70787, 70788, 70789, 70791, 70792, 70801, 70802, 70803, 70804, 70805, 70806, 70807, 70808, 70809, 70810, 70811, 70812, 70813, 70814, 70815, 70816, 70817, 70818, 70819, 70820, 70821, 70822, 70823, 70825, 70826, 70827, 70831, 70833, 70835, 70836, 70837, 70874, 70879, 70883, 70884, 70892, 70893, 70894, 70895, 70896, 70898, 71001, 71002, 71003, 71004, 71006, 71007, 71008, 71009, 71016, 71018, 71019, 71021, 71023, 71024, 71025, 71027, 71028, 71029, 71030, 71031, 71032, 71033, 71034, 71036, 71037, 71038, 71039, 71040, 71043, 71044, 71045, 71046, 71047, 71048, 71049, 71050, 71051, 71052, 71055, 71058, 71060, 71061, 71063, 71064, 71065, 71066, 71067, 71068, 71069, 71070, 71071, 71072, 71073, 71075, 71078, 71079, 71080, 71082, 71101, 71102, 71103, 71104, 71105, 71106, 71107, 71108, 71109, 71110, 71111, 71112, 71113, 71115, 71118, 71119, 71120, 71129, 71130, 71133, 71134, 71135, 71136, 71137, 71138, 71148, 71149, 71151, 71152, 71153, 71154, 71156, 71161, 71162, 71163, 71164, 71165, 71166, 71171, 71172, 71201, 71202, 71203, 71207, 71208, 71209, 71210, 71211, 71212, 71213, 71218, 71219, 71220, 71221, 71222, 71223, 71225, 71226, 71227, 71229, 71230, 71232, 71233, 71234, 71235, 71237, 71238, 71240, 71241, 71242, 71243, 71245, 71247, 71249, 71250, 71251, 71253, 71254, 71256, 71259, 71260, 71261, 71263, 71264, 71266, 71268, 71269, 71270, 71272, 71273, 71275, 71276, 71277, 71279, 71280, 71281, 71282, 71284, 71286, 71291, 71292, 71294, 71295, 71301, 71302, 71303, 71306, 71307, 71309, 71315, 71316, 71320, 71322, 71323, 71324, 71325, 71326, 71327, 71328, 71329, 71330, 71331, 71333, 71334, 71336, 71339, 71340, 71341, 71342, 71343, 71345, 71346, 71348, 71350, 71351, 71353, 71354, 71355, 71356, 71357, 71358, 71359, 71360, 71361, 71362, 71363, 71365, 71366, 71367, 71368, 71369, 71371, 71373, 71375, 71377, 71378, 71401, 71403, 71404, 71405, 71406, 71407, 71409, 71410, 71411, 71414, 71415, 71416, 71417, 71418, 71419, 71422, 71423, 71424, 71425, 71426, 71427, 71428, 71429, 71430, 71431, 71432, 71433, 71434, 71435, 71438, 71439, 71440, 71441, 71443, 71444, 71446, 71447, 71448, 71449, 71450, 71452, 71454, 71455, 71456, 71457, 71458, 71459, 71460, 71461, 71462, 71463, 71465, 71466, 71467, 71468, 71469, 71471, 71472, 71473, 71474, 71475, 71477, 71479, 71480, 71481, 71483, 71485, 71486, 71496, 71497, 71601, 71602, 71603, 71611, 71612, 71613, 71630, 71631, 71635, 71638, 71639, 71640, 71642, 71643, 71644, 71646, 71647, 71649, 71650, 71651, 71652, 71653, 71654, 71655, 71656, 71657, 71658, 71659, 71660, 71661, 71662, 71663, 71665, 71666, 71667, 71670, 71671, 71674, 71675, 71676, 71677, 71678, 71701, 71711, 71720, 71721, 71722, 71724, 71725, 71726, 71728, 71730, 71731, 71740, 71742, 71743, 71744, 71745, 71747, 71748, 71749, 71750, 71751, 71752, 71753, 71754, 71758, 71759, 71762, 71763, 71764, 71765, 71766, 71767, 71768, 71769, 71770, 71772, 71801, 71802, 71820, 71822, 71823, 71825, 71826, 71827, 71828, 71831, 71832, 71833, 71834, 71835, 71836, 71837, 71838, 71839, 71840, 71841, 71842, 71844, 71845, 71846, 71847, 71851, 71852, 71853, 71854, 71855, 71857, 71858, 71859, 71860, 71861, 71862, 71864, 71865, 71866, 71901, 71902, 71903, 71909, 71910, 71913, 71914, 71920, 71921, 71922, 71923, 71929, 71932, 71933, 71935, 71937, 71940, 71941, 71942, 71943, 71944, 71945, 71946, 71949, 71950, 71951, 71952, 71953, 71956, 71957, 71958, 71959, 71960, 71961, 71962, 71964, 71965, 71966, 71968, 71969, 71970, 71971, 71972, 71973, 71998, 71999, 72001, 72002, 72003, 72004, 72005, 72006, 72007, 72010, 72011, 72012, 72013, 72014, 72015, 72016, 72017, 72018, 72020, 72021, 72022, 72023, 72024, 72025, 72026, 72027, 72028, 72029, 72030, 72031, 72032, 72033, 72034, 72035, 72036, 72037, 72038, 72039, 72040, 72041, 72042, 72043, 72044, 72045, 72046, 72047, 72048, 72051, 72052, 72053, 72055, 72057, 72058, 72059, 72060, 72061, 72063, 72064, 72065, 72066, 72067, 72068, 72069, 72070, 72071, 72072, 72073, 72074, 72075, 72076, 72078, 72079, 72080, 72081, 72082, 72083, 72084, 72085, 72086, 72087, 72088, 72089, 72099, 72101, 72102, 72103, 72104, 72105, 72106, 72107, 72108, 72110, 72111, 72112, 72113, 72114, 72115, 72116, 72117, 72118, 72119, 72120, 72121, 72122, 72123, 72124, 72125, 72126, 72127, 72128, 72129, 72130, 72131, 72132, 72133, 72134, 72135, 72136, 72137, 72139, 72140, 72141, 72142, 72143, 72145, 72149, 72150, 72152, 72153, 72156, 72157, 72158, 72160, 72164, 72165, 72166, 72167, 72168, 72169, 72170, 72173, 72175, 72176, 72178, 72179, 72180, 72181, 72182, 72183, 72189, 72190, 72199, 72201, 72202, 72203, 72204, 72205, 72206, 72207, 72209, 72210, 72211, 72212, 72214, 72215, 72216, 72217, 72219, 72221, 72222, 72223, 72225, 72227, 72231, 72260, 72295, 72301, 72303, 72310, 72311, 72312, 72313, 72314, 72315, 72316, 72319, 72320, 72321, 72322, 72324, 72325, 72326, 72327, 72328, 72329, 72330, 72331, 72332, 72333, 72335, 72336, 72338, 72339, 72340, 72341, 72342, 72346, 72347, 72348, 72350, 72351, 72352, 72353, 72354, 72355, 72358, 72359, 72360, 72364, 72365, 72366, 72367, 72368, 72369, 72370, 72372, 72373, 72374, 72376, 72377, 72379, 72381, 72383, 72384, 72385, 72386, 72387, 72389, 72390, 72391, 72392, 72394, 72395, 72396, 72401, 72402, 72403, 72404, 72410, 72411, 72412, 72413, 72414, 72415, 72416, 72417, 72419, 72421, 72422, 72424, 72425, 72426, 72427, 72428, 72429, 72430, 72431, 72432, 72433, 72434, 72435, 72436, 72437, 72438, 72439, 72440, 72441, 72442, 72443, 72444, 72445, 72447, 72449, 72450, 72451, 72453, 72454, 72455, 72456, 72457, 72458, 72459, 72460, 72461, 72462, 72464, 72465, 72466, 72467, 72469, 72470, 72471, 72472, 72473, 72474, 72475, 72476, 72478, 72479, 72482, 72501, 72503, 72512, 72513, 72515, 72516, 72517, 72519, 72520, 72521, 72522, 72523, 72524, 72525, 72526, 72527, 72528, 72529, 72530, 72531, 72532, 72533, 72534, 72536, 72537, 72538, 72539, 72540, 72542, 72543, 72544, 72545, 72546, 72550, 72553, 72554, 72555, 72556, 72557, 72560, 72561, 72562, 72564, 72565, 72566, 72567, 72568, 72569, 72571, 72572, 72573, 72575, 72576, 72577, 72578, 72579, 72581, 72583, 72584, 72585, 72587, 72601, 72602, 72610, 72611, 72613, 72615, 72616, 72617, 72619, 72623, 72624, 72626, 72628, 72629, 72630, 72631, 72632, 72633, 72634, 72635, 72636, 72638, 72639, 72640, 72641, 72642, 72644, 72645, 72648, 72650, 72651, 72653, 72654, 72655, 72657, 72658, 72659, 72660, 72661, 72662, 72663, 72666, 72668, 72669, 72670, 72672, 72675, 72677, 72679, 72680, 72682, 72683, 72685, 72686, 72687, 72701, 72702, 72703, 72704, 72711, 72712, 72714, 72715, 72716, 72717, 72718, 72719, 72721, 72722, 72727, 72728, 72729, 72730, 72732, 72733, 72734, 72735, 72736, 72737, 72738, 72739, 72740, 72741, 72742, 72744, 72745, 72747, 72749, 72751, 72752, 72753, 72756, 72757, 72758, 72760, 72761, 72762, 72764, 72765, 72766, 72768, 72769, 72770, 72773, 72774, 72776, 72801, 72802, 72811, 72812, 72820, 72821, 72823, 72824, 72826, 72827, 72828, 72829, 72830, 72832, 72833, 72834, 72835, 72837, 72838, 72839, 72840, 72841, 72842, 72843, 72845, 72846, 72847, 72851, 72852, 72853, 72854, 72855, 72856, 72857, 72858, 72860, 72863, 72865, 72901, 72902, 72903, 72904, 72905, 72906, 72908, 72913, 72914, 72916, 72917, 72918, 72919, 72921, 72923, 72924, 72926, 72927, 72928, 72930, 72932, 72933, 72934, 72935, 72936, 72937, 72938, 72940, 72941, 72943, 72944, 72945, 72946, 72947, 72948, 72949, 72950, 72951, 72952, 72955, 72956, 72957, 72958, 72959, 73001, 73002, 73003, 73004, 73005, 73006, 73007, 73008, 73009, 73010, 73011, 73012, 73013, 73014, 73015, 73016, 73017, 73018, 73019, 73020, 73021, 73022, 73023, 73024, 73026, 73027, 73028, 73029, 73030, 73031, 73032, 73033, 73034, 73036, 73038, 73040, 73041, 73042, 73043, 73044, 73045, 73047, 73048, 73049, 73050, 73051, 73052, 73053, 73054, 73055, 73056, 73057, 73058, 73059, 73061, 73062, 73063, 73064, 73065, 73066, 73067, 73068, 73069, 73070, 73071, 73072, 73073, 73074, 73075, 73077, 73078, 73079, 73080, 73082, 73083, 73084, 73085, 73086, 73089, 73090, 73092, 73093, 73094, 73095, 73096, 73097, 73098, 73099, 73101, 73102, 73103, 73104, 73105, 73106, 73107, 73108, 73109, 73110, 73111, 73112, 73113, 73114, 73115, 73116, 73117, 73118, 73119, 73120, 73121, 73122, 73123, 73124, 73125, 73126, 73127, 73128, 73129, 73130, 73131, 73132, 73134, 73135, 73136, 73137, 73139, 73140, 73141, 73142, 73143, 73144, 73145, 73146, 73147, 73148, 73149, 73150, 73151, 73152, 73153, 73154, 73155, 73156, 73157, 73159, 73160, 73162, 73163, 73164, 73165, 73167, 73169, 73170, 73172, 73173, 73177, 73178, 73179, 73180, 73184, 73185, 73189, 73190, 73193, 73194, 73195, 73196, 73197, 73198, 73199, 73301, 73344, 73401, 73402, 73403, 73425, 73430, 73432, 73433, 73434, 73435, 73436, 73437, 73438, 73439, 73440, 73441, 73442, 73443, 73444, 73446, 73447, 73448, 73449, 73450, 73453, 73455, 73456, 73458, 73459, 73460, 73461, 73463, 73476, 73481, 73487, 73488, 73491, 73501, 73502, 73503, 73505, 73506, 73507, 73520, 73521, 73522, 73523, 73526, 73527, 73528, 73529, 73530, 73531, 73532, 73533, 73534, 73536, 73537, 73538, 73539, 73540, 73541, 73542, 73543, 73544, 73546, 73547, 73548, 73549, 73550, 73551, 73552, 73553, 73554, 73555, 73556, 73557, 73558, 73559, 73560, 73561, 73562, 73564, 73565, 73566, 73567, 73568, 73569, 73570, 73571, 73572, 73573, 73575, 73601, 73620, 73622, 73624, 73625, 73626, 73627, 73628, 73632, 73638, 73639, 73641, 73642, 73644, 73645, 73646, 73647, 73648, 73650, 73651, 73654, 73655, 73658, 73659, 73660, 73661, 73662, 73663, 73664, 73666, 73667, 73668, 73669, 73673, 73701, 73702, 73703, 73705, 73706, 73716, 73717, 73718, 73719, 73720, 73722, 73724, 73726, 73727, 73728, 73729, 73730, 73731, 73733, 73734, 73735, 73736, 73737, 73738, 73739, 73741, 73742, 73743, 73744, 73746, 73747, 73749, 73750, 73753, 73754, 73755, 73756, 73757, 73758, 73759, 73760, 73761, 73762, 73763, 73764, 73766, 73768, 73770, 73771, 73772, 73773, 73801, 73802, 73832, 73834, 73835, 73838, 73840, 73841, 73842, 73843, 73844, 73847, 73848, 73851, 73852, 73853, 73855, 73857, 73858, 73859, 73860, 73901, 73931, 73932, 73933, 73937, 73938, 73939, 73942, 73944, 73945, 73946, 73947, 73949, 73950, 73951, 74001, 74002, 74003, 74004, 74005, 74006, 74008, 74009, 74010, 74011, 74012, 74013, 74014, 74015, 74016, 74017, 74018, 74020, 74021, 74022, 74023, 74026, 74027, 74028, 74029, 74030, 74031, 74032, 74033, 74034, 74035, 74036, 74037, 74038, 74039, 74041, 74042, 74043, 74044, 74045, 74046, 74047, 74048, 74050, 74051, 74052, 74053, 74054, 74055, 74056, 74058, 74059, 74060, 74061, 74062, 74063, 74066, 74067, 74068, 74070, 74071, 74072, 74073, 74074, 74075, 74076, 74077, 74078, 74079, 74080, 74081, 74082, 74083, 74084, 74085, 74101, 74102, 74103, 74104, 74105, 74106, 74107, 74108, 74110, 74112, 74114, 74115, 74116, 74117, 74119, 74120, 74121, 74126, 74127, 74128, 74129, 74130, 74131, 74132, 74133, 74134, 74135, 74136, 74137, 74141, 74145, 74146, 74147, 74148, 74149, 74150, 74152, 74153, 74155, 74156, 74157, 74158, 74159, 74169, 74170, 74171, 74172, 74182, 74183, 74184, 74186, 74187, 74189, 74192, 74193, 74194, 74301, 74330, 74331, 74332, 74333, 74335, 74337, 74338, 74339, 74340, 74342, 74343, 74344, 74345, 74346, 74347, 74349, 74350, 74352, 74354, 74355, 74358, 74359, 74360, 74361, 74362, 74363, 74364, 74365, 74366, 74367, 74368, 74369, 74370, 74401, 74402, 74403, 74421, 74422, 74423, 74425, 74426, 74427, 74428, 74429, 74430, 74431, 74432, 74434, 74435, 74436, 74437, 74438, 74440, 74441, 74442, 74444, 74445, 74446, 74447, 74450, 74451, 74452, 74454, 74455, 74456, 74457, 74458, 74459, 74460, 74461, 74462, 74463, 74464, 74465, 74466, 74467, 74468, 74469, 74470, 74471, 74472, 74477, 74501, 74502, 74521, 74522, 74523, 74525, 74528, 74529, 74530, 74531, 74533, 74534, 74535, 74536, 74538, 74540, 74542, 74543, 74545, 74546, 74547, 74549, 74552, 74553, 74554, 74555, 74556, 74557, 74558, 74559, 74560, 74561, 74562, 74563, 74565, 74567, 74569, 74570, 74571, 74572, 74574, 74576, 74577, 74578, 74601, 74602, 74603, 74604, 74630, 74631, 74632, 74633, 74636, 74637, 74640, 74641, 74643, 74644, 74646, 74647, 74650, 74651, 74652, 74653, 74701, 74702, 74720, 74721, 74722, 74723, 74724, 74726, 74727, 74728, 74729, 74730, 74731, 74733, 74734, 74735, 74736, 74737, 74738, 74740, 74741, 74743, 74745, 74747, 74748, 74750, 74752, 74753, 74754, 74755, 74756, 74759, 74760, 74761, 74764, 74766, 74801, 74802, 74804, 74818, 74820, 74821, 74824, 74825, 74826, 74827, 74829, 74830, 74831, 74832, 74833, 74834, 74836, 74837, 74839, 74840, 74842, 74843, 74844, 74845, 74848, 74849, 74850, 74851, 74852, 74854, 74855, 74856, 74857, 74859, 74860, 74864, 74865, 74866, 74867, 74868, 74869, 74871, 74872, 74873, 74875, 74878, 74880, 74881, 74883, 74884, 74901, 74902, 74930, 74931, 74932, 74935, 74936, 74937, 74939, 74940, 74941, 74942, 74943, 74944, 74945, 74946, 74947, 74948, 74949, 74951, 74953, 74954, 74955, 74956, 74957, 74959, 74960, 74962, 74963, 74964, 74965, 74966, 75001, 75002, 75006, 75007, 75008, 75009, 75010, 75011, 75013, 75014, 75015, 75016, 75017, 75019, 75020, 75021, 75022, 75023, 75024, 75025, 75026, 75027, 75028, 75029, 75030, 75032, 75034, 75035, 75037, 75038, 75039, 75040, 75041, 75042, 75043, 75044, 75045, 75046, 75047, 75048, 75049, 75050, 75051, 75052, 75053, 75054, 75056, 75057, 75058, 75060, 75061, 75062, 75063, 75065, 75067, 75068, 75069, 75070, 75071, 75074, 75075, 75076, 75077, 75078, 75080, 75081, 75082, 75083, 75085, 75086, 75087, 75088, 75089, 75090, 75091, 75092, 75093, 75094, 75097, 75098, 75099, 75101, 75102, 75103, 75104, 75105, 75106, 75109, 75110, 75114, 75115, 75116, 75117, 75118, 75119, 75120, 75121, 75123, 75124, 75125, 75126, 75127, 75132, 75134, 75135, 75137, 75138, 75140, 75141, 75142, 75143, 75144, 75146, 75147, 75148, 75149, 75150, 75151, 75152, 75153, 75154, 75155, 75157, 75158, 75159, 75160, 75161, 75163, 75164, 75165, 75166, 75167, 75168, 75169, 75172, 75173, 75180, 75181, 75182, 75185, 75187, 75189, 75201, 75202, 75203, 75204, 75205, 75206, 75207, 75208, 75209, 75210, 75211, 75212, 75214, 75215, 75216, 75217, 75218, 75219, 75220, 75221, 75222, 75223, 75224, 75225, 75226, 75227, 75228, 75229, 75230, 75231, 75232, 75233, 75234, 75235, 75236, 75237, 75238, 75239, 75240, 75241, 75242, 75243, 75244, 75245, 75246, 75247, 75248, 75249, 75250, 75251, 75252, 75253, 75254, 75258, 75260, 75261, 75262, 75263, 75264, 75265, 75266, 75267, 75270, 75275, 75277, 75283, 75284, 75285, 75286, 75287, 75295, 75301, 75303, 75310, 75312, 75313, 75315, 75320, 75323, 75326, 75336, 75339, 75342, 75346, 75353, 75354, 75355, 75356, 75357, 75359, 75360, 75363, 75364, 75367, 75368, 75370, 75371, 75372, 75373, 75374, 75376, 75378, 75379, 75380, 75381, 75382, 75386, 75387, 75388, 75389, 75390, 75391, 75392, 75393, 75394, 75395, 75396, 75397, 75398, 75401, 75402, 75403, 75404, 75407, 75409, 75410, 75411, 75412, 75413, 75414, 75415, 75416, 75417, 75418, 75420, 75421, 75422, 75423, 75424, 75425, 75426, 75428, 75429, 75431, 75432, 75433, 75434, 75435, 75436, 75437, 75438, 75439, 75440, 75441, 75442, 75443, 75444, 75446, 75447, 75448, 75449, 75450, 75451, 75452, 75453, 75454, 75455, 75456, 75457, 75458, 75459, 75460, 75461, 75462, 75468, 75469, 75470, 75471, 75472, 75473, 75474, 75475, 75476, 75477, 75478, 75479, 75480, 75481, 75482, 75483, 75485, 75486, 75487, 75488, 75489, 75490, 75491, 75492, 75493, 75494, 75495, 75496, 75497, 75501, 75503, 75504, 75505, 75507, 75550, 75551, 75554, 75555, 75556, 75558, 75559, 75560, 75561, 75562, 75563, 75564, 75565, 75566, 75567, 75568, 75569, 75570, 75571, 75572, 75573, 75574, 75599, 75601, 75602, 75603, 75604, 75605, 75606, 75607, 75608, 75615, 75630, 75631, 75633, 75636, 75637, 75638, 75639, 75640, 75641, 75642, 75643, 75644, 75645, 75647, 75650, 75651, 75652, 75653, 75654, 75656, 75657, 75658, 75659, 75660, 75661, 75662, 75663, 75666, 75667, 75668, 75669, 75670, 75671, 75672, 75680, 75681, 75682, 75683, 75684, 75685, 75686, 75687, 75688, 75689, 75691, 75692, 75693, 75694, 75701, 75702, 75703, 75704, 75705, 75706, 75707, 75708, 75709, 75710, 75711, 75712, 75713, 75750, 75751, 75752, 75754, 75755, 75756, 75757, 75758, 75759, 75760, 75762, 75763, 75764, 75765, 75766, 75770, 75771, 75772, 75773, 75778, 75779, 75780, 75782, 75783, 75784, 75785, 75788, 75789, 75790, 75791, 75792, 75798, 75799, 75801, 75802, 75803, 75831, 75832, 75833, 75834, 75835, 75838, 75839, 75840, 75844, 75845, 75846, 75847, 75848, 75849, 75850, 75851, 75852, 75853, 75855, 75856, 75858, 75859, 75860, 75861, 75862, 75865, 75880, 75882, 75884, 75886, 75901, 75902, 75903, 75904, 75915, 75925, 75926, 75928, 75929, 75930, 75931, 75932, 75933, 75934, 75935, 75936, 75937, 75938, 75939, 75941, 75942, 75943, 75944, 75946, 75947, 75948, 75949, 75951, 75954, 75956, 75958, 75959, 75960, 75961, 75962, 75963, 75964, 75965, 75966, 75968, 75969, 75972, 75973, 75974, 75975, 75976, 75977, 75978, 75979, 75980, 75990, 76001, 76002, 76003, 76004, 76005, 76006, 76007, 76008, 76009, 76010, 76011, 76012, 76013, 76014, 76015, 76016, 76017, 76018, 76019, 76020, 76021, 76022, 76023, 76028, 76031, 76033, 76034, 76035, 76036, 76039, 76040, 76041, 76043, 76044, 76048, 76049, 76050, 76051, 76052, 76053, 76054, 76055, 76058, 76059, 76060, 76061, 76063, 76064, 76065, 76066, 76067, 76068, 76070, 76071, 76073, 76077, 76078, 76082, 76084, 76085, 76086, 76087, 76088, 76092, 76093, 76094, 76095, 76096, 76097, 76098, 76099, 76101, 76102, 76103, 76104, 76105, 76106, 76107, 76108, 76109, 76110, 76111, 76112, 76113, 76114, 76115, 76116, 76117, 76118, 76119, 76120, 76121, 76122, 76123, 76124, 76126, 76127, 76129, 76130, 76131, 76132, 76133, 76134, 76135, 76136, 76137, 76140, 76147, 76148, 76150, 76155, 76161, 76162, 76163, 76164, 76177, 76178, 76179, 76180, 76181, 76182, 76185, 76191, 76192, 76193, 76195, 76196, 76197, 76198, 76199, 76201, 76202, 76203, 76204, 76205, 76206, 76207, 76208, 76209, 76210, 76225, 76226, 76227, 76228, 76230, 76233, 76234, 76238, 76239, 76240, 76241, 76244, 76245, 76246, 76247, 76248, 76249, 76250, 76251, 76252, 76253, 76255, 76258, 76259, 76261, 76262, 76263, 76264, 76265, 76266, 76267, 76268, 76270, 76271, 76272, 76273, 76299, 76301, 76302, 76305, 76306, 76307, 76308, 76309, 76310, 76311, 76351, 76352, 76354, 76357, 76360, 76363, 76364, 76365, 76366, 76367, 76369, 76370, 76371, 76372, 76373, 76374, 76377, 76379, 76380, 76384, 76385, 76388, 76389, 76401, 76402, 76424, 76426, 76427, 76429, 76430, 76431, 76432, 76433, 76435, 76436, 76437, 76439, 76442, 76443, 76444, 76445, 76446, 76448, 76449, 76450, 76452, 76453, 76454, 76455, 76457, 76458, 76459, 76460, 76461, 76462, 76463, 76464, 76465, 76466, 76467, 76468, 76469, 76470, 76471, 76472, 76474, 76475, 76476, 76481, 76483, 76484, 76485, 76486, 76487, 76490, 76491, 76501, 76502, 76503, 76504, 76505, 76508, 76511, 76513, 76518, 76519, 76520, 76522, 76523, 76524, 76525, 76526, 76527, 76528, 76530, 76531, 76533, 76534, 76537, 76538, 76539, 76540, 76541, 76542, 76543, 76544, 76545, 76546, 76547, 76548, 76549, 76550, 76552, 76554, 76555, 76556, 76557, 76558, 76559, 76561, 76564, 76565, 76566, 76567, 76569, 76570, 76571, 76573, 76574, 76577, 76578, 76579, 76596, 76597, 76598, 76599, 76621, 76622, 76623, 76624, 76626, 76627, 76628, 76629, 76630, 76631, 76632, 76633, 76634, 76635, 76636, 76637, 76638, 76639, 76640, 76641, 76642, 76643, 76644, 76645, 76648, 76649, 76650, 76651, 76652, 76653, 76654, 76655, 76656, 76657, 76660, 76661, 76664, 76665, 76666, 76667, 76670, 76671, 76673, 76675, 76676, 76677, 76678, 76679, 76680, 76681, 76682, 76684, 76685, 76686, 76687, 76689, 76690, 76691, 76692, 76693, 76701, 76702, 76703, 76704, 76705, 76706, 76707, 76708, 76710, 76711, 76712, 76714, 76715, 76716, 76795, 76797, 76798, 76799, 76801, 76802, 76803, 76804, 76820, 76821, 76823, 76824, 76825, 76827, 76828, 76831, 76832, 76834, 76836, 76837, 76841, 76842, 76844, 76845, 76848, 76849, 76852, 76853, 76854, 76855, 76856, 76857, 76858, 76859, 76861, 76862, 76864, 76865, 76866, 76867, 76869, 76870, 76871, 76872, 76873, 76874, 76875, 76877, 76878, 76880, 76882, 76883, 76884, 76885, 76886, 76887, 76888, 76890, 76901, 76902, 76903, 76904, 76905, 76906, 76908, 76909, 76930, 76932, 76933, 76934, 76935, 76936, 76937, 76939, 76940, 76941, 76943, 76945, 76949, 76950, 76951, 76953, 76955, 76957, 76958, 77001, 77002, 77003, 77004, 77005, 77006, 77007, 77008, 77009, 77010, 77011, 77012, 77013, 77014, 77015, 77016, 77017, 77018, 77019, 77020, 77021, 77022, 77023, 77024, 77025, 77026, 77027, 77028, 77029, 77030, 77031, 77032, 77033, 77034, 77035, 77036, 77037, 77038, 77039, 77040, 77041, 77042, 77043, 77044, 77045, 77046, 77047, 77048, 77049, 77050, 77051, 77052, 77053, 77054, 77055, 77056, 77057, 77058, 77059, 77060, 77061, 77062, 77063, 77064, 77065, 77066, 77067, 77068, 77069, 77070, 77071, 77072, 77073, 77074, 77075, 77076, 77077, 77078, 77079, 77080, 77081, 77082, 77083, 77084, 77085, 77086, 77087, 77088, 77089, 77090, 77091, 77092, 77093, 77094, 77095, 77096, 77097, 77098, 77099, 77201, 77202, 77203, 77204, 77205, 77206, 77207, 77208, 77209, 77210, 77212, 77213, 77215, 77216, 77217, 77218, 77219, 77220, 77221, 77222, 77223, 77224, 77225, 77226, 77227, 77228, 77229, 77230, 77231, 77233, 77234, 77235, 77236, 77237, 77238, 77240, 77241, 77242, 77243, 77244, 77245, 77248, 77249, 77251, 77252, 77253, 77254, 77255, 77256, 77257, 77258, 77259, 77261, 77262, 77263, 77265, 77266, 77267, 77268, 77269, 77270, 77271, 77272, 77273, 77274, 77275, 77277, 77279, 77280, 77281, 77282, 77284, 77287, 77288, 77289, 77290, 77291, 77292, 77293, 77297, 77298, 77299, 77301, 77302, 77303, 77304, 77305, 77306, 77315, 77316, 77318, 77320, 77325, 77326, 77327, 77328, 77331, 77332, 77333, 77334, 77335, 77336, 77337, 77338, 77339, 77340, 77341, 77342, 77343, 77344, 77345, 77346, 77347, 77348, 77349, 77350, 77351, 77353, 77354, 77355, 77356, 77357, 77358, 77359, 77360, 77362, 77363, 77364, 77365, 77367, 77368, 77369, 77371, 77372, 77373, 77374, 77375, 77376, 77377, 77378, 77379, 77380, 77381, 77382, 77383, 77384, 77385, 77386, 77387, 77388, 77389, 77391, 77393, 77396, 77399, 77401, 77402, 77404, 77406, 77410, 77411, 77412, 77413, 77414, 77415, 77417, 77418, 77419, 77420, 77422, 77423, 77426, 77428, 77429, 77430, 77431, 77432, 77433, 77434, 77435, 77436, 77437, 77440, 77441, 77442, 77443, 77444, 77445, 77446, 77447, 77448, 77449, 77450, 77451, 77452, 77453, 77454, 77455, 77456, 77457, 77458, 77459, 77460, 77461, 77462, 77463, 77464, 77465, 77466, 77467, 77468, 77469, 77470, 77471, 77473, 77474, 77475, 77476, 77477, 77478, 77479, 77480, 77481, 77482, 77483, 77484, 77485, 77486, 77487, 77488, 77489, 77491, 77492, 77493, 77494, 77496, 77497, 77501, 77502, 77503, 77504, 77505, 77506, 77507, 77508, 77510, 77511, 77512, 77514, 77515, 77516, 77517, 77518, 77519, 77520, 77521, 77522, 77530, 77531, 77532, 77533, 77534, 77535, 77536, 77538, 77539, 77541, 77542, 77545, 77546, 77547, 77549, 77550, 77551, 77552, 77553, 77554, 77555, 77560, 77561, 77562, 77563, 77564, 77565, 77566, 77568, 77571, 77572, 77573, 77574, 77575, 77577, 77578, 77580, 77581, 77582, 77583, 77584, 77585, 77586, 77587, 77588, 77590, 77591, 77592, 77597, 77598, 77611, 77612, 77613, 77614, 77615, 77616, 77617, 77619, 77622, 77623, 77624, 77625, 77626, 77627, 77629, 77630, 77631, 77632, 77639, 77640, 77641, 77642, 77643, 77650, 77651, 77655, 77656, 77657, 77659, 77660, 77661, 77662, 77663, 77664, 77665, 77670, 77701, 77702, 77703, 77704, 77705, 77706, 77707, 77708, 77709, 77710, 77713, 77720, 77725, 77726, 77801, 77802, 77803, 77805, 77806, 77807, 77808, 77830, 77831, 77833, 77834, 77835, 77836, 77837, 77838, 77839, 77840, 77841, 77842, 77843, 77844, 77845, 77850, 77852, 77853, 77855, 77856, 77857, 77859, 77861, 77862, 77863, 77864, 77865, 77866, 77867, 77868, 77869, 77870, 77871, 77872, 77873, 77875, 77876, 77878, 77879, 77880, 77881, 77882, 77901, 77902, 77903, 77904, 77905, 77950, 77951, 77954, 77957, 77960, 77961, 77962, 77963, 77964, 77967, 77968, 77969, 77970, 77971, 77972, 77973, 77974, 77975, 77976, 77977, 77978, 77979, 77982, 77983, 77984, 77985, 77986, 77987, 77988, 77989, 77990, 77991, 77993, 77994, 77995, 78001, 78002, 78003, 78004, 78005, 78006, 78007, 78008, 78009, 78010, 78011, 78012, 78013, 78014, 78015, 78016, 78017, 78019, 78021, 78022, 78023, 78024, 78025, 78026, 78027, 78028, 78029, 78039, 78040, 78041, 78042, 78043, 78044, 78045, 78046, 78049, 78050, 78052, 78053, 78054, 78055, 78056, 78057, 78058, 78059, 78060, 78061, 78062, 78063, 78064, 78065, 78066, 78067, 78069, 78070, 78071, 78072, 78073, 78074, 78075, 78076, 78101, 78102, 78104, 78107, 78108, 78109, 78111, 78112, 78113, 78114, 78115, 78116, 78117, 78118, 78119, 78121, 78122, 78123, 78124, 78125, 78130, 78131, 78132, 78133, 78135, 78140, 78141, 78142, 78143, 78144, 78145, 78146, 78147, 78148, 78150, 78151, 78152, 78154, 78155, 78156, 78159, 78160, 78161, 78162, 78163, 78164, 78201, 78202, 78203, 78204, 78205, 78206, 78207, 78208, 78209, 78210, 78211, 78212, 78213, 78214, 78215, 78216, 78217, 78218, 78219, 78220, 78221, 78222, 78223, 78224, 78225, 78226, 78227, 78228, 78229, 78230, 78231, 78232, 78233, 78234, 78235, 78236, 78237, 78238, 78239, 78240, 78241, 78242, 78243, 78244, 78245, 78246, 78247, 78248, 78249, 78250, 78251, 78252, 78253, 78254, 78255, 78256, 78257, 78258, 78259, 78260, 78261, 78262, 78263, 78264, 78265, 78266, 78268, 78269, 78270, 78275, 78278, 78279, 78280, 78283, 78284, 78285, 78286, 78287, 78288, 78289, 78291, 78292, 78293, 78294, 78295, 78296, 78297, 78298, 78299, 78330, 78332, 78333, 78335, 78336, 78338, 78339, 78340, 78341, 78342, 78343, 78344, 78347, 78349, 78350, 78351, 78352, 78353, 78355, 78357, 78358, 78359, 78360, 78361, 78362, 78363, 78364, 78368, 78369, 78370, 78371, 78372, 78373, 78374, 78375, 78376, 78377, 78379, 78380, 78381, 78382, 78383, 78384, 78385, 78387, 78389, 78390, 78391, 78393, 78401, 78402, 78403, 78404, 78405, 78406, 78407, 78408, 78409, 78410, 78411, 78412, 78413, 78414, 78415, 78416, 78417, 78418, 78419, 78426, 78427, 78460, 78461, 78463, 78465, 78466, 78467, 78468, 78469, 78470, 78471, 78472, 78473, 78474, 78475, 78476, 78477, 78478, 78480, 78501, 78502, 78503, 78504, 78505, 78516, 78520, 78521, 78522, 78523, 78526, 78535, 78536, 78537, 78538, 78539, 78540, 78543, 78545, 78547, 78548, 78549, 78550, 78551, 78552, 78553, 78557, 78558, 78559, 78560, 78561, 78562, 78563, 78564, 78565, 78566, 78567, 78568, 78569, 78570, 78572, 78573, 78575, 78576, 78577, 78578, 78579, 78580, 78582, 78583, 78584, 78585, 78586, 78588, 78589, 78590, 78591, 78592, 78593, 78594, 78595, 78596, 78597, 78598, 78599, 78602, 78603, 78604, 78605, 78606, 78607, 78608, 78609, 78610, 78611, 78612, 78613, 78614, 78615, 78616, 78617, 78618, 78619, 78620, 78621, 78622, 78623, 78624, 78626, 78627, 78628, 78629, 78630, 78631, 78632, 78634, 78635, 78636, 78638, 78639, 78640, 78641, 78642, 78643, 78644, 78645, 78646, 78648, 78650, 78651, 78652, 78653, 78654, 78655, 78656, 78657, 78658, 78659, 78660, 78661, 78662, 78663, 78664, 78665, 78666, 78667, 78669, 78670, 78671, 78672, 78673, 78674, 78675, 78676, 78677, 78680, 78681, 78682, 78683, 78691, 78701, 78702, 78703, 78704, 78705, 78708, 78709, 78710, 78711, 78712, 78713, 78714, 78715, 78716, 78717, 78718, 78719, 78720, 78721, 78722, 78723, 78724, 78725, 78726, 78727, 78728, 78729, 78730, 78731, 78732, 78733, 78734, 78735, 78736, 78737, 78738, 78739, 78741, 78742, 78744, 78745, 78746, 78747, 78748, 78749, 78750, 78751, 78752, 78753, 78754, 78755, 78756, 78757, 78758, 78759, 78760, 78761, 78762, 78763, 78764, 78765, 78766, 78767, 78768, 78769, 78772, 78773, 78774, 78778, 78779, 78780, 78781, 78783, 78785, 78786, 78788, 78789, 78799, 78801, 78802, 78827, 78828, 78829, 78830, 78832, 78833, 78834, 78836, 78837, 78838, 78839, 78840, 78841, 78842, 78843, 78847, 78850, 78851, 78852, 78853, 78860, 78861, 78870, 78871, 78872, 78873, 78877, 78879, 78880, 78881, 78883, 78884, 78885, 78886, 78931, 78932, 78933, 78934, 78935, 78938, 78940, 78941, 78942, 78943, 78944, 78945, 78946, 78947, 78948, 78949, 78950, 78951, 78952, 78953, 78954, 78956, 78957, 78959, 78960, 78961, 78962, 78963, 79001, 79002, 79003, 79005, 79007, 79008, 79009, 79010, 79011, 79012, 79013, 79014, 79015, 79016, 79018, 79019, 79021, 79022, 79024, 79025, 79027, 79029, 79031, 79032, 79033, 79034, 79035, 79036, 79039, 79040, 79041, 79042, 79043, 79044, 79045, 79046, 79051, 79052, 79053, 79054, 79056, 79057, 79058, 79059, 79061, 79062, 79063, 79064, 79065, 79066, 79068, 79070, 79072, 79073, 79077, 79078, 79079, 79080, 79081, 79082, 79083, 79084, 79085, 79086, 79087, 79088, 79091, 79092, 79093, 79094, 79095, 79096, 79097, 79098, 79101, 79102, 79103, 79104, 79105, 79106, 79107, 79108, 79109, 79110, 79111, 79114, 79116, 79117, 79118, 79119, 79120, 79121, 79123, 79124, 79159, 79163, 79164, 79165, 79166, 79167, 79168, 79170, 79171, 79172, 79174, 79175, 79178, 79180, 79181, 79182, 79184, 79185, 79186, 79187, 79189, 79201, 79220, 79221, 79222, 79223, 79224, 79225, 79226, 79227, 79229, 79230, 79231, 79232, 79233, 79234, 79235, 79236, 79237, 79238, 79239, 79240, 79241, 79243, 79244, 79245, 79247, 79248, 79250, 79251, 79252, 79255, 79256, 79257, 79258, 79259, 79261, 79311, 79312, 79313, 79314, 79316, 79320, 79322, 79323, 79324, 79325, 79326, 79329, 79330, 79331, 79336, 79338, 79339, 79342, 79343, 79344, 79345, 79346, 79347, 79350, 79351, 79353, 79355, 79356, 79357, 79358, 79359, 79360, 79363, 79364, 79366, 79367, 79369, 79370, 79371, 79372, 79373, 79376, 79377, 79378, 79379, 79380, 79381, 79382, 79383, 79401, 79402, 79403, 79404, 79405, 79406, 79407, 79408, 79409, 79410, 79411, 79412, 79413, 79414, 79415, 79416, 79423, 79424, 79430, 79452, 79453, 79457, 79464, 79490, 79491, 79493, 79499, 79501, 79502, 79503, 79504, 79505, 79506, 79508, 79510, 79511, 79512, 79516, 79517, 79518, 79519, 79520, 79521, 79525, 79526, 79527, 79528, 79529, 79530, 79532, 79533, 79534, 79535, 79536, 79537, 79538, 79539, 79540, 79541, 79543, 79544, 79545, 79546, 79547, 79548, 79549, 79550, 79553, 79556, 79560, 79561, 79562, 79563, 79565, 79566, 79567, 79601, 79602, 79603, 79604, 79605, 79606, 79607, 79608, 79697, 79698, 79699, 79701, 79702, 79703, 79704, 79705, 79706, 79707, 79708, 79710, 79711, 79712, 79713, 79714, 79718, 79719, 79720, 79721, 79730, 79731, 79733, 79734, 79735, 79738, 79739, 79740, 79741, 79742, 79743, 79744, 79745, 79748, 79749, 79752, 79754, 79755, 79756, 79758, 79759, 79760, 79761, 79762, 79763, 79764, 79765, 79766, 79768, 79769, 79770, 79772, 79776, 79777, 79778, 79779, 79780, 79781, 79782, 79783, 79785, 79786, 79788, 79789, 79821, 79830, 79831, 79832, 79834, 79835, 79836, 79837, 79838, 79839, 79842, 79843, 79845, 79846, 79847, 79848, 79849, 79850, 79851, 79852, 79853, 79854, 79855, 79901, 79902, 79903, 79904, 79905, 79906, 79907, 79908, 79910, 79911, 79912, 79913, 79914, 79915, 79916, 79917, 79918, 79920, 79922, 79923, 79924, 79925, 79926, 79927, 79928, 79929, 79930, 79931, 79932, 79934, 79935, 79936, 79937, 79938, 79940, 79941, 79942, 79943, 79944, 79945, 79946, 79947, 79948, 79949, 79950, 79951, 79952, 79953, 79954, 79955, 79958, 79960, 79961, 79966, 79968, 79973, 79974, 79975, 79976, 79977, 79978, 79980, 79982, 79983, 79984, 79985, 79986, 79987, 79988, 79989, 79990, 79991, 79992, 79993, 79994, 79995, 79996, 79997, 79998, 79999, 80001, 80002, 80003, 80004, 80005, 80006, 80007, 80010, 80011, 80012, 80013, 80014, 80015, 80016, 80017, 80018, 80019, 80020, 80021, 80022, 80024, 80025, 80026, 80027, 80028, 80030, 80031, 80033, 80034, 80035, 80036, 80037, 80038, 80040, 80041, 80042, 80044, 80045, 80046, 80047, 80101, 80102, 80103, 80104, 80105, 80106, 80107, 80110, 80111, 80112, 80116, 80117, 80118, 80120, 80121, 80122, 80123, 80124, 80125, 80126, 80127, 80128, 80129, 80130, 80131, 80132, 80133, 80134, 80135, 80136, 80137, 80138, 80150, 80151, 80154, 80155, 80160, 80161, 80162, 80163, 80165, 80166, 80201, 80202, 80203, 80204, 80205, 80206, 80207, 80208, 80209, 80210, 80211, 80212, 80214, 80215, 80216, 80217, 80218, 80219, 80220, 80221, 80222, 80223, 80224, 80225, 80226, 80227, 80228, 80229, 80230, 80231, 80232, 80233, 80234, 80235, 80236, 80237, 80238, 80239, 80241, 80243, 80244, 80246, 80248, 80249, 80250, 80251, 80252, 80254, 80255, 80256, 80257, 80259, 80260, 80261, 80262, 80263, 80264, 80265, 80266, 80270, 80271, 80273, 80274, 80275, 80279, 80280, 80281, 80285, 80290, 80291, 80292, 80293, 80294, 80295, 80299, 80301, 80302, 80303, 80304, 80305, 80306, 80307, 80308, 80309, 80310, 80314, 80321, 80322, 80323, 80328, 80329, 80401, 80402, 80403, 80419, 80420, 80421, 80422, 80423, 80424, 80425, 80426, 80427, 80428, 80429, 80430, 80432, 80433, 80434, 80435, 80436, 80437, 80438, 80439, 80440, 80442, 80443, 80444, 80446, 80447, 80448, 80449, 80451, 80452, 80453, 80454, 80455, 80456, 80457, 80459, 80461, 80463, 80465, 80466, 80467, 80468, 80469, 80470, 80471, 80473, 80474, 80475, 80476, 80477, 80478, 80479, 80480, 80481, 80482, 80483, 80487, 80488, 80497, 80498, 80501, 80502, 80503, 80504, 80510, 80511, 80512, 80513, 80514, 80515, 80516, 80517, 80520, 80521, 80522, 80523, 80524, 80525, 80526, 80527, 80528, 80530, 80532, 80533, 80534, 80535, 80536, 80537, 80538, 80539, 80540, 80541, 80542, 80543, 80544, 80545, 80546, 80547, 80549, 80550, 80551, 80553, 80601, 80602, 80603, 80610, 80611, 80612, 80614, 80615, 80620, 80621, 80622, 80623, 80624, 80631, 80632, 80633, 80634, 80638, 80639, 80640, 80642, 80643, 80644, 80645, 80646, 80648, 80649, 80650, 80651, 80652, 80653, 80654, 80701, 80705, 80720, 80721, 80722, 80723, 80726, 80727, 80728, 80729, 80731, 80732, 80733, 80734, 80735, 80736, 80737, 80740, 80741, 80742, 80743, 80744, 80745, 80746, 80747, 80749, 80750, 80751, 80754, 80755, 80757, 80758, 80759, 80801, 80802, 80804, 80805, 80807, 80808, 80809, 80810, 80812, 80813, 80814, 80815, 80816, 80817, 80818, 80819, 80820, 80821, 80822, 80823, 80824, 80825, 80826, 80827, 80828, 80829, 80830, 80831, 80832, 80833, 80834, 80835, 80836, 80840, 80841, 80860, 80861, 80862, 80863, 80864, 80866, 80901, 80903, 80904, 80905, 80906, 80907, 80908, 80909, 80910, 80911, 80912, 80913, 80914, 80915, 80916, 80917, 80918, 80919, 80920, 80921, 80922, 80925, 80926, 80928, 80929, 80930, 80931, 80932, 80933, 80934, 80935, 80936, 80937, 80940, 80941, 80942, 80943, 80944, 80945, 80946, 80947, 80949, 80950, 80960, 80962, 80970, 80977, 80995, 80997, 81001, 81002, 81003, 81004, 81005, 81006, 81007, 81008, 81009, 81010, 81011, 81012, 81013, 81014, 81015, 81019, 81020, 81021, 81022, 81023, 81024, 81025, 81027, 81029, 81030, 81033, 81034, 81036, 81038, 81039, 81040, 81041, 81042, 81043, 81044, 81045, 81046, 81047, 81049, 81050, 81052, 81054, 81055, 81057, 81058, 81059, 81062, 81063, 81064, 81066, 81067, 81069, 81071, 81073, 81074, 81076, 81077, 81081, 81082, 81084, 81087, 81089, 81090, 81091, 81092, 81101, 81102, 81120, 81121, 81122, 81123, 81124, 81125, 81126, 81127, 81128, 81129, 81130, 81131, 81132, 81133, 81134, 81135, 81136, 81137, 81138, 81140, 81141, 81143, 81144, 81146, 81147, 81148, 81149, 81151, 81152, 81153, 81154, 81155, 81157, 81201, 81210, 81211, 81212, 81215, 81220, 81221, 81222, 81223, 81224, 81225, 81226, 81227, 81228, 81230, 81231, 81232, 81233, 81235, 81236, 81237, 81239, 81240, 81241, 81242, 81243, 81244, 81246, 81247, 81248, 81251, 81252, 81253, 81290, 81301, 81302, 81303, 81320, 81321, 81323, 81324, 81325, 81326, 81327, 81328, 81329, 81330, 81331, 81332, 81334, 81335, 81401, 81402, 81410, 81411, 81413, 81414, 81415, 81416, 81418, 81419, 81420, 81421, 81422, 81423, 81424, 81425, 81426, 81427, 81428, 81429, 81430, 81431, 81432, 81433, 81434, 81435, 81501, 81502, 81503, 81504, 81505, 81506, 81520, 81521, 81522, 81523, 81524, 81525, 81526, 81527, 81601, 81602, 81610, 81611, 81612, 81615, 81620, 81621, 81623, 81624, 81625, 81626, 81630, 81631, 81632, 81633, 81635, 81636, 81637, 81638, 81639, 81640, 81641, 81642, 81643, 81645, 81646, 81647, 81648, 81649, 81650, 81652, 81653, 81654, 81655, 81656, 81657, 81658, 82001, 82002, 82003, 82005, 82006, 82007, 82008, 82009, 82010, 82050, 82051, 82052, 82053, 82054, 82055, 82058, 82059, 82060, 82061, 82063, 82070, 82071, 82072, 82073, 82081, 82082, 82083, 82084, 82190, 82201, 82210, 82212, 82213, 82214, 82215, 82217, 82218, 82219, 82221, 82222, 82223, 82224, 82225, 82227, 82229, 82240, 82242, 82243, 82244, 82301, 82310, 82321, 82322, 82323, 82324, 82325, 82327, 82329, 82331, 82332, 82334, 82335, 82336, 82401, 82410, 82411, 82412, 82414, 82420, 82421, 82422, 82423, 82426, 82427, 82428, 82430, 82431, 82432, 82433, 82434, 82435, 82440, 82441, 82442, 82443, 82450, 82501, 82510, 82512, 82513, 82514, 82515, 82516, 82520, 82523, 82524, 82601, 82602, 82604, 82605, 82609, 82615, 82620, 82630, 82631, 82633, 82635, 82636, 82637, 82638, 82639, 82640, 82642, 82643, 82644, 82646, 82648, 82649, 82701, 82710, 82711, 82712, 82713, 82714, 82715, 82716, 82717, 82718, 82720, 82721, 82723, 82725, 82727, 82729, 82730, 82731, 82732, 82801, 82831, 82832, 82833, 82834, 82835, 82836, 82837, 82838, 82839, 82840, 82842, 82844, 82845, 82901, 82902, 82922, 82923, 82925, 82929, 82930, 82931, 82932, 82933, 82934, 82935, 82936, 82937, 82938, 82939, 82941, 82942, 82943, 82944, 82945, 83001, 83002, 83011, 83012, 83013, 83014, 83025, 83101, 83110, 83111, 83112, 83113, 83114, 83115, 83116, 83118, 83119, 83120, 83121, 83122, 83123, 83124, 83126, 83127, 83128, 83201, 83202, 83203, 83204, 83205, 83206, 83209, 83210, 83211, 83212, 83213, 83214, 83215, 83217, 83218, 83220, 83221, 83223, 83226, 83227, 83228, 83229, 83230, 83232, 83233, 83234, 83235, 83236, 83237, 83238, 83239, 83241, 83243, 83244, 83245, 83246, 83250, 83251, 83252, 83253, 83254, 83255, 83256, 83261, 83262, 83263, 83271, 83272, 83274, 83276, 83277, 83278, 83281, 83283, 83285, 83286, 83287, 83301, 83302, 83303, 83311, 83312, 83313, 83314, 83316, 83318, 83320, 83321, 83322, 83323, 83324, 83325, 83327, 83328, 83330, 83332, 83333, 83334, 83335, 83336, 83337, 83338, 83340, 83341, 83342, 83343, 83344, 83346, 83347, 83348, 83349, 83350, 83352, 83353, 83354, 83355, 83401, 83402, 83403, 83404, 83405, 83406, 83415, 83420, 83421, 83422, 83423, 83424, 83425, 83427, 83428, 83429, 83431, 83433, 83434, 83435, 83436, 83438, 83440, 83441, 83442, 83443, 83444, 83445, 83446, 83447, 83448, 83449, 83450, 83451, 83452, 83454, 83455, 83460, 83462, 83463, 83464, 83465, 83466, 83467, 83468, 83469, 83501, 83520, 83522, 83523, 83524, 83525, 83526, 83530, 83531, 83533, 83535, 83536, 83537, 83539, 83540, 83541, 83542, 83543, 83544, 83545, 83546, 83547, 83548, 83549, 83551, 83552, 83553, 83554, 83555, 83601, 83602, 83604, 83605, 83606, 83607, 83610, 83611, 83612, 83615, 83616, 83617, 83619, 83620, 83622, 83623, 83624, 83626, 83627, 83628, 83629, 83630, 83631, 83632, 83633, 83634, 83635, 83636, 83637, 83638, 83639, 83641, 83642, 83643, 83644, 83645, 83647, 83648, 83650, 83651, 83652, 83653, 83654, 83655, 83656, 83657, 83660, 83661, 83666, 83669, 83670, 83671, 83672, 83676, 83677, 83680, 83686, 83687, 83701, 83702, 83703, 83704, 83705, 83706, 83707, 83708, 83709, 83711, 83712, 83713, 83714, 83715, 83716, 83717, 83719, 83720, 83721, 83722, 83723, 83724, 83725, 83726, 83727, 83728, 83729, 83730, 83731, 83732, 83733, 83735, 83744, 83756, 83757, 83788, 83799, 83801, 83802, 83803, 83804, 83805, 83806, 83808, 83809, 83810, 83811, 83812, 83813, 83814, 83815, 83816, 83821, 83822, 83823, 83824, 83825, 83826, 83827, 83830, 83832, 83833, 83834, 83835, 83836, 83837, 83839, 83840, 83841, 83842, 83843, 83844, 83845, 83846, 83847, 83848, 83849, 83850, 83851, 83852, 83853, 83854, 83855, 83856, 83857, 83858, 83860, 83861, 83862, 83864, 83865, 83866, 83867, 83868, 83869, 83870, 83871, 83872, 83873, 83874, 83876, 83877, 83888, 84001, 84002, 84003, 84004, 84006, 84007, 84008, 84010, 84011, 84013, 84014, 84015, 84016, 84017, 84018, 84020, 84021, 84022, 84023, 84024, 84025, 84026, 84027, 84028, 84029, 84030, 84031, 84032, 84033, 84034, 84035, 84036, 84037, 84038, 84039, 84040, 84041, 84042, 84043, 84044, 84046, 84047, 84049, 84050, 84051, 84052, 84053, 84054, 84055, 84056, 84057, 84058, 84059, 84060, 84061, 84062, 84063, 84064, 84065, 84066, 84067, 84068, 84069, 84070, 84071, 84072, 84073, 84074, 84075, 84076, 84078, 84079, 84080, 84082, 84083, 84084, 84085, 84086, 84087, 84088, 84089, 84090, 84091, 84092, 84093, 84094, 84095, 84097, 84098, 84101, 84102, 84103, 84104, 84105, 84106, 84107, 84108, 84109, 84110, 84111, 84112, 84113, 84114, 84115, 84116, 84117, 84118, 84119, 84120, 84121, 84122, 84123, 84124, 84125, 84126, 84127, 84128, 84130, 84131, 84132, 84133, 84134, 84135, 84136, 84138, 84139, 84140, 84141, 84142, 84143, 84144, 84145, 84147, 84148, 84150, 84151, 84152, 84153, 84157, 84158, 84165, 84170, 84171, 84180, 84184, 84189, 84190, 84193, 84194, 84195, 84199, 84201, 84244, 84301, 84302, 84304, 84305, 84306, 84307, 84308, 84309, 84310, 84311, 84312, 84313, 84314, 84315, 84316, 84317, 84318, 84319, 84320, 84321, 84322, 84323, 84324, 84325, 84326, 84327, 84328, 84329, 84330, 84331, 84332, 84333, 84334, 84335, 84336, 84337, 84338, 84339, 84340, 84341, 84401, 84402, 84403, 84404, 84405, 84407, 84408, 84409, 84412, 84414, 84415, 84501, 84510, 84511, 84512, 84513, 84515, 84516, 84518, 84520, 84521, 84522, 84523, 84525, 84526, 84527, 84528, 84529, 84530, 84531, 84532, 84533, 84534, 84535, 84536, 84537, 84539, 84540, 84542, 84601, 84602, 84603, 84604, 84605, 84606, 84620, 84621, 84622, 84623, 84624, 84626, 84627, 84628, 84629, 84630, 84631, 84632, 84633, 84634, 84635, 84636, 84637, 84638, 84639, 84640, 84642, 84643, 84644, 84645, 84646, 84647, 84648, 84649, 84650, 84651, 84652, 84653, 84654, 84655, 84656, 84657, 84660, 84662, 84663, 84664, 84665, 84667, 84701, 84710, 84711, 84712, 84713, 84714, 84715, 84716, 84717, 84718, 84719, 84720, 84721, 84722, 84723, 84724, 84725, 84726, 84728, 84729, 84730, 84731, 84732, 84733, 84734, 84735, 84736, 84737, 84738, 84739, 84740, 84741, 84742, 84743, 84744, 84745, 84746, 84747, 84749, 84750, 84751, 84752, 84753, 84754, 84755, 84756, 84757, 84758, 84759, 84760, 84761, 84762, 84763, 84764, 84765, 84766, 84767, 84770, 84771, 84772, 84773, 84774, 84775, 84776, 84779, 84780, 84781, 84782, 84783, 84784, 84790, 84791, 85001, 85002, 85003, 85004, 85005, 85006, 85007, 85008, 85009, 85010, 85011, 85012, 85013, 85014, 85015, 85016, 85017, 85018, 85019, 85020, 85021, 85022, 85023, 85024, 85025, 85026, 85027, 85028, 85029, 85030, 85031, 85032, 85033, 85034, 85035, 85036, 85037, 85038, 85039, 85040, 85041, 85042, 85043, 85044, 85045, 85046, 85048, 85050, 85051, 85053, 85054, 85055, 85060, 85061, 85062, 85063, 85064, 85065, 85066, 85067, 85068, 85069, 85070, 85071, 85072, 85073, 85074, 85075, 85076, 85077, 85078, 85079, 85080, 85082, 85085, 85086, 85087, 85098, 85099, 85201, 85202, 85203, 85204, 85205, 85206, 85207, 85208, 85210, 85211, 85212, 85213, 85214, 85215, 85216, 85217, 85218, 85219, 85220, 85221, 85222, 85223, 85224, 85225, 85226, 85227, 85228, 85230, 85231, 85232, 85233, 85234, 85235, 85236, 85237, 85239, 85241, 85242, 85244, 85245, 85246, 85247, 85248, 85249, 85250, 85251, 85252, 85253, 85254, 85255, 85256, 85257, 85258, 85259, 85260, 85261, 85262, 85263, 85264, 85266, 85267, 85268, 85269, 85271, 85272, 85273, 85274, 85275, 85277, 85278, 85279, 85280, 85281, 85282, 85283, 85284, 85285, 85287, 85289, 85290, 85291, 85292, 85296, 85297, 85299, 85301, 85302, 85303, 85304, 85305, 85306, 85307, 85308, 85309, 85310, 85311, 85312, 85313, 85318, 85320, 85321, 85322, 85323, 85324, 85325, 85326, 85327, 85328, 85329, 85331, 85332, 85333, 85334, 85335, 85336, 85337, 85338, 85339, 85340, 85341, 85342, 85343, 85344, 85345, 85346, 85347, 85348, 85349, 85350, 85351, 85352, 85353, 85354, 85355, 85356, 85357, 85358, 85359, 85360, 85361, 85362, 85363, 85364, 85365, 85366, 85367, 85369, 85371, 85372, 85373, 85374, 85375, 85376, 85377, 85378, 85379, 85380, 85381, 85382, 85383, 85385, 85387, 85390, 85501, 85502, 85530, 85531, 85532, 85533, 85534, 85535, 85536, 85539, 85540, 85541, 85542, 85543, 85544, 85545, 85546, 85547, 85548, 85550, 85551, 85552, 85553, 85554, 85601, 85602, 85603, 85605, 85606, 85607, 85608, 85609, 85610, 85611, 85613, 85614, 85615, 85616, 85617, 85618, 85619, 85620, 85621, 85622, 85623, 85624, 85625, 85626, 85627, 85628, 85629, 85630, 85631, 85632, 85633, 85634, 85635, 85636, 85637, 85638, 85639, 85640, 85641, 85643, 85644, 85645, 85646, 85648, 85650, 85652, 85653, 85654, 85655, 85662, 85670, 85671, 85701, 85702, 85703, 85704, 85705, 85706, 85707, 85708, 85709, 85710, 85711, 85712, 85713, 85714, 85715, 85716, 85717, 85718, 85719, 85720, 85721, 85722, 85723, 85724, 85725, 85726, 85728, 85730, 85731, 85732, 85733, 85734, 85735, 85736, 85737, 85738, 85739, 85740, 85741, 85742, 85743, 85744, 85745, 85746, 85747, 85748, 85749, 85750, 85751, 85752, 85754, 85775, 85777, 85901, 85902, 85911, 85912, 85920, 85922, 85923, 85924, 85925, 85926, 85927, 85928, 85929, 85930, 85931, 85932, 85933, 85934, 85935, 85936, 85937, 85938, 85939, 85940, 85941, 85942, 86001, 86002, 86003, 86004, 86011, 86015, 86016, 86017, 86018, 86020, 86021, 86022, 86023, 86024, 86025, 86028, 86029, 86030, 86031, 86032, 86033, 86034, 86035, 86036, 86038, 86039, 86040, 86042, 86043, 86044, 86045, 86046, 86047, 86052, 86053, 86054, 86301, 86302, 86303, 86304, 86305, 86312, 86313, 86314, 86320, 86321, 86322, 86323, 86324, 86325, 86326, 86327, 86329, 86330, 86331, 86332, 86333, 86334, 86335, 86336, 86337, 86338, 86339, 86340, 86341, 86342, 86343, 86351, 86401, 86402, 86403, 86404, 86405, 86406, 86411, 86412, 86413, 86426, 86427, 86429, 86430, 86431, 86432, 86433, 86434, 86435, 86436, 86437, 86438, 86439, 86440, 86441, 86442, 86443, 86444, 86445, 86446, 86502, 86503, 86504, 86505, 86506, 86507, 86508, 86510, 86511, 86512, 86514, 86515, 86520, 86535, 86538, 86540, 86544, 86545, 86547, 86549, 86556, 87001, 87002, 87004, 87005, 87006, 87007, 87008, 87009, 87010, 87011, 87012, 87013, 87014, 87015, 87016, 87017, 87018, 87020, 87021, 87022, 87023, 87024, 87025, 87026, 87027, 87028, 87029, 87031, 87032, 87034, 87035, 87036, 87037, 87038, 87040, 87041, 87042, 87043, 87044, 87045, 87046, 87047, 87048, 87049, 87051, 87052, 87053, 87056, 87057, 87059, 87060, 87061, 87062, 87063, 87064, 87068, 87070, 87072, 87083, 87101, 87102, 87103, 87104, 87105, 87106, 87107, 87108, 87109, 87110, 87111, 87112, 87113, 87114, 87115, 87116, 87117, 87118, 87119, 87120, 87121, 87122, 87123, 87124, 87125, 87131, 87153, 87154, 87158, 87174, 87176, 87181, 87184, 87185, 87187, 87190, 87191, 87192, 87193, 87194, 87195, 87196, 87197, 87198, 87199, 87201, 87301, 87302, 87305, 87310, 87311, 87312, 87313, 87315, 87316, 87317, 87319, 87320, 87321, 87322, 87323, 87325, 87326, 87327, 87328, 87347, 87357, 87364, 87365, 87375, 87401, 87402, 87410, 87412, 87413, 87415, 87416, 87417, 87418, 87419, 87420, 87421, 87455, 87461, 87499, 87500, 87501, 87502, 87503, 87504, 87505, 87506, 87507, 87508, 87509, 87510, 87511, 87512, 87513, 87514, 87515, 87516, 87517, 87518, 87519, 87520, 87521, 87522, 87523, 87524, 87525, 87527, 87528, 87529, 87530, 87531, 87532, 87533, 87535, 87537, 87538, 87539, 87540, 87543, 87544, 87545, 87548, 87549, 87551, 87552, 87553, 87554, 87556, 87557, 87558, 87560, 87562, 87564, 87565, 87566, 87567, 87569, 87571, 87573, 87574, 87575, 87576, 87577, 87578, 87579, 87580, 87581, 87582, 87583, 87592, 87594, 87701, 87710, 87711, 87712, 87713, 87714, 87715, 87718, 87722, 87723, 87724, 87728, 87729, 87730, 87731, 87732, 87733, 87734, 87735, 87736, 87740, 87742, 87743, 87745, 87746, 87747, 87749, 87750, 87752, 87753, 87801, 87820, 87821, 87823, 87824, 87825, 87827, 87828, 87829, 87830, 87831, 87832, 87901, 87930, 87931, 87933, 87935, 87936, 87937, 87939, 87940, 87941, 87942, 87943, 88001, 88002, 88003, 88004, 88005, 88006, 88008, 88009, 88011, 88012, 88020, 88021, 88022, 88023, 88024, 88025, 88026, 88027, 88028, 88029, 88030, 88031, 88032, 88033, 88034, 88036, 88038, 88039, 88040, 88041, 88042, 88043, 88044, 88045, 88046, 88047, 88048, 88049, 88051, 88052, 88053, 88054, 88055, 88056, 88058, 88061, 88062, 88063, 88065, 88072, 88101, 88102, 88103, 88112, 88113, 88114, 88115, 88116, 88118, 88119, 88120, 88121, 88122, 88123, 88124, 88125, 88126, 88130, 88132, 88133, 88134, 88135, 88136, 88201, 88202, 88203, 88210, 88211, 88213, 88220, 88221, 88230, 88231, 88232, 88240, 88241, 88242, 88244, 88250, 88252, 88253, 88254, 88255, 88256, 88260, 88262, 88263, 88264, 88265, 88267, 88268, 88301, 88310, 88311, 88312, 88314, 88316, 88317, 88318, 88321, 88323, 88324, 88325, 88330, 88336, 88337, 88338, 88339, 88340, 88341, 88342, 88343, 88344, 88345, 88346, 88347, 88348, 88349, 88350, 88351, 88352, 88353, 88354, 88355, 88401, 88410, 88411, 88414, 88415, 88416, 88417, 88418, 88419, 88421, 88422, 88424, 88426, 88427, 88429, 88430, 88431, 88433, 88434, 88435, 88436, 88437, 88439, 88441, 88510, 88511, 88512, 88513, 88514, 88515, 88516, 88517, 88518, 88519, 88520, 88521, 88523, 88524, 88525, 88526, 88527, 88528, 88529, 88530, 88531, 88532, 88533, 88534, 88535, 88536, 88538, 88539, 88540, 88541, 88542, 88543, 88544, 88545, 88546, 88547, 88548, 88549, 88550, 88553, 88554, 88555, 88556, 88557, 88558, 88559, 88560, 88561, 88562, 88563, 88565, 88566, 88567, 88568, 88569, 88570, 88571, 88572, 88573, 88574, 88575, 88576, 88577, 88578, 88579, 88580, 88581, 88582, 88583, 88584, 88585, 88586, 88587, 88588, 88589, 88590, 88595, 88901, 88905, 89001, 89003, 89004, 89005, 89006, 89007, 89008, 89009, 89010, 89011, 89012, 89013, 89014, 89015, 89016, 89017, 89018, 89019, 89020, 89021, 89022, 89023, 89024, 89025, 89026, 89027, 89028, 89029, 89030, 89031, 89032, 89033, 89036, 89039, 89040, 89041, 89042, 89043, 89045, 89046, 89047, 89048, 89049, 89052, 89053, 89060, 89061, 89070, 89074, 89077, 89084, 89086, 89101, 89102, 89103, 89104, 89106, 89107, 89108, 89109, 89110, 89111, 89112, 89113, 89114, 89115, 89116, 89117, 89118, 89119, 89120, 89121, 89122, 89123, 89124, 89125, 89126, 89127, 89128, 89129, 89130, 89131, 89132, 89133, 89134, 89135, 89137, 89138, 89139, 89141, 89142, 89143, 89144, 89145, 89146, 89147, 89148, 89149, 89150, 89151, 89152, 89153, 89154, 89155, 89156, 89159, 89160, 89163, 89164, 89170, 89173, 89177, 89180, 89185, 89191, 89193, 89195, 89199, 89301, 89310, 89311, 89314, 89315, 89316, 89317, 89318, 89319, 89402, 89403, 89404, 89405, 89406, 89407, 89408, 89409, 89410, 89411, 89412, 89413, 89414, 89415, 89418, 89419, 89420, 89421, 89422, 89423, 89424, 89425, 89426, 89427, 89428, 89429, 89430, 89431, 89432, 89433, 89434, 89435, 89436, 89438, 89439, 89440, 89442, 89444, 89445, 89446, 89447, 89448, 89449, 89450, 89451, 89452, 89494, 89496, 89501, 89502, 89503, 89504, 89505, 89506, 89507, 89509, 89510, 89511, 89512, 89513, 89515, 89520, 89523, 89533, 89557, 89570, 89595, 89599, 89701, 89702, 89703, 89704, 89705, 89706, 89711, 89712, 89713, 89714, 89721, 89801, 89802, 89803, 89815, 89820, 89821, 89822, 89823, 89824, 89825, 89826, 89828, 89830, 89831, 89832, 89833, 89834, 89835, 89883, 90001, 90002, 90003, 90004, 90005, 90006, 90007, 90008, 90009, 90010, 90011, 90012, 90013, 90014, 90015, 90016, 90017, 90018, 90019, 90020, 90021, 90022, 90023, 90024, 90025, 90026, 90027, 90028, 90029, 90030, 90031, 90032, 90033, 90034, 90035, 90036, 90037, 90038, 90039, 90040, 90041, 90042, 90043, 90044, 90045, 90046, 90047, 90048, 90049, 90050, 90051, 90052, 90053, 90054, 90055, 90056, 90057, 90058, 90059, 90060, 90061, 90062, 90063, 90064, 90065, 90066, 90067, 90068, 90069, 90070, 90071, 90072, 90073, 90074, 90075, 90076, 90077, 90078, 90079, 90080, 90081, 90082, 90083, 90084, 90086, 90087, 90088, 90089, 90091, 90093, 90094, 90095, 90096, 90097, 90099, 90101, 90102, 90103, 90174, 90185, 90201, 90202, 90209, 90210, 90211, 90212, 90213, 90220, 90221, 90222, 90223, 90224, 90230, 90231, 90232, 90233, 90239, 90240, 90241, 90242, 90245, 90247, 90248, 90249, 90250, 90251, 90254, 90255, 90260, 90261, 90262, 90263, 90264, 90265, 90266, 90267, 90270, 90272, 90274, 90275, 90277, 90278, 90280, 90290, 90291, 90292, 90293, 90294, 90295, 90296, 90301, 90302, 90303, 90304, 90305, 90306, 90307, 90308, 90309, 90310, 90311, 90312, 90313, 90397, 90398, 90401, 90402, 90403, 90404, 90405, 90406, 90407, 90408, 90409, 90410, 90411, 90501, 90502, 90503, 90504, 90505, 90506, 90507, 90508, 90509, 90510, 90601, 90602, 90603, 90604, 90605, 90606, 90607, 90608, 90609, 90610, 90612, 90620, 90621, 90622, 90623, 90624, 90630, 90631, 90632, 90633, 90637, 90638, 90639, 90640, 90650, 90651, 90652, 90659, 90660, 90661, 90662, 90665, 90670, 90671, 90680, 90701, 90702, 90703, 90704, 90706, 90707, 90710, 90711, 90712, 90713, 90714, 90715, 90716, 90717, 90720, 90721, 90723, 90731, 90732, 90733, 90734, 90740, 90742, 90743, 90744, 90745, 90746, 90747, 90748, 90749, 90801, 90802, 90803, 90804, 90805, 90806, 90807, 90808, 90809, 90810, 90813, 90814, 90815, 90822, 90831, 90832, 90833, 90834, 90835, 90840, 90842, 90844, 90845, 90846, 90847, 90848, 90853, 90888, 90899, 91001, 91003, 91006, 91007, 91009, 91010, 91011, 91012, 91016, 91017, 91020, 91021, 91023, 91024, 91025, 91030, 91031, 91040, 91041, 91042, 91043, 91046, 91050, 91051, 91066, 91077, 91101, 91102, 91103, 91104, 91105, 91106, 91107, 91108, 91109, 91110, 91114, 91115, 91116, 91117, 91118, 91121, 91123, 91124, 91125, 91126, 91129, 91131, 91175, 91182, 91184, 91185, 91186, 91187, 91188, 91189, 91191, 91201, 91202, 91203, 91204, 91205, 91206, 91207, 91208, 91209, 91210, 91214, 91221, 91222, 91224, 91225, 91226, 91301, 91302, 91303, 91304, 91305, 91306, 91307, 91308, 91309, 91310, 91311, 91312, 91313, 91316, 91319, 91320, 91321, 91322, 91324, 91325, 91326, 91327, 91328, 91329, 91330, 91331, 91333, 91334, 91335, 91337, 91340, 91341, 91342, 91343, 91344, 91345, 91346, 91350, 91351, 91352, 91353, 91354, 91355, 91356, 91357, 91358, 91359, 91360, 91361, 91362, 91363, 91364, 91365, 91367, 91371, 91372, 91376, 91377, 91380, 91381, 91382, 91383, 91384, 91385, 91386, 91387, 91388, 91390, 91392, 91393, 91394, 91395, 91396, 91399, 91401, 91402, 91403, 91404, 91405, 91406, 91407, 91408, 91409, 91410, 91411, 91412, 91413, 91416, 91423, 91426, 91436, 91470, 91482, 91495, 91496, 91497, 91499, 91501, 91502, 91503, 91504, 91505, 91506, 91507, 91508, 91510, 91521, 91522, 91523, 91526, 91601, 91602, 91603, 91604, 91605, 91606, 91607, 91608, 91609, 91610, 91611, 91612, 91614, 91615, 91616, 91617, 91618, 91701, 91702, 91706, 91708, 91709, 91710, 91711, 91714, 91715, 91716, 91722, 91723, 91724, 91729, 91730, 91731, 91732, 91733, 91734, 91735, 91737, 91739, 91740, 91741, 91743, 91744, 91745, 91746, 91747, 91748, 91749, 91750, 91752, 91754, 91755, 91756, 91758, 91759, 91761, 91762, 91763, 91764, 91765, 91766, 91767, 91768, 91769, 91770, 91771, 91772, 91773, 91775, 91776, 91778, 91780, 91784, 91785, 91786, 91788, 91789, 91790, 91791, 91792, 91793, 91795, 91797, 91798, 91799, 91801, 91802, 91803, 91804, 91841, 91896, 91899, 91901, 91902, 91903, 91905, 91906, 91908, 91909, 91910, 91911, 91912, 91913, 91914, 91915, 91916, 91917, 91921, 91931, 91932, 91933, 91934, 91935, 91941, 91942, 91943, 91944, 91945, 91946, 91947, 91948, 91950, 91951, 91962, 91963, 91976, 91977, 91978, 91979, 91980, 91987, 91990, 92003, 92004, 92007, 92008, 92009, 92013, 92014, 92018, 92019, 92020, 92021, 92022, 92023, 92024, 92025, 92026, 92027, 92028, 92029, 92030, 92033, 92036, 92037, 92038, 92039, 92040, 92046, 92049, 92051, 92052, 92054, 92055, 92056, 92057, 92058, 92059, 92060, 92061, 92064, 92065, 92066, 92067, 92068, 92069, 92070, 92071, 92072, 92074, 92075, 92078, 92079, 92082, 92083, 92084, 92085, 92086, 92088, 92090, 92091, 92092, 92093, 92096, 92101, 92102, 92103, 92104, 92105, 92106, 92107, 92108, 92109, 92110, 92111, 92112, 92113, 92114, 92115, 92116, 92117, 92118, 92119, 92120, 92121, 92122, 92123, 92124, 92126, 92127, 92128, 92129, 92130, 92131, 92132, 92133, 92134, 92135, 92136, 92137, 92138, 92139, 92140, 92142, 92143, 92145, 92147, 92149, 92150, 92152, 92153, 92154, 92155, 92158, 92159, 92160, 92161, 92162, 92163, 92164, 92165, 92166, 92167, 92168, 92169, 92170, 92171, 92172, 92173, 92174, 92175, 92176, 92177, 92178, 92179, 92182, 92184, 92186, 92187, 92190, 92191, 92192, 92193, 92194, 92195, 92196, 92197, 92198, 92199, 92201, 92202, 92203, 92210, 92211, 92220, 92222, 92223, 92225, 92226, 92227, 92230, 92231, 92232, 92233, 92234, 92235, 92236, 92239, 92240, 92241, 92242, 92243, 92244, 92249, 92250, 92251, 92252, 92253, 92254, 92255, 92256, 92257, 92258, 92259, 92260, 92261, 92262, 92263, 92264, 92266, 92267, 92268, 92270, 92273, 92274, 92275, 92276, 92277, 92278, 92280, 92281, 92282, 92283, 92284, 92285, 92286, 92292, 92301, 92304, 92305, 92307, 92308, 92309, 92310, 92311, 92312, 92313, 92314, 92315, 92316, 92317, 92318, 92320, 92321, 92322, 92323, 92324, 92325, 92326, 92327, 92328, 92329, 92332, 92333, 92334, 92335, 92336, 92337, 92338, 92339, 92340, 92341, 92342, 92345, 92346, 92347, 92350, 92352, 92354, 92356, 92357, 92358, 92359, 92363, 92364, 92365, 92366, 92368, 92369, 92371, 92372, 92373, 92374, 92375, 92376, 92377, 92378, 92382, 92384, 92385, 92386, 92389, 92391, 92392, 92393, 92394, 92397, 92398, 92399, 92401, 92402, 92403, 92404, 92405, 92406, 92407, 92408, 92410, 92411, 92412, 92413, 92414, 92415, 92418, 92420, 92423, 92424, 92427, 92501, 92502, 92503, 92504, 92505, 92506, 92507, 92508, 92509, 92513, 92514, 92515, 92516, 92517, 92518, 92519, 92521, 92522, 92530, 92531, 92532, 92536, 92539, 92543, 92544, 92545, 92546, 92548, 92549, 92551, 92552, 92553, 92554, 92555, 92556, 92557, 92561, 92562, 92563, 92564, 92567, 92570, 92571, 92572, 92581, 92582, 92583, 92584, 92585, 92586, 92587, 92589, 92590, 92591, 92592, 92593, 92595, 92596, 92599, 92602, 92603, 92604, 92605, 92606, 92607, 92609, 92610, 92612, 92614, 92615, 92616, 92618, 92619, 92620, 92623, 92624, 92625, 92626, 92627, 92628, 92629, 92630, 92637, 92646, 92647, 92648, 92649, 92650, 92651, 92652, 92653, 92654, 92655, 92656, 92657, 92658, 92659, 92660, 92661, 92662, 92663, 92672, 92673, 92674, 92675, 92676, 92677, 92678, 92679, 92683, 92684, 92685, 92688, 92690, 92691, 92692, 92693, 92694, 92697, 92698, 92701, 92702, 92703, 92704, 92705, 92706, 92707, 92708, 92709, 92710, 92711, 92712, 92728, 92735, 92780, 92781, 92782, 92799, 92801, 92802, 92803, 92804, 92805, 92806, 92807, 92808, 92809, 92811, 92812, 92814, 92815, 92816, 92817, 92821, 92822, 92823, 92825, 92831, 92832, 92833, 92834, 92835, 92836, 92837, 92838, 92840, 92841, 92842, 92843, 92844, 92845, 92846, 92850, 92856, 92857, 92859, 92860, 92861, 92862, 92863, 92864, 92865, 92866, 92867, 92868, 92869, 92870, 92871, 92877, 92878, 92879, 92880, 92881, 92882, 92883, 92885, 92886, 92887, 92899, 93001, 93002, 93003, 93004, 93005, 93006, 93007, 93009, 93010, 93011, 93012, 93013, 93014, 93015, 93016, 93020, 93021, 93022, 93023, 93024, 93030, 93031, 93032, 93033, 93034, 93035, 93040, 93041, 93042, 93043, 93044, 93060, 93061, 93062, 93063, 93064, 93065, 93066, 93067, 93093, 93094, 93099, 93101, 93102, 93103, 93105, 93106, 93107, 93108, 93109, 93110, 93111, 93116, 93117, 93118, 93120, 93121, 93130, 93140, 93150, 93160, 93190, 93199, 93201, 93202, 93203, 93204, 93205, 93206, 93207, 93208, 93210, 93212, 93215, 93216, 93218, 93219, 93220, 93221, 93222, 93223, 93224, 93225, 93226, 93227, 93230, 93232, 93234, 93235, 93237, 93238, 93239, 93240, 93241, 93242, 93243, 93244, 93245, 93246, 93247, 93249, 93250, 93251, 93252, 93254, 93255, 93256, 93257, 93258, 93260, 93261, 93262, 93263, 93265, 93266, 93267, 93268, 93270, 93271, 93272, 93274, 93275, 93276, 93277, 93278, 93279, 93280, 93282, 93283, 93285, 93286, 93287, 93291, 93292, 93301, 93302, 93303, 93304, 93305, 93306, 93307, 93308, 93309, 93311, 93312, 93313, 93380, 93381, 93382, 93383, 93384, 93385, 93386, 93387, 93388, 93389, 93390, 93401, 93402, 93403, 93405, 93406, 93407, 93408, 93409, 93410, 93412, 93420, 93421, 93422, 93423, 93424, 93426, 93427, 93428, 93429, 93430, 93432, 93433, 93434, 93435, 93436, 93437, 93438, 93440, 93441, 93442, 93443, 93444, 93445, 93446, 93447, 93448, 93449, 93450, 93451, 93452, 93453, 93454, 93455, 93456, 93457, 93458, 93460, 93461, 93463, 93464, 93465, 93483, 93501, 93502, 93504, 93505, 93510, 93512, 93513, 93514, 93515, 93516, 93517, 93518, 93519, 93522, 93523, 93524, 93526, 93527, 93528, 93529, 93530, 93531, 93532, 93534, 93535, 93536, 93539, 93541, 93542, 93543, 93544, 93545, 93546, 93549, 93550, 93551, 93552, 93553, 93554, 93555, 93556, 93558, 93560, 93561, 93562, 93563, 93581, 93584, 93586, 93590, 93591, 93592, 93596, 93599, 93601, 93602, 93603, 93604, 93605, 93606, 93607, 93608, 93609, 93610, 93611, 93612, 93613, 93614, 93615, 93616, 93618, 93620, 93621, 93622, 93623, 93624, 93625, 93626, 93627, 93628, 93630, 93631, 93633, 93634, 93635, 93637, 93638, 93639, 93640, 93641, 93642, 93643, 93644, 93645, 93646, 93647, 93648, 93649, 93650, 93651, 93652, 93653, 93654, 93656, 93657, 93660, 93661, 93662, 93664, 93665, 93666, 93667, 93668, 93669, 93670, 93673, 93675, 93701, 93702, 93703, 93704, 93705, 93706, 93707, 93708, 93709, 93710, 93711, 93712, 93714, 93715, 93716, 93717, 93718, 93720, 93721, 93722, 93724, 93725, 93726, 93727, 93728, 93729, 93740, 93741, 93744, 93745, 93747, 93750, 93755, 93760, 93761, 93762, 93764, 93765, 93771, 93772, 93773, 93774, 93775, 93776, 93777, 93778, 93779, 93780, 93784, 93786, 93790, 93791, 93792, 93793, 93794, 93844, 93888, 93901, 93902, 93905, 93906, 93907, 93908, 93912, 93915, 93920, 93921, 93922, 93923, 93924, 93925, 93926, 93927, 93928, 93930, 93932, 93933, 93940, 93942, 93943, 93944, 93950, 93953, 93954, 93955, 93960, 93962, 94002, 94003, 94005, 94010, 94011, 94012, 94013, 94014, 94015, 94016, 94017, 94018, 94019, 94020, 94021, 94022, 94023, 94024, 94025, 94026, 94027, 94028, 94029, 94030, 94031, 94035, 94037, 94038, 94039, 94040, 94041, 94042, 94043, 94044, 94045, 94059, 94060, 94061, 94062, 94063, 94064, 94065, 94066, 94067, 94070, 94071, 94074, 94080, 94083, 94085, 94086, 94087, 94088, 94089, 94090, 94096, 94098, 94099, 94101, 94102, 94103, 94104, 94105, 94106, 94107, 94108, 94109, 94110, 94111, 94112, 94114, 94115, 94116, 94117, 94118, 94119, 94120, 94121, 94122, 94123, 94124, 94125, 94126, 94127, 94128, 94129, 94130, 94131, 94132, 94133, 94134, 94135, 94136, 94137, 94138, 94139, 94140, 94141, 94142, 94143, 94144, 94145, 94146, 94147, 94150, 94151, 94152, 94153, 94154, 94155, 94156, 94157, 94159, 94160, 94161, 94162, 94163, 94164, 94165, 94166, 94167, 94168, 94169, 94170, 94171, 94172, 94175, 94177, 94188, 94203, 94204, 94205, 94206, 94207, 94208, 94209, 94211, 94229, 94230, 94232, 94234, 94235, 94236, 94237, 94239, 94240, 94243, 94244, 94245, 94246, 94247, 94248, 94249, 94250, 94252, 94253, 94254, 94256, 94257, 94258, 94259, 94261, 94262, 94263, 94267, 94268, 94269, 94271, 94273, 94274, 94277, 94278, 94279, 94280, 94282, 94283, 94284, 94285, 94286, 94287, 94288, 94289, 94290, 94291, 94293, 94294, 94295, 94296, 94297, 94298, 94299, 94301, 94302, 94303, 94304, 94305, 94306, 94307, 94308, 94309, 94310, 94401, 94402, 94403, 94404, 94405, 94406, 94407, 94408, 94409, 94497, 94501, 94502, 94503, 94506, 94507, 94508, 94509, 94510, 94511, 94512, 94513, 94514, 94515, 94516, 94517, 94518, 94519, 94520, 94521, 94522, 94523, 94524, 94525, 94526, 94527, 94528, 94529, 94530, 94531, 94533, 94535, 94536, 94537, 94538, 94539, 94540, 94541, 94542, 94543, 94544, 94545, 94546, 94547, 94548, 94549, 94550, 94551, 94552, 94553, 94555, 94556, 94557, 94558, 94559, 94560, 94561, 94562, 94563, 94564, 94565, 94566, 94567, 94568, 94569, 94570, 94571, 94572, 94573, 94574, 94575, 94576, 94577, 94578, 94579, 94580, 94581, 94583, 94585, 94586, 94587, 94588, 94589, 94590, 94591, 94592, 94595, 94596, 94597, 94598, 94599, 94601, 94602, 94603, 94604, 94605, 94606, 94607, 94608, 94609, 94610, 94611, 94612, 94613, 94614, 94615, 94617, 94618, 94619, 94620, 94621, 94622, 94623, 94624, 94625, 94626, 94627, 94643, 94649, 94659, 94660, 94661, 94662, 94666, 94701, 94702, 94703, 94704, 94705, 94706, 94707, 94708, 94709, 94710, 94712, 94720, 94801, 94802, 94803, 94804, 94805, 94806, 94807, 94808, 94820, 94850, 94901, 94903, 94904, 94912, 94913, 94914, 94915, 94920, 94922, 94923, 94924, 94925, 94926, 94927, 94928, 94929, 94930, 94931, 94933, 94937, 94938, 94939, 94940, 94941, 94942, 94945, 94946, 94947, 94948, 94949, 94950, 94951, 94952, 94953, 94954, 94955, 94956, 94957, 94960, 94963, 94964, 94965, 94966, 94970, 94971, 94972, 94973, 94974, 94975, 94976, 94977, 94978, 94979, 94998, 94999, 95001, 95002, 95003, 95004, 95005, 95006, 95007, 95008, 95009, 95010, 95011, 95012, 95013, 95014, 95015, 95017, 95018, 95019, 95020, 95021, 95023, 95024, 95026, 95030, 95031, 95032, 95033, 95035, 95036, 95037, 95038, 95039, 95041, 95042, 95043, 95044, 95045, 95046, 95050, 95051, 95052, 95053, 95054, 95055, 95056, 95060, 95061, 95062, 95063, 95064, 95065, 95066, 95067, 95070, 95071, 95073, 95075, 95076, 95077, 95101, 95102, 95103, 95106, 95108, 95109, 95110, 95111, 95112, 95113, 95114, 95115, 95116, 95117, 95118, 95119, 95120, 95121, 95122, 95123, 95124, 95125, 95126, 95127, 95128, 95129, 95130, 95131, 95132, 95133, 95134, 95135, 95136, 95137, 95138, 95139, 95140, 95141, 95142, 95148, 95150, 95151, 95152, 95153, 95154, 95155, 95156, 95157, 95158, 95159, 95160, 95161, 95164, 95170, 95171, 95172, 95173, 95190, 95191, 95192, 95193, 95194, 95196, 95201, 95202, 95203, 95204, 95205, 95206, 95207, 95208, 95209, 95210, 95211, 95212, 95213, 95215, 95219, 95220, 95221, 95222, 95223, 95224, 95225, 95226, 95227, 95228, 95229, 95230, 95231, 95232, 95233, 95234, 95236, 95237, 95240, 95241, 95242, 95245, 95246, 95247, 95248, 95249, 95250, 95251, 95252, 95253, 95254, 95255, 95257, 95258, 95267, 95269, 95290, 95296, 95297, 95298, 95301, 95303, 95304, 95305, 95306, 95307, 95309, 95310, 95311, 95312, 95313, 95314, 95315, 95316, 95317, 95318, 95319, 95320, 95321, 95322, 95323, 95324, 95325, 95326, 95327, 95328, 95329, 95330, 95333, 95334, 95335, 95336, 95337, 95338, 95340, 95341, 95342, 95343, 95344, 95345, 95346, 95347, 95348, 95350, 95351, 95352, 95353, 95354, 95355, 95356, 95357, 95358, 95360, 95361, 95363, 95364, 95365, 95366, 95367, 95368, 95369, 95370, 95372, 95373, 95374, 95375, 95376, 95377, 95378, 95379, 95380, 95381, 95382, 95383, 95385, 95386, 95387, 95388, 95389, 95390, 95391, 95397, 95401, 95402, 95403, 95404, 95405, 95406, 95407, 95408, 95409, 95410, 95412, 95415, 95416, 95417, 95418, 95419, 95420, 95421, 95422, 95423, 95424, 95425, 95426, 95427, 95428, 95429, 95430, 95431, 95432, 95433, 95435, 95436, 95437, 95439, 95441, 95442, 95443, 95444, 95445, 95446, 95448, 95449, 95450, 95451, 95452, 95453, 95454, 95456, 95457, 95458, 95459, 95460, 95461, 95462, 95463, 95464, 95465, 95466, 95468, 95469, 95470, 95471, 95472, 95473, 95476, 95480, 95481, 95482, 95485, 95486, 95487, 95488, 95490, 95492, 95493, 95494, 95497, 95501, 95502, 95503, 95511, 95514, 95518, 95519, 95521, 95524, 95525, 95526, 95527, 95528, 95531, 95532, 95534, 95536, 95537, 95538, 95540, 95542, 95543, 95545, 95546, 95547, 95548, 95549, 95550, 95551, 95552, 95553, 95554, 95555, 95556, 95558, 95559, 95560, 95562, 95563, 95564, 95565, 95567, 95568, 95569, 95570, 95571, 95573, 95585, 95587, 95589, 95595, 95601, 95602, 95603, 95604, 95605, 95606, 95607, 95608, 95609, 95610, 95611, 95612, 95613, 95614, 95615, 95616, 95617, 95618, 95619, 95620, 95621, 95623, 95624, 95625, 95626, 95627, 95628, 95629, 95630, 95631, 95632, 95633, 95634, 95635, 95636, 95637, 95638, 95639, 95640, 95641, 95642, 95644, 95645, 95646, 95648, 95650, 95651, 95652, 95653, 95654, 95655, 95656, 95658, 95659, 95660, 95661, 95662, 95663, 95664, 95665, 95666, 95667, 95668, 95669, 95670, 95671, 95672, 95673, 95674, 95675, 95676, 95677, 95678, 95679, 95680, 95681, 95682, 95683, 95684, 95685, 95686, 95687, 95688, 95689, 95690, 95691, 95692, 95693, 95694, 95695, 95696, 95697, 95698, 95699, 95701, 95703, 95709, 95712, 95713, 95714, 95715, 95717, 95720, 95721, 95722, 95724, 95726, 95728, 95735, 95736, 95741, 95742, 95743, 95746, 95747, 95758, 95759, 95762, 95763, 95765, 95776, 95798, 95799, 95812, 95813, 95814, 95815, 95816, 95817, 95818, 95819, 95820, 95821, 95822, 95823, 95824, 95825, 95826, 95827, 95828, 95829, 95830, 95831, 95832, 95833, 95834, 95835, 95836, 95837, 95838, 95840, 95841, 95842, 95843, 95851, 95852, 95853, 95857, 95860, 95864, 95865, 95866, 95867, 95873, 95887, 95894, 95899, 95901, 95903, 95910, 95912, 95913, 95914, 95915, 95916, 95917, 95918, 95919, 95920, 95922, 95923, 95924, 95925, 95926, 95927, 95928, 95929, 95930, 95931, 95932, 95934, 95935, 95936, 95937, 95938, 95939, 95940, 95941, 95942, 95943, 95944, 95945, 95946, 95947, 95948, 95949, 95950, 95951, 95953, 95954, 95955, 95956, 95957, 95958, 95959, 95960, 95961, 95962, 95963, 95965, 95966, 95967, 95968, 95969, 95970, 95971, 95972, 95973, 95974, 95975, 95976, 95977, 95978, 95979, 95980, 95981, 95982, 95983, 95984, 95986, 95987, 95988, 95991, 95992, 95993, 96001, 96002, 96003, 96006, 96007, 96008, 96009, 96010, 96011, 96013, 96014, 96015, 96016, 96017, 96019, 96020, 96021, 96022, 96023, 96024, 96025, 96027, 96028, 96029, 96031, 96032, 96033, 96034, 96035, 96037, 96038, 96039, 96040, 96041, 96044, 96046, 96047, 96048, 96049, 96050, 96051, 96052, 96054, 96055, 96056, 96057, 96058, 96059, 96061, 96062, 96063, 96064, 96065, 96067, 96068, 96069, 96070, 96071, 96073, 96074, 96075, 96076, 96078, 96079, 96080, 96084, 96085, 96086, 96087, 96088, 96089, 96090, 96091, 96092, 96093, 96094, 96095, 96096, 96097, 96099, 96101, 96103, 96104, 96105, 96106, 96107, 96108, 96109, 96110, 96111, 96112, 96113, 96114, 96115, 96116, 96117, 96118, 96119, 96120, 96121, 96122, 96123, 96124, 96125, 96126, 96127, 96128, 96129, 96130, 96132, 96133, 96134, 96135, 96136, 96137, 96140, 96141, 96142, 96143, 96145, 96146, 96148, 96150, 96151, 96152, 96154, 96155, 96156, 96157, 96158, 96160, 96161, 96162, 96201, 96202, 96203, 96204, 96205, 96206, 96207, 96208, 96212, 96213, 96214, 96215, 96217, 96218, 96219, 96220, 96221, 96224, 96251, 96257, 96258, 96259, 96260, 96262, 96264, 96266, 96267, 96269, 96271, 96275, 96276, 96278, 96283, 96284, 96297, 96306, 96309, 96310, 96311, 96313, 96319, 96321, 96322, 96323, 96325, 96326, 96328, 96330, 96336, 96337, 96338, 96343, 96347, 96348, 96349, 96350, 96351, 96362, 96364, 96365, 96367, 96368, 96370, 96372, 96373, 96374, 96375, 96376, 96377, 96378, 96379, 96384, 96386, 96387, 96388, 96403, 96490, 96505, 96506, 96507, 96508, 96511, 96512, 96515, 96517, 96518, 96520, 96521, 96522, 96529, 96530, 96531, 96534, 96535, 96536, 96537, 96538, 96539, 96540, 96541, 96542, 96543, 96544, 96545, 96546, 96547, 96548, 96549, 96551, 96552, 96553, 96554, 96555, 96557, 96558, 96575, 96580, 96594, 96595, 96596, 96597, 96598, 96599, 96601, 96602, 96603, 96604, 96605, 96606, 96607, 96608, 96609, 96610, 96611, 96612, 96615, 96617, 96621, 96622, 96623, 96624, 96626, 96627, 96628, 96629, 96634, 96635, 96642, 96643, 96644, 96647, 96648, 96649, 96657, 96660, 96661, 96662, 96663, 96664, 96665, 96666, 96667, 96668, 96669, 96670, 96671, 96672, 96673, 96674, 96675, 96676, 96677, 96678, 96679, 96681, 96682, 96683, 96684, 96686, 96687, 96698, 96701, 96703, 96704, 96705, 96706, 96707, 96708, 96709, 96710, 96712, 96713, 96714, 96715, 96716, 96717, 96718, 96719, 96720, 96721, 96722, 96725, 96726, 96727, 96728, 96729, 96730, 96731, 96732, 96733, 96734, 96737, 96738, 96739, 96740, 96741, 96742, 96743, 96744, 96745, 96746, 96747, 96748, 96749, 96750, 96751, 96752, 96753, 96754, 96755, 96756, 96757, 96759, 96760, 96761, 96762, 96763, 96764, 96765, 96766, 96767, 96768, 96769, 96770, 96771, 96772, 96773, 96774, 96775, 96776, 96777, 96778, 96779, 96780, 96781, 96782, 96783, 96784, 96785, 96786, 96788, 96789, 96790, 96791, 96792, 96793, 96795, 96796, 96797, 96799, 96801, 96802, 96803, 96804, 96805, 96806, 96807, 96808, 96809, 96810, 96811, 96812, 96813, 96814, 96815, 96816, 96817, 96818, 96819, 96820, 96821, 96822, 96823, 96824, 96825, 96826, 96827, 96828, 96830, 96835, 96836, 96837, 96838, 96839, 96840, 96841, 96842, 96843, 96844, 96845, 96846, 96847, 96848, 96849, 96850, 96853, 96854, 96857, 96858, 96859, 96860, 96861, 96862, 96863, 96898, 96910, 96911, 96912, 96913, 96914, 96915, 96916, 96917, 96918, 96919, 96921, 96922, 96923, 96925, 96926, 96927, 96928, 96929, 96930, 96931, 96932, 96940, 96941, 96942, 96943, 96944, 96950, 96951, 96952, 96960, 96970, 97001, 97002, 97004, 97005, 97006, 97007, 97008, 97009, 97010, 97011, 97013, 97014, 97015, 97016, 97017, 97018, 97019, 97020, 97021, 97022, 97023, 97024, 97026, 97027, 97028, 97029, 97030, 97031, 97032, 97033, 97034, 97035, 97036, 97037, 97038, 97039, 97040, 97041, 97042, 97044, 97045, 97048, 97049, 97050, 97051, 97053, 97054, 97055, 97056, 97057, 97058, 97060, 97062, 97063, 97064, 97065, 97067, 97068, 97070, 97071, 97075, 97076, 97077, 97078, 97080, 97101, 97102, 97103, 97106, 97107, 97108, 97109, 97110, 97111, 97112, 97113, 97114, 97115, 97116, 97117, 97118, 97119, 97121, 97122, 97123, 97124, 97125, 97127, 97128, 97130, 97131, 97132, 97133, 97134, 97135, 97136, 97137, 97138, 97140, 97141, 97143, 97144, 97145, 97146, 97147, 97148, 97149, 97201, 97202, 97203, 97204, 97205, 97206, 97207, 97208, 97209, 97210, 97211, 97212, 97213, 97214, 97215, 97216, 97217, 97218, 97219, 97220, 97221, 97222, 97223, 97224, 97225, 97227, 97228, 97229, 97230, 97231, 97232, 97233, 97236, 97238, 97240, 97242, 97251, 97253, 97254, 97255, 97256, 97258, 97259, 97266, 97267, 97268, 97269, 97271, 97272, 97280, 97281, 97282, 97283, 97286, 97290, 97291, 97292, 97293, 97294, 97296, 97298, 97299, 97301, 97302, 97303, 97304, 97305, 97306, 97307, 97308, 97309, 97310, 97311, 97312, 97313, 97314, 97321, 97324, 97325, 97326, 97327, 97329, 97330, 97331, 97333, 97335, 97336, 97338, 97339, 97341, 97342, 97343, 97344, 97345, 97346, 97347, 97348, 97350, 97351, 97352, 97355, 97357, 97358, 97359, 97360, 97361, 97362, 97364, 97365, 97366, 97367, 97368, 97369, 97370, 97371, 97372, 97373, 97374, 97375, 97376, 97377, 97378, 97380, 97381, 97383, 97384, 97385, 97386, 97388, 97389, 97390, 97391, 97392, 97394, 97396, 97401, 97402, 97403, 97404, 97405, 97406, 97407, 97408, 97409, 97410, 97411, 97412, 97413, 97414, 97415, 97416, 97417, 97419, 97420, 97423, 97424, 97425, 97426, 97427, 97428, 97429, 97430, 97431, 97432, 97434, 97435, 97436, 97437, 97438, 97439, 97440, 97441, 97442, 97443, 97444, 97446, 97447, 97448, 97449, 97450, 97451, 97452, 97453, 97454, 97455, 97456, 97457, 97458, 97459, 97460, 97461, 97462, 97463, 97464, 97465, 97466, 97467, 97469, 97470, 97472, 97473, 97476, 97477, 97478, 97479, 97480, 97481, 97482, 97484, 97486, 97487, 97488, 97489, 97490, 97491, 97492, 97493, 97494, 97495, 97496, 97497, 97498, 97499, 97501, 97502, 97503, 97504, 97520, 97522, 97523, 97524, 97525, 97526, 97527, 97528, 97530, 97531, 97532, 97533, 97534, 97535, 97536, 97537, 97538, 97539, 97540, 97541, 97543, 97544, 97601, 97602, 97603, 97604, 97620, 97621, 97622, 97623, 97624, 97625, 97626, 97627, 97630, 97632, 97633, 97634, 97635, 97636, 97637, 97638, 97639, 97640, 97641, 97701, 97702, 97707, 97708, 97709, 97710, 97711, 97712, 97720, 97721, 97722, 97730, 97731, 97732, 97733, 97734, 97735, 97736, 97737, 97738, 97739, 97740, 97741, 97750, 97751, 97752, 97753, 97754, 97756, 97758, 97759, 97760, 97761, 97801, 97810, 97812, 97813, 97814, 97817, 97818, 97819, 97820, 97821, 97823, 97824, 97825, 97826, 97827, 97828, 97830, 97831, 97833, 97834, 97835, 97836, 97837, 97838, 97839, 97840, 97841, 97842, 97843, 97844, 97845, 97846, 97848, 97850, 97856, 97857, 97859, 97861, 97862, 97864, 97865, 97867, 97868, 97869, 97870, 97872, 97873, 97874, 97875, 97876, 97877, 97880, 97882, 97883, 97884, 97885, 97886, 97901, 97902, 97903, 97904, 97905, 97906, 97907, 97908, 97909, 97910, 97911, 97913, 97914, 97917, 97918, 97920, 98001, 98002, 98003, 98004, 98005, 98006, 98007, 98008, 98009, 98010, 98011, 98012, 98013, 98014, 98015, 98019, 98020, 98021, 98022, 98023, 98024, 98025, 98026, 98027, 98028, 98029, 98031, 98032, 98033, 98034, 98035, 98036, 98037, 98038, 98039, 98040, 98041, 98042, 98043, 98045, 98046, 98047, 98050, 98051, 98052, 98053, 98054, 98055, 98056, 98057, 98058, 98059, 98061, 98062, 98063, 98064, 98065, 98068, 98070, 98071, 98072, 98073, 98074, 98075, 98082, 98083, 98092, 98093, 98101, 98102, 98103, 98104, 98105, 98106, 98107, 98108, 98109, 98110, 98111, 98112, 98114, 98115, 98116, 98117, 98118, 98119, 98121, 98122, 98124, 98125, 98126, 98129, 98131, 98132, 98133, 98134, 98136, 98138, 98144, 98145, 98146, 98148, 98151, 98154, 98155, 98158, 98160, 98161, 98164, 98166, 98168, 98170, 98171, 98174, 98177, 98178, 98181, 98184, 98185, 98188, 98190, 98191, 98195, 98198, 98199, 98201, 98203, 98204, 98205, 98206, 98207, 98208, 98220, 98221, 98222, 98223, 98224, 98225, 98226, 98227, 98228, 98230, 98231, 98232, 98233, 98235, 98236, 98237, 98238, 98239, 98240, 98241, 98243, 98244, 98245, 98247, 98248, 98249, 98250, 98251, 98252, 98253, 98255, 98256, 98257, 98258, 98259, 98260, 98261, 98262, 98263, 98264, 98266, 98267, 98270, 98271, 98272, 98273, 98274, 98275, 98276, 98277, 98278, 98279, 98280, 98281, 98282, 98283, 98284, 98286, 98287, 98288, 98290, 98291, 98292, 98293, 98294, 98295, 98296, 98297, 98303, 98304, 98305, 98310, 98311, 98312, 98314, 98315, 98320, 98321, 98322, 98323, 98324, 98325, 98326, 98327, 98328, 98329, 98330, 98331, 98332, 98333, 98335, 98336, 98337, 98338, 98339, 98340, 98342, 98343, 98344, 98345, 98346, 98348, 98349, 98350, 98351, 98352, 98353, 98354, 98355, 98356, 98357, 98358, 98359, 98360, 98361, 98362, 98363, 98364, 98365, 98366, 98367, 98368, 98370, 98371, 98372, 98373, 98374, 98375, 98376, 98377, 98378, 98380, 98381, 98382, 98383, 98384, 98385, 98386, 98387, 98388, 98390, 98392, 98393, 98394, 98395, 98396, 98397, 98398, 98401, 98402, 98403, 98404, 98405, 98406, 98407, 98408, 98409, 98411, 98412, 98413, 98415, 98416, 98418, 98421, 98422, 98424, 98430, 98431, 98433, 98438, 98439, 98442, 98443, 98444, 98445, 98446, 98447, 98450, 98455, 98460, 98464, 98465, 98466, 98467, 98471, 98477, 98481, 98492, 98493, 98497, 98498, 98499, 98501, 98502, 98503, 98504, 98505, 98506, 98507, 98508, 98509, 98511, 98512, 98513, 98516, 98520, 98522, 98524, 98526, 98527, 98528, 98530, 98531, 98532, 98533, 98535, 98536, 98537, 98538, 98539, 98540, 98541, 98542, 98544, 98546, 98547, 98548, 98550, 98552, 98554, 98555, 98556, 98557, 98558, 98559, 98560, 98561, 98562, 98563, 98564, 98565, 98566, 98568, 98569, 98570, 98571, 98572, 98575, 98576, 98577, 98579, 98580, 98581, 98582, 98583, 98584, 98585, 98586, 98587, 98588, 98589, 98590, 98591, 98592, 98593, 98595, 98596, 98597, 98599, 98601, 98602, 98603, 98604, 98605, 98606, 98607, 98609, 98610, 98611, 98612, 98613, 98614, 98616, 98617, 98619, 98620, 98621, 98622, 98623, 98624, 98625, 98626, 98628, 98629, 98631, 98632, 98635, 98637, 98638, 98639, 98640, 98641, 98642, 98643, 98644, 98645, 98647, 98648, 98649, 98650, 98651, 98660, 98661, 98662, 98663, 98664, 98665, 98666, 98667, 98668, 98670, 98671, 98672, 98673, 98674, 98675, 98682, 98683, 98684, 98685, 98686, 98687, 98801, 98802, 98807, 98811, 98812, 98813, 98814, 98815, 98816, 98817, 98819, 98821, 98822, 98823, 98824, 98826, 98827, 98828, 98829, 98830, 98831, 98832, 98833, 98834, 98836, 98837, 98840, 98841, 98843, 98844, 98845, 98846, 98847, 98848, 98849, 98850, 98851, 98852, 98853, 98855, 98856, 98857, 98858, 98859, 98860, 98862, 98901, 98902, 98903, 98904, 98907, 98908, 98909, 98920, 98921, 98922, 98923, 98925, 98926, 98929, 98930, 98932, 98933, 98934, 98935, 98936, 98937, 98938, 98939, 98940, 98941, 98942, 98943, 98944, 98946, 98947, 98948, 98950, 98951, 98952, 98953, 99001, 99003, 99004, 99005, 99006, 99008, 99009, 99011, 99012, 99013, 99014, 99015, 99016, 99017, 99018, 99019, 99020, 99021, 99022, 99023, 99025, 99026, 99027, 99029, 99030, 99031, 99032, 99033, 99034, 99036, 99037, 99039, 99040, 99101, 99102, 99103, 99104, 99105, 99107, 99109, 99110, 99111, 99113, 99114, 99115, 99116, 99117, 99118, 99119, 99121, 99122, 99123, 99124, 99125, 99126, 99127, 99128, 99129, 99130, 99131, 99133, 99134, 99135, 99136, 99137, 99138, 99139, 99140, 99141, 99143, 99144, 99146, 99147, 99148, 99149, 99150, 99151, 99152, 99153, 99154, 99155, 99156, 99157, 99158, 99159, 99160, 99161, 99163, 99164, 99165, 99166, 99167, 99169, 99170, 99171, 99173, 99174, 99176, 99179, 99180, 99181, 99185, 99201, 99202, 99203, 99204, 99205, 99206, 99207, 99208, 99209, 99210, 99211, 99212, 99213, 99214, 99215, 99216, 99217, 99218, 99219, 99220, 99223, 99224, 99228, 99251, 99252, 99256, 99258, 99260, 99299, 99301, 99302, 99320, 99321, 99322, 99323, 99324, 99326, 99327, 99328, 99329, 99330, 99332, 99333, 99335, 99336, 99337, 99338, 99341, 99343, 99344, 99345, 99346, 99347, 99348, 99349, 99350, 99352, 99353, 99356, 99357, 99359, 99360, 99361, 99362, 99363, 99371, 99401, 99402, 99403, 99501, 99502, 99503, 99504, 99505, 99506, 99507, 99508, 99509, 99510, 99511, 99512, 99513, 99514, 99515, 99516, 99517, 99518, 99519, 99520, 99521, 99522, 99523, 99524, 99540, 99546, 99547, 99548, 99549, 99550, 99551, 99552, 99553, 99554, 99555, 99556, 99557, 99558, 99559, 99561, 99563, 99564, 99565, 99566, 99567, 99568, 99569, 99571, 99572, 99573, 99574, 99575, 99576, 99577, 99578, 99579, 99580, 99581, 99583, 99584, 99585, 99586, 99587, 99588, 99589, 99590, 99591, 99599, 99602, 99603, 99604, 99605, 99606, 99607, 99608, 99609, 99610, 99611, 99612, 99613, 99614, 99615, 99619, 99620, 99621, 99622, 99624, 99625, 99626, 99627, 99628, 99630, 99631, 99632, 99633, 99634, 99635, 99636, 99637, 99638, 99639, 99640, 99641, 99643, 99644, 99645, 99647, 99648, 99649, 99650, 99651, 99652, 99653, 99654, 99655, 99656, 99657, 99658, 99659, 99660, 99661, 99662, 99663, 99664, 99665, 99666, 99667, 99668, 99669, 99670, 99671, 99672, 99674, 99675, 99676, 99677, 99678, 99679, 99680, 99681, 99682, 99683, 99684, 99685, 99686, 99687, 99688, 99689, 99690, 99691, 99692, 99693, 99694, 99695, 99697, 99701, 99702, 99703, 99704, 99705, 99706, 99707, 99708, 99709, 99710, 99711, 99712, 99714, 99716, 99720, 99721, 99722, 99723, 99724, 99725, 99726, 99727, 99729, 99730, 99732, 99733, 99734, 99736, 99737, 99738, 99739, 99740, 99741, 99742, 99743, 99744, 99745, 99746, 99747, 99748, 99749, 99750, 99751, 99752, 99753, 99754, 99755, 99756, 99757, 99758, 99759, 99760, 99761, 99762, 99763, 99764, 99765, 99766, 99767, 99768, 99769, 99770, 99771, 99772, 99773, 99774, 99775, 99776, 99777, 99778, 99779, 99780, 99781, 99782, 99783, 99784, 99785, 99786, 99788, 99789, 99790, 99791, 99801, 99802, 99803, 99811, 99820, 99821, 99824, 99825, 99826, 99827, 99829, 99830, 99832, 99833, 99835, 99836, 99840, 99841, 99850, 99901, 99903, 99918, 99919, 99921, 99922, 99923, 99925, 99926, 99927, 99928, 99929, 99950] \ No newline at end of file diff --git a/apps/showcase/static/error.html b/apps/showcase/static/error.html new file mode 100644 index 000000000..64d1f88f0 --- /dev/null +++ b/apps/showcase/static/error.html @@ -0,0 +1,83 @@ + + + + + +

    Error Ticket: division by zero

    +
    +
    Traceback (most recent call last):
    +  File "/home/massimo/Dropbox/py4web/py4web/core.py", line 932, in wrapper
    +    ret = func(*func_args, **func_kwargs)
    +  File "/home/massimo/Dropbox/py4web/apps/showcase/examples/page_with_error.py", line 6, in page_with_error
    +    1 / 0
    +ZeroDivisionError: division by zero
    +
    +
    +
    id2501
    uuidce059a4d-2b2b-4d67-b422-bd9914151254
    app_nameshowcase
    methodGET
    path/showcase/page_with_error
    timestampdatetime.datetime(2022, 6, 5, 22, 1, 21)
    client_ip127.0.0.1
    errordivision by zero
    snapshot
    timestamp2022-06-05 22:01:21.009223
    python_version3.8.10 (default, Mar 15 2022, 12:22:08) +[GCC 9.4.0]
    platform_info
    machinex86_64
    nodemdp-g3
    platformLinux-5.13.0-40-generic-x86_64-with-glibc2.29
    processorx86_64
    python_branch
    python_build
    • default
    • Mar 15 2022 12:22:08
    python_compilerGCC 9.4.0
    python_implementationCPython
    python_revision
    python_version3.8.10
    python_version_tuple
    • 3
    • 8
    • 10
    release5.13.0-40-generic
    systemLinux
    uname
    • Linux
    • mdp-g3
    • 5.13.0-40-generic
    • #45~20.04.1-Ubuntu SMP Mon Apr 4 09:38:31 UTC 2022
    • x86_64
    • x86_64
    version#45~20.04.1-Ubuntu SMP Mon Apr 4 09:38:31 UTC 2022
    os_environ
    DESKTOP_SESSIONubuntu
    XDG_SESSION_CLASSuser
    XDG_SESSION_TYPEx11
    XAUTHORITY/run/user/1000/gdm/Xauthority
    GDMSESSIONubuntu
    XMODIFIERS@im=ibus
    SHELL/bin/bash
    VTE_VERSION6003
    JOURNAL_STREAM8:48255
    XDG_CONFIG_DIRS/etc/xdg/xdg-ubuntu:/etc/xdg
    IM_CONFIG_PHASE1
    USERNAMEmassimo
    XDG_DATA_DIRS/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop
    _/usr/bin/make
    MANAGERPID1630
    LESSOPEN| /usr/bin/lesspipe %s
    PATH/home/massimo/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
    GPG_AGENT_INFO/run/user/1000/gnupg/S.gpg-agent:0:1
    SESSION_MANAGERlocal/mdp-g3:@/tmp/.ICE-unix/1847,unix/mdp-g3:/tmp/.ICE-unix/1847
    XDG_RUNTIME_DIR/run/user/1000
    XDG_MENU_PREFIXgnome-
    INVOCATION_ID5965126e4c7f45428c177345d762dde8
    LS_COLORSrs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
    XDG_SESSION_DESKTOPubuntu
    SSH_AUTH_SOCK/run/user/1000/keyring/ssh
    DISPLAY:0
    HOME/home/massimo
    PWD/home/massimo/Dropbox/py4web
    SSH_AGENT_PID1808
    GTK_MODULESgail:atk-bridge
    DBUS_SESSION_BUS_ADDRESSunix:path=/run/user/1000/bus
    LESSCLOSE/usr/bin/lesspipe %s %s
    LOGNAMEmassimo
    GNOME_DESKTOP_SESSION_IDthis-is-deprecated
    COLORTERMtruecolor
    QT_IM_MODULEibus
    SHLVL1
    GNOME_SHELL_SESSION_MODEubuntu
    USERmassimo
    XDG_CURRENT_DESKTOPubuntu:GNOME
    OLDPWD/home/massimo/Dropbox/py4web/apps
    MAKEFLAGS
    MFLAGS
    MAKE_TERMOUT/dev/pts/0
    QT_ACCESSIBILITY1
    GJS_DEBUG_TOPICSJS ERROR;JS LOG
    GNOME_TERMINAL_SCREEN/org/gnome/Terminal/screen/0f261012_0553_488d_84c6_e5b447972d10
    GNOME_TERMINAL_SERVICE:1.7932
    WINDOWPATH2
    GJS_DEBUG_OUTPUTstderr
    MAKE_TERMERR/dev/pts/0
    LANGen_US.UTF-8
    TERMxterm-256color
    MAKELEVEL1
    PY4WEB_APPS_FOLDER/home/massimo/Dropbox/py4web/apps
    PY4WEB_SERVICE_FOLDER/home/massimo/Dropbox/py4web/apps/.service
    PY4WEB_SERVICE_DB_URIsqlite://service.storage
    PY4WEB_PATH/home/massimo/Dropbox/py4web
    PY4WEB_PASSWORD_FILEpassword.txt
    PY4WEB_YESFalse
    PY4WEB_HOST127.0.0.1
    PY4WEB_PORT8000
    PY4WEB_QUIETFalse
    PY4WEB_SERVERdefault
    PY4WEB_NUMBER_WORKERS0
    PY4WEB_DASHBOARD_MODEfull
    PY4WEB_WATCHlazy
    PY4WEB_SSL_CERTNone
    PY4WEB_SSL_KEYNone
    PY4WEB_ERRORLOG:stderr
    PY4WEB_LOGGING_LEVEL30
    PY4WEB_DEBUGFalse
    tracebackTraceback (most recent call last): + File "/home/massimo/Dropbox/py4web/py4web/core.py", line 932, in wrapper + ret = func(*func_args, **func_kwargs) + File "/home/massimo/Dropbox/py4web/apps/showcase/examples/page_with_error.py", line 6, in page_with_error + 1 / 0 +ZeroDivisionError: division by zero +
    exception_typeZeroDivisionError
    exception_valuedivision by zero
    stackframes
    • file/home/massimo/Dropbox/py4web/py4web/core.py
      funcwrapper
      lnum932
      code
      • try: +
      • request.app_name = app_name +
      • ret = func(*func_args, **func_kwargs) +
      • if isinstance(ret, dict): +
      • response.headers["Content-Type"] = "application/json" +
    • file/home/massimo/Dropbox/py4web/apps/showcase/examples/page_with_error.py
      funcpage_with_error
      lnum6
      code
      • +
      • +
      • @action("page_with_error") +
      • def page_with_error(): +
      • 1 / 0 +
    + + + \ No newline at end of file diff --git a/apps/myfeed/static/favicon.ico b/apps/showcase/static/favicon.ico similarity index 100% rename from apps/myfeed/static/favicon.ico rename to apps/showcase/static/favicon.ico diff --git a/apps/examples/static/firebase-push.html b/apps/showcase/static/firebase-push.html similarity index 100% rename from apps/examples/static/firebase-push.html rename to apps/showcase/static/firebase-push.html diff --git a/apps/examples/static/hello.txt b/apps/showcase/static/hello.txt similarity index 100% rename from apps/examples/static/hello.txt rename to apps/showcase/static/hello.txt diff --git a/apps/showcase/static/js/axios.min.js b/apps/showcase/static/js/axios.min.js new file mode 100644 index 000000000..6b3d816d5 --- /dev/null +++ b/apps/showcase/static/js/axios.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).axios=t()}(this,(function(){"use strict";function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n2&&void 0!==arguments[2]?arguments[2]:{},a=i.allOwnKeys,s=void 0!==a&&a;if(null!=t)if("object"!==e(t)&&(t=[t]),p(t))for(r=0,o=t.length;r0;)if(t===(n=r[o]).toLowerCase())return n;return null}var C="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,N=function(e){return!h(e)&&e!==C};var x,P=(x="undefined"!=typeof Uint8Array&&c(Uint8Array),function(e){return x&&e instanceof x}),k=l("HTMLFormElement"),U=function(e){var t=Object.prototype.hasOwnProperty;return function(e,n){return t.call(e,n)}}(),_=l("RegExp"),F=function(e,t){var n=Object.getOwnPropertyDescriptors(e),r={};T(n,(function(n,o){var i;!1!==(i=t(n,o,e))&&(r[o]=i||n)})),Object.defineProperties(e,r)},B="abcdefghijklmnopqrstuvwxyz",L="0123456789",D={DIGIT:L,ALPHA:B,ALPHA_DIGIT:B+B.toUpperCase()+L};var I=l("AsyncFunction"),q={isArray:p,isArrayBuffer:m,isBuffer:function(e){return null!==e&&!h(e)&&null!==e.constructor&&!h(e.constructor)&&y(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:function(e){var t;return e&&("function"==typeof FormData&&e instanceof FormData||y(e.append)&&("formdata"===(t=f(e))||"object"===t&&y(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&m(e.buffer)},isString:v,isNumber:b,isBoolean:function(e){return!0===e||!1===e},isObject:g,isPlainObject:w,isUndefined:h,isDate:E,isFile:O,isBlob:S,isRegExp:_,isFunction:y,isStream:function(e){return g(e)&&y(e.pipe)},isURLSearchParams:A,isTypedArray:P,isFileList:R,forEach:T,merge:function e(){for(var t=N(this)&&this||{},n=t.caseless,r={},o=function(t,o){var i=n&&j(r,o)||o;w(r[i])&&w(t)?r[i]=e(r[i],t):w(t)?r[i]=e({},t):p(t)?r[i]=t.slice():r[i]=t},i=0,a=arguments.length;i3&&void 0!==arguments[3]?arguments[3]:{},o=r.allOwnKeys;return T(t,(function(t,r){n&&y(t)?e[r]=a(t,n):e[r]=t}),{allOwnKeys:o}),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,n,r){e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:function(e,t,n,r){var o,i,a,s={};if(t=t||{},null==e)return t;do{for(i=(o=Object.getOwnPropertyNames(e)).length;i-- >0;)a=o[i],r&&!r(a,e,t)||s[a]||(t[a]=e[a],s[a]=!0);e=!1!==n&&c(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:f,kindOfTest:l,endsWith:function(e,t,n){e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;var r=e.indexOf(t,n);return-1!==r&&r===n},toArray:function(e){if(!e)return null;if(p(e))return e;var t=e.length;if(!b(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n},forEachEntry:function(e,t){for(var n,r=(e&&e[Symbol.iterator]).call(e);(n=r.next())&&!n.done;){var o=n.value;t.call(e,o[0],o[1])}},matchAll:function(e,t){for(var n,r=[];null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:k,hasOwnProperty:U,hasOwnProp:U,reduceDescriptors:F,freezeMethods:function(e){F(e,(function(t,n){if(y(e)&&-1!==["arguments","caller","callee"].indexOf(n))return!1;var r=e[n];y(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=function(){throw Error("Can not rewrite read-only method '"+n+"'")}))}))},toObjectSet:function(e,t){var n={},r=function(e){e.forEach((function(e){n[e]=!0}))};return p(e)?r(e):r(String(e).split(t)),n},toCamelCase:function(e){return e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n}))},noop:function(){},toFiniteNumber:function(e,t){return e=+e,Number.isFinite(e)?e:t},findKey:j,global:C,isContextDefined:N,ALPHABET:D,generateString:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:16,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:D.ALPHA_DIGIT,n="",r=t.length;e--;)n+=t[Math.random()*r|0];return n},isSpecCompliantForm:function(e){return!!(e&&y(e.append)&&"FormData"===e[Symbol.toStringTag]&&e[Symbol.iterator])},toJSONObject:function(e){var t=new Array(10);return function e(n,r){if(g(n)){if(t.indexOf(n)>=0)return;if(!("toJSON"in n)){t[r]=n;var o=p(n)?[]:{};return T(n,(function(t,n){var i=e(t,r+1);!h(i)&&(o[n]=i)})),t[r]=void 0,o}}return n}(e,0)},isAsyncFn:I,isThenable:function(e){return e&&(g(e)||y(e))&&y(e.then)&&y(e.catch)}};function M(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}q.inherits(M,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:q.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var z=M.prototype,H={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((function(e){H[e]={value:e}})),Object.defineProperties(M,H),Object.defineProperty(z,"isAxiosError",{value:!0}),M.from=function(e,t,n,r,o,i){var a=Object.create(z);return q.toFlatObject(e,a,(function(e){return e!==Error.prototype}),(function(e){return"isAxiosError"!==e})),M.call(a,e.message,t,n,r,o),a.cause=e,a.name=e.name,i&&Object.assign(a,i),a};function J(e){return q.isPlainObject(e)||q.isArray(e)}function W(e){return q.endsWith(e,"[]")?e.slice(0,-2):e}function K(e,t,n){return e?e.concat(t).map((function(e,t){return e=W(e),!n&&t?"["+e+"]":e})).join(n?".":""):t}var V=q.toFlatObject(q,{},null,(function(e){return/^is[A-Z]/.test(e)}));function G(t,n,r){if(!q.isObject(t))throw new TypeError("target must be an object");n=n||new FormData;var o=(r=q.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!q.isUndefined(t[e])}))).metaTokens,i=r.visitor||f,a=r.dots,s=r.indexes,u=(r.Blob||"undefined"!=typeof Blob&&Blob)&&q.isSpecCompliantForm(n);if(!q.isFunction(i))throw new TypeError("visitor must be a function");function c(e){if(null===e)return"";if(q.isDate(e))return e.toISOString();if(!u&&q.isBlob(e))throw new M("Blob is not supported. Use a Buffer instead.");return q.isArrayBuffer(e)||q.isTypedArray(e)?u&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function f(t,r,i){var u=t;if(t&&!i&&"object"===e(t))if(q.endsWith(r,"{}"))r=o?r:r.slice(0,-2),t=JSON.stringify(t);else if(q.isArray(t)&&function(e){return q.isArray(e)&&!e.some(J)}(t)||(q.isFileList(t)||q.endsWith(r,"[]"))&&(u=q.toArray(t)))return r=W(r),u.forEach((function(e,t){!q.isUndefined(e)&&null!==e&&n.append(!0===s?K([r],t,a):null===s?r:r+"[]",c(e))})),!1;return!!J(t)||(n.append(K(i,r,a),c(t)),!1)}var l=[],d=Object.assign(V,{defaultVisitor:f,convertValue:c,isVisitable:J});if(!q.isObject(t))throw new TypeError("data must be an object");return function e(t,r){if(!q.isUndefined(t)){if(-1!==l.indexOf(t))throw Error("Circular reference detected in "+r.join("."));l.push(t),q.forEach(t,(function(t,o){!0===(!(q.isUndefined(t)||null===t)&&i.call(n,t,q.isString(o)?o.trim():o,r,d))&&e(t,r?r.concat(o):[o])})),l.pop()}}(t),n}function $(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function X(e,t){this._pairs=[],e&&G(e,this,t)}var Q=X.prototype;function Z(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Y(e,t,n){if(!t)return e;var r,o=n&&n.encode||Z,i=n&&n.serialize;if(r=i?i(t,n):q.isURLSearchParams(t)?t.toString():new X(t,n).toString(o)){var a=e.indexOf("#");-1!==a&&(e=e.slice(0,a)),e+=(-1===e.indexOf("?")?"?":"&")+r}return e}Q.append=function(e,t){this._pairs.push([e,t])},Q.toString=function(e){var t=e?function(t){return e.call(this,t,$)}:$;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var ee,te=function(){function e(){t(this,e),this.handlers=[]}return r(e,[{key:"use",value:function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}},{key:"eject",value:function(e){this.handlers[e]&&(this.handlers[e]=null)}},{key:"clear",value:function(){this.handlers&&(this.handlers=[])}},{key:"forEach",value:function(e){q.forEach(this.handlers,(function(t){null!==t&&e(t)}))}}]),e}(),ne={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},re={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:X,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},isStandardBrowserEnv:("undefined"==typeof navigator||"ReactNative"!==(ee=navigator.product)&&"NativeScript"!==ee&&"NS"!==ee)&&"undefined"!=typeof window&&"undefined"!=typeof document,isStandardBrowserWebWorkerEnv:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,protocols:["http","https","file","blob","url","data"]};function oe(e){function t(e,n,r,o){var i=e[o++],a=Number.isFinite(+i),s=o>=e.length;return i=!i&&q.isArray(r)?r.length:i,s?(q.hasOwnProp(r,i)?r[i]=[r[i],n]:r[i]=n,!a):(r[i]&&q.isObject(r[i])||(r[i]=[]),t(e,n,r[i],o)&&q.isArray(r[i])&&(r[i]=function(e){var t,n,r={},o=Object.keys(e),i=o.length;for(t=0;t-1,i=q.isObject(e);if(i&&q.isHTMLForm(e)&&(e=new FormData(e)),q.isFormData(e))return o&&o?JSON.stringify(oe(e)):e;if(q.isArrayBuffer(e)||q.isBuffer(e)||q.isStream(e)||q.isFile(e)||q.isBlob(e))return e;if(q.isArrayBufferView(e))return e.buffer;if(q.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();if(i){if(r.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return G(e,new re.classes.URLSearchParams,Object.assign({visitor:function(e,t,n,r){return re.isNode&&q.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((n=q.isFileList(e))||r.indexOf("multipart/form-data")>-1){var a=this.env&&this.env.FormData;return G(n?{"files[]":e}:e,a&&new a,this.formSerializer)}}return i||o?(t.setContentType("application/json",!1),function(e,t,n){if(q.isString(e))try{return(t||JSON.parse)(e),q.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||ie.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(e&&q.isString(e)&&(n&&!this.responseType||r)){var o=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(e){if(o){if("SyntaxError"===e.name)throw M.from(e,M.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:re.classes.FormData,Blob:re.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};q.forEach(["delete","get","head","post","put","patch"],(function(e){ie.headers[e]={}}));var ae=ie,se=q.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),ue=Symbol("internals");function ce(e){return e&&String(e).trim().toLowerCase()}function fe(e){return!1===e||null==e?e:q.isArray(e)?e.map(fe):String(e)}function le(e,t,n,r,o){return q.isFunction(r)?r.call(this,t,n):(o&&(t=n),q.isString(t)?q.isString(r)?-1!==t.indexOf(r):q.isRegExp(r)?r.test(t):void 0:void 0)}var de=function(e,n){function i(e){t(this,i),e&&this.set(e)}return r(i,[{key:"set",value:function(e,t,n){var r=this;function o(e,t,n){var o=ce(t);if(!o)throw new Error("header name must be a non-empty string");var i=q.findKey(r,o);(!i||void 0===r[i]||!0===n||void 0===n&&!1!==r[i])&&(r[i||t]=fe(e))}var i,a,s,u,c,f=function(e,t){return q.forEach(e,(function(e,n){return o(e,n,t)}))};return q.isPlainObject(e)||e instanceof this.constructor?f(e,t):q.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim())?f((c={},(i=e)&&i.split("\n").forEach((function(e){u=e.indexOf(":"),a=e.substring(0,u).trim().toLowerCase(),s=e.substring(u+1).trim(),!a||c[a]&&se[a]||("set-cookie"===a?c[a]?c[a].push(s):c[a]=[s]:c[a]=c[a]?c[a]+", "+s:s)})),c),t):null!=e&&o(t,e,n),this}},{key:"get",value:function(e,t){if(e=ce(e)){var n=q.findKey(this,e);if(n){var r=this[n];if(!t)return r;if(!0===t)return function(e){for(var t,n=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;t=r.exec(e);)n[t[1]]=t[2];return n}(r);if(q.isFunction(t))return t.call(this,r,n);if(q.isRegExp(t))return t.exec(r);throw new TypeError("parser must be boolean|regexp|function")}}}},{key:"has",value:function(e,t){if(e=ce(e)){var n=q.findKey(this,e);return!(!n||void 0===this[n]||t&&!le(0,this[n],n,t))}return!1}},{key:"delete",value:function(e,t){var n=this,r=!1;function o(e){if(e=ce(e)){var o=q.findKey(n,e);!o||t&&!le(0,n[o],o,t)||(delete n[o],r=!0)}}return q.isArray(e)?e.forEach(o):o(e),r}},{key:"clear",value:function(e){for(var t=Object.keys(this),n=t.length,r=!1;n--;){var o=t[n];e&&!le(0,this[o],o,e,!0)||(delete this[o],r=!0)}return r}},{key:"normalize",value:function(e){var t=this,n={};return q.forEach(this,(function(r,o){var i=q.findKey(n,o);if(i)return t[i]=fe(r),void delete t[o];var a=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n}))}(o):String(o).trim();a!==o&&delete t[o],t[a]=fe(r),n[a]=!0})),this}},{key:"concat",value:function(){for(var e,t=arguments.length,n=new Array(t),r=0;r1?n-1:0),o=1;o1?"since :\n"+u.map(Oe).join("\n"):" "+Oe(u[0]):"as no adapter specified"),"ERR_NOT_SUPPORT")}return n};function Ae(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new ve(null,e)}function Te(e){return Ae(e),e.headers=pe.from(e.headers),e.data=he.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1),Re(e.adapter||ae.adapter)(e).then((function(t){return Ae(e),t.data=he.call(e,e.transformResponse,t),t.headers=pe.from(t.headers),t}),(function(t){return me(t)||(Ae(e),t&&t.response&&(t.response.data=he.call(e,e.transformResponse,t.response),t.response.headers=pe.from(t.response.headers))),Promise.reject(t)}))}var je=function(e){return e instanceof pe?e.toJSON():e};function Ce(e,t){t=t||{};var n={};function r(e,t,n){return q.isPlainObject(e)&&q.isPlainObject(t)?q.merge.call({caseless:n},e,t):q.isPlainObject(t)?q.merge({},t):q.isArray(t)?t.slice():t}function o(e,t,n){return q.isUndefined(t)?q.isUndefined(e)?void 0:r(void 0,e,n):r(e,t,n)}function i(e,t){if(!q.isUndefined(t))return r(void 0,t)}function a(e,t){return q.isUndefined(t)?q.isUndefined(e)?void 0:r(void 0,e):r(void 0,t)}function s(n,o,i){return i in t?r(n,o):i in e?r(void 0,n):void 0}var u={url:i,method:i,data:i,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:s,headers:function(e,t){return o(je(e),je(t),!0)}};return q.forEach(Object.keys(Object.assign({},e,t)),(function(r){var i=u[r]||o,a=i(e[r],t[r],r);q.isUndefined(a)&&i!==s||(n[r]=a)})),n}var Ne="1.5.1",xe={};["object","boolean","number","function","string","symbol"].forEach((function(t,n){xe[t]=function(r){return e(r)===t||"a"+(n<1?"n ":" ")+t}}));var Pe={};xe.transitional=function(e,t,n){function r(e,t){return"[Axios v1.5.1] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,o,i){if(!1===e)throw new M(r(o," has been removed"+(t?" in "+t:"")),M.ERR_DEPRECATED);return t&&!Pe[o]&&(Pe[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,i)}};var ke={assertOptions:function(t,n,r){if("object"!==e(t))throw new M("options must be an object",M.ERR_BAD_OPTION_VALUE);for(var o=Object.keys(t),i=o.length;i-- >0;){var a=o[i],s=n[a];if(s){var u=t[a],c=void 0===u||s(u,a,t);if(!0!==c)throw new M("option "+a+" must be "+c,M.ERR_BAD_OPTION_VALUE)}else if(!0!==r)throw new M("Unknown option "+a,M.ERR_BAD_OPTION)}},validators:xe},Ue=ke.validators,_e=function(){function e(n){t(this,e),this.defaults=n,this.interceptors={request:new te,response:new te}}return r(e,[{key:"request",value:function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{};var n=t=Ce(this.defaults,t),r=n.transitional,o=n.paramsSerializer,i=n.headers;void 0!==r&&ke.assertOptions(r,{silentJSONParsing:Ue.transitional(Ue.boolean),forcedJSONParsing:Ue.transitional(Ue.boolean),clarifyTimeoutError:Ue.transitional(Ue.boolean)},!1),null!=o&&(q.isFunction(o)?t.paramsSerializer={serialize:o}:ke.assertOptions(o,{encode:Ue.function,serialize:Ue.function},!0)),t.method=(t.method||this.defaults.method||"get").toLowerCase();var a=i&&q.merge(i.common,i[t.method]);i&&q.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete i[e]})),t.headers=pe.concat(a,i);var s=[],u=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(u=u&&e.synchronous,s.unshift(e.fulfilled,e.rejected))}));var c,f=[];this.interceptors.response.forEach((function(e){f.push(e.fulfilled,e.rejected)}));var l,d=0;if(!u){var p=[Te.bind(this),void 0];for(p.unshift.apply(p,s),p.push.apply(p,f),l=p.length,c=Promise.resolve(t);d0;)o._listeners[t](e);o._listeners=null}})),this.promise.then=function(e){var t,n=new Promise((function(e){o.subscribe(e),t=e})).then(e);return n.cancel=function(){o.unsubscribe(t)},n},n((function(e,t,n){o.reason||(o.reason=new ve(e,t,n),r(o.reason))}))}return r(e,[{key:"throwIfRequested",value:function(){if(this.reason)throw this.reason}},{key:"subscribe",value:function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}},{key:"unsubscribe",value:function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}}}],[{key:"source",value:function(){var t;return{token:new e((function(e){t=e})),cancel:t}}}]),e}();var Le={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Le).forEach((function(e){var t=o(e,2),n=t[0],r=t[1];Le[r]=n}));var De=Le;var Ie=function e(t){var n=new Fe(t),r=a(Fe.prototype.request,n);return q.extend(r,Fe.prototype,n,{allOwnKeys:!0}),q.extend(r,n,null,{allOwnKeys:!0}),r.create=function(n){return e(Ce(t,n))},r}(ae);return Ie.Axios=Fe,Ie.CanceledError=ve,Ie.CancelToken=Be,Ie.isCancel=me,Ie.VERSION=Ne,Ie.toFormData=G,Ie.AxiosError=M,Ie.Cancel=Ie.CanceledError,Ie.all=function(e){return Promise.all(e)},Ie.spread=function(e){return function(t){return e.apply(null,t)}},Ie.isAxiosError=function(e){return q.isObject(e)&&!0===e.isAxiosError},Ie.mergeConfig=Ce,Ie.AxiosHeaders=pe,Ie.formToJSON=function(e){return oe(q.isHTMLForm(e)?new FormData(e):e)},Ie.getAdapter=Re,Ie.HttpStatusCode=De,Ie.default=Ie,Ie})); +//# sourceMappingURL=axios.min.js.map diff --git a/apps/examples/static/js/axios.min.map b/apps/showcase/static/js/axios.min.map similarity index 100% rename from apps/examples/static/js/axios.min.map rename to apps/showcase/static/js/axios.min.map diff --git a/apps/examples/static/js/firebase-push.js b/apps/showcase/static/js/firebase-push.js similarity index 100% rename from apps/examples/static/js/firebase-push.js rename to apps/showcase/static/js/firebase-push.js diff --git a/apps/showcase/static/js/prism.js b/apps/showcase/static/js/prism.js new file mode 100644 index 000000000..4cfc5759f --- /dev/null +++ b/apps/showcase/static/js/prism.js @@ -0,0 +1,10 @@ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+python&plugins=remove-initial-line-feed+normalize-whitespace */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; +Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; +"undefined"!=typeof Prism&&"undefined"!=typeof document&&Prism.hooks.add("before-sanity-check",(function(e){if(e.code){var n=e.element.parentNode,o=/(?:^|\s)keep-initial-line-feed(?:\s|$)/;!n||"pre"!==n.nodeName.toLowerCase()||o.test(n.className)||o.test(e.element.className)||(e.code=e.code.replace(/^(?:\r?\n|\r)/,""))}})); +!function(){if("undefined"!=typeof Prism){var e=Object.assign||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e},t={"remove-trailing":"boolean","remove-indent":"boolean","left-trim":"boolean","right-trim":"boolean","break-lines":"number",indent:"number","remove-initial-line-feed":"boolean","tabs-to-spaces":"number","spaces-to-tabs":"number"};n.prototype={setDefaults:function(t){this.defaults=e(this.defaults,t)},normalize:function(t,n){for(var r in n=e(this.defaults,n)){var i=r.replace(/-(\w)/g,(function(e,t){return t.toUpperCase()}));"normalize"!==r&&"setDefaults"!==i&&n[r]&&this[i]&&(t=this[i].call(this,t,n[r]))}return t},leftTrim:function(e){return e.replace(/^\s+/,"")},rightTrim:function(e){return e.replace(/\s+$/,"")},tabsToSpaces:function(e,t){return t=0|t||4,e.replace(/\t/g,new Array(++t).join(" "))},spacesToTabs:function(e,t){return t=0|t||4,e.replace(RegExp(" {"+t+"}","g"),"\t")},removeTrailing:function(e){return e.replace(/\s*?$/gm,"")},removeInitialLineFeed:function(e){return e.replace(/^(?:\r?\n|\r)/,"")},removeIndent:function(e){var t=e.match(/^[^\S\n\r]*(?=\S)/gm);return t&&t[0].length?(t.sort((function(e,t){return e.length-t.length})),t[0].length?e.replace(RegExp("^"+t[0],"gm"),""):e):e},indent:function(e,t){return e.replace(/^[^\S\n\r]*(?=\S)/gm,new Array(++t).join("\t")+"$&")},breakLines:function(e,t){t=!0===t?80:0|t||80;for(var n=e.split("\n"),i=0;it&&(o[l]="\n"+o[l],a=s)}n[i]=o.join("")}return n.join("\n")}},"undefined"!=typeof module&&module.exports&&(module.exports=n),Prism.plugins.NormalizeWhitespace=new n({"remove-trailing":!0,"remove-indent":!0,"left-trim":!0,"right-trim":!0}),Prism.hooks.add("before-sanity-check",(function(e){var n=Prism.plugins.NormalizeWhitespace;if((!e.settings||!1!==e.settings["whitespace-normalization"])&&Prism.util.isActive(e.element,"whitespace-normalization",!0))if(e.element&&e.element.parentNode||!e.code){var r=e.element.parentNode;if(e.code&&r&&"pre"===r.nodeName.toLowerCase()){for(var i in null==e.settings&&(e.settings={}),t)if(Object.hasOwnProperty.call(t,i)){var o=t[i];if(r.hasAttribute("data-"+i))try{var a=JSON.parse(r.getAttribute("data-"+i)||"true");typeof a===o&&(e.settings[i]=a)}catch(e){}}for(var l=r.childNodes,s="",c="",u=!1,m=0;m { + app.vue.posts = result.data.posts; + }) +}; + +// Start the app +app.init(); diff --git a/apps/examples/static/js/sugar.min.js b/apps/showcase/static/js/sugar.min.js similarity index 100% rename from apps/examples/static/js/sugar.min.js rename to apps/showcase/static/js/sugar.min.js diff --git a/apps/examples/static/js/utils.js b/apps/showcase/static/js/utils.js similarity index 82% rename from apps/examples/static/js/utils.js rename to apps/showcase/static/js/utils.js index 8873d808b..c0ba784d2 100644 --- a/apps/examples/static/js/utils.js +++ b/apps/showcase/static/js/utils.js @@ -56,26 +56,6 @@ Q.get_cookie = function (name) { return decodeURIComponent(!!cookie ? cookie.toString().replace(/^[^=]+./, "") : ""); }; -// Gets a session token (py4web specific) -Q.get_session_token = function () { - var app_name = Q.get_cookie('app_name'); - return Q.get_cookie(app_name + '_session'); -}; - -// Load data from localstorage -Q.retrieve = function (key) { - try { - return JSON.parse(window.localStorage.getItem(key)); - } catch (e) { - return null; - } -}; - -// Save data to localstorage -Q.store = function (key, value) { - window.localStorage.setItem(key, JSON.stringify(value)); -}; - // Load components lazily: https://vuejs.org/v2/guide/components.html#Async-Components Q.register_vue_component = function (name, src, onload) { Vue.component(name, function (resolve, reject) { @@ -164,59 +144,6 @@ Q.throttle = (callback, delay) => { return throttledEventHandler; }; -// A Vue app prototype -Q.app = function (elem_id) { - self = {}; - self.elem_id = elem_id || 'vue'; - self.data = { loading: 0, page: null, state: null }; - self.methods = {}; - self.filters = {}; - self.watch = {}; - self.pages = {}; - // translations - self.methods.T = T; - // toggles a variable - self.methods.toggle = function (obj, key) { obj[key] = !obj[key] }; - // sets a variable - self.methods.set = function (obj, key, value) { obj[key] = value; }; - // goto a given page and state (state should be 1 level deep dict - self.methods.go = function (page, state, push) { - self.v.loading++; - var pagecall = self.pages[page]; - if (pagecall) pagecall(state, function () { - if (push) { - var path = self.base + '/' + page; - if (state) for (var key in state) path += '/' + key + '/' + state[key]; - window.history.pushState(self.v, page, path); - } - self.v.loading--; - self.v.page = page; - self.v.state = state; - }); - }; - // restores state when navigating history - self.onpopstate = function (event) { - for (var key in event.state) self.v[key] = event.state[key]; - }; - self.start = function (base) { - self.base = base = base || window.location.href;; - self.v = new Vue({ - el: '#' + self.elem_id, - data: self.data, - methods: self.methods, - watch: self.watch, - filters: self.filters - }); - var parts = window.location.href.substr(base.length); - var page = parts[0]; - var state = {}; - for (var i = 1; i < parts.length; i += 2) state[parts[i]] = parts[i + 1]; - self.v.go(page, state, false); - window.onpopstate = self.onpopstate; - }; - return self; -}; - // Renders a JSON field with tags_input Q.tags_input = function(elem, options) { if (typeof elem === typeof '') elem = Q(elem)[0]; @@ -245,7 +172,6 @@ Q.tags_input = function(elem, options) { var fill = function(elem, repl) { repl.innerHTML = ''; tags.forEach(function(x){ - console.log(x); var item = document.createElement('li'); item.innerHTML = options.labels[x] || x; item.dataset.value = x; @@ -255,12 +181,14 @@ Q.tags_input = function(elem, options) { if(item.dataset.selected=='false') keys.push(x); else keys = keys.filter(function(y){ return x!=y; }); item.dataset.selected = keys.indexOf(x)>=0; elem.value = JSON.stringify(keys); + elem.dispatchEvent(new Event('input', { bubbles: true })); }; }); }; if (options.freetext) { var inp = document.createElement('input'); elem.parentNode.insertBefore(inp, elem); + inp.type = "text"; inp.classList = elem.classList; inp.placeholder = options.placeholder; inp.setAttribute('list', options.autocomplete_list); @@ -273,6 +201,7 @@ Q.tags_input = function(elem, options) { }); inp.value = ''; elem.value = JSON.stringify(keys); + elem.dispatchEvent(new Event('input', { bubbles: true })); fill(elem, repl); }; } @@ -330,7 +259,6 @@ Q.load_and_trap = function (method, url, form_data, target) { if (res.redirected) window.location = res.url; Q('#'+target)[0].innerHTML = res.data; Q.trap_form(url, target); - console.log(res.headers); var flash = res.headers.get('component-flash'); if (flash) Q.flash(JSON.parse(flash)); }; @@ -368,7 +296,6 @@ Q.handle_flash = function() { if (elem) { elem.addEventListener('flash', make_handler(elem), false); Q.flash = function(detail) {elem.dispatchEvent(new CustomEvent('flash', {detail: detail}));}; - console.log(elem.dataset.alert); if (elem.dataset.alert) Q.flash(Q.eval(elem.dataset.alert)); } }; diff --git a/apps/showcase/static/js/utils.min.js b/apps/showcase/static/js/utils.min.js new file mode 100644 index 000000000..c5d780046 --- /dev/null +++ b/apps/showcase/static/js/utils.min.js @@ -0,0 +1,10 @@ +"user strict";if(!String.prototype.format){String.prototype.format=function(args){return this.replace(/\{([^}]+)\}/g,function(match,k){return args[k];});};} +window.Q=function(sel,el){return(el||document).querySelectorAll(sel);};utils={};Q.get_query=function(source){source=source||window.location.search.substring(1);var vars={},items=source.split('&');items.map(function(item){var pair=item.split('=');vars[decodeURIComponent(pair[0])]=decodeURIComponent(pair[1]);});return vars;};Q.get_cookie=function(name){var cookie=RegExp(""+name+"[^;]+").exec(document.cookie);if(!cookie)return null;return decodeURIComponent(!!cookie?cookie.toString().replace(/^[^=]+./,""):"");};Q.get_session_token=function(){var app_name=Q.get_cookie('app_name');return Q.get_cookie(app_name+'_session');};Q.clone=function(data){return JSON.parse(JSON.stringify(data));};Q.retrieve=function(key){try{return JSON.parse(window.localStorage.getItem(key));}catch(e){return null;}};Q.store=function(key,value){window.localStorage.setItem(key,JSON.stringify(value));};Q.register_vue_component=function(name,src,onload){Vue.component(name,function(resolve,reject){axios.get(src).then(function(data){resolve(onload(data));});});};Q.upload_helper=function(element_id,callback){var element=document.getElementById(element_id);if(element){var files=element.files;var reader=new FileReader();if(files&&files[0]){reader.onload=function(event){var b64=btoa(event.target.result);callback(files[0].name,b64);};reader.readAsBinaryString(files[0]);}else{callback();}}};var T=function(text){var obj={toString:function(){return T.format(text);},format:function(args){return T.format(text,args);}};return obj;};T.format=function(text,args){args=args||{};translations=(T.translations||{})[text];var n=('n'in args)?args.n:1;if(translations){var k=0;for(var key in translations){var i=parseInt(key);if(i<=n)k=i;else break;} +text=translations[k];} +return text;};Q.debounce=(func,wait)=>{let timeout;return function executedFunction(...args){const later=()=>{clearTimeout(timeout);func(...args);};clearTimeout(timeout);timeout=setTimeout(later,wait);};};Q.throttle=(callback,delay)=>{let throttleTimeout=null;let storedEvent=null;const throttledEventHandler=event=>{storedEvent=event;const shouldHandleEvent=!throttleTimeout;if(shouldHandleEvent){callback(storedEvent);storedEvent=null;throttleTimeout=setTimeout(()=>{throttleTimeout=null;if(storedEvent){throttledEventHandler(storedEvent);}},delay);}};return throttledEventHandler;};Q.app=function(element_id){self={};self.element_id=element_id||'vue';self.data={loading:0,page:null,state:null};self.methods={};self.filters={};self.watch={};self.pages={};self.methods.T=T;self.methods.toggle=function(obj,key){obj[key]=!obj[key]};self.methods.set=function(obj,key,value){obj[key]=value;};self.methods.go=function(page,state,push){self.v.loading++;var pagecall=self.pages[page];if(pagecall)pagecall(state,function(){if(push){var path=self.base+'/'+page;if(state)for(var key in state)path+='/'+key+'/'+state[key];window.history.pushState(self.v,page,path);} +self.v.loading--;self.v.page=page;self.v.state=state;});};self.onpopstate=function(event){for(var key in event.state)self.v[key]=event.state[key];};self.start=function(base){self.base=base=base||window.location.href;;self.v=new Vue({el:'#'+self.element_id,data:self.data,methods:self.methods,watch:self.watch,filters:self.filters});var parts=window.location.href.substr(base.length);var page=parts[0];var state={};for(var i=1;i=0)item.classList.add('selected');repl.appendChild(item);item.onclick=function(evt){if(keys.indexOf(x)<0)keys.push(x);else keys=keys.filter(function(y){return x!=y;});elem.value=JSON.stringify(keys);item.classList.toggle('selected');};});};if(options.freetext){var inp=document.createElement('input');elem.parentNode.insertBefore(inp,elem);inp.classList=elem.classList;inp.placeholder=options.placeholder;inp.setAttribute('list',options.autocomplete_list);inp.onchange=function(evt){inp.value.split(',').map(function(x){x=options.transform(x.trim());if(x&&tags.indexOf(x)<0)tags.push(x);if(x&&keys.indexOf(x)<0)keys.push(x);});inp.value='';elem.value=JSON.stringify(keys);fill(elem,repl);};} +fill(elem,repl);};Q.score_password=function(text){var score=-10,counters={};text.split('').map(function(c){counters[c]=(counters[c]||0)+1;score+=5/counters[c];});[/\d/,/[a-z]/,/[A-Z]/,/\W/].map(function(re){score+=re.test(text)?10:0;});return Math.round(Math.max(0,score));};Q.score_input=function(selector,reference){var elem=Q(selector)[0];reference=reference||100;if(elem){elem.style.backgroundPosition='center right';elem.style.backgroundRepeat='no-repeat';elem.onkeyup=elem.onchange=function(evt){var score=Q.score_password(elem.value.trim());var r=Math.round(255*Math.max(0,Math.min(2-2*score/reference,1)));var g=Math.round(255*Math.max(0,Math.min(2*score/reference,1)));elem.style.backgroundImage=(score==0)?"":("url('"+'data:image/svg+xml;utf8,'+"')");};}};Q.trap_form=function(action,element_id){Q('#'+element_id+' form').forEach(function(form){if(form.classList.contains('py4web_notrap'))return;var target=form.dataset['py4web_target']||element_id;form.dataset['py4web_target']=target;var url=form.action;if(url===''||url==='#'||url===void 0)url=action;var clickable='input[type=submit], input[type=image], button[type=submit], button:not([type])';form.querySelectorAll(clickable).forEach(function(element){element.onclick=function(event){event.preventDefault();form.querySelectorAll(clickable).forEach(function(element){element.disabled=true;});var form_data=new FormData(form);Q.load_and_trap('POST',url,form_data,target);};});});};Q.load_and_trap=function(method,url,form_data,target){method=(method||'GET').toLowerCase();if(target===void 0||target==='')target='py4web_none';var onsuccess=function(res){Q('#'+target)[0].innerHTML=res.data;Q.trap_form(url,target);var flash=res.headers['flash-alert'] +if(flash)Q.flash(JSON.parse(flash));};var onerror=function(res){alert('ajax error');};axios[method](url,form_data).then(onsuccess,onerror);};Q.handle_components=function(){Q('py4web-component').forEach(function(element){Q.load_and_trap('GET',element.attributes.url.value,null,element.attributes.id.value);});};Q.handle_flash=function(){var element=Q('#py4web-flash')[0];element.dataset.counter=0;var make_delete_handler=function(node){return function(event){node.parentNode.removeChild(node);};};var make_handler=function(element){return function(event){var id='notification-{0}'.format([element.dataset.counter]);element.dataset.counter=parseInt(element.dataset.counter)+1;var node=document.createElement("div");node.innerHTML='
    {0}
    '.format([event.detail.message]);node=Q('[role="alert"]',node)[0];node.classList.add(event.detail.class||'info');element.appendChild(node);Q('[role="alert"] .close',node)[0].onclick=make_delete_handler(node);};};if(element){element.addEventListener('flash',make_handler(element),false);Q.flash=function(detail){element.dispatchEvent(new CustomEvent('flash',{detail:detail}));};}};Q.handle_components();Q.handle_flash(); diff --git a/apps/examples/static/js/vue.js b/apps/showcase/static/js/vue.js similarity index 99% rename from apps/examples/static/js/vue.js rename to apps/showcase/static/js/vue.js index 4ef7ff1b0..919aa1251 100644 --- a/apps/examples/static/js/vue.js +++ b/apps/showcase/static/js/vue.js @@ -1,6 +1,6 @@ /*! - * Vue.js v2.6.10 - * (c) 2014-2019 Evan You + * Vue.js v2.6.12 + * (c) 2014-2020 Evan You * Released under the MIT License. */ (function (global, factory) { @@ -1969,7 +1969,7 @@ isUsingMicroTask = true; } else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) { // Fallback to setImmediate. - // Techinically it leverages the (macro) task queue, + // Technically it leverages the (macro) task queue, // but it is still a better choice than setTimeout. timerFunc = function () { setImmediate(flushCallbacks); @@ -2058,7 +2058,7 @@ warn( "Property \"" + key + "\" must be accessed with \"$data." + key + "\" because " + 'properties starting with "$" or "_" are not proxied in the Vue instance to ' + - 'prevent conflicts with Vue internals' + + 'prevent conflicts with Vue internals. ' + 'See: https://vuejs.org/v2/api/#data', target ); @@ -2918,7 +2918,7 @@ if (typeof key === 'string' && key) { baseObj[values[i]] = values[i + 1]; } else if (key !== '' && key !== null) { - // null is a speical value for explicitly removing a binding + // null is a special value for explicitly removing a binding warn( ("Invalid value for dynamic directive argument (expected string or null): " + key), this @@ -3413,6 +3413,12 @@ ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag); if (config.isReservedTag(tag)) { // platform built-in elements + if (isDef(data) && isDef(data.nativeOn)) { + warn( + ("The .native modifier for v-on is only valid on components but it was used on <" + tag + ">."), + context + ); + } vnode = new VNode( config.parsePlatformTagName(tag), data, children, undefined, undefined, context @@ -3538,7 +3544,7 @@ // render self var vnode; try { - // There's no need to maintain a stack becaues all render fns are called + // There's no need to maintain a stack because all render fns are called // separately from one another. Nested component's render fns are called // when parent component is patched. currentRenderingInstance = vm; @@ -5437,7 +5443,7 @@ value: FunctionalRenderContext }); - Vue.version = '2.6.10'; + Vue.version = '2.6.12'; /* */ @@ -6110,7 +6116,7 @@ } } - function removeVnodes (parentElm, vnodes, startIdx, endIdx) { + function removeVnodes (vnodes, startIdx, endIdx) { for (; startIdx <= endIdx; ++startIdx) { var ch = vnodes[startIdx]; if (isDef(ch)) { @@ -6221,7 +6227,7 @@ refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm; addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue); } else if (newStartIdx > newEndIdx) { - removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx); + removeVnodes(oldCh, oldStartIdx, oldEndIdx); } } @@ -6313,7 +6319,7 @@ if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); } addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue); } else if (isDef(oldCh)) { - removeVnodes(elm, oldCh, 0, oldCh.length - 1); + removeVnodes(oldCh, 0, oldCh.length - 1); } else if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); } @@ -6542,7 +6548,7 @@ // destroy old node if (isDef(parentElm)) { - removeVnodes(parentElm, [oldVnode], 0, 0); + removeVnodes([oldVnode], 0, 0); } else if (isDef(oldVnode.tag)) { invokeDestroyHook(oldVnode); } @@ -7643,7 +7649,7 @@ // skip the update if old and new VDOM state is the same. // `value` is handled separately because the DOM value may be temporarily // out of sync with VDOM state due to focus, composition and modifiers. - // This #4521 by skipping the unnecesarry `checked` update. + // This #4521 by skipping the unnecessary `checked` update. cur !== oldProps[key] ) { // some property updates can throw @@ -9248,7 +9254,7 @@ var startTagClose = /^\s*(\/?)>/; var endTag = new RegExp(("^<\\/" + qnameCapture + "[^>]*>")); var doctype = /^]+>/i; - // #7298: escape - to avoid being pased as HTML comment when inlined in page + // #7298: escape - to avoid being passed as HTML comment when inlined in page var comment = /^ can only appear at the root level inside " + - "the receiving the component", + "the receiving component", el ); } @@ -10720,7 +10726,7 @@ /* */ - var fnExpRE = /^([\w$_]+|\([^)]*?\))\s*=>|^function\s*(?:[\w$]+)?\s*\(/; + var fnExpRE = /^([\w$_]+|\([^)]*?\))\s*=>|^function(?:\s+[\w$]+)?\s*\(/; var fnInvokeRE = /\([^)]*?\);*$/; var simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/; @@ -11489,6 +11495,8 @@ var range = node.rawAttrsMap[name]; if (name === 'v-for') { checkFor(node, ("v-for=\"" + value + "\""), warn, range); + } else if (name === 'v-slot' || name[0] === '#') { + checkFunctionParameterExpression(value, (name + "=\"" + value + "\""), warn, range); } else if (onRE.test(name)) { checkEvent(value, (name + "=\"" + value + "\""), warn, range); } else { @@ -11508,9 +11516,9 @@ } function checkEvent (exp, text, warn, range) { - var stipped = exp.replace(stripStringRE, ''); - var keywordMatch = stipped.match(unaryOperatorsRE); - if (keywordMatch && stipped.charAt(keywordMatch.index - 1) !== '$') { + var stripped = exp.replace(stripStringRE, ''); + var keywordMatch = stripped.match(unaryOperatorsRE); + if (keywordMatch && stripped.charAt(keywordMatch.index - 1) !== '$') { warn( "avoid using JavaScript unary operator as property name: " + "\"" + (keywordMatch[0]) + "\" in expression " + (text.trim()), @@ -11565,6 +11573,19 @@ } } + function checkFunctionParameterExpression (exp, text, warn, range) { + try { + new Function(exp, ''); + } catch (e) { + warn( + "invalid function parameter expression: " + (e.message) + " in\n\n" + + " " + exp + "\n\n" + + " Raw expression: " + (text.trim()) + "\n", + range + ); + } + } + /* */ var range = 2; diff --git a/apps/examples/static/js/vue.min.js b/apps/showcase/static/js/vue.min.js similarity index 100% rename from apps/examples/static/js/vue.min.js rename to apps/showcase/static/js/vue.min.js diff --git a/apps/myfeed/databases/README.md b/apps/showcase/static/socketio/README.md similarity index 100% rename from apps/myfeed/databases/README.md rename to apps/showcase/static/socketio/README.md diff --git a/apps/myfeed/static/README.md b/apps/showcase/static/ws/README.md similarity index 100% rename from apps/myfeed/static/README.md rename to apps/showcase/static/ws/README.md diff --git a/apps/showcase/templates/auth.html b/apps/showcase/templates/auth.html new file mode 100644 index 000000000..8f4c6b73a --- /dev/null +++ b/apps/showcase/templates/auth.html @@ -0,0 +1,15 @@ +[[extend "layout.html"]] + +
    + [[=form]] +
    diff --git a/apps/examples/templates/ajax_grid.html b/apps/showcase/templates/examples/ajax_grid.html similarity index 100% rename from apps/examples/templates/ajax_grid.html rename to apps/showcase/templates/examples/ajax_grid.html diff --git a/apps/examples/templates/auth_custom_login.html b/apps/showcase/templates/examples/auth_custom_login.html similarity index 100% rename from apps/examples/templates/auth_custom_login.html rename to apps/showcase/templates/examples/auth_custom_login.html diff --git a/apps/examples/templates/auth_form.html b/apps/showcase/templates/examples/auth_form.html similarity index 100% rename from apps/examples/templates/auth_form.html rename to apps/showcase/templates/examples/auth_form.html diff --git a/apps/examples/templates/auth_forms.html b/apps/showcase/templates/examples/auth_forms.html similarity index 100% rename from apps/examples/templates/auth_forms.html rename to apps/showcase/templates/examples/auth_forms.html diff --git a/apps/examples/templates/component_loader.html b/apps/showcase/templates/examples/component_loader.html similarity index 100% rename from apps/examples/templates/component_loader.html rename to apps/showcase/templates/examples/component_loader.html diff --git a/apps/examples/templates/custom_form.html b/apps/showcase/templates/examples/custom_form.html similarity index 87% rename from apps/examples/templates/custom_form.html rename to apps/showcase/templates/examples/custom_form.html index ac75b83c2..946cab7c1 100644 --- a/apps/examples/templates/custom_form.html +++ b/apps/showcase/templates/examples/custom_form.html @@ -20,9 +20,6 @@

    Form Superhero Identity (Custom)

    - [[ for hidden_widget in form.custom.hidden_widgets: ]] - [[= form.custom.hidden_widgets[hidden_widget] ]] - [[ pass ]] [[= form.custom.end ]] diff --git a/apps/examples/templates/flash_example.html b/apps/showcase/templates/examples/flash_example.html similarity index 100% rename from apps/examples/templates/flash_example.html rename to apps/showcase/templates/examples/flash_example.html diff --git a/apps/examples/templates/flash_example_next.html b/apps/showcase/templates/examples/flash_example_next.html similarity index 100% rename from apps/examples/templates/flash_example_next.html rename to apps/showcase/templates/examples/flash_example_next.html diff --git a/apps/examples/templates/form.html b/apps/showcase/templates/examples/form.html similarity index 52% rename from apps/examples/templates/form.html rename to apps/showcase/templates/examples/form.html index 4d76984fd..c7fd4ed61 100644 --- a/apps/examples/templates/form.html +++ b/apps/showcase/templates/examples/form.html @@ -8,6 +8,7 @@

    Rows

      [[for row in rows:]] -
    • [[=row.id]]: [[=row.name]] ([[=row.job]])
    • +
    • [[=row.id]]: [[=row.name]] ([[=row.job]]) edit
    • [[pass]] +
    • create
    diff --git a/apps/examples/templates/forms.html b/apps/showcase/templates/examples/forms.html similarity index 100% rename from apps/examples/templates/forms.html rename to apps/showcase/templates/examples/forms.html diff --git a/apps/myfeed/templates/generic.html b/apps/showcase/templates/examples/generic.html similarity index 100% rename from apps/myfeed/templates/generic.html rename to apps/showcase/templates/examples/generic.html diff --git a/apps/showcase/templates/examples/hcaptcha_form.html b/apps/showcase/templates/examples/hcaptcha_form.html new file mode 100644 index 000000000..9a5e72e50 --- /dev/null +++ b/apps/showcase/templates/examples/hcaptcha_form.html @@ -0,0 +1,12 @@ +[[extend 'layout.html']] + +

    Simple form with hCaptcha

    + +[[=form]] + + + + +[[block page_scripts]] + +[[end]] \ No newline at end of file diff --git a/apps/showcase/templates/examples/html_grid.html b/apps/showcase/templates/examples/html_grid.html new file mode 100644 index 000000000..73d6cebc3 --- /dev/null +++ b/apps/showcase/templates/examples/html_grid.html @@ -0,0 +1,7 @@ +[[extend 'layout.html']] + +

    examples/Pure.html Grid

    +
    + [[=grid]] +
    + diff --git a/apps/showcase/templates/examples/page_with_tailwindcss.html b/apps/showcase/templates/examples/page_with_tailwindcss.html new file mode 100644 index 000000000..ad79712de --- /dev/null +++ b/apps/showcase/templates/examples/page_with_tailwindcss.html @@ -0,0 +1,16 @@ +[[extend 'layout_tailwind.html']] + + +
    + Page with TailwindCSS Grid +
    + + +
    +
    +

    Data Table

    +
    + [[ = grid.render() ]] +
    +
    +
    \ No newline at end of file diff --git a/apps/examples/templates/page_with_template.html b/apps/showcase/templates/examples/page_with_template.html similarity index 100% rename from apps/examples/templates/page_with_template.html rename to apps/showcase/templates/examples/page_with_template.html diff --git a/apps/showcase/templates/examples/rest_info.html b/apps/showcase/templates/examples/rest_info.html new file mode 100644 index 000000000..93e374d89 --- /dev/null +++ b/apps/showcase/templates/examples/rest_info.html @@ -0,0 +1,43 @@ +[[extend "layout.html"]] + +

    Rest examples

    + +Your authentication token is [[=token]]. +Reload the page for a new token. + +

    List all chairs

    +
    +    curl -H "Authentication: [[=token]]" \
    +         [[=URL('rest/chair', scheme=True)]]
    +
    + +

    Create a new chair record

    +
    +    curl -X POST \
    +         -d '{"color":"red"}' \
    +         -H "Content-Type: application/json" \
    +         -H "Authentication: [[=token]]" \
    +         [[=URL('rest/chair', scheme=True)]]
    +
    + +

    Retrieve chair with id=1

    +
    +    curl -H "Authentication: [[=token]]" \
    +         [[=URL('rest/chair/1', scheme=True)]]
    +
    + +

    Update chair with id=1

    +
    +    curl -X PUT \
    +         -d '{"color":"green"}' \
    +         -H "Content-Type: application/json" \
    +         -H "Authentication: [[=token]]" \
    +         [[=URL('rest/chair/1', scheme=True)]]
    +
    + +

    Delete chair with id=1

    +
    +    curl -X DELETE \
    +         -H "Authentication: [[=token]]" \
    +         [[=URL('rest/chair/1', scheme=True)]]
    +
    diff --git a/apps/showcase/templates/examples/session_counter.html b/apps/showcase/templates/examples/session_counter.html new file mode 100644 index 000000000..643e9633d --- /dev/null +++ b/apps/showcase/templates/examples/session_counter.html @@ -0,0 +1,6 @@ +[[extend "layout.html"]] + +

    Counter value: [[=counter]]

    + +Click to reload and increment counter +Click to reload and reset counter diff --git a/apps/examples/templates/tagsinput_form.html b/apps/showcase/templates/examples/tagsinput_form.html similarity index 100% rename from apps/examples/templates/tagsinput_form.html rename to apps/showcase/templates/examples/tagsinput_form.html diff --git a/apps/showcase/templates/index.html b/apps/showcase/templates/index.html new file mode 100644 index 000000000..dd03667b6 --- /dev/null +++ b/apps/showcase/templates/index.html @@ -0,0 +1,201 @@ +[[extend 'layout.html']] + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Complete Example Apps
    + Start with a Todo app
    + A minimalist Facebook clone
    + A minimalist Twitter clone
    + More third party contributed apps... +
    Simple Serverside Examples
    A normal page without templateexample
    A normal page with templateexample
    A normal page with Tailwindcssexample
    A page causing an internal errorexample
    Page which raises HTTPexample
    Page with a redirectexample
    Page with parametersexample
    Page with query stringexample
    Page with a postbackexample
    Fixtures: Flash
    A page with a flash (clientside only)example
    A page with a flash (with redirect and fixture)example
    Fixtures: Session
    A page with a counterexample
    Helpers
    A page using yatl helpersexample
    Services
    Generic REST APIexample
    Json RPC Client/Serverexample
    Internationalization and Pluralization
    A page using internationalization (try set browser to italian)example
    A page using pluralization (try set browser to italian)example
    Components
    A page embedding a py4web component via ajax (no Vue)example
    Forms
    A page with a create formexample
    A page with an update formexample
    A page with mutiple formsexample
    A page with a custom styled formexample
    A form with tags_input widgetexample
    A page with form using hCaptchaexample
    Grid (no vue.js)
    A page with an serverside pure html gridexample
    Grid (requires Vue.js)
    A page with an ajax powered gridexample
    A page embedding multiple auth formsexample
    Examples of custom Vue components (advanced)
    Sample Vue.js client-side grid.example
    Javascript file uploader.example
    Insertion form in Vue.example
    Update form in Vue.example
    View form in Vue.example
    Grid + Forms in Vue.example
    Star rating component in Vue; example of component instantiation from Vue.example
    Websockets Examples
    A page using websocketsws
    A page using websockets with socketiosocketio
    +
    diff --git a/apps/examples/templates/layout.html b/apps/showcase/templates/layout.html similarity index 95% rename from apps/examples/templates/layout.html rename to apps/showcase/templates/layout.html index 8d987c964..1a9105a83 100644 --- a/apps/examples/templates/layout.html +++ b/apps/showcase/templates/layout.html @@ -6,8 +6,9 @@ - + [[block page_head]][[end]] +
    @@ -15,7 +16,7 @@

    - - + diff --git a/default.nix b/default.nix new file mode 100644 index 000000000..602f5267d --- /dev/null +++ b/default.nix @@ -0,0 +1,57 @@ +let + nixpkgs-src = builtins.fetchTarball { + url = "https://github.com/NixOS/nixpkgs/tarball/nixos-24.11"; + }; + + pkgs = import nixpkgs-src {}; + + # This is the Python version that will be used. + myPython = pkgs.python311; + + pythonWithPkgs = myPython.withPackages (pythonPkgs: with pythonPkgs; [ + pip + setuptools + wheel + twine + black + isort + pytest + ]); + + lib-path = with pkgs; lib.makeLibraryPath [ + libffi + openssl + ]; + + shell = pkgs.mkShell { + buildInputs = [ + pythonWithPkgs + pkgs.zip + pkgs.memcached + pkgs.redis + pkgs.readline + pkgs.libffi + pkgs.openssl + pkgs.cmake + ]; + + shellHook = '' + # Allow the use of wheels. + SOURCE_DATE_EPOCH=$(date +%s) + VENV_PATH=/home/$USER/.venvs$(pwd)/venv${myPython.version} + # Augment the dynamic linker path + export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${lib-path}" + + # Setup the virtual environment if it doesn't already exist. + if test ! -d $VENV_PATH; then + python -m venv $VENV_PATH + fi + $VENV_PATH/bin/pip install -U -r requirements.txt + source $VENV_PATH/bin/activate + export LOCALE_ARCHIVE=/usr/lib/locale/locale-archive + export PYTHONPATH=$VENV_PATH/${myPython.sitePackages}/:$PYTHONPATH + ''; + }; +in + +shell \ No newline at end of file diff --git a/deployment_tools/docker/Dockerfile b/deployment_tools/docker/Dockerfile index b66a8efc8..95d8b8068 100644 --- a/deployment_tools/docker/Dockerfile +++ b/deployment_tools/docker/Dockerfile @@ -1,30 +1,21 @@ -# please change : -# password.txt with your desire filename -# password_admin with your desire password admin -# 8000 with your available port - FROM ubuntu:latest ARG user=py4web -ARG password=none - -RUN apt update && apt install -y git python3 python3-pip memcached - -RUN service memcached restart - -RUN groupadd -r $user && useradd -m -r -g $user $user -RUN python3 -m pip install -U py4web +RUN apt update && \ + apt install -y git python3 python3-pip python3-venv memcached && \ + service memcached restart && \ + groupadd -r $user && \ + useradd -m -r -g $user $user USER $user +WORKDIR /home/$user/ -RUN cd /home/$user/ && py4web setup --yes apps - -RUN cd /home/$user/ && \ - if [ "$password" = "none" ]; then echo "no admin"; else py4web set_password < "$password"; fi +RUN python3 -m venv venv && \ + . venv/bin/activate && \ + pip install -U py4web && \ + py4web setup --yes apps EXPOSE 8000 -WORKDIR /home/$user/ - -CMD py4web run --password_file password.txt --host 0.0.0.0 --port 8000 apps +CMD . venv/bin/activate && py4web run --password_file password.txt --host 0.0.0.0 --port 8000 apps diff --git a/deployment_tools/docker/Makefile b/deployment_tools/docker/Makefile index e2a0f6a29..fd5e33303 100644 --- a/deployment_tools/docker/Makefile +++ b/deployment_tools/docker/Makefile @@ -1,9 +1,21 @@ # https://codeblog.dotsandbrackets.com/quick-intro-to-docker-compose/ -up: - docker-compose up -d -rebuild: - docker-compose up --build --force-recreate postgres web -down: - docker-compose down -ssh: - docker-compose exec web bash + + +DOCKER_COMPOSE=docker-compose +#DOCKER_COMPOSE=docker compose +# On latest docker version, use 'docker compose' + +up: ## Start all containers in foreground + @$(DOCKER_COMPOSE) up -d + +down: ## Stop all containers + @$(DOCKER_COMPOSE) down + +restart: ## Restart all containers in foreground + @$(DOCKER_COMPOSE) restart -d + +rebuild: ## Force rebuild of all containers + @$(DOCKER_COMPOSE) up --build --force-recreate postgres web + +ssh: ## Interactive run + @$(DOCKER_COMPOSE) exec web bash diff --git a/deployment_tools/docker/README.md b/deployment_tools/docker/README.md new file mode 100644 index 000000000..ce117bcdf --- /dev/null +++ b/deployment_tools/docker/README.md @@ -0,0 +1,182 @@ +# Using py4web with Docker + +## Purpose + +- assuming you already know Docker, this is an easy way to install py4web +- you'll quickly obtain a totally isolated enviroment + +Note that the latest program versions will be used, for increased security. If +you instead want to reproduce this exact environment on other systems, +you'll need to specify the version of all the components. + + +## Basic py4web container + +You need a working Docker system, see the official site for installation info +at https://docs.docker.com/get-docker/ +Download the four files on top of this page to an empty directory on your system. If you download them with chrome based browser there is a big chance you need to remove the .txt part from the file names due to this bug: https://github.com/microsoft/vscode/issues/118436 + +Then run: + + # build an image called py4web from latest Ubuntu + $ docker build . -t py4web + # build & run a container called mypy4web + $ docker run -d --name mypy4web -p 8000:8000 py4web + +You'll obtain the standard py4web app running with the Rocket web server and +listening on http://localhost:8000 + +Optional: + + # this is needed for providing a password in order to use the Dashboard + $ docker exec -it mypy4web py4web set_password + # then restart the container + $ docker restart mypy4web + +## Advanced py4web container with PostgreSQL + +In this case you will also need the optional +docker-compose program (V2 is the new one, but +unfortunately they changed the program name from 'docker-compose' to 'docker compose'). + +For Linux/Mac, modify the Makefile file if needed and then run it: + + $ make up + +For Windows without the make utility, or if you prefer not to use the Makefile, you can +use directly the command: + + $ docker-compose up -d + +or + + $ docker compose up -d + +You'll still need to set the dashboard password: + + $ docker exec -it py4web-web-1 py4web set_password + + + +## Working with the container + +- You can easily setup a free temporary working container online at https://labs.play-with-docker.com/ +- Using a modern IDE, you can also directly edit the files inside the containers - and even debug them! + + +## Combining py4web with Celery and Redis + +Celery can be used for handling long running background tasks. +Celery uses Redis as broker. Redis will be run in a seperate container. + +At the end of the docker-compose file add: + + redis: + restart: always + image: redis + ports: + - "6379:6379" + +In the app (based on _scaffold) settings.py: + + #Celery settings + USE_CELERY = True + CELERY_BROKER = "redis://redis:6379/0" + CELERY_BACKEND = "redis://redis:6379/0" + +In common.py: + + # ####################################################### + # Optionally configure celery + # ####################################################### + if settings.USE_CELERY: + from celery import Celery + + # to use "from .common import scheduler" and then use it according + # to celery docs, examples in tasks.py + scheduler = Celery( + "apps.%s.tasks" % settings.APP_NAME, broker=settings.CELERY_BROKER, backend=settings.CELERY_BACKEND) + scheduler.conf.broker_connection_retry_on_startup = True + +In the docker file use entrypoint.sh to get the scheduler going and start py4web. + + entrypoint.sh: + + #!/bin/bash + . /home/py4web/.venv/bin/activate + exec .venv/bin/celery -A apps.myapp.tasks beat & + exec .venv/bin/celery -A apps.myapp.tasks worker --loglevel=info & + exec py4web run --password_file password.txt --host 0.0.0.0 --port 8000 apps + +complete Dockerfile: + + FROM ubuntu:latest + + ARG user=py4web + ENV PY4WEB_ROOT=/home/$user + + RUN apt update && \ + apt install -y git locales locales-all python3.12 python3-pip python3.12-venv memcached && \ + service memcached restart && \ + groupadd -r $user && \ + useradd -m -r -g $user $user && \ + python3 -m venv $PY4WEB_ROOT/.venv && \ + . $PY4WEB_ROOT/.venv/bin/activate && \ + python3 -m pip install -U py4web psycopg2-binary && \ + python3 -m pip install -U "celery[redis]" + + ENV LC_ALL en_US.UTF-8 + ENV LANG en_US.UTF-8 + ENV LANGUAGE en_US.UTF-8 + + USER $user + + RUN . $PY4WEB_ROOT/.venv/bin/activate && \ + cd $PY4WEB_ROOT/ && py4web setup --yes apps + # use ./venv/bin/py4web set_password + COPY password.txt $PY4WEB_ROOT/. + + EXPOSE 8000 + + WORKDIR $PY4WEB_ROOT/ + COPY entrypoint.sh /usr/local/bin/ + ENTRYPOINT [ "entrypoint.sh" ] + +docker-compose.yml + + services: + + web: + build: . + ports: + - "8000:8000" + environment: + - PYDAL_URI=postgres://foo:bar@postgres:5432/baz + - PYDAL_URI2=mysql://root:secret@localhost/ursadina_gtd + volumes: + - ./apps:/home/py4web/apps + stdin_open: true + tty: true + depends_on: + - postgres + - redis + + postgres: + restart: always + image: postgres + environment: + - POSTGRES_USER=foo + - POSTGRES_PASSWORD=bar + - POSTGRES_DB=baz + - POSTGRES_PORT=5432 + ports: + - "5432:5432" + volumes: + - ./data/postgres:/var/lib/postgresql/data + redis: + restart: always + image: redis + ports: + - "6379:6379" + + diff --git a/deployment_tools/gae/Makefile b/deployment_tools/gae/Makefile index e3721f064..4320f19c1 100644 --- a/deployment_tools/gae/Makefile +++ b/deployment_tools/gae/Makefile @@ -4,18 +4,9 @@ install-gcloud-linux: upgrade-gcloud: gcloud components update setup: - mkdir -p lib - rm -rf lib/* - # - cat ../../requirements.txt \ - | grep -v gevent \ - | grep -v tornado \ - | grep -v gunicorn \ - | grep -v memcache > requirements.txt - echo mysqlclient >> requirements.txt - mkdir -p lib - # python3 -m pip install -U --no-deps py4web -t lib/ - cp -r ../../py4web lib/ + mkdir -p apps + echo "" > apps/__init__.py + echo "copy the apps you want to deploy under the new app" deploy: gcloud config set account ${email} gcloud config set project ${project} diff --git a/deployment_tools/gae/README.md b/deployment_tools/gae/README.md index ab116ce2f..e7cc07460 100644 --- a/deployment_tools/gae/README.md +++ b/deployment_tools/gae/README.md @@ -1,24 +1,28 @@ # To deploy code on Google App Engine: +## Setup your deployment folder + ``` -cd deployment_tools/gae +mkdir my-py4web-gae +cp -r /path/to/py4web/deployment_tools/gae/* my-py4web-gae +cd my-py4web-gae +make install-gcloud-linux +make upgrade-gcloud make setup -mkdir apps -touch apps/__init__.py -# symlink the apps that you want to deploy to GAE, for example: -cd apps -ln -s ../../../apps/_default . -ln -s ../../../apps/.service . -cd .. +# copy the apps that you want to deploy to GAE, for example: +cp -r /path/to/py4web/apps/_default apps/_default +(cp -r /path/to/py4web/apps/myapp apps/myapp) +# you may need to to symlink or copy the service folder (optional) +cp -r /path/to/py4web/apps/.service apps/ ``` -Then, you can either do: +## Deploy from the deployment folder ``` make deploy email={your email} project={your project} version={vesion} ``` -or if you have a gcloud configuration already configured, +If you have a gcloud configuration already set you can just do ``` gcloud app deploy diff --git a/deployment_tools/gae/app.yaml b/deployment_tools/gae/app.yaml index e9677ce82..f7ca4c66e 100644 --- a/deployment_tools/gae/app.yaml +++ b/deployment_tools/gae/app.yaml @@ -1,4 +1,4 @@ -runtime: python37 +runtime: python311 # Handlers define how to route requests to your application. handlers: diff --git a/deployment_tools/gae/main.py b/deployment_tools/gae/main.py index a9b53dfd3..d15f2c945 100644 --- a/deployment_tools/gae/main.py +++ b/deployment_tools/gae/main.py @@ -1,11 +1,16 @@ import os import site -site.addsitedir(os.path.join(os.path.dirname(__file__), 'lib')) -from py4web.core import Reloader, bottle, Session -os.environ['PY4WEB_DASHBOARD_MODE'] = 'demo' -os.environ['PY4WEB_SERVICE_DB_URI'] = 'sqlite:memory' -os.environ['PY4WEB_APPS_FOLDER'] = os.path.join(os.path.dirname(__file__), 'apps') -os.environ['PY4WEB_SERVICE_FOLDER'] = os.path.join(os.path.dirname(__file__), 'apps/.service') -Session.SECRET = open(os.path.join(os.path.dirname(__file__), 'apps/.service/session.secret'), 'rb').read() +import uuid + +site.addsitedir(os.path.join(os.path.dirname(__file__), "lib")) +from py4web.core import Reloader, Session, bottle + +os.environ["PY4WEB_DASHBOARD_MODE"] = "none" +os.environ["PY4WEB_SERVICE_DB_URI"] = "sqlite:memory" +os.environ["PY4WEB_APPS_FOLDER"] = os.path.join(os.path.dirname(__file__), "apps") +os.environ["PY4WEB_SERVICE_FOLDER"] = os.path.join( + os.path.dirname(__file__), "apps/.service" +) +Session.SECRET = str(uuid.uuid4()) Reloader.import_apps() app = bottle.default_app() diff --git a/deployment_tools/gae/requirements.in b/deployment_tools/gae/requirements.in deleted file mode 100644 index 4602c3cc2..000000000 --- a/deployment_tools/gae/requirements.in +++ /dev/null @@ -1 +0,0 @@ -py4web diff --git a/deployment_tools/pythonanywhere.com/bottle_app.py b/deployment_tools/pythonanywhere.com/bottle_app.py index 642d74f25..66e568082 100644 --- a/deployment_tools/pythonanywhere.com/bottle_app.py +++ b/deployment_tools/pythonanywhere.com/bottle_app.py @@ -1,16 +1,20 @@ """ Documented here: https://youtu.be/Wxjl_vkLAEY """ + import os + from py4web.core import wsgi # BEGIN CONFIGURATION -PASSWORD_FILENAME = 'password.txt' -DASHBOARD_MODE = 'full' or 'demo' or 'none' -APPS_FOLDER = 'mysite/apps' +PASSWORD_FILENAME = "password.txt" +DASHBOARD_MODE = "full" or "demo" or "none" +APPS_FOLDER = "mysite/apps" # END CONFIGURATION -password_file = os.path.abspath(os.path.join(os.path.dirname(__file__), PASSWORD_FILENAME)) -application = wsgi(password_file=password_file, - dashboard_mode=DASHBOARD_MODE, - apps_folder=APPS_FOLDER) +password_file = os.path.abspath( + os.path.join(os.path.dirname(__file__), PASSWORD_FILENAME) +) +application = wsgi( + password_file=password_file, dashboard_mode=DASHBOARD_MODE, apps_folder=APPS_FOLDER +) diff --git a/deployment_tools/ubuntu/machine-setup.sh b/deployment_tools/ubuntu/machine-setup.sh index d822179ac..def1d650d 100755 --- a/deployment_tools/ubuntu/machine-setup.sh +++ b/deployment_tools/ubuntu/machine-setup.sh @@ -1,81 +1,133 @@ #!/bin/bash -echo "=======================================" -echo "Configuring IPv6 firewall" -echo "=======================================" -ip6tables -P INPUT DROP -ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT +# + +# ======================================================================== +# machine-setup.sh +# +# installation script for py4web on Ubuntu server +# see https://github.com/web2py/py4web/blob/master/docs/updateDocs.sh +# +# tested with Ubuntu Server 22.04 LTS +# +# Usage: +# copy and run it in any directory with 'sudo ./machine-setup.sh' +# +# ======================================================================== + +# Parameters: + +# python_bin is used to state your python version +# by default python_bin=python3.10 +python_bin=python3.10 + +# use_iptables is set to yes if +# you want to setup linux firewall from scratch +# allowing only ssh and http/https +use_iptables=yes + +if [ "$EUID" -ne 0 ] 2>/dev/null + then echo "Please run as root or with sudo" + exit +fi + +# iptables persistent configuration in Ubuntu >= 10.04 and Debian >= 6.0 +if [ $use_iptables = 'yes' ] +then + echo "=======================================" + echo "Configuring iptables firewall" + echo "=======================================" -echo "Starting IPv4 firewall" -iptables -F -iptables -X -iptables -t nat -F -iptables -t nat -X -iptables -t mangle -F -iptables -t mangle -X - -#unlimited -iptables -A INPUT -i lo -j ACCEPT -iptables -A OUTPUT -o lo -j ACCEPT - -# DROP all incomming traffic -iptables -P INPUT DROP -iptables -P OUTPUT DROP -iptables -P FORWARD DROP - -# Block sync -iptables -A INPUT -p tcp ! --syn -m state --state NEW -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Drop Sync" -iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP - -# Block Fragments -iptables -A INPUT -f -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fragments Packets" -iptables -A INPUT -f -j DROP - -# Block bad stuff -iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP -iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP - -iptables -A INPUT -p tcp --tcp-flags ALL NONE -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "NULL Packets" -iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # NULL packets - -iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP - -iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "XMAS Packets" -iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP #XMAS - -iptables -A INPUT -p tcp --tcp-flags FIN,ACK FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fin Packets Scan" -iptables -A INPUT -p tcp --tcp-flags FIN,ACK FIN -j DROP # FIN packet scans - -iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP - -# Allow full outgoing connection but no incomming stuff -iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT -iptables -A OUTPUT -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT - -# Allow ssh -iptables -A INPUT -p tcp --destination-port 22 -j ACCEPT - -# allow incomming ICMP ping pong stuff -iptables -A INPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT -iptables -A OUTPUT -p icmp --icmp-type 0 -m state --state ESTABLISHED,RELATED -j ACCEPT - -# Allow port 53 tcp/udp (DNS Server) -iptables -A INPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT -iptables -A OUTPUT -p udp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT - -iptables -A INPUT -p tcp --destination-port 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT -iptables -A OUTPUT -p tcp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT - -# Open port 80 -iptables -A INPUT -p tcp --destination-port 80 -j ACCEPT -iptables -A INPUT -p tcp --destination-port 443 -j ACCEPT -##### Add your rules below ###### - -##### END your rules ############ + cat > iptables-py4web.sh < /etc/iptables/rules.v4' + sudo bash -c 'ip6tables-save > /etc/iptables/rules.v6' + + +else + echo Skipping iptables +fi echo "=======================================" echo "Installing Packages" @@ -90,48 +142,48 @@ apt-get -y install sendmail apt-get -y install fail2ban apt-get -y install supervisor apt-get -y install nginx -apt-get -y install python3.7 -apt-get -y install python3.7-pip -apt-get -y install python3.7-dev +apt-get -y install ${python_bin} +apt-get -y install python3-pip +apt-get -y install ${python_bin}-dev apt-get -y install postgresql-client apt-get -y install postgresql-client-common apt-get -y install sendmail apt-get -y install redis-server + echo "=======================================" echo "Installing Python Packages for py4web" +echo "entf server: tornado, gevent, gunicorn" echo "=======================================" cat > requirements-py4web.txt < py4web.key + # pushd and popd do not work with sudo because it uses sh shell + oldpath=`pwd` + cd /etc/nginx/ssl + # a 2048 bit key is needed nowadays + openssl genrsa 2048 > py4web.key chmod 400 py4web.key openssl req -new -x509 -nodes -sha1 -days 1780 -key py4web.key > py4web.crt openssl x509 -noout -fingerprint -text < py4web.crt > py4web.info - popd + cd $oldpath fi if [ ! -f /etc/init.d/py4web ] @@ -217,7 +272,7 @@ LOGFILE="/var/log/${NAME}.log" DAEMON="/usr/local/bin/py4web" DAEMON_OPTS="run --password_file /home/www-data/py4web/password.txt /home/www-data/py4web/apps" START_OPTS="--start --background --make-pidfile --pidfile ${PIDFILE} --exec ${DAEMON} -- ${DAEMON_OPTS}" -STOP_OPTS="--stop --pidfile ${PIDFILE}" +STOP_OPTS="--stop --oknodo --pidfile ${PIDFILE}" test -x $DAEMON || exit 0 set -e @@ -239,7 +294,6 @@ restart|force-reload) start-stop-daemon $STOP_OPTS sleep 1 start-stop-daemon $START_OPTS >> $LOGFILE - echo "$NAME." ;; *) N=/etc/init.d/$NAME @@ -252,6 +306,8 @@ exit 0 fi +chmod +x /etc/init.d/py4web +echo Enter the password for py4web Dashboard: py4web set_password --password_file=/home/www-data/py4web/password.txt /etc/init.d/py4web restart /etc/init.d/nginx restart diff --git a/docs/README.md b/docs/README.md index 14633ddb6..fedf17010 100644 --- a/docs/README.md +++ b/docs/README.md @@ -52,22 +52,22 @@ The current official translators are listed here: If your language does not still exist in the documentation, for example the Italian one, you need to build its PO files. Setup a working environment as described before for updatDocs.sh, go to the /docs folder and run: - +``` make gettext sphinx-intl update -p _build/gettext -l it +``` +(where 'it' is the language code for Italian). +This will create the PO files to be translated in `/docs/locales/it/LC_MESSAGES` -(where 'it' is the language code for Italian). -This will create the PO files to be translated in /docs/locales/it/LC_MESSAGES - -After their translation, make a PR for them. If you want, you can also generate the local HTML outputs as usual with the updateDocs.sh program. +After their translation, make a PR for them. If you want, you can also generate the local HTML outputs as usual with the `updateDocs.sh` program. ## Update translation When the english source files will be updated, the translated work will not be lost - but the new strings will appear inside your translated ones. In order import the updated sources without loosing your previous work, you need to run: - +``` sphinx-build -b gettext . _build/gettext - +``` This creates the updates .pot files on /docs/_build/gettext. With poedit you have to load the old translated .po file in your language. Then you use the menu "Catalog" -> "Update from POT file ..." in order to collect the updates from the .pot file. The new additions / changes will be loaded and marked to be fixed. You can now save the updated PO file and work on it. diff --git a/docs/chapter-01.rst b/docs/chapter-01.rst index 3dbcef08d..993c66efd 100644 --- a/docs/chapter-01.rst +++ b/docs/chapter-01.rst @@ -52,8 +52,10 @@ details if you come from web2py): now exclusively on the regular Python import mechanism. - PY4WEB, like web2py, can serve multiple applications concurrently, as long as the apps are submodules of the apps module. -- PY4WEB, unlike web2py, is based on bottlepy and in particular uses - the Bottle request object and the Bottle routing mechanism. +- PY4WEB, unlike web2py, is based on ombott + (a reduced and faster spin-off of Bottle) and in particular uses + a Bottle-compatible request object and routing mechanism. + - PY4WEB, unlike web2py, does not create a new environment at every request. It introduces the concept of fixtures to explicitly declare which objects need to be (re)initialized when a new http request arrives diff --git a/docs/chapter-02.rst b/docs/chapter-02.rst index 7ba54b145..3f6987a01 100644 --- a/docs/chapter-02.rst +++ b/docs/chapter-02.rst @@ -4,7 +4,8 @@ Help, resources and hints We've made our best to make PY4WEB simple and clean. But you know, modern web programming is a daunting task. It requires an open mind, able to jump frequently (without being lost!) from python to HTML to javascript to css and even database management. -But don't be scared, in this manual we'll assist you side by side in this journey. And there are many other valuable resources that we're going to show you. +But don't be scared, in this manual we'll assist you side by side in this journey. And there are many other valuable resources that we're going to show +you. Resources @@ -13,25 +14,22 @@ Resources This manual ----------- -This manual is the Reference Manual for py4web. It's available online at https://py4web.com/_documentation/static/index.html, where you'll also find the PDF and EBOOK version, in multiple languages. It written in RestructuredText and generated using Sphinx. +This manual is the Reference Manual for py4web. It's available online at https://py4web.com/_documentation/static/index.html, where you'll also find the +PDF and EBOOK version, in multiple languages. It written in RestructuredText and generated using Sphinx. The Google group ---------------- -There is a dedicated mailing list hosted on Google Groups, see https://groups.google.com/g/py4web. This is the main source of discussions for developers and simple users. For any problem you should face, this is the right place to search for a hint or a solution. +There is a dedicated mailing list hosted on Google Groups, see https://groups.google.com/g/py4web. This is the main source of discussions for developers +and simple users. For any problem you should face, this is the right place to search for a hint or a solution. -The chat on IRC ---------------- - -We also use to chat sometime on IRC (Internet Relay Chat, which is an old-style text only chat). You can freely join us at https://webchat.freenode.net/#py4web. -From time to time we also use it to host a scheduled public chat, where you can write and read live questions to developers. -Transcripts of them are then available on the mailing list. The Discord server ------------------- -For quick questions and chats you can also use the free `Discord server dedicated to py4web `__. You could usually find many py4web developers hanging out in the channel. +For quick questions and chats you can also use the free `Discord server dedicated to py4web `__. You could usually find +many py4web developers hanging out in the channel. Tutorials and video @@ -40,16 +38,19 @@ Tutorials and video There are many tutorials and videos available. Here are some of them: - the `Learn Py4Web site `__ by Luca de Alfaro (with lots of excellent training videos) -- the free video `course 2020 by Luca de Alfaro `__ at UC Santa Cruz -- the `py4web blog app `__ by Andrew Gavgavian, which uses py4web to replicate the famous Corey Schafer's tutorial series on creating a blog app in Django -- the `South Breeze Enterprises demo app `__ by `Jim Steil `__. It is built around the structure of the Microsoft Northwind database, +- the free video `course 2020 by Luca de Alfaro `__ + at UC Santa Cruz +- the `py4web blog app `__ by Andrew Gavgavian, which uses py4web to replicate the famous Corey + Schafer's tutorial series on creating a blog app in Django +- the `South Breeze Enterprises demo app `__ by `Jim Steil `__. It is built around + the structure of the Microsoft Northwind database, but converted to SQLite. You can view the final result online `here `__ The sources on GitHub --------------------- -Last but not least, py4web is Open Source, with a BSD v3 license, hosted on GitHub at https://github.com/web2py/py4web. This means that you can read, study and experiment -with all of its internal details by yourself. +Last but not least, py4web is Open Source, with a BSD v3 license, hosted on GitHub at https://github.com/web2py/py4web. This means that you can read, +study and experiment with all of its internal details by yourself. Hints and tips @@ -61,21 +62,22 @@ This paragraph is dedicated to preliminary hints, suggestions and tips that coul Prerequisites ------------- -In order to understand py4web you need at least a basic python knowledge. There are many books, courses and tutorials available on the web - choose what's best for you. -The python's decorators, in particular, are a milestone of any python web framework and you have to fully understand it. +In order to understand py4web you need at least a basic python knowledge. There are many books, courses and tutorials available on the web - choose +what's best for you. The python's decorators, in particular, are a milestone of any python web framework and you have to fully understand it. A modern python workplace ------------------------- -In the following chapters you will start coding on your computer. We suggest you to setup a modern python workplace if you plan to do it efficiently and safely. -Even for running simple examples and experimenting a little, we strongly suggest to use an **Integrated Development Environment** (IDE). This will make your programming experience much better, allowing syntax checking, linting and visual debugging. +In the following chapters you will start coding on your computer. We suggest you to setup a modern python workplace if you plan to do it efficiently +and safely. Even for running simple examples and experimenting a little, we strongly suggest to use an **Integrated Development Environment** (IDE). +This will make your programming experience much better, allowing syntax checking, linting and visual debugging. Nowadays there are two free and multi-platform main choices: Microsoft Visual Studio Code aka `VScode `__ and JetBrains `PyCharm `__. When you'll start to deal with more complex programs and need reliability, we also suggest to: -- use virtual environments (also called **virtualenv**, see +- use virtual environments (also called **virtualenv**\, see `here `__ for an introduction). In a complex workplace this will avoid to be messed up with other python programs and modules @@ -88,36 +90,36 @@ we also suggest to: Debugging py4web with VScode ---------------------------- -It's quite simple to run and debug py4web within VScode if you have installed from source. You just need to open the main py4web folder (not the apps folder!) with VScode and add: +It's quite simple to run and debug py4web within VScode. + +If you have **installed py4web from source**, you just need to open the main py4web folder (not the apps folder!) with VScode and add: :: "args": ["run", "apps"], "program": "your_full_path_to_py4web.py", -to the vscode ``launch.json`` configuration file. Note that if you're using Windows the "your_full_path_to_py4web.py" parameter must be written using forward slash only, like +to the vscode ``launch.json`` configuration file. Note that if you're using Windows the "your_full_path_to_py4web.py" parameter must be written using +forward slash only, like "C:/Users/your_name/py4web/py4web.py". -If you have installed py4web from pip, you have instead to: - -- open the ``apps`` folder with VScode -- copy the standard `py4web.py launcher `__ inside it, but rename it to ``py4web-start.py`` in order to avoid import - errors later: +If you have instead **installed py4web from pip,** you need to set the launch.json file to run py4web as a module -.. code:: python - - #!/usr/bin/env python3 - from py4web.core import cli - cli() +:: -- create / change the vscode ``launch.json`` configuration file: + { + "name": "py4web apps", + "type": "debugpy", + "request": "launch", + "module": "py4web", + "args": ["run", "apps", "-D", "--watch", "lazy"] + } -:: +Adjust the `args` to match your apps folder. For example, replace `apps` with `.` if you opened the apps folder itself in VSCode. - "args": ["run", "."], - "program": "your_full_path_to_py4web-start.py", +.. tip:: -In both cases, if you should get gevent errors you have to also add ``"gevent": true`` on the ``launch.json`` configuration file. + In both cases, if you should get gevent errors you have to also add ``"gevent": true`` on the ``launch.json`` configuration file. Debugging py4web with PyCharm @@ -129,13 +131,14 @@ In PyCharm, if you should get gevent errors you need to enable Settings | Build, How to contribute ================= -We need help from everyone: support our efforts! You can just participate in the Google group trying to answer other's questions, submit bugs using or create pull requests on the GitHub -repository. +We need help from everyone: support our efforts! You can just participate in the Google group trying to answer other's questions, submit bugs using or +create pull requests on the GitHub repository. -If you wish to correct and expand this manual, or even translate it in a new foreign language, you can read all the needed information directly on the -`specific README `__ on GitHub. +If you wish to correct and expand this manual, or even translate it in a new foreign language, you can read all the needed information directly on +the `specific README `__ on GitHub. It's really simple! Just change the .RST files in the /doc folder and create a Pull Request on the GitHub repository at https://github.com/web2py/py4web - you can even do it within your browser. -Once the PR is accepted, your changes will be written on the master branch, and will be reflected on the web pages / pdf / epub at the next output generation on the branch. +Once the PR is accepted, your changes will be written on the master branch, and will be reflected on the web pages / pdf / epub at the next output +generation on the branch. diff --git a/docs/chapter-03.rst b/docs/chapter-03.rst index 4596a8ca0..fd04649e8 100644 --- a/docs/chapter-03.rst +++ b/docs/chapter-03.rst @@ -7,10 +7,10 @@ Understanding the design Before everything else it is important to understand that unlike other web frameworks, is not only a python module that can be imported by apps. It is also a program that -is in charge of starting a apps. For this reason you need two things: +is in charge of starting some apps. For this reason you need two things: -- the py4web module (which you download from our web site, from pypi, from github) -- one or more folders containing collections of apps you want to run. +- The py4web module (which you download from our web site, from pypi or from github) +- One or more folders containing collections of apps you want to run. py4web has command line options to create a folder with some example apps, to initialize an existing folder, and to add scaffolding apps to that folder. @@ -21,48 +21,69 @@ An apps folder is a python module, and each app is also a python module. Supported platforms and prerequisites ------------------------------------- -PY4WEB runs fine on Windows, MacOS and Linux. Its only prerequisite is +py4web runs fine on Windows, MacOS and Linux. Its only prerequisite is Python 3.7+, which must be installed in advance (except if you use binaries). Setup procedures ---------------- -There are four alternative ways of running py4web, with different level -of difficulty and flexibility. Let’s look at the pros and cons. +There are four alternative ways of installing py4web, we will guide +you through each of them and if you get stuck, reach +`out to us. `__ -Installing from binaries -~~~~~~~~~~~~~~~~~~~~~~~~ -This is not a real installation, because you just copy a bunch of files -on your system without modifying it anyhow. Hence this is the simplest -solution, especially for newbies or students, because it does not -require Python pre-installed on your system nor administrative rights. -On the other hand, it’s experimental, it could contain an old py4web -release and it is quite difficult to add other functionalities to it. +Installing from pip, using a virtual environment +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In order to use it you just need to download the latest Windows or MacOS -ZIP file from -`this external repository `__. -Unzip it on a local folder and open a command line there. Finally run +A full installation of any complex python application like py4web will +surely modify the python environment of your system. In order to prevent +any unwanted change, it’s a good habit to use a python virtual +environment (also called **virtualenv**, see +`here `__ for an +introduction). This is a standard python feature; if you still don’t +know virtualenv it’s a good time to start its discovery! -:: +Here are the instructions for creating the virtual environment, activating it, +and installing py4web in it: - py4web-start set_password - py4web-start run apps +.. tabs:: -With this type of installation, remember to always use **py4web-start** -instead of ‘py4web’ or ‘py4web.py’ in the following documentation. + .. group-tab:: Linux and MacOS -Notice the binaries many not correspond to the latest master -or the latest stable branch of py4web although we do our best to -keep them up to date. + :: + + python3 -m venv venv + . venv/bin/activate + python -m pip install --upgrade py4web --no-cache-dir + python py4web setup apps + python py4web set_password + python py4web run apps + + Starting py4web is same with or without a virtual environment + python py4web run apps + .. group-tab:: Windows -Installing from pip -~~~~~~~~~~~~~~~~~~~ + :: -Using *pip* is the standard installation procedure for py4web, since it will + run cmd.exe + In e.g. folder c:\py4web + python3 -m venv venv + "C:\py4web\venv\Scripts\activate.bat" + python -m pip install --upgrade py4web --no-cache-dir + cd venv\scripts + py4web.exe setup apps + py4web.exe set_password + py4web.exe run apps + + You can also find power shell scripts in the same folder. Starting py4web is same with or without a virtual environment + python py4web run apps + +Installing from pip, without virtual environment +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +*pip* is the basic installation procedure for py4web, it will quickly install the latest stable release of py4web. From the command line @@ -87,29 +108,14 @@ on any given working folder with If the command py4web is not accepted, it means it’s not in the system’s path. On Windows, a special py4web.exe file (pointing to py4web.py) will be created by *pip* on the system’s path, but not if you type the -*–user* option by mistake. - -Installing using a virtual environment -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A full installation of any complex python application like py4web will -surely modify the python environment of your system. In order to prevent -any unwanted change, it’s a good habit to use a python virtual -environment (also called **virtualenv**, see -`here `__ for an -introduction). This is a standard python feature; if you still don’t -know virtualenv it’s a good time to start its discovery! - -Here are the instructions for creating the virtual environment, activating it, -and installing py4web in it: +*–user* option by mistake, then you can run the needed commands like this :: - python3 -m venv venv - . venv/bin/activate - python -m pip install --upgrade py4web --no-cache-dir + python3 py4web.py setup apps + python3 py4web.py set_password + python3 py4web.py run apps -The instructions for starting and running py4web are the same with or without a virtual environment. Installing from source (globally) @@ -128,6 +134,8 @@ folder make assets make test make install + py4web setup apps + py4web set_password py4web run apps Also notice that when installing in this way the content of @@ -169,7 +177,7 @@ Once installed, you should always start it from there with: ./py4web.py run apps If you have installed py4web both globally and locally, notice the - **./** ; it forces the run of the local folder’s py4web and not the + **./** ; it forces the run of the local folder's py4web and not the globally installed one. .. group-tab:: Windows @@ -185,7 +193,31 @@ Once installed, you should always start it from there with: But running .py files directly it’s not usual and you’ll need an explicit python3/python command. - +Installing from binaries +~~~~~~~~~~~~~~~~~~~~~~~~ + +This is not a real installation, because you just copy a bunch of files +on your system without modifying it anyhow. Hence this is the simplest +solution, especially for beginners or students, because it does not +require Python pre-installed on your system nor administrative rights. +On the other hand, it’s experimental, it could contain an old py4web +release, DAL support is limited and it is quite difficult to add other functionalities to it. + +In order to use it you just need to download the latest Windows or MacOS +ZIP file from +`this external repository `__. +Unzip it on a local folder and open a command line there. Finally run + +:: + + ./py4web set_password + ./py4web run apps + +(omit './' if you're using Windows). + +Notice: the binaries many not correspond to the latest master +or the latest stable branch of py4web although we do our best to +keep them up to date. Upgrading --------- @@ -204,7 +236,7 @@ If you installed py4web from pip you can simple upgrade it with :: - py4web setup apps + py4web setup in order to re-install them. This is a safety precaution, in case you made changes to those apps. @@ -219,10 +251,7 @@ First run Running py4web using any of the previous procedure should produce an output like this: - -:: - - py4web run apps + .. image:: images/first_run.png :class: with-shadow @@ -245,7 +274,7 @@ two apps in this folder: **Dashboard** (``_dashboard``) and **Default** to avoid conflicts with apps created by you. Once py4web is running you can access a specific app at the following -urls: +urls from the local machine: :: @@ -265,7 +294,7 @@ For all apps the trailing ``/index`` is also optional. .. warning:: For Windows: it could be that ``Ctrl-C`` does not work in order to stop py4web. - In this case, try with ``Ctrl-Break`` or ``Ctrl-Fn-Pause``. + In this case, try with ``Ctrl-Break`` or ``Ctrl-Fn-Pause``\. Command line options @@ -278,7 +307,6 @@ running it without any argument # py4web -.. FIXME: next image must be updated .. image:: images/command.png :class: with-shadow @@ -346,37 +374,55 @@ This currently gives an error on binaries installations and from source installa # py4web run -h Usage: py4web.py run [OPTIONS] APPS_FOLDER - Run all the applications on apps_folder + Run the applications on apps_folder Options: - -Y, --yes No prompt, assume yes to questions - [default: False] - - -H, --host TEXT Host name [default: 127.0.0.1] - -P, --port INTEGER Port number [default: 8000] - -p, --password_file TEXT File for the encrypted password [default: - password.txt] - - -s, --server [default|wsgiref|tornado|gunicorn|gevent|waitress| - geventWebSocketServer|wsgirefThreadingServer|rocketServer] - server to use [default: default] - -w, --number_workers INTEGER Number of workers [default: 0] - -d, --dashboard_mode TEXT Dashboard mode: demo, readonly, full, none - [default: full] - - --watch [off|sync|lazy] Watch python changes and reload apps - automatically, modes: off, sync, lazy - [default: lazy] - - --ssl_cert PATH SSL certificate file for HTTPS - --ssl_key PATH SSL key file for HTTPS - -help, -h, --help Show this message and exit. - + -Y, --yes No prompt, assume yes to questions + -H, --host TEXT Host listening IP [default: 127.0.0.1] + -P, --port INTEGER Port number [default: 8000] + -A, --app_names TEXT List of apps to run, comma separated (all if + omitted or empty) + -p, --password_file TEXT File for the encrypted password [default: + password.txt] + -Q, --quiet Suppress server output + -R, --routes Write apps routes to file + -s, --server [default|wsgiref|tornado|wsgiref+threaded|rocket|waitress|gunicorn|gevent|gunicorn+gevent|gevent+websockets] + Web server to use (unavailable: waitress, + gunicorn, gevent, gunicorn+gevent, + gevent+websockets) + -w, --number_workers INTEGER Number of workers [default: 0] + -d, --dashboard_mode TEXT Dashboard mode: demo, readonly, full, none + [default: full] + --watch [off|sync|lazy] Watch python changes and reload apps + automatically, modes: off, sync, lazy + [default: lazy] + --ssl_cert PATH SSL certificate file for HTTPS + --ssl_key PATH SSL key file for HTTPS + --errorlog TEXT Where to send error logs + (:stdout|:stderr|tickets_only|{filename}) + [default: :stderr] + -L, --logging_level INTEGER The log level (0 - 50) [default: 30 + (=WARNING)] + -D, --debug Debug switch + -U, --url_prefix TEXT Prefix to add to all URLs in and out + -m, --mode TEXT default or development [default: default] + -help, -h, --help Show this message and exit. + +The ``app_names`` option lets you filter which specific apps you want to serve (comma separated). If absent or empty +all the apps in the APPS_FOLDER will be run. + +By default (for security reasons) the py4web framework will listen only on 127.0.0.1, i.e. localhost. +If you need to reach it from other machines you must specify the host option, +like ``py4web run --host 0.0.0.0 apps``. + +The ``url_prefix`` option is useful for routing at the py4web level. It allows mapping to multiple versions of py4web +running on different ports as long as the url_prefix and port match the location. For example +``py4web run --url_prefix=/abracadabra --port 8000 apps``. By default py4web will automatically reload an application upon any changes to the python files of that application. The reloading will occur on any first incoming request to the application that has been changed (lazy-mode). If you prefer an immediate reloading (sync-mode), use -``py4web run --watch=sync``. For production servers, it's better to use ``py4web run --watch=off`` in order +``py4web run --watch sync``. For production servers, it's better to use ``py4web run --watch off`` in order to avoid unneded checks (but you will need to restart py4web for activating any change). @@ -385,7 +431,18 @@ to avoid unneded checks (but you will need to restart py4web for activating any ``/apps`` folder only. Any modifications to the standard py4web programs will always require a full restart of the framework. -The default web server used is currently Tornado, but you can change this behaviour with the ``server`` option. +The default web server used is currently rocketServer, but you can change this behaviour with the ``server`` option. +`Rocket3 `__ is the multi-threaded web server used by web2py stripped of all the +Python2 logic and dependencies. + +The logging_level values are defined in the **logging** standard python module. The default value is 30 (it corresponds +to WARNING). Other common values are 0 (NOTSET), 10 (DEBUG), 20 (INFO), 40 (ERROR) and 50 (CRITICAL). +Using them, you’re telling the library you want to handle all events from that level on up. + +The debug parameter automatically sets logging_level to 0 and logs all calls to fixture functions. It also logs when +a session is found, invalid, saved. + + .. _set_password command option: @@ -507,8 +564,48 @@ For example, inside a shell you can With the ``-all`` option you’ll get the version of all the available python modules, too. -Special deployments -------------------- + +Special installations +--------------------- + +There are special cases in which you cannot or don't want to use one of the generic installation +instructions we've already described. There is a special folder called ``deployment_tools`` in +the py4web repository that collects some special recipes. They are briefly described here, along +with some tips and tricks. + +HTTPS +~~~~~ + +To use https with the build-in web server (Rocket3) these are the steps: + +- Generate the localhost certificates. For example followed the instructions here: + + https://www.section.io/engineering-education/how-to-get-ssl-https-for-localhost/. + +- Restart your browser and browse securely to your web site. + +If you use VSCode to run py4web you may want to update the py4web launch.json file to contain: + +.. code:: json + + "configurations": [ + { + "name": "py4web", + "type": "debugpy", + "request": "launch", + "module": "py4web", + // or "program": "${workspaceFolder}/py4web.py", if you didn't install py4web as a package + "args": [ + "run", + "apps", + "--ssl_cert", "/path_to/localhost.crt", + "--ssl_key", "/path_to/localhost.key", + "--server", "rocketServer", + ] + } + ] + +Notice that /path_to/ should be the absolute path to the location of your certificate. WSGI @@ -535,8 +632,8 @@ and then start the application using cli: The wsgi function takes arguments with the same name as the command line arguments. -Deployment on GCloud (aka Google App Engine) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Deployment on GCloud (aka GAE - Google App Engine) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Login into the `Gcloud console `__ and create a new project. You will obtain a project id that looks like @@ -600,3 +697,20 @@ tutorial + +Note that you can use them also with Podman, which has the advantage of does not requiring sudo and does not +running any background daemon. + + +Deployment on Ubuntu +~~~~~~~~~~~~~~~~~~~~ + +On ``deployment_tools/ubuntu`` there is a bash script tested with Ubuntu Server 20.04.03 LTS. It uses nginx and self-signed +certificates. It optionally manage iptables, too. diff --git a/docs/chapter-04.rst b/docs/chapter-04.rst index 548f87268..64aec0a45 100644 --- a/docs/chapter-04.rst +++ b/docs/chapter-04.rst @@ -63,9 +63,10 @@ for the selected app. The “Files” tab allows you to browse the folder that contains the selected app and edit any file that comprises the app. If you edit a -file you must click on “Reload Apps” under the “Installed Applications” -tab for the change to take effect (except if you use *watch* with the -:ref:`run command option`). +file by default it will be automatically reloaded at its first usage +(unless you've changed the *watch* option with the :ref:`run command option`; +in this case you must click on “Reload Apps” under the “Installed Applications” +tab for the change to take effect). If an app fails to load, its corresponding button is displayed in red. Click on it to see the corresponding error. diff --git a/docs/chapter-05.rst b/docs/chapter-05.rst index 235c9733e..15e501922 100644 --- a/docs/chapter-05.rst +++ b/docs/chapter-05.rst @@ -1,6 +1,6 @@ -======================= -Creating your first app -======================= +=============== +Creating an app +=============== From scratch ------------ @@ -33,14 +33,15 @@ simple commands in order to create a new empty **myapp** app: If you now restart py4web or press the “Reload Apps” in the Dashboard, py4web will find this module, import it, and recognize it as an app, simply because of its location. -You can also run py4web in *watch* mode (see the :ref:`run command option`) for -automatic reloading of the apps whenever it changes, which is very useful in a development environment. -In this case, run py4web with a command like this: +By default py4web runs in *lazy watch* mode (see the :ref:`run command option`) +for automatic reloading of the apps whenever it changes, which is very useful +in a development environment. +In production or debugging environment, it's better to run py4web with a command like this: .. code:: bash - py4web run apps --watch sync + py4web run apps --watch off A py4web app is not required to do anything. It could just be a container for @@ -68,11 +69,14 @@ The newly created file will be accessible at Notice that ``static`` is a special path for py4web and only files under the ``static`` folder are served. -Important: internally py4web uses the bottle -`static_file `__ -method for serving static files, which means it supports streaming, -partial content, range requests, and if-modified-since. This is all -handled automatically based on the HTTP request headers. +.. important:: + + Internally py4web uses the + `ombott (One More BOTTle) web server `__, + which is a minimal and fast `bottlepy `__ spin-off. + It supports streaming, partial content, range requests, + and if-modified-since. This is all + handled automatically based on the HTTP request headers. Dynamic Web Pages ----------------- @@ -171,7 +175,7 @@ A route wildcard can be defined as - ```` or - ```` -And these are possible filters (only ``re:`` has a config): +And these are possible filters (only ``:re`` has a config): - ``:int`` matches (signed) digits and converts the value to integer. - ``:float`` similar to :int but for decimal numbers. @@ -183,6 +187,38 @@ And these are possible filters (only ``re:`` has a config): The pattern matching the wildcard is passed to the function under the specified variable ``name``. +Note that the routing is implemented in ombott as radix-tree hybrid +router. It is declaration-order-independent and it prioritizes static +route-fragment over dynamic one, since this is most expected behavior. + +This results in some constraints, such as one cannot have more than one +route that has dynamic fragment of different types (int, path) in the +same place.. Hence **something like this is incorrect** and will result +in errors: + +.. code:: python + + @action('color/') + def color(code): + return f'Color code: {code}' + + @action('color/') + def color(name): + return f'Color name: {name}' + +Instead, to accomplish a simmilar result, one needs to handle all the +logic in one action: + +.. code:: python + + @action('color/') + def color(color_identifier): + try: + msg = f'Color code: {int(color_identifier)}' + except: + msg = f'Color name: {color_identifier}' + return msg + Also, the action decorator takes an optional ``method`` argument that can be an HTTP method or a list of methods: @@ -204,7 +240,7 @@ From py4web you can import ``request`` @action('paint') def paint(): - if 'color' in request.query + if 'color' in request.query: return 'Painting in %s' % request.query.get('color') return 'You did not specify a color' @@ -217,7 +253,7 @@ This action can be accessed at: -Notice that the request object is a `Bottle request object `__. +Notice that the request object is equivalent to a `Bottle request object `__. with one additional attribute: :: @@ -312,38 +348,7 @@ create a new clone of it manually or using the Dashboard. Here is the tree structure of the ``_scaffold`` app: -:: - - ├── __init__.py # imports everything else - ├── common.py # defines useful objects - ├── controllers.py # your actions - ├── databases # your sqlite databases and metadata - │   └── README.md - ├── models.py # your pyDAL table model - ├── settings.py # any settings used by the app - ├── settings_private.py # (optional) settings that you want to keep private - ├── static # static files - │   ├── README.md - │   ├── components # py4web's vue auth component - │   │   ├── auth.html - │   │   └── auth.js - │   ├── css # CSS files, we ship bulma because it is JS agnostic - │   │   └── no.css # we used bulma.css in the past - │   ├── favicon.ico - │   └── js # JS files, we ship with these but you can replace them - │   ├── axios.min.js - │   ├── sugar.min.js - │   ├── utils.js - │   └── vue.min.js - ├── tasks.py - ├── templates # your templates go here - │   ├── README.md - │   ├── auth.html # the auth page for register/logic/etc (uses vue) - │   ├── generic.html # a general purpose template - │   ├── index.html - │   └── layout.html # a bulma layout example - └── translations # internationalization/pluralization files go here - └── it.json # py4web internationalization/pluralization files are in JSON, this is an italian example +.. image:: images/scaffold_tree.png The scaffold app contains an example of a more complex action: @@ -363,10 +368,10 @@ The scaffold app contains an example of a more complex action: Notice the following: -- ``request``, ``response``, ``abort`` are defined by Bottle -- ``redirect`` and ``URL`` are similar to their web2py counterparts +- ``request``, ``response``, ``abort`` are defined by ``ombott``. +- ``redirect`` and ``URL`` are similar to their web2py counterparts. - helpers (``A``, ``DIV``, ``SPAN``, ``IMG``, etc) must be imported - from ``yatl.helpers`` . They work pretty much as in web2py + from ``yatl.helpers`` . They work pretty much as in web2py. - ``db``, ``session``, ``T``, ``cache``, ``auth`` are Fixtures. They must be defined in ``common.py``. - ``@action.uses(auth.user)`` indicates that this action expects a @@ -395,8 +400,8 @@ a starting point for testing and even developing full features new apps. It's better not to work directly on it: always create new apps copying it. You can do it in two ways: -- using the command line: copy the whole apps/_dashboard folder to another one - (/apps/my_app for example). Then reload py4web and it will be automatically loaded. +- using the command line: copy the whole apps/_scaffold folder to another one + (apps/my_app for example). Then reload py4web and it will be automatically loaded. - using the Dashboard: select the button ``Create/Upload App`` under the "Installed Applications" upper section. Just give the new app a name and check that "Scaffold" is selected as the source. @@ -412,7 +417,7 @@ Watch for files change As described in the :ref:`run command option`, Py4web facilitates a development server’s setup by automatically reloads an app when its -Python source files change (if run with the ``--watch`` option). +Python source files change (by default). But in fact any other files inside an app can be watched by setting a handler function using the ``@app_watch_handler`` decorator. @@ -461,3 +466,86 @@ relative to an app. Python files (i.e. "\*.py") in a list passed to the decorator are ignored since they are watched by default. Handler function’s parameter is a list of filepaths that were changed. All exceptions inside handlers are printed in terminal. + +Domain-mapped apps +------------------ + +In production environments it is often required to have several apps being +served by a single py4web server, where different apps are mapped to +different domains. + +py4web can easily handle running multiple apps, but there is no build-in +mechanism for mapping domains to specific applications. Such mapping needs +to be done externally to py4web -- for instance using a web reverse-proxy, +such as nginx. + +While nginx or other reverse-proxies are also useful in production +environments for handling SSL termination, caching and other uses, +we cover only the mapping of domains to py4web applications here. + +An example nginx configuration for an application ``myapp`` mapped to +a domain ``myapp.example.com`` might look like that: + +.. code:: console + + server { + listen 80; + server_name myapp.example.com; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-PY4WEB-APPNAME /myapp; + location / { + proxy_pass http://127.0.0.1:8000/myapp$request_uri; + } + } + +This is an example ``server`` block of nginx configuration. One would have to create +a separate such block for **each app/each domain** being served by py4web server. Note some important aspects: + +- ``server_name`` defines the domain mapped to the app ``myapp``, +- ``proxy_http_version 1.1;`` directive is optional, but highly recommended (otherwise nginx uses HTTP 1.0 to talk + to the backend-server -- here py4web -- and it creates all kinds of issues with buffering and otherwise), +- ``proxy_set_header Host $host;`` directive ensures that the correct ``Host`` is passed to py4web -- here ``myapp.example.com`` +- ``proxy_set_header X-PY4WEB-APPNAME /myapp;`` directive ensures that py4web (and ombott) knows which app to serve + and **also** that this application is domain-mapped -- pay specific attention to the slash (``/``) in front of the ``myapp`` + name -- it is **required** to ensure correct parsing of URLs on ombott level, +- finally ``proxy_pass http://127.0.0.1:8000/myapp$request_uri;`` ensures that the request is passed in its integrity (``$request_uri``) + to py4web server (here: ``127.0.0.1:8000``) and the correct app (``/myapp``). + +Such configuration ensures that all URL manipulation inside ombott and py4web - especially in modules such as ``Auth``, ``Form``, +and ``Grid`` are done correctly using the domain to which the app is mapped to. + +Custom error pages +------------------ + +py4web provides default error pages. For instance, if none of the routes +in an app matches the request, a default 404 error page will be shown. By +default all HTTP error codes are handled automatically by py4web. + +It is however possible to override this behaviour. It can be done either +per HTTP error code, or even for all errors. + +Here is an example for overriding HTTP code 404 (not found): + +.. code:: python + + from py4web.core import ERROR_PAGES + ERROR_PAGES[404] = f"Page not found!" + +If one wants to replace _all_ default error pages, a special qualifier +``"*"`` should be used. Also, the returned value may contain HTML code as +well: + +.. code:: python + + from py4web import URL + from py4web.core import ERROR_PAGES + from yatl.helpers import A + + ERROR_PAGES["*"] = f"We have encountered an error! (try: {A('Main Page', _href=URL("/",scheme=True))})" + +Note that this setup is **global**. This means that it is defined once +for all apps on a given py4web instance. This is because, when an error +is encountered, it could be because the request has not matched any of +the apps. Hence, this configuration should only be done in **one of the +apps**. \ No newline at end of file diff --git a/docs/chapter-06.rst b/docs/chapter-06.rst index e78fe1e8a..ce7202c1f 100644 --- a/docs/chapter-06.rst +++ b/docs/chapter-06.rst @@ -21,7 +21,8 @@ save the session back in the database if data has changed. PY4WEB fixtures provide a mechanism to specify what an action needs so that py4web can accomplish the required tasks (and skip non required ones) in the most efficient manner. Fixtures make the code efficient and -reduce the need for boilerplate code. +reduce the need for boilerplate code. Think of fixtures as per action +(as opposed to per app) middleware. PY4WEB fixtures are similar to WSGI middleware and BottlePy plugin except that they apply to individual actions, not to all of them, and @@ -32,11 +33,11 @@ sessions, url signing and flash messages will be fully explained in this chapter. Database connections, internationalization, authentication, and templates will instead be just outlined here since they have dedicated chapters. + The developer is also free to add fixtures, for example, to handle a third party template language or third party session logic; this is explained later in the :ref:`Custom fixtures` paragraph. - Using Fixtures -------------- @@ -54,14 +55,19 @@ Then you can apply all of them at once with: :: - @action('index.html') + @action('index') @preferred def index(): return dict() Usually, it's not important the order you use to specify the fixtures, because py4web -knows well how to manage them. But there is an important exception: -the Template fixture must always be the last one. +knows well how to manage them if they have explicit dependencies. For example auth +depends explicitly on db and session and flash, so you do not even needs to list them. + +But there is an important exception: the Template fixture must always be the +**first one**. Otherwise, it will not have access to various things it should +need from the other fixtures, especially Inject() and Flash() that we'll see later. + The Template fixture -------------------- @@ -98,20 +104,70 @@ syntactic sugar, and the two following lines are equivalent: @action.uses(Template('index.html', delimiters='[[ ]]')) -Notice that py4web template files are cached in RAM. The py4web caching +Also notice that py4web template files are cached in RAM. The py4web caching object is described later on :ref:`Caching and Memoize`. .. warning:: - If you use multiple fixtures, always place the template as the last one. - Otherwise, it will not have access to various things it needs from the - other fixtures. + If you use multiple fixtures, always place the template as the **first one**. + For example: .. code:: python - @action.uses(session, db, 'index.html') # right - @action.uses('index.html', session, db) # wrong + @action.uses(session, db, 'index.html') # wrong + @action.uses('index.html', session, db) # right + + + Be careful if you read old documentations that this need was **exactly the + opposite** in early py4web experimental versions (until February 2022)! + + +As we've already seen in the last paragraph, you can combine many fixtures in +one decorator. But you can even extend this decorator by passing different +templates as needed. For example: + + +.. code:: python + + def preferred(template, *optional): + return action.uses(template, session, auth, T, flash, *optional) + +And then: + +.. code:: python + + @action('index') + @preferred('index.html') + def index(): + return dict() + + +This syntax has no performance implications: it's just for avoiding to replicate a decorator logic in multiple places. +In this way you'll have cleaner code and if needed you'll be able to change it later in one place only. + + +The Inject fixture +------------------ + +The Inject fixture is used for passing variables (and even python functions) to +templates. Here is a simple example: + + +.. code:: python + + from py4web.utils.factories import Inject + my_var = "Example variable to be passed to a Template" + + ... + + @action.uses('index.html', Inject(my_var=my_var)) + def index(): + + ... + +It will be explained later on :ref:`Using Inject` in the YATL chapter. + The Translator fixture ---------------------- @@ -130,7 +186,7 @@ Here is an example of usage: @action.uses(T) def index(): return str(T('Hello world')) -The string `hello world` will be translated based on the +The string ``hello world`` will be translated based on the internationalization file in the specified “translations” folder that best matches the HTTP ``accept-language`` header. @@ -158,6 +214,28 @@ action with a counter that counts “visits”. session['counter'] = counter return str(T("You have been here {n} times").format(n=counter)) + +If the ``T`` fixture is to be used from inside a template you may want to pass it to the template: + +.. code:: python + + @action('index') + @action.uses("index.html", session, T) + def index(): + return dict(T=T) + +Or perhaps inject (same effect as above) + +.. code:: python + + from py4web.utils.factories import Inject + + @action('index') + @action.uses("index.html", session, Inject(T=T) + def index(): + return dict() + + Now create the following translation file ``translations/en.json``: .. code:: json @@ -203,6 +281,40 @@ Now try create a file called ``translations/it.json`` which contains: Set your browser preference to Italian: now the messages will be automatically translated to Italian. +Notice there is an UI in the Dashboard for creating, updating, and updating translation files. +It can be easily reached via the button ``i18n+p11n``: + +.. image:: images/dashboard_i18n_btn.png + +that leads to the following interface: + +.. image:: images/dashboard_i18n_ui.png + +More details can be found here: https://github.com/web2py/pluralize + + +If you want to force an action to use language defined somewhere else, for example from a session variable, you can do: + +.. code:: python + + @action('index') + @action.uses("index.html", session, T) + def index(): + T.select(session.get("lang", "it")) + return dict(T=T) + +If you want all of your action to use the same pre-defined language and ignore browser preferences, +you have to redefine the select method for the T instance: + +.. code:: python + + T.on_request = lambda *_: T.local.__dict__.update(tag="it", language=T.languages["it"]) + +This is to be done outside any action and will apply to all actions. Action will still need to declare +``action.uses(T)`` else the behavior is undefined. + + + The Flash fixture ----------------- @@ -233,13 +345,7 @@ and in the template: .. code:: html - ... -
    - ... - - [[if globals().get('flash'):]] - - [[pass]] + By setting the value of the message in the flash helper, a flash variable is returned by the action and this triggers the JS in the @@ -257,7 +363,7 @@ The client can also set/add flash messages by calling: :: - utils.flash({'message': 'hello world', 'class': 'info'}); + Q.flash({'message': 'hello world', 'class': 'info'}); py4web defaults to an alert class called ``info`` and most CSS frameworks define classes for alerts called ``success``, ``error``, @@ -324,7 +430,8 @@ set. Other parameters can be specified as well: expiration=3600, algorithm='HS256', storage=None, - same_site='Lax') + same_site='Lax', + name="{app_name}_sesson") Here: @@ -340,7 +447,7 @@ Here: Request Forgery) and is enabled by default with the 'Lax' option. You can read more about it `here `__ - +- ``name`` is the format to use for the session cookie name. If storage is not provided, session is stored in client-side jwt cookie. Otherwise, we have server-side session: the jwt is stored in storage and @@ -354,9 +461,14 @@ Client-side session in cookies By default the session object is stored inside a cookie called ``appname_session``. It's a JWT, hence encoded in a URL-friendly string format and signed using the provided secret for preventing tampering. -Notice that it's not encrypted (in fact it's quite trivial to read its -content from http communications or from disk), so do not place any -sensitive information inside, and use a complex secret. + +.. warning:: + + Data embedded in cookies is signed, not encrypted! In fact it's quite + trivial to read its content from http communications or from disk, so + do not place any sensitive information inside, and use a complex secret. + + If the secret changes existing sessions are invalidated. If the user switches from HTTP to HTTPS or vice versa, the user session is also invalidated. Session in cookies have a @@ -454,6 +566,98 @@ of files per folder by using subfolders, and implement file locking. Yet we do not recommend storing sessions on the filesystem: it is inefficient and does not scale well. +Sharing sessions +~~~~~~~~~~~~~~~~ + +Imagine you have an app "app1" which uses a session and an app "app2" that wants to share a session with app1. Assuming they use sessions in cookies, +"app2" would use: + +.. code:: python + + session = Session(secret=settings.SESSION_SECRET_KEY, + name="app1_session") + +The name tells app2 to use the cookie "app1_session" from app1. Notice it is important that the secret is the same as app1's secret. If using a session +in db, then app2 must be using the same db as app1. It is up to the user to make sure that the data stored in the session and shared between the two apps +are consistent and we strongly recommend that only app1 writes to the session, unless the share one and the same database. + +Notice that it is possible for one app to handle multiple sessions. For example one session may be its own, and another may be used exclusively to read +data from another app (app1) running on the same server: + +.. code:: python + + session_app1 = Session(secret=settings.SESSION_SECRET_KEY, + name="app1_session") + ... + @action.uses(session, session_app1) + ... + + +The Condition fixture +--------------------- + +Sometimes you want to restrict access to an action based on a +given condition. For example to enforce a workflow: + +.. code:: python + + @action("step1") + @action.uses(session) + def step1(): + session["step_completed"] = 1 + button = A("next", _href=URL("step2")) + return locals() + + @action("step2") + @action.uses(session, Condition(lambda: session.get("step_completed") == 1)) + def step2(): + session["step_completed"] = 2 + button = A("next", _href=URL("step3")) + return locals() + + @action("step3") + @action.uses(session, Condition(lambda: session.get("step_completed") == 2)) + def step3(): + session["step_completed"] = 3 + button = A("next", _href=URL("index")) + return locals() + +Notice that the Condition fixtures takes a function as first argument +which is called ``on_request`` and must evaluate to True or False. + +Also notice that in the above example the Condition depends on the Session +therefore it must be listed after ``session`` in ``action.uses``. + +If False, by default, the Condition fixture raises 404. +It is possible to specify a different exception: + +.. code:: python + + Condition(cond, exception=HTTP(400)) + +It is also possible to call a function before the exception is raised, +for example, to redirect to another page: + +.. code:: python + + Condition(cond, on_false=lambda: redirect(URL('step1'))) + +You can use condition to check permissions. For example, if you +are giving group memberships to users using ``Tags`` (it will be explained +later on the :ref:`Authorization using Tags` chapter), then you can +require that users action have specific group membership: + +.. code:: python + + groups = Tags(db.auth_user) + + @action("payroll") + @action.uses(auth, + Condition(lambda: 'employees' in groups.get(auth.user_id), on_false=lambda: redirect('index'))) + def payroll(): + return + + The URLsigner fixture --------------------- @@ -548,6 +752,23 @@ with the following fields: username, email, password, first_name, last_name, sso_id, and action_token (the last two are mostly for internal use). +If a ``auth_user`` table is defined before calling ``auth.enable()`` +the provided table will be used. + +It is also possible to add ``extra_fields`` to the ``auth_user`` table, +for example: + +.. code:: python + + extra_fields = [ + Field("favorite_color"), + ] + auth = Auth(session, db, extra_fields=extra_fields) + +In any case, we recommend not to pollute the ``auth_user`` table with +extra fields but, instead, to use one of more additional custom +tables that reference users and store the required information. + The ``auth`` object exposes the method:``auth.enable()`` which registers multiple actions including ``{appname}/auth/login``. It requires the presence of the ``auth.html`` template and the @@ -579,7 +800,7 @@ is not logged-in, hence this example is equivalent to the previous one. The ``auth`` fixture is plugin based: it supports multiple plugin methods including OAuth2 (Google, Facebook, Twitter), PAM and LDAP. -The :ref:`Authentication and Access control` chapter will show you +The :ref:`Authentication and authorization` chapter will show you all the related details. Caveats about fixtures @@ -601,7 +822,7 @@ fields: db.define_table('thing', Field('name', writable=False)) @action('index') - @action.uses(db, 'generic.html') + @action.uses('generic.html', db) def index(): db.thing.name.writable = True form = Form(db.thing) @@ -630,30 +851,242 @@ A fixture is an object with the following minimal structure: from py4web.core import Fixture class MyFixture(Fixture): - def on_request(self): pass - def on_success(self, status): pass - def on_error(self): pass - def transform(self, output, shared_data=None): return output + def on_request(self, context): pass + def on_success(self, context): pass + def on_error(self, context) pass -If an action uses this fixture: +For example in the DAL fixture case, ``on_request`` starts a transaction, +``on_success`` commits it, and ``on_error`` rolls it back. -:: +In the case of a template, ``on_request`` and ``on_error`` do nothing but +``on_success`` transforms the output. + +In the case of ``auth.user`` fixtures, ``on_request`` does all the work of +determining if the user is logged in (from the dependent session fixture) +and eventually preventing the request from accessing the inner layers. + +Now imagine a request coming in calling an action with three fixtures A, B, and C. +Under normal circumstances above methods are executed in this order: + +.. code:: + + request -> A.on_request -> B.on_request -> C.on_request -> action + response <- A.on_success <- B.on_success <- C.on_success <- + +i.e. the first fixture (A) is the first one to call ``on_request`` +and the last one to call ``on_success``. You can think of them as layers of +an onion with the action (user code) at the center. ``on_success`` is called +when entering a layer from the outside and ``on_success`` is called when +exiting a layer from the inside (like WSGI middleware). + +If any point an exception is raised inner layers are not called +and outer layers will call ``on_error`` instead of ``on_success``. + +Context is a shared object which contains: + +- content['fixtures']: the list of all the fixtures for the action. +- context['processed']: the list of fixtures that called ``on_request`` previously within the request. +- context['exception']: the exception raised by the action or any previous fixture logic (usually None) +- context['output']: the action output. + +``on_success`` and ``on_error`` can see the current ``context['exception']`` and +transform it. They can see the current ``context['output']`` and transform it as well. + +For example here is a fixture that transforms the output text to upper case: + +.. code:: python + + class UpperCase(Fixture): + def on_success(self, context): + context['output'] = context['output'].upper() + + upper_case = UpperCase() @action('index') - @action.uses(MyFixture()) - def index(): return 'hello world' + @action.uses(upper_case) + def index(): return "hello world" + +Notice that this fixture assumes the ``context['output']`` is a string +and therefore it must come before the template. + +Here is a fixture that logs exceptions tracebacks to a file: + +.. code:: python + + class LogErrors(Fixture): + def __init__(self, filename): + self.filename = filename + def on_error(self, context): + with open(self.filename, "a") as stream: + stream.write(str(context['exception']) + '\n') + + errlog = LogErrors("myerrors.log") + + @action('index') + @action.uses(errlog) + def index(): return 1/0 + +Fixtures also have a ``__prerequisite__`` attribute. If a fixture +takes another fixture as an argument, its value must be appended +to the list of ``__prerequisites__``. This guarantees that they are +always executed in the proper order even if listed in the wrong order. +It also makes it optional to declare prerequisite fixtures in ``action.uses``. + +For example ``Auth`` depends on ``db``, ``session``, and ``flash``. ``db`` and ``session`` +are indeed arguments. ``flash`` is a special singleton fixture declared within ``Auth``. +This means that + +.. code:: python + + action.uses(auth) + +is equivalent to + +.. code:: python + + action.uses(auth, session, db, flash) + +Why are fixtures not simply functions that contain a try/except? + +We considered the option but there are some special exceptions that should +not be considered errors but success (``py4web.HTTP``, ``bottle.HTTResponse``) +while other exceptions are errors. The actual logic can be complicated +and individual fixtures do not need to know these details. + +They all need to know what the context is and whether they are +processing a new request or a response and whether the response is a success +or an error. We believe this logic keeps the fixtures easy. + +Fixtures should not in general communicate with each other but nothing +prevents one fixture to put data in the context and another fixture to +retrieve that data. + +Fixtures with dependencies +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If a fixture depends on another fixture, it needs to be passed that fixture in the initializer, +and the fixture must be listed in the ``__prerequisites__`` attribute. +For example, suppose we want to create a fixture that grants access to a controller only +to users whose email address is included in an ADMIN_EMAILS list. +We can write the following fixture: + +.. code:: python + + class AdminAccess(Fixture): + + def __init__(self, auth, admin_list, redirect_url=None): + super().__init__() + self.admin_list = admin_list + self.auth = auth + self.__prerequisites__ = [auth] + # One thing to note here is that the URL function can only be called in a + # request context (while serving a request). Thus, we cannot store in the fixture + # initialization the full URL to redirect, but only the path. + self.redirect_url = redirect_url or 'index' + + def on_request(self, context): + if ((not self.auth.current_user) + or self.auth.current_user.get('email') not in self.admin_list): + redirect(URL(self.redirect_url)) + + def on_error(self, context): + redirect(URL(self.redirect_url)) + +The fixture can be created and used as follows: + +.. code:: python -then: + admin_access = AdminAccess(auth, ['a@example.com',], 'index') -* the ``on_request()`` function is guaranteed to be called before the ``index()`` - function is called -* the ``on_success()`` function is guaranteed to be called if - the ``index()`` function returns successfully or raises ``HTTP`` or - performs a ``redirect`` -* the ``on_error()`` function is guaranteed to be called - when the ``index()`` function raises any exception other than ``HTTP``. -* the ``transform`` function is called to perform any desired - transformation of the value returned by the ``index()`` function. + @action('/admin-only') + @action.uses('admin_only.html', admin_access) + def admin_only(): + return dict() + +Using local storage +~~~~~~~~~~~~~~~~~~~ + +Fixtures can use a thread-local storage for data they need. +Here is an example: + +.. code:: python + + class LocalStorageDemo(Fixture): + + def __init__(self): + super().__init__() + + def on_request(self, context): + Fixture.local_initialize(self) + # We can check whether the local storage is valid. + print(f"is_valid: {self.is_valid()}") + content = str(uuid.uuid4()) + print(f"Storing content: {content}") + self.local.my_content = content + + def on_success(self, context): + # The line below is used only to show that the thread-local object is in place. + print(f"Retrieved: {self.local.my_content}") + +Notably, the initializer should contain the line: + +.. code:: python + + Fixture.local_initialize(self) + +in order to initialize the thread-local storage. +Once this is done, the thread-local storage can be used to store and retrieve data +using the the ``self.local`` object. + + +Multiple fixtures +----------------- + +As previously stated, it's generally not important the order you use to specify the fixtures +but it's mandatory that you always place the template as the **first one**. +Consider this: + +.. code:: python + + @action("index") + @action.uses(A,B) + def func(): return "Hello world" + +Pre-processing (``on_request``) in the fixtures happen in the sequence they are listed +and then the ``on_success`` or ``on_error`` methods will be executed in reverse order (as +an onion). + +Hence the previous code can be explicitly transformed to: + +.. code:: python + + A.on_request() + B.on_request() + func() + B.on_success() + A.on_success() + +So if A.on_success() is a template and B is an inject fixture that allows you to add +some extra variables to your templates, then A must come first. + +Notice that + +.. code:: python + + @action.uses(A) + @action.uses(B) + +is almost equivalent to + +.. code:: python + + @action.uses(A,B) + +but not quite. All fixtures declared in one ``action.uses`` share +the same context while fixtures in different ``action.uses`` use +different contexts and therefore they cannot communicate with each other. +This may change in the future. +For now we recommend using a single call to ``action.uses``. Caching and Memoize @@ -689,19 +1122,19 @@ Convenience Decorators ---------------------- The ``_scaffold`` application, in ``common.py`` defines two special -convenience decorators: +convenience decorators using ActionFactory: -:: +.. code:: python - @unauthenticated + @unauthenticated() def index(): return dict() and -:: +.. code:: python - @authenticated + @authenticated() def index(): return dict() @@ -713,6 +1146,45 @@ arguments of the action separated by a slash (/). - @unauthenticated does not require the user to be logged in. - @authenticated required the user to be logged in. -They can be combined with (and precede) other ``@action.uses(...)`` but -they should not be combined with ``@action(...)`` because they perform -that function automatically. +.. warning:: + + ActionFactory decorators like these cannot be combined + with @action or @action.uses + +The decorators can be used directly as shown above, which enables +all HTTP methods (GET, POST, PUT, ...) but you can also create separate +controllers for each HTTP method: + +.. code:: python + + @authenticated.get() + def index(): + # only handle GET requests + return dict() + + @authenticated.post(path="index") + def index_form(): + # only handle POST requests + return dict() + +The both decorator and its HTTP method calls have the following arguments: + +- ``path`` overwrites the path built from the function name + with the given string. Does not automatically handle arguments. +- ``template`` specifies the template name, instead of using + the function name. +- ``uses`` specify extra fixtures for this specific controllers. + + +.. code:: python + + @authenticated( + path="test", + template="generic.html", + uses=[Inject(message="Hello World")]) + def example(): + return dict() + +As manual ordering of fixtures isn't possible with ``uses``, +make sure the fixtures define their dependencies. +See: :ref:`Fixtures with dependencies` \ No newline at end of file diff --git a/docs/chapter-07.rst b/docs/chapter-07.rst index 1759ba155..1634df6f5 100644 --- a/docs/chapter-07.rst +++ b/docs/chapter-07.rst @@ -5,7 +5,7 @@ The Database Abstraction Layer (DAL) DAL introduction ---------------- -py4web rely on a database abstraction layer (DAL), an API that maps +py4web rely on a database abstraction layer (**DAL**), an API that maps Python objects into database objects such as queries, tables, and records. The DAL dynamically generates the SQL in real time using the specified dialect for the database back end, so that you do not have to @@ -16,6 +16,13 @@ The DAL choosen is a pure Python one called `pyDAL >>`` are also directly executable via a py4web shell. -This is a simple example, using the provided ``examples`` app: +This is a simple example, using the provided ``showcase`` app: .. code:: python - >>> from py4web import DAL, Field - >>> from apps.examples import db + >>> from apps.showcase.examples.models import db >>> db.tables() - ['auth_user', 'auth_user_tag_groups', 'person', 'superhero', 'superpower', 'tag', 'product', 'thing'] + ['auth_user', 'auth_user_tag_groups', 'person', 'superhero', 'superpower', 'tag', 'thing', 'user_token', 'dummy'] >>> rows = db(db.superhero.name != None).select() >>> rows.first() , 'name': 'Superman', 'real_identity': 1}> @@ -210,6 +211,24 @@ You can also start by creating a connection from zero. For the sake of simplicit can use SQLite. Nothing in this discussion changes when you switch the back-end engine. +Using the dashboard app with databases +-------------------------------------- + +Generally you can use the dashboard app for viewing and modifying the databases +of a particular app. However this is not bulletproof, so for +security reason this by default is not applied to the showcase app. +But if your installation is local (not exposed to public networks), you can enable it +by simply adding to the file``apps/showcase/__init__.py`` the line: + +.. code:: python + + from .examples.models import db + + +This allow you to look graphically inside the showcase application database: + +.. image:: images/example_db.png + DAL constructor --------------- @@ -298,8 +317,7 @@ the database is running from localhost on its default port and is named Database Connection string ==================== ======================================================= **SQLite** ``sqlite://storage.sqlite`` -**MySQL** ``mysql://username:password@localhost/test?set_encoding - =utf8mb4`` +**MySQL** ``mysql://username:password@localhost/test?set_encoding=utf8mb4`` **PostgreSQL** ``postgres://username:password@localhost/test`` **MSSQL (legacy)** ``mssql://username:password@localhost/test`` **MSSQL (>=2005)** ``mssql3://username:password@localhost/test`` @@ -322,6 +340,10 @@ Database Connection string - in SQLite the database consists of a single file. If it does not exist, it is created. This file is locked every time it is accessed. + In addition to the file 'storage.sqlite' that contains the data, there will + be also a sql.log file plus one additional file called longhash_tablename.table + for every table definition. The table definition files are used during migrations; + in case of problems they could be deleted (they'll be automatically recreated). - in the case of MySQL, PostgreSQL, MSSQL, FireBird, Oracle, DB2, Ingres and Informix the database “test” must be created outside py4web. Once the connection is established, py4web will create, alter, and drop @@ -416,8 +438,8 @@ table is actually referenced. Model-less applications ~~~~~~~~~~~~~~~~~~~~~~~ -In py4web the code defined outside of actions (where normally DAL tables -are defined) is only executed at startup. +Normally in py4web the code that define DAL tables lives in the file +``models.py``, hence it's only executed at startup because it's outside of actions. However, it is possible to define DAL tables on demand inside actions. This is referred to as “model-less” development by the py4web community. @@ -547,15 +569,24 @@ Database folder location ^^^^^^^^^^^^^^^^^^^^^^^^ ``folder`` sets the place where migration files will be created (see -Migrations_ for details). -It is also used for SQLite databases. Automatically set within py4web. -Set a path when using DAL outside py4web. +Migrations_ for details). By default it's automatically set within py4web on the same +folder of the database itself, but you have to specify it when using DAL outside py4web. + +Note that for SQLite databases it's normally necessary, +otherwise you'll implicitly choose an in memory database (where folder and +migrations don't have any sense). So these constructors have the same meaning: + +.. code:: python + + db = DAL('sqlite://storage.sqlite') # folder parameter not specified + db = DAL('sqlite:memory') # in memory database + Default migration settings ^^^^^^^^^^^^^^^^^^^^^^^^^^ The DAL constructor migration settings are booleans affecting defaults -and global behaviour. +and global behaviour (again, see Migrations_ for details) ``migrate = True`` sets default migrate behavior for all tables @@ -575,7 +606,7 @@ operations may be executed immediately, depending on the database engine. If you pass ``db`` in an ``action.uses`` decorator, you don't need to call -commit in the controller, it is done for you. (Also, if you use +commit in the controller, it is automatically done for you (also, if you use ``authenticated`` or ``unauthenticated`` decorator.) .. tip:: @@ -852,7 +883,7 @@ the current application, always set ``migrate=False``. If the legacy table has an auto-increment integer field but it is not called “id”, py4web can still access it but the table definition must declare the auto-increment field with ‘id’ type (that is using -``FIeld('...', 'id')``). +``Field('...', 'id')``). Finally if the legacy table uses a primary key that is not an auto-increment id field it is possible to use a “keyed table”, for @@ -1016,14 +1047,37 @@ only for fields of type “string”. ``uploadfield``, ``authorize``, and - ``authorize`` can be used to require access control on the corresponding field, for “upload” fields only. It will be discussed more in detail in the context of Authentication and Authorization. +- ``widget`` do not use DAL widgets with py4web, it has has its own + (see :ref:`Widgets` later). - ``represent`` can be None or can point to a function that takes a field value and returns an alternate representation for the field - value. Examples: + value. + +Thread safety and Field attributes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Note not all the attributes are thread safe and most of them -should only be set globally for an app. The following are guaranteed to be -thread safe and be set/reset in any action: -``default``, ``update``, ``readable``, ``writable``, ``requires``. +Even though py4web and web2py use the same pyDAL, there is an important difference +which stems from the core architecture of py4web. +In py4web only the following ``Field`` attributes can be changed inside an action: + +- ``readable`` +- ``writable`` +- ``default`` +- ``filter_in`` +- ``filter_out`` +- ``label`` +- ``update`` +- ``requires`` +- ``widget`` +- ``represent`` + +These are reset to their original values before each action is called. +All other ``Field``, ``DAL``, and ``Table`` attributes are global and non-thread-safe. + +This limitation exists because py4web executes table definitions only at startup, +unlike web2py which re-defines tables on each request. This makes py4web a lot faster +than web2py, but you need to be careful as modifying non-thread-safe +attributes in actions can cause race conditions and bugs. Field types and validators @@ -1599,11 +1653,11 @@ works very much like except that it calls the validators for the fields before performing the insert and bails out if the validation does not pass. If validation does -not pass the errors can be found in ``ret.errors``. ``ret.errors`` holds +not pass the errors can be found in ``ret["errors"]``. ``ret["errors"]`` holds a key-value mapping where each key is the field name whose validation failed, and the value of the key is the result from the validation error -(much like ``form.errors``). If it passes, the id of the new record is -in ``ret.id``. Mind that normally validation is done by the form +(much like ``form["errors"]``). If it passes, the id of the new record is +in ``ret["id"]``. Mind that normally validation is done by the form processing logic so this function is rarely needed. Similarly @@ -1620,8 +1674,8 @@ works very much the same as except that it calls the validators for the fields before performing the update. Notice that it only works if query involves a single table. The -number of updated records can be found in ``ret.updated`` and errors -will be in ``ret.errors``. +number of updated records can be found in ``ret["updated"]`` and errors +will be in ``ret["errors"]``. ``drop`` ~~~~~~~~ @@ -1645,9 +1699,9 @@ database. db = DAL("sqlite:memory") db.define_table("thing", Field("name")) - properties = Tags(db.thing) id1 = db.thing.insert(name="chair") id2 = db.thing.insert(name="table") + properties = Tags(db.thing) properties.add(id1, "color/red") properties.add(id1, "style/modern") properties.add(id2, "color/green") @@ -1665,14 +1719,16 @@ database. rows = db(properties.find(["color"])).select() assert len(rows) == 2 -It is internally implemented as a table, which in + +``Tags`` are hierarchical. Then ``find([“color”])`` would return id1 and id2 +because both records have tags with “color”. + +It is internally implemented with the creation of an additional table, which in this example would be db.thing_tags_default, because no tail was -specified on the Tags(table, tail=“default”) constructor. +specified on the ``Tags(table, tail=“default”)`` constructor. -The ``find`` method is doing a search by ``startswith`` of the -parameter. Then find([“color”]) would return id1 and id2 -because both records have tags starting with “color”. py4web uses tags as a -flexible mechanism to manage permissions. +py4web uses ``Tags`` as a flexible mechanism to manage permissions, we'll see +all the details later on the :ref:`Authorization using Tags` chapter. Raw SQL @@ -2341,7 +2397,7 @@ An example use which gives much faster selects is: .. code:: python - rows = db(query).select(cache=(cache.ram, 3600), cacheable=True) + rows = db(query).select(cache=(cache.get, 3600), cacheable=True) Look at `Caching selects`_, to understand what the trade-offs are. @@ -2723,7 +2779,9 @@ Caching selects The select method also takes a ``cache`` argument, which defaults to None. For caching purposes, it should be set to a tuple where the first -element is the cache model (``cache.ram``, ``cache.disk``, etc.), and +element is the cache function with signature `(key, callback, expiration)` +(for example ``cache.get`` assuming ``cache`` +is an instance of the py4web cache object), and the second element is the expiration time in seconds. In the following example, you see a controller that caches a select on @@ -2736,7 +2794,7 @@ the previous data from memory. .. code:: python def cache_db_select(): - logs = db().select(db.log.ALL, cache=(cache.ram, 60)) + logs = db().select(db.log.ALL, cache=(cache.get, 60)) return dict(logs=logs) The ``select`` method has an optional ``cacheable`` argument, normally @@ -2759,7 +2817,7 @@ caching: .. code:: python - rows = db(query).select(cache=(cache.ram, 3600), cacheable=True) + rows = db(query).select(cache=(cache.get, 3600), cacheable=True) Computed and Virtual fields @@ -3304,10 +3362,9 @@ and all owners of Boat: Alex Curt -A lighter alternative to many-to-many relations is tagging, you can -found an example of this in the next section. Tagging works even on -database backends that do not support JOINs like the Google App Engine -NoSQL. +A lighter alternative to many-to-many relations is tagging, see the +:ref:`Authorization using Tags` chapter. Tagging works even on database backends +that do not support JOINs like the Google App Engine NoSQL. Self-Reference and aliases ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -3963,7 +4020,7 @@ it to XML/HTML: If you need to serialize the Rows in any other XML format with custom -tags, you can easily do that using the universal :ref:`TAG` helper +tags, you can easily do that using the universal ``TAG`` XML helper that we'll see later and the Python syntax ``*`` allowed in function calls: @@ -3980,6 +4037,13 @@ that we'll see later and the Python syntax 3Carl +.. warning:: + + Do not confuse the `TAG` XML helper used here (see the :ref:`TAG` + chapter) with the ``Tags`` method that will be extensively explained + on the :ref:`Authorization using Tags` chapter. + + Data representation ~~~~~~~~~~~~~~~~~~~ diff --git a/docs/chapter-08.rst b/docs/chapter-08.rst index cefb66bbc..84ae23e56 100644 --- a/docs/chapter-08.rst +++ b/docs/chapter-08.rst @@ -1,17 +1,19 @@ =========== -The RESTAPI +The RestAPI =========== -Since version 19.5.10 pyDAL includes a restful API called RestAPI. It is -inspired by GraphQL and while it’s not quite the same due to it being less -powerful, it is in the spirit of py4web where it's more practical and easier to use. +Since version 19.5.10 pyDAL includes a restful API [CIT0801]_ called RestAPI. It is +inspired by GraphQL [CIT0802]_ and while it’s not quite the same due to it being less +powerful, it is in the spirit of py4web since it's more practical and easier to use. + Like GraphQL RestAPI allows a client to query for information using the GET method and allows to specify some details about the format of the response (which references to follow, and how to denormalize the data). Unlike GraphQL it allows the server to specify a policy and restrict -which queries are allowed and which one are not. They can be evaluated +which queries are allowed and which ones are not. They can be evaluated dynamically per request based on the user and the state of the server. -As the name implied RestAPI allows all standard methods: GET, POST, PUT, + +As the name implies RestAPI allows all standard methods: GET, POST, PUT, and DELETE. Each of them can be enabled or disabled based on the policy, for individual tables and individual fields. @@ -19,64 +21,96 @@ for individual tables and individual fields. Specifications might be subject to changes since this is a new feature. -In the examples below we assume an app called “superheroes” and the -following model: - -.. code:: python - - db.define_table( - 'person', - Field('name'), - Field('job')) - - db.define_table( - 'superhero', - Field('name'), - Field('real_identity', 'reference person')) - - db.define_table( - 'superpower', - Field('description')) - - db.define_table( - 'tag', - Field('superhero', 'reference superhero'), - Field('superpower', 'reference superpower'), - Field('strength', 'integer')) - -We also assume the following controller: +In the examples below we assume a simple app called “superheroes”: .. code:: python - from py4web import action, request - from .common import db - from pydal.restapi import RestAPI, Policy - - policy = Policy() - policy.set('superhero', 'GET', authorize=True, allowed_patterns=['*']) - policy.set('*', 'GET', authorize=True, allowed_patterns=['*']) - - # for security reasons we disabled here all methods but GET at the policy level, to enable any of them just set authorize = True - policy.set('*', 'PUT', authorize=False) - policy.set('*', 'POST', authorize=False) - policy.set('*', 'DELETE', authorize=False) - - @action('api//', method = ['GET', 'POST']) - @action('api//', method = ['GET', 'PUT', 'DELETE']) - @action.uses(db) - def api(tablename, rec_id=None): - return RestAPI(db, policy)(request.method, - tablename, - rec_id, - request.GET, - request.POST - ) - -The policy is per table (or \* for all tables and per method. authorize + # in superheroes/__init__.py + import os + from py4web import action, request, Field, DAL + from pydal.restapi import RestAPI, Policy + + # database definition + DB_FOLDER = os.path.join(os.path.dirname(__file__), 'databases') + if not os.path.isdir(DB_FOLDER): + os.mkdir(DB_FOLDER) + db = DAL('sqlite://storage.sqlite', folder=DB_FOLDER) + db.define_table( + 'person', + Field('name'), + Field('job')) + db.define_table( + 'superhero', + Field('name'), + Field('real_identity', 'reference person')) + db.define_table( + 'superpower', + Field('description')) + db.define_table( + 'tag', + Field('superhero', 'reference superhero'), + Field('superpower', 'reference superpower'), + Field('strength', 'integer')) + + # add example entries in db + if not db(db.person).count(): + db.person.insert(name='Clark Kent', job='Journalist') + db.person.insert(name='Peter Park', job='Photographer') + db.person.insert(name='Bruce Wayne', job='CEO') + db.superhero.insert(name='Superman', real_identity=1) + db.superhero.insert(name='Spiderman', real_identity=2) + db.superhero.insert(name='Batman', real_identity=3) + db.superpower.insert(description='Flight') + db.superpower.insert(description='Strength') + db.superpower.insert(description='Speed') + db.superpower.insert(description='Durability') + db.tag.insert(superhero=1, superpower=1, strength=100) + db.tag.insert(superhero=1, superpower=2, strength=100) + db.tag.insert(superhero=1, superpower=3, strength=100) + db.tag.insert(superhero=1, superpower=4, strength=100) + db.tag.insert(superhero=2, superpower=2, strength=50) + db.tag.insert(superhero=2, superpower=3, strength=75) + db.tag.insert(superhero=2, superpower=4, strength=10) + db.tag.insert(superhero=3, superpower=2, strength=80) + db.tag.insert(superhero=3, superpower=3, strength=20) + db.tag.insert(superhero=3, superpower=4, strength=70) + db.commit() + + # policy definitions + policy = Policy() + policy.set('superhero', 'GET', authorize=True, allowed_patterns=['*']) + policy.set('*', 'GET', authorize=True, allowed_patterns=['*']) + + # for security reasons we disabled here all methods but GET at the policy level, + # to enable any of them just set authorize = True + policy.set('*', 'PUT', authorize=False) + policy.set('*', 'POST', authorize=False) + policy.set('*', 'DELETE', authorize=False) + + @action('api//', method = ['GET', 'POST']) + @action('api//', method = ['GET', 'PUT', 'DELETE']) + @action.uses(db) + def api(tablename, rec_id=None): + return RestAPI(db, policy)(request.method, + tablename, + rec_id, + request.GET, + request.POST + ) + + @action("index") + def index(): + return "RestAPI example" + + +RestAPI policies and actions +---------------------------- + +The policy is per table (or * for all tables) and per method. ``authorize`` can be True (allow), False (deny) or a function with the signature (method, tablename, record_id, get_vars, post_vars) which returns True/False. For the GET policy one can specify a list of allowed query -patterns (\* for all). A query pattern will be matched against the keys +patterns (* for all). A query pattern will be matched against the keys in the query string. The above action is exposed as: @@ -86,16 +120,24 @@ The above action is exposed as: /superheroes/api/{tablename} /superheroes/api/{tablename}/{rec_id} + +The result can be seen directly with a browser, rendered as JSON. +Let's look for example at the ``person`` table: + +.. image:: images/restapi.png + + +The diagram of the superhero's database should help you interpreting the code: + + +.. image:: images/restapi2.png + + .. note:: Keep in mind that **request.POST** only contains the form data that is posted using a **regular HTML-form** or **JavaScript - FormData** object. If you post just plain object - (e.g. ``axios.post('path/to/api', {field:'some'})``) you should pass - **request.json** instead of request.POST, since the latter will contain - just raw request-body which is string, not JSON. See `Bottle - `__ documentation about ``request`` object. - + FormData** object. RestAPI GET ----------- @@ -104,59 +146,55 @@ The general query has the form ``{something}.eq=value`` where ``eq=`` stands for “equal”, ``gt=`` stands for “greater than”, etc. The expression can be prepended by ``not.``. -``{something}`` can be the name of a field in the table being queried as -in: +``{something}`` can be: -**All superheroes called “Superman”** +- the name of a field in the table being queried as in: -:: + **All superheroes called “Superman”** - /superheroes/api/superhero?name.eq=Superman + :: -It can be the name of a field of a table referred by the table being -queried as in: + /superheroes/api/superhero?name.eq=Superman -**All superheroes with real identity “Clark Kent”** -:: +- the name of a field of a table referred by the table being queried as in: - /superheroes/api/superhero?real_identity.name.eq=Clark Kent + **All superheroes with real identity “Clark Kent”** -It can be the name of a field of a table that refers to the table being -queried as in: + :: -**All superheroes with any tag superpower with strength > 90** + /superheroes/api/superhero?real_identity.name.eq=Clark Kent -:: +- the name of a field of a table that refers to the table being queried as in: - /superheroes/api/superhero?superhero.tag.strength.gt=90 + **All superheroes with any tag superpower with strength > 90** -(here ``tag`` is the name of the link table, the preceding ``superhero`` is -the name of the field that refers to the selected table and ``strength`` -is the name of the field used to filter) + :: -It can also be a field of the table referenced by a many-to-many linked -table as in: + /superheroes/api/superhero?superhero.tag.strength.gt=90 -**All superheroes with the flight power** + (here ``tag`` is the name of the link table, the preceding ``superhero`` is + the name of the field that refers to the selected table and ``strength`` + is the name of the field used to filter) -:: +- a field of the table referenced by a many-to-many linked table as in: - /superheroes/api/superhero?superhero.tag.superpower.description.eq=Flight + **All superheroes with the flight power** -The key to understand the syntax above is to break it as follows: + :: + + /superheroes/api/superhero?superhero.tag.superpower.description.eq=Flight -:: - superhero?superhero.tag.superpower.description.eq=Flight +.. hint:: + The key to understand the syntax above is to read it as: -and read it as: + << select records of table **superhero** referred by field **superhero** + of table **tag**, when the **superpower** field of said table points + to a record with **description** equal to “Flight” >> - select records of table **superhero** referred by field **superhero** - of table **tag** when the **superpower** field of said table points - to a record with **description** **eq**\ ual to “Flight”. -The query allows additional modifiers for example +The query allows additional modifiers for example: :: @@ -169,6 +207,10 @@ The query allows additional modifiers for example The first 3 are obvious. ``@model`` returns a JSON description of database model. ``@lookup`` denormalizes the linked field. + +RestAPI practical examples +-------------------------- + Here are some practical examples: URL: @@ -1027,6 +1069,10 @@ OUTPUT: "api_version": "0.1" } + +The RestAPI response +-------------------- + All RestAPI response have the fields: :api_version: RestAPI version. @@ -1041,3 +1087,7 @@ Other optional fields are: :errors: Usually a validation error. :models: Usually if status != "success". :message: For error details. + + +.. [CIT0801] https://en.wikipedia.org/wiki/Representational_state_transfer +.. [CIT0802] https://graphql.org/ diff --git a/docs/chapter-10.rst b/docs/chapter-10.rst index b3596bfd9..16cba79e0 100644 --- a/docs/chapter-10.rst +++ b/docs/chapter-10.rst @@ -801,14 +801,48 @@ that match the specified attributes will be searched for text. >>> print(a)
    x
    helloz
    -Import modules from templates ------------------------------ +Using Inject +------------ Normally all the code should be called from the controller program, and only the necessary data is passed to the template in order to be displayed. -But sometimes it's useful to use a python function as a helper called from a template. +But sometimes it's useful to pass variables or even use a python function as a helper called from a template. -In this case you can use ``Inject``. For example if your helper function is called *sidebar_menu* +In this case you can use the fixture ``Inject`` from py4web.utils.factories. + +This is a simple example for injecting a variable: + +.. code:: python + + from py4web.utils.factories import Inject + + my_var = "Example variable to be passed to a Template" + + ... + + @unauthenticated("index", "index.html") + @action.uses(Inject(my_var=my_var)) + def index(): + + ... + + +Then in ``index.html`` you can use the injected variable: + +.. code:: html + + [[=my_var]] + + +You can also use ``Inject`` to add variables to the auth.enable line; +in this way auth forms would have access to that variable. + +.. code:: python + + auth.enable(uses=(session, T, db, Inject(TIMEOFFSET=settings.TIMEOFFSET))) + +A more complex usage of Inject is for passing python functions to templates. +For example if your helper function is called *sidebar_menu* and it's inside the libs/helpers.py module of your app, you could use this in **controllers.py**: .. code:: python @@ -817,7 +851,7 @@ and it's inside the libs/helpers.py module of your app, you could use this in ** from .libs.helpers import sidebar_menu @action(...) - @action.uses(Inject(sidebar_menu=sidebar_menu), "index.html") + @action.uses("index.html", Inject(sidebar_menu=sidebar_menu)) def index(): .... OR diff --git a/docs/chapter-12.rst b/docs/chapter-12.rst index cd0b37134..781aa4ae0 100644 --- a/docs/chapter-12.rst +++ b/docs/chapter-12.rst @@ -5,7 +5,68 @@ Forms The Form class provides a high-level API for quickly building CRUD (create, update and delete) forms, especially for working on an existing database table. It can generate and process a form from a list of desired fields and/or from an existing database table. -It is a pretty much equivalent to web2py’s ``SQLFORM``. + +There are 3 types of forms: + +CRUD Create forms: + +.. code:: python + + @action('create_thing') + @action.uses('generic.html', db, flash) + def create_thing(): + form = Form(db.thing) + if form.accepted: + flash.set("record created") + redirect(URL('other_page')) + return locals() + +CRUD Update forms: + +.. code:: python + + @action('update_thing/') + @action.uses('generic.html', db, flash) + def update_thing(thing_id): + form = Form(db.thing, thing_id) + if form.accepted: + flash.set("record updated") + redirect(URL('other_page')) + return locals() + +Non-CRUD forms (not associated to a database): + +.. code:: python + + @action('some_form') + @action.uses('generic.html', flash) + def some_form(): + fields = [ + Field("name", requires=IS_NOT_EMPTY()), + Field("color", required=IS_IN_SET(["red","blue","green"])), + ] + form = Form(fields) + if form.accepted: + flash.set("information recorded") + redirect(URL('other_page')) + return locals() + +The use of flash is optional. ``flash`` is defined in ``common.py`` +in the scaffolding application. It simply stores a message in a cookie +so it can be recovered and displayed after redirection. +This is done in the default layout. + +In this chapter from now on we will assume the following model and +an app derived from the scaffolding app: + +.. code:: python + + db.define_table( + 'thing', + Field('name', requires=IS_NOT_EMPTY()), + Field('color', requires=IS_IN_SET(['red','blue','green'])), + Field('image', 'upload', download_url=lambda name: URL('download', name)), + ) The Form constructor @@ -15,22 +76,22 @@ The ``Form`` constructor accepts the following arguments: .. code:: python - Form(self, - table, - record=None, - readonly=False, - deletable=True, - formstyle=FormStyleDefault, - dbio=True, - keep_values=False, - form_name=False, - hidden=None, - validation=None, - csrf_session=None, - csrf_protection=True, - lifespan=None, - signing_info=None, - ): + Form(self, + table, + record=None, + readonly=False, + deletable=True, + formstyle=FormStyleDefault, + dbio=True, + keep_values=False, + form_name=False, + hidden=None, + validation=None, + csrf_session=None, + csrf_protection=True, + lifespan=None, + signing_info=None, + ): Where: @@ -38,8 +99,9 @@ Where: - ``record``: a DAL record or record id - ``readonly``: set to True to make a readonly form - ``deletable``: set to False to disallow deletion of record -- ``formstyle``: a function that renders the form using helpers. Can be FormStyleDefault (default), - FormStyleBulma or FormStyleBootstrap4 +- ``formstyle``: a function that renders the form using helpers. + Can be FormStyleDefault (default), FormStyleBulma, + FormStyleBootstrap4, or FormStyleBootstrap5 - ``dbio``: set to False to prevent any DB writes - ``keep_values``: if set to true, it remembers the values of the previously submitted form - ``form_name``: the optional name of this form @@ -58,25 +120,25 @@ Create a new minimal app called ``form_minimal`` : .. code:: python - # in form_minimal/__init__.py - from py4web import action, Field, redirect, URL + # in controllers.py + from py4web impot action, redirect, URL, Field from py4web.utils.form import Form - from pydal.validators import IS_NOT_EMPTY - + from pydal.validators import * @action('index', method=['GET', 'POST']) @action.uses('form_minimal.html') def index(): - form = Form([ - Field('product_name'), - Field('product_quantity', 'integer', requires=IS_NOT_EMPTY()), - ]) + fields = [ + Field('name', requires=IS_NOT_EMPTY()), + Field('color', requires=IS_IN_SET(['red','blue','green'])), + ] + form = Form(fields) if form.accepted: - # Do something with form.vars['product_name'] and form.vars['product_quantity'] + # Do something with form.vars['name'] and form.vars['color'] redirect(URL('accepted')) if form.errors: - # display message error - redirect(URL('not_accepted')) + # do something + ... return dict(form=form) @action("accepted") @@ -84,16 +146,12 @@ Create a new minimal app called ``form_minimal`` : return "form_example accepted" - @action("not_accepted") - def not_accepted(): - return "form_example NOT accepted" - - Also, you need to create a file inside the app called ``templates/form_minimal.html`` that just contains the line: .. code:: html + [[extend 'layout.html']] [[=form]] @@ -118,42 +176,27 @@ The next example will. Basic form example ------------------ -In this next basic example we generate a form from a database. +In this next basic example we generate a CRUD create form from a database. Create a new minimal app called ``form_basic`` : .. code-block:: python - # in form_basic/__init__.py - import os - from py4web import action, Field, DAL - from py4web.utils.form import Form, FormStyleDefault - from pydal.validators import IS_NOT_EMPTY, IS_IN_SET - - # database definition - DB_FOLDER = os.path.join(os.path.dirname(__file__), 'databases') - if not os.path.isdir(DB_FOLDER): - os.mkdir(DB_FOLDER) - db = DAL('sqlite://storage.sqlite', folder=DB_FOLDER) - db.define_table( - 'person', - Field('superhero', requires=IS_NOT_EMPTY()), - Field('realname'), - Field('universe', requires=IS_IN_SET(['DC Comics','Marvel Comics'])), - ) + # in controllers.py + from py4web import action, redirect, URL, Field + from py4web.utils.form import Form + from pydal.validators import * + from .common import db # controllers definition - @action("index", method=["GET", "POST"]) - @action.uses(db, "form_basic.html") - def index(id=None): - form = Form(db.person, id, deletable=False, formstyle=FormStyleDefault) - rows = db(db.person).select() + @action("create_form", method=["GET", "POST"]) + @action.uses("form_basic.html", db) + def create_form(): + form = Form(db.thing) + rows = db(db.thing).select() return dict(form=form, rows=rows) -Because this is a dual purpose form, in case an ``id`` is passed, we also validate it -by checking if the corresponding record exists and raise 404 if not. - Note the import of two simple validators on top, in order to be used later with the ``requires`` parameter. We'll fully explain them on the :ref:`Form validation` paragraph. @@ -163,7 +206,9 @@ contains, for example, the following code: .. code:: html -

    Form Basic example: Superhero Identity

    + [[extend "layout.html"]] + +

    Form Basic example: My Things

    [[=form]] @@ -171,12 +216,12 @@ contains, for example, the following code:
      [[for row in rows:]] -
    • [[=row.id]]: [[=row.superhero]] ([[=row.realname]]) from [[=row.universe]]
    • +
    • [[=row.id]]: [[=row.name]] has color [[=row.color]]
    • [[pass]]
    - -Reload py4web and visit http://127.0.0.1:8000/form_basic : + +Reload py4web and visit http://127.0.0.1:8000/create_form : the result is an input form on the top of the page, and the list of all the previously added entries on the bottom: @@ -185,58 +230,45 @@ previously added entries on the bottom: This is a simple example and you cannot change nor delete existing records. But if you'd like to experiment, the database content can be fully seen and changed with the Dashboard app. +You can turn a create form into a CRUD update form by passing a record or a record id +it second argument: -Notice that py4web by default let you choose the value of the `universe` field using -a dropdown menu: - -.. image:: images/form3.png - -The basic form usage is quite useful for rapid prototyping of programs, since you don't need -to specify the layout of the form. On the other hand, you cannot change its default behaviour. +.. code:: html + # controllers definition + @action("update_form/", method=["GET", "POST"]) + @action.uses("form_basic.html", db) + def update_form(): + form = Form(db.thing, thing_id) + rows = db(db.thing).select() + return dict(form=form, rows=rows) File upload field ~~~~~~~~~~~~~~~~~ -The file upload field is quite particular. The standard way to use it (as in the _scaffold app) -is to have the UPLOAD_FOLDER defined in the common.py file. But if you don't specify it, then the -default value of ``your_app/upload`` folder will be used (and the folder will also be created if needed). -Let's look at a simple example: - -.. code-block:: python +We can make a minor modification to our reference model and an upload type file: - # in form_upload/__init__.py - import os - from py4web.core import required_folder - from py4web import action, Field, DAL - from py4web.utils.form import Form, FormStyleDefault - from pydal.validators import IS_NOT_EMPTY - - # database definition - DB_FOLDER = os.path.join(os.path.dirname(__file__), 'databases') - if not os.path.isdir(DB_FOLDER): - os.mkdir(DB_FOLDER) - db = DAL('sqlite://storage.sqlite', folder=DB_FOLDER) - db.define_table( - 'person', - Field('superhero', requires=IS_NOT_EMPTY()), - Field('image', "upload", label='Superhero Image', requires=IS_NOT_EMPTY()), - ) +.. code:: python - @action("index", method=["GET", "POST"]) - @action.uses(db, "form_upload.html") - def upload(id=None): - form = Form(db.person, id, deletable=False, formstyle=FormStyleDefault) - rows = db(db.person).select() - return dict(form=form, rows=rows) + db.define_table( + 'thing', + Field('name', requires=IS_NOT_EMPTY()), + Field('color', requires=IS_IN_SET(['red','blue','green'])), + Field('image', 'upload', download_url=lambda image: URL('download', image)), + ) +The file upload field is quite particular. The standard way to use it (as in the _scaffold app) +is to have the UPLOAD_FOLDER defined in the common.py file. But if you don't specify it, then the +default value of ``your_app/upload`` folder will be used (and the folder will also be created if needed). +``download_url`` is a callback that given the image name, generated the URL to download. The ``download`` +url is predefined in ``common.py``. -And in templates/form_upload.html : +We can modify ``form_basic.html`` to display the uploaded images: .. code:: html -

    Form upload example: Superhero Identity

    +

    Form upload example: My Things

    [[=form]] @@ -244,17 +276,13 @@ And in templates/form_upload.html :
      [[for row in rows:]] -
    • [[=row.id]]: [[=row.superhero]] = [[=row.image]]
    • +
    • [[=row.id]]: [[=row.name]] has color [[=row.color]] + [[pass]]
    -This gives a result like the following: - -.. image:: images/form6.png - - -Note that the uploaded files will be saved on the UPLOAD_FOLDER folder with their name hashed. +The uploaded files (the thing images) are saved on the UPLOAD_FOLDER folder with their name hashed. Other details on the upload fields can be found on :ref:`Field constructor` paragraph, including a way to save the files inside the database itself. @@ -286,68 +314,40 @@ This is an improved 'Basic Form Example' with a radio button widget: .. code:: python - # in form_widgets/__init__.py - import os - from py4web import action, Field, DAL + # in controllers.py + from py4web import action, redirect, URL, Field from py4web.utils.form import Form, FormStyleDefault, RadioWidget - from pydal.validators import IS_NOT_EMPTY, IS_IN_SET - - # database definition - DB_FOLDER = os.path.join(os.path.dirname(__file__), 'databases') - if not os.path.isdir(DB_FOLDER): - os.mkdir(DB_FOLDER) - db = DAL('sqlite://storage.sqlite', folder=DB_FOLDER) - db.define_table( - 'person', - Field('superhero', requires=IS_NOT_EMPTY()), - Field('realname'), - Field('universe', requires=IS_IN_SET(['DC Comics','Marvel Comics'])), - ) + from pydal.validators import * + from .common import db # controllers definition - @action("index", method=["GET", "POST"]) - @action.uses(db, "form_widgets.html") - def index(id=None): - FormStyleDefault.widgets['universe']=RadioWidget() - form = Form(db.person, id, deletable=False, formstyle=FormStyleDefault) - rows = db(db.person).select() + @action("create_form", method=["GET", "POST"]) + @action.uses("form_widgets.html", db) + def create_form(): + FormStyleDefault.widgets['color']=RadioWidget() + form = Form(db.thing, formstyle=FormStyleDefault) + rows = db(db.thing).select() return dict(form=form, rows=rows) Notice the differences from the 'Basic Form example' we've seen at the beginning of the chapter: - you need to import the widget from the py4web.utils.form library -- before the form definition, you define the ``universe`` field form style with the line: +- before the form definition, you define the ``color`` field form style with the line: .. code:: python - FormStyleDefault.widgets['universe']=RadioWidget() - -You will also need a template file ``templates/form_widgets.html`` that -contains the following code (as the form_basic.html) : - -.. code:: html - -

    Form Widget example: Superhero Identity

    - - [[=form]] - -

    Rows

    - -
      - [[for row in rows:]] -
    • [[=row.id]]: [[=row.superhero]] ([[=row.realname]]) from [[=row.universe]]
    • - [[pass]] -
    + FormStyleDefault.widgets['color']=RadioWidget() The result is the same as before, but now we have a radio button widget instead of the dropdown menu! -.. image:: images/form4.png - - Using widgets in forms is quite easy, and they'll let you have more control on its pieces. +.. important:: + + When using py4web, use py4web widgets, and do not use the pydal widget argument in the Field object + (see :ref:`Field constructor`). Custom widgets ~~~~~~~~~~~~~~ @@ -357,26 +357,11 @@ improving again our Superhero example: .. code:: python - # - # in form_custom_widgets/__init__.py - # - import os - from py4web import action, Field, DAL + # in controllers.py + from py4web import action, redirect, URL, Field from py4web.utils.form import Form, FormStyleDefault, RadioWidget - from pydal.validators import IS_NOT_EMPTY, IS_IN_SET - from yatl.helpers import INPUT, DIV - - # database definition - DB_FOLDER = os.path.join(os.path.dirname(__file__), 'databases') - if not os.path.isdir(DB_FOLDER): - os.mkdir(DB_FOLDER) - db = DAL('sqlite://storage.sqlite', folder=DB_FOLDER) - db.define_table( - 'person', - Field('superhero', requires=IS_NOT_EMPTY()), - Field('realname'), - Field('universe', requires=IS_IN_SET(['DC Comics','Marvel Comics'])), - ) + from pydal.validators import * + from .common import db # custom widget class definition class MyCustomWidget: @@ -395,49 +380,24 @@ improving again our Superhero example: return control # controllers definition - @action("index", method=["GET", "POST"]) - @action.uses(db, "form_custom_widgets.html") - def index(id=None): + @action("create_form", method=["GET", "POST"]) + @action.uses("form_custom_widgets.html", db) + def create_form(): MyStyle = FormStyleDefault MyStyle.classes = FormStyleDefault.classes - MyStyle.widgets['superhero']=MyCustomWidget() - MyStyle.widgets['realname']=MyCustomWidget() - MyStyle.widgets['universe']=RadioWidget() + MyStyle.widgets['name']=MyCustomWidget() + MyStyle.widgets['color']=RadioWidget() - form = Form(db.person, id, deletable=False, formstyle=MyStyle) - rows = db(db.person).select() + form = Form(db.thing, deletable=False, formstyle=MyStyle) + rows = db(db.thing).select() return dict(form=form, rows=rows) - - -You will also need a template file ``templates/form_custom_widgets.html`` that -contains the following code (as the form_basic.html) : - -.. code:: html - -

    Form Custom Widgets example: Superhero Identity

    - - [[=form]] - -

    Rows

    - -
      - [[for row in rows:]] -
    • [[=row.id]]: [[=row.superhero]] ([[=row.realname]]) from [[=row.universe]]
    • - [[pass]] -
    - - - The result is similar to the previous ones, but now we have a custom input field, -with foreground color red and background color black: - -.. image:: images/form5.png +with foreground color red and background color black, Even the radio button widget has changed, from red to blue. - Advanced form design -------------------- @@ -476,6 +436,7 @@ For example you could use it to avoid displaying the ``id`` field while editing .. code:: html + [[extend 'layout.html']] [[=form.custom.begin ]] [[for field in DETAIL_FIELDS: ]] [[ if field not in ['id']: ]] @@ -487,10 +448,6 @@ For example you could use it to avoid displaying the ``id`` field while editing [[=form.custom.submit ]] [[=form.custom.end ]] - -Custom forms are also frequently used for avoiding code redundancy; you can use a single template file for -multiple form types, and programmatically change the fields contained and how to render them. - Note: 'custom' is just a convention, it could be any name that does not clash with already defined objects. .. warning:: @@ -504,6 +461,33 @@ Note: 'custom' is just a convention, it could be any name that does not clash wi your css framework, you'll have to add an outer DIV in order to get select controls to appear correctly. + +You can also be more creative and use your HTML in the template instead of using widgets: + +.. code:: css + + [[extend 'layout.html']] + + [[for field, error form.errors.items:]] +
    Field [[=field]] [[=error]]
    + [[pass]] + + [[=form.custom.begin ]] + +
    + +
    +
    + [[for color in ['red', 'blue', 'green']:]] + + + [[pass]] +
    + + [[=form.custom.end ]] + The sidecar parameter ~~~~~~~~~~~~~~~~~~~~~ @@ -653,7 +637,7 @@ Text format validators ``IS_ALPHANUMERIC`` ^^^^^^^^^^^^^^^^^^^ -This validator checks that a field value contains only characters in the ranges a-z, A-Z, or 0-9. +This validator checks that a field value contains only characters in the ranges a-z, A-Z, 0-9, and underscores. .. code:: python @@ -828,6 +812,19 @@ Examples: prepend_scheme='https') +``IS_SAFE`` +^^^^^^^^^^^ + +.. code:: python + + requires = IS_SAFE(error_message='Unsafe Content') + requires = IS_SAFE(mode="sanitize") + requires = IS_SAFE(sanitizer=lambda text: str(XML(text, sanitize=True))) + +This validators is for text fields that should contain HTML and may contain invalid tags (script, ember, object, iframe). +It works by trying to sanitize the content and either provide an error (mode="error") or replacing the content +with the sanitized one (mode="sanitize"). You can specify the error message, the mode, and provide your own sanitizer. + ``IS_SLUG`` ^^^^^^^^^^^ @@ -1100,7 +1097,7 @@ To force a filled-in form checkbox (such as an acceptance of terms and condition .. code:: python - requires=IS_IN_SET(['on']) + requires=IS_IN_SET(['ON']) Dictionaries and tuples with IS_IN_SET @@ -1131,7 +1128,7 @@ To keep the options alphabetically sorted by their labels into the drop down lis ^^^^^^^^^^^^^^^^^^^^^^^^^ The ``IS_IN_SET`` validator has an optional attribute ``multiple=False``. If set to True, multiple values can be stored in one -field. The field should be of type ``list:integer`` or ``list:string`` as discussed in [[Chapter 6 ../06#list-type-and-contains]]. +field. The field should be of type ``list:integer`` or ``list:string`` as discussed in :ref:`list_type and contains`. An explicit example of tagging is discussed there. We strongly suggest using the jQuery multiselect plugin to render multiple fields. **Note** that when ``multiple=True``, ``IS_IN_SET`` will accept zero or more values, i.e. it will accept the field when nothing has been selected. @@ -1823,19 +1820,14 @@ Here is an example: from py4web.utils.form import Form, FormStyleBulma from pydal.validators import IS_INT_IN_RANGE - def check_nonnegative_quantity(form): - if not form.errors and form.vars['product_quantity'] % 2: - form.errors['product_quantity'] = T('The product quantity must be even') + def custom_check(form): + if not 'name' in form.errors and len(form.vars['name']) < 4 + form.errors['name'] = T("too short") @action('form_example', method=['GET', 'POST']) - @action.uses(session, 'form_example.html') + @action.uses('form_example.html', session) def form_example(): - form = Form([ - Field('product_name'), - Field('product_quantity', 'integer', requires=IS_INT_IN_RANGE(0,100))], - validation=check_nonnegative_quantity, - formstyle=FormStyleBulma) + form = Form(db.thing, validation=custom_check) if form.accepted: - # Do something with form.vars['product_name'] and form.vars['product_quantity'] redirect(URL('index')) return dict(form=form) diff --git a/docs/chapter-13.rst b/docs/chapter-13.rst index 067843111..8b415bee7 100644 --- a/docs/chapter-13.rst +++ b/docs/chapter-13.rst @@ -1,16 +1,32 @@ -================================= -Authentication and Access control -================================= +================================ +Authentication and authorization +================================ -**Warning: the API described in this chapter is new and subject to -changes. Make sure you keep your code up to date** +Strong authentication and authorization methods are +vital for a modern, multiuser web application. +While they are often used interchangeably, authentication and authorization +are separate processes: -py4web comes with a an object Auth and a system of plugins for user -authentication and access control. It has the same name as the +- Authentication confirms that users are who they say they are +- Authorization gives those users permission to access a resource + + +Authentication using Auth +------------------------- + +py4web comes with a an object ``Auth`` and a system of plugins for user +authentication. It has the same name as the corresponding web2py one and serves the same purpose but the API and internal design is very different. -To use it, first of all you need to import it, instantiate it, configure +The _scaffold application provides a guideline for its standard usage. By +default it uses a local SQLite database and allows creating new users, +login and logout. Notice that if you don't configure it, you have to manually +approve new users (by visiting the link logged on the console or +by directly editing the database). + + +To use the Auth object, first of all you need to import it, instantiate it, configure it, and enable it. .. code:: python @@ -25,7 +41,8 @@ operation other than telling the Auth object which session object to use and which database to use. Auth data is stored in ``session['user']`` and, if a user is logged in, the user id is stored in session[‘user’][‘id’]. The db object is used to store persistent info -about the user in a table ``auth_user`` with the following fields: +about the user in a table ``auth_user`` which is created if missing. +The ``auth_user`` table has the following fields: - username - email @@ -36,10 +53,6 @@ about the user in a table ``auth_user`` with the following fields: - action_token (used to verify email, block users, and other tasks, also see later). -If the ``auth_user`` table does not exist it is created. - -The configuration step is optional and discussed later. - The ``auth.enable()`` step creates and exposes the following RESTful APIs: @@ -56,51 +69,65 @@ APIs: Those marked with a (+) require a logged in user. Auth UI -------- +~~~~~~~ You can create your own web UI to login users using the above APIs but py4web provides one as an example, implemented in the following files: - \_scaffold/templates/auth.html -- \_scaffold/static/components/auth.js -- \_scaffold/static/components/auth.html - -The component files (js/html) define a Vue component ```` which -is used in the template file auth.html as follows: - -.. code:: html - - [[extend "layout.html"]] -
    -
    -
    - -
    -
    -
    - [[block page_scripts]] - - - - [[end]] - -You can pretty much use this file un-modified. It extends the current -layout and embeds the ```` component into the page. It then uses -``utils.app().start();`` (py4web magic) to render the content of -``
    ...
    `` using Vue.js. ``components/auth.js`` also -automatically loads ``components/auth.html`` into the component -placeholder (more py4web magic). The component is responsible for -rendering the login/register/etc forms using reactive html and -GETing/POSTing data to the Auth service APIs. - -If you need to change the style of the component you can edit -“components/auth.html” to suit your needs. It is mostly HTML with some -special Vue ``v-*`` tags. - -Using Auth ----------- - -There two ways to use the Auth object in an action: +- \_scaffold/templates/layout.html + + +The key section is in ``layout.html`` where (using the no.css framework) the menu actions are defined: + +.. code-block:: html + :linenos: + + + + +The menu is dynamic: on line 2 there is a check if the user is already defined +(i.e. if the user has already logged on). In this case the email is shown in the +top menu, plus the menu options ``Edit Profile``, ``Change Password`` (optional) and +``Logout``. +Instead, if the user is not already logged on, from line 15 there are +only the corresponding menu options allowed: ``Sign up`` and ``Log in``. + +Every menu option then redirects the user to the corresponding standard URL, +which in turn activates the Auth action. + + +Using Auth inside actions +~~~~~~~~~~~~~~~~~~~~~~~~~ + +There two ways to use the Auth object in an action. + +The first one does not force a login. With ``@action.uses(auth)`` +we tell py4web that this action should have information about the user, +trying to parse the session for a user session. .. code:: python @@ -110,9 +137,7 @@ There two ways to use the Auth object in an action: user = auth.get_user() return 'hello {first_name}'.format(**user) if user else 'not logged in' -With ``@action.uses(auth)`` we tell py4web that this action needs to -have information about the user, then try to parse the session for a -user session. +The second one forces the login if needed: .. code:: python @@ -120,13 +145,171 @@ user session. @action.uses(auth.user) def index(): user = auth.get_user() - return 'hello {first_name}'.format(**user)' + return 'hello {first_name}'.format(**user) Here ``@action.uses(auth.user)`` tells py4web that this action requires a logged in user and should redirect to login if no user is logged in. +Two Factor Authentication +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Two factor authentication (or Two-step verification) is a way of improving authentication security. +When activated an extra step is added in the login process. In the first step, users are shown the +standard username/password form. If they successfully pass this challenge by submitting the correct +username and password, and two factor authentication is enabled for the user, the server will +present a second form before logging them in. + +There are a few Auth settings available to control how two factor authentication works. + +The following can be specified on Auth instantiation: + +- ``two_factor_required`` +- ``two_factor_send`` +- ``two_factor_validate`` + +two_factor_required +^^^^^^^^^^^^^^^^^^^ + +When you pass a method name to the ``two_factor_required`` parameter you are telling py4web to call +that method to determine whether or not this login should be use or bypass two factor authentication. +If your method returns True, then this login requires two factor. If it returns False, two factor authentication +is bypassed for this login. + +Sample ``two_factor_required`` method + +This example shows how to allow users that are on a specific network. + +.. code:: python + + def user_outside_network(user, request): + import ipaddress + + networks = ["10.10.0.0/22"] + + ip_list = [] + for range in networks: + ip_list.extend(ipaddress.IPv4Network(range)) + + if ipaddress.IPv4Address(request.remote_addr) in ip_list: + # if the client address is in the network address list, then do NOT require MFA + return False + + return True + +two_factor_send +^^^^^^^^^^^^^^^ + +When two factor authentication is active, py4web can generate a 6 digit code (using random.randint) and +makes it possible to send it to the user. How this code is sent, is up to you. The ``two_factor_send`` +argument to the Auth class allows you to specify the method that sends the two factor code to the user. + +This example shows how to send an email with the two factor code: + +.. code:: python + + def send_two_factor_email(user, code): + try: + auth.sender.send( + to=[user.email], + subject=f"Two factor login verification code", + body=f"You're verification code is {code}", + sender="from_address@youremail.com", + ) + except Exception as e: + print(e) + return code + +Notice that this method takes two arguments: the current user, and the code to be sent. +Also notice this method can override the code and return a new one. + +.. code:: python + + auth.param.two_factor_required = user_outside_network + auth.param.two_factor_send = send_two_factor_email + +two_factor_validate +^^^^^^^^^^^^^^^^^^^ + +By default, py4web will validate the user input in the two factor form by comparing the code entered +by the user with the code generated and sent using ``two_factor_send``. However, sometimes it may be +useful to define a custom validation of this user-entered code. For instance, if one would like to use the +TOTP (or the Time-Based One-Time-Passwords) as the two factor authentication method, the validation +requires comparing the code entered by the user with the value generated at the same time at the server side. +Hence, it is not sufficient to generate that value earlier when showing the form (using for instance +``two_factor_send`` method), because by the time the user submits the form, the current valid value may +already be different. Instead, this value should be +generated when validating the form submitted by the user. + +To accomplish such custom validation, the ``two_factor_validate`` method is available. It takes two arguments: + + - the current user + - the code that was entered by the user into the two factor authentication form + +The primary use-case for this method is validation of time-based passwords. + +This example shows how to validate a time-based two factor code: + +.. code:: python + + def validate_code(user, code): + try: + # get the correct code from an external function + correct_code = generate_time_based_code(user_id) + except Exception as e: + # return None to indicate that validation could not be performed + return None + + # compare the value entered in the auth form with the correct code + if code == correct_code: + return True + else: + return False + +The ``validate_code`` method must return one of three values: + +- ``True`` - if the validation succeeded, +- ``False`` - if the validation failed, +- ``None`` - if the validation was not possible for any reason + +Notice that - if defined - this method is _always_ called to validate the two factor +authentication form. It is up to you to decide what kind of validation it does. If the returned value is ``True``, +the user input will be accepted as valid. If the returned value is ``False`` then the user input will be +rejected as invalid, number of tries will be decreased by one, and user will be asked to try again. +If the returned value is ``None`` the user input will be checked against the code generated with the use +of ``two_factor_send`` method and the final result will depend on that comparison. In this case authentication +will fail if ``two_factor_send`` method was not defined, and hence no code was sent to the user. + +.. code:: python + + auth.param.two_factor_validate = validate_code + +two_factor_tries +^^^^^^^^^^^^^^^^ + +By default, the user has 3 attempts to pass two factor authentication. You can override this after using: + +.. code:: python + + auth.param.two_factor_tries = 5 + +Once this is all setup, the flow for two factor authentication is: + +- present the login page +- upon successful login and user passes two_factor_required + - redirect to py4web auth/two_factor endpoint + - if ``two_factor_send`` method has been defined: + - generate 6 digit verification code + - call ``two_factor_send`` to send the verification code to the user + - display verification page where user can enter their code + - if ``two_factor_validate`` method has been defined - call it to validate the user-entered code + - upon successful verification, take user to _next_url that was passed to the login page + +Important! If you filtered ``ALLOWED_ACTIONS`` in your app, make sure to whitelist the "two_factor" action +so not to block the two factor API. + + Auth Plugins ------------- +~~~~~~~~~~~~ Plugins are defined in “py4web/utils/auth_plugins” and they have a hierarchical structure. Some are exclusive and some are not. For example, @@ -138,12 +321,11 @@ UI). The ```` components will automatically adapt to display login forms as required by the installed plugins. -**At this time we cannot guarantee that the following plugins work well. -They have been ported from web2py where they do work but testing is -still needed** +In the _scaffold/settings.py and _scaffold/common.py files you can see +the default settings for the supported plugins. PAM -~~~ +^^^ Configuring PAM is the easiest: @@ -152,17 +334,24 @@ Configuring PAM is the easiest: from py4web.utils.auth_plugins.pam_plugin import PamPlugin auth.register_plugin(PamPlugin()) -This one like all plugins must be imported and registered. Once -registered the UI (components/auth) and the RESTful APIs know how to -handle it. The constructor of this plugins does not require any +This one like all plugins must be imported and registered. +The constructor of this plugins does not require any arguments (where other plugins do). The ``auth.register_plugin(...)`` **must** come before the ``auth.enable()`` since it makes no sense to expose APIs before desired plugins are mounted. +.. note:: + + by design PAM authentication using local users works fine only if py4web is run by root. + Otherwise you can only authenticate the specific user that runs the py4web process. + + LDAP -~~~~ +^^^^ + +This is a common authentication method, especially using Microsoft Active Directory in enterprises. .. code:: python @@ -170,12 +359,18 @@ LDAP LDAP_SETTING = { 'mode': 'ad', 'server': 'my.domain.controller', - 'base_dn': 'ou=Users,dc=domain,dc=com' + 'base_dn': 'cn=Users,dc=domain,dc=com' } auth.register_plugin(LDAPPlugin(**LDAP_SETTINGS)) -OAuth2 with Google (tested OK) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. warning:: + + it needs the python-ldap module. On Ubuntu, you should also install some developer's libraries + in advance with ``sudo apt-get install libldap2-dev libsasl2-dev``. + + +OAuth2 with Google +^^^^^^^^^^^^^^^^^^ .. code:: python @@ -187,8 +382,8 @@ OAuth2 with Google (tested OK) The client id and client secret must be provided by Google. -OAuth2 with Facebook (tested OK) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +OAuth2 with Facebook +^^^^^^^^^^^^^^^^^^^^ .. code:: python @@ -201,7 +396,7 @@ OAuth2 with Facebook (tested OK) The client id and client secret must be provided by Facebook. OAuth2 with Discord -~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^ .. code:: python @@ -219,24 +414,207 @@ You will also have to register your OAuth2 redirect URI in your created applicat As Discord users have no concept of first/last name, the user in the auth table will contain the Discord username as the first name and discriminator as the last name. +Auth API Plugins +~~~~~~~~~~~~~~~~ + +There are two types of web APIs, those called by the browser for example by a single page web app, +and those designed to be called by a different kind of program. Both of them may need tosupport +authentication. The distintion is important because, in the case of the browser, there is no need +to manage any authentication token as the browser already provides cookies and py4web uses +cookies to handle seesions. If the user operating the browser is logged-in, when an API is called, +the corresponding action already knows who the user is. No additional logic is necessary. +In this case there there is no need for any kind of additional API token which would only diminuish +the security provided by the cookie based session token. + +When the API is to be accessed by a different program (for example a script) the story is different. +There is no session and we do not want to ask the user for the password every time. +The standard way to authenticate in this case is by issuing the user an API token, aka a string, +which, when presented along with API request allows py4web to recognize the identity of the caller. +This is also referred to as "Authentication bearer". + +Py4web provides a plugin system that gives you a lot of flexibility but it also provides +two practical plugins that are sufficient in most cases. The two plugins are called: +SimpleTokenPlugin and JwtTokenPlugin. The first one of the two is recommended in most of the cases. + +What all plugins have in common: +- They have a way for a user to create a token which is a string. +- When an HTTP(S) request is made to an action that @actiion.uses(auth) or @action.uses(auth.user) + py4web will identify the user if the token is present, as if the user was logged-in. + +What SimpleTokenPlugin and JwtTokenPlugin have in common: +- When an HTTP(S) request is made, the token must be put in the "Authentication" header. + You will need to create your own plugin if you want to pass it in some other manner. +- Each user can create as many tokens as desired. +- Users can create tokens for other users if the application logic requires/allows it. + +Unique features of SimpleTokenPlugin: +- A token is a UUID. +- Tokens can be managed serverside (created, deleted, expired, change expiration). +- Current tokens are stored in a adatabase table. +- The default table associates token with the owner and a textual description. + Users can nevertheless provide their own table and add any desired metadata to tokens + which the app can retrieve to distinguish different tokens from the same user. + This is done by adding fields to the table. +- Under the hood veryfing a token requires a database query. + +Unique features of JwtTokenPlugin: +- The token is an encrypted and digitally signed dict that stores the user_id and expiration. +- The author of the token can add any metadata to into the token at creation. +- The token is not stored anywhere serverside and there is no database table. +- Tokens can be created (and there is a function to do so) but they cannot be managed. + The server cannot expire tokens or change expiration. This would require the tokens + to validated against a database and that is exactely when the JwtTokenPlugin tries to avoid. +- The only way to expire a token is by changing the serverside secret using for validation + so when a token is expired, all tokens are expired. + +SimpleTokenPlugin are the recommended kind of tokens for most applications. +JwtTokenPlugin are valuable when the expiration is short and known in advance and when +avoiding a database lookup is very important, such as for actions that are very fast +and one is willing to sacrifice a bit of security (serverside token expiration capability) +in order to avoid database access. + +Example of SimpleTokenPlugin +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In common.py: + +.. code:: python + + from py4web.utils.auth import SimpleTokenPlugin + simple_token_plugin = SimpleTokenPlugin(auth) + auth.token_plugins.append(simple_token_plugin) + +You can optionally a ``table=db.mytable`` to a custom table. Otherwise it will create and use +one called "auth_simple_token". + +In controllers.py + +.. code:: python + + @action("test_api") + @action.uses(auth.user) + def test_api(): + return {"hello": "world"} + +Users can access this action if via a browser if they are logged in, without the token, of via API by providing a token. + +.. code:: bash + + curl http://127.0.0.1:8000/test1/test_api -H "Authorization: Bearer {token}" + +In order to create and manage tokens you can use a grid. In controllers.py + +.. code:: python + + @action("tokens/") + @action.uses("generic.html", auth.user) + def _(path): + db.auth_simple_token.user_id.default = auth.user_id + grid = Grid(path, db.auth_simple_token.user_id==auth.user_id, create=True, deletable=True) + return dict(grid=grid) + + +Example of JwtTokenPlugin +^^^^^^^^^^^^^^^^^^^^^^^^^ + +In common.py: + +.. code:: python + + from py4web.utils.auth import SimpleTokenPlugin + jwt_token_plugin = JwtTokenPlugin(auth) + auth.token_plugins.append(jwt_token_plugin) + + +In controllers.py it works the same as SimpleTokenPlugin: + +.. code:: python + + @action("test_api") + @action.uses(auth.user) + def test_api(): + return {"hello": "world"} + +The token is also passed using the same header as in the previous example: + +.. code:: bash + + curl http://127.0.0.1:8000/test1/test_api -H "Authorization: Bearer {token}" + +While you cannot manage tokens you still need a way to create them. You can create an +action for example that, when called, gives you a new token. In controllers.py + +.. code:: python + + @action("make_token") + @action.uses("generic.html", auth.user) + def make_token(): + return dict(token=jwt_token_plugin.make( + auth.current_user, + expiration=utcnow()+datetime.timedelta(days=10))) + +Example of custom Token Plugin +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A token plugin is just a class that, given a request, returns an associated user. +For example here is a dumb and UNSAFE plugin that authorizes everybody as user 1 as long as +the "Authentication" header is provided. + +from py4web import request + +.. code:: python + + class MyCustomTokenPlugin: + def get_user(self): + authorization = request.headers.get("Authentication") + if authorization: + return db.auth_user(1) + return None + + auth.token_plugins.append(MyCustomTokenPlugin()) + + +Authorization using Tags +------------------------ + +As already mentioned, authorization is the process of verifying what specific +applications, files, and data a user has access to. This is accomplished +in py4web using ``Tags``, that we've already discovered on :ref:`Tagging records` +in the DAL chapter. + + Tags and Permissions --------------------- +~~~~~~~~~~~~~~~~~~~~ -Py4web does not have the concept of groups as web2py does. Experience -showed that while that mechanism is powerful it suffers from two -problems: it is overkill for most apps, and it is not flexible enough -for very complex apps. Py4web provides a general purpose tagging +Py4web provides a general purpose tagging mechanism that allows the developer to tag any record of any table, check for the existence of tags, as well as checking for records containing a tag. Group membership can be thought of a type of tag that -we apply to users. Permissions can also be tags. Developer are free to +we apply to users. Permissions can also be tags. Developers are free to create their own logic on top of the tagging system. -To use the tagging system you need to create an object to tag a table: +.. note:: + + Py4web does not have the concept of groups as web2py does. Experience + showed that while that mechanism is powerful it suffers from two + problems: it is overkill for most apps, and it is not flexible enough + for very complex apps. + +To use the tagging system you first need to import the Tags module +from ``pydal.tools``. Then create a Tags object to tag a table: .. code:: python - groups = Tags(db.auth_user) + from pydal.tools.tags import Tags + groups = Tags(db.auth_user, 'groups') + +The tail_name parameter is optional and if not specified the 'default' +value will be used. If you look at the database level, a new table will +be created with a name equals to ``tagged_db + '_tag_' + tail_name``, +in this case ``auth_user_tag_groups``: + +.. image:: images/tags_db.png + Then you can add one or more tags to records of the table as well as remove existing tags: @@ -247,10 +625,19 @@ remove existing tags: groups.add(user.id, ['dancer', 'teacher']) groups.remove(user.id, 'dancer') -Here the use case is group based access control where the developer +On the ``auth_user_tagged_groups`` this will produce two records +with different groups assigned to the same user.id (the "Record ID" field): + +.. image:: images/tags2.png + +Slashes at the +beginning or the end of a tag are optional. All other chars are allowed +on equal footing. + +A common use case is **group based access control**. Here the developer first checks if a user is a member of the ``'manager'`` group, if the user is not a manager (or no one is logged in) py4web redirects to the -``'not authorized url'``. If the user is in the correct group then +``'not authorized url'``. Else the user is in the correct group and then py4web displays ‘hello manager’: .. code:: python @@ -273,6 +660,27 @@ tag(s): users = db(groups.find([group_name])).select(orderby=db.auth_user.first_name | db.auth_user.last_name) return {'users': users} +We've already seen a simple ``requires_membership`` fixture on :ref:``The Condition fixture``. It +enables the following syntax: + +.. code:: python + + groups = Tags(db.auth_user) + + class requires_membership(Fixture): + def __init__(self, group): + self.__prerequisites__ = [auth.user] # you must have a user before you can check + self.group = group # store the group when action defined + def on_request(self, context): # will be called if the action is called + if self.group not in groups.get(auth.user_id): + raise HTTP(401) # check and do something + + @action('index') + @action.uses(requires_membership('teacher')) + def index(): + return 'hello teacher' + + We leave it to you as an exercise to create a fixture ``has_membership`` to enable the following syntax: @@ -291,29 +699,31 @@ following searches will return the user: - ``groups.find('teacher/high-school')`` - ``groups.find('teacher')`` -This means that slashes have a special meaning for tags. Slashes at the -beginning or the end of a tag are optional. All other chars are allowed -on equal footing. +This means that slashes have a special meaning for tags. -Notice that one table can have multiple associated ``Tags`` objects. The -name groups here is completely arbitrary but has a specific semantic -meaning. Different ``Tags`` objects are orthogonal to each other. The -limit to their use is your creativity. +Multiple Tags objects +~~~~~~~~~~~~~~~~~~~~~ -For example you could create a table groups: +.. note:: + One table can have multiple associated ``Tags`` objects. The + name 'groups' here is completely arbitrary but has a specific semantic + meaning. Different ``Tags`` objects are independent to each other. The + limit to their use is your creativity. + +For example you could create a table ``auth_group``: .. code:: python db.define_table('auth_group', Field('name'), Field('description')) -and to Tags: +and two Tags attached to it: .. code:: python groups = Tags(db.auth_user) permissions = Tags(db.auth_groups) -Then create a zapper group, give it a permission, and make a user member +Then create a 'zapper' record in ``auth_group``, give it a permission, and make a user member of the group: .. code:: python @@ -343,3 +753,29 @@ Notice here ``permissions.find(permission)`` generates a query for all groups with the permission and we further filter those groups for those the current user is member of. We count them and if we find any, then the user has the permission. + +User Impersonation +~~~~~~~~~~~~~~~~~~ + +Auth provides API that allow you to impersonate another user. +Here is an example of an action to start impersonating and stop impersonating another user. + +.. code:: python + + @action("impersonate/{user_id:int}", method="GET") + @action.uses(auth.user) + def start_impersonating(user_id): + if (not auth.is_impersonating() and + user_id and + user_id != auth.user_id and + db(db.auth_user.id==user_id).count()): + auth.start_impersonating(user_id, URL("index")) + raise HTTP(404) + + @action("stop_impersonating", method="GET") + @action.uses(auth) + def stop_impersonating(): + if auth and auth.is_impersonating(): + auth.stop_impersonating(URL("index")) + redirect(URL("index")) + diff --git a/docs/chapter-14.rst b/docs/chapter-14.rst index b4f0a95c1..e9bdd0a5b 100644 --- a/docs/chapter-14.rst +++ b/docs/chapter-14.rst @@ -2,110 +2,242 @@ Grid ==== -py4web comes with a Grid object providing grid and CRUD capabilities. +py4web comes with a Grid object providing grid and CRUD (create, update and delete) capabilities. +This allows you to quickly and safely provide an interface to your data. Since it's also +highly customizable, it's the corner stone of most py4web's applications. -Key Features + +Key features ------------ +- Full CRUD with Delete Confirmation - Click column heads for sorting - click again for DESC - Pagination control - Built in Search (can use search_queries OR search_form) - Action Buttons - with or without text -- Full CRUD with Delete Confirmation - Pre and Post Action (add your own buttons to each row) - Grid dates in local format - Default formatting by type plus user overrides -Basic Example -------------- +.. Hint:: -In this simple example we will make a grid over the company table. + There is an excellent grid tutorial made by Jim Steil on https://github.com/jpsteil/grid_tutorial. + You're strongly advised to check it for any doubt and for finding many precious examples, + hints & tips. -controllers.py -.. code:: python +Basic grid example +------------------ - from functools import reduce - from py4web.utils.grid import Grid - from py4web import action - from .common import db, session, auth +In this simple example we will make a grid over the superhero table. - @action('companies', method=['POST', 'GET']) - @action('companies/', method=['POST', 'GET']) - @action.uses(session, db, auth, 'grid.html') - def companies(path=None): - grid = Grid(path, - query=(db.company.id > 0), - orderby=[db.company.name], - search_queries=[['Search by Name', lambda val: db.company.name.contains(val)]]) +Create a new minimal app called ``grid``. Change it with the following content. - return dict(grid=grid) +.. code:: python -grid.html + # in grid/__init__.py + import os + from py4web import action, Field, DAL + from py4web.utils.grid import * + from py4web.utils.form import * + from yatl.helpers import A + + + # database definition + DB_FOLDER = os.path.join(os.path.dirname(__file__), 'databases') + if not os.path.isdir(DB_FOLDER): + os.mkdir(DB_FOLDER) + db = DAL('sqlite://storage.sqlite', folder=DB_FOLDER) + db.define_table( + 'person', + Field('superhero'), + Field('name'), + Field('job')) + + # add example entries in db + if not db(db.person).count(): + db.person.insert(superhero='Superman', name='Clark Kent', job='Journalist') + db.person.insert(superhero='Spiderman', name='Peter Park', job='Photographer') + db.person.insert(superhero='Batman', name='Bruce Wayne', job='CEO') + db.commit() + + @action('index', method=['POST', 'GET']) + @action('index/', method=['POST', 'GET']) + @action.uses('grid.html', db) + def index(path=None): + grid = Grid(path, + formstyle=FormStyleDefault, # FormStyleDefault, FormStyleBulma, FormStyleBootstrap4, or FormStyleBootstrap5 + grid_class_style=GridClassStyle, # GridClassStyle or GridClassStyleBulma or GridClassStyleBootstrap5 + icon_style=IconStyleFontawesome, # IconStyle, IconStyleFontawesome, or IconStyleBootstrapIcons + query=(db.person.id > 0), + orderby=[db.person.name], + search_queries=[['Search by Name', lambda val: db.person.name.contains(val)]]) + + return dict(grid=grid) + +Add a new file templates/grid.html with this basic content: :: - [[extend 'layout.html']] [[=grid.render()]] -Signature ---------- +Then restart py4web. If you browse to http://127.0.0.1:8000/grid/index you'll get this +result: + +.. image:: images/grid.png + + +Its layout is quite minimal, but it's perfectly usable. + +The main problem is that by default the **no.css** stylesheet is used, see +`here `__. But we've not loaded it! +Change the file templates/grid.html with this content: + +:: + + + + + + + + [[=grid.render()]] + + + + + +Then refresh the page. + + +.. image:: images/grid_nocss.png + + +This is better now, with proper icons for Details, Edit and Delete actions. + +We can also think about using the **bulma.css**, +see `here `__. In this case you need to change +the grid object on __init__.py to: + +.. code:: python + + + formstyle=FormStyleBulma, # FormStyleDefault or FormStyleBulma,FormStyleBootstrap4, or FormStyleBootstrap5 + grid_class_style=GridClassStyleBulma, # GridClassStyle or GridClassStyleBulma or GridClassStyleBootstrap5 + +Notice that in this case you need to import the corresponding python modules in advance +(we've already done it on line 4 and 5 above). If you use the default no.css style instead, +you don't need to manually import its style modules (and you even don't need the formstyle +and grid_class_style parameters). + +You also have to change the file templates/grid.html with this content: + +:: + + + + + + + + [[=grid.render()]] + + + +Then refresh the page. + +.. image:: images/grid_bulmacss.png + + +This is much better, isn't it? + +Bootstrap4 and Bootstrap5 also have styles available, and you can change the icon style between +Fontawesome, Bootstrap Icons, and a basic IconStyle you can write your own CSS for. More info in +the section: :ref:`Customizing style` + + +.. Note:: + These are just minimal examples for showing how ``grid`` works internally. + Normally you should start from a copy of the standard ``_scaffold`` app, with all + the Session and Authentication stuff already defined. Also, you should + follow the standard rules for code, like placing the db definition inside + models.py and so on. + Using standards will make your code simpler, safer and more maintainable. + + Also, do not use grid objects directly on the root action of an app, because + it does not add the 'index' route. So, in this example if you browse to + http://127.0.0.1:8000/grid the main page is displayed fine but any contained + action will lead to a non existent page. + +In the :ref:`Advanced topics and examples` chapter you can find +more examples, including a master/detail grid example written with **htmx**. +And don't forget Jim Steil's detailed tutorial on https://github.com/jpsteil/grid_tutorial. + + +The Grid object +--------------- .. code:: python class Grid: - def __init__( - self, - path, - query, - search_form=None, - search_queries=None, - columns=None, - show_id=False, - orderby=None, - left=None, - headings=None, - create=True, - details=True, - editable=True, - deletable=True, - pre_action_buttons=None, - post_action_buttons=None, - auto_process=True, - rows_per_page=15, - include_action_button_text=True, - search_button_text="Filter", - formstyle=FormStyleDefault, - grid_class_style=GridClassStyle, - ): + def __init__( + self, + path, + query, + search_form=None, + search_queries=None, + columns=None, + field_id=None, + show_id=False, + orderby=None, + left=None, + headings=None, + create=True, + details=True, + editable=True, + deletable=True, + validation=None, + pre_action_buttons=None, + post_action_buttons=None, + auto_process=True, + rows_per_page=15, + include_action_button_text=True, + search_button_text="Filter", + formstyle=FormStyleDefault, + grid_class_style=GridClassStyle, + icon_style=IconStyleFontawsome, + T=lambda text: text, + ): - path: the route of this request - query: pydal query to be processed - search_form: py4web FORM to be included as the search form. If search_form is passed in then the developer is responsible for applying the filter to the query passed in. This differs from - search_queries. + search_queries - search_queries: list of query lists to use to build the search form. - Ignored if search_form is used. Format is -- columns: list of fields or columns to display on the list page, - if blank, the table will use all readable fields of the searched table + Ignored if search_form is used +- columns: list of fields or columns to display on the list page, + see the :ref:`Custom columns` paragraph later. + If blank, the table will use all readable fields of the searched table - show_id: show the record id field on list page - default = False - orderby: pydal orderby field or list of fields - left: if joining other tables, specify the pydal left expression here - headings: list of headings to be used for list page - if not provided use the field label -- details: URL to redirect to for displaying records - set to True to - automatically generate the URL - set to False to not display the - button - create: URL to redirect to for creating records - set to True to automatically generate the URL - set to False to not display the button +- details: URL to redirect to for displaying records - set to True to + automatically generate the URL - set to False to not display the + button (*) - editable: URL to redirect to for editing records - set to True to automatically generate the URL - set to False to not display the - button + button (*) - deletable: URL to redirect to for deleting records - set to True to automatically generate the URL - set to False to not display the - button + button (*) +- validation: optional validation function to pass to create and edit forms - pre_action_buttons: list of action_button instances to include before the standard action buttons - post_action_buttons: list of action_button instances to include after @@ -120,14 +252,31 @@ Signature search form - formstyle: py4web Form formstyle used to style your form when automatically building CRUD forms -- grid_class_style: GridClassStyle object used to override defaults for +- grid_class_style: GridClassStyle class used to override defaults for styling your rendered grid. Allows you to specify classes or styles - to apply at certain points in the grid. + to apply at certain points in the grid +- icon_style: default: IconStyleFontawsome. used to get icon css classes. + Other options: IconStyle, IconStyleBootstrapIcons +- T: optional pluralize object -Searching / Filtering ---------------------- +(*) The parameters ``details``, ``editable`` and ``deletable`` can also take a **callable** that will +be passed the current row of the grid. This is useful because you can then turn a button on or off +depending on the values in the row. In other words, +instead of providing a simple Boolean value you can use an expression like: -There are two ways to build a search form. + +.. code:: python + + deletable=lambda row: False if row.job=="CEO" else True, + + +See also :ref:`Using callable parameters` later on. + + +Searching and filtering +~~~~~~~~~~~~~~~~~~~~~~~ + +There are two ways to build a search form: - Provide a search_queries list - Build your own custom search form @@ -143,12 +292,11 @@ However, if this doesn’t give you enough flexibility you can provide your own search form and handle all the filtering (building the queries) by yourself. -CRUD ----- +CRUD settings +~~~~~~~~~~~~~ The grid provides CRUD (create, read, update and delete) capabilities utilizing py4web Form. - You can turn off CRUD features by setting create/details/editable/deletable during grid instantiation. @@ -156,29 +304,46 @@ Additionally, you can provide a separate URL to the create/details/editable/deletable parameters to bypass the auto-generated CRUD pages and handle the detail pages yourself. -Custom Columns +Custom columns -------------- If the grid does not involve a join but displays results from a single table -you can specify a list of columns and columns are highly customizable. +you can specify a list of columns. Columns are highly customizable. .. code:: python from py4web.utils.grid import Column - from yatl helpers import A + from yatl.helpers import A columns = [ - db.company.id, - db.company.name, - Column("Web Site", lambda row: f"https://{row.name}.com"), - Column("Go To", lambda row: A("link", _href=f"https://{row.name}.com")) + db.person.id, + db.person.superhero, + db.person.name, + db.person.job, + Column("Web Site", lambda row: f"https://{row.superhero}.com"), + Column("Go To", lambda row: A("link", _href=f"https://{row.superhero}.com")) ] grid = Grid(... columns=columns ...) -Notice in this example the first two columns are regular fields, -The third column has a header "Web Site" and consists of URL strings generated from the rows. -The fourth column has a header "Go To" and generates actual clickable links using the ``A`` helper. +Notice in this example the first columns are regular fields, +The fifth column has a header "Web Site" and consists of URL strings generated from the rows. +The last column has a header "Go To" and generates actual clickable links using the ``A`` helper. +This is the result: + +.. image:: images/grid_columns.png + +Notice that we've also used the ``deletable`` parameter in order to disable and hide it for +Batman only, as explained before. + +.. Warning:: + + Do not define columns outside of the controller methods that use them, otherwise the + structure of the table will change every time the user press the refresh button of the browser! + + The reason is that each time the grid displays, + it modifies the 'columns' variable (in the grid) by adding the action buttons to it. So, if columns are + defined outside of the controller method, it just keeps adding the actions column. Using templates @@ -192,8 +357,8 @@ Display the grid or a CRUD Form [[=grid.render()]] -To allow for customizing CRUD form layout (like with web2py) you can use -the following +You can customize the CRUD form layout like a normal form (see :ref:`Custom forms`). So you can use +the following structure: :: @@ -203,12 +368,13 @@ the following [[form.custom["submit"] [[form.custom["end"] -When handling custom form layouts you need to know if you are displaying -the grid or a form. Use the following to decide + +But notice that when handling custom form layouts you need to know if you are displaying +the grid or a form. Use the following to decide: :: - [[if request.query.get('action') in ('details', 'edit'):]] + [[if grid.action in ['details', 'edit']: ]] # Display the custom form [[form = grid.render() ]] [[form.custom["begin"] ]] @@ -219,7 +385,8 @@ the grid or a form. Use the following to decide [[grid.render() ]] [[pass]] -Customizing Style + +Customizing style ----------------- You can provide your own formstyle or grid classes and style to grid. @@ -228,229 +395,163 @@ You can provide your own formstyle or grid classes and style to grid. forms. - grid_class_style is a class that provides the classes and/or styles used for certain portions of the grid. +- icon_style is a class which provides the icon classes, for example for FontAwesome -The default GridClassStyle - based on no.css, primarily uses styles to -modify the layout of the grid - -.. code:: python - - class GridClassStyle: - - """ - Default grid style - Internal element names match default class name, other classes can be added - Style use should be minimized since it cannot be overridden by CSS - """ - - classes = { - "grid-wrapper": "grid-wrapper", - "grid-header": "grid-header", - "grid-new-button": "grid-new-button info", - "grid-search": "grid-search", - "grid-table-wrapper": "grid-table-wrapper", - "grid-table": "grid-table", - "grid-sorter-icon-up": "grid-sort-icon-up fas fa-sort-up", - "grid-sorter-icon-down": "grid-sort-icon-down fas fa-sort-down", - "grid-th-action-button": "grid-col-action-button", - "grid-td-action-button": "grid-col-action-button", - "grid-tr": "", - "grid-th": "", - "grid-td": "", - "grid-details-button": "grid-details-button info", - "grid-edit-button": "grid-edit-button info", - "grid-delete-button": "grid-delete-button info", - "grid-footer": "grid-footer", - "grid-info": "grid-info", - "grid-pagination": "grid-pagination", - "grid-pagination-button": "grid-pagination-button info", - "grid-pagination-button-current": "grid-pagination-button-current default", - "grid-cell-type-string": "grid-cell-type-string", - "grid-cell-type-text": "grid-cell-type-text", - "grid-cell-type-boolean": "grid-cell-type-boolean", - "grid-cell-type-float": "grid-cell-type-float", - "grid-cell-type-int": "grid-cell-type-int", - "grid-cell-type-date": "grid-cell-type-date", - "grid-cell-type-time": "grid-cell-type-time", - "grid-cell-type-datetime": "grid-cell-type-datetime", - "grid-cell-type-upload": "grid-cell-type-upload", - "grid-cell-type-list": "grid-cell-type-list", - # specific for custom form - "search_form": "search-form", - "search_form_table": "search-form-table", - "search_form_tr": "search-form-tr", - "search_form_td": "search-form-td", - } - - styles = { - "grid-wrapper": "", - "grid-header": "display: table; width: 100%", - "grid-new-button": "display: table-cell;", - "grid-search": "display: table-cell; float:right", - "grid-table-wrapper": "overflow-x: auto; width:100%", - "grid-table": "", - "grid-sorter-icon-up": "", - "grid-sorter-icon-down": "", - "grid-th-action-button": "", - "grid-td-action-button": "", - "grid-tr": "", - "grid-th": "white-space: nowrap; vertical-align: middle", - "grid-td": "white-space: nowrap; vertical-align: middle", - "grid-details-button": "margin-bottom: 0", - "grid-edit-button": "margin-bottom: 0", - "grid-delete-button": "margin-bottom: 0", - "grid-footer": "display: table; width:100%", - "grid-info": "display: table-cell;", - "grid-pagination": "display: table-cell; text-align:right", - "grid-pagination-button": "min-width: 20px", - "grid-pagination-button-current": "min-width: 20px; pointer-events:none; opacity: 0.7", - "grid-cell-type-string": "white-space: nowrap; vertical-align: middle; text-align: left; text-overflow: ellipsis; max-width: 200px", - "grid-cell-type-text": "vertical-align: middle; text-align: left; text-overflow: ellipsis; max-width: 200px", - "grid-cell-type-boolean": "white-space: nowrap; vertical-align: middle; text-align: center", - "grid-cell-type-float": "white-space: nowrap; vertical-align: middle; text-align: right", - "grid-cell-type-int": "white-space: nowrap; vertical-align: middle; text-align: right", - "grid-cell-type-date": "white-space: nowrap; vertical-align: middle; text-align: right", - "grid-cell-type-time": "white-space: nowrap; vertical-align: middle; text-align: right", - "grid-cell-type-datetime": "white-space: nowrap; vertical-align: middle; text-align: right", - "grid-cell-type-upload": "white-space: nowrap; vertical-align: middle; text-align: center", - "grid-cell-type-list": "white-space: nowrap; vertical-align: middle; text-align: left", - # specific for custom form - "search_form": "", - "search_form_table": "", - "search_form_tr": "", - "search_form_td": "", - } - - @classmethod - def get(cls, element): - """returns a dict with _class and _style for the element name""" - return { - "_class": cls.classes.get(element), - "_style": cls.styles.get(element), - } - -GridClassStyleBulma - bulma implementation - -.. code:: python +The default ``GridClassStyle`` - based on **no.css**, primarily uses styles to +modify the layout of the grid. We've already seen that it's possible +to use other class_style, in particular ``GridClassStyleBulma`` or ``GridClassStyleBootstrap5``. - class GridClassStyleBulma(GridClassStyle): - classes = { - "grid-wrapper": "grid-wrapper field", - "grid-header": "grid-header pb-2", - "grid-new-button": "grid-new-button button", - "grid-search": "grid-search is-pulled-right pb-2", - "grid-table-wrapper": "grid-table-wrapper table_wrapper", - "grid-table": "grid-table table is-bordered is-striped is-hoverable is-fullwidth", - "grid-sorter-icon-up": "grid-sort-icon-up fas fa-sort-up is-pulled-right", - "grid-sorter-icon-down": "grid-sort-icon-down fas fa-sort-down is-pulled-right", - "grid-th-action-button": "grid-col-action-button is-narrow", - "grid-td-action-button": "grid-col-action-button is-narrow", - "grid-tr": "", - "grid-th": "", - "grid-td": "", - "grid-details-button": "grid-details-button button is-small", - "grid-edit-button": "grid-edit-button button is-small", - "grid-delete-button": "grid-delete-button button is-small", - "grid-footer": "grid-footer", - "grid-info": "grid-info is-pulled-left", - "grid-pagination": "grid-pagination is-pulled-right", - "grid-pagination-button": "grid-pagination-button button is-small", - "grid-pagination-button-current": "grid-pagination-button-current button is-primary is-small", - "grid-cell-type-string": "grid-cell-type-string", - "grid-cell-type-text": "grid-cell-type-text", - "grid-cell-type-boolean": "grid-cell-type-boolean has-text-centered", - "grid-cell-type-float": "grid-cell-type-float", - "grid-cell-type-int": "grid-cell-type-int", - "grid-cell-type-date": "grid-cell-type-date", - "grid-cell-type-time": "grid-cell-type-time", - "grid-cell-type-datetime": "grid-cell-type-datetime", - "grid-cell-type-upload": "grid-cell-type-upload", - "grid-cell-type-list": "grid-cell-type-list", - # specific for custom form - "search_form": "search-form is-pulled-right pb-2", - "search_form_table": "search-form-table", - "search_form_tr": "search-form-tr", - "search_form_td": "search-form-td pr-1", - } - - styles = { - "grid-wrapper": "", - "grid-header": "", - "grid-new-button": "", - "grid-search": "", - "grid-table-wrapper": "", - "grid-table": "", - "grid-sorter-icon-up": "", - "grid-sorter-icon-down": "", - "grid-th-action-button": "", - "grid-td-action-button": "", - "grid-tr": "", - "grid-th": "text-align: center; text-transform: uppercase;", - "grid-td": "", - "grid-details-button": "", - "grid-edit-button": "", - "grid-delete-button": "", - "grid-footer": "padding-top: .5em;", - "grid-info": "", - "grid-pagination": "", - "grid-pagination-button": "margin-left: .25em;", - "grid-pagination-button-current": "margin-left: .25em;", - "grid-cell-type-string": "", - "grid-cell-type-text": "", - "grid-cell-type-boolean": "", - "grid-cell-type-float": "", - "grid-cell-type-int": "", - "grid-cell-type-date": "", - "grid-cell-type-time": "", - "grid-cell-type-datetime": "", - "grid-cell-type-upload": "", - "grid-cell-type-list": "", - # specific for custom form - "search_form": "", - "search_form_table": "", - "search_form_tr": "", - "search_form_td": "", - } - -You can build your own class_style to be used with the css framework of +You can even build your own class_style to be used with the css framework of your choice. +With icon_style, you can customize the icon font used. Currently, the following exist: +- ``IconStyleFontawsome`` is the current default (for backwards compatibility). You need + to add `fontawesome `__ icon font CSS to use this. +- ``IconStyle`` which doesn't correspond to any font or icon set. It inserts simple + css classes like ``icon-edit-button`` which you can write your own css for. +- ``IconStyleBootstrapIcons`` You need to add the icon font CSS from + `Bootstrap Icons `__ + to your html templates to use this. + Custom Action Buttons --------------------- As with web2py, you can add additional buttons to each row in your grid. -You do this by providing pre_action_buttons or post_action_buttons to +You do this by providing ``pre_action_buttons`` or ``post_action_buttons`` to the Grid **init** method. -- pre_action_buttons - list of action_button instances to include +- ``pre_action_buttons`` - list of action_button instances to include before the standard action buttons -- post_action_buttons - list of action_button instances to include +- ``post_action_buttons`` - list of action_button instances to include after the standard action buttons You can build your own Action Button class to pass to pre/post action -buttons based on the template below (this is not provided with py4web) +buttons based on the template below (this is not provided with py4web). Sample Action Button Class --------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: python - def __init__(self, - url, - text, - icon="fa-calendar", - additional_classes=None, - message=None, - append_id=False): + class GridActionButton: + def __init__( + self, + url, + text=None, + icon=None, + additional_classes="", + additional_styles="", + override_classes="", + override_styles="", + message="", + append_id=False, + name=None, + ignore_attribute_plugin=False, + **attrs + ): + self.url = url + self.text = text + self.icon = icon + self.additional_classes = additional_classes + self.additional_styles = additional_styles + self.override_classes = override_classes + self.override_styles = override_styles + self.message = message + self.append_id = append_id + self.name = name + self.ignore_attribute_plugin = ignore_attribute_plugin + self.attrs = attrs - url: the page to navigate to when the button is clicked - text: text to display on the button -- icon: the font-awesome icon to display before the text +- icon: the icon corresponding to your icon-style to display before the text, for example + "fa-calendar" for IconStyleFontawesome. - additional_classes: a space-separated list of classes to include on the button element +- additional_styles: a string containing additional styles to add to the button +- override_classes: a space-separated list of classes to place on the control that will replace the default classes +- override_styles: a string containing the styles to be applied to the control - message: confirmation message to display if ‘confirmation’ class is added to additional classes - append_id: if True, add id_field_name=id_value to the url querystring for the button +- name: the name to apply to the control +- ignore_attribute_plugin: boolean - respect the attribute plugin specified on the grid or ignore it +- attrs: additional attributes to apply to the control + +After defining the custom GridActionButton class, you need to define +your Action buttons: + +.. code:: python + + pre_action_buttons = [ + lambda row: GridActionButton( + lambda row: f"https://www.google.com/search?q={row.superhero}", + text= f"Google for {row.superhero}", + ) + ] + +Finally, you need to reference them in the Grid definition: + +.. code:: python + + grid = Grid(... pre_action_buttons = pre_action_buttons ...) + + +Using callable parameters +~~~~~~~~~~~~~~~~~~~~~~~~~ + +A recent improvement to py4web allows you to pass a **callable** instead of a GridActionButton. This allow you to more easily change the behaviour +of standard and custom Actions. + + +Callable can be used with: + +- details +- editable +- deletable +- additional_classes +- additional_styles +- override_classes +- override_styles + + +Example usage: + +.. code:: python + + @action("example/") + def example(path=None): + + pre_action_buttons = [ + lambda row: GridActionButton( + URL("test", row.id), + text="Click me", + icon=IconStyleFontawsome.add_button, # same as "fa-plus" + additional_classes=row.id, + additional_styles=["height: 10px" if row.bar else None], + ) + ] + + post_action_buttons = [ + lambda row: GridActionButton( + URL("test", row.id), + text="Click me!!!", + icon="fa-plus", + additional_classes=row.id, + additional_styles=["height: 10px" if row.bar else None], + ) + ] + + grid = Grid( + path=path, + query=db.foo, + pre_action_buttons=pre_action_buttons, + post_action_buttons=post_action_buttons, + ) + + return dict(grid=grid.render()) + Reference Fields ---------------- @@ -476,7 +577,7 @@ The downfall of using this method is that sorting and filtering are based on the company field in the employee table and not the name of the company -left join and specify fields from joined table - specified on the left +``left join`` and specify fields from joined table - specified on the left parameter of Grid instantiation .. code:: python @@ -485,15 +586,14 @@ parameter of Grid instantiation You can specify a standard PyDAL left join, including a list of joins to consider. - Now the company name field can be included in your fields list can be clicked on and sorted. -Now you can also specify a query such as: +Also you can specify a query such as: .. code:: python - queries.append((db.employee.last_name.contains(search_text)) | (db.employee.first_name.contains(search_text)) | db.company.name.contains(search_text))) + queries.append((db.employee.last_name.contains(search_text)) | (db.employee.first_name.contains(search_text)) | db.company.name.contains(search_text)) This method allows you to sort and filter, but doesn’t allow you to combine fields to be displayed together as the filter_out method would @@ -501,3 +601,40 @@ combine fields to be displayed together as the filter_out method would You need to determine which method is best for your use case understanding the different grids in the same application may need to behave differently. + + +Grids with checkboxes +--------------------- + +While the grid, per se, does not support checkboxes, you can use custom columns to add one or more columns of checkboxes. +You can also add the helpers logic (the grid uses helpers to generate HTML) to wrap it in a ``
    `` and add one +or more submit buttons. You can then add logic to process the selected rows when the button is selected. For example: + +.. code:: python + + column = Column("select", lambda row: INPUT(_type="checkbox",_name="selected_id",_value=row.id)) + + @action("manage") + @action("manage/") + @action.uses("manage.html", db) + def manage(path=None): + + grid = Grid(path, db.thing, columns=[column, db.thing.name]) + + # if we are displaying a "select" grid page (not a form) + if not grid.form: + grid = grid.render() + # if checkboxes selection was submitted + if request.method == "POST": + # do something with the selected ids + print("you selected", request.POST.get("selected_id")) + # inject a ```` and a ``submit`` button + grid.children[1:] = [FORM( + *grid.children[1:], + DIV(INPUT(_type="submit",_value="do it!")), + _method="POST", + _action=request.url)] + return locals() + +Notice in the above example ``request.POST.get("selected_id")`` can be a single ID (if one selected) or a list of IDs (if more than one +is selected). diff --git a/docs/chapter-15.rst b/docs/chapter-15.rst index 3d721b89d..9bdb6b33b 100644 --- a/docs/chapter-15.rst +++ b/docs/chapter-15.rst @@ -18,9 +18,9 @@ profile forms. Both web2py and py4web track and log all errors. Some of the main differences are the following: -- web2py works with both Python 2.6+ and 3.6+, while py4web runs on Python 3.6+ only. So, if your +- web2py works with both Python 2.6+ and 3.6+, while py4web runs on Python 3.7+ only. So, if your old web2py application is still using Python 2, your first step involves migrating it to at - least Python 3.6, better if the latest 3.8. + least Python 3.7, better if the latest 3.9. - web2py apps consist of collection of files which are executed at every HTTP request (using a custom importer, in a predetermined order). In py4web apps are regular python modules that are @@ -67,8 +67,7 @@ Some of the main differences are the following: upon redirection. - web2py uses its own request/response objects. py4web uses the request/response objects from the - underlying Bottle framework. While this may change in the future we are committed to keep them - compatible with Bottle because of its excellent documentation. Bottle also handles for py4web + underlying Ombott library. While this may change in the future we are committed to keep them the interface with the web server, routing, partial requests, if modified since, and file streaming. @@ -96,8 +95,10 @@ Some of the main differences are the following: provides a mechanism for assigning and checking tags efficiently to any object, including but not limited to, users. -- Web2py comes with the Rocket web server. py4web at the time of writing defaults to the Tornado - web server but this may change. +- Web2py comes with the Rocket web server. py4web at the time of writing defaults to the + `Rocket3 `__ web server, which is the same multi-threaded + web server used by web2py stripped of all the Python2 logic and dependencies. Note that this + may change in the future. Simple conversion examples diff --git a/docs/chapter-16.rst b/docs/chapter-16.rst index 6192b5f0e..c14618102 100644 --- a/docs/chapter-16.rst +++ b/docs/chapter-16.rst @@ -2,12 +2,160 @@ Advanced topics and examples ============================ +The scheduler +------------- + +Py4web has a built-in scheduler. There is nothing for you to install or configure to make it work. + +Given a task (just a python function), you can schedule async runs of that function. +The runs can be a one-off or periodic. They can have timeout. They can be scheduled to run at a given scheduled time. + +The scheduler works by creating a table ``task_run`` and enqueueing runs of the predefined task as table records. +Each ``task_run`` references a task and contains the input to be passed to that task. The scheduler will capture the +task stdout+stderr in a ``db.task_run.log`` and the task output in ``db.task_run.output``. + +A py4web thread loops and finds the next task that needs to be executed. For each task it creates a worker process +and assigns the task to the worker process. You can specify how many worker processes should run concurrently. +The worker processes are daemons and they only live for the life of one task run. Each worker process is only +responsible for executing that one task in isolation. The main loop is responsible for assigning tasks and timeouts. + +The system is very robust because the only source of truth is the database and its integrity is guaranteed by +transactional safety. Even if py4web is killed, running tasks continue to run unless they complete, fail, or are +explicitly killed. + +Aside for allowing multiple concurrent task runs in execution on one node, +it is also possible to run multiple instances of the scheduler on different computing nodes, +as long as they use the same client/server database for ``task_run`` and as long as +they all define the same tasks. + +Here is an example of how to use the scheduler: + +.. code:: python + + from pydal.tools.scheduler import Scheduler, delta, now + from .common import db + + # create and start the scheduler + scheduler = Scheduler(db, sleep_time=1, max_concurrent_runs=1) + scheduler.start() + + # register your tasks + scheduler.register_task("hello", lambda **inputs: print("hi!")) + scheduler.register_task("slow", lambda: time.sleep(10)) + scheduler.register_task("periodic", lambda **inputs: print("I am periodic!")) + scheduler.register_task("fail", lambda x: 1 / x) + + # enqueue some task runs: + + scheduler.enqueue_run(name="hello") + scheduler.enqueue_run(name="hello", scheduled_for=now() + delta(10) # start in 10 secs + scheduler.enqueue_run(name="slow", timeout=1) # 1 secs + scheduler.enqueue_run(name="periodic", period=10) # 10 secs + scheduler.enqueue_run(name="fail", inputs={"x": 0}) + +Notice that in scaffolding app, the scheduler is created and started in common if +``USE_SCHEDULER=True`` in ``settings.py``. + +You can manage your task runs busing the dashboard or using a ``Grid(path, db.task_run)``. + +To prevent database locks (in particular with sqlite) we recommend: + +- Use a different database for the scheduler and everything else +- Always ``db.commit()`` as soon as possible after any insert/update/delete +- wrap your database logic in tasks in a try...except as in + +.. code:: python + + def my_task(): + try: + # do something + db.commit() + except Exception: + db.rollback() + + +Sending messages using a background task +---------------------------------------- + +As en example of application of the above, consider the case of wanting to send emails asynchronously from a background task. +In this example we send them using SendGrid from Twilio (https://www.twilio.com/docs/sendgrid/for-developers/sending-email/quickstart-python). + +Here is a possible scheduler task to send the email: + +.. code:: python + + import sendgrid + from sendgrid.helpers.mail import Mail, Email, To, Content + + def sendmail_task(from_addr, to_addrs, subject, body): + "" + # build the messages using sendgrid API + from_email = Email(from_addr) # Must be your verified sender + content_type = "text/plain" if body[:6] != "" else "text/html" + content = Content(content_type, body) + mail = Mail(from_email, To(to_addrs), subject, content) + # ask sendgrid to deliver it + sg = sendgrid.SendGridAPIClient(api_key=settings.SENDGRID_API_KEY) + response = sg.client.mail.send.post(request_body=mail.get()) + # check if worked + assert response.status_code == "200" + + # register the above task with the scheduler + scheduler.register_task("sendmail", sendmail_task) + + +To schedule sending a new email do: + +.. code:: python + + email = { + "from_addr": "me@example.com", + "to_addrs": ["me@example.com"], + "subject": "Hello World", + "body": "I am alive!", + } + scheduler.enqueue_run(name="sendmail", inputs=email, scheduled_for=None) + +The key:value in the email representation must match the arguments of the task. +The ``scheduled_for`` argument is optional and allows you to specify when the email should be sent. +You can use the Dashboard to see the status of your ``task_run``\s for the task called ``sendmail``. + +You can also tell auth to tap into above mechanism for sending emails: + +.. code:: python + + class MySendGridSender: + def __init__(self, from_addr): + self.from_addr = from_adds + def send(self, to_addr, subject, body): + email = { + "from_addr": self.from_addr, + "to_addrs": [to_addr], + "subject": subject, + "body": body, + } + scheduler.enqueue_run(name="sendmail", inputs=email) + + auth.sender = MySendGridSender(from_addr="me@example.com") + +With the above, Auth will not send emails using smtplib. Instead it will send them with SendGrid using the scheduler. +Notice the only requirement here is that ``auth.sender`` must be an object with a ``send`` method with the same signature as in the example. + +Notice, it it also possible to send SMS messages instead of emails but this requires 1) store the phone number in ``auth_user`` and 2) override the ``Auth.send`` method. + + +Celery +------ + +Yes. You can use Celery instead of the build-in scheduler but it adds complexity and it is less robust. +Yet the build-in scheduler is designed for long running tasks and the database can become a bottleneck +if you have hundreds of tasks running concurrently. Celery may work better if you have more than 100 concurrent +tasks and/or they are short running tasks. py4web and asyncio ------------------ -py4web (as bottle) is thread-based, with high speed and efficient memory usage. Asyncio is not strictly needed, at least for most of the normal use cases where it will add problems more than value because of its concurrency model. On the other hand, we think py4web needs a built-in websocket async based solution. @@ -76,14 +224,14 @@ Let's continue with a full example (started from scaffold). @action("htmx_list", method=["GET", "POST"]) - @action.uses(db, "htmx_list.html") + @action.uses("htmx_list.html", db) def htmx_list(): superheros = db(db.superhero.id > 0).select() return dict(superheros=superheros) @action("htmx_form/", method=["GET", "POST"]) - @action.uses(db, "htmx_form.html") + @action.uses("htmx_form.html", db) def htmx_form(record_id=None): attrs = { "_hx-post": URL("htmx_form/%s" % record_id), @@ -165,7 +313,7 @@ Here is an example building off the previous htmx forms example. .. code:: python @action("htmx_form/", method=["GET", "POST"]) - @action.uses(db, "htmx_form.html") + @action.uses("htmx_form.html", db) def htmx_form(record_id=None): attrs = { "_hx-post": URL("htmx_form/%s" % record_id), @@ -185,7 +333,7 @@ Here is an example building off the previous htmx forms example. @action("htmx_grid", method=["GET", "POST"]) @action("htmx_grid/", method=["GET", "POST"]) - @action.uses(session, db, "htmx_grid.html") + @action.uses( "htmx_grid.html", session, db) def htmx_grid(path=None): grid = Grid(path, db.superhero, auto_process=False) @@ -260,10 +408,10 @@ handle the database calls to get your data. method=["GET", "POST"], ) @action.uses( + "htmx/autocomplete.html", session, db, auth.user, - "htmx/autocomplete.html", ) def autocomplete(): tablename = request.params.tablename @@ -441,3 +589,288 @@ data builder URL to provide your own controller function to retrieve the data. .. [CIT1601] from the https://htmx.org website +utils.js +-------- + +Multiple times in this documentation we have mentioned utils.js which comes with the scaffolding application, +yet we never clearly listed what is in there. So here it is. + +string.format +~~~~~~~~~~~~~ + +It extends the String object prototype to allow expressions like this: + +.. code:: javascript + + var a = "hello {name}".format(name="Max"); + +The Q object +~~~~~~~~~~~~ + +The Q object can be used like a selector supporting jQuery like syntax: + +.. code:: javascript + + var element = Q("#element-id")[0]; + var selected_elements = Q(".element-class"); + +It supports the same syntax as JS ``querySelectorAll`` +and always returns an array of selected elements (can be empty). + +The Q objects is also a container for functions that can be useful when programming in Javascript. +It is stateless. + +For example: + +**Q.clone** + +A function to clone any object: + +.. code:: javascript + + var b = {any: "object"} + var a = Q.clone(b); + +**Q.eval** + +It evaluates JS expressions in a string. It is not a sandbox. + +.. code:: javascript + + var a = Q.eval("2+3+Math.random()"); + +**Q.ajax** + +A wrapper for the JS fetch method which provides a nicer syntax: + +.. code:: javascript + + var data = {}; + var headers = {'custom-header-name': 'value'} + var success = response => { console.log("recereived", response); } + var failure = response => { console.log("recereived", response); } + Q.ajax("POST", url, data, headers).then(success, failure); + +**Q.get_cookie** + +Extracts a cookie by name from the header of cookies in the current page: +returns null if the cookie does not exist. Can be used within the JS of a page to retrieve a session cookie +in case it is needed to call an API. + +.. code:: javascript + + var a = Q.get_cookie("session"); + +**Q.register_vue_component** + +This is specific for Vue 2 and may be deprecated in the future but it allows +to define a vue component where the template is stored in a separate HTML file +and the template will be loaded lazily only when/if the component is used. + +For example instead of doing: + +.. code:: javascript + + Vue.component('button-counter', { + data: function () { + return { + count: 0 + } + }, + template: '' + }); + +You would put the template in a button-counter.html and do + +.. code:: javascript + + Q.register_vue_component("button-counter", "button-counter.html", function(res) { + return { + data: function () { + return { + count: 0 + }; + }; + }); + + +**Q.upload_helper** + +It allows to bind an input tag of type file to a callback so that when a file is selected +the content of the selected file is loaded, base64 encoded, and passed to the callback. + +This is useful to create form which include an input field selector - but you want to +place the content of the selected file into a variable, for example to do an ajax post of that content. + +For example: + +.. code:: html + + + +and + +.. code:: javascript + + var file_name = "" + var file_content = ""; + Q.upload_helper("my_id", function(name, content) { + file_name = name; + file_content = content; // base 64 encoded; + } + + +The T object +~~~~~~~~~~~~ + +This is a Javascript reimplementation of the Python pluralize library in Python +which is used by the Python T object in py4web. So basically a client-side T. + +.. code:: javascript + + T.translations = {'dog': {0: 'no cane', 1: 'un case', 2: '{n} cani', 10: 'tanti cani'}}; + var message = T('dog').format({n: 5}); // "5 cani" + +The intended usage is to create a server endpoint that can provide translations +for the client accepted-language, obtain T.translations via ajax get, and then use +T to translate and pluralize all messages clientside rather than serverside. + +**Q.debounce** + +Prevents a function from stepping on itself. + +.. code:: javascript + + setInterval(500, Q.debounce(function(){console.log("hello!")}, 200); + +and the function will be called every 500ms +but will skip if the previous call did not terminate. +Unlike other debounce implementations out there, it makes sure +the last call is always executed by delaying it (in the example 200ms); + +**Q.debounce** + +Prevents a function from being called too often; + +.. code:: javascript + + Q("#element").onclick = Q.debounce(function(){console.log("clicked!")}, 1000); + +If the element is clicked more often than once every 1000ms, the other clicks will be ignored. + +**Q.tags_inputs** + +It turns a regular text input containing a string of comma separated tags into a tag widgets. +For example: + +.. code:: html + + + +and in JSL + +.. code:: javascript + + Q.tags_input('[name=zip_codes]') + +You can restrict the set of options with: + +.. code:: javascript + + Q.tags_input('[name=zip_codes]', { + freetext: false, + tags: ['Chrome', 'Firefox', 'Safari', 'Edge'] + }); + +It works with the datalist element to provide autocomplete. Simply prepend `-list` to the datalist id: + +.. code:: html + + + + + + + + + +and in JS: + +.. code:: javascript + + Q.tags_input('[name=zip_codes]', {freetext: false}); + +It provides more undocumented options. +You need to style the tags. For example: + +.. code:: css + + ul.tags-list { + padding-left: 0; + } + ul.tags-list li { + display: inline-block; + border-radius: 100px; + background-color: #111111; + color: white; + padding: 0.3em 0.8em 0.2em 0.8em; + line-height: 1.2em; + margin: 2px; + cursor: pointer; + opacity: 0.2; + text-transform: capitalize; + } + ul.tags-list li[data-selected=true] { + opacity: 1.0; + } + +Notice that if an input element has class `.type-list-string` or `.type-list-integer`, utils.js applies the +`tag_input` function automatically. + +*Q.score_input** + +..code:: javascript + + Q.score_input(Q('input[type=password]')[0]); + +This will turn the password input into a widget that scores the password complexity. +It is applied automatically to inputs with name "password" or "new_password". + +**Components** + +This is a poor man version of HTMX. It allows to insert in the page ajax-component tags that +are loaded via ajax and any form in those components will be trapped +(i.e. the result of form submission will also be displayed inside the same component) + +For example imagine an index.html that contains + +.. code:: html + + + Loading... + + +And a different action serving the component: + +.. code:: python + + @action("mycomponent", method=["GET", "POST"]) + @action.uses(flash) + def mycomponent(): + flash.set("Welcome") + form = Form([Field("your_name")]) + return DIV( + "Hello " + request.forms["your_name"] + if form.accepted else form).xml() + +A component action is a regular action except that it should generate html without the +`...` envelop and it can make use of templates and flash for example. + +Notice that if the main page supports flash messages, any flash message in the component will be displayed +by the parent page. + +Moreover if the component returns a `redirect("other_page")` not just the content of the component, +but the entire page will be redirected. + +The contents of the component html can contain `` and they can modify global page variables +as well as modify other components. diff --git a/docs/conf.py b/docs/conf.py index b3bdb2337..9eb11fd01 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -5,32 +5,33 @@ # https://www.sphinx-doc.org/en/master/usage/configuration.html import os - # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#import sys -#sys.path.insert(0, os.path.abspath('.')) +# import sys +# sys.path.insert(0, os.path.abspath('.')) # -- Project information ----------------------------------------------------- -project = 'py4web' -copyright = '2020, BSDv3 License' -author = 'Massimo Di Pierro' +project = "py4web" +copyright = "2020, BSDv3 License" +author = "Massimo Di Pierro" # The full version, including alpha/beta/rc tags # get current_version from sources -pkg_init = '../py4web/__init__.py' -with open(pkg_init, 'r') as src: +pkg_init = "../py4web/__init__.py" +with open(pkg_init, "r") as src: for line in src: - if '__version__ = ' in line: - values = line.split(sep = ' = ') - current_version = values[1].strip('\n').strip('"') + if "__version__ = " in line: + values = line.split(sep=" = ") + current_version = values[1].strip("\n").strip('"') + current_version = current_version[2:] + current_version = current_version[:-2] break release = current_version version = current_version @@ -42,20 +43,20 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx_rtd_theme', - 'sphinx.ext.githubpages', - 'sphinx.ext.autosectionlabel', - 'sphinx_tabs.tabs', - 'sphinxcontrib.spelling', + "sphinx_rtd_theme", + "sphinx.ext.githubpages", + "sphinx.ext.autosectionlabel", + "sphinx_tabs.tabs", + # 'sphinxcontrib.spelling', ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # How to format the current date, used as the replacement for |today| today_fmt = "%B %d, %Y" @@ -64,7 +65,7 @@ # The value should be a valid Pygments lexer name, # 'default' it is similar to 'python3'; it is mostly a superset of # 'python' but it fallbacks to 'none' without warning if failed. -highlight_language = 'none' +highlight_language = "none" # -- Options for HTML output ------------------------------------------------- @@ -72,20 +73,19 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'sphinx_rtd_theme' +html_theme = "sphinx_rtd_theme" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] -html_logo = 'images/logo.png' -html_favicon = 'images/logo-32x32.ico' +html_static_path = ["_static"] +html_logo = "images/logo.png" +html_favicon = "images/logo-32x32.ico" html_theme_options = { - 'logo_only': False, - 'display_version': True, + "logo_only": False, } # The master toctree document. -master_doc = 'index' +master_doc = "index" # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied @@ -99,56 +99,56 @@ # SETUP THE RTD LOWER-LEFT # ############################ try: - html_context + html_context except NameError: - html_context = dict() -html_context['display_lower_left'] = True + html_context = dict() +html_context["display_lower_left"] = True # SET CURRENT_LANGUAGE -if 'current_language' in os.environ: - # get the current_language env var set by buildDocs.sh - current_language = os.environ['current_language'] +if "current_language" in os.environ: + # get the current_language env var set by buildDocs.sh + current_language = os.environ["current_language"] else: - # the user is probably doing `make html` - # set this build's current language to english - current_language = 'en' + # the user is probably doing `make html` + # set this build's current language to english + current_language = "en" # tell the theme which language to we're currently building -html_context['current_language'] = current_language +html_context["current_language"] = current_language # tell the theme which version we're currently on ('current_version' affects # the lower-left rtd menu and 'version' affects the logo-area version) -html_context['current_version'] = current_version -html_context['version'] = current_version +html_context["current_version"] = current_version +html_context["version"] = current_version # POPULATE LINKS TO OTHER LANGUAGES -#html_context['languages'] = [ ('en', 'en/') ] -html_context['languages'] = [ ('en', '../en' + '/index.html') ] +# html_context['languages'] = [ ('en', 'en/') ] +html_context["languages"] = [("en", "../en" + "/index.html")] -languages = [lang.name for lang in os.scandir('locales') if lang.is_dir()] +languages = [lang.name for lang in os.scandir("locales") if lang.is_dir()] for lang in languages: - #html_context['languages'].append( (lang, lang + '/' ) ) - #html_context['languages'].append( (lang, '/../' + lang + '/' ) ) - html_context['languages'].append( (lang, '../' + lang + '/index.html') ) + # html_context['languages'].append( (lang, lang + '/' ) ) + # html_context['languages'].append( (lang, '/../' + lang + '/' ) ) + html_context["languages"].append((lang, "../" + lang + "/index.html")) # POPULATE LINKS TO OTHER VERSIONS -html_context['versions'] = list() -#html_context['versions'].append( ('master', current_language + '/' ) ) -html_context['versions'].append( ('current', 'index.html' ) ) -#html_context['versions'].append( ('current', '/' ) ) +html_context["versions"] = list() +# html_context['versions'].append( ('master', current_language + '/' ) ) +html_context["versions"].append(("current", "index.html")) +# html_context['versions'].append( ('current', '/' ) ) # POPULATE LINKS TO OTHER FORMATS/DOWNLOADS -html_context['downloads'] = list() -html_context['downloads'].append( ('pdf', project + '_' + current_language + '.pdf') ) -html_context['downloads'].append( ('epub', project + '_' + current_language + '.epub') ) +html_context["downloads"] = list() +html_context["downloads"].append(("pdf", project + "_" + current_language + ".pdf")) +html_context["downloads"].append(("epub", project + "_" + current_language + ".epub")) ########################## # "EDIT ON GITHUB" LINKS # ########################## -html_context['display_github'] = True -html_context['github_user'] = 'web2py' -html_context['github_repo'] = 'py4web' -html_context['github_version'] = 'master/docs/' +html_context["display_github"] = True +html_context["github_user"] = "web2py" +html_context["github_repo"] = "py4web" +html_context["github_version"] = "master/docs/" # -- Options for LaTeX output ------------------------------------------------ @@ -156,13 +156,10 @@ latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. #'preamble': '', - # Latex figure (float) alignment. #'figure_align': 'htbp', } @@ -171,18 +168,21 @@ # -- Options for PDF output -------------------------------------------------- # settings for creating PDF with rinoh -rinoh_documents = [( - master_doc, - 'target', - project + ' Documentation', - '© ' + copyright, -)] +rinoh_documents = [ + dict( + doc=master_doc, + target="target", + title=project + " Documentation", + date="© " + copyright, + logo="images/logo.png", + ) +] # -- Options for EPUB output ------------------------------------------------- -epub_basename = 'target' +epub_basename = "target" # ---- Options for spelling ------------------------------------------------- -spelling_lang='en_US' -spelling_word_list_filename='spelling_wordlist_en.txt' \ No newline at end of file +spelling_lang = "en_US" +spelling_word_list_filename = "spelling_wordlist_en.txt" diff --git a/docs/images/dashboard_i18n_btn.png b/docs/images/dashboard_i18n_btn.png new file mode 100755 index 000000000..f32ba92a7 Binary files /dev/null and b/docs/images/dashboard_i18n_btn.png differ diff --git a/docs/images/dashboard_i18n_ui.png b/docs/images/dashboard_i18n_ui.png new file mode 100644 index 000000000..b71a21bd5 Binary files /dev/null and b/docs/images/dashboard_i18n_ui.png differ diff --git a/docs/images/example_db.png b/docs/images/example_db.png new file mode 100644 index 000000000..7ae7315ba Binary files /dev/null and b/docs/images/example_db.png differ diff --git a/docs/images/first_run.png b/docs/images/first_run.png index df3306e27..a670f0150 100644 Binary files a/docs/images/first_run.png and b/docs/images/first_run.png differ diff --git a/docs/images/form1.png b/docs/images/form1.png index 6f66b7257..4839a27f9 100755 Binary files a/docs/images/form1.png and b/docs/images/form1.png differ diff --git a/docs/images/form2.png b/docs/images/form2.png index b83647c2f..642631948 100755 Binary files a/docs/images/form2.png and b/docs/images/form2.png differ diff --git a/docs/images/form3.png b/docs/images/form3.png deleted file mode 100644 index 3de9bbba9..000000000 Binary files a/docs/images/form3.png and /dev/null differ diff --git a/docs/images/form4.png b/docs/images/form4.png deleted file mode 100644 index 9534e4683..000000000 Binary files a/docs/images/form4.png and /dev/null differ diff --git a/docs/images/grid.png b/docs/images/grid.png new file mode 100644 index 000000000..8342b76fe Binary files /dev/null and b/docs/images/grid.png differ diff --git a/docs/images/grid_bulmacss.png b/docs/images/grid_bulmacss.png new file mode 100644 index 000000000..cf464bc9d Binary files /dev/null and b/docs/images/grid_bulmacss.png differ diff --git a/docs/images/grid_columns.png b/docs/images/grid_columns.png new file mode 100755 index 000000000..14e72b4d5 Binary files /dev/null and b/docs/images/grid_columns.png differ diff --git a/docs/images/grid_nocss.png b/docs/images/grid_nocss.png new file mode 100644 index 000000000..25752e487 Binary files /dev/null and b/docs/images/grid_nocss.png differ diff --git a/docs/images/icon-gear.png b/docs/images/icon-gear.png new file mode 100644 index 000000000..a6bcc602a Binary files /dev/null and b/docs/images/icon-gear.png differ diff --git a/docs/images/icon-lens.png b/docs/images/icon-lens.png new file mode 100644 index 000000000..632f1511c Binary files /dev/null and b/docs/images/icon-lens.png differ diff --git a/docs/images/icon-start.png b/docs/images/icon-start.png new file mode 100644 index 000000000..426638c71 Binary files /dev/null and b/docs/images/icon-start.png differ diff --git a/docs/images/icon-stop.png b/docs/images/icon-stop.png new file mode 100644 index 000000000..9148690e9 Binary files /dev/null and b/docs/images/icon-stop.png differ diff --git a/docs/images/logo.ico b/docs/images/logo.ico new file mode 100644 index 000000000..08c129087 Binary files /dev/null and b/docs/images/logo.ico differ diff --git a/docs/images/restapi.png b/docs/images/restapi.png new file mode 100644 index 000000000..1566a632f Binary files /dev/null and b/docs/images/restapi.png differ diff --git a/docs/images/restapi2.png b/docs/images/restapi2.png new file mode 100644 index 000000000..59550cba4 Binary files /dev/null and b/docs/images/restapi2.png differ diff --git a/docs/images/scaffold_tree.png b/docs/images/scaffold_tree.png new file mode 100644 index 000000000..691ef6660 Binary files /dev/null and b/docs/images/scaffold_tree.png differ diff --git a/docs/images/tags2.png b/docs/images/tags2.png new file mode 100644 index 000000000..5cf11736b Binary files /dev/null and b/docs/images/tags2.png differ diff --git a/docs/images/tags_db.png b/docs/images/tags_db.png new file mode 100644 index 000000000..d6fe6f4b5 Binary files /dev/null and b/docs/images/tags_db.png differ diff --git a/docs/locales/pt/LC_MESSAGES/chapter-01.mo b/docs/locales/pt/LC_MESSAGES/chapter-01.mo index 5d21063ae..b22f48c93 100644 Binary files a/docs/locales/pt/LC_MESSAGES/chapter-01.mo and b/docs/locales/pt/LC_MESSAGES/chapter-01.mo differ diff --git a/docs/locales/pt/LC_MESSAGES/chapter-01.po b/docs/locales/pt/LC_MESSAGES/chapter-01.po index c6b3e3d75..69af6d30a 100644 --- a/docs/locales/pt/LC_MESSAGES/chapter-01.po +++ b/docs/locales/pt/LC_MESSAGES/chapter-01.po @@ -151,7 +151,6 @@ msgstr "" #: ../../chapter-01.rst:53 msgid "" -"PY4WEB, unlike web2py, is based on bottlepy and in particular uses the " "Bottle request object and the Bottle routing mechanism." msgstr "" "PY4WEB, ao contrário web2py, é baseado em bottlepy e em usos particulares do" diff --git a/docs/locales/pt/LC_MESSAGES/chapter-02.po b/docs/locales/pt/LC_MESSAGES/chapter-02.po index 830ae1115..2fb704490 100644 --- a/docs/locales/pt/LC_MESSAGES/chapter-02.po +++ b/docs/locales/pt/LC_MESSAGES/chapter-02.po @@ -81,25 +81,6 @@ msgstr "" "para desenvolvedores e usuários simples. Para qualquer problema que você " "deve enfrentar, este é o lugar certo para procurar uma dica ou uma solução." -#: ../../chapter-02.rst:30 -msgid "The chat on IRC" -msgstr "O bate-papo no IRC" - -#: ../../chapter-02.rst:32 -msgid "" -"We also use to chat sometime on IRC (Internet Relay Chat, which is an old-" -"style text only chat). You can freely join us at https://webchat.freenode." -"net/#py4web. From time to time we also use it to host a scheduled public " -"chat, where you can write and read live questions to developers. " -"Transcripts of them are then available on the mailing list." -msgstr "" -"Nós também usamos para conversar em algum momento no IRC (Internet Relay " -"Chat, que é um texto de estilo antigo única chat). Você pode se juntar a " -"nós livremente no https://webchat.freenode.net/#py4web. De vez em quando " -"nós também usá-lo para hospedar um bate-papo pública agendada, onde você " -"pode escrever e ler perguntas ao vivo para os desenvolvedores. Transcrições " -"deles são, então, disponível na lista de discussão." - #: ../../chapter-02.rst:38 msgid "Tutorials and video" msgstr "Tutoriais e vídeo" diff --git a/docs/locales/pt/LC_MESSAGES/chapter-07.mo b/docs/locales/pt/LC_MESSAGES/chapter-07.mo index b70148b4d..95c31493e 100644 Binary files a/docs/locales/pt/LC_MESSAGES/chapter-07.mo and b/docs/locales/pt/LC_MESSAGES/chapter-07.mo differ diff --git a/docs/locales/pt/LC_MESSAGES/chapter-07.po b/docs/locales/pt/LC_MESSAGES/chapter-07.po index 7283c08a9..2af2b2d47 100644 --- a/docs/locales/pt/LC_MESSAGES/chapter-07.po +++ b/docs/locales/pt/LC_MESSAGES/chapter-07.po @@ -3558,11 +3558,11 @@ msgstr "cache, em cache" #: ../../chapter-07.rst:2216 msgid "" "An example use which gives much faster selects is: ``rows = db(query)." -"select(cache=(cache.ram, 3600), cacheable=True)``:python Look at *Caching " +"select(cache=(cache.get, 3600), cacheable=True)``:python Look at *Caching " "selects* section in this chapter, to understand what the trade-offs are." msgstr "" "Um uso exemplo que dá muito mais rápido seleciona é: `` linhas = db " -"(query) .Select (cache = (cache.ram, 3600), cacheable = True) ``: Olhar " +"(query) .Select (cache = (cache.get, 3600), cacheable = True) ``: Olhar " "python na seção * * Caching seleciona neste capítulo, para entender o que " "os trade-offs são." @@ -5315,12 +5315,12 @@ msgstr "Selects com cache" msgid "" "The select method also takes a ``cache`` argument, which defaults to None. " "For caching purposes, it should be set to a tuple where the first element " -"is the cache model (``cache.ram``, ``cache.disk``, etc.), and the second " +"is the cache model (``cache.get`` when using py4web), and the second " "element is the expiration time in seconds." msgstr "" "O método de seleção também leva um argumento cache`` ``, cujo padrão é " "None. Para fins de armazenamento em cache, deve ser definido como um tuplo " -"em que o primeiro elemento é o modelo do cache ( `` cache.ram``, `` cache." +"em que o primeiro elemento é o modelo do cache ( `` cache.get``, `` cache." "disk``, etc), e o segundo elemento é o tempo de validade em segundo ." #: ../../chapter-07.rst:4046 diff --git a/docs/locales/pt/LC_MESSAGES/chapter-08.mo b/docs/locales/pt/LC_MESSAGES/chapter-08.mo index 7a2c279eb..8c8999538 100644 Binary files a/docs/locales/pt/LC_MESSAGES/chapter-08.mo and b/docs/locales/pt/LC_MESSAGES/chapter-08.mo differ diff --git a/docs/locales/pt/LC_MESSAGES/chapter-08.po b/docs/locales/pt/LC_MESSAGES/chapter-08.po index 10dfa7993..69f187df3 100644 --- a/docs/locales/pt/LC_MESSAGES/chapter-08.po +++ b/docs/locales/pt/LC_MESSAGES/chapter-08.po @@ -86,15 +86,15 @@ msgstr "A acção acima referida é exposto como:" msgid "" "**About request.POST**: keep in mind that **request.POST** only contains " "the form data that is posted using a **regular HTML-form** or javascript " -"**FormData** object. If you post just plain object (e.g. ``axios." -"post( 'path/to/api', {field:'some'} )``) you should pass **request.json** " +"**FormData** object. If you post just plain object (e.g.  +"Q.post( 'path/to/api', {field:'some'} )``) you should pass **request.json** " "instead of request.POST, since latter will contain just raw request-body " "which is string, not json. See bottle.py documentation for more details." msgstr "" "** Sobre request.POST **: Manter em mente que ** ** request.POST contém " "apenas os dados do formulário que é publicado utilizando um formulário HTML " "normal ** ** ou javascript ** FormData ** objeto. Se você postar apenas " -"objeto simples (por exemplo, `` axios.post ( 'path / to / api', {campo: " +"objeto simples (por exemplo, ``Q.post ( 'path / to / api', {campo: " "'alguns'}) ``) você deve passar request.json ** ** em vez de request.POST, " "desde Este último irá conter request-corpo apenas cru que é corda, não " "json. Consulte a documentação bottle.py para mais detalhes." diff --git a/docs/locales/pt/LC_MESSAGES/chapter-10.mo b/docs/locales/pt/LC_MESSAGES/chapter-10.mo index 868c4a232..e875eb33b 100644 Binary files a/docs/locales/pt/LC_MESSAGES/chapter-10.mo and b/docs/locales/pt/LC_MESSAGES/chapter-10.mo differ diff --git a/docs/locales/pt/LC_MESSAGES/chapter-11.mo b/docs/locales/pt/LC_MESSAGES/chapter-11.mo index 893df110e..aaa19e43c 100644 Binary files a/docs/locales/pt/LC_MESSAGES/chapter-11.mo and b/docs/locales/pt/LC_MESSAGES/chapter-11.mo differ diff --git a/docs/locales/pt/LC_MESSAGES/chapter-14.mo b/docs/locales/pt/LC_MESSAGES/chapter-14.mo index 32709a83d..f62a97922 100644 Binary files a/docs/locales/pt/LC_MESSAGES/chapter-14.mo and b/docs/locales/pt/LC_MESSAGES/chapter-14.mo differ diff --git a/docs/requirements.txt b/docs/requirements.txt index f7e570a6c..6bcf77e38 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,9 +1,9 @@ ### optional, used for documentation only ### docutils -PyStemmer +PyStemmer<2.2 sphinx sphinx-tabs sphinx_rtd_theme -rinohtype +rinohtype==0.5.4 sphinxcontrib-spelling diff --git a/docs/spelling_wordlist_en.txt b/docs/spelling_wordlist_en.txt index de9f47ac0..558678ed1 100644 --- a/docs/spelling_wordlist_en.txt +++ b/docs/spelling_wordlist_en.txt @@ -1,9 +1,13 @@ +ajax api appadmin appname args async Asyncio +attrs +auth +Auth autocomplete Autocomplete autodelete @@ -14,13 +18,17 @@ backends backported behaviour Bitbucket +boolean booleans bottlepy bulma +bytecode cacheable +cd checkboxes choosen cli +clientside config couchdb CouchDB @@ -33,16 +41,22 @@ cubriddb customizable cx dal +datalist datastore Datetime dbi +de +debounce deletable denormalization denormalize denormalizes +dismissible +Dockerfile doesn dropdown dropdowns +enqueueing epub exe executesql @@ -55,12 +69,16 @@ fieldnames filepaths Filepaths filesystem +firebird FireBird +Firebird FireBirdEmbedded +formatter formstyle fullname gae GCloud +gevent Gevent GiB github @@ -79,6 +97,8 @@ https hx ibm ie +iframe +incrementing informix Informix informixdb @@ -87,11 +107,16 @@ ingres ingresdbi ingresu IngresUnicode +init +instantiation +iptables IPv +iterable iterables javascript JDBCPostgre JDBCSQLite +Jinja jpg jQuery js @@ -101,20 +126,25 @@ kbytes kinterbasdb kwargs lastdot +ldap lib libs limitby localhost +longhash lookups mailto Makefile maxsize md +memcache Memcache memoize Memoize middleware minsize +mongo +Mongo mongodb monospaced mssql @@ -122,14 +152,17 @@ mssqln mtable multicast multiselect +multiuser myfunction mysql MySQLdb natively ndb +nginx Northwind NoSQL OAuth +ombott ondelete onwards optimiser @@ -141,6 +174,8 @@ pdkdf pydal PyTDS png +Podman +postfix Postgre PostgreBoolean PostgreNew @@ -150,6 +185,7 @@ PostgrePsycoNew postgres postprocessing pre +predefine prepend prepended prepending @@ -172,14 +208,20 @@ pysqlite pytds pyweb querystring +randint readonly redis +reimplementation resultset rname +rocketServer +runtime sapdb Schafer se selectorN +serializable +serverside severities somefile spatialite @@ -187,12 +229,15 @@ sql sqlite sso stateful +stderr +stdout stylesheet subclassing subfolder subfolders submodules subnet +sudo subnets subqueries substring @@ -205,10 +250,14 @@ syntaxes tablename teradata Teradata +teredo textarea +tracebacks +Twilio txt ual un +unary unicode unneded uri @@ -230,6 +279,7 @@ websocket wsgi xss yaml +yml Yatl yourapp zxJDBC diff --git a/docs/updateDocs.sh b/docs/updateDocs.sh index d449a9680..ab600fce1 100755 --- a/docs/updateDocs.sh +++ b/docs/updateDocs.sh @@ -76,10 +76,10 @@ for current_language in ${languages}; do export current_language # make spelling if english - if [ ${current_language} = 'en' ] - then - sphinx-build -b spelling docs/ docs/_build/spelling - fi + #if [ ${current_language} = 'en' ] + #then + #sphinx-build -b spelling docs/ docs/_build/spelling + #fi # make HTML # NOTE: this affect files in docs/locales/${current_language}/LC_MESSAGES/ sphinx-build -b html -D language="${current_language}" docs/ docs/_build/html/${current_language} @@ -112,6 +112,10 @@ for current_language in ${languages}; do fi fi + # removes unuseful folders + rm -fr docs/_build/html/${current_language}/.doctrees + rm -fr docs/_build/html/${current_language}/_sources + # copy html files into docroot rsync -a docs/_build/html/ ${docroot} diff --git a/py4web/__init__.py b/py4web/__init__.py index 47fa74061..7e72dd005 100644 --- a/py4web/__init__.py +++ b/py4web/__init__.py @@ -1,35 +1,27 @@ import sys __author__ = "Massimo Di Pierro " -__license__ = "BSDv3" -__version__ = "1.20210816.1" +__license__ = "BSD-3-Clause" +__version__ = "1.20250215.1" def _maybe_gevent(): for arg in sys.argv[1:]: - if 'gevent' in arg.lower(): + if "gevent" in arg.lower(): from gevent import monkey + monkey.patch_all() break -_maybe_gevent() -from .core import ( - action, # main py4web decorator - request, - response, - redirect, - abort, - HTTP, # bottle - DAL, - Field, # pydal - render, # yatl - Translator, # from pluralize - Session, - Cache, - Flash, - user_in, # additional fixtures - URL, # custom helper - check_compatible, -) # checks for version compatibility +_maybe_gevent() + +from .core import HTTP # checks for version compatibility; bottle +from .core import URL # custom helper +from .core import Field # pydal +from .core import Translator # from pluralize +from .core import action # main py4web decorator +from .core import render # yatl +from .core import (DAL, Cache, Condition, Flash, Session, abort, + check_compatible, redirect, request, response, safely) diff --git a/py4web/__main__.py b/py4web/__main__.py new file mode 100644 index 000000000..71d237e2a --- /dev/null +++ b/py4web/__main__.py @@ -0,0 +1,5 @@ +# allow py4web to be run as a module +# this file is called when running "python -m py4web" +from py4web.core import cli + +cli() diff --git a/py4web/core.py b/py4web/core.py index dfe2b71fe..13be54c9f 100644 --- a/py4web/core.py +++ b/py4web/core.py @@ -1,22 +1,25 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +# pylint: disable=too-many-lines,line-too-long,too-many-branches,use-dict-literal,too-many-arguments,too-few-public-methods,too-many-locals,broad-exception-caught,cell-var-from-loop + """PY4WEB - a web framework for rapid development of efficient database driven web applications""" # Standard modules import asyncio -import cgitb import code +import collections import copy import datetime import enum import functools +import html as sanitize_html import http.client import http.cookies import importlib.machinery import importlib.util import inspect +import io import json -import linecache import logging import numbers import os @@ -32,31 +35,37 @@ import urllib.parse import uuid import zipfile +from collections import OrderedDict +from contextlib import redirect_stderr, redirect_stdout +import portalocker from watchgod import awatch -from . import server_adapters - # Optional web servers for speed try: import gunicorn except ImportError: gunicorn = None -import bottle - -# Third party modules import click -import jwt # this is PyJWT +# Third party modules +import ombott as bottle import pluralize import pydal -import threadsafevariable -import yatl +import pydal.validators import renoir import renoir.constants import renoir.writers +import threadsafevariable +import yatl -bottle.BaseRequest.MEMFILE_MAX = 16 * 1024 * 1024 +from . import server_adapters +from .utils.misc import secure_dumps, secure_loads + +bottle.DefaultConfig.max_memfile_size = 16 * 1024 * 1024 +bottle.DefaultConfig.app_name_header = "HTTP_X_PY4WEB_APPNAME" +# apply DefaultConfig changes to default_app +bottle.default_app().setup() __all__ = [ "render", @@ -71,12 +80,14 @@ "Session", "Cache", "Flash", - "user_in", "Translator", "URL", "check_compatible", "required_folder", "wsgi", + "Condition", + "safely", + "utcnow", ] PY4WEB_CMD = sys.argv[0] @@ -92,13 +103,11 @@ HELPERS = {name: getattr(yatl.helpers, name) for name in yatl.helpers.__all__} ART = r""" -██████╗ ██╗ ██╗██╗ ██╗██╗ ██╗███████╗██████╗ -██╔══██╗╚██╗ ██╔╝██║ ██║██║ ██║██╔════╝██╔══██╗ -██████╔╝ ╚████╔╝ ███████║██║ █╗ ██║█████╗ ██████╔╝ -██╔═══╝ ╚██╔╝ ╚════██║██║███╗██║██╔══╝ ██╔══██╗ -██║ ██║ ██║╚███╔███╔╝███████╗██████╔╝ -╚═╝ ╚═╝ ╚═╝ ╚══╝╚══╝ ╚══════╝╚═════╝ -Is still experimental... +██████◣◥█◣ ◢█◤ ██ ██ ██ ██ ███████ ██████◣ +██ ██ ◥█◣◢█◤ ██ ██ ██ ██ ██ ██ ██ +██████◤ ◥██◤ ███████ ██ ◢◣ ██ ██████ ██████ +██ ██ ██ ◥█◣◢██◣◢█◤ ██ ██ ██ +██ ██ ██ ◥██◤◥██◤ ███████ ██████◤ """ Field = pydal.Field @@ -107,26 +116,35 @@ abort = bottle.abort os.environ.update( - {key: value for key, value in DEFAULTS.items() if not key in os.environ} + {key: value for key, value in DEFAULTS.items() if key not in os.environ} ) os.environ["PY4WEB_PATH"] = str(pathlib.Path(__file__).resolve().parents[1]) # hold all framework hooks in one place # NOTE: `after_request` hooks are not currently used -_REQUEST_HOOKS = types.SimpleNamespace(before=set()) +_REQUEST_HOOKS = types.SimpleNamespace(before=[]) def _before_request(*args, **kw): - [h(*args, **kw) for h in _REQUEST_HOOKS.before] + [ # pylint: disable=expression-not-assigned + h(*args, **kw) for h in _REQUEST_HOOKS.before + ] bottle.default_app().add_hook("before_request", _before_request) +# set to true to debug issues with fixtures +DEBUG = False +def utcnow(): + """returns the current time in utc""" + return datetime.datetime.now(datetime.timezone.utc) + def module2filename(module): + """given a module name as a string, convert to filename""" filename = os.path.join(*module.split(".")[1:]) filename = ( os.path.join(filename, "__init__.py") @@ -136,12 +154,21 @@ def module2filename(module): return filename +def load_module(name, path): + """load a module with name from math""" + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + spec.loader.exec_module(module) + return module + + def required_folder(*parts): """joins the args and creates the folder if not exists""" path = os.path.join(*parts) if not os.path.exists(path): os.makedirs(path) - assert os.path.isdir(path), "%s is not a folder as required" % path + assert os.path.isdir(path), f"{path} is not a folder as required" return path @@ -154,35 +181,22 @@ def safely(func, exceptions=(Exception,), log=False, default=None): return func() except exceptions as err: if log: - logging.warn(str(err)) + logging.warning(str(err)) return default() if callable(default) else default -######################################################################################## -# fix request.fullpath for the case of domain mapping to app -# (request.url will be autofixed, since it is based on request.fullpath) -######################################################################################### -def monkey_patch_bottle(): - urljoin = urllib.parse.urljoin - - @property - def fullpath(self): - appname = self.environ.get("HTTP_X_PY4WEB_APPNAME", "/") - return urljoin(self.script_name, self.path[len(appname) :]) - - setattr(bottle.BaseRequest, "fullpath", fullpath) - - -monkey_patch_bottle() - - ######################################################################################## # Implement a O(1) LRU cache and memoize with expiration and monitoring (using linked list) ######################################################################################### class Node: - def __init__(self, key=None, value=None, t=None, m=None, prev=None, next=None): + """A node for the LRU cache""" + + def __init__( + self, key=None, value=None, t=None, m=None, prev=None, next=None + ): # pylint: disable=redefined-builtin + """create a node of the LRU cache""" self.key, self.value, self.t, self.m, self.prev, self.next = ( key, value, @@ -207,6 +221,7 @@ class Cache: """ def __init__(self, size=1000): + """Create an LRU caching object""" self.free = size self.head = Node() self.tail = Node() @@ -217,7 +232,12 @@ def __init__(self, size=1000): def get(self, key, callback, expiration=3600, monitor=None): """If key not stored or key has expired and monitor == None or monitor() value has changed, returns value = callback()""" - node, t0 = self.mapping.get(key), time.time() + # set defaults + node = self.mapping.get(key) + t0 = time.time() + value = None + t = t0 + # update with self.lock: if node: # if a node was found remove it from storage @@ -238,7 +258,8 @@ def get(self, key, callback, expiration=3600, monitor=None): # ignore the value found node = None if node is None: - value, t = callback(), t0 + value = callback() + t = t0 # add the new node back into storage with self.lock: new_node = Node(key, value, t, m, prev=self.head, next=self.head.next) @@ -251,10 +272,12 @@ def get(self, key, callback, expiration=3600, monitor=None): return value def memoize(self, expiration=3600): + """Decorator to memorize the output of any fuction""" + def decorator(func): @functools.wraps(func) def memoized_func(*args, **kwargs): - key = "%s:%s:%s:%s" % (func.__module__, func.__name__, args, kwargs) + key = f"{func.__module__}:{func.__name__}:{args}:{kwargs}" return self.get( key, lambda args=args, kwargs=kwargs: func(*args, **kwargs), @@ -271,31 +294,31 @@ def memoized_func(*args, **kwargs): ######################################################################################### -def objectify(obj): +def objectify(obj): # pylint: disable=too-many-return-statements """converts the obj(ect) into a json serializable object""" + if hasattr(obj, "isoformat"): + return obj.isoformat().replace("T", " ") if isinstance(obj, numbers.Integral): return int(obj) - elif isinstance(obj, (numbers.Rational, numbers.Real)): + if isinstance(obj, (numbers.Rational, numbers.Real)): return float(obj) - elif isinstance(obj, (datetime.date, datetime.datetime, datetime.time)): - return obj.isoformat().replace("T", " ") - elif isinstance(obj, str): + if isinstance(obj, str): return obj - elif isinstance(obj, dict): + if isinstance(obj, dict): return obj - elif hasattr(obj, "as_list"): + if hasattr(obj, "as_list"): return obj.as_list() - elif hasattr(obj, "as_dict"): + if hasattr(obj, "as_dict"): return obj.as_dict() - elif hasattr(obj, "__iter__") or isinstance(obj, types.GeneratorType): + if isinstance(obj, (list, set, types.GeneratorType)): return list(obj) - elif hasattr(obj, "xml"): + if hasattr(obj, "xml"): return obj.xml() - elif isinstance( + if isinstance( obj, enum.Enum ): # Enum class handled specially to address self reference in __dict__ return dict(name=obj.name, value=obj.value, __class__=obj.__class__.__name__) - elif hasattr(obj, "__dict__") and hasattr(obj, "__class__"): + if hasattr(obj, "__dict__") and hasattr(obj, "__class__"): d = dict(obj.__dict__) d["__class__"] = obj.__class__.__name__ return d @@ -303,6 +326,7 @@ def objectify(obj): def dumps(obj, sort_keys=True, indent=2): + """General purpose memoize function with sane default""" return json.dumps(obj, default=objectify, sort_keys=sort_keys, indent=indent) @@ -311,89 +335,122 @@ def dumps(obj, sort_keys=True, indent=2): ######################################################################################### -class Fixture: - __request_master_ctx__ = threading.local() +class LocalUndefined(RuntimeError): + """ + Exception raised trying to access an unitialized thread local + from a Fixture + """ - @classmethod - def __init_request_ctx__(cls): - cls.__request_master_ctx__.request_ctx = dict() - @classmethod - def __mount_local__(cls, self, storage): - cls.__request_master_ctx__.request_ctx[self] = storage +class BareFixture: + """Minimal Fixture class - without thread local logic""" - @property - def _safe_local(self): - try: - ret = self.__request_master_ctx__.request_ctx[self] - except (KeyError, AttributeError) as err: - msg = 'py4web hint: check @action.uses() for the missing fixture {}'.format(self) - raise RuntimeError(msg) from err - return ret + # normally on_success/on_error are only called if none of the previous + # on_request failed, if a fixture is_hook then on_error is always called. + is_hook = False + + def on_request(self, context): # pylint: disable=unused-argument + """Method that will be called when a new HTTP request arrives""" + + def on_error(self, context): # pylint: disable=unused-argument + """Method that will be called when an HTTP request errors""" + + def on_success(self, context): # pylint: disable=unused-argument + """Method that will be called when an HTTP request succeeds""" + + +class Fixture(BareFixture): + """ + Fixture class - with thread local logic + all fixtures should inherit from this class + """ - @_safe_local.setter - def _safe_local(self, storage): - self.__mount_local__(self, storage) + ### being logic to handle safe thread local - def on_request(self): - pass # called when a request arrives + _local = threading.local() - def on_error(self): - pass # called when a request errors + @staticmethod + def local_initialize(obj): + """To be called in on_request if the Fixtures needs a thread local dict""" + if not hasattr(Fixture._local, "request_ctx"): + Fixture._local.request_ctx = {} + if obj in Fixture._local.request_ctx: + raise RuntimeError(f"initialize_thread_local called twice for {obj}") + Fixture._local.request_ctx[obj] = types.SimpleNamespace() - def on_success(self, status): - pass # called when a request is successful + @staticmethod + def local_delete(obj): + """To be called in on_success and on_error to cleat the thread local""" + del Fixture._local.request_ctx[obj] - def finalize(self): - pass # called in any case at the end of a request + @property + def local(self): + """Returns the fixture thread local dict if initialized else a default one""" + try: + return Fixture._local.request_ctx[self] + except (AttributeError, KeyError): + raise LocalUndefined(f"thread local not initialized for {self}") from None - def transform( - self, output, shared_data=None - ): # transforms the output, for example to apply template - return output + def is_valid(self): + """Checks if the fixture has a valid thread local dict""" + try: + Fixture._local.request_ctx[self] # pylint: disable=pointless-statement + return True + except (AttributeError, KeyError): + return False + ### end logic to handle safe thread local -_REQUEST_HOOKS.before.add(Fixture.__init_request_ctx__) +class Translator(BareFixture, pluralize.Translator): + """a Fixture wrapper for the pluralize.Translator""" -class Translator(pluralize.Translator, Fixture): - def on_request(self): + def on_request(self, context): + """Sets the request language from the request header""" + # important: pluralize.Translator has its own thread local self.select(request.headers.get("Accept-Language", "en")) - def on_success(self, status): - response.headers["Content-Language"] = self.local.tag + def on_success(self, context): + """Inject the selected language in the response header""" + response.headers.setdefault("Content-Language", self.local.tag) class DAL(pydal.DAL, Fixture): + """a Fixture wrappre for pydal.DAL""" - reconnect_on_request = True - - def on_request(self): - if self.reconnect_on_request: - self._adapter.reconnect() + def on_request(self, context): + """Retrieves a database connection from the pool""" + # important: the connection pool handles its own thread local + self.get_connection_from_pool_or_new() threadsafevariable.ThreadSafeVariable.restore(ICECUBE) - def on_error(self): - self.rollback() + def on_error(self, context): + """Rollback and recycle connection""" + self.recycle_connection_in_pool_or_close("rollback") - def on_success(self, status): - self.commit() + def on_success(self, context): + """Commit and recycle connection""" + self.recycle_connection_in_pool_or_close("commit") # make sure some variables in pydal are thread safe def thread_safe_pydal_patch(): - Field = pydal.DAL.Field + """Make the selected fields attributes thread local variables""" tsafe_attrs = [ "readable", "writable", "default", + "filter_in", + "filter_out", + "label", "update", "requires", "widget", "represent", ] for a in tsafe_attrs: - setattr(Field, a, threadsafevariable.ThreadSafeVariable()) + b = threadsafevariable.ThreadSafeVariable() + setattr(Field, a, b) # hack 'copy.copy' behavior, since it makes a shallow copy, # but ThreadSafe-attributes (see above) are class-level, so: @@ -440,51 +497,39 @@ def index(): Also notice all Flash objects share the same threading local so act as singletons """ - # this essential makes flash a singleton - # necessary because auth defines its own flash - # possible because flash does not depend on the app - - @property - def local(self): - return self._safe_local - - def on_request(self): - self._safe_local = types.SimpleNamespace() + def on_request(self, context): + """Retrieves flash message from cookie if present""" + Fixture.local_initialize(self) # when a new request arrives we look for a flash message in the cookie flash = request.get_cookie("py4web-flash") if flash: - self.local.flash = json.loads(flash) + self.local.flash = safely(lambda: json.loads(flash), default=None) else: self.local.flash = None - def on_success(self, status): + def on_success(self, context): + """Stores the flash message in cookie""" # if we redirect and have a flash message we move it to the session + status = context["status"] if status == 303 and self.local.flash: response.set_cookie("py4web-flash", json.dumps(self.local.flash), path="/") else: response.delete_cookie("py4web-flash", path="/") - - def finalize(self): - """Clears the local to prevent leakage.""" - self.local.__dict__.clear() + # if we have a valid flash message, we store it for the template to use later + output = context["output"] + flash = self.local.flash or "" + if isinstance(output, dict): + context["template_inject"]["flash"] = flash + elif self.local.flash is not None: + response.headers.setdefault("component-flash", json.dumps(flash)) def set(self, message, _class="", sanitize=True): + """Stores a message in the object thread safe storage""" # we set a flash message if sanitize: message = yatl.sanitizer.xmlescape(message) self.local.flash = {"message": message, "class": _class} - def transform(self, data, shared_data=None): - # if we have a valid flash message, we inject it in the response dict - if isinstance(data, dict): - if not "flash" in data: - data["flash"] = self.local.flash or "" - else: - if self.local.flash is not None: - response.headers["component-flash"] = json.dumps(self.local.flash) - self.local.flash = None - return data - ######################################################################################### # The Template Rendered Fixture @@ -492,23 +537,27 @@ def transform(self, data, shared_data=None): class RenoirXMLEscapeMixin: + """for internal Renoir use""" + def _escape_data(self, data): """Allows Renoir to convert yatl helpers to strings""" return safely( - lambda: data.xml(), default=lambda: self._to_html(self._to_unicode(data)) + lambda: data.xml(), # pylint: disable=unnecessary-lambda + default=lambda: self._to_html(self._to_unicode(data)), ) class RenoirCustomWriter(RenoirXMLEscapeMixin, renoir.writers.Writer): - ... + """for internal Renoir use""" class RenoirCustomEscapeAllWriter(RenoirXMLEscapeMixin, renoir.writers.EscapeAllWriter): - ... + """for internal Renoir use""" class Renoir(renoir.Renoir): """Custom Renoir Engine that understands yatl helpers""" + _writers = { renoir.constants.ESCAPES.common: RenoirCustomWriter, renoir.constants.ESCAPES.all: RenoirCustomEscapeAllWriter, @@ -519,42 +568,54 @@ def render( content=None, filename=None, path=".", - context={}, + context=None, delimiters="[[ ]]", cached_renoir_engines=Cache(100), ): """ - renders the template using renoire, same API as yatl.render, does caching of + Renders the template using renoire, same API as yatl.render, does caching of both Renoire engine and source files """ + context = context or {} engine = cached_renoir_engines.get( (path, delimiters), lambda: Renoir(path=path, delimiters=delimiters.split(" "), reload=True), ) if content is not None: - return engine._render(content, context=context) + return engine._render( # pylint: disable=protected-access + content, context=context + ) return engine.render(filename, context=context) class Template(Fixture): + """The Template Fixture class""" cache = Cache(100) def __init__(self, filename, path=None, delimiters="[[ ]]"): + """Initialized the template object""" self.filename = filename self.path = path self.delimiters = delimiters - def transform(self, output, shared_data=None): + def on_success(self, context): + """ + Filters the context output through the template + Also injects helpers in the output dict + """ + output = context["output"] + + # we only proceed furthed if the output is a dict if not isinstance(output, dict): - return output - context = dict(request=request) - context.update(HELPERS) - context.update(URL=URL) - if shared_data: - context.update(shared_data.get("template_context", {})) - context.update(output) - context["__vars__"] = output + return + + ctx = dict(request=request) + ctx.update(HELPERS) + ctx.update(URL=URL) + ctx.update(context["template_inject"]) + ctx.update(output) + ctx["__vars__"] = output app_folder = os.path.join(os.environ["PY4WEB_APPS_FOLDER"], request.app_name) path = self.path or os.path.join(app_folder, "templates") filename = os.path.join(path, self.filename) @@ -562,10 +623,9 @@ def transform(self, output, shared_data=None): generic_filename = os.path.join(path, "generic.html") if os.path.exists(generic_filename): filename = generic_filename - output = render( - filename=filename, path=path, context=context, delimiters=self.delimiters + context["output"] = render( + filename=filename, path=path, context=ctx, delimiters=self.delimiters ) - return output ######################################################################################### @@ -574,15 +634,18 @@ def transform(self, output, shared_data=None): class Session(Fixture): + """The Session Fixture""" # All apps share the same default secret if not specified. # important for _dashboard reload # the actual value is loaded from a file SECRET = None + _params = {} @property - def local(self): - return self._safe_local + def params(self): + """Returns the object parameters""" + return Session._params[self] def __init__( self, @@ -591,130 +654,186 @@ def __init__( algorithm="HS256", storage=None, same_site="Lax", + name="{app_name}_session", ): """ + Creates a session object. + secret is the shared key used to encrypt the session (using algorithm) expiration is in seconds (optional) storage must have a get(key) and set(key,value,expiration) methods - if not provided session is stored in jwt cookie else the jwt is stored in storage and its uuid key is stored in the cookie + session is stored signed and encrypted in the cookie """ - # assert Session.SECRET, "Missing Session.SECRET" - self.secret = secret or Session.SECRET - self.expiration = expiration - self.algorithm = algorithm - self.storage = storage - self.same_site = same_site + secret = secret or Session.SECRET + assert ( + isinstance(secret, str) + and not pydal.validators.IS_STRONG(entropy=50)(secret)[1] + ), "Not a good secret" + if isinstance(storage, Session): - self.__prerequisites__ = [storage] - if hasattr(storage, "__prerequisites__"): - self.__prerequisites__ = storage.__prerequisites__ - - def initialize(self, app_name="unknown", data=None, changed=False, secure=False): - self._safe_local = types.SimpleNamespace() - local = self.local - local.changed = changed - local.data = data or {} - local.session_cookie_name = "%s_session" % app_name - local.secure = secure + prerequisites = [storage] + elif hasattr(storage, "__prerequisites__"): + prerequisites = storage.__prerequisites__ + else: + prerequisites = [] + Session._params[self] = type( + "Object", + (), + dict( + secret=secret, + expiration=expiration, + algorithm=algorithm, + storage=storage, + same_site=same_site, + name=name, + prerequisites=prerequisites, + ), + ) + + @property + def __prerequisites__(self): + """Returns the session prerequisite fixtures""" + return self.params.prerequisites def load(self): - self.initialize( - app_name=request.app_name, - changed=False, - secure=request.url.startswith("https"), - ) + """Loads a session""" + app_name = request.app_name + params = self.params self_local = self.local - raw_token = ( - request.get_cookie(self_local.session_cookie_name) - or request.query.get("_session_token") + self_local.changed = False + self_local.data = {} + self_local.cookie_name = params.name.format(app_name=app_name) + self_local.secure = request.url.startswith("https") + raw_token = request.get_cookie(self_local.cookie_name) or request.query.get( + "_session_token" ) if not raw_token and request.method in {"POST", "PUT", "DELETE", "PATCH"}: raw_token = ( - request.forms and request.forms.get("_session_token") - or request.json and request.json.get("_session_token") + request.forms + and request.forms.get("_session_token") + or request.json + and request.json.get("_session_token") ) + if DEBUG: + logging.debug("Session token found %s", raw_token) + data = {} + # if we have a token in the query string of cookie if raw_token: - token_data = raw_token.encode() try: - if self.storage: - json_data = self.storage.get(token_data) + # if session i stored serverside + if params.storage: + # used token as id and retrieve data + token_data = raw_token.encode() + json_data = params.storage.get(token_data) + if isinstance(json_data, bytes): + json_data = json_data.decode("utf8") if json_data: - self_local.data = json.loads(json_data) + data = json.loads(json_data) else: - self_local.data = jwt.decode( - token_data, self.secret, algorithms=[self.algorithm] - ) - if self.expiration is not None and self.storage is None: - assert ( - self_local.data["timestamp"] > time.time() - int(self.expiration) - ) - assert self.get_data().get("secure") == self_local.secure - except Exception: - pass - if not "uuid" in self.get_data(): - self.clear() - - def get_data(self): - return getattr(self.local, "data", {}) + # rertieve the data from inside the token itself + try: + data = secure_loads(raw_token, params.secret.encode()) + except (AssertionError, json.JSONDecodeError): + data = {} + except Exception as err: + # something went wrong, unable to load session data + if DEBUG: + logging.debug("Session error %s", err) + # if the session data is valid update the current session + if ( + data.get("cookie_name") == self_local.cookie_name # have valid cookie + and data.get("secure") == self_local.secure # have valid security + and data.get("uuid") is not None # have a uuid + and ( + params.expiration is None # has not expired + or data["timestamp"] > time.time() - int(params.expiration) + ) + ): + self_local.data.update(data) # the take the loaded data def save(self): + """Saves the session""" + params = self.params self_local = self.local + # make sure the session constain these basic veriables + if "uuid" not in self_local.data: + self_local.data["uuid"] = str(uuid.uuid4()) self_local.data["timestamp"] = time.time() - if self.storage: + self_local.data["secure"] = self_local.secure + self_local.data["cookie_name"] = self_local.cookie_name + if params.storage: cookie_data = self_local.data["uuid"] - self.storage.set(cookie_data, json.dumps(self_local.data), self.expiration) - else: - cookie_data = jwt.encode( - self_local.data, self.secret, algorithm=self.algorithm + params.storage.set( + cookie_data, json.dumps(self_local.data), params.expiration ) - if isinstance(cookie_data, bytes): - cookie_data = cookie_data.decode() - + else: + cookie_data = secure_dumps(self_local.data, params.secret.encode()) + if DEBUG: + logging.debug("Session stored %s", cookie_data) response.set_cookie( - self_local.session_cookie_name, + self_local.cookie_name, cookie_data, path="/", secure=self_local.secure, - same_site=self.same_site, + same_site=params.same_site, + httponly=True, ) def get(self, key, default=None): - return self.get_data().get(key, default) + """Get the value for the key from session""" + try: + return self.local.data.get(key, default) + except LocalUndefined: + return default def __getitem__(self, key): - return self.get_data()[key] + """Session key getter""" + return self.local.data[key] def __delitem__(self, key): - if key in self.get_data(): + """Deletes a key from the session""" + if key in self.local.data: self.local.changed = True del self.local.data[key] def __setitem__(self, key, value): + """Session key setter""" self.local.changed = True self.local.data[key] = value + def __contains__(self, other): + """Checks if a key in session""" + return other in self.local.data + def keys(self): - return self.get_data().keys() + """Returns the session keys""" + return self.local.data.keys() + + def items(self): + """Returns the (key, value) in session""" + return self.local.data.items() def __iter__(self): - yield from self.get_data().items() + """Iterates over the session keys""" + yield from self.local.data.keys() + + __getattr__ = get + __setattr__ = __setitem__ + __delattr__ = __delitem__ def clear(self): - """Produces a brand-new session.""" + """Clears the session key""" self_local = self.local self_local.changed = True self_local.data.clear() - self_local.data["uuid"] = str(uuid.uuid1()) - self_local.data["secure"] = self_local.secure - def on_request(self): + def on_request(self, context): + """Initializes the session thread local and tries to load a session""" + Fixture.local_initialize(self) self.load() - def on_error(self): - if self.local.changed: - self.save() - - def on_success(self, status): + def on_success(self, context): + """Saves the session if its content changed""" if self.local.changed: self.save() @@ -724,16 +843,18 @@ def on_success(self, status): ######################################################################################### -def URL( +def URL( # pylint: disable=invalid-name *parts, - vars=None, - hash=None, + vars=None, # pylint: disable=redefined-builtin + hash=None, # pylint: disable=redefined-builtin scheme=False, signer=None, use_appname=None, static_version=None, ): """ + Generates a URL for the action. + Examples: URL('a','b',vars=dict(x=1),hash='y') -> /{script_name?}/{app_name?}/a/b?x=1#y URL('a','b',vars=dict(x=1),scheme=None) -> //{domain}/{script_name?}/{app_name?}/a/b?x=1 @@ -744,10 +865,11 @@ def URL( if use_appname is None: # force use_appname on domain-unmapped apps use_appname = not request.environ.get("HTTP_X_PY4WEB_APPNAME") + has_appname = False if use_appname: # app_name is not set by py4web shell app_name = getattr(request, "app_name", None) - has_appname = use_appname and app_name + has_appname = use_appname and app_name script_name = ( request.environ.get("SCRIPT_NAME", "") or request.environ.get("HTTP_X_SCRIPT_NAME", "") @@ -755,16 +877,16 @@ def URL( if parts and parts[0].startswith("/"): prefix = "" elif has_appname and app_name != "_default": - prefix = "%s/%s/" % (script_name, app_name) + prefix = f"{script_name}/{app_name}/" else: - prefix = "%s/" % script_name + prefix = f"{script_name}/" broken_parts = [] for part in parts: broken_parts += str(part).rstrip("/").split("/") if static_version != "" and broken_parts and broken_parts[0] == "static": if not static_version: # try to retrieve from __init__.py - app_module = "apps.%s" % app_name if has_appname else "apps" + app_module = f"apps.{app_name}" if has_appname else "apps" try: static_version = getattr( sys.modules[app_module], "__static_version__", None @@ -774,7 +896,8 @@ def URL( if static_version: broken_parts.insert(1, "_" + static_version) - url = prefix + "/".join(map(urllib.parse.quote, broken_parts)) + url_prefix = os.environ.get("PY4WEB_URL_PREFIX", "") + url = url_prefix + prefix + "/".join(map(urllib.parse.quote, broken_parts)) # Signs the URL if required. Copy vars into urlvars not to modify it. urlvars = dict(vars) if vars else {} if signer: @@ -783,11 +906,11 @@ def URL( signer.sign(prefix + "/".join(broken_parts), urlvars) if urlvars: url += "?" + "&".join( - "%s=%s" % (k, urllib.parse.quote(str(v))) for k, v in urlvars.items() + f"{k}={urllib.parse.quote(str(v))}" for k, v in urlvars.items() ) if hash: - url += "#%s" % hash - if not scheme is False: + url += f"#{hash}" + if scheme is not False: original_url = request.environ.get("HTTP_ORIGIN") or request.url orig_scheme, _, domain = original_url.split("/", 3)[:3] if scheme is True: @@ -796,7 +919,7 @@ def URL( scheme = "" else: scheme += ":" - url = "%s//%s%s" % (scheme, domain, url) + url = f"{scheme}//{domain}{url}" return url @@ -806,38 +929,35 @@ def URL( class HTTP(BaseException): - class Type: - success = "success" - error = "error" - - """Our HTTP exception does not delete cookies and headers like the bottle.HTTPResponse does; - since it is considered a success, not a failure""" + """An exception that is considered success""" - def __init__(self, status, type=Type.success): + def __init__(self, status, body="", headers=None): + """Makes an HTTP object""" self.status = status - self.type = type + self.body = body + self.headers = headers or {} def redirect(location): - """our redirect does not delete cookies and headers like bottle.HTTPResponse does; - it is considered a success, not failure""" - response.set_header("Location", location) + """Raises HTTP(303) to redirect to the specified location""" + response.headers.setdefault("Location", location) raise HTTP(303) -class action: +class action: # pylint: disable=invalid-name """@action(...) is a decorator for functions to be exposed as actions""" registered = set() app_name = "_default" def __init__(self, path, **kwargs): + """Constructs the action decorator""" self.path = path self.kwargs = kwargs @staticmethod def uses(*fixtures_in): - """Find all fixtures, including dependencies, topologically sorted""" + """Used to declare needed fixtures, they will be topologically sorted""" fixtures = [] reversed_fixtures = [] stack = list(fixtures_in) @@ -848,52 +968,65 @@ def uses(*fixtures_in): for fixture in reversed(reversed_fixtures): if isinstance(fixture, str): fixture = Template(fixture) - if not fixture in fixtures: + if fixture not in fixtures: fixtures.append(fixture) def decorator(func): + if DEBUG: + # in debug mode log all calls to fixtures + def call_f(f, context): + logging.debug( + "Calling %s.%s", f.__self__.__class__.__name__, f.__name__ + ) + return f(context) + + else: + + def call_f(f, context): + return f(context) + @functools.wraps(func) def wrapper(*args, **kwargs): # data shared by all fixtures in the pipeline for each request - shared_data = {"template_context": {}} + processed = [] + context = { + "fixtures": fixtures, + "status": 200, + "output": None, + "exception": None, + "processed": processed, + "template_inject": {}, + } try: - [obj.on_request() for obj in fixtures] - ret = func(*args, **kwargs) - for obj in fixtures: - ret = obj.transform(ret, shared_data) - [obj.on_success(200) for obj in fixtures] - return ret - except HTTP as http: - if http.type == http.Type.success: - [obj.on_success(http.status) for obj in fixtures] - else: - [obj.on_error() for obj in fixtures] - # it should be [obj.on_error(status) for obj in fixtures] - # but it breaks users fixtures - # `def on_error(status = None):` - cost nothing, but we have `def on_error():` - raise - except Exception: - [obj.on_error() for obj in fixtures] + for fixture in fixtures: + call_f(fixture.on_request, context) + processed.append(fixture) + context["output"] = func(*args, **kwargs) + except HTTP as http_exception: + context["status"] = http_exception.status + raise http_exception + except bottle.HTTPError as error: + context["exception"] = error + except bottle.HTTPResponse: raise + except Exception as error: + context["exception"] = error finally: - [obj.finalize() for obj in fixtures] - # Clears the current object to prevent leakage. - - return wrapper - - return decorator - - @staticmethod - def requires(*requirements): - """Enforces requirements or calls bottle.abort(401)""" - - def decorator(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - for requirement in requirements: - if not requirement(): - bottle.abort(401) - return func(*args, **kwargs) + for fixture in reversed(fixtures): + if fixture in processed or getattr(fixture, "is_hook", False): + try: + if context.get("exception"): + call_f(fixture.on_error, context) + else: + call_f(fixture.on_success, context) + except Exception as err: + context["exception"] = context.get("exception") or err + for fixture in reversed(fixtures): + safely(lambda: Fixture.local_delete(fixture)) + exception = context.get("exception") + if isinstance(exception, Exception): + raise exception + return context.get("output", "") return wrapper @@ -908,58 +1041,75 @@ def wrapper(*func_args, **func_kwargs): try: request.app_name = app_name ret = func(*func_args, **func_kwargs) - if isinstance(ret, dict): - response.headers["Content-Type"] = "application/json" + if isinstance(ret, (list, dict)): + response.headers.setdefault("Content-Type", "application/json") ret = dumps(ret) + elif ret is None: + ret = "" + elif isinstance(ret, yatl.helpers.TAGGER): + ret = str(ret) + elif not hasattr(ret, "__iter__"): + raise RuntimeError(f"Cannot return type {ret.__class__.__name__}") return ret - except HTTP as http: - response.status = http.status - return getattr(http, "body", "") + except HTTP as http_exception: + response.status = http_exception.status + response.headers.update(http_exception.headers) + body = http_exception.body + return dumps(body) if isinstance(body, (list, dict)) else str(body) except bottle.HTTPResponse: raise - except Exception: + except Exception: # pylint: disable=broad-exception-caught snapshot = get_error_snapshot() logging.error(snapshot["traceback"]) ticket_uuid = error_logger.log(request.app_name, snapshot) or "unknown" - raise bottle.HTTPResponse( - body=error_page( - 500, - button_text=ticket_uuid, - href="/_dashboard/ticket/" + ticket_uuid, - ), - status=500, + response.status = 500 + return error_page( + 500, + button_text=ticket_uuid, + href="/_dashboard/ticket/" + ticket_uuid, ) return wrapper def __call__(self, func): """Building the decorator""" - trailing = "<:re:/?>" app_name = action.app_name - base_path = "" if app_name == "_default" else "/%s" % app_name - path = (base_path + "/" + self.path).rstrip("/") - if not func in self.registered: - func = action.catch_errors(app_name, func) - func = bottle.route(path + trailing, **self.kwargs)(func) + if self.path[0] == "/": + path = self.path.rstrip("/") or "/" + else: + base_path = "" if app_name == "_default" else f"/{app_name}" + path = (f"{base_path}/{self.path}").rstrip("/") + Reloader.register_route(app_name, path, self.kwargs, func) if path.endswith("/index"): # /index is always optional - func = bottle.route(path[:-6] + trailing, **self.kwargs)(func) - self.registered.add(func) + short_path = path[:-6] or "/" + Reloader.register_route(app_name, short_path, self.kwargs, func) return func -def user_in(session): - def requirement(): - session.on_request() - return session.get("user", None) is not None +class Condition(Fixture): + """The Condition Fixture""" - return requirement + def __init__(self, condition, on_false=None, exception=HTTP(400)): + """Creates a fixture that checks for a given condition""" + self.condition = condition + self.on_false = on_false + self.exception = exception + + def on_request(self, context): + """Checks if the condition is true or false""" + if not self.condition(): + if self.on_false is not None: + self.on_false() + raise self.exception ######################################################################################### # Monkey Patch: Cookies ######################################################################################### -http.cookies.Morsel._reserved["same-site"] = "SameSite" +http.cookies.Morsel._reserved["same-site"] = ( # pylint: disable=protected-access + "SameSite" +) ######################################################################################### # Monkey Patch: ssl bug for gevent @@ -979,6 +1129,7 @@ def new_sslwrap( ca_certs=None, ciphers=None, ): + """Used to support HTTP""" context = __ssl__.SSLContext(ssl_version) context.verify_mode = cert_reqs or __ssl__.CERT_NONE if ca_certs: @@ -988,7 +1139,9 @@ def new_sslwrap( if ciphers: context.set_ciphers(ciphers) caller_self = inspect.currentframe().f_back.f_locals["self"] - return context._wrap_socket(sock, server_side=server_side, ssl_sock=caller_self) + return context._wrap_socket( # pylint: disable=protected-access + sock, server_side=server_side, ssl_sock=caller_self + ) ######################################################################################### @@ -997,14 +1150,28 @@ def new_sslwrap( def get_error_snapshot(depth=5): - """Return a dict describing a given traceback (based on cgitb.text).""" + """Return a dict describing a given traceback.""" + + tb = traceback.format_exc() + errorlog = os.environ.get("PY4WEB_ERRORLOG") + if errorlog: + msg = f"[{datetime.datetime.now().isoformat()}]: {tb}\n" + if errorlog == ":stderr": + sys.stderr.write(msg) + elif errorlog == ":stdout": + sys.stdout.write(msg) + elif errorlog == "tickets_only": + ... + else: + with portalocker.Lock(errorlog, "a", timeout=2) as fp: + fp.write(msg) etype, evalue, etb = sys.exc_info() if isinstance(etype, type): etype = etype.__name__ data = {} - data["timestamp"] = datetime.datetime.utcnow().isoformat().replace("T", " ") + data["timestamp"] = utcnow().isoformat().replace("T", " ") data["python_version"] = sys.version platform_keys = [ "machine", @@ -1026,7 +1193,7 @@ def get_error_snapshot(depth=5): data["platform_info"] = {key: getattr(platform, key)() for key in platform_keys} data["os_environ"] = {key: str(value) for key, value in os.environ.items()} - data["traceback"] = traceback.format_exc() + data["traceback"] = tb data["exception_type"] = str(etype) data["exception_value"] = str(evalue) @@ -1035,38 +1202,30 @@ def get_error_snapshot(depth=5): del etb # Prevent circular references that would cause memory leaks data["stackframes"] = stackframes = [] - for frame, file, lnum, func, lines, idx in items: + for frame, file, lnum, func, lines, idx in items: # pylint: disable=unused-variable file = file and os.path.abspath(file) or "?" - args, varargs, varkw, locals = inspect.getargvalues(frame) + # TODO: call inspect.getargvalues(frame) and get more info # Basic frame information f = {"file": file, "func": func, "lnum": lnum} f["code"] = lines - # FIXME: disable this for now until we understand why this goes into infinite loop - if False: - line_vars = cgitb.scanvars( - lambda: linecache.getline(file, lnum), frame, locals - ) - # Dump local variables (referenced in current line only) - f["vars"] = { - key: repr(value) - for key, value in locals.items() - if not key.startswith("__") - } stackframes.append(f) return data class SimpleErrorLogger: + """Simple Error Logger""" + def log(self, app_name, snapshot): - """logs the error""" - logging.error("%s error:\n%s" % (app_name, snapshot["traceback"])) - return None + """Logs the error""" + logging.error("%s error:\n%s", app_name, snapshot["traceback"]) class DatabaseErrorLogger: + """Database Error Logger""" + def __init__(self): - """creates the py4web_error table in the service database""" + """Creates the py4web_error table in the service database""" uri = os.environ["PY4WEB_SERVICE_DB_URI"] folder = os.environ["PY4WEB_SERVICE_FOLDER"] self.db = DAL(uri, folder=folder) @@ -1084,28 +1243,28 @@ def __init__(self): self.db.commit() def log(self, app_name, error_snapshot): - """store error snapshot (ticket) in the database""" + """Store error snapshot (ticket) in the database""" ticket_uuid = str(uuid.uuid4()) try: - id = self.db.py4web_error.insert( + self.db.py4web_error.insert( uuid=ticket_uuid, app_name=app_name, method=request.method, path=request.path, - timestamp=datetime.datetime.utcnow(), + timestamp=utcnow(), client_ip=request.environ.get("REMOTE_ADDR"), error=error_snapshot["exception_value"], snapshot=error_snapshot, ) self.db.commit() return ticket_uuid - except Exception as err: + except Exception as err: # pylint: disable=broad-exception-caught logging.error(str(err)) self.db.rollback() return None def get(self, ticket_uuid=None): - """retrieve a ticket from error database""" + """Retrieve a ticket from error database""" db = self.db if ticket_uuid: query, orderby = db.py4web_error.uuid == ticket_uuid, None @@ -1130,14 +1289,13 @@ def get(self, ticket_uuid=None): return rows if not ticket_uuid else rows[0] if rows else None def clear(self): - """erase all tickets from database""" + """Erase all tickets from database""" db = self.db db(db.py4web_error).delete() self.db.commit() class ErrorLogger: - """ To create your own custom logger for an app: @@ -1155,17 +1313,17 @@ def __init__(self): self.plugins = {} def initialize(self): - """try inizalize database if we have service folder""" + """Try inizalize database if we have service folder""" self.database_logger = safely(DatabaseErrorLogger, log=True) def _get_logger(self, app_name): - """get the appropriate logger for the app""" + """Get the appropriate logger for the app""" return ( self.plugins.get(app_name) or self.database_logger or self.fallback_logger ) def log(self, app_name, error_snapshot): - """log the error snapshot""" + """Log the error snapshot""" logger = self._get_logger(app_name) ticket_uuid = safely(lambda: logger.log(app_name, error_snapshot)) if not ticket_uuid: @@ -1181,34 +1339,41 @@ def log(self, app_name, error_snapshot): class Reloader: + """ + Class responsible for loading/readloading apps + """ - ROUTES = [] + ROUTES = collections.defaultdict(list) MODULES = {} ERRORS = {} @staticmethod def install_reloader_hook(): + """Installs the Reloader hook, checks for changes at every request""" + # used by watcher - def hook(*a, **k): + def hook(*args, **kwargs): # pylint: disable=unused-argument app_name = request.path.split("/")[1] - if app_name in DIRTY_APPS: + if app_name not in Reloader.ROUTES: + app_name = "_default" + if DIRTY_APPS.get(app_name): Reloader.import_app(app_name) - del DIRTY_APPS[app_name] + DIRTY_APPS[app_name] = False ## APP_WATCH tasks, if used by any app try_app_watch_tasks() - _REQUEST_HOOKS.before.add(hook) + _REQUEST_HOOKS.before.append(hook) @staticmethod - def clear_routes(app_name=None): - app = bottle.default_app() - routes = app.routes[:] - app.routes.clear() - app.router = bottle.Router() - if app_name: - for route in routes: - if route.rule.rstrip("<:re:/?>")[1:].split("/")[0] != app_name: - app.add_route(route) + def clear_routes(app_names=None): + """Clears all stored routes""" + remove_route = bottle.default_app().router.remove + if app_names is None: + app_names = Reloader.ROUTES.keys() + for app_name in app_names: + for route in Reloader.ROUTES[app_name]: + remove_route(route["rule"]) + Reloader.ROUTES[app_name] = [] @staticmethod def import_apps(): @@ -1218,24 +1383,28 @@ def import_apps(): # if first time reload dummy top module if not Reloader.MODULES: path = os.path.join(folder, "__init__.py") - loader = importlib.machinery.SourceFileLoader("apps", path) - loader.load_module() + load_module("apps", path) # noqa: F841 # Then load all the apps as submodules - for app_name in os.listdir(folder): + if os.environ.get("PY4WEB_APP_NAMES"): + app_names = os.environ.get("PY4WEB_APP_NAMES").split(",") + else: + app_names = os.listdir(folder) + for app_name in app_names: Reloader.import_app(app_name, clear_before_import=False) @staticmethod def import_app(app_name, clear_before_import=True): + """Imports a specified app and its routes""" if clear_before_import: - Reloader.clear_routes(app_name) + Reloader.clear_routes([app_name]) + Reloader.ROUTES[app_name] = [] folder = os.environ["PY4WEB_APPS_FOLDER"] path = os.path.join(folder, app_name) init = os.path.join(path, "__init__.py") if os.path.isdir(path) and not path.endswith("__") and os.path.exists(init): - action.app_name = app_name - module_name = "apps.%s" % app_name + module_name = f"apps.{app_name}" def clear_modules(): # all files/submodules @@ -1250,64 +1419,74 @@ def clear_modules(): try: module = Reloader.MODULES.get(app_name) if not module: - click.echo("[ ] loading %s ..." % app_name) + click.echo(f"[ ] loading {app_name} ...") else: - click.echo("[ ] reloading %s ..." % app_name) + click.echo(f"[ ] reloading {app_name} ...") # forget the module del Reloader.MODULES[app_name] clear_modules() - module = importlib.machinery.SourceFileLoader( - module_name, init - ).load_module() - click.secho("\x1b[A[X] loaded %s " % app_name, fg="green") + + module = load_module(module_name, init) + + click.secho(f"\x1b[A[X] loaded {app_name} ", fg="green") Reloader.MODULES[app_name] = module Reloader.ERRORS[app_name] = None - except Exception as err: + except Exception as err: # pylint: disable=broad-exception-caught Reloader.ERRORS[app_name] = traceback.format_exc() error_logger.log(app_name, get_error_snapshot()) click.secho( - "\x1b[A[FAILED] loading %s (%s)" % (app_name, err), + f"\x1b[A[FAILED] loading {app_name} ({err})", fg="red", ) # clear all files/submodules if the loading fails clear_modules() - return None # Expose static files with support for static asset management static_folder = os.path.join(path, "static") if os.path.exists(static_folder): app_name = path.split(os.path.sep)[-1] - prefix = "" if app_name == "_default" else ("/%s" % app_name) + prefix = "" if app_name == "_default" else f"/{app_name}" + path = prefix + r"/static/" - @bottle.route(prefix + "/static/") - @bottle.route( - prefix + "/static/_/" - ) - def server_static(filename, static_folder=static_folder, version=None): + def server_static(fp, static_folder=static_folder): + """Action that serves static/ files""" + filename = fp response.headers.setdefault("Pragma", "cache") response.headers.setdefault("Cache-Control", "private") return bottle.static_file(filename, root=static_folder) - # Register routes list - app = bottle.default_app() - routes = [] - for route in app.routes: - func = route.callback - rule = route.rule - # remove optional trailing / from rule - if rule.endswith("<:re:/?>"): - rule = rule[:-8] - routes.append( + Reloader.register_route(app_name, path, {"method": "GET"}, server_static) + + # Very important to make sure actions can modify Field attributes + # in a thread safe manner + ICECUBE.update(threadsafevariable.ThreadSafeVariable.freeze()) + + @staticmethod + def register_route(app_name, rule, kwargs, func): + """Given an app_name and a rule registers the corresponding routes""" + url_prefix = os.environ.get("PY4WEB_URL_PREFIX", "") + if url_prefix and rule == "/": + rule = "" + else: + rule = url_prefix + rule + dec_func = action.catch_errors(app_name, func) + if "method" not in kwargs: + kwargs["method"] = ["GET", "POST"] + bottle.route(rule, **kwargs)(dec_func) + filename = module2filename(func.__module__) + methods = kwargs.get("method") + if isinstance(methods, str): + methods = [methods] + for method in methods: + Reloader.ROUTES[app_name].append( { "rule": rule, - "method": route.method, - "filename": module2filename(func.__module__), + "method": method, + "filename": filename, "action": func.__name__, } ) - Reloader.ROUTES = sorted(routes, key=lambda item: item["rule"]) - ICECUBE.update(threadsafevariable.ThreadSafeVariable.freeze()) ######################################################################################### @@ -1315,31 +1494,42 @@ def server_static(filename, static_folder=static_folder, version=None): ######################################################################################### ERROR_PAGES = { - "*": '

    [[=code]]

    [[=message]]

    [[if button_text:]][[=button_text]][[pass]]', + "*": ( + "" + '

    [[=code]]

    [[=message]]

    [[if button_text:]][[=button_text]][[pass]]' + ), } -def error_page(code, button_text=None, href="#", color=None, message=None): - message = http.client.responses[code].upper() if message is None else message +def error_page(http_code, button_text=None, href="#", color=None, message=None): + """Generates an error page""" + if button_text: + button_text = sanitize_html.escape(button_text) + href = sanitize_html.escape(href) + message = http.client.responses[http_code].upper() if message is None else message color = ( - {"4": "#F44336", "5": "#607D8B"}.get(str(code)[0], "#2196F3") + {"4": "#F44336", "5": "#607D8B"}.get(str(http_code)[0], "#2196F3") if not color else color ) context = dict( - code=code, message=message, button_text=button_text, href=href, color=color + code=http_code, message=message, button_text=button_text, href=href, color=color ) # if client accepts 'application/json' - return json if re.search(REGEX_APPJSON, request.headers.get("accept", "")): - response.status = code + response.status = http_code return json.dumps(context) # else - return html error-page - content = ERROR_PAGES.get(code) or ERROR_PAGES["*"] + content = ERROR_PAGES.get(http_code) or ERROR_PAGES["*"] return render(content=content, context=context, delimiters="[[ ]]") @bottle.error(404) -def error404(error): +def error404(error): # pylint: disable=unused-argument + """Generates a 404 page""" guess_app_name = ( "index" if request.environ.get("HTTP_X_PY4WEB_APPNAME") @@ -1362,34 +1552,24 @@ def error404(error): # Web Server and Reload Logic: Operations ######################################################################################### -DIRTY_APPS = dict() # apps that need to be reloaded (lazy watching) - -from collections import OrderedDict -from inspect import stack +DIRTY_APPS = dict() # apps that need to be reloaded (lazy watching) APP_WATCH = {"files": dict(), "handlers": OrderedDict(), "tasks": dict()} -""" Decorator that binds a func as an watchdog handler of non-'.py' files. -Paths to files must be relative to app, w/o app name(folder). - -@app_watch_handler(['static/sass/all.sass', 'static/sass/main.sass']) -def sass_compile(changed_files): - print(changed_files); # paths of files that changed, for info - sass.compile() -""" - def app_watch_handler(watched_app_subpaths): + """Finds files to watch for changes""" + stack = inspect.stack invoker = pathlib.Path(stack()[1].filename) apps_path = pathlib.Path(os.environ["PY4WEB_APPS_FOLDER"]) app = invoker.relative_to(os.environ["PY4WEB_APPS_FOLDER"]).parts[0] def decorator(func): - handler = "{}.{}".format(func.__module__, func.__name__) + handler = f"{func.__module__}.{func.__name__}" APP_WATCH["handlers"][handler] = func for subpath in watched_app_subpaths: app_path = apps_path.joinpath(app, subpath).as_posix() - if not app_path in APP_WATCH["files"]: + if app_path not in APP_WATCH["files"]: APP_WATCH["files"][app_path] = [] APP_WATCH["files"][app_path].append(handler) return func @@ -1398,6 +1578,7 @@ def decorator(func): def try_app_watch_tasks(): + """If there are watch tasks, executes them when files change""" if APP_WATCH["tasks"]: tried_tasks = [] for handler in APP_WATCH["tasks"]: @@ -1405,7 +1586,7 @@ def try_app_watch_tasks(): try: APP_WATCH["handlers"][handler](changed_files_dict.keys()) tried_tasks.append(handler) - except Exception: + except Exception: # pylint: disable=broad-exception-caught logging.error(traceback.format_exc()) ## remove executed tasks from register for handler in tried_tasks: @@ -1413,34 +1594,49 @@ def try_app_watch_tasks(): def watch(apps_folder, server_config, mode="sync"): + """Watches files for change""" + def watch_folder_event_loop(apps_folder): + """Main event loop looking for file changes""" loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(watch_folder(apps_folder)) async def watch_folder(apps_folder): - click.echo( - "watching (%s-mode) python file changes in: %s" % (mode, apps_folder) - ) + """Async function that watches a folder for changes""" + click.echo(f"watching ({mode}-mode) python file changes in: {apps_folder}") + + # Then load all the apps as submodules + if os.environ.get("PY4WEB_APP_NAMES"): + app_names = os.environ.get("PY4WEB_APP_NAMES").split(",") + else: + app_names = None + async for changes in awatch(os.path.join(apps_folder)): apps = [] for subpath in [pathlib.Path(pair[1]) for pair in changes]: name = subpath.relative_to(apps_folder).parts[0] + # ignore apps not listed in app names + if app_names is not None and name not in app_names: + continue + # record the name of the app that changed if subpath.suffix == ".py": apps.append(name) ## manage `app_watch_handler` decorators elif subpath.as_posix() in APP_WATCH["files"]: handlers = APP_WATCH["files"][subpath.as_posix()] for handler in handlers: - if not handler in APP_WATCH["tasks"]: + if handler not in APP_WATCH["tasks"]: APP_WATCH["tasks"][handler] = {} APP_WATCH["tasks"][handler][subpath.as_posix()] = True + # reimport the apps the changed for name in apps: if mode == "lazy": DIRTY_APPS[name] = True else: Reloader.import_app(name) + ## in 'lazy' mode it's done in bottle's 'before_request' hook if mode != "lazy": try_app_watch_tasks() @@ -1448,12 +1644,16 @@ async def watch_folder(apps_folder): if server_config["number_workers"] > 1: click.echo("--watch option has no effect in multi-process environment \n") return - elif server_config["server"].startswith(("wsgiref", "waitress", "rocket")): + + if server_adapters.blocking.get(server_config["server"]): # these servers block the main thread so we open a new thread for the file watcher threading.Thread( target=watch_folder_event_loop, args=(apps_folder,), daemon=True ).start() elif server_config["server"] == "tornado": + if server_config["platform"] == "windows" and sys.version_info >= (3, 8): + # see https://bugs.python.org/issue37373 FIX: tornado/py3.8 on window + asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) # tornado delegate to asyncio so we add a future into the event loop asyncio.ensure_future(watch_folder(apps_folder)) elif server_config["server"].startswith("gevent"): @@ -1466,42 +1666,64 @@ async def watch_folder(apps_folder): Reloader.install_reloader_hook() -def start_server(kwargs, ctrl_c_orig): +def log_routes(apps_routes, out_file="routes-py4web.txt"): + """Logs defined routes to a file""" + tmp = os.environ.get("TEMPDIR", "/tmp") + path_out_file = os.path.join(tmp, out_file) + try: + with open(path_out_file, "w", encoding="utf8") as f: + f.write( + "\n".join( + [ + v.rule if "\r" in k else ("/" + k) + for k, v in sorted(apps_routes.items()) + ] + ) + ) + print(f"{len(apps_routes)} routes written to {path_out_file}") + except OSError as ex: + sys.exit(ex) + + +def start_server(kwargs): + """Starts the web server""" host = kwargs["host"] port = int(kwargs["port"]) apps_folder = kwargs["apps_folder"] number_workers = kwargs["number_workers"] - params = dict(host=host, port=port, reloader=False) + quiet = kwargs["quiet"] + logging_level = kwargs["logging_level"] + params = dict( + host=host, port=port, reloader=False, quiet=quiet, logging_level=logging_level + ) server_config = dict( platform=platform.system().lower(), server=None if kwargs["server"] == "default" else kwargs["server"], number_workers=number_workers, ) - if server_config["server"]: - for e in ("rocket", "Twisted"): - if e in server_config["server"]: - signal.signal(signal.SIGINT, ctrl_c_orig) - break - if not server_config["server"]: - if server_config["platform"] == "windows": - server_config["server"] = "tornado" - if sys.version_info >= ( - 3, - 8, - ): # see https://bugs.python.org/issue37373 FIX: tornado/py3.8 on windows - asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) - elif number_workers <= 1: - server_config["server"] = "tornado" + if server_config["platform"] == "windows" or number_workers < 2: + server_config["server"] = "rocket" else: if not gunicorn: logging.error("gunicorn not installed") return server_config["server"] = "gunicorn" - params["server"] = server_config["server"] - if params["server"] in server_adapters.__all__: - params["server"] = getattr(server_adapters, params["server"])() + + # Catch interrupts like Ctrl-C if needed + def kill_all(sig, _): + if hasattr(signal, "SIGKILL"): + # on linux and mac + os.kill(os.getpid(), signal.SIGKILL) + else: + # on windows + os.kill(os.getpid(), signal.SIGINT) + + signal.signal(signal.SIGINT, kill_all) + + adapter = server_adapters.available.get(server_config["server"]) + params["server"] = adapter or server_config["server"] if number_workers > 1: params["workers"] = number_workers if server_config["server"] == "gunicorn": @@ -1511,20 +1733,29 @@ def start_server(kwargs, ctrl_c_orig): params["keyfile"] = kwargs["ssl_key"] if server_config["server"] == "gevent": + if kwargs["watch"] != "off": + print("Error: watch doesn't work with gevent. ") + print("invoke py4web with `--watch off` or choose another server. ") + sys.exit(255) + if not hasattr(_ssl, "sslwrap"): _ssl.sslwrap = new_sslwrap if kwargs["watch"] != "off": watch(apps_folder, server_config, kwargs["watch"]) + + if kwargs["routes"]: + log_routes(bottle.default_app().routes) + bottle.run(**params) -def check_compatible(version): +def check_compatible(py4web_version): """To be called by apps to check if module version is compatible with py4web requirements""" - from . import __version__ + from . import __version__ # pylint: disable=import-outside-toplevel return tuple(map(int, __version__.split("."))) >= tuple( - map(int, version.split(".")) + map(int, py4web_version.split(".")) ) @@ -1559,6 +1790,7 @@ def __init__(self, pkg, pkg_alias="apps"): sys.meta_path.append(self) def find_spec(self, fullname, path=None, target=None): + """Loads the spec for the module at fullname""" if fullname == self.pkg_alias and path is None: spec = importlib.util.find_spec(self.pkg) if spec: @@ -1567,9 +1799,11 @@ def find_spec(self, fullname, path=None, target=None): fullname, spec.origin ) return spec + return None -def install_args(kwargs, reinstall_apps=False): +def install_args(kwargs, reinstall_apps=False): # pylint: disable=too-many-statements + """Handles the command line argumens and adds them to the os.environ""" # always convert apps_folder to an absolute path apps_folder = kwargs["apps_folder"] = os.path.abspath(kwargs["apps_folder"]) kwargs["service_folder"] = os.path.join( @@ -1578,10 +1812,17 @@ def install_args(kwargs, reinstall_apps=False): kwargs["service_db_uri"] = DEFAULTS["PY4WEB_SERVICE_DB_URI"] for key, val in kwargs.items(): os.environ["PY4WEB_" + key.upper()] = str(val) + + global DEBUG # pylint: disable=global-statement + DEBUG = kwargs.get("debug", False) + + logging.getLogger().setLevel( + 0 if DEBUG else kwargs.get("logging_level", logging.WARNING) + ) yes2 = yes = kwargs.get("yes", False) # If the apps folder does not exist create it and populate it if not os.path.exists(apps_folder): - if yes or click.confirm("Create missing folder %s?" % apps_folder): + if yes or click.confirm(f"Create missing folder {apps_folder}?"): os.makedirs(apps_folder) yes2 = True else: @@ -1589,15 +1830,15 @@ def install_args(kwargs, reinstall_apps=False): sys.exit(0) init_py = os.path.join(apps_folder, "__init__.py") if not os.path.exists(init_py): - if yes2 or click.confirm("Create missing init file %s?" % init_py): + if yes2 or click.confirm(f"Create missing init file {init_py}?"): with open(init_py, "wb"): - pass + ... else: click.echo("Command aborted") sys.exit(0) # ensure that "import apps.someapp" works apps_folder_parent, apps_folder_name = os.path.split(apps_folder) - if not apps_folder_parent in sys.path: + if apps_folder_parent not in sys.path: sys.path.insert(0, apps_folder_parent) if apps_folder_name != "apps": MetaPathRouter(apps_folder_name) @@ -1606,13 +1847,13 @@ def install_args(kwargs, reinstall_apps=False): os.mkdir(kwargs["service_folder"]) session_secret_filename = os.path.join(kwargs["service_folder"], "session.secret") if not os.path.exists(session_secret_filename): - with open(session_secret_filename, "w") as fp: + with open(session_secret_filename, "w", encoding="utf8") as fp: fp.write(str(uuid.uuid4())) - with open(session_secret_filename) as fp: + with open(session_secret_filename, "r", encoding="utf8") as fp: Session.SECRET = fp.read() - # after everything is etup but before installing apps, init + # after everything is setup but before installing apps, init error_logger.initialize() # Reinstall apps from zipped ones in assets @@ -1627,8 +1868,8 @@ def install_args(kwargs, reinstall_apps=False): app_name = filename.split(".")[-2] target_dir = os.path.join(apps_folder, app_name) if not os.path.exists(target_dir): - if yes or click.confirm("Create app %s?" % app_name): - click.echo("[ ] Unzipping app %s" % filename) + if yes or click.confirm(f"Create app {app_name}?"): + click.echo(f"[ ] Unzipping app {filename}") with zipfile.ZipFile(zip_filename, "r") as zip_file: os.makedirs(target_dir) zip_file.extractall(target_dir) @@ -1647,38 +1888,30 @@ def wsgi(**kwargs): ######################################################################################### -def keyboardInterruptHandler(signal, frame): - """Catch interrupts like Ctrl-C""" - click.echo( - "KeyboardInterrupt (ID: {}) has been caught. Cleaning up...".format(signal) - ) - sys.exit(0) - - @click.group( context_settings=dict(help_option_names=["-h", "-help", "--help"]), - help='%s\n\nType "%s COMMAND -h" for available options on commands' - % (__doc__, PY4WEB_CMD), + help=f'{__doc__}\n\nType "{PY4WEB_CMD} COMMAND -h" for available options on commands', ) def cli(): - pass + """The Command Line Interface""" @cli.command() @click.option( - "-a", "--all", is_flag=True, default=False, help="List version of all modules" + "-v", "--verbose", is_flag=True, default=False, help="List version of all modules" ) -def version(all): +def version(verbose=False): """Show versions and exit""" - from . import __version__ + from . import __version__ # pylint: disable=import-outside-toplevel - click.echo("py4web: %s" % __version__) - if all: - click.echo("system: %s" % platform.platform()) - click.echo("python: %s" % sys.version.replace("\n", " ")) + click.echo(f"py4web: {__version__}") + if verbose: + sys_version = sys.version.replace("\n", " ") + click.echo(f"system: {platform.platform()}") + click.echo(f"python: {sys_version}") for name in sorted(sys.modules): if hasattr(sys.modules[name], "__version__"): - click.echo("%s: %s" % (name, sys.modules[name].__version__)) + click.echo(f"{name}: {sys.modules[name].__version__}") @cli.command() @@ -1708,6 +1941,9 @@ def setup(**kwargs): ) def shell(**kwargs): """Open a python shell with apps_folder's parent added to the path""" + if getattr(sys, "frozen", False) and hasattr(sys, "_MEIPASS"): + # running in the PyInstaller binary bundle + import site # pylint: disable=possibly-unused-variable,import-outside-toplevel install_args(kwargs) code.interact(local=dict(globals(), **locals())) @@ -1734,9 +1970,11 @@ def call(apps_folder, func, yes, args): kwargs = json.loads(args) install_args(dict(apps_folder=apps_folder, yes=yes)) apps_folder_name = os.path.basename(os.environ["PY4WEB_APPS_FOLDER"]) - module, name = ("%s.%s" % (apps_folder_name, func)).rsplit(".", 1) + app_name = func.split(".")[0] + module, name = f"{apps_folder_name}.{func}".rsplit(".", 1) env = {} - exec("from %s import %s" % (module, name), {}, env) + exec(f"from {module} import {name}", {}, env) # pylint: disable=exec-used + request.app_name = app_name env[name](**kwargs) @@ -1757,8 +1995,8 @@ def call(apps_folder, func, yes, args): ) def set_password(password, password_file): """Set administrator's password for the Dashboard""" - click.echo('Storing the hashed password in file "%s"\n' % password_file) - with open(password_file, "w") as fp: + click.echo(f'Storing the hashed password in file "{password_file}"\n') + with open(password_file, "w", encoding="utf8") as fp: fp.write(str(pydal.validators.CRYPT()(password)[0])) @@ -1788,15 +2026,14 @@ def new_app(apps_folder, app_name, yes, scaffold_zip): ) target_dir = os.path.join(os.environ["PY4WEB_APPS_FOLDER"], app_name) if not os.path.exists(source): - click.echo("Source app %s does not exists" % source) + click.echo(f"Source app {source} does not exists") sys.exit(1) elif os.path.exists(target_dir): - click.echo("Target folder %s already exists" % target_dir) + click.echo(f"Target folder {target_dir} already exists") sys.exit(1) else: - zfile = zipfile.ZipFile(source, "r") - zfile.extractall(target_dir) - zfile.close() + with zipfile.ZipFile(source, "r") as zfile: + zfile.extractall(target_dir) @cli.command() @@ -1809,10 +2046,18 @@ def new_app(apps_folder, app_name, yes, scaffold_zip): help="No prompt, assume yes to questions", show_default=True, ) -@click.option("-H", "--host", default="127.0.0.1", help="Host name", show_default=True) +@click.option( + "-H", "--host", default="127.0.0.1", help="Host listening IP", show_default=True +) @click.option( "-P", "--port", default=8000, type=int, help="Port number", show_default=True ) +@click.option( + "-A", + "--app_names", + default="", + help="List of apps to run, comma separated (all if omitted or empty)", +) @click.option( "-p", "--password_file", @@ -1820,16 +2065,33 @@ def new_app(apps_folder, app_name, yes, scaffold_zip): help="File for the encrypted password", show_default=True, ) +@click.option( + "-Q", + "--quiet", + is_flag=True, + default=False, + help="Suppress server output", + show_default=True, +) +@click.option( + "-R", + "--routes", + is_flag=True, + default=False, + help="Write apps routes to file", + show_default=True, +) @click.option( "-s", "--server", default="default", type=click.Choice( - ["default", "wsgiref", "tornado", "gunicorn", "gevent", "waitress"] - + server_adapters.__all__ + ["default"] + list(server_adapters.available) + server_adapters.unavailable ), - help="server to use", - show_default=True, + help="Web server to use (unavailable: {})".format( + ", ".join(server_adapters.unavailable) + ), + show_default=False, ) @click.option( "-w", @@ -1857,14 +2119,52 @@ def new_app(apps_folder, app_name, yes, scaffold_zip): "--ssl_cert", type=click.Path(exists=True), help="SSL certificate file for HTTPS" ) @click.option("--ssl_key", type=click.Path(exists=True), help="SSL key file for HTTPS") +@click.option( + "--errorlog", + default=":stderr", + help="Where to send error logs (:stdout|:stderr|tickets_only|{filename})", + show_default=True, +) +@click.option( + "-L", + "--logging_level", + type=int, + default=logging.INFO, + help="The log level (0 - 50) [default: 30 (=WARNING)]", +) +@click.option( + "-D", + "--debug", + is_flag=True, + default=False, + help="Debug switch", + show_default=True, +) +@click.option( + "-U", + "--url_prefix", + default="", + help="Prefix to add to all URLs in and out", + show_default=True, +) +@click.option( + "-m", + "--mode", + default="default", + help="default or development", + show_default=True, +) def run(**kwargs): - """Run all the applications on apps_folder""" + """Run the applications on apps_folder""" install_args(kwargs) - from py4web import __version__ + from py4web import __version__ # pylint: disable=import-outside-toplevel click.secho(ART, fg="blue") - click.echo("Py4web: %s on Python %s\n\n" % (__version__, sys.version)) + click.echo(f"Py4web: {__version__} on Python {sys.version}\n\n") + + # Start + Reloader.import_apps() # If we know where the password is stored, read it, otherwise ask for one if os.path.exists(os.path.join(os.environ["PY4WEB_APPS_FOLDER"], "_dashboard")): @@ -1872,22 +2172,16 @@ def run(**kwargs): kwargs["password_file"] ): click.echo( - 'You have not set a dashboard password. Run "%s set_password" to do so.' - % PY4WEB_CMD + f'\nYou have not set a dashboard password. Run "{PY4WEB_CMD} set_password" to do so.' ) - else: + elif "_dashboard" in Reloader.ROUTES and ( + not kwargs["host"].startswith("unix:/") + ): click.echo( - "Dashboard is at: http://%s:%s/_dashboard" - % (kwargs["host"], kwargs["port"]) + f"Dashboard is at: http{'s' if kwargs.get('ssl_cert', None) else ''}://{kwargs['host']}:{kwargs['port']}/_dashboard" ) - # Catch interrupts like Ctrl-C - orig_ctrl_c_handler = signal.getsignal(signal.SIGINT) - signal.signal(signal.SIGINT, keyboardInterruptHandler) - - # Start - Reloader.import_apps() - start_server(kwargs, orig_ctrl_c_handler) + start_server(kwargs) if __name__ == "__main__": diff --git a/py4web/gunicorn.rst b/py4web/gunicorn.rst new file mode 100644 index 000000000..c080392e6 --- /dev/null +++ b/py4web/gunicorn.rst @@ -0,0 +1,209 @@ +==================== +gunicorn and py4web +==================== + + +The gunicorn server starts in the usual way for the py4web + +:: + + $./py4web.py run apps -s gunicorn --watch=off + $ + $./py4web.py run apps -H 'unix:/tmp/p4w.sock' -w 4 -L 10 + $ + $./py4web.py run apps -s gunicornGevent --watch=off + + +gunicornGevent === gunicorn + monkey.patch_all() + +It is possible to use several methods to configure gunicorn options with py4web + +Let's show examples (go to py4web root dir) + + +* set gunicorn options via py4web keys + + use: -H, -P, -w, -L, --ssl_cert, --ssl_key , -Q + + ./py4web.py run apps -s gunicorn --watch=off -H 192.168.1.161 -P 9000 -L 20 --ssl_cert=cert.pem --ssl_key=key.pem + + with -L 10 we can see gunicorn options in server-py4web.log + + this is enough for regular applications (you don't have to read further) + +* set gunicorn options via bash env variables + + :: + + $export GUNICORN_worker_class=sync + $ ./py4web.py run apps -s gunicorn -L 20 -w 4 --watch=off + $ + $export GUNICORN_worker_class=gthread + $ ./py4web.py run apps -s gunicorn -L 20 -w 4 --watch=off + $ + $export GUNICORN_worker_class=gevent + $ ./py4web.py run apps -s gunicornGevent -L 20 -w 4 --watch=off + $ + $export GUNICORN_worker_class=eventlet + $ ./py4web.py run apps -s gunicornGevent -L 20 -w 4 --watch=off + + + + +* set gunicorn options via config file gunicorn.saenv + + :: + + # gunicorn.saenv: example file + # + # its key=value file + # export GUNICORN_ will be removed + # + # boolean + # print_config=False + # + # str + export GUNICORN_raw_env=VARIABLE_HERE=VARIABLE_VALUE_HERE, v2=x2, + # python dict + export GUNICORN_secure_scheme_headers={'x':'x1', 'y':'y1',} + # None + certfile=None + + export GUNICORN_worker_tmp_dir=/dev/shm + export GUNICORN_max_requests=1200 + worker_class=gthread + threads=2 + + # gunicornGevent + #worker_class=gevent + #worker_class=eventlet + + # for use python-config-file + # use_python_config=myguni.conf.py + # or short + # usepy=myguni.conf.py + + # for use python-config-mod_name + # use_python_config=python:mod_name + + +* set gunicorn options via python file myguni.conf.py + + :: + + set the env variable use_python_config=myguni.conf.py + + .. code:: bash + + $ # via env + $export GUNCORN_use_python_config=myguni.conf.py + $ + $ # via gunicorn.saenv + $echo use_python_config=mmyguni.conf.py >> gunicorn.saenv + + :: + + write file myguni.conf.py + + .. code:: python + + # myguni.conf.py : example gunicorn configuration file + # https://docs.gunicorn.org/en/stable/settings.html + + import multiprocessing + + max_requests = 1000 + max_requests_jitter = 50 + + log_file = "-" + + workers = multiprocessing.cpu_count() * 2 + 1 + + :: + + $ ./py4web.py run apps -s gunicorn --watch=off + + +* set gunicorn options via python module + + :: + + create a new python module mod_name + + .. code:: bash + + + $ mkdir mod_name && cp myguni.conf.py mod_name/__init__.py + $ + $ # via env + $export GUNCORN_use_python_config=python:mod_name + $ + $ # via gunicorn.saenv + $echo use_python_config=python:mod_name >> gunicorn.saenv + + + :: + + $ ./py4web.py run apps -s gunicorn --watch=off + + +* set gunicorn options via gunicorn.conf.py + + :: + + + write gunicorn settings to the gunicorn.conf.py + + (if gunicorn.conf.py exists, the GUNICORN_ vars and the file gunicorn.saenv will be ignored) + + .. code:: bash + + $ echo "print_config = True" > gunicorn.conf.py + $ # or + $ cp myguni.con.py gunicorn.conf.py + + + :: + + $ ./py4web.py run apps -s gunicorn --watch=off + +* set gunicorn options via gunicorn-cli + + :: + + run py4web/apps as wsgi-apps + + .. code:: bash + + $ echo 'from py4web.core import wsgi;myapp = wsgi(apps_folder="apps")' > py4web_wsgi.py + $ + + + :: + + $ gunicorn -w 4 py4web_wsgi:myapp + + +* test gunicorn response time + + :: + + add to .bashrc + + .. code:: bash + + export PY4WEB_LOGS=/tmp + p4w_srv_test() { time seq 1 500 | xargs -I % curl http://localhost:8000/todo &>/dev/null ;} + gunitest() { for ((i=0; i < 20; i++)); do p4w_srv_test & done ;} + + :: + + $ ./py4web.py run apps -s gunicorn -L 10 --watch=off & + + $ tguni + $ + $ less /tmp/server-py4web.log + + +thats it + diff --git a/py4web/server_adapters.py b/py4web/server_adapters.py deleted file mode 100644 index bfa81cd19..000000000 --- a/py4web/server_adapters.py +++ /dev/null @@ -1,125 +0,0 @@ -import logging -from bottle import ServerAdapter - -try: - from .utils.wsservers import * -except ImportError: - wsservers_list = [] - - -__all__ = [ - "geventWebSocketServer", - "wsgirefThreadingServer", - "rocketServer", -] + wsservers_list - - -def geventWebSocketServer(): - from gevent import pywsgi - from geventwebsocket.handler import WebSocketHandler - from geventwebsocket.logging import create_logger - - class GeventWebSocketServer(ServerAdapter): - def run(self, handler): - server = pywsgi.WSGIServer( - (self.host, self.port), - handler, - handler_class=WebSocketHandler, - **self.options - ) - - if not self.quiet: - server.logger = create_logger("geventwebsocket.logging") - server.logger.setLevel(logging.INFO) - server.logger.addHandler(logging.StreamHandler()) - - server.serve_forever() - - return GeventWebSocketServer - - -def wsgirefThreadingServer(): - # https://www.electricmonk.nl/log/2016/02/15/multithreaded-dev-web-server-for-the-python-bottle-web-framework/ - - from wsgiref.simple_server import WSGIRequestHandler, WSGIServer - from wsgiref.simple_server import make_server - from socketserver import ThreadingMixIn - import socket - from concurrent.futures import ThreadPoolExecutor # pip install futures - - class WSGIRefThreadingServer(ServerAdapter): - def run(self, app): - class PoolMixIn(ThreadingMixIn): - def process_request(self, request, client_address): - self.pool.submit( - self.process_request_thread, request, client_address - ) - - class ThreadingWSGIServer(PoolMixIn, WSGIServer): - daemon_threads = True - pool = ThreadPoolExecutor(max_workers=40) - - class Server: - def __init__( - self, server_address=("127.0.0.1", 8000), handler_cls=None - ): - self.wsgi_app = None - self.listen, self.port = server_address - self.handler_cls = handler_cls - - def set_app(self, app): - self.wsgi_app = app - - def get_app(self): - return self.wsgi_app - - def serve_forever(self): - self.server = make_server( - self.listen, - self.port, - self.wsgi_app, - ThreadingWSGIServer, - self.handler_cls, - ) - self.server.serve_forever() - - class FixedHandler(WSGIRequestHandler): - def address_string(self): # Prevent reverse DNS lookups please. - return self.client_address[0] - - def log_request(*args, **kw): - if not self.quiet: - return WSGIRequestHandler.log_request(*args, **kw) - - handler_cls = self.options.get("handler_class", FixedHandler) - server_cls = Server - - if ":" in self.host: # Fix wsgiref for IPv6 addresses. - if getattr(server_cls, "address_family") == socket.AF_INET: - - class server_cls(server_cls): - address_family = socket.AF_INET6 - - srv = make_server(self.host, self.port, app, server_cls, handler_cls) - srv.serve_forever() - - return WSGIRefThreadingServer - - -def rocketServer(): - try: - from rocket3 import Rocket3 as Rocket - except ImportError: - from .rocket3 import Rocket3 as Rocket - import logging.handlers - - class RocketServer(ServerAdapter): - def run(self, app): - if not self.quiet: - log = logging.getLogger("Rocket") - log.setLevel(logging.INFO) - log.addHandler(logging.StreamHandler()) - server = Rocket((self.host, self.port), "wsgi", dict(wsgi_app=app)) - server.start() - - return RocketServer diff --git a/py4web/server_adapters/__init__.py b/py4web/server_adapters/__init__.py new file mode 100644 index 000000000..8b294ca7e --- /dev/null +++ b/py4web/server_adapters/__init__.py @@ -0,0 +1,78 @@ +__all__ = ["available", "unavailable", "blocking"] + +unavailable = [] +available = {} +blocking = {} + +# Web servers supported natively by ombott + +available["wsgiref"] = "wsgiref" +blocking["wsgiref"] = True + +try: + import tornado + + available["tornado"] = "tornado" + blocking["tornado"] = False +except ModuleNotFoundError: + unavailable.append("tornado") + + +try: + import waitress + + available["waitress"] = "waitress" + blocking["waitress"] = True +except ModuleNotFoundError: + unavailable.append("waitress") + +try: + import gunicorn + + available["gunicorn"] = "gunicorn" + blocking["gunicorn"] = False +except ModuleNotFoundError: + unavailable.append("gunicorn") + +# additional custom adaptrs + +try: + from .adapter_wsgiref import WSGIRefAdapter + + available["wsgiref+threaded"] = WSGIRefAdapter + blocking["wsgiref+threaded"] = True +except ModuleNotFoundError: + unavailable.append("wsgiref+threaded") + +try: + from .adapter_rocket3 import Rocket3Adapter + + available["rocket"] = Rocket3Adapter + blocking["rocket"] = True +except ModuleNotFoundError: + unavailable.append("rocket") + +try: + from .adapter_gevent import GeventAdapter + + available["gevent"] = GeventAdapter + blocking["gevent"] = False +except ModuleNotFoundError: + unavailable.append("gevent") + +try: + from .adapter_gunicorn_gevent import GunicornGeventAdapter + + available["gunicorn+gevent"] = GunicornGeventAdapter + blocking["gunicorn+gevent"] = False +except ModuleNotFoundError: + unavailable.append("gunicorn+gevent") + +try: + from .adapter_gevent_websockets import GeventWebsocketsAdapter + + available["gevent+websockets"] = GeventWebsocketsAdapter + blocking["gevent+websockets"] = False + +except ModuleNotFoundError: + unavailable.append("gevent+websockets") diff --git a/py4web/server_adapters/adapter_gevent.py b/py4web/server_adapters/adapter_gevent.py new file mode 100644 index 000000000..afc113a29 --- /dev/null +++ b/py4web/server_adapters/adapter_gevent.py @@ -0,0 +1,56 @@ +import ssl +import threading + +from gevent import local, pywsgi # pip install gevent +from ombott.server_adapters import ServerAdapter + +from .logging_utils import logging_conf + +# ./py4web.py run apps --watch=off -s gevent -L 20 +# +# ./py4web.py run apps -s gevent --watch=off --port=8443 --ssl_cert=cert.pem --ssl_key=key.pem -L 0 +# ./py4web.py run apps -s gevent --watch=off --host=192.168.1.161 --port=8443 --ssl_cert=server.pem -L 0 + + +class GeventAdapter(ServerAdapter): + "Defines a gevent server" + + def run(self, handler): + "runs the server" + + if not isinstance(threading.local(), local.local): + msg = "Ombott requires gevent.monkey.patch_all() (before import)" + raise RuntimeError(msg) + + logger = None # "default" + + if not self.quiet: + logger = logging_conf( + self.options["logging_level"], + "gevent", + ) + # logger.addHandler(logging.StreamHandler()) + + certfile = self.options.get("certfile", None) + + ssl_args = ( + dict( + certfile=certfile, + keyfile=self.options.get("keyfile", None), + ssl_version=ssl.PROTOCOL_SSLv23, + server_side=True, + do_handshake_on_connect=False, + ) + if certfile + else {} + ) + + server = pywsgi.WSGIServer( + (self.host, self.port), + handler, + log=logger, + error_log=logger, + **ssl_args, + ) + + server.serve_forever() diff --git a/py4web/server_adapters/adapter_gevent_websockets.py b/py4web/server_adapters/adapter_gevent_websockets.py new file mode 100644 index 000000000..a06f03ed4 --- /dev/null +++ b/py4web/server_adapters/adapter_gevent_websockets.py @@ -0,0 +1,46 @@ +# from geventwebsocket.handler import WebSocketHandler # pip install gevent-websocket +from gevent import pywsgi +from gevent_ws import WebSocketHandler # pip install gevent gevent-ws +from ombott.server_adapters import ServerAdapter + +from .logging_utils import logging_conf + +# https://stackoverflow.com/questions/5312311/secure-websockets-with-self-signed-certificate +# https://pypi.org/project/gevent-ws/ +# ./py4web.py run apps -s geventWebSocketServer --watch=off --ssl_cert=server.pem -H 192.168.1.161 -P 9000 -L 10 +# vi apps/_websocket/templates/index.html set: ws, wss, host, port +# firefox http://localhost:8000/_websocket +# firefox https://192.168.1.161:9000/_websocket test wss +# curl --insecure -I -H 'Upgrade: websocket' \ +# -H "Sec-WebSocket-Key: `openssl rand -base64 16`" \ +# -H 'Sec-WebSocket-Version: 13' \ +# -sSv https://192.168.1.161:9000/ + + +class GeventWebSocketAdapter(ServerAdapter): + "Class implementing a Gevent websocket server" + + def run(self, handler): + "Runs the server" + logger = None # "default" + + if not self.quiet: + logger = logging_conf( + self.options["logging_level"], + "gevent-ws", + ) + + args = dict( + handler_class=WebSocketHandler, + log=logger, + error_log=logger, + ) + + certfile = self.options.get("certfile") + keyfile = self.options.get("keyfile") + if certfile and keyfile: + args.update(certfile=certfile, keyfile=keyfile) + + server = pywsgi.WSGIServer((self.host, self.port), handler, **args) + + server.serve_forever() diff --git a/py4web/server_adapters/adapter_gunicorn_gevent.py b/py4web/server_adapters/adapter_gunicorn_gevent.py new file mode 100644 index 000000000..ddbd40168 --- /dev/null +++ b/py4web/server_adapters/adapter_gunicorn_gevent.py @@ -0,0 +1,191 @@ +import ast +import errno +import logging +import os +import socket +import subprocess +import sys +import threading + +from gevent import local # pip install gevent gunicorn setproctitle +from ombott.server_adapters import ServerAdapter + +from .logging_utils import check_level, get_log_file, logging_conf + + +def check_port(host="127.0.0.1", port=8000): + "Check the specified port is available and print debug info" + + if host.startswith("unix:/"): + socket_path = host[5:] + if os.path.exists(socket_path): + if port == 0: + if ( + subprocess.run( + ["ls", "-alFi", "socket_path"], shell=False, check=False + ).returncode + != 0 + ): + sys.exit(f"can't run gunicorn: {socket_path} exists") + elif port == 1: + subprocess.run( + "ps -ef | head -1; ps -ef | grep py4web | grep -v grep", + shell=True, + check=False, + ) + subprocess.run(["ls", "-alFi", socket_path], shell=False, check=False) + subprocess.run(["lsof", "-w", socket_path], shell=False, check=False) + elif port == 8000: + pass + print(f"gunicorn listening at: {host}") + return + + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.bind((host, int(port))) + except socket.error as e: + if e.errno == errno.EADDRINUSE: + subprocess.run( + f"command -v lsof >/dev/null 2>&1 && ps -ef | head -1; ps -ef |" + f" grep py4web | grep -v grep && lsof -nPi:{port}", + shell=True, + check=False, + ) + sys.exit(f"{host}:{port} is already in use") + else: + sys.exit(f"{e}\n{host}:{port} cannot be acessed") + s.close() + + +def check_kv(kx, vx): + "convenience function" + if kx and vx and kx not in ("bind", "config"): + if vx.startswith("{") and vx.endswith("}"): + vx = ast.literal_eval(vx) + if vx == "None": + vx = None + return kx, vx + return None, None + + +def get_gunicorn_options( + gu_default="gunicorn.conf.py", + env_file="gunicorn.saenv", + env_key="GUNICORN_", +): + "Returns the default options" + if os.path.isfile(gu_default): + return {"use_python_config": gu_default, "config": gu_default} + + res_opts = {} + + if os.path.isfile(env_file): + with open(env_file, "r") as f: + lines = f.read().splitlines() + for line in lines: + line = line.strip() + if not line or line.startswith(("#", "[")): + continue + for e in ("export ", env_key): + line = line.replace(e, "", 1) + k, v = None, None + try: + k, v = line.split("=", 1) + k, v = k.strip().lower(), v.strip() + except (ValueError, AttributeError): + continue + k, v = check_kv(k, v) + if k is None: + continue + res_opts[k] = v + + if res_opts: + res_opts["config"] = env_file + return res_opts + + for k, v in os.environ.items(): + if k.startswith(env_key): + k = k.split("_", 1)[1].lower() + k, v = check_kv(k, v) + if k is None: + continue + res_opts[k] = v + + if res_opts: + res_opts["config"] = env_key + + return res_opts + + +class GunicornGeventAdapter(ServerAdapter): + "The gunicorn server adapter" + + def run(self, handler): + "runs the server" + + if isinstance(threading.local(), local.local): + print("gunicorn: monkey.patch_all() applied") + + try: + from gunicorn.app.base import Application + except ImportError as ex: + sys.exit(f"{ex}\nTry: pip install gunicorn gevent setproctitle") + + check_port(self.host, self.port) + + logger = None + + sa_bind = ( + self.host if self.host.startswith("unix:/") else f"{self.host}:{self.port}" + ) + + sa_config = { + "bind": sa_bind, # f"{self.host}:{self.port}", + "workers": self.options.get("workers", 10), + "certfile": self.options.get("certfile", None), + "keyfile": self.options.get("keyfile", None), + "accesslog": None, + "errorlog": None, + "proc_name": "sa_py4web", # ps a | grep py4web + "config": "sa_config", + # ( 'sa_config', 'GUNICORN_', 'gunicorn.saenv', 'gunicorn.conf.py' ) + } + + if not self.quiet: + level = check_level(self.options["logging_level"]) + log_file = get_log_file() + + logger = logging_conf(level) + log_to = "-" if log_file is None else log_file + + sa_config.update( + { + "loglevel": logging.getLevelName(level), + "access_log_format": '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"', + "accesslog": log_to, + "errorlog": log_to, + } + ) + + class GunicornApplication(Application): + "A gunicorn application" + + def load_config(self): + "Loads the config" + sa_config.update(get_gunicorn_options()) + logger and logger.debug(sa_config) + + for k, v in sa_config.items(): + if k not in self.cfg.settings: + continue + self.cfg.set(k, v) + + for key in ("use_python_config", "usepy"): + if key in sa_config: + Application.load_config_from_file(self, sa_config[key]) + break + + def load(self): + return handler + + GunicornApplication().run() diff --git a/py4web/server_adapters/adapter_rocket3.py b/py4web/server_adapters/adapter_rocket3.py new file mode 100644 index 000000000..f9d5c7b10 --- /dev/null +++ b/py4web/server_adapters/adapter_rocket3.py @@ -0,0 +1,27 @@ +from ombott.server_adapters import ServerAdapter +from rocket3 import Rocket3 + +from .logging_utils import logging_conf + + +class Rocket3Adapter(ServerAdapter): + "Class implementing a rocket3 server" + + def run(self, handler): + "runs the server" + + if not self.quiet: + logging_conf( + self.options["logging_level"], + ) + + keyfile = self.options.get("keyfile") + certfile = self.options.get("certfile") + + if keyfile and certfile: + interface = (self.host, self.port, keyfile, certfile) + else: + interface = (self.host, self.port) + + server = Rocket3(interface, "wsgi", dict(wsgi_app=handler)) + server.start() diff --git a/py4web/server_adapters/adapter_wsgiref.py b/py4web/server_adapters/adapter_wsgiref.py new file mode 100644 index 000000000..19b7e204a --- /dev/null +++ b/py4web/server_adapters/adapter_wsgiref.py @@ -0,0 +1,109 @@ +"builds and returns a wsgiref threading server" +# https://www.electricmonk.nl/log/2016/02/15/multithreaded-dev-web-server-for-the-python-bottle-web-framework/ + +import socket +import ssl +from concurrent.futures import ThreadPoolExecutor # pip install futures +from socketserver import ThreadingMixIn +from wsgiref.simple_server import WSGIRequestHandler, WSGIServer, make_server + +from ombott.server_adapters import ServerAdapter + +from .logging_utils import logging_conf + + +class WSGIRefAdapter(ServerAdapter): + "Class implementing a WSGIRef server" + + def run(self, handler): + "runs the server" + + self.log = None + + if not self.quiet: + self.log = logging_conf( + self.options["logging_level"], + "wsgiref", + ) + + self_run = self # used in internal classes to access options and logger + + class LogHandler(WSGIRequestHandler): + def address_string(self): # Prevent reverse DNS lookups please. + return self.client_address[0] + + def log_request(self, *args, **kw): + if not self_run.quiet: + WSGIRequestHandler.log_request(self, *args, **kw) + + def log_message(self, formatstr, *args): + if not self_run.quiet: # and ( not args[1] in ['200', '304']) : + msg = "%s - - [%s] %s" % ( + self.client_address[0], + self.log_date_time_string(), + formatstr % args, + ) + self_run.log.info(msg) + + class PoolMixIn(ThreadingMixIn): + def process_request(self, request, client_address): + self.pool.submit(self.process_request_thread, request, client_address) + + class ThreadingWSGIServer(PoolMixIn, WSGIServer): + daemon_threads = True + pool = ThreadPoolExecutor(max_workers=self.options.get("workers", 40)) + + class Server: + def __init__(self, server_address=("127.0.0.1", 8000), handler_cls=None): + self.wsgi_app = None + self.listen, self.port = server_address + self.handler_cls = handler_cls + + def set_app(self, app): + self.wsgi_app = app + + def get_app(self): + return self.wsgi_app + + def serve_forever(self): + self.server = make_server( + self.listen, + self.port, + self.wsgi_app, + ThreadingWSGIServer, + self.handler_cls, + ) + + # openssl req -newkey rsa:4096 -new -x509 -keyout server.pem -out server.pem -days 365 -nodes + # openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365 + # ./py4web.py run apps -s wsgirefThreadingServer --watch=off --port=8443 --ssl_cert=cert.pem --ssl_key=key.pem + # openssl s_client -showcerts -connect 127.0.0.1:8443 + + certfile = self_run.options.get("certfile", None) + + if certfile: + self.server.socket = ssl.wrap_socket( + self.server.socket, + certfile=certfile, + keyfile=self_run.options.get("keyfile", None), + ssl_version=ssl.PROTOCOL_SSLv23, + server_side=True, + do_handshake_on_connect=False, + ) + + self.server.serve_forever() + + server_cls = Server + + if ":" in self.host: # Fix wsgiref for IPv6 addresses. + if getattr(server_cls, "address_family") == socket.AF_INET: + + class ServerClass(Server): + address_family = socket.AF_INET6 + + server_cls = ServerClass + + srv = make_server( + self.host, self.port, handler, server_cls, LogHandler + ) # handler_cls) + srv.serve_forever() diff --git a/py4web/server_adapters/logging_utils.py b/py4web/server_adapters/logging_utils.py new file mode 100644 index 000000000..fb4c4c8fb --- /dev/null +++ b/py4web/server_adapters/logging_utils.py @@ -0,0 +1,126 @@ +import logging +import os +import sys + + +def make_logger(name, loggers_info): + """ + Abstraction layer on logging. Example of usage: + + from py4web.server_adapters.logging_utils import make_logger + + loggers_info = [ + "warning:warning.log", + "info:info.log", + "debug:debug.log:$(asctime)s > %(levelname)s > %(message)s", + ] + + logger = make_logger("py4web:appname", loggers_info) + """ + default_formatter = ( + "%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s" + ) + # reset loggers + root = logging.getLogger(name) + list(map(root.removeHandler, root.handlers)) + list(map(root.removeFilter, root.filters)) + for logger in loggers_info: + logger += ":stderr" if logger.count(":") == 0 else "" + logger += ":" if logger.count(":") == 1 else "" + level, filename, formatter = logger.split(":", 2) + if not formatter: + formatter = default_formatter + if filename in ("stdout", "stderr"): + handler = logging.StreamHandler(getattr(sys, filename)) + else: + handler = logging.FileHandler(filename) + handler.setFormatter(logging.Formatter(formatter)) + handler.setLevel(getattr(logging, level.upper(), "DEBUG")) + root.addHandler(handler) + return root + + +def get_log_file(out_banner=True): + """ + Returns the filename for logging or None + Assumes: + export PY4WEB_ERRORLOG=/tmp # export PY4WEB_ERRORLOG= + if PY4WEB_ERRORLOG is :stderr or :stdout returns None + if PY4WEB_ERRORLOG is a folder returns the name of a logfile in that dir + if PY4WEB_ERRORLOG is a filename it returns that filename + if the out_banner argument is true, it outputs the filename + """ + log_dir = os.environ.get("PY4WEB_ERRORLOG", None) + if log_dir and not log_dir.startswith(":"): + if os.path.isdir(log_dir): + log_file = os.path.join(log_dir, "server-py4web.log") + else: + log_file = log_dir + if out_banner: + print(f"log_file: {log_file}") + return log_file + return None + + +def check_level(level): + "Check the level is a valid loglevel" + # lib/python3.7/logging/__init__.py + # CRITICAL = 50 + # FATAL = CRITICAL + # ERROR = 40 + # WARNING = 30 + # WARN = WARNING + # INFO = 20 + # DEBUG = 10 + # NOTSET = 0 + + return ( + level + if level + in ( + logging.CRITICAL, + logging.ERROR, + logging.WARN, + logging.INFO, + logging.DEBUG, + logging.NOTSET, + ) + else logging.WARN + ) + + +def logging_conf(level=logging.WARN, logger_name=__name__, fmode="w"): + "Configures logging" + + log_file = get_log_file() + log_to = {} + + if log_file: + if sys.version_info >= (3, 9): + log_to["filename"] = log_file + log_to["filemode"] = fmode + log_to["encoding"] = "utf-8" + else: + h = logging.FileHandler(log_file, mode=fmode, encoding="utf-8") + log_to.update({"handlers": [h]}) + + short_msg = "%(message)s > %(threadName)s > %(asctime)s.%(msecs)03d" + # long_msg = short_msg + " > %(funcName)s > %(filename)s:%(lineno)d > %(levelname)s" + + time_msg = "%H:%M:%S" + # date_time_msg = '%Y-%m-%d %H:%M:%S' + + logging.basicConfig( + format=short_msg, + datefmt=time_msg, + level=check_level(level), + **log_to, + ) + + if logger_name is None: + return None + + log = logging.getLogger("SA:" + logger_name) + log.propagate = True + + return log diff --git a/py4web/utils/auth.py b/py4web/utils/auth.py index 68da773dc..6f6fb4d48 100644 --- a/py4web/utils/auth.py +++ b/py4web/utils/auth.py @@ -1,28 +1,29 @@ import base64 import calendar import copy -import datetime import hashlib +import random import re import time -import urllib import uuid -from py4web import redirect, request, response, abort, URL, action, Field, HTTP -from py4web.core import Fixture, Translator, Flash, REGEX_APPJSON -from py4web.utils.form import Form, FormStyleDefault -from py4web.utils.param import Param -from yatl.helpers import A, DIV +import jwt from pydal.validators import ( - IS_EMAIL, CRYPT, + IS_EMAIL, IS_EQUAL_TO, + IS_MATCH, IS_NOT_EMPTY, IS_NOT_IN_DB, IS_STRONG, - IS_MATCH, ) +from yatl.helpers import DIV, A + +from py4web import HTTP, URL, Field, action, redirect, request, response +from py4web.core import REGEX_APPJSON, Fixture, Flash, Template, Translator, utcnow +from py4web.utils.form import Form, FormStyleDefault +from py4web.utils.param import Param """ [X] Enable and disable plugins @@ -38,18 +39,26 @@ def b16e(text): + """convert unicode to b16 unicode""" return base64.b16encode(text.encode()).decode() def b16d(text): + """convert unicode to b16 unicode""" return base64.b16decode(text.encode()).decode() +def prevent_open_redirect(url): + """url must be a valid absolute URL whithout schema""" + if url and url[0] == "/" and "//" not in url: + return url + return None + + class AuthEnforcer(Fixture): + """Base fixture that checks if a condition is met. - """ - Base fixtures that checks if a condition is met - if not redirects to a different pages or returns HTTP 403 + If not it redirects to a different page or returns HTTP 403 """ def __init__(self, auth, condition=None): @@ -57,18 +66,17 @@ def __init__(self, auth, condition=None): self.auth = auth self.condition = condition - def transform(self, output, shared_data): - return self.auth.transform(output, shared_data) + def on_success(self, context): + self.auth.on_success(context) def abort_or_redirect(self, page, message=""): """ - return HTTP 403 if 'application/json' in HTTP_ACCEPT and HTTP_JSON_REDIRECTS flag is not set in the request to 'on' - else redirects to page + Return HTTP 403 if 'text/htmp' not in HTTP_ACCEPT + else redirects to specified page """ - if re.search(REGEX_APPJSON, request.headers.get("accept", "")) and ( - request.headers.get("json-redirects", "") != "on" - ): - abort(403) + + if "text/html" not in request.headers.get("accept", ""): + raise HTTP(403, body={"message": message}) redirect_next = request.fullpath if request.query_string: redirect_next = redirect_next + "?{}".format(request.query_string) @@ -82,29 +90,45 @@ def abort_or_redirect(self, page, message=""): ) ) - def on_request(self): - """check that we have a user in the session and + def goto_login(self, message=""): + """Goes to the proper login page.""" + # If a plugin can handle requests, redirects to the login url for the login. + for plugin in self.auth.plugins.values(): + if hasattr(plugin, "handle_request"): + if re.search(REGEX_APPJSON, request.headers.get("accept", "")) and ( + request.headers.get("json-redirects", "") != "on" + ): + raise HTTP(403) + redirect_next = request.fullpath + if request.query_string: + redirect_next = redirect_next + "?{}".format(request.query_string) + redirect( + URL( + self.auth.route, + "plugin", + plugin.name, + "login", + vars=dict(next=redirect_next), + ) + ) + # Otherwise, uses the normal login. + self.abort_or_redirect("login", message=message) + + def on_request(self, context): + """Checks that we have a user in the session and the condition is met""" - user = self.auth.session.get("user") - if not user or not user.get("id"): - self.auth.session["recent_activity"] = None - self.abort_or_redirect("login", "User not logged in") - activity = self.auth.session.get("recent_activity") - time_now = calendar.timegm(time.gmtime()) - # enforce the optionl auth session expiration time - if self.auth.param.login_expiration_time and activity: - if time_now - activity > self.auth.param.login_expiration_time: - del self.auth.session["user"] - self.abort_or_redirect("login", "Login expired") - # record the time of the latest activity for logged in user (with throttling) - if not activity or time_now - activity > 6: - self.auth.session["recent_activity"] = time_now - self.auth.session["recent_timestamp"] = datetime.datetime.utcnow().isoformat() + self.auth.on_request(context) + + if "user" not in self.auth.session or "id" not in self.auth.session["user"]: + self.goto_login(message="Login required") + if callable(self.condition) and not self.condition(user): self.abort_or_redirect("not-authorized", "User not authorized") class Auth(Fixture): + """The Auth object is responsible for handling + authentication and authorization""" MESSAGES = { "verify_email": { @@ -126,7 +150,7 @@ class Auth(Fixture): "profile-saved": "Profile saved", "user-logout": "User logout", "email-verified": "Email verified", - "link-expired": "Link expired", + "link-expired": "Link invalid or expired", }, "labels": { "username": "Username", @@ -144,6 +168,7 @@ class Auth(Fixture): "created_by": "Created By", "modified on": "Modified On", "modified by": "Modified By", + "two_factor": "Authentication Code", }, "buttons": { "lost-password": "Lost Password", @@ -153,6 +178,21 @@ class Auth(Fixture): "sign-up": "Sign Up", "submit": "Submit", }, + "errors": { + "registration_is_pending": "Registration is pending", + "account_is_blocked": "Account is blocked", + "account_needs_to_be_approved": "Account needs to be approved", + "invalid_credentials": "Invalid Credentials", + "invalid_token": "invalid token", + "password_doesnt_match": "Password doesn't match", + "invalid_current_password": "invalid current password", + "new_password_is_the_same_as_previous_password": "new password is the same as previous password", + "new_password_was_already_used": "new password was already used", + "invalid": "invalid", + "no_post_payload": "no post payload", + "two_factor": "Verification code does not match", + "two_factor_max_tries": "Two factor max tries exceeded", + }, } BUTTON_CLASSES = { @@ -176,21 +216,29 @@ def __init__( registration_requires_approval=False, inject=True, extra_fields=None, + extra_form_fields=None, login_expiration_time=3600, # seconds password_complexity="default", block_previous_password_num=None, allowed_actions=None, use_appname_in_redirects=None, + password_in_db=True, + two_factor_required=None, + two_factor_send=None, + two_factor_validate=None, + template_args=None, ): - + # configuration parameters self.param = Param( registration_requires_confirmation=registration_requires_confirmation, registration_requires_approval=registration_requires_approval, login_after_registration=False, login_expiration_time=login_expiration_time, # seconds - password_complexity={"entropy": 50} - if password_complexity == "default" - else password_complexity, + password_complexity=( + {"entropy": 50} + if password_complexity == "default" + else password_complexity + ), block_previous_password_num=block_previous_password_num, allowed_actions=allowed_actions or ["all"], use_appname_in_redirects=use_appname_in_redirects, @@ -200,10 +248,18 @@ def __init__( default_login_enabled=True, exclude_extra_fields_in_register=None, exclude_extra_fields_in_profile=None, + expose_all_models=True, + two_factor_required=two_factor_required, + two_factor_send=two_factor_send, + two_factor_validate=two_factor_validate, + two_factor_tries=3, + auth_enforcer=None, + template_args=template_args or {}, ) - """Creates and Auth object responsible for handling - authentication and authorization""" + # callbacks for forms + self.on_accept = {} + self.__prerequisites__ = [] self.inject = inject if session: @@ -212,40 +268,116 @@ def __init__( self.__prerequisites__.append(db) self.flash = Flash() self.__prerequisites__.append(self.flash) - self.onsuccess = {} - self.next = {} - self.db = db self.session = session self.sender = sender self.route = "auth" self.use_username = use_username # if False, uses email only + self.password_in_db = password_in_db # if False, password is never saved in db self.use_phone_number = use_phone_number # The self._link variable is not thread safe (only intended for testing) self.extra_auth_user_fields = extra_fields or [] + self.extra_form_fields = extra_form_fields or {} self._link = None if db and define_tables: self.define_tables() + # these are plugins like SAML, OAuth2, etc which delegate authentication self.plugins = {} + # these are plugins that can retrieve an existing user from a given token + self.token_plugins = [] self.form_source = DefaultAuthForms(self) + self.fix_actions() + + def on_request(self, context): + """Checks that we have a user in the session and + the condition is met""" + + # check if a valid user in session + user = self.session.get("user") + + # else try if this is an API call with token + is_token = False + if not user: + for plugin in self.token_plugins: + user = plugin.get_user() + if user: + is_token = True + break + + if not is_token: + # handle the case without a token + if user: + activity = self.session.get("recent_activity") + time_now = calendar.timegm(time.gmtime()) + # enforce the optionl auth session expiration time + if "id" not in user or ( + self.param.login_expiration_time + and activity + and time_now - activity > self.param.login_expiration_time + ): + del self.session["user"] + elif not activity or time_now - activity > 6: + self.session["recent_activity"] = time_now + self.session["recent_timestamp"] = utcnow().isoformat() + else: + # handle the case with a token, no checks required + self.session["user"] = user def allows(self, action_name): + """Checks if the provided action is allowed on the Auth object""" return ( "all" in self.param.allowed_actions or action_name in self.param.allowed_actions ) - def transform(self, output, shared_data): + def fix_actions(self): + """Cleanup duplicated and expand 'all' allowed_actions on API and Forms""" + ALL_ALLOWED_ACTIONS = list( + set( + AuthAPI.public_api + + AuthAPI.private_api + + DefaultAuthForms.public_forms + + DefaultAuthForms.private_forms + + DefaultAuthForms.no_forms + ) + ) + # "login", + # "logout", + # "request_reset_password", + # "reset_password", + # "change_password", + # "change_email", + # "profile", + # "config", + # "register", + # "verify_email", + # "unsubscribe", + + if "all" in self.param.allowed_actions: + self.param.allowed_actions = ALL_ALLOWED_ACTIONS + else: + # remove duplicates and unknown actions + self.param.allowed_actions = list(set(self.param.allowed_actions)) + for unknown in self.param.allowed_actions: + if unknown not in ALL_ALLOWED_ACTIONS: + self.param.allowed_actions.remove(unknown) + + def deny_action(self, action_name): + """Deny the provided action on the Auth object""" + + self.fix_actions() + if action_name in self.param.allowed_actions: + self.param.allowed_actions.remove(action_name) + + def on_success(self, context): if self.inject: - template_context = shared_data.get("template_context") - template_context["user"] = self.get_user() - return output + context["template_inject"]["user"] = self.get_user() def define_tables(self): """Defines the auth_user table""" db = self.db - if not "auth_user" in db.tables: + if "auth_user" not in db.tables: ne = IS_NOT_EMPTY() if self.param.password_complexity: requires = [IS_STRONG(**self.param.password_complexity), CRYPT()] @@ -317,13 +449,17 @@ def define_tables(self): readable=False, ) ) - db.define_table("auth_user", *(auth_fields + self.extra_auth_user_fields)) + db.define_table( + "auth_user", + *(auth_fields + self.extra_auth_user_fields), + format=lambda u: f"{u.first_name} {u.last_name}", + ) @property def signature(self): """Returns a list of fields for a table signature""" - now = lambda: datetime.datetime.utcnow() - user = lambda s=self: s.get_user().get("id") + now = lambda: utcnow() + user = lambda s=self: s.user_id fields = [ Field( "created_on", @@ -374,35 +510,50 @@ def signature(self): @property def user(self): """Use as @action.uses(auth.user)""" - return AuthEnforcer(self) + return ( + self.param.auth_enforcer if self.param.auth_enforcer else AuthEnforcer(self) + ) def condition(self, condition): """Use as @action.uses(auth.condition(lambda user: True))""" - return AuthEnforcer(self, condition) + return ( + self.param.auth_enforcer + if self.param.auth_enforcer + else AuthEnforcer(self, condition) + ) # utilities def get_user(self, safe=True): - """extracts the user form the session. - returns {} if no user in the session. + """Extracts the user from the session. + + Returns {} if no user in the session. If session contains only a user['id'] - retrives the other readable user info from auth_user""" - user = self.session.get("user") - if not user or not isinstance(user, dict) or not "id" in user: + retrives the other readable user info from auth_user + """ + if not self.session.is_valid() or not self.user_id: return {} - if len(user) == 1 and self.db: - user = self.db.auth_user(user["id"]) + if self.db: + user = self.db.auth_user(self.user_id) if not user: return {} if safe: - user = {f.name: user[f.name] for f in self.db.auth_user if f.readable} + user = { + f.name: user[f.name] + for f in self.db.auth_user + if f.readable or f.name == "id" + } return user @property def is_logged_in(self): - return self.session.get("user", {}).get("id", None) != None + if not self.session.is_valid(): + return False + return self.session.get("user", {}).get("id", None) is not None @property def user_id(self): + if not self.session.is_valid(): + return None user = self.session.get("user") if not user: # handles corner case: session=dict(user=None) @@ -414,9 +565,44 @@ def user_id(self): def current_user(self): return self.get_user() + def start_impersonating(self, impersonated_id, next_url): + """impersonates the new user""" + user = self.session.get("user") + if not user or "id" not in user: + raise RuntimeError("Cannot impersonate if not logged in") + if "impersonator_id" in user: + raise RuntimeError("Cannot impersonate while impersonating") + if impersonated_id == self.user_id: + raise RuntimeError("Cannot impersonate yourself") + self.session.clear() + self.store_user_in_session(impersonated_id) + self.session["user"]["impersonator_id"] = user["id"] + redirect(next_url) + + def is_impersonating(self): + """checks if we are impersonating a user""" + return self.session.get("user", {}).get("impersonator_id", None) is not None + + def stop_impersonating(self, next_url): + """stops impersonating a user, assuming we are impersonating one""" + user = self.session.get("user") + impersonator_id = (user or {}).get("impersonator_id") + if impersonator_id is None: + raise RuntimeError( + "Cannot stop impersonation because not impersonating anybody" + ) + self.session.clear() + self.store_user_in_session(impersonator_id) + redirect(next_url) + def register_plugin(self, plugin): - """registers an Auth plugin""" + """Registers an Auth plugin, usually from common.py inside apps""" self.plugins[plugin.name] = plugin + # special parameters values depending on the plugins + if plugin.name in ["pam", "ldap"]: + self.password_in_db = False + self.deny_action("change_password") + self.deny_action("request_reset_password") def store_user_in_session(self, user_id): self.session["user"] = {"id": user_id} @@ -426,12 +612,21 @@ def store_user_in_session(self, user_id): # Methods that do not assume a user def register(self, fields, send=True, next="", validate=True, route=None): - if self.use_username: - fields["username"] = fields.get("username", "").lower() + """Registers a new user after the user's parameters are entered + in the SignUp form""" + if "username" in fields: + fields["username"] = fields["username"].lower() fields["email"] = fields.get("email", "").lower() def store(fields): if validate: + if self.use_username: + self.db.auth_user.username.required = True + self.db.auth_user.action_token.writable = True + self.db.auth_user.password.writable = True + self.db.auth_user.password.required = True + self.db.auth_user.first_name.required = True + self.db.auth_user.last_name.required = True return self.db.auth_user.validate_and_insert(**fields) return dict(id=self.db.auth_user.insert(**fields)) @@ -461,55 +656,77 @@ def store(fields): return res def login(self, email, password): + """Login a new user after the user's parameters are entered + in the Login form""" db = self.db - # Default incase they are None or an error will occur. + # Default email and password in case they are None or an error will occur. email = "" if email is None else email password = "" if password is None else password - if "email_auth" in self.plugins: - email = email.lower() - if self.plugins["email_auth"].validate_credentials(email, password): - user = db(db.auth_user.email == email).select().first() - return (user, None) - else: - return None, "Invalid Credentials" - else: + user = None + error = None + prevent_db_lookup = False + # first check if we have a plugin that can check credentials + + for plugin in self.plugins.values(): + if not hasattr(plugin, "get_login_url"): + prevent_db_lookup = True + if plugin.check_credentials(email, password): + # if the creadentials are independently validated + # get of create the user (if does not exist) + user_info = {} + user_info["sso_id"] = plugin.name + ":" + email + if self.use_username or "@" not in email: + user_info["username"] = email + if "@" in email: + user_info["email"] = email + else: + user_info["email"] = email + "@example.com" + user = self.get_or_register_user(user_info) + break + + # else check against database + if not prevent_db_lookup: value = email.lower() - if self.use_username: - query = ( - (db.auth_user.email == value) - if "@" in value - else (db.auth_user.username == value) - ) - else: - query = db.auth_user.email == value - user = db(query).select().first() - if not user: - return (None, "Invalid email") - if (user.action_token or "").startswith("pending-registration:"): - return (None, "Registration is pending") - if user.action_token == "account-blocked": - return (None, "Account is blocked") - if user.action_token == "pending-approval": - return (None, "Account needs to be approved") - if CRYPT()(password)[0] == user.password: - return (user, None) - return None, "Invalid Credentials" + field = ( + db.auth_user.email + if "@" in value or not self.use_username + else db.auth_user.username + ) + user = db(field == value).select().first() + if user and not (CRYPT()(password)[0] == user.password): + user = None + + # then check for possible login blockers + if not user: + error = "invalid_credentials" + elif (user.get("action_token") or "").startswith("pending-registration:"): + error = "registration_is_pending" + elif user.get("action_token") == "account-blocked": + error = "account_is_blocked" + elif user.get("action_token") == "pending-approval": + error = "account_needs_to_be_approved" + + # return the error or the user + if error: + return (None, self.param.messages["errors"].get(error, error)) + return (user, None) def request_reset_password(self, email, send=True, next="", route=None): + """Send a mail with token for changing user's password after the user's parameters are entered + in the request_reset_password form + """ + db = self.db value = email.lower() - if self.use_username: - query = ( - (db.auth_user.email == value) - if "@" in value - else (db.auth_user.username == value) - ) - else: - query = db.auth_user.email == value - user = db(query).select().first() - if user and not user.action_token == "account-blocked": + field = ( + db.auth_user.email + if "@" in value or not self.use_username + else db.auth_user.username + ) + user = db(field == value).select().first() + if user and user.action_token != "account-blocked": token = str(uuid.uuid4()) if next: token += "/" + b16e(next) @@ -539,19 +756,25 @@ def reset_password(self, token, new_password, new_password2): user = db(query).select().first() if not user: - return {"errors": {"token": "invalid token"}} + return { + "errors": {"token": self.param.messages["errors"].get("invalid_token")} + } if new_password != new_password2: - return {"errors": {"new_password2": "Password doesn't match"}} + return { + "errors": { + "new_password2": self.param.messages["errors"].get( + "password_doesnt_match" + ) + } + } qset = db(db.auth_user.id == user["id"]) value, error = db.auth_user.password.validate(new_password) if error: - res = {"errors": {"new_password": error}} - else: - qset.update(password=value) - res = {} - return res + return {"errors": {"new_password": error}} + qset.update(password=value) + return {} # Methods that assume a user @@ -563,14 +786,22 @@ def change_password( if check_old_password: pwd = CRYPT()(old_password)[0] if not (pwd and pwd == user.get("password")): - return {"errors": {"old_password": "invalid current password"}} + return { + "errors": { + "old_password": self.param.messages["errors"].get( + "invalid_current_password" + ) + } + } new_pwd, error = db.auth_user.password.validate(new_password) if error: return {"errors": {"new_password": error}} if new_pwd == user.password: return { "errors": { - "new_password": "new password is the same as previous password" + "new_password": self.param.messages["errors"].get( + "new_password_is_the_same_as_previous_password" + ) } } if self.param.block_previous_password_num: @@ -578,41 +809,42 @@ def change_password( : self.param.block_previous_password_num ] if any(new_pwd == old_pwd for old_pwd in past_pwds): - return {"errors": {"new_password": "new password was already used"}} - else: - past_pwds.insert(0, user.get("password")) - db(db.auth_user.id == user.get("id")).update( - past_passwords_hash=past_pwds - ) + return { + "errors": { + "new_password": self.param.messages["errors"].get( + "new_password_was_already_used" + ) + } + } + past_pwds.insert(0, user.get("password")) + db(db.auth_user.id == user.get("id")).update( + past_passwords_hash=past_pwds + ) num = db(db.auth_user.id == user.get("id")).update( - password=new_pwd, last_password_change=datetime.datetime.utcnow() + password=new_pwd, last_password_change=utcnow() ) return {"updated": num} def change_email(self, user, new_email, password=None, check=True): db = self.db - if check and not CRYPT()(password)[0] == user.get("password"): - return {"errors": {"password": "invalid"}} - return ( - db(db.auth_user.id == user.get("id")) - .validate_and_update(email=new_email) - .as_dict() + if check and CRYPT()(password)[0] != user.get("password"): + return { + "errors": {"password": self.param.messages["errors"].get("invalid")} + } + return db(db.auth_user.id == user.get("id")).validate_and_update( + email=new_email ) def update_profile(self, user, **fields): db = self.db errors = { - k: "invalid" + k: self.param.messages["errors"].get("invalid") for k in fields if k not in db.auth_user.fields or not db.auth_user[k].writable } if errors: return {"errors": errors} - return ( - db(db.auth_user.id == user.get("id")) - .validate_and_update(**fields) - .as_dict() - ) + return db(db.auth_user.id == user.get("id")).validate_and_update(**fields) def gdpr_unsubscribe(self, user, send=True): """GDPR unsubscribe means we delete first_name, last_name, @@ -663,32 +895,36 @@ def get_or_delete_existing_unverified_account(self, email): def get_or_register_user(self, user): db = self.db - # if the we have an email for the user - if "email" in user: - # return a user if exists and has a verified email - row = self.get_or_delete_existing_unverified_account(user["email"]) - # else retrieve the user from the sso_id - else: + # if we have an sso_id we use it to id the user + if user.get("sso_id"): + keyid = "sso_id" row = ( db(db.auth_user.sso_id == user["sso_id"]).select(limitby=(0, 1)).first() ) - # if we have found a candidate user - if row: - # we expect the email to match if provided - if "email" in user and row.email != user["email"]: - return None - # we can update all the other information provided by the SSO - if any(user[key] != row[key] for key in user if not key == "username"): + # the sso source is always more authoritative so update the record + if row: row.update_record(**user) - user["id"] = row["id"] - # if we do not have a candidate user we need to create one + # pass the full user + user = row.as_dict() + # othrewise we id the user via email + elif user.get("email"): + keyid = "email" + # return a user if exists and has a verified email + row = self.get_or_delete_existing_unverified_account(user["email"]) + # the database is more authoritative + if row: + user.update(**row.as_dict()) else: - # we expect an email to unable to create account - if not "email" in user: - return None - # if we expect a username but not provided, user email as username - if self.use_username and "username" not in user: - user["username"] = user["email"] + return None + # if we do not have a candidate user we create one + if not row: + # if we expect a username but not provided, use keyid as username + if self.use_username: + if "username" not in user: + user["username"] = user[keyid] + # make sure the username is unique + if db(db.auth_user.username == user["username"]).count(): + raise HTTP(401, body=f"Conficting {user['username']} accounts") # create the user user["id"] = db.auth_user.insert(**db.auth_user._filter_fields(user)) return user @@ -703,11 +939,16 @@ def _query_from_token(self, token): def _error(self, message, code=400): return {"status": "error", "message": message, "code": code} + def _success(self, message, code=200): + return {"status": "success", "message": message, "code": code} + # Other service methods (that can be overwritten) def send(self, name, user, **attrs): - """Extend the object and override this function to send messages with - twilio or onesignal or alternative method other than email""" + """Extends the object and override the function to send messages with + twilio or onesignal or alternative method other than email + """ + message = self.param.messages[name] d = dict(user) d.update(**attrs) @@ -772,8 +1013,8 @@ def enable_record_versioning( current_record_label=current_record_label, ) - def enable(self, route="auth", uses=(), env=None, spa=False): - """enables Auth, aka generates login/logout/register/etc pages""" + def enable(self, route="auth", uses=(), env=None, spa=False, allow_api_routes=True): + """Enables Auth, aka generates login/logout/register/etc API pages""" self.route = route = route.rstrip("/") env = env or {} auth = self @@ -785,74 +1026,92 @@ def enable(self, route="auth", uses=(), env=None, spa=False): for key, value in group.items(): group[key] = T(value) - def allowed(name): - return set(self.param.allowed_actions) & set(["all", name]) - methods = ["GET", "POST", "OPTIONS"] - # This exposes all actions as /{app_name}/{route}/api/{name} - for api_name in AuthAPI.public_api: - if allowed(api_name): - api_factory = getattr(AuthAPI, api_name) - @action(route + "/api/" + api_name, method=methods) - @action.uses(auth, *uses) - def _(auth=auth, api_factory=api_factory): - return api_factory(auth) + # This exposes all API actions as /{app_name}/{route}/api/{name} + # and API Models as /{app_name}/{route}/api/{name}?@model=true + exposed_api_routes = [] + if allow_api_routes: + # Exposed Public APIs + exposed_api_routes = [ + dict(api_name=api_name, api_route=f"{route}/api/{api_name}", uses=auth) + for api_name in AuthAPI.public_api + if self.allows(api_name) + ] - for api_name in AuthAPI.private_api: - if allowed(api_name): - api_factory = getattr(AuthAPI, api_name) + # Exposed Private APIs + exposed_api_routes.extend( + [ + dict( + api_name=api_name, + api_route=f"{route}/api/{api_name}", + uses=auth.user, + ) + for api_name in AuthAPI.private_api + if self.allows(api_name) + ] + ) - @action(route + "/api/" + api_name, method=methods) - @action.uses(auth.user, *uses) + for item in exposed_api_routes: + api_factory = getattr(AuthAPI, item["api_name"]) + + @action(item["api_route"], method=methods) + @action.uses(item["uses"], *uses) def _(auth=auth, api_factory=api_factory): return api_factory(auth) # This exposes all plugins as /{app_name}/{route}/plugins/{path} for name in self.plugins: - @action(route + "/plugin/" + name + "/", method=["GET", "POST"]) + @action(f"{route}/plugin/{name}/", method=["GET", "POST"]) @action.uses(auth, *uses) def _(path, plugin=self.plugins[name], name=name): return plugin.handle_request(self, path, request.query, request.json) - # This exposes all other pages as /{app_name}/{route}/{path} - - def dummy(): - return None - - for form_name in self.form_source.public_forms: - if allowed(form_name): - form_factory = dummy if spa else getattr(self.form_source, form_name) + # Don't expose the form routes if this is an API based Single Page Application. + if not spa: + exposed_form_routes = [ + dict(form_name=form_name, form_route=f"{route}/{form_name}", uses=auth) + for form_name in self.form_source.public_forms + if self.allows(form_name) + ] - @action(route + "/" + form_name, method=["GET", "POST"]) - @action.uses(route + ".html") - @action.uses(auth, self.flash, *uses) - def _(auth=auth, form_factory=form_factory, path=form_name, env=env): - return dict( - form=form_factory(), path=path, user=auth.get_user(), **env + exposed_form_routes.extend( + [ + dict( + form_name=form_name, + form_route=f"{route}/{form_name}", + uses=auth.user, ) + for form_name in self.form_source.private_forms + if self.allows(form_name) + ] + ) - for form_name in self.form_source.private_forms: - if allowed(form_name): - form_factory = dummy if spa else getattr(self.form_source, form_name) - - @action(route + "/" + form_name, method=["GET", "POST"]) - @action.uses(route + ".html") - @action.uses(auth.user, self.flash, *uses) - def _(auth=auth, form_factory=form_factory, path=form_name, env=env): - return dict( - form=form_factory(), path=path, user=auth.get_user(), **env + exposed_form_routes.extend( + [ + dict( + form_name=form_name, + form_route=f"{route}/{form_name}", + uses=auth, ) + for form_name in self.form_source.no_forms + if self.allows(form_name) + ] + ) - for form_name in self.form_source.no_forms: - if allowed(form_name): - form_factory = getattr(self.form_source, form_name) - - @action(route + "/" + form_name) - @action.uses(route + ".html") - @action.uses(auth, self.flash, *uses) - def _(auth=auth, form_factory=form_factory, path=form_name, env=env): + for item in exposed_form_routes: + form_factory = getattr(self.form_source, item["form_name"]) + template = Template(f"{route}.html", **self.param.template_args) + + @action(item["form_route"], method=["GET", "POST"]) + @action.uses(template, item["uses"], self.flash, *uses) + def _( + auth=auth, + form_factory=form_factory, + path=item["form_name"], + env=env, + ): return dict( form=form_factory(), path=path, user=auth.get_user(), **env ) @@ -865,9 +1124,11 @@ def form(self, name, **attr): def api_wrapper(func): + """Validates API calls""" + def func_wrapper(auth, func=func): data = func(auth) or {} - if not "status" in data and data.get("errors"): + if "status" not in data and data.get("errors"): data.update(status="error", message="validation errors", code=401) elif "errors" in data and not data["errors"]: del data["errors"] @@ -879,17 +1140,93 @@ def func_wrapper(auth, func=func): class AuthAPI: + """AuthAPI class. + + Defines all the public and private API methods + """ public_api = [ + "all_models", "config", "register", "login", "logout", "request_reset_password", "reset_password", + "verify_email", ] + private_api = ["profile", "change_password", "change_email", "unsubscribe"] + model_apis = [ + "register", + "login", + "logout", + "request_reset_password", + "reset_password", + "verify_email", + "profile", + "change_password", + ] + + @staticmethod + @api_wrapper + def all_models(auth): + if not auth.param.expose_all_models: + return HTTP(404) + available_models = [item for item in AuthAPI.model_apis if auth.allows(item)] + request.query["@model"] = "true" + response_remove_fields = ["code", "status"] + all_models = dict() + + for model in available_models: + current_model = getattr(AuthAPI, model)(auth) + + for remove in response_remove_fields: + current_model.pop(remove, None) + + all_models[model] = current_model + + return all_models + + @staticmethod + def model_request(route): + return (request.query.get("@model", None) == "true") and ( + route in AuthAPI.model_apis + ) + + @staticmethod + def get_model(defaultAuthFunction): + model = defaultAuthFunction(model=True) + + for key, value in model.items(): + if key.lower() == "fields": + formatted_fields = [] + + for field in value: + formatted_fields.append( + dict( + name=field.name, + type=field.type, + label=field.label, + readable=field.readable, + writable=field.writable if field.type != "id" else False, + required=field.required, + regex=field.regex if hasattr(field, "regex") else None, + default=( + field.default() + if callable(field.default) + else field.default + ), + options=field.options, + ) + ) + + model[key] = formatted_fields + break + + return model + @staticmethod @api_wrapper def config(auth): @@ -910,19 +1247,29 @@ def config(auth): @staticmethod @api_wrapper def register(auth): - if request.json is None: - return auth._error("no json post payload") - auth.get_or_delete_existing_unverified_account(request.json.get("email")) - return auth.register(request.json, send=True).as_dict() + if AuthAPI.model_request("register"): + return AuthAPI.get_model(defaultAuthFunction=auth.form_source.register) + + payload = request.POST if (request.json is None) else request.json + + if payload is None: + return auth._error(auth.param.messages["errors"].get("no_post_payload")) + auth.get_or_delete_existing_unverified_account(payload.get("email")) + return auth.register(payload, send=True) @staticmethod @api_wrapper def login(auth): - if request.json is None: - return auth._error("no json post payload") - username, password = request.json.get("email"), request.json.get("password") + if AuthAPI.model_request("login"): + return AuthAPI.get_model(defaultAuthFunction=auth.form_source.login) + + payload = request.POST if (request.json is None) else request.json + + if payload is None: + return auth._error(auth.param.messages["errors"].get("no_post_payload")) + username, password = payload.get("email"), payload.get("password") if not all(isinstance(_, str) for _ in [username, password]): - return auth._error("Invalid Credentials") + return auth._error(auth.param.messages["errors"].get("invalid_credentials")) # Prioritize PAM or LDAP logins if enabled if "pam" in auth.plugins or "ldap" in auth.plugins: @@ -940,7 +1287,10 @@ def login(auth): auth.store_user_in_session(user["id"]) # else: if we're here - check is OK, but user is not in the session - is it right? else: - data = auth._error("Invalid Credentials") + data = auth._error( + auth.param.messages["errors"].get("invalid_credentials") + ) + # Else use normal login else: user, error = auth.login(username, password) @@ -957,27 +1307,61 @@ def login(auth): @staticmethod @api_wrapper def request_reset_password(auth): - if request.json is None: - return auth._error("no json post payload") - if not auth.request_reset_password(**request.json): + if AuthAPI.model_request("request_reset_password"): + return AuthAPI.get_model( + defaultAuthFunction=auth.form_source.request_reset_password + ) + + payload = request.POST if (request.json is None) else request.json + + if payload is None: + return auth._error(auth.param.messages["errors"].get("no_post_payload")) + + if "email" not in payload: + payload["email"] = "" + + if not auth.request_reset_password(**payload): return auth._error("invalid user") return {} @staticmethod @api_wrapper def reset_password(auth): + if AuthAPI.model_request("reset_password"): + return AuthAPI.get_model( + defaultAuthFunction=auth.form_source.reset_password + ) + + payload = request.POST if (request.json is None) else request.json + # check the new_password2 only if passed - if request.json is None: - return auth._error("no json post payload") + if payload is None: + return auth._error(auth.param.messages["errors"].get("no_post_payload")) return auth.reset_password( - request.json.get("token"), - request.json.get("new_password"), - request.json.get("new_password2", request.json.get("new_password")), + payload.get("token"), + payload.get("new_password"), + payload.get("new_password2", payload.get("new_password")), ) + @staticmethod + @api_wrapper + def verify_email(auth): + if AuthAPI.model_request("verify_email"): + return AuthAPI.get_model(defaultAuthFunction=auth.form_source.verify_email) + + token = request.query.get("token") + verified = auth.verify_email(token) + + if not verified: + return auth._error(auth.param.messages["flash"].get("link-expired")) + return auth._success(auth.param.messages["flash"].get("email-verified")) + @staticmethod @api_wrapper def logout(auth): + if AuthAPI.model_request("logout"): + return AuthAPI.get_model(defaultAuthFunction=auth.form_source.logout) + auth.session.clear() @staticmethod @@ -990,39 +1374,63 @@ def unsubscribe(auth): @staticmethod @api_wrapper def change_password(auth): - if request.json is None: - return auth._error("no json post payload") + if AuthAPI.model_request("change_password"): + return AuthAPI.get_model( + defaultAuthFunction=auth.form_source.change_password + ) + + payload = request.POST if (request.json is None) else request.json + + if payload is None: + return auth._error(auth.param.messages["errors"].get("no_post_payload")) return auth.change_password( auth.get_user(safe=False), # refactor make faster - request.json.get("new_password"), - request.json.get("old_password"), + payload.get("new_password"), + payload.get("old_password"), ) @staticmethod @api_wrapper def change_email(auth): - if request.json is None: - return auth._error("no json post payload") + payload = request.POST if (request.json is None) else request.json + + if payload is None: + return auth._error(auth.param.messages["errors"].get("no_post_payload")) return auth.change_email( auth.get_user(safe=False), - request.json.get("new_email"), - request.json.get("password"), + payload.get("new_email"), + payload.get("password"), ) @staticmethod @api_wrapper def profile(auth): + if AuthAPI.model_request("profile"): + model = AuthAPI.get_model(defaultAuthFunction=auth.form_source.profile) + model["user"] = auth.get_user() + return model + if request.method == "GET": return {"user": auth.get_user()} - if request.json is None: - return auth._error("no json post payload") + + payload = request.POST if (request.json is None) else request.json + + if payload is None: + return auth._error(auth.param.messages["errors"].get("no_post_payload")) else: - return auth.update_profile(auth.get_user(), **request.json) + return auth.update_profile(auth.get_user(), **payload) class DefaultAuthForms: + """Default Forms used for Auth actions""" - public_forms = ["register", "login", "request_reset_password", "reset_password"] + public_forms = [ + "register", + "login", + "request_reset_password", + "reset_password", + "two_factor", + ] private_forms = ["profile", "change_password"] # change_email, unsubscribe no_forms = ["logout", "verify_email"] @@ -1033,9 +1441,27 @@ def __init__(self, auth): def formstyle(self): return self.auth.param.formstyle - def register(self): - self.auth.db.auth_user.password.writable = True - fields = [field for field in self.auth.db.auth_user if field.writable] + def register(self, model=False): + """SignUp form""" + if "password" in self.auth.db.auth_user.fields: + self.auth.db.auth_user.password.writable = True + if self.auth.password_in_db: + self.auth.db.auth_user.password.requires = [ + IS_STRONG(**self.auth.param.password_complexity), + CRYPT(), + ] + else: + self.auth.param.password_complexity = {"entropy": 0} + self.auth.db.auth_user.password.requires = [ + IS_STRONG(**self.auth.param.password_complexity) + ] + + fields = [ + field + for field in self.auth.db.auth_user + if field.writable and field.type != "id" + ] + if self.auth.param.exclude_extra_fields_in_register: fields = [ field @@ -1043,7 +1469,7 @@ def register(self): if field.name not in self.auth.param.exclude_extra_fields_in_register ] for k, field in enumerate(fields): - if field.type == "password": + if field.type == "password" and self.auth.password_in_db: fields.insert( k + 1, Field( @@ -1055,17 +1481,62 @@ def register(self): ) break button_name = self.auth.param.messages["buttons"]["sign-up"] + + if model: + additional_buttons = [] + if self.auth.allows("login"): + additional_buttons.append( + dict( + label=self.auth.param.messages["buttons"]["sign-in"], + action="login", + href=URL(f"{self.auth.route}/api/login"), + ) + ) + + if self.auth.allows("request_reset_password"): + additional_buttons.append( + dict( + label=self.auth.param.messages["buttons"]["lost-password"], + action="request_reset_password", + href=URL(f"{self.auth.route}/api/request_reset_password"), + ) + ) + + return dict( + public=True, + hidden=False, + fields=fields, + href=URL(f"{self.auth.route}/api/register"), + submit_label=button_name, + additional_buttons=additional_buttons, + ) + # if the form is submitted, before any validation # delete any unverified account with the same email if request.method == "POST": email = request.forms.get("email") if email: self.auth.get_or_delete_existing_unverified_account(email) + extra_form_fields = self.auth.extra_form_fields.get("register", []) + fields += extra_form_fields form = Form(fields, submit_value=button_name, formstyle=self.formstyle) user = None if form.accepted: # notice that here the form is alrealdy validated - res = self.auth.register(form.vars, validate=False) + if not self.auth.password_in_db: # password must not be written in db + # Prioritize PAM or LDAP logins if enabled + if "pam" in self.auth.plugins or "ldap" in self.auth.plugins: + plugin_name = "pam" if "pam" in self.auth.plugins else "ldap" + check = self.auth.plugins[plugin_name].check_credentials( + form.vars["username"], form.vars["password"] + ) + form.vars["password"] = "" + if not check: + self._set_flash("Invalid credentials") + redirect("register") + extra_names = set(field.name for field in extra_form_fields) + vars = {k: v for k, v in form.vars.items() if k not in extra_names} + res = self.auth.register(vars, validate=False) form.errors.update(**res.get("errors", {})) form.accepted = not form.errors if form.accepted: @@ -1073,19 +1544,20 @@ def register(self): self._postprocessing("register", form, user) if self.auth.param.login_after_registration: redirect("login") - form.param.sidecar.append( - A( - self.auth.param.messages["buttons"]["sign-in"], - _href="../auth/login", - _class=self.auth.param.button_classes["sign-in"], - _role="button", + if self.auth.allows("login"): + form.param.sidecar.append( + A( + self.auth.param.messages["buttons"]["sign-in"], + _href=URL(f"{self.auth.route}/login"), + _class=self.auth.param.button_classes["sign-in"], + _role="button", + ) ) - ) if self.auth.allows("request_reset_password"): form.param.sidecar.append( A( self.auth.param.messages["buttons"]["lost-password"], - _href="../auth/request_reset_password", + _href=URL(f"{self.auth.route}/request_reset_password"), _class=self.auth.param.button_classes["lost-password"], _role="button", ) @@ -1093,60 +1565,123 @@ def register(self): return form def login_buttons(self): - + """Define auth plugin type button to be displayed in login form""" top_buttons = [] for name, plugin in self.auth.plugins.items(): - url = "../auth/plugin/" + name + "/login" - if request.query.get("next"): - url = url + "?next=" + request.query.get("next") - if ( - name != "email_auth" - ): # do not add the top button for the email auth plugin - top_buttons.append( - A(plugin.label + " Login", _href=url, _role="button") - ) - return top_buttons + # do not add a button for plugin that do not delegate to url + if not hasattr(plugin, "get_login_url"): + continue + + url = URL(f"{self.auth.route}/plugin/{name}/login") + + next_url = prevent_open_redirect(request.query.get("next")) + if next_url: + url = f"{url}?next={next_url}" + + top_buttons.append( + dict(label=f"{plugin.label} Login", action=name, href=url) + ) + + combined_div = DIV( + *[ + A(item["label"], _href=f"{item['href']}", _role="button") + for item in top_buttons + ] + ) - def login(self): + return dict(buttons=top_buttons, combined_div=combined_div) + def login(self, model=False): + """Login form""" top_buttons = self.login_buttons() # if we do not allow we only display the plugin login buttons if not self.auth.param.default_login_enabled: - return DIV(*top_buttons) + if model: + return top_buttons["buttons"] + return top_buttons["combined_div"] fields = [ Field( - "username", + "email", + label=( + self.auth.db.auth_user.username.label + if self.auth.use_username + else self.auth.db.auth_user.email.label + ), ), Field( - "login_password", + "password", type="password", label=self.auth.param.messages["labels"].get("password"), ), ] - if self.auth.use_username: - fields[0].label = self.auth.db.auth_user.username.label - else: - fields[0].label = self.auth.db.auth_user.email.label - fields[1].label = self.auth.db.auth_user.password.label button_name = self.auth.param.messages["buttons"]["sign-in"] + + if model: + additional_buttons = [] + if self.auth.allows("register"): + additional_buttons.append( + dict( + label=self.auth.param.messages["buttons"]["sign-up"], + action="register", + href=URL(f"{self.auth.route}/api/register"), + ) + ) + + if self.auth.allows("request_reset_password"): + additional_buttons.append( + dict( + label=self.auth.param.messages["buttons"]["lost-password"], + action="request_reset_password", + href=URL(f"{self.auth.route}/api/request_reset_password"), + ) + ) + + additional_buttons.extend(top_buttons["buttons"]) + + return dict( + public=True, + hidden=False, + fields=fields, + href=URL(f"{self.auth.route}/api/login"), + submit_label=button_name, + additional_buttons=additional_buttons, + ) + + extra_form_fields = self.auth.extra_form_fields.get("login", []) + fields += extra_form_fields form = Form( fields, submit_value=button_name, formstyle=self.formstyle, ) user = None - self.auth.next["login"] = request.query.get("next") + next_url = prevent_open_redirect(request.query.get("next")) + self.auth.session["_next_login"] = next_url if form.submitted: user, error = self.auth.login( - form.vars.get("username", ""), form.vars.get("login_password", "") + form.vars.get("email", ""), form.vars.get("password", "") ) form.accepted = not error - form.errors["username"] = error + form.errors["password"] = error if user: + # We will process two_factor if two_factor_send is defined and either + # - No two_factor_required defined + # OR + # - two_factor_required() returns True + # If two_factor_required exists and returns False, + # then this user bypasses two_factor processing + if self.auth.param.two_factor_send is not None: + if ( + not self.auth.param.two_factor_required + or self.auth.param.two_factor_required(user, request) + ): + self.auth.session["auth.2fa_user"] = user["id"] + self.auth.session["auth.2fa_next_url"] = next_url + redirect(URL(f"{self.auth.route}/two_factor")) self.auth.store_user_in_session(user["id"]) self._postprocessing("login", form, user) @@ -1154,7 +1689,7 @@ def login(self): form.param.sidecar.append( A( self.auth.param.messages["buttons"]["sign-up"], - _href="../auth/register", + _href=URL(f"{self.auth.route}/register"), _class=self.auth.param.button_classes["sign-up"], _role="button", ) @@ -1163,24 +1698,146 @@ def login(self): form.param.sidecar.append( A( self.auth.param.messages["buttons"]["lost-password"], - _href="../auth/request_reset_password", + _href=URL(f"{self.auth.route}/request_reset_password"), _class=self.auth.param.button_classes["lost-password"], _role="button", ) ) - form.structure.insert(0, DIV(DIV(*top_buttons))) + form.structure.insert(0, DIV(top_buttons["combined_div"])) return form - def request_reset_password(self): + def _reset_two_factor(self): + self.auth.session["auth.2fa_user"] = None + self.auth.session["auth.2fa_code"] = None + self.auth.session["auth.2fa_tries_left"] = self.auth.param.two_factor_tries + + def two_factor(self): + if (self.auth.param.two_factor_send is None) and ( + self.auth.param.two_factor_validate is None + ): + raise HTTP(404) + + user_id = self.auth.session.get("auth.2fa_user") + next_url = self.auth.session.get("auth.2fa_next_url") + + if not user_id: + redirect(URL("index")) + + user = self.auth.db.auth_user(user_id) + code = self.auth.session.get("auth.2fa_code") + if (not code) and (not self.auth.param.two_factor_send is None): + # generate and send the code + code = str(random.randint(100000, 999999)) + code = self.auth.param.two_factor_send(user, code) + # store code in session + self.auth.session["auth.2fa_code"] = code + self.auth.session["auth.2fa_tries_left"] = self.auth.param.two_factor_tries + elif self.auth.session.get("auth.2fa_tries_left") is None: + self.auth.session["auth.2fa_tries_left"] = self.auth.param.two_factor_tries + + def two_factor_validate(form): + # external validation outcome + outcome = None + if self.auth.param.two_factor_validate: + outcome = self.auth.param.two_factor_validate( + user, form.vars["authentication_code"] + ) + # outcome: + # True: external validation passed + # False: external validation failed + # None: external validation status unknown - check against the generated code + if outcome == False or ( + (outcome is None) and (form.vars["authentication_code"] != code) + ): + form.errors["authentication_code"] = self.auth.param.messages["errors"][ + "two_factor" + ] + form = Form( [ Field( - "email", - label=self.auth.param.messages["labels"].get("username_or_email"), - requires=IS_NOT_EMPTY(), - ) + "authentication_code", + label=self.auth.param.messages["labels"]["two_factor"], + required=True, + ), ], - submit_value=self.auth.param.messages["buttons"]["request"], + validation=two_factor_validate, + formstyle=self.auth.param.formstyle, + form_name="auth_2fa", + keep_values=True, + hidden=dict(next_url=next_url), + ) + + if form.accepted: + # reset the 2f session + self._reset_two_factor() + # store user in session + self.auth.store_user_in_session(user["id"]) + # login user + self._postprocessing("login", form, user) + # redirect after login + redirect(next_url) + elif form.errors: + # decrease the retries count + self.auth.session["auth.2fa_tries_left"] -= 1 + # if 0 retries available, reset, and redirect to login + if self.auth.session.get("auth.2fa_tries_left") < 1: + self._reset_two_factor() + self._set_flash( + self.auth.param.messages["errors"]["two_factor_max_tries"] + ) + redirect(URL(f"{self.auth.route}/login", vars=dict(next=next_url))) + return form + + def request_reset_password(self, model=False): + """ "Request reset password form""" + fields = [ + Field( + "email", + label=self.auth.param.messages["labels"].get("username_or_email"), + requires=IS_NOT_EMPTY(), + ) + ] + + button_name = self.auth.param.messages["buttons"]["request"] + + if model: + additional_buttons = [] + if self.auth.allows("login"): + additional_buttons.append( + dict( + label=self.auth.param.messages["buttons"]["sign-in"], + action="login", + href=URL(f"{self.auth.route}/api/login"), + ) + ) + + if self.auth.allows("register"): + additional_buttons.append( + dict( + label=self.auth.param.messages["buttons"]["sign-up"], + action="register", + href=URL(f"{self.auth.route}/api/register"), + ) + ) + + return dict( + public=True, + hidden=False, + fields=fields, + href=URL(f"{self.auth.route}/api/request_reset_password"), + submit_label=button_name, + additional_buttons=additional_buttons, + ) + + extra_form_fields = self.auth.extra_form_fields.get( + "request_reset_password", [] + ) + fields += extra_form_fields + + form = Form( + fields, + submit_value=button_name, formstyle=self.formstyle, ) if form.accepted: @@ -1188,26 +1845,57 @@ def request_reset_password(self): self.auth.request_reset_password(email, send=True, next="") self._set_flash("password-reset-link-sent") self._postprocessing("request_reset_password", form, None) - form.param.sidecar.append( - A( - self.auth.param.messages["buttons"]["sign-in"], - _href="../auth/login", - _class=self.auth.param.button_classes["sign-in"], - _role="button", + + if self.auth.allows("login"): + form.param.sidecar.append( + A( + self.auth.param.messages["buttons"]["sign-in"], + _href=URL(f"{self.auth.route}/login"), + _class=self.auth.param.button_classes["sign-in"], + _role="button", + ) ) - ) + if self.auth.allows("register"): form.param.sidecar.append( A( self.auth.param.messages["buttons"]["sign-up"], - _href="../auth/register", + _href=URL(f"{self.auth.route}/register"), _class=self.auth.param.button_classes["sign-up"], _role="button", ) ) return form - def reset_password(self): + def reset_password(self, model=False): + """Process reset password form""" + + fields = [ + Field( + "new_password", + type="password", + requires=self.auth.db.auth_user.password.requires, + label=self.auth.param.messages["labels"].get("new_password"), + ), + Field( + "new_password_again", + type="password", + requires=IS_EQUAL_TO(request.forms.get("new_password")), + label=self.auth.param.messages["labels"].get("password_again"), + ), + ] + + button_name = self.auth.param.messages["buttons"]["submit"] + + if model: + return dict( + public=True, + hidden=True, + fields=fields, + href=URL(f"{self.auth.route}/api/reset_password"), + submit_label=button_name, + ) + user = None token = request.query.get("token") if token: @@ -1216,22 +1904,9 @@ def reset_password(self): if not user: raise HTTP(404) form = Form( - [ - Field( - "new_password", - type="password", - requires=self.auth.db.auth_user.password.requires, - label=self.auth.param.messages["labels"].get("new_password"), - ), - Field( - "new_password_again", - type="password", - requires=IS_EQUAL_TO(request.forms.get("new_password")), - label=self.auth.param.messages["labels"].get("password_again"), - ), - ], + fields, formstyle=self.formstyle, - submit_value=self.auth.param.messages["buttons"]["submit"], + submit_value=button_name, ) self._process_change_password_form(form, user, False) if form.accepted: @@ -1239,32 +1914,46 @@ def reset_password(self): self._postprocessing("reset_password", form, user) return form - def change_password(self): - user = self.auth.db.auth_user(self.auth.user_id) + def change_password(self, model=False): + """Request change password form""" + fields = [ + Field( + "old_password", + type="password", + requires=IS_NOT_EMPTY(), + label=self.auth.param.messages["labels"].get("old_password"), + ), + Field( + "new_password", + type="password", + requires=self.auth.db.auth_user.password.requires, + label=self.auth.param.messages["labels"].get("new_password"), + ), + Field( + "new_password_again", + type="password", + requires=IS_EQUAL_TO(request.forms.get("new_password")), + label=self.auth.param.messages["labels"].get("password_again"), + ), + ] + + button_name = self.auth.param.messages["buttons"]["submit"] + + if model: + return dict( + public=False, + hidden=False, + fields=fields, + href=URL(f"{self.auth.route}/api/change_password"), + submit_label=button_name, + ) + form = Form( - [ - Field( - "old_password", - type="password", - requires=IS_NOT_EMPTY(), - label=self.auth.param.messages["labels"].get("old_password"), - ), - Field( - "new_password", - type="password", - requires=self.auth.db.auth_user.password.requires, - label=self.auth.param.messages["labels"].get("new_password"), - ), - Field( - "new_password_again", - type="password", - requires=IS_EQUAL_TO(request.forms.get("new_password")), - label=self.auth.param.messages["labels"].get("password_again"), - ), - ], + fields, formstyle=self.formstyle, - submit_value=self.auth.param.messages["buttons"]["submit"], + submit_value=button_name, ) + user = self.auth.db.auth_user(self.auth.user_id) self._process_change_password_form(form, user, True) if form.accepted: self._set_flash("password-changed") @@ -1272,6 +1961,7 @@ def change_password(self): return form def _process_change_password_form(self, form, user, check_old_password): + """Process change password form""" if form.accepted: old_password = request.forms.get("old_password") new_password = request.forms.get("new_password") @@ -1287,7 +1977,8 @@ def _process_change_password_form(self, form, user, check_old_password): if not form.accepted: form.vars.clear() - def profile(self): + def profile(self, model=False): + """Edit profile form""" user = self.auth.db.auth_user(self.auth.user_id) if "username" in self.auth.db.auth_user.fields: self.auth.db.auth_user.username.writable = False @@ -1299,25 +1990,62 @@ def profile(self): field.writable = False field.readable = False + fields = [ + self.auth.db.auth_user[field] + for field in self.auth.db.auth_user.fields + if self.auth.db.auth_user[field].readable + ] + + button_name = self.auth.param.messages["buttons"]["submit"] + deletable = False + + if model: + return dict( + public=False, + hidden=False, + fields=fields, + href=URL(f"{self.auth.route}/api/profile"), + submit_label=button_name, + deletable=deletable, + ) + form = Form( self.auth.db.auth_user, user, formstyle=self.formstyle, - deletable=False, - submit_value=self.auth.param.messages["buttons"]["submit"], + deletable=deletable, + submit_value=button_name, ) if form.accepted: self._set_flash("profile-saved") self._postprocessing("profile", form, user) return form - def logout(self): + def logout(self, model=False): + if model: + return dict( + public=False, + hidden=False, + noform=True, + href=URL(f"{self.auth.route}/api/logout"), + ) + + """Process logout""" self.auth.session.clear() self._set_flash("user-logout") self._postprocessing("logout") return "" - def verify_email(self): + def verify_email(self, model=False): + if model: + return dict( + public=True, + hidden=True, + noform=True, + href=URL(f"{self.auth.route}/api/verify_email"), + ) + + """Process token in email verification""" token = request.query.get("token") verified = self.auth.verify_email(token) self._set_flash("email-verified" if verified else "link-expired") @@ -1327,5 +2055,112 @@ def _set_flash(self, key): self.auth.flash.set(self.auth.param.messages["flash"].get(key, key)) def _postprocessing(self, action, form=None, user=None): + if action in self.auth.on_accept: + self.auth.on_accept[action](form, user) if not form or form.accepted: - redirect(self.auth.next.get(action) or URL("index")) + redirect(self.auth.session.get(f"_next_{action}") or URL("index")) + + +class SimpleTokenPlugin: + """ + A simble token bearer handler for auth.token_plugins + + Usage: + 1) auth.token_plugins.append(SimpleTokenPlugin(auth)) + 2) Use a grid or form to create a db.auth_simple_token record + 3) Use with curl -H "Authorization: Bearer {token}" + + This kind of token needs database access to be verified + It can therefore be expired server side. + + This is the recommended kind of token. + + You can create a management interface for API tokens with + + + @action("tokens/") + @action.uses("generic.html", auth.user) + def _(path): + db.auth_simple_token.user_id.default = auth.user_id + grid = Grid(path, db.auth_simple_token.user_id==auth.user_id, create=True, deletable=True) + return dict(grid=grid) + """ + + def __init__(self, auth, table=None): + self.auth = auth + if table: + self.table = table + else: + self.table = auth.db.define_table( + "auth_simple_token", + Field("token", default=uuid.uuid4, unique=True, writable=False), + Field( + "user_id", "reference auth_user", default=auth.user_id, writable=False + ), + Field("description"), + Field("expiration_date", "datetime"), + auth.signature, + ) + + def get_user(self): + authorization = request.headers.get("authorization") + if authorization and authorization.startswith("Bearer "): + db = self.auth.db + token = authorization[6:].strip() + row = self.table(token=token) + if row and row.expiration_date.isoformat() > utcnow().isoformat(): + user = db.auth_user(row.user_id) + return user.as_dict() + return None + + +class JwtTokenPlugin: + """ + A simble token bearer handler for auth.token_plugins + + Usage: + 1) myplugin = JwtTokenPlugin(auth) + 2) auth.token_plugins.append(myplugin) + 3) Use token = myplugin.make(user, expiration) to make tokens + 4) Use with curl -H "Authorization: Bearer {token}" + + This kind of token does not need database access to be verified. + It cannot therefore be expired server side and any server + side change in the user info is not reflected in the info + stored in the token. + + This token should only be used when the API needs to be fast + and it is desirable to aboid any database access. + Expiration should not be too far in the future. + + When making a token you can put anything you want in user, + but there must be a user["id"] for authentication to succeed. + """ + + def __init__(self, auth, secret=None, algorithms=["HS256", "RS256"]): + self.auth = auth + self.secret = secret or self.auth.session.SECRET + self.algorithms = algorithms + + def make(self, user, expiration): + if not isinstance(user, dict): + user = user.as_dict() + if not isinstance(expiration, str): + expiration = expiration.isoformat() + data = {"user": user, "expiration": expiration} + token = jwt.encode(data, self.secret, algorithm=self.algorithms[0]) + return token + + def get_user(self): + authorization = request.headers.get("authorization") + if authorization and authorization.startswith("Bearer "): + token = authorization[6:].strip() + try: + data = jwt.decode(token, self.secret, algorithms=self.algorithms) + except Exception: + return None + expiration = data.get("expiration") + if expiration and expiration > utcnow().isoformat(): + user = data.get("user") + return user + return None diff --git a/py4web/utils/auth_plugins/__init__.py b/py4web/utils/auth_plugins/__init__.py index 81f2e01ed..865b5eaa1 100644 --- a/py4web/utils/auth_plugins/__init__.py +++ b/py4web/utils/auth_plugins/__init__.py @@ -1,13 +1,24 @@ -import urllib -import calendar -import time -import uuid -import json import random -import jwt import string +import urllib + +import jwt import requests -from py4web.core import URL, abort, redirect, request + +from py4web.core import HTTP, URL, redirect, request + + +class UsernamePassword: + + name = "undefined" + + def __init__(self, test_mode=False): + self.test_mode = test_mode + + def check_credentials(self, username, password): + if self.test_mode: + return password == "password" + raise NotImplementedError class SSO(object): @@ -19,7 +30,6 @@ class SSO(object): def __init__(self, **parameters): self.parameters = parameters - self.next = URL("index") # Destination after login succeeds def get_login_url(self): """returns the url for login""" @@ -27,12 +37,12 @@ def get_login_url(self): def handle_request(self, auth, path, get_vars, post_vars): if path == "login": - self.next = request.query.get("next") or URL("index") + auth.session["_next"] = request.query.get("next") or URL("index") redirect(self.get_login_url()) elif path == "callback": self._handle_callback(auth, get_vars) else: - abort(404) + raise HTTP(404) def callback(self, get_vars): return {} @@ -42,7 +52,7 @@ def callback(self, get_vars): def _handle_callback(self, auth, get_vars): data = self.callback(get_vars) if not data: - abort(401) + raise HTTP(401) error = data.get("error") if error: if isinstance(error, str): @@ -50,27 +60,40 @@ def _handle_callback(self, auth, get_vars): else: code = error.get("code", 401) msg = error.get("message", "Unknown error") - abort(code, msg) + raise HTTP(code, msg) if auth.db: + print(data) # map returned fields into auth_user fields user = {} - for key, value in self.maps.items(): - value, parts = data, value.split(".") - for part in parts: - value = value[int(part) if part.isdigit() else part] + for key, orig_key in self.maps.items(): + value = data + parts = orig_key.split(".") + try: + for part in parts: + value = value[int(part) if part.isdigit() else part] user[key] = value + except Exception: + continue user["sso_id"] = "%s:%s" % (self.name, user["sso_id"]) - if not "username" in user: + if "username" not in user: user["username"] = user["sso_id"] # store or retrieve the user data = auth.get_or_register_user(user) + user_id = data["id"] else: # WIP Allow login without DB - if not "id" in data: - data["id"] = data.get("username") or data.get("email") + if "id" not in data: + data["id"] = ( + data.get("sso_id") or data.get("username") or data.get("email") + ) user_id = data.get("id") auth.store_user_in_session(user_id) - redirect(self.next) + if "_next" in auth.session: + next = auth.session.get("_next") + del auth.session["_next"] + else: + next = URL("index") + redirect(next) @staticmethod def _build_url(base, data): @@ -157,7 +180,8 @@ def callback(self, query): ), grant_type="authorization_code", ) - res = requests.post(self.token_url, data=data) + headers = {"Accept": "application/json"} + res = requests.post(self.token_url, data=data, headers=headers) output = res.json() token = output.get("id_token") if token is not None: diff --git a/py4web/utils/auth_plugins/basic_auth_plugin.py b/py4web/utils/auth_plugins/basic_auth_plugin.py index 2aa9ab2c1..2d1a1b56c 100644 --- a/py4web/utils/auth_plugins/basic_auth_plugin.py +++ b/py4web/utils/auth_plugins/basic_auth_plugin.py @@ -1,7 +1,7 @@ -from pydal._compat import urlopen -from pydal._compat import urllib2 import base64 +from pydal._compat import urllib2, urlopen + class BasicAuthPlugin: @@ -11,8 +11,7 @@ class BasicAuthPlugin: def __init__(self, server="127.0.0.1", table=None): self.server = server - def validate_credentials(self, username, password): - + def check_credentials(self, username, password): """ to use basic login with a different server from gluon.contrib.login_methods.basic_auth import basic_auth diff --git a/py4web/utils/auth_plugins/email_auth_plugin.py b/py4web/utils/auth_plugins/email_auth_plugin.py index e7fbe409e..932d07f34 100644 --- a/py4web/utils/auth_plugins/email_auth_plugin.py +++ b/py4web/utils/auth_plugins/email_auth_plugin.py @@ -1,5 +1,5 @@ -import smtplib import logging +import smtplib class EmailAuthPlugin: @@ -12,7 +12,7 @@ def __init__(self, server="smtp.gmail.com:587", domain="@gmail.com", tls_mode=No self.domain = domain self.tls_mode = tls_mode - def validate_credentials(self, username, password): + def check_credentials(self, username, password): email = username server = self.server domain = self.domain @@ -40,11 +40,12 @@ def validate_credentials(self, username, password): server.login(email, password) server.quit() return True - except: + except Exception: logging.exception("email_auth() failed") if server: try: server.quit() - except: # server might already close connection after error + except Exception: + # server might already close connection after error pass return False diff --git a/py4web/utils/auth_plugins/ldap_plugin.py b/py4web/utils/auth_plugins/ldap_plugin.py index a179b4cf5..3128c7e83 100644 --- a/py4web/utils/auth_plugins/ldap_plugin.py +++ b/py4web/utils/auth_plugins/ldap_plugin.py @@ -3,16 +3,18 @@ # last tinkered with by korylprince at gmail.com on 2012-07-12 # -import sys import logging +import sys + import ldap # python-ldap import ldap.filter -from pydal.tools.tags import Tags + +from . import UsernamePassword ldap.set_option(ldap.OPT_REFERRALS, 0) -class LDAPPlugin(object): +class LDAPPlugin(UsernamePassword): name = "ldap" label = "LDAP" @@ -423,7 +425,7 @@ def check_credentials(self, username, password): con.simple_bind_s(user_dn, password) found = True break - except ldap.LDAPError as detail: + except ldap.LDAPError: (exc_type, exc_value) = sys.exc_info()[:2] logger.warning( "ldap_auth: searching %s for %s resulted in %s: %s\n" @@ -461,7 +463,7 @@ def check_credentials(self, username, password): con.simple_bind_s(user_dn, password) found = True break - except ldap.LDAPError as detail: + except ldap.LDAPError: (exc_type, exc_value) = sys.exc_info()[:2] logger.warning( "ldap_auth: searching %s for %s resulted in %s: %s\n" @@ -482,7 +484,7 @@ def check_credentials(self, username, password): )[user_firstname_part] else: store_user_firstname = user_firstname - except KeyError as e: + except KeyError: store_user_firstname = None try: user_lastname = result[user_lastname_attrib][0] @@ -492,11 +494,11 @@ def check_credentials(self, username, password): )[user_lastname_part] else: store_user_lastname = user_lastname - except KeyError as e: + except KeyError: store_user_lastname = None try: store_user_mail = result[user_mail_attrib][0] - except KeyError as e: + except KeyError: store_user_mail = None update_or_insert_values = { "first_name": store_user_firstname, @@ -538,16 +540,16 @@ def check_credentials(self, username, password): con.unbind() return True - except ldap.INVALID_CREDENTIALS as e: + except ldap.INVALID_CREDENTIALS: return False - except ldap.LDAPError as e: + except ldap.LDAPError: import traceback logger.warning("[%s] Error in ldap processing" % str(username)) logger.debug(traceback.format_exc()) print(traceback.format_exc()) return False - except IndexError as ex: # for AD membership test + except IndexError: # for AD membership test import traceback logger.warning("[%s] Ldap result indexing error" % str(username)) @@ -681,7 +683,7 @@ def do_manage_groups(self, con, username, group_mapping={}): .first() .id ) - except AttributeError as e: + except AttributeError: # # There is no user in local db # We create one @@ -690,7 +692,7 @@ def do_manage_groups(self, con, username, group_mapping={}): db_user_id = db.auth_user.insert( username=username, first_name=username ) - except AttributeError as e: + except AttributeError: db_user_id = db.auth_user.insert( email=username, first_name=username ) @@ -890,3 +892,6 @@ def get_user_groups_from_ldap(self, con, username): if filterstr[0] == "(" and filterstr[-1] == ")": # rfc4515 syntax filterstr = filterstr[1:-1] # parens added again where used return [] + + def check_credentials(self, username, password): + return self.is_user_in_allowed_groups(username, password) diff --git a/py4web/utils/auth_plugins/oauth2discord.py b/py4web/utils/auth_plugins/oauth2discord.py index 15262fc12..6dafabdeb 100644 --- a/py4web/utils/auth_plugins/oauth2discord.py +++ b/py4web/utils/auth_plugins/oauth2discord.py @@ -22,6 +22,7 @@ class OAuth2Discord(OAuth2): Note that as Discord users have no concept of first/last name, the user in the auth table will contain the Discord username as the first name and discriminator as the last name. """ + name = "oauth2discord" label = "Discord" @@ -35,12 +36,12 @@ class OAuth2Discord(OAuth2): "sso_id": "id", "first_name": "username", "last_name": "discriminator", - "username": "full_username" + "username": "full_username", } def callback(self, query): # since Discord returns username and discriminator separately, we extend the auth plugin's callback # function to merge them into a single field, so it can be mapped into username correctly later data = super().callback(query) - data['full_username'] = f"{data['username']}#{data['discriminator']}" + data["full_username"] = f"{data['username']}#{data['discriminator']}" return data diff --git a/py4web/utils/auth_plugins/oauth2facebook.py b/py4web/utils/auth_plugins/oauth2facebook.py index e2f7cf56d..a3f3c6e46 100644 --- a/py4web/utils/auth_plugins/oauth2facebook.py +++ b/py4web/utils/auth_plugins/oauth2facebook.py @@ -1,3 +1,5 @@ +import requests + from . import OAuth2 diff --git a/py4web/utils/auth_plugins/oauth2github.py b/py4web/utils/auth_plugins/oauth2github.py new file mode 100644 index 000000000..94e3b82ec --- /dev/null +++ b/py4web/utils/auth_plugins/oauth2github.py @@ -0,0 +1,19 @@ +# from https://requests-oauthlib.readthedocs.io/en/latest/examples/github.html + + +from . import OAuth2 + + +class OAuth2Github(OAuth2): + name = "oauth2github" + label = "Github" + + login_url = "https://github.com/login/oauth/authorize" + token_url = "https://github.com/login/oauth/access_token" + userinfo_url = "https://api.github.com/user" + default_scope = None + maps = { + "username": "login", + "email": "email", + "sso_id": "url", + } diff --git a/py4web/utils/auth_plugins/oauth2google_scoped.py b/py4web/utils/auth_plugins/oauth2google_scoped.py new file mode 100644 index 000000000..21e720044 --- /dev/null +++ b/py4web/utils/auth_plugins/oauth2google_scoped.py @@ -0,0 +1,286 @@ +# This is a version of google login that also enables the use of other +# authenticatio scopes (e.g., Google Drive, etc). The credentials for the +# scopes are stored, so that the application can access them and use to +# operate on the scopes (e.g., create files on Google Drive on behalf of +# the user). +# See https://developers.google.com/identity/protocols/oauth2/web-server#python + +import calendar +import json +import re +import time +import uuid + +import google.oauth2.credentials +import google_auth_oauthlib.flow +from google.auth.exceptions import RefreshError +from googleapiclient.discovery import build +from pydal import Field + +from py4web import HTTP, URL, redirect, request, response +from py4web.utils.auth import REGEX_APPJSON, AuthEnforcer + + +class AuthEnforcerGoogleScoped(AuthEnforcer): + """This class catches certain invalid access errors Google generates + when credentials get stale, and forces the user to login again. + Pass it to Auth as param.auth_enfoercer, as in: + auth.param.auth_enforcer = MyAuthEnforcerGoogleScoped(auth, db) + """ + + def __init__(self, auth, db, condition=None, error_page=None): + super().__init__(auth, condition=condition) + self.db = db + self.error_page = error_page + assert ( + error_page is not None + ), "You need to specify an error page; can't use login." + + def on_error(self, context): + if isinstance(context.get("exception"), RefreshError): + del context["exception"] + self._handle_error() + + def _handle_error(self): + # Removes this Google cookie, trying to enforce loggin in again. + response.delete_cookie("G_ENABLED_IDPS") + self.auth.session.clear() + if re.search(REGEX_APPJSON, request.headers.get("accept", "")) and ( + request.headers.get("json-redirects", "") != "on" + ): + raise HTTP(403) + redirect_next = request.fullpath + if request.query_string: + redirect_next = redirect_next + "?{}".format(request.query_string) + self.auth.flash.set("Invalid credentials") + redirect( + URL( + self.error_page, + vars=dict(next=redirect_next), + use_appname=self.auth.param.use_appname_in_redirects, + ) + ) + + def on_request(self, context): + super().on_request(context) + user = self.auth.session.get("user") + user_info = ( + self.db(self.db.auth_credentials.email == user["email"]).select().first() + ) + if not user_info: + self._handle_error() + credentials_dict = json.loads(user_info.credentials) + if not credentials_dict.get("refresh_token"): + print("Missing credentials:", user["email"], credentials_dict) + self._handle_error() + + +class OAuth2GoogleScoped(object): + """Class that enables google login via oauth2 with additional scopes. + The authorization info is saved so the scopes can be used later on. + + NOTE: if you use this plugin, it is also recommended that you set: + + auth.param.auth_enforcer = AuthEnforcerGoogleScoped(auth, error_page="credentials_error") + + and that you create a page at URL("credentials_error") to explain the user + that their credentials have expired, and that they must log in again. + + This because sometimes, when one tries to use the credentials, Google + complains that the refresh action fails due to missing credentials. + This can happen if the user, or Google, has revoked credentials. + We need to catch this error, and log out the user, so the user + can decide whether they want to login (and create credentials) again. + + """ + + # These values are used for the plugin registration. + name = "oauth2googlescoped" + label = "Google Scoped" + callback_url = "auth/plugin/oauth2googlescoped/callback" + + def __init__( + self, + secrets_file=None, + scopes=None, + db=None, + define_tables=True, + delete_credentials_on_logout=True, + ): + """ + Creates an authorization object for Google with Oauth2 and paramters. + + There are some differences between this plugin and other Oauth2 plugins: + - The plugin uses the database, and creates an auth_credentials table to + store the credentials for the scopes requested. + - The plugin relies on some google libraries (see on top), so these + need to be installed. + - The plugin takes in input a .json credentials file that can be + downloaded from Google Cloud when creating the OAuth2 credentials. + Args: + secrets_file: file with secrets for Oauth2. + scopes: scopes desired. + See https://developers.google.com/drive/api/guides/api-specific-auth + and https://developers.google.com/identity/protocols/oauth2/scopes + db: Database handle. + define_tables: Define the tables for storing credentials? + delete_credentials_on_logout: if True, the credentials are cleared + when the user logs out. If False, the app keeps a copy of the + credentials, so it can do work on behalf of the user using + those credentials after logout. This can obviously + generate security concerns. + """ + + # Local secrets to be able to access. + assert secrets_file is not None, "Missing secrets file" + self._secrets_file = secrets_file + # Scopes for which we ask authorization + scopes = scopes or [] + self._scopes = [ + "openid", + "https://www.googleapis.com/auth/userinfo.email", + "https://www.googleapis.com/auth/userinfo.profile", + ] + scopes + self._db = db + if db and define_tables: + self._define_tables() + self._delete_credentials_on_logout = delete_credentials_on_logout + + def _define_tables(self): + self._db.define_table( + "auth_credentials", + [ + Field("email"), + Field("name"), # First and last names, all together. + Field("profile_pic", "text"), # URL of profile pic. + Field( + "credentials", "text" + ), # Credentials for access, stored in Json for generality. + ], + ) + + def handle_request(self, auth, path, get_vars, post_vars): + """Handles the login request or the callback.""" + if path == "login": + auth.session["_next"] = request.query.get("next") or URL("index") + redirect(self._get_login_url(auth)) + elif path == "callback": + self._handle_callback(auth, get_vars) + elif path == "logout": + # Deletes the credentials, and clears the session. + if self._delete_credentials_on_logout: + email = auth.current_user.get("email") if auth.current_user else None + if email is not None: + self._db(self._db.auth_credentials.email == email).delete() + self._db.commit() + auth.session.clear() + next = request.query.get("next") or URL("index") + redirect(next) + else: + raise HTTP(404) + + def _get_login_url(self, auth, state=None): + # Creates a flow. + flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( + self._secrets_file, scopes=self._scopes + ) + # Sets its callback URL. This is the local URL that will be called + # once the user gives permission. + """Returns the URL to which the user is directed.""" + flow.redirect_uri = URL(self.callback_url, scheme=True) + authorization_url, state = flow.authorization_url( + # Enable offline access so that you can refresh an access token without + # re-prompting the user for permission. Recommended for web server apps. + access_type="offline", + # Enable incremental authorization. Recommended as a best practice. + include_granted_scopes="true", + ) + auth.session["oauth2googlescoped:state"] = state + return authorization_url + + def _handle_callback(self, auth, get_vars): + # Builds a flow again, this time with the state in it. + state = auth.session["oauth2googlescoped:state"] + flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( + self._secrets_file, scopes=self._scopes, state=state + ) + flow.redirect_uri = URL(self.callback_url, scheme=True) + # Use the authorization server's response to fetch the OAuth 2.0 tokens. + if state and get_vars.get("state", None) != state: + raise HTTP(401, "Invalid state") + error = get_vars.get("error") + if error: + if isinstance(error, str): + code, msg = 401, error + else: + code = error.get("code", 401) + msg = error.get("message", "Unknown error") + raise HTTP(code, msg) + if "code" not in get_vars: + raise HTTP(401, "Missing code parameter in response.") + code = get_vars.get("code") + flow.fetch_token(code=code) + # We got the credentials! + credentials = flow.credentials + # Now we must use the credentials to check the user identity. + # see https://github.com/googleapis/google-api-python-client/pull/1088/files + # and https://github.com/googleapis/google-api-python-client/issues/1071 + # and ?? + user_info_service = build("oauth2", "v2", credentials=credentials) + user_info = user_info_service.userinfo().get().execute() + email = user_info.get("email") + if email is None: + raise HTTP(401, "Missing email") + # Finally, we store the credentials, so we can re-use them in order + # to use the scopes we requested. + if self._db: + credentials_json = json.dumps(self.credentials_to_dict(credentials)) + self._db.auth_credentials.update_or_insert( + self._db.auth_credentials.email == email, + email=email, + name=user_info.get("name"), + credentials=credentials_json, + profile_pic=user_info.get("picture"), + ) + self._db.commit() + # Logs in the user. + if auth.db: + user = { + "email": user_info.get("email"), + "first_name": user_info.get("given_name"), + "last_name": user_info.get("family_name"), + } + data = auth.get_or_register_user(user) + user["id"] = data.get("id") + else: + # WIP Allow login without DB + user = dict(user_info) + if "id" not in user: + user["id"] = user.get("username") or user.get("email") + # Stores the user in the session. We do it here, so we store + # the complete details, and not just the user_id. + auth.session["user"] = user + auth.session["recent_activity"] = calendar.timegm(time.gmtime()) + auth.session["uuid"] = str(uuid.uuid1()) + # Finally, redirects to next. + if "_next" in auth.session: + next = auth.session.get("_next") + del auth.session["_next"] + else: + next = URL("index") + redirect(next) + + @staticmethod + def credentials_to_dict(credentials): + return { + "token": credentials.token, + "refresh_token": credentials.refresh_token, + "token_uri": credentials.token_uri, + "client_id": credentials.client_id, + "client_secret": credentials.client_secret, + "scopes": credentials._scopes, + } + + @staticmethod + def credentials_from_dict(credentials_dict): + return google.oauth2.credentials.Credentials(**credentials_dict) diff --git a/py4web/utils/auth_plugins/oauth2server.py b/py4web/utils/auth_plugins/oauth2server.py index f4cca3eed..316c6a905 100644 --- a/py4web/utils/auth_plugins/oauth2server.py +++ b/py4web/utils/auth_plugins/oauth2server.py @@ -1,8 +1,9 @@ -import uuid import hashlib +import uuid + import jwt -from py4web.core import request, abort, DAL, Field +from py4web.core import HTTP, Field, request class OAuthServer(object): @@ -47,7 +48,7 @@ def handle_request(self, auth, path, get_vars, post_vars): or not hashlib.sha1(client_secret).hexdigest() == client_id or not db(db.oauth2.client_secret == client_secret).count() ): - abort(404) + raise HTTP(404) info = jwt.decode(code, self.secret + client_id, algorithms=["HS256"]) access_token = jwt.encode(info, self.secret, algorithm="HS256") return dict(access_token=access_token) @@ -56,4 +57,4 @@ def handle_request(self, auth, path, get_vars, post_vars): info = jwt.decode(access_token, self.secret, algorithms=self.algorithms) return info else: - abort(404) + raise HTTP(404) diff --git a/py4web/utils/auth_plugins/oauth2wpminiorange.py b/py4web/utils/auth_plugins/oauth2wpminiorange.py index 8931f6d29..14369df66 100644 --- a/py4web/utils/auth_plugins/oauth2wpminiorange.py +++ b/py4web/utils/auth_plugins/oauth2wpminiorange.py @@ -6,13 +6,14 @@ https://wordpress.org/plugins/miniorange-oauth-20-server """ -from ...core import URL, abort, redirect -from . import OAuth2 - from urllib.parse import urljoin + import jwt import requests +from ...core import HTTP, URL, redirect +from . import OAuth2 + class OAuth2WPMiniorange(OAuth2): """ @@ -43,7 +44,7 @@ class OAuth2WPMiniorange(OAuth2): default_maps = { # "email": "email", "sso_id": "ID", - "username": "username" + "username": "username", # "first_name": "firstname", # "last_name": "lastname", } @@ -80,9 +81,9 @@ def _handle_callback(self, auth, get_vars): except jwt.exceptions.InvalidSignatureError as err: # -# In case of invalid signature jwt library raises InvalidSignatureError # This maybe should be common to all OAuth2 derived classes. - abort(401, err) + raise HTTP(401, err) if not data: - abort(401) + raise HTTP(401) error = data.get("error") if error: if isinstance(error, str): @@ -90,7 +91,7 @@ def _handle_callback(self, auth, get_vars): else: code = error.get("code", 401) msg = error.get("message", "Unknown error") - abort(code, msg) + raise HTTP(code, msg) if auth.db: # map returned fields into auth_user fields user = {} @@ -110,7 +111,7 @@ def _handle_callback(self, auth, get_vars): self.name, sso_id, ) - if not "username" in user: + if "username" not in user: user["username"] = "%s:%s" % ( self.name, sso_id, @@ -125,7 +126,7 @@ def _handle_callback(self, auth, get_vars): else: # WIP Allow login without DB - if not "id" in data: + if "id" not in data: data["id"] = data.get("username") or data.get("email") user_id = data.get("id") auth.store_user_in_session(user_id) diff --git a/py4web/utils/auth_plugins/pam.py b/py4web/utils/auth_plugins/pam.py index aaeb60821..5af9c7112 100644 --- a/py4web/utils/auth_plugins/pam.py +++ b/py4web/utils/auth_plugins/pam.py @@ -1,32 +1,33 @@ +# Modified 2013-2014 Leon Weber : +# See README.md for changelog +# +# Original author: # (c) 2007 Chris AtLee # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license.php """ PAM module for python - Provides an authenticate function that will allow the caller to authenticate a user against the Pluggable Authentication Modules (PAM) on the system. - Implemented using ctypes, so no compilation is necessary. """ -from __future__ import print_function - __all__ = ["authenticate"] -from ctypes import CDLL, POINTER, Structure, CFUNCTYPE, cast, pointer, sizeof -from ctypes import c_void_p, c_uint, c_char_p, c_char, c_int +import sys +from ctypes import (CDLL, CFUNCTYPE, POINTER, Structure, byref, c_char, + c_char_p, c_int, c_uint, c_void_p, cast, sizeof) from ctypes.util import find_library -LIBPAM = CDLL(find_library("pam")) -LIBC = CDLL(find_library("c")) +libpam = CDLL(find_library("pam")) +libc = CDLL(find_library("c")) -CALLOC = LIBC.calloc -CALLOC.restype = c_void_p -CALLOC.argtypes = [c_uint, c_uint] +calloc = libc.calloc +calloc.restype = c_void_p +calloc.argtypes = [c_uint, c_uint] -STRDUP = LIBC.strdup -STRDUP.argstypes = [c_char_p] -STRDUP.restype = POINTER(c_char) # NOT c_char_p !!!! +strdup = libc.strdup +strdup.argstypes = [c_char_p] +strdup.restype = POINTER(c_char) # NOT c_char_p !!!! # Various constants PAM_PROMPT_ECHO_OFF = 1 @@ -34,6 +35,8 @@ PAM_ERROR_MSG = 3 PAM_TEXT_INFO = 4 +PAM_REINITIALIZE_CRED = 0x0008 # This constant is libpam-specific. + class PamHandle(Structure): """wrapper class for pam_handle_t""" @@ -69,7 +72,7 @@ def __repr__(self): return "" % (self.resp_retcode, self.resp) -CONV_FUNC = CFUNCTYPE( +conv_func = CFUNCTYPE( c_int, c_int, POINTER(POINTER(PamMessage)), POINTER(POINTER(PamResponse)), c_void_p ) @@ -77,54 +80,85 @@ def __repr__(self): class PamConv(Structure): """wrapper class for pam_conv structure""" - _fields_ = [("conv", CONV_FUNC), ("appdata_ptr", c_void_p)] + _fields_ = [("conv", conv_func), ("appdata_ptr", c_void_p)] -PAM_START = LIBPAM.pam_start -PAM_START.restype = c_int -PAM_START.argtypes = [c_char_p, c_char_p, POINTER(PamConv), POINTER(PamHandle)] +pam_start = libpam.pam_start +pam_start.restype = c_int +pam_start.argtypes = [c_char_p, c_char_p, POINTER(PamConv), POINTER(PamHandle)] -PAM_AUTHENTICATE = LIBPAM.pam_authenticate -PAM_AUTHENTICATE.restype = c_int -PAM_AUTHENTICATE.argtypes = [PamHandle, c_int] +pam_authenticate = libpam.pam_authenticate +pam_authenticate.restype = c_int +pam_authenticate.argtypes = [PamHandle, c_int] +pam_setcred = libpam.pam_setcred +pam_setcred.restype = c_int +pam_setcred.argtypes = [PamHandle, c_int] -def authenticate(username, password, service="login"): - """Returns True if the given username and password authenticate for the - given service. Returns False otherwise +pam_end = libpam.pam_end +pam_end.restype = c_int +pam_end.argtypes = [PamHandle, c_int] - ``username``: the username to authenticate +def authenticate(username, password, service="login", encoding="utf-8", resetcred=True): + """Returns True if the given username and password authenticate for the + given service. Returns False otherwise. + ``username``: the username to authenticate ``password``: the password in plain text - ``service``: the PAM service to authenticate against. - Defaults to 'login'""" - - @CONV_FUNC + Defaults to 'login' + The above parameters can be strings or bytes. If they are strings, + they will be encoded using the encoding given by: + ``encoding``: the encoding to use for the above parameters if they + are given as strings. Defaults to 'utf-8' + ``resetcred``: Use the pam_setcred() function to + reinitialize the credentials. + Defaults to 'True'. + """ + + if sys.version_info >= (3,): + if isinstance(username, str): + username = username.encode(encoding) + if isinstance(password, str): + password = password.encode(encoding) + if isinstance(service, str): + service = service.encode(encoding) + + @conv_func def my_conv(n_messages, messages, p_response, app_data): """Simple conversation function that responds to any prompt where the echo is off with the supplied password""" # Create an array of n_messages response objects - addr = CALLOC(n_messages, sizeof(PamResponse)) + addr = calloc(n_messages, sizeof(PamResponse)) p_response[0] = cast(addr, POINTER(PamResponse)) for i in range(n_messages): if messages[i].contents.msg_style == PAM_PROMPT_ECHO_OFF: - pw_copy = STRDUP(str(password)) + pw_copy = strdup(password) p_response.contents[i].resp = cast(pw_copy, c_char_p) p_response.contents[i].resp_retcode = 0 return 0 handle = PamHandle() conv = PamConv(my_conv, 0) - retval = PAM_START(service, username, pointer(conv), pointer(handle)) + retval = pam_start(service, username, byref(conv), byref(handle)) if retval != 0: # TODO: This is not an authentication error, something # has gone wrong starting up PAM return False - retval = PAM_AUTHENTICATE(handle, 0) - return retval == 0 + retval = pam_authenticate(handle, 0) + auth_success = retval == 0 + + # Re-initialize credentials (for Kerberos users, etc) + # Don't check return code of pam_setcred(), it shouldn't matter + # if this fails + if auth_success and resetcred: + retval = pam_setcred(handle, PAM_REINITIALIZE_CRED) + + pam_end(handle, retval) + + return auth_success if __name__ == "__main__": diff --git a/py4web/utils/auth_plugins/saml2_plugin.py b/py4web/utils/auth_plugins/saml2_plugin.py index d23a25507..9552290dc 100644 --- a/py4web/utils/auth_plugins/saml2_plugin.py +++ b/py4web/utils/auth_plugins/saml2_plugin.py @@ -5,17 +5,15 @@ THIS FILE IS A WORK IN PROGRESS AND PROBALY DOES NOT WORK """ -from saml2 import BINDING_HTTP_POST -from saml2 import BINDING_HTTP_REDIRECT +from saml2 import BINDING_HTTP_POST, BINDING_HTTP_REDIRECT from saml2.client import Saml2Client -from saml2.config import Config as Saml2Config def obj2dict(obj, processed=None): """ converts any object into a dict, recursively """ - processed = processed if not processed is None else set() + processed = processed if processed is not None else set() if obj is None: return None if isinstance(obj, (int, long, str, unicode, float, bool)): @@ -33,8 +31,8 @@ def obj2dict(obj, processed=None): (key, obj2dict(value, processed)) for key, value in obj.items() if not key.startswith("_") - and not type(value) - in ( + and type(value) + not in ( types.FunctionType, types.LambdaType, types.BuiltinFunctionType, @@ -80,7 +78,7 @@ def saml2_handler(session, request, config_filename=None, entityid=None): unquoted_response, binding, session.saml_outstanding_queries ) res["response"] = data if data else {} - except Exception as e: + except Exception: import traceback res["error"] = traceback.format_exc() diff --git a/py4web/utils/auth_plugins/x509_auth_plugin.py b/py4web/utils/auth_plugins/x509_auth_plugin.py index 07e361966..0a25a6e6f 100644 --- a/py4web/utils/auth_plugins/x509_auth_plugin.py +++ b/py4web/utils/auth_plugins/x509_auth_plugin.py @@ -10,13 +10,12 @@ Ported from web2py - Work in Pogress """ +from functools import reduce + from gluon.globals import current from gluon.storage import Storage -from gluon.http import HTTP, redirect - # requires M2Crypto from M2Crypto import X509 -from functools import reduce class x509Plugin: diff --git a/py4web/utils/cors.py b/py4web/utils/cors.py index 2c2974d65..6ead34227 100644 --- a/py4web/utils/cors.py +++ b/py4web/utils/cors.py @@ -1,15 +1,12 @@ -from py4web.core import Fixture, request, response, HTTP +from py4web.core import HTTP, Fixture, request, response + class CORS(Fixture): """ Fixture helper for sharing web service avoiding cross origin resource sharing problems """ - def __init__(self, - age=86400, - origin="*", - headers="*", - methods="*"): + def __init__(self, age=86400, origin="*", headers="*", methods="*"): Fixture.__init__(self) self.age = age @@ -17,7 +14,7 @@ def __init__(self, self.headers = headers self.methods = methods - def on_request(self): + def on_request(self, context): response.headers["Access-Control-Allow-Origin"] = self.origin response.headers["Access-Control-Max-Age"] = self.age response.headers["Access-Control-Allow-Headers"] = self.headers diff --git a/py4web/utils/dbstore.py b/py4web/utils/dbstore.py index 72f0e14b8..959b1815e 100644 --- a/py4web/utils/dbstore.py +++ b/py4web/utils/dbstore.py @@ -1,12 +1,14 @@ from datetime import datetime, timedelta +from ..core import utcnow + class DBStore: def __init__(self, db, name="py4web_session"): self.__prerequisites__ = [db] Field = db.Field self.db = db - if not name in db.tables: + if name not in db.tables: db.define_table( name, Field("rkey", "string"), @@ -19,20 +21,22 @@ def __init__(self, db, name="py4web_session"): self.table = db[name] def get(self, key): - db, table, now = self.db, self.table, datetime.utcnow() + db, table, now = self.db, self.table, utcnow() row = db(table.rkey == key).select().first() if not row: return None if row.expiration: - row.update_record(expires_on=now + timedelta(row.expiration)) + row.update_record(expires_on=now + timedelta(seconds=row.expiration)) return row.rvalue def set(self, key, value, expiration=None): - db, table, now = self.db, self.table, datetime.utcnow() + db, table, now = self.db, self.table, utcnow() db(table.expires_on < now).delete() row = db(table.rkey == key).select().first() expires_on = ( - now + timedelta(expiration) if expiration else datetime(2999, 12, 31) + now + timedelta(seconds=expiration) + if expiration + else datetime(2999, 12, 31) ) if row: row.update_record( @@ -44,6 +48,6 @@ def set(self, key, value, expiration=None): rvalue=value, expires_on=expires_on, expiration=expiration, - ceated_on=None, + created_on=now, ) db.commit() diff --git a/py4web/utils/downloader.py b/py4web/utils/downloader.py index 970168c6e..8220ba8cc 100644 --- a/py4web/utils/downloader.py +++ b/py4web/utils/downloader.py @@ -1,15 +1,15 @@ import os import re import shutil -import urllib -from bottle import static_file -from py4web import request, HTTP + from pydal.exceptions import NotAuthorizedException, NotFoundException from pydal.helpers.regex import REGEX_UPLOAD_PATTERN +from py4web import HTTP, request +from py4web.core import bottle -def downloader(db, path, filename, download_filename=None): +def downloader(db, path, filename, download_filename=None): """ Given a db, and filesystem path, and the filename of an uploaded file, it retrieves the file, checks permission, and returns or stream its. @@ -34,6 +34,7 @@ def download(filename): fieldname = items.group("field") try: field = db[tablename][fieldname] + path = field.uploadfolder or path # Functionality to handle uploadseparate Field declaration. if field.uploadseparate: @@ -46,8 +47,7 @@ def download(filename): (original_name, stream) = field.retrieve(filename, path, nameonly=True) fullpath = os.path.join(path, filename) if not os.path.exists(fullpath) and hasattr(stream, "read"): - with open(fullpath, "wb") as fp: - shutil.copyfile(fp, stream) + return stream.read() except NotAuthorizedException: raise HTTP(403) except NotFoundException: @@ -58,4 +58,4 @@ def download(filename): download_filename = None elif not download_filename: download_filename = original_name - return static_file(filename, root=path, download=download_filename) + return bottle.static_file(filename, root=path, download=download_filename) diff --git a/py4web/utils/factories.py b/py4web/utils/factories.py index faf436b68..fe11ccf99 100644 --- a/py4web/utils/factories.py +++ b/py4web/utils/factories.py @@ -1,66 +1,72 @@ import copy -import os import json -from functools import wraps + import jwt from yatl.helpers import TAG -from py4web import action, URL, request -from py4web.core import dumps, Session, Fixture + +from py4web import URL, action, request +from py4web.core import Fixture, Session class Inject(Fixture): def __init__(self, **variables): self.variables = variables - def transform(self, output, shared_data=None): + def on_success(self, context): + output = context["output"] if isinstance(output, dict): output.update(**self.variables) - return output class ActionFactory: def __init__(self, *fixtures): self.fixtures = fixtures - def get(self, path=None, template=None): - return self._action_maker("GET", path, template) + def get(self, path=None, template=None, uses=None): + return self._action_maker("GET", path, template, uses) - def post(self, path=None, template=None): - return self._action_maker("POST", path, template) + def post(self, path=None, template=None, uses=None): + return self._action_maker("POST", path, template, uses) - def put(self, path=None, template=None): - return self._action_maker("PUT", path, template) + def put(self, path=None, template=None, uses=None): + return self._action_maker("PUT", path, template, uses) - def delete(self, path=None, template=None): - return self._action_maker("DELETE", path, template) + def delete(self, path=None, template=None, uses=None): + return self._action_maker("DELETE", path, template, uses) - def head(self, path=None, template=None): - return self._action_maker("HEAD", path, template) + def head(self, path=None, template=None, uses=None): + return self._action_maker("HEAD", path, template, uses) def __call__( - self, path=None, template=None, method=["GET", "POST", "PUT", "HEAD", "DELETE"] + self, + path=None, + template=None, + method=["GET", "POST", "PUT", "HEAD", "DELETE"], + uses=None ): - return self._action_maker(method, path, template) + return self._action_maker(method, path, template, uses) - def _action_maker(self, method, path, template): + def _action_maker(self, method, path, template, uses): + uses = uses or [] # handle uses=None def make_action(func, path=path, method=method, template=template): if not path: path = func.__name__ for name in func.__code__.co_varnames[: func.__code__.co_argcount]: path += "/<%s>" % name - fixtures = [f for f in self.fixtures] + fixtures = [*self.fixtures, *uses] if template is None: template = func.__name__ + ".html" if template: - fixtures.append(template) + fixtures.insert(0, template) new_func = action.uses(*fixtures)(func) action(path, method=method)(new_func) return func return make_action - def callback(self, path=None): - return CallbackFactory(path, self.fixtures) + def callback(self, path=None, uses=None): + uses = uses or [] # handle uses=None + return CallbackFactory(path, [*self.fixtures, *uses]) class CallbackFactory: diff --git a/py4web/utils/form.py b/py4web/utils/form.py index 7819f5f43..f90f81483 100644 --- a/py4web/utils/form.py +++ b/py4web/utils/form.py @@ -1,38 +1,44 @@ +import copy import json -import jwt +import os import time import uuid -import copy -import os - -from pydal.objects import FieldVirtual -from py4web import request, response, HTTP -from py4web.utils.param import Param +import jwt from pydal._compat import to_native -from pydal.validators import Validator - +from pydal.objects import FieldVirtual from yatl.helpers import ( - A, - TEXTAREA, - INPUT, - TR, - TD, - TABLE, + CAT, DIV, - LABEL, FORM, - SELECT, + INPUT, + LABEL, OPTION, - P, + SELECT, SPAN, + TEXTAREA, XML, + A, + P, ) +from py4web import HTTP, request, response +from py4web.utils.param import Param + def to_id(field): """get an identified for a field""" - return "%s_%s" % (getattr(field, "_tablename", "no_table"), field.name) + return "%s_%s" % (getattr(field, "_tablename", field.tablename), field.name) + + +def compat_represent(field, value, row): + represent = field.represent + if not represent: + return value or "" + try: + return represent(value, row) + except TypeError: + return represent(value) def get_options(validators): @@ -46,7 +52,7 @@ def get_options(validators): options = item.options break if callable(options): - options = options() + options = options(zero=True) return options @@ -59,7 +65,6 @@ def join_classes(*args): class Widget: - """Prototype widget object for all form widgets""" type_map = { @@ -87,7 +92,7 @@ def __init__(self, input_type="datetime-local"): def make(self, field, value, error, title, placeholder="", readonly=False): return INPUT( - _value=str(value).replace(" ", "T"), + _value=str(value).replace(" ", "T")[:16], _type=self.input_type, _id=to_id(field), _name=field.name, @@ -121,7 +126,7 @@ def make(self, field, value, error, title, placeholder=None, readonly=False): _value="ON", _checked=value, _readonly=readonly, - **attrs + **attrs, ) @@ -166,7 +171,7 @@ def make(self, field, value, error, title, placeholder="", readonly=False): value = list(map(str, value if isinstance(value, list) else [value])) field_options = [ - [k, v, (not k is None and k in value)] + [k, v, (k is not None and k in value)] for k, v in get_options(field.requires) ] option_tags = [ @@ -180,7 +185,7 @@ def make(self, field, value, error, title, placeholder="", readonly=False): _name=field.name, _multiple=multiple, _title=title, - _readonly=readonly + _readonly=readonly, ) return control @@ -188,27 +193,25 @@ def make(self, field, value, error, title, placeholder="", readonly=False): class RadioWidget: def make(self, field, value, error, title, placeholder="", readonly=False): - control = DIV() + control = CAT() field_id = to_id(field) value = list(map(str, value if isinstance(value, list) else [value])) field_options = [ - [k, v, (not k is None and k in value)] + [k, v, (k is not None and k in value)] for k, v in get_options(field.requires) if k != "" ] for k, v, selected in field_options: - control.append( - INPUT( - v, - _id=field_id, - _value=k, - _label=v, - _name=field.name, - _type="radio", - _checked=selected, - ) + _id = "%s-%s" % (field_id, k) + inp = INPUT( + _id=_id, + _value=k, + _label=v, + _name=field.name, + _type="radio", + _checked=selected, ) - control.append(LABEL(v, _for=field_id)) + control.append(LABEL(inp, " ", v)) return control @@ -241,7 +244,9 @@ def make(self, field, value, error, title, placeholder="", readonly=False): control.append(download_div) - control.append(LABEL("Change: ")) + control.append(LABEL("Change: ")) + else: + control.append(LABEL("Upload: ")) control.append(INPUT(_type="file", _id=field_id, _name=field.name)) return control @@ -282,16 +287,20 @@ def __call__( errors, readonly, deletable, - noncreate, + showreadonly, show_id, kwargs=None, ): kwargs = kwargs if kwargs else {} + kwargs["_accept-charset"] = "utf8" form_method = "POST" form_action = request.url.split(":", 1)[1] form_enctype = "multipart/form-data" + if "_method" in kwargs: + form_method = kwargs.pop("_method") + form = FORM( _method=form_method, _action=form_action, _enctype=form_enctype, **kwargs ) @@ -318,44 +327,20 @@ def __call__( form_method=form_method, form_action=form_action, form_enctype=form_enctype, - **kwargs + **kwargs, ) - class_label = self.classes["label"] - class_outer = self.classes["outer"] - class_inner = self.classes["inner"] - class_error = self.classes["error"] - class_info = self.classes["info"] + class_label = self.classes.get("label") or None + class_outer = self.classes.get("outer") or None + class_inner = self.classes.get("inner") or None + class_error = self.classes.get("error") or None + class_info = self.classes.get("info") or None all_fields = [x for x in table] if "_virtual_fields" in dir(table): all_fields += table._virtual_fields for field in all_fields: - - # Reset the json control fields. - field_attributes = dict() - field_value = None - - field_name = field.name - field_type = field.type - field_comment = field.comment if field.comment else "" - field_label = field.label - input_id = "%s_%s" % (field.tablename, field.name) - if isinstance(field, FieldVirtual): - value = None - else: - value = vars.get( - field.name, - field.default() if callable(field.default) else field.default, - ) - error = errors.get(field.name) - field_class = "type-" + field.type.split()[0].replace(":", "-") - placeholder = ( - field._placeholder if "_placeholder" in field.__dict__ else None - ) - - title = field._title if "_title" in field.__dict__ else None - field_disabled = False + is_virtual = isinstance(field, FieldVirtual) # only display field if readable or writable if not field.readable and not field.writable: @@ -366,47 +351,63 @@ def __call__( if not field.readable: continue + # do not display virtual fields in edit forms + if not readonly and is_virtual: + continue + # do not show the id if not desired if field.type == "id" and not show_id: continue # if this is an create form (unkown id) then only show writable fields. - # Some if an edit form was made from a list of fields and noncreate=True - elif not vars.get("id") and noncreate: - if not field.writable: - continue + # Some if an edit form was made from a list of fields and showreadonly=True + elif not showreadonly and not field.writable: + continue # ignore blob fields if field.type == "blob": # never display blobs (mistake?) continue # ignore fields of type id its value is equal to None - if field.type == "id" and value is None: + if field.type == "id" and vars.get(field.name) is None: field.writable = False continue + # Reset the json control fields. + field_attributes = dict() + field_value = None + + field_name = field.name + field_comment = field.comment if field.comment else "" + field_label = field.label + input_id = to_id(field) + default = getattr(field, "default", None) + if callable(default): + default = default() + value = vars.get(field.name, default) if not is_virtual else None + + error = errors.get(field.name) + field_class = "type-" + field.type.split()[0].replace(":", "-") + placeholder = ( + field._placeholder if "_placeholder" in field.__dict__ else None + ) + + title = field._title if "_title" in field.__dict__ else None + field_disabled = False + # if the form is readonly or this is an id type field, display it as readonly - if ( - readonly - or not field.writable - or field.type == "id" - or isinstance(field, FieldVirtual) - ): + if readonly or not field.writable or field.type == "id" or is_virtual: # for boolean readonly we use a readonly checbox if field.type == "boolean": - control = CheckboxWidget().make( field, value, error, title, readonly=True ) # for all othe readonly fields we use represent or a string else: - if isinstance(field, FieldVirtual): + if is_virtual: field_value = field.f(vars) else: - field_value = ( - field.represent and field.represent(value) or value or "" - ) - field_type = "represent" + field_value = compat_represent(field, value, vars) control = DIV(field_value) field_disabled = True @@ -457,9 +458,10 @@ def __call__( if key == "input": key += "[type=%s]" % (control["_type"] or "text") - control["_class"] = join_classes( - control.attributes.get("_class"), self.classes.get(key) - ) + if hasattr(control, "attributes"): + control["_class"] = join_classes( + control.attributes.get("_class"), self.classes.get(key) + ) # Set the form controls. controls["labels"][field_name] = field_label @@ -468,6 +470,8 @@ def __call__( controls["titles"][field_name] = title controls["placeholders"][field_name] = placeholder + field_type = str(field.type).replace(" ", "-") + # Set the remain json field attributes. field_attributes["_title"] = title field_attributes["_label"] = field_label @@ -475,7 +479,7 @@ def __call__( field_attributes["_id"] = to_id(field) field_attributes["_class"] = field_class field_attributes["_name"] = field.name - field_attributes["_type"] = field.type + field_attributes["_type"] = field_type field_attributes["_placeholder"] = placeholder field_attributes["_error"] = error field_attributes["_disabled"] = field_disabled @@ -525,7 +529,6 @@ def __call__( form.append(INPUT(_name="id", _value=vars["id"], _hidden=True)) if deletable: - deletable_record_attributes = dict() deletable_field_name = "_delete" @@ -554,7 +557,7 @@ def __call__( SPAN( controls["delete"], _class=class_inner, - _stye="vertical-align: middle;", + _style="vertical-align: middle;", ), P( deletable_record_attributes["_label"], @@ -604,7 +607,7 @@ def __call__( "inner": "control", "label": "label", "info": "help", - "error": "help is-danger py4web-validation-error", + "error": "help is-danger py4web-validation-error mt-1", "submit": "button is-primary", "input": "input", "input[type=text]": "input", @@ -647,6 +650,53 @@ def __call__( } ) +FormStyleBootstrap5 = FormStyleFactory() +FormStyleBootstrap5.classes.update( + { + "outer": "mb-3 col-auto", # Replaced 'form-group' with 'mb-3' for margin-bottom + "inner": "", + "label": "form-label", # Explicitly use 'form-label' for labels + "info": "form-text", + "error": "form-text text-danger py4web-validation-error", + "submit": "btn btn-primary", + "input": "form-control", + "input[type=text]": "form-control", + "input[type=date]": "form-control", + "input[type=time]": "form-control", + "input[type=datetime-local]": "form-control", + "input[type=radio]": "form-check-input", + "input[type=checkbox]": "form-check-input", + "input[type=submit]": "btn btn-primary", + "input[type=password]": "form-control", + "input[type=file]": "form-control", # Bootstrap 5 doesn't have a specific 'form-control-file' class + "select": "form-select", # 'form-select' is used in Bootstrap 5 instead of 'form-control' for select elements + "textarea": "form-control", + } +) + +FormStyleTailwind = FormStyleFactory() +FormStyleTailwind.classes.update( + { + "outer": "mb-4", + "inner": "w-full flex flex-col space-y-1", + "label": "block text-gray-700 font-medium", + "info": "text-gray-500 text-sm", + "error": "text-red-600 text-sm mt-1", + "submit": "px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition", + "input": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "input[type=text]": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "input[type=date]": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "input[type=time]": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "input[type=datetime-local]": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "input[type=radio]": "form-radio h-5 w-5 text-blue-600", + "input[type=checkbox]": "form-checkbox h-5 w-5 text-blue-600", + "input[type=submit]": "px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition", + "input[type=password]": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "input[type=file]": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm", + "select": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + "textarea": "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500", + } +) # ################################################################ # Form object (replaced SQLFORM) @@ -669,7 +719,7 @@ def index(): :param record: a DAL record or record id :param readonly: set to True to make a readonly form :param deletable: set to False to disallow deletion of record - :param noncreate: make sure when you use a form with a list of fields that does not contain the id field, does not always render the create form. + :param showreadonly: show readonly fields True, False, or None for default behavior) :param formstyle: a function that renders the form using helpers (FormStyleDefault) :param dbio: set to False to prevent any DB writes :param keep_values: if set to true, it remembers the values of the previously submitted form @@ -689,7 +739,7 @@ def __init__( record=None, readonly=False, deletable=True, - noncreate=True, + showreadonly=True, formstyle=FormStyleDefault, dbio=True, keep_values=False, @@ -701,8 +751,8 @@ def __init__( lifespan=None, signing_info=None, submit_value="Submit", - show_id=True, - **kwargs + show_id=False, + **kwargs, ): self.param = Param( formstyle=formstyle, @@ -714,7 +764,7 @@ def __init__( if isinstance(table, list): dbio = False # Mimic a table from a list of fields without calling define_table - form_name = form_name or "none" + form_name = form_name or "no_table" for field in table: field.tablename = getattr(field, "tablename", form_name) @@ -742,7 +792,10 @@ def __init__( self.vars = {} self.errors = {} self.readonly = readonly - self.noncreate = noncreate + # if showreadoanly is None only display readonly fields for edit for or non db based forms + if showreadonly is None: + showreadonly = self.record or isinstance(table, (list, tuple)) + self.showreadonly = showreadonly self.submitted = False self.deleted = False self.accepted = False @@ -751,30 +804,41 @@ def __init__( self.action = None self.kwargs = kwargs if kwargs else {} + self.method = self.kwargs.get("_method", "POST") if self.record: self.vars = self._read_vars_from_record(table) - if not readonly and request.method != "GET": - post_vars = request.POST - form_vars = copy.deepcopy(request.forms) + + if not readonly: + try: + post_vars = request.GET if self.method == "GET" else request.POST + except KeyError: + post_vars = {} + + try: + form_vars = copy.deepcopy(request.forms) + except KeyError: + form_vars = {} for k in form_vars: self.vars[k] = form_vars[k] - self.submitted = True process = False # We only a process a form if it is POST and the formkey matches (correct formname and crsf) # Notice: we never expose the crsf uuid, we only use to sign the form uuid - if request.method == "POST": + if post_vars: + self.submitted = True if not self.csrf_protection or self._verify_form(post_vars): process = True + if process: record_id = self.record and self.record.get("id") if not post_vars.get("_delete"): validated_vars = {} + uploaded_fields = set() uploaded_files = [] for field in self.table: if field.writable and field.type != "id": - original_value = post_vars.getall(field.name) + original_value = post_vars.get(field.name) if isinstance(original_value, list): if len(original_value) == 1: original_value = original_value[0] @@ -793,8 +857,8 @@ def __init__( if field.type == "password" and record_id and value is None: continue if field.type == "upload": + uploaded_fields.add(field.name) value = request.files.get(field.name) - print(str(value)[:100]) delete = post_vars.get("_delete_" + field.name) if value is not None: if field.uploadfolder: @@ -813,24 +877,32 @@ def __init__( validated_vars[field.name] = value if error: self.errors[field.name] = error + if self.errors: + for field_name in uploaded_fields: + validated_vars[field_name] = ( + self.record and self.record.get(field_name) or None + ) self.vars.update(validated_vars) - if validation: - validation(self) if self.record and dbio: self.vars["id"] = self.record.id + if validation: + validation(self) if not self.errors: + """ for file in uploaded_files: - field, value = file - value = field.store( - value.file, value.filename, field.uploadfolder - ) - if value is not None: - validated_vars[field.name] = value + if field.name not in self.vars: + field, value = file + value = field.store( + value.file, value.filename, field.uploadfolder + ) + if value is not None: + self.vars[field.name] = value + """ self.accepted = True - self.vars.update(validated_vars) if dbio: self.update_or_insert(validated_vars) elif dbio: + self.accepted = True self.deleted = True self.record.delete_record() elif self.record: @@ -886,7 +958,7 @@ def _verify_form(self, post_vars): try: jwt.decode(token, key, algorithms=["HS256"]) return True - except: + except Exception: return False def update_or_insert(self, validated_vars): @@ -896,26 +968,27 @@ def update_or_insert(self, validated_vars): # warning, should we really insert if record self.vars["id"] = self.table.insert(**validated_vars) - def clear(self): - self.errors.clear() + def clear(self, vars, errors): + errors.clear() if not self.record and not self.keep_values: - self.vars.clear() + vars.clear() for field in self.table: - self.vars[field.name] = ( + vars[field.name] = ( field.default() if callable(field.default) else field.default ) def helper(self): + vars, errors = copy.copy(self.vars), copy.copy(self.errors) if self.accepted: - self.clear() + self.clear(vars, errors) if not self.cached_helper: helper = self.param.formstyle( self.table, - self.vars, - self.errors, + vars, + errors, self.readonly, self.deletable, - self.noncreate, + self.showreadonly, show_id=self.show_id, kwargs=self.kwargs, ) @@ -924,11 +997,6 @@ def helper(self): button_attributes = item.attributes button_attributes["_label"] = item.children[0] - button_attributes["_type"] = ( - button_attributes.pop("_role") - if "_role" in button_attributes - else None - ) helper["json_controls"]["form_buttons"] += [button_attributes] if self.action: @@ -960,9 +1028,9 @@ def helper(self): helper["form"].append(helper["controls"]["hidden_widgets"][key]) helper["controls"]["begin"] = XML( - "".join( - str(helper["controls"]["begin"]) - + str(helper["controls"]["hidden_widgets"][hidden_field]) + str(helper["controls"]["begin"]) + + "".join( + str(helper["controls"]["hidden_widgets"][hidden_field]) for hidden_field in helper["controls"]["hidden_widgets"] ) ) @@ -981,10 +1049,10 @@ def is_image(value): Args: value: filename """ - - (_, extension) = os.path.splitext(value) - if extension in [".gif", ".png", ".jpg", ".jpeg", ".bmp"]: - return True + if value: + (_, extension) = os.path.splitext(value) + if extension in [".gif", ".png", ".jpg", ".jpeg", ".bmp"]: + return True return False @property diff --git a/py4web/utils/grid.py b/py4web/utils/grid.py index 4de26d67e..709db2687 100644 --- a/py4web/utils/grid.py +++ b/py4web/utils/grid.py @@ -5,31 +5,14 @@ import base64 import copy import datetime -from functools import reduce +import functools from urllib.parse import urlparse -from yatl.helpers import ( - CAT, - DIV, - TABLE, - TBODY, - TR, - TD, - TH, - A, - SPAN, - I, - THEAD, - P, - TAG, - INPUT, - XML, - FORM, - SELECT, - OPTION, -) -from pydal.objects import Field, FieldVirtual -from py4web import request, URL, response, redirect, HTTP +from pydal.objects import Expression, Field, FieldVirtual +from yatl.helpers import (CAT, DIV, FORM, INPUT, OPTION, SELECT, SPAN, TABLE, + TAG, TBODY, TD, TH, THEAD, TR, XML, A, I) + +from py4web import HTTP, URL, redirect, request, safely from py4web.utils.form import Form, FormStyleDefault, join_classes from py4web.utils.param import Param @@ -51,7 +34,6 @@ def safe_int(text, default): class GridClassStyle: - """ Default grid style Internal element names match default class name, other classes can be added @@ -100,61 +82,17 @@ class GridClassStyle: "grid-search-form-table": "grid-search-form-table", "grid-search-form-tr": "grid-search-form-tr", "grid-search-form-td": "grid-search-form-td", + "grid-search-form-input": "grid-search-form-input", + "grid-search-form-select": "grid-search-form-select", "grid-search-boolean": "grid-search-boolean", - } - - styles = { - "grid-wrapper": "", - "grid-header": "display: table; width: 100%;", - "grid-new-button": "margin-top:4px; height:34px; line-height:34px;", - "grid-search": "display: table-cell; float:right;", - "grid-table-wrapper": "overflow-x: auto; width:100%;", - "grid-table": "", - "grid-sorter-icon-up": "", - "grid-sorter-icon-down": "", - "grid-thead": "", - "grid-tr": "", - "grid-th": "white-space: nowrap; vertical-align: middle;", - "grid-td": "white-space: nowrap; vertical-align: middle;", - "grid-td-buttons": "", - "grid-button": "margin-bottom: 0;", - "grid-details-button": "margin-bottom: 0;", - "grid-edit-button": "margin-bottom: 0;", - "grid-delete-button": "margin-bottom: 0;", - "grid-search-button": "height: 34px;", - "grid-clear-button": "height: 34px;", - "grid-footer": "display: table; width:100%;", - "grid-info": "display: table-cell;", - "grid-pagination": "display: table-cell; text-align:right;", - "grid-pagination-button": "min-width: 20px;", - "grid-pagination-button-current": "min-width: 20px; pointer-events:none; opacity: 0.7;", - "grid-cell-type-string": "white-space: nowrap; vertical-align: middle; text-align: left; text-overflow: ellipsis; max-width: 200px;", - "grid-cell-type-text": "vertical-align: middle; text-align: left; text-overflow: ellipsis; max-width: 200px;", - "grid-cell-type-boolean": "white-space: nowrap; vertical-align: middle; text-align: center;", - "grid-cell-type-float": "white-space: nowrap; vertical-align: middle; text-align: right;", - "grid-cell-type-decimal": "white-space: nowrap; vertical-align: middle; text-align: right;", - "grid-cell-type-int": "white-space: nowrap; vertical-align: middle; text-align: right;", - "grid-cell-type-date": "white-space: nowrap; vertical-align: middle; text-align: right;", - "grid-cell-type-time": "white-space: nowrap; vertical-align: middle; text-align: right;", - "grid-cell-type-datetime": "white-space: nowrap; vertical-align: middle; text-align: right;", - "grid-cell-type-upload": "white-space: nowrap; vertical-align: middle; text-align: center;", - "grid-cell-type-list": "white-space: nowrap; vertical-align: middle; text-align: left;", - "grid-cell-type-int": "white-space: nowrap; vertical-align: middle; text-align: right;", - # specific for custom form - "grid-search-form": "", - "grid-search-form-table": "", - "grid-search-form-tr": "border-bottom: none;", - "grid-search-form-td": "", - "grid-search-boolean": "", + "grid-header-element": "grid-header-element info", + "grid-footer-element": "grid-footer-element info", } @classmethod - def get(cls, element): + def get(cls, element, default=None): """returns a dict with _class and _style for the element name""" - return { - "_class": cls.classes.get(element), - "_style": cls.styles.get(element), - } + return cls.classes.get(element, element if default is None else default) class GridClassStyleBulma(GridClassStyle): @@ -202,54 +140,159 @@ class GridClassStyleBulma(GridClassStyle): "grid-search-form-table": "grid-search-form-table", "grid-search-form-tr": "grid-search-form-tr", "grid-search-form-td": "grid-search-form-td pr-1", + "grid-search-form-input": "grid-search-form-input input", + "grid-search-form-select": "grid-search-form-input control select", "grid-search-boolean": "grid-search-boolean", + "grid-header-element": "grid-header-element button", + "grid-footer-element": "grid-footer-element button", } - styles = { - "grid-wrapper": "", - "grid-header": "", - "grid-new-button": "", - "grid-search": "", - "grid-table-wrapper": "", - "grid-table": "", - "grid-sorter-icon-up": "", - "grid-sorter-icon-down": "", + +class GridClassStyleBootstrap5(GridClassStyle): + """The Grid style for Bootstrap 5""" + + classes = { + "grid-wrapper": "grid-wrapper", + "grid-header": "grid-header clearfix pb-2", + "grid-new-button": "grid-new-button btn btn-outline-primary", + "grid-search": "grid-search float-end pb-2", + "grid-table-wrapper": "grid-table-wrapper table-responsive", + "grid-table": "grid-table table table-striped table-hover table-bordered clearfix", + "grid-sorter-icon-up": "grid-sort-icon-up fas fa-sort-up float-end", + "grid-sorter-icon-down": "grid-sort-icon-down fas fa-sort-down float-end", "grid-thead": "", "grid-tr": "", - "grid-th": "text-align: center; text-transform: uppercase; vertical-align: bottom;", - "grid-td": "", + "grid-th": "small", + "grid-td": "small", "grid-td-buttons": "", - "grid-button": "", - "grid-details-button": "", - "grid-edit-button": "", - "grid-delete-button": "", - "grid-search-button": "", - "grid-clear-button": "", - "grid-footer": "padding-top: .5em; padding-bottom: 2em;", - "grid-info": "", - "grid-pagination": "", - "grid-pagination-button": "margin-left: .25em;", - "grid-pagination-button-current": "margin-left: .25em;", - "grid-cell-type-string": "vertical-align: top; text-overflow: ellipsis;", - "grid-cell-type-text": "vertical-align: top; text-overflow: ellipsis;", - "grid-cell-type-boolean": "vertical-align: top; text-align: center", - "grid-cell-type-float": "vertical-align: top; text-align: right", - "grid-cell-type-decimal": "vertical-align: top; text-align: right", - "grid-cell-type-int": "vertical-align: top; text-align: center;", - "grid-cell-type-date": "vertical-align: top; text-align: center;", - "grid-cell-type-time": "vertical-align: top; text-align: center;", - "grid-cell-type-datetime": "vertical-align: top; text-align: center;", - "grid-cell-type-upload": "vertical-align: top; text-align: center;", - "grid-cell-type-list": "vertical-align: top; text-align: left;", - "grid-cell-type-id": "", + "grid-button": "grid-button btn btn-sm btn-outline-secondary", + "grid-details-button": "grid-details-button btn btn-sm btn-outline-secondary", + "grid-edit-button": "grid-edit-button btn btn-sm btn-outline-secondary", + "grid-delete-button": "grid-delete-button btn btn-sm btn-outline-secondary", + "grid-search-button": "grid-search-button btn btn-outline-info", + "grid-clear-button": "grid-clear-button btn btn-outline-info", + "grid-footer": "grid-footer pb-8", + "grid-info": "grid-info float-start", + "grid-pagination": "grid-pagination float-end", + "grid-pagination-button": "grid-pagination-button btn btn-sm btn-outline-primary", + "grid-pagination-button-current": "grid-pagination-button-current btn btn-primary btn-sm", + "grid-cell-type-string": "grid-cell-type-string", + "grid-cell-type-text": "grid-cell-type-text", + "grid-cell-type-boolean": "grid-cell-type-boolean text-center", + "grid-cell-type-float": "grid-cell-type-float", + "grid-cell-type-decimal": "grid-cell-type-decimal", + "grid-cell-type-int": "grid-cell-type-int", + "grid-cell-type-date": "grid-cell-type-date", + "grid-cell-type-time": "grid-cell-type-time", + "grid-cell-type-datetime": "grid-cell-type-datetime", + "grid-cell-type-upload": "grid-cell-type-upload", + "grid-cell-type-list": "grid-cell-type-list", + "grid-cell-type-id": "grid-cell-type-id text-center", # specific for custom form - "grid-search-form": "", - "grid-search-form-table": "", - "grid-search-form-tr": "", - "grid-search-form-td": "", - "grid-search-boolean": "padding-top: .5rem;", + "grid-search-form": "grid-search-form float-end pb-2", + "grid-search-form-table": "grid-search-form-table", + "grid-search-form-tr": "grid-search-form-tr", + "grid-search-form-td": "grid-search-form-td pr-1", + "grid-search-form-input": "grid-search-form-input form-control", + "grid-search-form-select": "grid-search-form-input control select", + "grid-search-boolean": "grid-search-boolean", + "grid-header-element": "grid-header-element btn btn-sm", + "grid-footer-element": "grid-footer-element btn btn-sm", } +class IconStyle: + sort_up = "icon-sort-up" + sort_down = "icon-sort-down" + add_button = "icon-add-button" + details_button = "icon-details-button" + edit_button = "icon-edit-button" + delete_button = "icon-delete-button" + + @classmethod + def complete(self, icontxt: str) -> str: + return icontxt + +class IconStyleFontawsome(IconStyle): + sort_up = "fas fa-sort-up" + sort_down = "fas fa-sort-down" + add_button = "fas fa-plus" + details_button = "fas fa-id-card" + edit_button = "fas fa-edit" + delete_button = "fas fa-trash" + + @classmethod + def complete(self, icontxt: str) -> str: + if "fas " not in icontxt: + return f"fas {icontxt}" + return icontxt + + +class IconStyleBootstrapIcons(IconStyle): + sort_up = "bi bi-sort-up" + sort_down = "bi bi-sort-down" + add_button = "bi bi-plus" + details_button = "bi bi-person-vcard" + edit_button = "bi bi-pencil-square" + delete_button = "bi bi-trash" + + @classmethod + def complete(self, icontxt: str) -> str: + if "bi " not in icontxt: + return f"bi {icontxt}" + return icontxt + +class GridClassStyleTailwind(GridClassStyle): + classes = { + "grid-wrapper": "grid-wrapper space-y-4 bg-white shadow-md rounded-lg p-4", + "grid-header": "grid-header flex justify-between items-center pb-4 border-b border-gray-300", + "grid-new-button": "grid-new-button px-4 py-2 bg-green-500 text-white rounded hover:bg-green-600", + "grid-search": "grid-search flex items-center gap-2", + "grid-table-wrapper": "grid-table-wrapper overflow-x-auto", + "grid-table": "grid-table w-full border-collapse bg-white shadow-md rounded-lg overflow-hidden", + "grid-sorter-icon-up": "grid-sort-icon-up fas fa-sort-up text-gray-600", + "grid-sorter-icon-down": "grid-sort-icon-down fas fa-sort-down text-gray-600", + "grid-thead": "bg-gray-200 text-gray-700", + "grid-tr": "border-b border-gray-300", + "grid-th": "px-4 py-2 text-left font-semibold", + "grid-td": "px-4 py-2 text-gray-700", + "grid-td-buttons": "px-4 py-2 flex gap-2", + "grid-button": "px-3 py-1 bg-blue-500 text-white rounded hover:bg-blue-600 shadow", + "grid-details-button": "px-3 py-1 bg-gray-500 text-white rounded hover:bg-gray-600 shadow", + "grid-edit-button": "px-3 py-1 bg-yellow-500 text-white rounded hover:bg-yellow-600 shadow", + "grid-delete-button": "px-3 py-1 bg-red-500 text-white rounded hover:bg-red-600 shadow", + "grid-search-button": "px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition", + "grid-clear-button": "px-4 py-2 bg-gray-500 text-white rounded hover:bg-gray-600 transition", + "grid-footer": "grid-footer flex justify-between items-center pt-4 border-t border-gray-300", + "grid-info": "grid-info text-gray-600", + "grid-pagination": "grid-pagination flex gap-2", + "grid-pagination-button": "px-3 py-1 bg-gray-200 rounded hover:bg-gray-300", + "grid-pagination-button-current": "px-3 py-1 bg-blue-500 text-white rounded", + + # Cell styling + "grid-cell-type-string": "text-left", + "grid-cell-type-text": "text-left", + "grid-cell-type-boolean": "text-center", + "grid-cell-type-float": "text-right", + "grid-cell-type-decimal": "text-right", + "grid-cell-type-int": "text-right", + "grid-cell-type-date": "text-center", + "grid-cell-type-time": "text-center", + "grid-cell-type-datetime": "text-center", + "grid-cell-type-upload": "text-center", + "grid-cell-type-list": "text-left", + "grid-cell-type-id": "text-center", + + # Search form + "grid-search-form": "flex flex-wrap gap-2 items-center border p-2 rounded-lg bg-gray-100", + "grid-search-form-table": "w-full", + "grid-search-form-tr": "border-b border-gray-300", + "grid-search-form-td": "p-2", + "grid-search-form-input": "px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 w-full", + "grid-search-form-select": "px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 w-full", + "grid-search-boolean": "form-checkbox h-5 w-5 text-blue-600", + "grid-header-element": "px-3 py-1 bg-gray-500 text-white rounded hover:bg-gray-600", + "grid-footer-element": "px-3 py-1 bg-gray-500 text-white rounded hover:bg-gray-600", + } class Column: """class used to represent a column in a grid""" @@ -258,73 +301,63 @@ def __init__( self, name, represent, - required_fields=None, + key=None, + required_fields=None, # must be a list or none orderby=None, + col_type="string", td_class_style=None, ): self.name = name self.represent = represent self.orderby = orderby - self.required_fields = [] - if required_fields: - if isinstance(required_fields, list): - self.required_fields = required_fields - else: - self.required_fields = [required_fields] - + self.required_fields = required_fields or [] + self.key = key + self.type = (col_type,) self.td_class_style = td_class_style - def render(self, row, index=None): - """renders a row al position index (optional)""" - return self.represent(row) - class Grid: - FORMATTERS_BY_TYPE = { - "boolean": lambda value: INPUT( - _type="checkbox", _checked=value, _disabled="disabled" - ) - if value - else "", - "datetime": lambda value: XML( - "" - % ( - value.year, - value.month - 1, - value.day, - value.hour, - value.minute, - value.second, + "NoneType": lambda value: "", + "bool": lambda value: "☑" if value else "☐" if value is False else "", + "float": lambda value: "%.2f" % value, + "double": lambda value: "%.2f" % value, + "datetime": lambda value: ( + XML( + "" + % ( + value.year, + value.month - 1, + value.day, + value.hour, + value.minute, + value.second, + ) ) - ) - if value and isinstance(value, datetime.datetime) - else value - if value - else "", - "time": lambda value: XML( - "" - % (value.hour, value.minute, value.second) - ) - if value and isinstance(value, datetime.time) - else value - if value - else "", - "date": lambda value: XML( - '' - % ( - value.year, - value.month - 1, - value.day, + if value and isinstance(value, datetime.datetime) + else (value or "") + ), + "time": lambda value: ( + XML( + "" + % (value.hour, value.minute, value.second) ) - ) - if value and isinstance(value, datetime.date) - else value - if value - else "", - "list:string": lambda value: ", ".join(str(x) for x in value) if value else "", - "list:integer": lambda value: ", ".join(x for x in value) if value else "", - "default": lambda value: str(value) if value is not None else "", + if value and isinstance(value, datetime.time) + else (value or "") + ), + "date": lambda value: ( + XML( + '' + % ( + value.year, + value.month - 1, + value.day, + ) + ) + if value and isinstance(value, datetime.date) + else (value or "") + ), + "list": lambda value: ", ".join(x for x in value) or "", } def __init__( @@ -344,6 +377,7 @@ def __init__( editable=True, deletable=True, validation=None, + required_fields=None, pre_action_buttons=None, post_action_buttons=None, auto_process=True, @@ -352,9 +386,12 @@ def __init__( search_button_text="Filter", formstyle=FormStyleDefault, grid_class_style=GridClassStyle, + icon_style=IconStyleFontawsome, T=lambda text: text, + groupby=None, # deprecated fields=None, + form_maker=Form, ): """ Grid is a searchable/sortable/pageable grid @@ -381,14 +418,27 @@ def __init__( responsible for calling process(). :param T: optional pluralize object """ + if path in (None, "", "index"): + fullpath = request.fullpath.rstrip("/") + if path == "index": + fullpath = fullpath[:-6] + redirect( + f"{fullpath}/select" + + (f"?{request.query_string}" if request.query_string else "") + ) - # in case the query is a Table instead + # in case the query is a Table insteance if isinstance(query, query._db.Table): query = query._id != None - self.path = path or "" + if fields and any(field.type == "id" for field in fields): + show_id = True + + self.path = path self.db = query._db self.T = T + self.form_maker = form_maker + self.icon_style = icon_style self.param = Param( query=query, columns=columns or fields, @@ -396,6 +446,7 @@ def __init__( show_id=show_id, orderby=orderby, left=left, + groupby=groupby, search_form=search_form, search_queries=search_queries, headings=headings or [], @@ -421,42 +472,66 @@ def __init__( edit_submit_value=None, edit_action_button_text="Edit", delete_action_button_text="Delete", + header_elements=None, + footer_elements=None, + required_fields=required_fields or [], ) # instance variables that will be computed self.action = None self.current_page_number = None - self.endpoint = request.fullpath - if self.path: - self.endpoint = self.endpoint[: -len(self.path)].rstrip("/") + self.endpoint = request.fullpath[: -len(self.path)].rstrip("/") self.hidden_fields = None self.form = None self.number_of_pages = None self.page_end = None self.page_start = None - self.query_parms = request.params + self.query_parms = safely(lambda: request.params, default={}) self.record_id = None self.rows = None self.tablename = None self.total_number_of_rows = None - self.use_tablename = self.is_join() - self.formatters = {} self.formatters_by_type = copy.copy(Grid.FORMATTERS_BY_TYPE) self.attributes_plugin = AttributesPlugin(request) if auto_process: self.process() + def is_creatable(self): + if self.param.groupby: + return False + if callable(self.param.create): + return self.param.create() + return self.param.create + def is_editable(self, row): + if self.param.groupby: + return False if callable(self.param.editable): return self.param.editable(row) return self.param.editable + def is_readable(self, row): + if callable(self.param.details): + return self.param.details(row) + return self.param.details + def is_deletable(self, row): + # cannot delete a record that does not exist + if row is None: + return False + # cannot delete if the a record is grouped + if self.param.groupby: + return False + # if deletable is callable, call it if callable(self.param.deletable): return self.param.deletable(row) + # if deletable is boolean, check it return self.param.deletable + def get_style(self, element, default=None): + return self.param.grid_class_style.get(element, default) + def process(self): query = None db = self.db @@ -467,7 +542,7 @@ def process(self): query_lambda = self.param.search_queries[search_type][1] try: query = query_lambda(search_string) - except: + except Exception: pass # flash a message here if not query: @@ -477,6 +552,7 @@ def process(self): parts = self.path.split("/") self.action = parts[0] or "select" + if self.param.field_id: self.tablename = str(self.param.field_id._table) else: @@ -486,41 +562,82 @@ def process(self): self.record_id = safe_int(parts[1] if len(parts) > 1 else None, default=None) table = db[self.tablename] + # if no column specified use all fields if not self.param.columns: - # if no column specified use all fields self.param.columns = [field for field in table if field.readable] - self.needed_fields = self.param.columns[:] - elif any(isinstance(col, Column) for col in self.param.columns): - # if we use columns we have to get all fields and assume a single table - self.needed_fields = [field for field in db[self.tablename]] - for col in self.param.columns: - if isinstance(col, Column): - for rf in col.required_fields: - if rf.longname not in [x.longname for x in self.needed_fields]: - self.needed_fields.append(rf) - elif any(isinstance(col, FieldVirtual) for col in self.param.columns): - # if virtual fields are specified the fields may come from a join - needed_fields = set() - for col in self.param.columns: - if isinstance(col, Field): - needed_fields.add(col) - elif isinstance(col, FieldVirtual): - for field in db[col.tablename]: - needed_fields.add(field) - self.needed_fields = list(needed_fields) - else: - self.needed_fields = self.param.columns[:] - - # make sure all specified fields are available - if self.param.columns: - for col in self.param.columns: - if not isinstance(col, (Column, FieldVirtual)): - if col.longname not in [x.longname for x in self.needed_fields]: - self.needed_fields.append(col) + # convert to column object + self.columns = [] + + def title(col): + return str(col).replace('"', "") + + def col2key(col): + return str(col).lower().replace(".", "-") + + for index, col in enumerate(self.param.columns): + if isinstance(col, Column): + if not col.key: + col.key = f"column-{index}" + self.columns.append(col) + + elif isinstance(col, Field): + + def compute(row, col=col): + value = row(str(col)) + if col.represent: + value = col.represent(value, row) + # deal with download links in special manner if no representation + if col.type == "upload" and value and hasattr(col, "download_url"): + value = A("download", _href=col.download_url(value)) + return value + + self.columns.append( + Column( + col.label, + compute, + orderby=col, + required_fields=[col], + key=col2key(col), + col_type=col.type, + ) + ) + elif isinstance(col, FieldVirtual): + + def compute(row, col=col): + return col.f(row) if "id" in row else col.f(row[col.tablename]) + + self.columns.append( + Column( + col.label, + compute, + orderby=None, + required_fields=db[col.tablename], + key=col2key(col), + ) + ) + elif isinstance(col, Expression): + + def compute(row, name=str(col)): + return row._extra(name) + + self.columns.append( + Column( + title(col), + compute, + orderby=None, + required_fields=[col], + key=f"column-{index}", + ) + ) + else: + raise RuntimeError(f"Column not support {col}") - # except the primary key may be missing and must be fetched even if not displayed - if not any(col.name == table._id.name for col in self.needed_fields): - self.needed_fields.insert(0, table._id) + # join the set of all required fields + sets = [set(self.param.required_fields or [])] + sets += [set(col.required_fields) for col in self.columns] + self.needed_fields = list( + functools.reduce(lambda a, b: a | b, sets) | set([table._id]) + ) self.referrer = None @@ -536,16 +653,37 @@ def process(self): else: record = None - if self.action in ["new", "details", "edit"]: + # ensure the user has access for new/details/edit/delete if chosen + if self.action == "new" and not self.is_creatable(): + raise HTTP( + 403, + f"You do not have access to create a record in the {self.tablename} table.", + ) + if self.action == "details" and not self.is_readable(record): + raise HTTP( + 403, + f"You do not have access to read a record from the {self.tablename} table.", + ) + if self.action == "edit" and not self.is_editable(record): + raise HTTP( + 403, + f"You do not have access to edit a record in the {self.tablename} table.", + ) + if self.action == "delete" and not self.is_deletable(record): + raise HTTP( + 403, + f"You do not have access to delete a record in the {self.tablename} table.", + ) + if self.action in ["new", "details", "edit"]: readonly = self.action == "details" attrs = self.attributes_plugin.form(url=request.url.split(":", 1)[1]) - self.form = Form( + self.form = self.form_maker( table, record=record, readonly=readonly, - deletable=self.param.deletable, + deletable=self.is_deletable(record), formstyle=self.param.formstyle, validation=self.param.validation, show_id=self.param.show_id, @@ -556,7 +694,7 @@ def process(self): self.form.param.sidecar.append(self.param.new_sidecar) if self.param.new_submit_value: self.form.param.submit_value = self.param.new_submit_value - if self.action == "details": + if self.action == "details" and self.is_readable(record): if self.param.details_sidecar: self.form.param.sidecar.append(self.param.details_sidecar) if self.param.details_submit_value: @@ -576,55 +714,48 @@ def process(self): redirect(self.endpoint) elif self.action == "delete" and self.is_deletable(record): - db(db[self.tablename].id == self.record_id).delete() + db(db[self.tablename]._id == self.record_id).delete() - url = parse_referer(request) - if url and url.query: - self.endpoint += "?%s" % url.query - redirect(self.endpoint) + referrer = parse_referer(request) + url = self.endpoint + "/select" + if referrer and referrer.query: + url += "?%s" % referrer.query + redirect(url) elif self.action == "select": self.referrer = "_referrer=%s" % base64.b16encode( request.url.encode("utf8") ).decode("utf8") - # find the primary key of the primary table - pt = db[self.tablename] - key_is_missing = True - for field in self.param.columns: - if ( - isinstance(field, Field) - and field.table._tablename == pt._tablename - and field.name == pt._id.name - ): - key_is_missing = False - if key_is_missing: - # primary key wasn't included, add it and set show_id to False so it doesn't display - self.param.columns.append(pt._id) - self.param.show_id = False - self.current_page_number = safe_int(request.query.get("page"), default=1) select_params = dict() # try getting sort order from the request - sort_order = request.query.get("orderby", "") + sort_order = request.query.get("orderby") - try: + select_params["orderby"] = self.param.orderby + if sort_order: parts = sort_order.lstrip("~").split(".") - orderby = db[parts[0]][parts[1]] - if sort_order.startswith("~"): - orderby = ~orderby - select_params["orderby"] = orderby - except (IndexError, KeyError, TypeError, AttributeError): - select_params["orderby"] = self.param.orderby + if ( + len(parts) == 2 + and parts[0] in db.tables + and parts[1] in db[parts[0]] + ): + orderby = db[parts[0]][parts[1]] + if sort_order.startswith("~"): + orderby = ~orderby + select_params["orderby"] = orderby if self.param.left: select_params["left"] = self.param.left - if self.param.left: - # TODO: maybe this can be made more efficient + if self.param.groupby: + select_params["groupby"] = self.param.groupby + + if self.param.groupby or self.param.left: + # need groupby fields in select to get proper count self.total_number_of_rows = len( - db(query).select(db[self.tablename].id, **select_params) + db(query).select(db[self.tablename]._id, **select_params) ) else: self.total_number_of_rows = db(query).count() @@ -661,8 +792,14 @@ def process(self): or self.param.deletable or self.param.post_action_buttons ): - self.param.columns.append( - Column("", self.make_action_buttons, td_class_style="grid-td-buttons") + key = f"column-{len(self.columns)}" + self.columns.append( + Column( + "", + self.make_action_buttons, + key=key, + td_class_style=self.get_style("grid-td-buttons"), + ) ) def iter_pages( @@ -697,49 +834,32 @@ def _make_action_button( url, button_text, icon, - icon_size="small", + icon_size="small", # deprecated additional_classes=None, - additional_styles=None, override_classes=None, - override_styles=None, message=None, - onclick=None, + onclick=None, # deprecated row_id=None, name="grid-button", row=None, ignore_attribute_plugin=False, **attrs, ): - separator = "?" if row_id: url += "/%s" % row_id - classes = self.param.grid_class_style.classes.get(name, "") - styles = self.param.grid_class_style.styles.get(name, "") - - def join_style(items): - return "".join(items) if isinstance(items, (list, tuple)) else " %s" % items + classes = self.get_style(name) if callable(additional_classes): additional_classes = additional_classes(row) - if callable(additional_styles): - additional_styles = additional_styles(row) - if callable(override_classes): override_classes = override_classes(row) - if callable(override_styles): - override_styles = override_styles(row) - if override_classes: classes = join_classes(override_classes) elif additional_classes: classes = join_classes(classes, additional_classes) - if override_styles: - styles = join_style(override_styles) - elif additional_styles: - styles += join_style(additional_styles) if callable(url): url = url(row) @@ -750,21 +870,30 @@ def join_style(items): attrs.update(self.attributes_plugin.link(url=url)) link = A( - I(_class="fa %s" % icon), + I(_class=self.icon_style.complete(icon)), _role="button", - _class=classes, _message=message, _title=button_text, - _style=styles, + _class=classes, **attrs, ) if self.param.include_action_button_text: link.append( - SPAN(XML(" "), button_text, _class="grid-action-button-text") + SPAN( + XML(" "), + button_text, + _class=self.get_style("grid-action-button-text"), + ) ) return link + def reformat(self, value): + type_name = type(value).__name__ + if type_name in self.formatters_by_type: + return self.formatters_by_type[type_name](value) + return value + def _make_default_form(self): search_type = safe_int(request.query.get("search_type", 0), default=0) search_string = request.query.get("search_string") @@ -775,51 +904,51 @@ def _make_default_form(self): hidden_fields = [ INPUT(_name=key, _value=request.query.get(key), _type="hidden") for key in request.query - if not key in ("search_type", "search_string") + if key not in ("search_type", "search_string") ] attrs = self.attributes_plugin.link(url=self.endpoint) form = FORM(*hidden_fields, **attrs) - select = SELECT( - *options, - **dict( - _name="search_type", - ), - ) + classes = self.get_style("grid-search-form-select") + select = SELECT(*options, **dict(_name="search_type", _class=classes)) + classes = self.get_style("grid-search-form-input") input = INPUT( _type="text", _name="search_string", _value=search_string, + _class=classes, ) - sc = self.param.grid_class_style.get("grid-search-button") - submit = INPUT(_type="submit", _value=self.T("Search"), **sc) + classes = self.get_style("grid-search-button") + submit = INPUT(_type="submit", _value=self.T("Search"), _class=classes) clear_script = "document.querySelector('[name=search_string]').value='';" - sc = self.param.grid_class_style.get("grid-clear-button") + classes = self.get_style("grid-clear-button") clear = INPUT( - _type="submit", _value=self.T("Clear"), _onclick=clear_script, **sc + _type="submit", + _value=self.T("Clear"), + _onclick=clear_script, + _class=classes, ) - div = DIV(_id="grid-search", **self.param.grid_class_style.get("grid-search")) + div = DIV(_id="grid-search", _classes=self.get_style("grid-search")) - sc = self.param.grid_class_style.get("grid-search-form-tr") - tr = TR(**sc) - sc = self.param.grid_class_style.get("grid-search-form-td") + tr = TR(_class=self.get_style("grid-search-form-tr")) + classes = self.get_style("grid-search-form-td") if len(options) > 1: - tr.append(TD(select, **sc)) - tr.append(TD(input, **sc)) - tr.append(TD(submit, clear, **sc)) - sc = self.param.grid_class_style.get("grid-search-form-table") - form.append(TABLE(tr, **sc)) + tr.append(TD(select, _class=classes)) + tr.append(TD(input, _class=classes)) + tr.append(TD(submit, clear, _class=classes)) + classes = self.get_style("grid-search-form-table") + form.append(TABLE(tr, _class=classes)) div.append(form) return div def _make_search_form(self): # TODO: Do we need this? - div = DIV(_id="grid-search", **self.param.grid_class_style.get("grid-search")) + div = DIV(_id="grid-search", _class=self.get_style("grid-search")) div.append(self.param.search_form.custom["begin"]) - tr = TR(**self.param.grid_class_style.get("grid-search-form-tr")) + tr = TR(_class=self.get_style("grid-search-form-tr")) for field in self.param.search_form.table: - td = TD(**self.param.grid_class_style.get("grid-search-form-td")) + td = TD(_class=self.get_style("grid-search-form-td")) if field.type == "boolean": - sb = DIV(**self.param.grid_class_style.get("grid-search-boolean")) + sb = DIV(_class=self.get_style("grid-search-boolean")) sb.append(self.param.search_form.custom["widgets"][field.name]) sb.append(field.label) td.append(sb) @@ -829,12 +958,7 @@ def _make_search_form(self): field.name in self.param.search_form.custom["errors"] and self.param.search_form.custom["errors"][field.name] ): - td.append( - DIV( - self.param.search_form.custom["errors"][field.name], - _style="color:#ff0000", - ) - ) + td.append(DIV(self.param.search_form.custom["errors"][field.name])) tr.append(td) if self.param.search_button_text: tr.append( @@ -844,21 +968,22 @@ def _make_search_form(self): _type="submit", _value=self.T(self.param.search_button_text), ), - **self.param.grid_class_style.get("grid-search-form-td"), + _class=self.get_style("grid-search-form-td"), ) ) else: tr.append( TD( self.param.search_form.custom["submit"], - **self.param.grid_class_style.get("grid-search-form-td"), + _class=self.get_style("grid-search-form-td"), ) ) - div.append( - TABLE(tr, **self.param.grid_class_style.get("grid-search-form-table")) - ) + div.append(TABLE(tr, _class=self.get_style("grid-search-form-table"))) for hidden_widget in self.param.search_form.custom["hidden_widgets"].keys(): - div.append(self.param.search_form.custom["hidden_widgets"][hidden_widget]) + if hidden_widget not in ("formname", "formkey"): + div.append( + self.param.search_form.custom["hidden_widgets"][hidden_widget] + ) div.append(self.param.search_form.custom["end"]) @@ -867,167 +992,84 @@ def _make_search_form(self): def _make_table_header(self): sort_order = request.query.get("orderby", "") - thead = THEAD(_class=self.param.grid_class_style.classes.get("grid-thead", "")) - for index, column in enumerate(self.param.columns): - col = None - if isinstance(column, (Field, FieldVirtual)): - field = column - if field.readable and (field.type != "id" or self.param.show_id): - key, col = self._make_field_header(column, index, sort_order) - elif isinstance(column, Column): - key = column.name.lower().replace(" ", "-") - col = column.name - if column.orderby: - key, col = self._make_field_header(column, index, sort_order) - else: - raise RuntimeError("Invalid Grid Column type") - if col is not None: - classes = join_classes( - self.param.grid_class_style.classes.get("grid-th"), - "grid-col-%s" % key, - ) - style = self.param.grid_class_style.styles.get("grid-th") - thead.append(TH(col, _class=classes, _style=style)) + thead = THEAD(_class=self.get_style("grid-thead")) + for index, col in enumerate(self.columns): + col_header = self._make_col_header(col, index, sort_order) + classes = join_classes( + self.get_style("grid-th"), + "grid-col-%s" % col.key, + ) + thead.append(TH(col_header, _class=classes)) return thead - def _make_field_header(self, field, field_index, sort_order): - up = I(**self.param.grid_class_style.get("grid-sorter-icon-up")) - dw = I(**self.param.grid_class_style.get("grid-sorter-icon-down")) + def _make_col_header(self, col, index, sort_order): + up = I( + _class=join_classes( + self.get_style("grid-sorter-icon-up"), self.icon_style.sort_up + ) + ) + dw = I( + _class=join_classes( + self.get_style("grid-sorter-icon-down"), self.icon_style.sort_down + ) + ) - if isinstance(field, Column): - key = str(field.orderby) - else: - key = "%s.%s" % (field.tablename, field.name) + orderby = col.orderby and str(col.orderby) heading = ( - self.param.headings[field_index] - if field_index < len(self.param.headings) - else field.label - if "label" in field.__dict__ - else field.name + self.param.headings[index] if index < len(self.param.headings) else col.name ) - heading = title(heading) # add the sort order query parm sort_query_parms = dict(self.query_parms) attrs = {} - if isinstance(field, FieldVirtual): - col = SPAN(heading) - elif key == sort_order: - sort_query_parms["orderby"] = "~" + key - url = URL(self.endpoint, vars=sort_query_parms) - attrs = self.attributes_plugin.link(url=url) - col = A(heading, up, **attrs) - else: - sort_query_parms["orderby"] = key - url = URL(self.endpoint, vars=sort_query_parms) - attrs = self.attributes_plugin.link(url=url) - col = A(heading, dw if "~" + key == sort_order else "", **attrs) - return key, col - - def _make_field(self, row, field, field_index): - """ - Render a field - - if only 1 table in the query, the no table name needed when getting the row value - however, if there - are multiple tables in the query (self.use_tablename == True) then we need to use the tablename as well - when accessing the value in the row object - - the row object sent in can take - :param row: - :param field: - :return: - """ - if isinstance(field, FieldVirtual): - # handle virtual fields in table display - if self.use_tablename: - field_value = field.f(row[field.tablename]) + if orderby: + if orderby == sort_order: + sort_query_parms["orderby"] = "~" + orderby + url = URL(self.endpoint, "select", vars=sort_query_parms) + attrs = self.attributes_plugin.link(url=url) + col_header = A(heading, up, **attrs) else: - field_value = field.f(row) - elif self.use_tablename: - field_value = ( - field.represent(row[field.tablename][field.name]) - if field.represent - else row[field.tablename][field.name] - ) + sort_query_parms["orderby"] = orderby + url = URL(self.endpoint, "select", vars=sort_query_parms) + attrs = self.attributes_plugin.link(url=url) + col_header = A( + heading, dw if "~" + orderby == sort_order else "", **attrs + ) else: - field_value = ( - field.represent(row[field.name]) if field.represent else row[field.name] - ) - key = "%s.%s" % (field.tablename, field.name) - formatter = ( - self.formatters.get(key) - or self.formatters_by_type.get(field.type) - or self.formatters_by_type.get("default") - ) - - class_type = "grid-cell-type-%s" % str(field.type).split(":")[0].split("(")[0] - class_col = " grid-col-%s" % key.replace(".", "_") - classes = join_classes( - self.param.grid_class_style.classes.get("grid-td"), - self.param.grid_class_style.classes.get(class_type), - class_col, - ) - td = TD( - formatter(field_value) - if formatter.__code__.co_argcount == 1 # if formatter has only 1 argument - else formatter(field_value, row), - _class=classes, - _style=( - self.param.grid_class_style.styles.get(class_type) - or self.param.grid_class_style.styles.get("grid-td") - ), - ) - - return td + col_header = heading + return col_header def _make_table_body(self): tbody = TBODY() - for row in self.rows: + for index, row in enumerate(self.rows): # find the row id - there may be nested tables.... - if self.use_tablename and self.tablename in row and "id" not in row: - row_id = row[self.tablename]["id"] - else: - row_id = row["id"] - self.use_tablename = False - key = "%s.%s" % (self.tablename, "__row") - if self.formatters.get(key): - extra_class = self.formatters.get(key)(row)["_class"] - extra_style = self.formatters.get(key)(row)["_style"] - else: - extra_class = "" - extra_style = "" tr = TR( _role="row", - _class=join_classes( - self.param.grid_class_style.classes.get("grid-tr"), extra_class - ), - _style=join_classes( - self.param.grid_class_style.styles.get("grid-tr"), extra_style - ), + _class=self.get_style("grid-tr"), ) + # add all the fields to the row - for index, column in enumerate(self.param.columns): - if isinstance(column, (Field, FieldVirtual)): - field = column - if field.readable and (field.type != "id" or self.param.show_id): - tr.append(self._make_field(row, field, index)) - elif isinstance(column, Column): - classes = self.param.grid_class_style.classes.get( - column.td_class_style, - self.param.grid_class_style.classes.get("grid-td"), - ) - style = self.param.grid_class_style.styles.get( - column.td_class_style, - self.param.grid_class_style.styles.get("grid-td"), - ) - tr.append( - TD(column.render(row, index), _class=classes, _style=style) - ) + for col in self.columns: + classes = join_classes( + [ + self.get_style( + col.td_class_style, + ( + col.td_class_style(row) + if callable(col.td_class_style) + else self.get_style("grid-td") + ), + ), + f"grid-cell-{col.key}", + ] + ) + value = col.represent(row) + reformatted_value = self.reformat(value) + tr.append(TD(reformatted_value, _class=classes)) - td = None tbody.append(tr) return tbody @@ -1041,26 +1083,37 @@ def make_action_buttons(self, row): # a button can be a callable, to indicate whether or not a button should # be displayed. call the function with the row object btn = btn(row) - if btn == None: + if btn is None: # if None was returned, no button is available for this row: ignore this value in the # list continue + attrs = ( + self.attributes_plugin.confirm(message=self.T(btn.message)) + if btn.message and btn.message != "" + else btn.__dict__.get("attrs", dict()) + ) + cat.append( self._make_action_button( url=btn.url, button_text=self.T(btn.text), icon=btn.icon, additional_classes=btn.additional_classes, + override_classes=btn.__dict__.get("override_classes"), message=btn.message, row_id=row_id if btn.append_id else None, + name=btn.__dict__.get("name"), row=row, - ignore_attribute_plugin=btn.ignore_attribute_plugin - if "ignore_attribute_plugin" in btn.__dict__ - else False, + ignore_attribute_plugin=( + btn.ignore_attribute_plugin + if "ignore_attribute_plugin" in btn.__dict__ + else False + ), + **attrs, ) ) - if self.param.details: + if self.is_readable(row): if isinstance(self.param.details, str): details_url = self.param.details else: @@ -1070,11 +1123,11 @@ def make_action_buttons(self, row): self._make_action_button( url=details_url, button_text=self.T(self.param.details_action_button_text), - icon="fa-id-card", + icon=self.icon_style.details_button, name="grid-details-button", ) ) - if self.param.editable: + if self.is_editable(row): if isinstance(self.param.editable, str): edit_url = self.param.editable else: @@ -1084,12 +1137,12 @@ def make_action_buttons(self, row): self._make_action_button( url=edit_url, button_text=self.T(self.param.edit_action_button_text), - icon="fa-edit", + icon=self.icon_style.edit_button, name="grid-edit-button", _disabled=not self.is_editable(row), ) ) - if self.param.deletable: + if self.is_deletable(row): if isinstance(self.param.deletable, str): delete_url = self.param.deletable else: @@ -1102,7 +1155,7 @@ def make_action_buttons(self, row): self._make_action_button( url=delete_url, button_text=self.T(self.param.delete_action_button_text), - icon="fa-trash", + icon=self.icon_style.delete_button, additional_classes="confirmation", message="Delete record", name="grid-delete-button", @@ -1117,29 +1170,39 @@ def make_action_buttons(self, row): # a button can be a callable, to indicate whether or not a button should # be displayed. call the function with the row object btn = btn(row) - if btn == None: + if btn is None: # if None was returned, no button is available for this row: ignore this value in the # list continue + attrs = ( + self.attributes_plugin.confirm(message=self.T(btn.message)) + if btn.message and btn.message != "" + else btn.__dict__.get("attrs", dict()) + ) cat.append( self._make_action_button( url=btn.url, button_text=self.T(btn.text), icon=btn.icon, additional_classes=btn.additional_classes, + override_classes=btn.__dict__.get("override_classes"), message=btn.message, row_id=row_id if btn.append_id else None, + name=btn.__dict__.get("name"), row=row, - ignore_attribute_plugin=btn.ignore_attribute_plugin - if "ignore_attribute_plugin" in btn.__dict__ - else False, + ignore_attribute_plugin=( + btn.ignore_attribute_plugin + if "ignore_attribute_plugin" in btn.__dict__ + else False + ), + **attrs, ) ) return cat def _make_table_pager(self): - pager = DIV(**self.param.grid_class_style.get("grid-pagination")) + pager = DIV(_class=self.get_style("grid-pagination")) previous_page_number = None for page_number in self.iter_pages( self.current_page_number, self.number_of_pages @@ -1148,7 +1211,7 @@ def _make_table_pager(self): pager_query_parms["page"] = page_number # if there is a gat add a spacer if previous_page_number and page_number - previous_page_number > 1: - pager.append(SPAN("...", _style="margin:0 10px;")) + pager.append(SPAN("...")) is_current = self.current_page_number == page_number page_name = ( "grid-pagination-button-current" @@ -1156,12 +1219,12 @@ def _make_table_pager(self): else "grid-pagination-button" ) attrs = self.attributes_plugin.link( - url=URL(self.endpoint, vars=pager_query_parms) + url=URL(self.endpoint, "select", vars=pager_query_parms) ) pager.append( A( page_number, - **self.param.grid_class_style.get(page_name), + _class=self.get_style(page_name), _role="button", **attrs, ) @@ -1170,9 +1233,8 @@ def _make_table_pager(self): return pager def _make_table(self): - - html = DIV(**self.param.grid_class_style.get("grid-wrapper")) - grid_header = DIV(**self.param.grid_class_style.get("grid-header")) + html = DIV(_class=self.get_style("grid-wrapper")) + grid_header = DIV(_class=self.get_style("grid-header")) # build the New button if needed if self.param.create and self.param.create != "": @@ -1187,16 +1249,38 @@ def _make_table(self): self._make_action_button( create_url, self.T(self.param.new_action_button_text), - "fa-plus", + icon=self.icon_style.add_button, icon_size="normal", - override_classes=self.param.grid_class_style.classes.get( - "grid-new-button", "" - ), - override_styles=self.param.grid_class_style.styles.get( - "grid-new-button" - ), + override_classes=self.get_style("grid-new-button"), ) ) + if self.param.header_elements and len(self.param.header_elements) > 0: + for element in self.param.header_elements: + if isinstance(element, str): + html.append(XML(element)) + elif callable(element): + grid_header.append(element()) + else: + override_classes = element.__dict__.get("override_classes", None) + if not override_classes: + override_classes = join_classes( + self.get_style("grid-header-element"), + element.additional_classes, + ) + grid_header.append( + self._make_action_button( + url=element.url, + button_text=self.T(element.text), + icon=element.icon, + icon_size="normal", + additional_classes=element.additional_classes, + override_classes=override_classes, + message=element.message, + name=element.__dict__.get("name"), + ignore_attribute_plugin=element.ignore_attribute_plugin, + **element.__dict__.get("attrs", dict()), + ) + ) # build the search form if provided if self.param.search_form: @@ -1206,7 +1290,7 @@ def _make_table(self): html.append(grid_header) - table = TABLE(**self.param.grid_class_style.get("grid-table")) + table = TABLE(_class=self.get_style("grid-table")) # build the header table.append(self._make_table_header()) @@ -1215,22 +1299,28 @@ def _make_table(self): table.append(self._make_table_body()) # add the table to the html - html.append(DIV(table, **self.param.grid_class_style.get("grid-table-wrapper"))) + html.append(DIV(table, _class=self.get_style("grid-table-wrapper"))) # add the row counter information - footer = DIV(**self.param.grid_class_style.get("grid-footer")) - - row_count = DIV(**self.param.grid_class_style.get("grid-info")) - row_count.append( - str(self.T("Displaying rows %s thru %s of %s")) - % ( - self.page_start + 1 if self.number_of_pages > 1 else 1, - self.page_end - if self.page_end < self.total_number_of_rows - else self.total_number_of_rows, - self.total_number_of_rows, + footer = DIV(_class=self.get_style("grid-footer")) + + row_count = DIV(_class=self.get_style("grid-info")) + ( + row_count.append( + str(self.T("Displaying rows %s thru %s of %s")) + % ( + self.page_start + 1 if self.number_of_pages > 1 else 1, + ( + self.page_end + if self.page_end < self.total_number_of_rows + else self.total_number_of_rows + ), + self.total_number_of_rows, + ) ) - ) if self.number_of_pages > 0 else row_count.append("No rows to display") + if self.number_of_pages > 0 + else row_count.append(self.T("No rows to display")) + ) footer.append(row_count) # build the pager @@ -1238,6 +1328,35 @@ def _make_table(self): footer.append(self._make_table_pager()) html.append(footer) + + if self.param.footer_elements and len(self.param.footer_elements) > 0: + for element in self.param.footer_elements: + if isinstance(element, str): + html.append(XML(element)) + elif callable(element): + html.append(element()) + else: + override_classes = element.__dict__.get("override_classes", None) + if not override_classes: + override_classes = join_classes( + self.get_style("grid-footer-element"), + element.additional_classes, + ) + html.append( + self._make_action_button( + url=element.url, + button_text=self.T(element.text), + icon=element.icon, + icon_size="normal", + additional_classes=element.additional_classes, + override_classes=override_classes, + message=element.message, + name=element.__dict__.get("name"), + ignore_attribute_plugin=element.ignore_attribute_plugin, + **element.__dict__.get("attrs", dict()), + ) + ) + return html def render(self): @@ -1247,9 +1366,16 @@ def render(self): :return: html representation of the table or the py4web Form object """ if self.action == "select": - return XML(self._make_table()) + return self._make_table() elif self.action in ["new", "details", "edit"]: return self.form + raise HTTP(404) + + def xml(self): + return self.render().xml() + + def __str__(self): + return str(self.xml()) def data(self): """ @@ -1319,37 +1445,37 @@ def get_parent(path, parent_field): :return parent_id: the id of the parent record """ parent_id = request.query.get("parent_id") + if parent_id is not None: + return int(parent_id) child_table = parent_field._table fn = parent_field.name - # find the record id of the parent from the child table record + # if not found, search the record id of the parent from the child table record if path: parts = path.split("/") record_id = parts[1] if len(parts) > 1 else None if record_id: - r = child_table(record_id) - if r: - parent_id = r[fn] - - # not passed in, check in the form - if not parent_id: - parent_id = request.forms.get(fn) - - # not found yet, check in the referer - if not parent_id: - referrer = request.query.get("_referrer") - if referrer: - kvp = base64.b16decode(referrer.encode("utf8")).decode("utf8") - if "parent_id" in kvp: - parent_id = kvp.split("parent_id=")[1] - - try: - parent_id = parent_id.split("&")[0] - except: - pass + record = child_table(record_id) + if record: + parent_id = record[fn] + if parent_id is not None: + return int(parent_id) + + # else, check in the form + parent_id = request.forms.get(fn) + if parent_id is not None: + return int(parent_id) + + # else, check in the referer + referrer = request.query.get("_referrer") + if referrer: + kvp = base64.b16decode(referrer.encode("utf8")).decode("utf8") + if "parent_id" in kvp: + parent_id = kvp.split("parent_id=")[1].split("&")[0] + return int(parent_id) - return parent_id + return None class AttributesPlugin: diff --git a/py4web/utils/jsonrpc.py b/py4web/utils/jsonrpc.py new file mode 100644 index 000000000..50834c4ef --- /dev/null +++ b/py4web/utils/jsonrpc.py @@ -0,0 +1,46 @@ +class JsonRpc: + """implements the jsonrpc server 2.0 protocol""" + + def __init__(self): + self.methods = {} + + def __call__(self, data): + """ + this function implements the jsonrpc server protocol, do not edit + client example: + import jsonrpc.proxy + p = jsonrpc.proxy.JSONRPCProxy("http://127.0.0.1:8000", "/examples/rpc") + assert p.add(1,2) == 3 + assert p.add(x=1, y=2) == 3 + """ + if not data or data.get("jsonrpc") != "2.0": + return { + "id": None, + "jsonrpc": "2.0", + "error": {"code": -32600, "message": "Invalid Request"}, + } + rid = data.get("id") + method = data.get("method") + params = data.get("params") + if None in (rid, method) or not isinstance(params, (list, dict)): + return { + "id": None, + "jsonrpc": "2.0", + "error": {"code": -32600, "message": "Invalid Request"}, + } + func = self.methods.get(method) + if not func: + return { + "rid": None, + "jsonrpc": "2.0", + "error": {"code": -32601, "message": "Method not found"}, + } + try: + result = func(*params) if isinstance(params, list) else func(**params) + return {"result": result, "id": rid, "jsonrpc": "2.0"} + except Exception as err: + return { + "rid": None, + "jsonrpc": "2.0", + "error": {"code": -32603, "message": "Internal error", "data": err}, + } diff --git a/py4web/utils/mailer.py b/py4web/utils/mailer.py index 5dba0162e..e53048530 100644 --- a/py4web/utils/mailer.py +++ b/py4web/utils/mailer.py @@ -8,12 +8,12 @@ """ import email.utils -from email import message_from_string -import json import logging import mimetypes import os +import re import smtplib +from email import message_from_string from email.encoders import encode_base64 from pydal._compat import * @@ -189,19 +189,15 @@ def __init__( if filename is None: raise Exception("Missing attachment name") payload = payload.read() - # FIXME PY3 can be used to_native? - filename = filename.encode(encoding) if content_type is None: - content_type = mimetypes.guess_type(filename) + content_type = mimetypes.guess_type(filename)[0] self.my_filename = filename self.my_payload = payload MIMEBase.__init__(self, *content_type.split("/", 1)) self.set_payload(payload) - self["Content-Disposition"] = 'attachment; filename="%s"' % to_native( - filename, encoding - ) + self["Content-Disposition"] = f'attachment; filename="{filename}"' if content_id is not None: - self["Content-Id"] = "<%s>" % to_native(content_id, encoding) + self["Content-Id"] = f"<{content_id}>" Encoders.encode_base64(self) def __init__(self, server=None, sender=None, login=None, tls=True, ssl=False): @@ -214,6 +210,8 @@ def __init__(self, server=None, sender=None, login=None, tls=True, ssl=False): settings.tls = tls settings.timeout = 5 # seconds settings.hostname = None + settings.dkim = None + settings.list_unsubscribe = None settings.ssl = ssl settings.cipher_type = None settings.gpg_home = None @@ -242,6 +240,8 @@ def send( raw=False, headers={}, from_address=None, + dkim=None, + list_unsubscribe=None, cipher_type=None, sign=None, sign_passphrase=None, @@ -505,7 +505,6 @@ def encoded_or_raw(text): # sign # ############################################ if sign: - import string core.check_version(None) pin = payload_in.as_string().replace("\n", "\r\n") @@ -530,7 +529,7 @@ def encoded_or_raw(text): "signed", boundary=None, _subparts=None, - **dict(micalg="pgp-sha1", protocol="application/pgp-signature") + **dict(micalg="pgp-sha1", protocol="application/pgp-signature"), ) # Insert the origin payload payload.attach(payload_in) @@ -574,7 +573,7 @@ def encoded_or_raw(text): "encrypted", boundary=None, _subparts=None, - **dict(protocol="application/pgp-encrypted") + **dict(protocol="application/pgp-encrypted"), ) p = MIMEBase("application", "pgp-encrypted") p.set_payload("Version: 1\r\n") @@ -737,8 +736,17 @@ def encoded_or_raw(text): to.extend(bcc) payload["Subject"] = encoded_or_raw(to_unicode(subject, encoding)) payload["Date"] = email.utils.formatdate() - for k, v in iteritems(headers): + for k, v in headers.items(): payload[k] = encoded_or_raw(to_unicode(v, encoding)) + + list_unsubscribe = list_unsubscribe or self.settings.list_unsubscribe + if list_unsubscribe: + payload["List-Unsubscribe"] = "" % list_unsubscribe + + dkim = dkim or self.settings.dkim + if dkim: + payload["DKIM-Signature"] = dkim_sign(payload, dkim.key, dkim.selector) + result = {} try: if self.settings.server == "logging": @@ -779,7 +787,7 @@ def encoded_or_raw(text): body=to_unicode(text or "", encoding), html=html, attachments=attachments, - **xcc + **xcc, ) elif html and (not raw): result = google_mail.send_mail( @@ -788,7 +796,7 @@ def encoded_or_raw(text): subject=to_unicode(subject, encoding), body=to_unicode(text or "", encoding), html=html, - **xcc + **xcc, ) else: result = google_mail.send_mail( @@ -796,7 +804,7 @@ def encoded_or_raw(text): to=origTo, subject=to_unicode(subject, encoding), body=to_unicode(text or "", encoding), - **xcc + **xcc, ) elif self.settings.server == "aws" and boto3: client = boto3.client("ses") @@ -805,8 +813,9 @@ def encoded_or_raw(text): response = client.send_raw_email( RawMessage=raw, Source=sender, Destinations=to ) + print("Message send:", response) return True - except ClientError as e: + except ClientError: raise RuntimeError() else: smtp_args = self.settings.server.split(":") @@ -825,12 +834,12 @@ def encoded_or_raw(text): # do not want to hide errors raising some exception here try: server.quit() - except: + except Exception: pass # ensure to close any socket with SMTP server try: server.close() - except: + except Exception: pass except Exception as e: self.settings.logger.warning("Mailer.send failure:%s" % e) @@ -839,3 +848,39 @@ def encoded_or_raw(text): self.result = result self.error = None return True + + +def dkim_sign(payload, dkim_key, dkim_selector): + + import dkim + + # sign all existing mail headers except those specified in + # http://dkim.org/specs/rfc4871-dkimbase.html#rfc.section.5.5 + headers = list( + filter( + lambda h: h + not in [ + "Return-Path", + "Received", + "Comments", + "Keywords", + "Resent-Bcc", + "Bcc", + "DKIM-Signature", + ], + payload, + ) + ) + + domain = re.sub(r".*@", "", payload["From"]) + domain = re.sub(r">.*", "", domain) + + sig = dkim.sign( + message=payload.as_bytes(), + selector=dkim_selector.encode(), + domain=domain.encode(), + privkey=dkim_key.encode(), + include_headers=[h.encode() for h in headers], + ) + + return sig[len("DKIM-Signature: ") :].decode() diff --git a/py4web/utils/misc.py b/py4web/utils/misc.py new file mode 100644 index 000000000..c4802a80c --- /dev/null +++ b/py4web/utils/misc.py @@ -0,0 +1,287 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# pylint: disable=invalid-name,redefined-builtin + +""" +| This file is part of the web2py Web Framework +| Copyrighted by Massimo Di Pierro +| License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) + +This file specifically includes utilities for security. +-------------------------------------------------------- +""" + +import base64 +import hashlib +import hmac +import json +import logging +import os +import random +import re +import socket +import struct +import sys +import threading +import time +import uuid +import zlib + +from Crypto.Cipher import AES + +_struct_2_long_long = struct.Struct("=QQ") + +HAVE_COMPARE_DIGEST = False +if hasattr(hmac, "compare_digest"): + HAVE_COMPARE_DIGEST = True + + +def AES_new(key, IV=None): + """Return an AES cipher object and random IV if None specified.""" + if IV is None: + IV = fast_urandom16() + return AES.new(key, AES.MODE_CBC, IV), IV + + +def compare(a, b): + """Compares two strings and not vulnerable to timing attacks""" + if HAVE_COMPARE_DIGEST: + return hmac.compare_digest(a, b) + result = len(a) ^ len(b) + for i in range(len(b)): + result |= ord(a[i % len(a)]) ^ ord(b[i]) + return result == 0 + + +def pad(s, n=32): + """does padding according to PKCS7v1.5 https://www.ietf.org/rfc/rfc2315.txt""" + padlen = n - len(s) % n + return s + bytes(bytearray(padlen * [padlen])) + + +def unpad(s, n=32): + """removed padding""" + padlen = s[-1] + if isinstance(padlen, str): + padlen = ord(padlen) # python2 + if (padlen < 1) | (padlen > n): # avoid short-circuit + # return garbage to minimize side channels + return bytes(bytearray(len(s) * [0])) + return s[:-padlen] + + +def secure_dumps(data, encryption_key, hash_key=None, compression_level=None): + """dumps data, followed by a signature""" + dump = json.dumps(data).encode() + if compression_level: + dump = zlib.compress(dump, compression_level) + if not hash_key: + hash_key = hashlib.sha256(encryption_key).digest() + cipher, IV = AES_new(pad(encryption_key)[:32]) + encrypted_data = base64.urlsafe_b64encode(IV + cipher.encrypt(pad(dump))) + signature = hmac.new(hash_key, encrypted_data, hashlib.sha256).hexdigest() + return f"v1-hmac256:{signature}:{encrypted_data.decode()}" + + +def secure_loads(data, encryption_key, hash_key=None, compression_level=None): + """loads a signed data dump""" + version, signature, encrypted_data = data.split(":", 2) + assert version == "v1-hmac256" + if not hash_key: + hash_key = hashlib.sha256(encryption_key).digest() + encrypted_data = encrypted_data.encode() + actual_signature = hmac.new(hash_key, encrypted_data, hashlib.sha256).hexdigest() + assert compare(signature, actual_signature) + encrypted_data = base64.urlsafe_b64decode(encrypted_data) + IV, encrypted_data = encrypted_data[:16], encrypted_data[16:] + cipher, _ = AES_new(pad(encryption_key)[:32], IV=IV) + data = unpad(cipher.decrypt(encrypted_data)) + if compression_level: + data = zlib.decompress(data) + return json.loads(data.decode()) + + +def initialize_urandom(): + """ + This function and the web2py_uuid follow from the following discussion: + `http://groups.google.com/group/web2py-developers/browse_thread/thread/7fd5789a7da3f09` + + At startup web2py compute a unique ID that identifies the machine by adding + uuid.getnode() + int(time.time() * 1e3) + + This is a 48-bit number. It converts the number into 16 8-bit tokens. + It uses this value to initialize the entropy source ('/dev/urandom') and to seed random. + + If os.random() is not supported, it falls back to using random and issues a warning. + """ + node_id = uuid.getnode() + microseconds = int(time.time() * 1e6) + ctokens = [((node_id + microseconds) >> ((i % 6) * 8)) % 256 for i in range(16)] + random.seed(node_id + microseconds) + try: + os.urandom(1) + have_urandom = True + if sys.platform != "win32": + try: + # try to add process-specific entropy + frandom = open("/dev/urandom", "wb") + try: + frandom.write(bytes([]).join(bytes([t]) for t in ctokens)) + finally: + frandom.close() + except IOError: + # works anyway + pass + except NotImplementedError: + have_urandom = False + logging.warning( + """Cryptographically secure session management is not possible on your system because +your system does not provide a cryptographically secure entropy source. +This is not specific to web2py; consider deploying on a different operating system.""" + ) + packed = bytes([]).join(bytes([x]) for x in ctokens) + unpacked_ctokens = _struct_2_long_long.unpack(packed) + return unpacked_ctokens, have_urandom + + +UNPACKED_CTOKENS, HAVE_URANDOM = initialize_urandom() + + +def fast_urandom16(urandom=[], locker=threading.RLock()): + """ + This is 4x faster than calling os.urandom(16) and prevents + the "too many files open" issue with concurrent access to os.urandom() + """ + try: + return urandom.pop() + except IndexError: + try: + locker.acquire() + ur = os.urandom(16 * 1024) + urandom += [ur[i : i + 16] for i in range(16, 1024 * 16, 16)] + return ur[0:16] + finally: + locker.release() + + +REGEX_IPv4 = re.compile(r"(\d+)\.(\d+)\.(\d+)\.(\d+)") + + +def is_valid_ip_address(address): + """ + Examples: + Better than a thousand words:: + + >>> is_valid_ip_address('127.0') + False + >>> is_valid_ip_address('127.0.0.1') + True + >>> is_valid_ip_address('2001:660::1') + True + """ + # deal with special cases + if address.lower() in ("127.0.0.1", "localhost", "::1", "::ffff:127.0.0.1"): + return True + elif address.lower() in ("unknown", ""): + return False + elif address.count(".") == 3: # assume IPv4 + if address.startswith("::ffff:"): + address = address[7:] + if hasattr(socket, "inet_aton"): # try validate using the OS + try: + socket.inet_aton(address) + return True + except socket.error: # invalid address + return False + else: # try validate using Regex + match = REGEX_IPv4.match(address) + if match and all(0 <= int(match.group(i)) < 256 for i in (1, 2, 3, 4)): + return True + return False + elif hasattr(socket, "inet_pton"): # assume IPv6, try using the OS + try: + socket.inet_pton(socket.AF_INET6, address) + return True + except socket.error: # invalid address + return False + else: # do not know what to do? assume it is a valid address + return True + + +def is_loopback_ip_address(ip=None, addrinfo=None): + """ + Determines whether the address appears to be a loopback address. + This assumes that the IP is valid. + """ + if addrinfo: # see socket.getaddrinfo() for layout of addrinfo tuple + if addrinfo[0] == socket.AF_INET or addrinfo[0] == socket.AF_INET6: + ip = addrinfo[4] + if not isinstance(ip, (str, bytes)): + return False + # IPv4 or IPv6-embedded IPv4 or IPv4-compatible IPv6 + if ip.count(".") == 3: + return ip.lower().startswith( + ("127", "::127", "0:0:0:0:0:0:127", "::ffff:127", "0:0:0:0:0:ffff:127") + ) + return ip == "::1" or ip == "0:0:0:0:0:0:0:1" # IPv6 loopback + + +def getipaddrinfo(host): + """ + Filter out non-IP and bad IP addresses from getaddrinfo + """ + try: + return [ + addrinfo + for addrinfo in socket.getaddrinfo(host, None) + if (addrinfo[0] == socket.AF_INET or addrinfo[0] == socket.AF_INET6) + and isinstance(addrinfo[4][0], (str, bytes)) + ] + except socket.error: + return [] + + +def unlocalised_http_header_date(data): + """ + Converts input datetime to format defined by RFC 7231, section 7.1.1.1 + + Previously, %a and %b formats were used for weekday and month names, but + those are not locale-safe. uWSGI requires latin1-encodable headers and + for example in cs_CS locale, fourth day in week is not encodable in latin1, + as it's "Čt". + + Example output: Sun, 06 Nov 1994 08:49:37 GMT + """ + + short_weekday = { + "0": "Sun", + "1": "Mon", + "2": "Tue", + "3": "Wed", + "4": "Thu", + "5": "Fri", + "6": "Sat", + }.get(time.strftime("%w", data)) + + day_of_month = time.strftime("%d", data) + + short_month = { + "01": "Jan", + "02": "Feb", + "03": "Mar", + "04": "Apr", + "05": "May", + "06": "Jun", + "07": "Jul", + "08": "Aug", + "09": "Sep", + "10": "Oct", + "11": "Nov", + "12": "Dec", + }.get(time.strftime("%m", data)) + + year_and_time = time.strftime("%Y %H:%M:%S GMT", data) + + return "{}, {} {} {}".format( + short_weekday, day_of_month, short_month, year_and_time + ) diff --git a/py4web/utils/populate.py b/py4web/utils/populate.py index 6ebb4a521..ce4c8ca24 100644 --- a/py4web/utils/populate.py +++ b/py4web/utils/populate.py @@ -1,12 +1,14 @@ # from web2py from __future__ import print_function -from pydal._compat import pickle, unicodeT -import uuid -import sys -import re -import random + import datetime +import random +import re +import sys +import uuid + +from pydal._compat import pickle, unicodeT IUP = { "ad": {"minim": 1}, @@ -90,10 +92,10 @@ def __init__(self): def learn(self, text): replacements1 = { - "[^a-zA-Z0-9\.;:\-]": " ", - "\s+": " ", + r"[^a-zA-Z0-9\.;:\-]": " ", + r"\s+": " ", ", ": " , ", - "\. ": " . ", + r"\. ": " . ", ": ": " : ", "; ": " ; ", } @@ -122,7 +124,7 @@ def loadd(self, db): self.db = db def generate(self, length=10000, prefix=False): - replacements2 = {" ,": ",", " \.": ".\n", " :": ":", " ;": ";", "\n\s+": "\n"} + replacements2 = {" ,": ",", " \\.": ".\n", " :": ":", " ;": ";", "\n\\s+": "\n"} keys = list(self.db.keys()) key = keys[random.randint(0, len(keys) - 1)] words = key @@ -130,7 +132,7 @@ def generate(self, length=10000, prefix=False): regex = re.compile("[a-z]+") for i in range(length): okey = key - if not key in self.db: + if key not in self.db: break # should not happen db = self.db[key] s = sum(db.values()) @@ -229,7 +231,7 @@ def populate_generator(table, default=True, compute=False, contents=None, ell=No continue elif field.compute is not None: continue - elif default and not field.default in (None, ""): + elif default and field.default not in (None, ""): record[fieldname] = field.default elif compute and field.compute: continue @@ -269,7 +271,7 @@ def populate_generator(table, default=True, compute=False, contents=None, ell=No record[fieldname] = random.randint( field.requires.minimum, field.requires.maximum - 1 ) - except: + except Exception: if "day" in fieldname: record[fieldname] = random.randint(1, 28) elif "month" in fieldname: @@ -278,7 +280,9 @@ def populate_generator(table, default=True, compute=False, contents=None, ell=No record[fieldname] = random.randint(2000, 2013) else: record[fieldname] = random.randint(0, 1000) - elif field.type == "double" or str(field.type).startswith("decimal"): + elif field.type in ("float", "double") or str(field.type).startswith( + "decimal" + ): if hasattr(field.requires, "minimum"): rand = random.random() if str(field.type).startswith("decimal"): @@ -293,7 +297,7 @@ def populate_generator(table, default=True, compute=False, contents=None, ell=No elif field.type[:10] == "reference ": tablename = field.type[10:] rtable = db[tablename] - if not tablename in ids: + if tablename not in ids: if db._dbname == "gql": ids[tablename] = [x.id for x in db(rtable).select(rtable.id)] else: @@ -306,7 +310,7 @@ def populate_generator(table, default=True, compute=False, contents=None, ell=No elif field.type[:15] == "list:reference ": tablename = field.type[15:] rtable = db[tablename] - if not tablename in ids: + if tablename not in ids: if db._dbname == "gql": ids[tablename] = [x.id for x in db(rtable).select(rtable.id)] else: diff --git a/py4web/utils/publisher.py b/py4web/utils/publisher.py index b37eff549..6d189ee07 100644 --- a/py4web/utils/publisher.py +++ b/py4web/utils/publisher.py @@ -1,14 +1,15 @@ import uuid -from py4web import action, request, response, URL -from pydal.restapi import RestAPI, ALLOW_ALL_POLICY, DENY_ALL_POLICY -from yatl.helpers import DIV, XML, TAG + +from pydal.restapi import ALLOW_ALL_POLICY, DENY_ALL_POLICY, RestAPI +from yatl.helpers import DIV, TAG, XML + +from py4web import URL, action, request, response MTABLE = '' class Publisher: - - """ this is a work in progress - API subject to change """ + """this is a work in progress - API subject to change""" def __init__(self, db, policy=None, auth=None, path="service/{uuid}/"): self.db = db @@ -21,7 +22,6 @@ def __init__(self, db, policy=None, auth=None, path="service/{uuid}/" f = action(self.path + "/", method=["PUT", "DELETE"])(f) def api(self, tablename, id=None): - policy = self.policy data = self.restapi(request.method, tablename, id, request.query, request.json) response.status = data["code"] return data @@ -34,10 +34,9 @@ def grid(self, table): name = "vue%s" % str(uuid.uuid4())[:8] return DIV( self.mtable(table), - TAG.SCRIPT(_src=URL("static/js/axios.min.js")), TAG.SCRIPT(_src=URL("static/js/vue.min.js")), TAG.SCRIPT(_src=URL("static/js/utils.js")), TAG.SCRIPT(_src=URL("static/components/mtable.js")), - TAG.SCRIPT(XML('var app=Q.app("%s"); app.start()' % name)), + TAG.SCRIPT(XML('var app={}; app.vue = new Vue({el:"#%s"});' % name)), _id=name, ) diff --git a/py4web/utils/recaptcha.py b/py4web/utils/recaptcha.py new file mode 100644 index 000000000..90dafb8a3 --- /dev/null +++ b/py4web/utils/recaptcha.py @@ -0,0 +1,71 @@ +import requests +from yatl.helpers import XML + +from py4web.core import Field, Fixture, request + + +class recaptcha_fixture(Fixture): + def __init__(self, api_key): + self.api_key = api_key + Fixture.__init__(self) + + def on_request(self, context): + value = request.POST.get("g-recaptcha-response") + if value: + request.POST["g_recaptcha_response"] = value + del request.POST["g-recaptcha-response"] + + def on_success(self, context): + if context: + script = "".join( + map( + lambda line: line.strip(), + """ + + """.split( + "\n" + ), + ) + ) + if context["output"] is None: + context["output"] = {} + context["output"]["recaptcha"] = XML(script % self.api_key) + + +class ReCaptcha: + def __init__(self, api_key, api_secret): + self.api_key = api_key + self.api_secret = api_secret + + @property + def fixture(self): + return recaptcha_fixture(self.api_key) + + @property + def field(self): + return Field("g_recaptcha_response", "hidden", requires=self.validator) + + def validator(self, value, _): + data = {"secret": self.api_secret, "response": value} + res = requests.post( + "https://www.google.com/recaptcha/api/siteverify", data=data + ) + try: + if res.json()["success"]: + return (True, None) + return (False, "Invalid ReCaptcha response") + except Exception as exc: + return (False, str(exc)) diff --git a/py4web/utils/security.py b/py4web/utils/security.py index 627b77f4a..8025d1f14 100644 --- a/py4web/utils/security.py +++ b/py4web/utils/security.py @@ -1,6 +1,6 @@ -import fnmatch import ipaddress -from py4web.core import Fixture, request, response, HTTP + +from py4web.core import HTTP, Fixture, request, response def listify(item): @@ -18,7 +18,6 @@ def match_ip(ip, networks): class CheckHeaders(Fixture): - """ This fixture can block an action from being excuted if: - it does not match the specificated protocol (http, https) @@ -56,7 +55,7 @@ def split(self, url): checked_parts.append(parts[3]) return checked_parts - def on_request(self): + def on_request(self, context): print(request.environ["REMOTE_ADDR"]) if self.protocol and not request.url.startswith(self.protocol + "://"): raise HTTP(400) @@ -98,7 +97,7 @@ def __init__( self.exposed_headers = ", ".join(exposed_headers) self.request_headers = ", ".join(request_headers) - def on_request(self): + def on_request(self, context): if self.origin: response.headers["Access-Control-Allow-Origin"] = self.origin if self.headers: diff --git a/py4web/utils/tags.py b/py4web/utils/tags.py index e5c2ae2da..df3b8150a 100644 --- a/py4web/utils/tags.py +++ b/py4web/utils/tags.py @@ -1,5 +1,4 @@ import logging -from pydal.tools.tags import Tags logging.warning( "Deprecation notice: replace py4web.utils.tags with pydal.tools.tags in your code." diff --git a/py4web/utils/url_signer.py b/py4web/utils/url_signer.py index 278f5f456..eb345e911 100644 --- a/py4web/utils/url_signer.py +++ b/py4web/utils/url_signer.py @@ -1,9 +1,11 @@ -import json +import base64 import hashlib +import json +import os import time import uuid -import base64 -from py4web import request, abort + +from py4web import HTTP, request from py4web.core import Fixture, Session @@ -20,16 +22,16 @@ def __init__(self, url_signer): self.__prerequisites__ = [url_signer.session] self.url_signer = url_signer - def on_request(self): + def on_request(self, context): """Checks the request's signature""" # extra and remove the signature from the query signature = request.query.get("_signature") if signature is None: - abort(403) + raise HTTP(403) try: h = self.url_signer.algo(self.url_signer.get_key()) signature = request.query["_signature"] - sig_content = base64.b85decode(signature.encode("utf-8")).decode("utf-8") + sig_content = base64.b16decode(signature.encode("utf-8")).decode("utf-8") sig_dict = json.loads(sig_content) ts = sig_dict["ts"] salt = sig_dict["salt"] @@ -39,21 +41,21 @@ def on_request(self): request.fullpath, request.query, ts, salt ) ) - computed_sig = base64.b85encode(h.digest()).decode("utf-8") + computed_sig = base64.b16encode(h.digest()).decode("utf-8") if sig != computed_sig: - abort(403) + raise HTTP(403) # We remove the signature, not to pollute the request. del request.query["_signature"] # Checks the expiration time. if self.url_signer.lifespan is not None: if float(ts) + self.url_signer.lifespan < time.time(): - abort(403) - except: - abort(403) + raise HTTP(403) + except Exception as err: + raise HTTP(403, body=str(err)) def _decode_ts(self, ts_string): """Decodes the timestamp, removing the salt.""" - s = base64.b85encode(ts_string.encode("utf-8")).decode("utf-8") + s = base64.b16encode(ts_string.encode("utf-8")).decode("utf-8") return float(s.split(";")[1]) @@ -114,16 +116,23 @@ def anotherpath(): assert "_signature" not in self.variables_to_sign self.algo = algo or hashlib.sha256 + def on_request(self, context): + """Creates the signing key if necessary.""" + if self.session is not None and self.session.get("_signature_key") is None: + key = str(uuid.uuid1()) + self.session["_signature_key"] = key + # Note that we CANNOT save the key in the URLsigner object, + # because there is only one object -- it's not thread-local in + # the way the session is. So we cannot cache it for the later + # call to get_key. + def get_key(self): - """Gets the signing key, creating it if necessary.""" + """Gets the signing key.""" if self.session is None: key = self.key - assert self.key is not None, "You need to specify a signing key" else: key = self.session.get("_signature_key") - if key is None: - key = str(uuid.uuid1()) - self.session["_signature_key"] = key + assert key is not None, "No signing key" return key.encode("utf8") def get_info_to_sign(self, url, variables, ts, salt): @@ -146,10 +155,13 @@ def sign(self, url, variables): h = self.algo(self.get_key()) ts = "%.3f" % time.time() salt = str(uuid.uuid1()) + url_prefix = os.environ.get("PY4WEB_URL_PREFIX", "") + if url_prefix: + url = url_prefix + url h.update(self.get_info_to_sign(url, variables, ts, salt)) - sig = base64.b85encode(h.digest()).decode("utf-8") + sig = base64.b16encode(h.digest()).decode("utf-8") sig_content = json.dumps(dict(ts=ts, salt=salt, sig=sig)) - signature = base64.b85encode(sig_content.encode("utf-8")).decode("utf-8") + signature = base64.b16encode(sig_content.encode("utf-8")).decode("utf-8") variables["_signature"] = signature def verify(self): diff --git a/py4web/utils/wsservers.py.txt b/py4web/utils/wsservers.py.txt index 86f3a7732..30ee7312e 100644 --- a/py4web/utils/wsservers.py.txt +++ b/py4web/utils/wsservers.py.txt @@ -1,9 +1,12 @@ import logging -from bottle import ServerAdapter +from ombott.server_adapters import ServerAdapter import socketio # pip install python-socketio +import time #, urllib -# This file ( wsservers.py.txt) contains a websocket echo servers + +# tested with py4web version "1.20210905.1" +# This file ( wsservers.py.txt) contains a websocket-socketio echo servers # # To use it cp wsservers.py.txt wsservers.py, and # you need to install and import additional libraries @@ -13,27 +16,23 @@ import socketio # pip install python-socketio # pip install Twisted # pip install aiohttp # pip install aiohttp_wsgi -# pip install gevent==20.9.0 -# pip install greenlet==0.4.17 -# pip install gevent-websocket -# after installing the libraries for the selected server, please, +# after installing the libraries for the selected server # you can run server from wsservers_list with command + # ./py4web.py run -s wsgirefAioSioWsServer apps # ./py4web.py run -s tornadoSioWsServer apps # ./py4web.py run -s wsgirefWsTwistedServer apps -# ./py4web.py run -s geventSioWsServer apps -# ./py4web.py run -s wsgirefSioServer apps -# the echo wsservers can be tested with examples apps/_ws and apps/_socketio +# the echo wsservers can be tested with py4web/apps/examples # -# How I tested the servers from wsservers_list -# 1 downloaded py4web applications from https://github.com/ali96343/facep4w +# How the servers from wsservers_list were tested +# 1 applications were downloaded for testing from https://github.com/ali96343/facep4w # ( it's near 8000 files: html+svg+css+png+jpg, 176 py-files, 7000 js-files ) # 2 run py4web with each server -# 3 tested the applications list with https://github.com/linkchecker/linkchecker +# 3 the time was measured with the script https://github.com/linkchecker/linkchecker # with 10 threads active # 4 access to the apps databases (sqlite) was not tested. # 5 that's all @@ -41,33 +40,123 @@ import socketio # pip install python-socketio # aiohttp - test duration: 1064 seconds # tornado - test duration: 1065 seconds # twisted - test duration: 1085 seconds -# gevent - test duration: 1126 seconds -# treading - test duration: 1135 seconds # -# Today it is possible to use two protocols (socket.io and websockets) to build a chat server. -# -# For the websockets handler native server handlers are used. +# For the websockets native server handlers are used. # For the socketio handlers, we use the nice library by Miguel Grinberg - python-socketio. # -# To test the two installed protocols, please, use two test applications: _socketio and _ws. -# -# The import libraries are done in the app-index.html files. -# -# in _socketio-index.html "" -# in _ws-index.html " ws = new WebSocket('ws://127.0.0.1:8000/'); " +# To test the two installed protocols, please, +# use two test applications: socketio and ws: firefox localhost:8000/examples # # Also at this link https://github.com/ali96343/py4web-chat , # there is a more realistic chat server and the file wsservers.py -# +# also, it is possible copy only one server from this file +# don't forget correct wsservers_list and pip install .... wsservers_list = [ - "wsgirefAioSioWsServer", "tornadoSioWsServer", + "wsgirefAioSioWsServer", "wsgirefWsTwistedServer", - "geventSioWsServer", - "wsgirefSioServer", ] +# --------------------------- Twisted + websocket ----------------------------------------------- + + +# pip install autobahn +# pip install Twisted + + +from autobahn.twisted.websocket import WebSocketServerFactory, WebSocketServerProtocol +from autobahn.twisted.resource import WebSocketResource, WSGIRootResource + +from twisted.web.resource import Resource + + +class Hello(Resource): + isLeaf = True + + def getChild(self, name, request): + if name == "": + return self + return Resource.getChild(self, name, request) + + def render_GET(self, request): + request.setHeader("Content-Type", "text/html; charset=utf-8") + return "its my-favicon-robots".encode("utf-8") + + +ws_debug = False + +class WsEcho(WebSocketServerProtocol): + def onMessage(self, payload, isBinary): + self.sendMessage(payload, isBinary) + + def onClose(self, wasClean, code, reason): + ws_debug and print("WebSocket connection closed: ") + + def onConnect(self, request): + ws_debug and print("Client connecting: {0}".format(request.peer)) + + def onOpen(self): + ws_debug and print("WebSocket connection open.") + + def connectionLost(self, reason): + """ + Client lost connection, either disconnected or some error. + Remove client from list of tracked connections. + """ + pass + + +def wsgirefWsTwistedServer(): + + from twisted.python import log + import sys + + class TwistedServer(ServerAdapter): + """ + tested with py4web apps from https://github.com/ali96343/facep4w + and 10 threads https://github.com/linkchecker/linkchecker + pydal tested with p4wform (scan url, find forms and insert value) + """ + + def run(self, handler): + from twisted.web import server, wsgi + from twisted.python.threadpool import ThreadPool + from twisted.internet import reactor + + # log.startLogging(sys.stdout) + + wsFactory = WebSocketServerFactory(f"ws://{self.host}:{self.port}/") + wsFactory.protocol = WsEcho + wsResource = WebSocketResource(wsFactory) + + myfavi = Hello() + + thread_pool = ThreadPool() + thread_pool.start() + reactor.addSystemEventTrigger("after", "shutdown", thread_pool.stop) + + wsgiResource = wsgi.WSGIResource(reactor, thread_pool, handler) + rootResource = WSGIRootResource( + wsgiResource, + {b"": wsResource, b"favicon.ico": myfavi, b"robots.txt": myfavi}, + ) + + factory = server.Site(rootResource) + + reactor.listenTCP(self.port, factory, interface=self.host) + reactor.run() + + return TwistedServer + +# END Twisted + + +# ---------------------- aiohttp + websocket + socketio ----------------------------------------------------- + +# pip install aiohttp +# pip install aiohttp_wsgi + def wsgirefAioSioWsServer(): import logging.handlers @@ -126,153 +215,17 @@ def wsgirefAioSioWsServer(): return AioSioWsServer -def wsgirefSioServer(): - # https://python-socketio.readthedocs.io/en/latest - - # ws does not work with this wsgirefSioServer - # ./py4web.py run -s wsgirefSioServer apps - - from wsgiref.simple_server import WSGIRequestHandler, WSGIServer - from wsgiref.simple_server import make_server - from socketserver import ThreadingMixIn - import socket - import sys - from concurrent.futures import ThreadPoolExecutor # pip install futures - - sio_debug = False - sio = socketio.Server(async_mode="threading") - - @sio.event - async def connect(sid, environ): - sio_debug and print("connect ", sid) - - @sio.event - async def disconnect(sid): - sio_debug and print("disconnect ", sid) - - @sio.on("to_py4web") - async def echo(sid, data): - sio_debug and print("from client: ", data) - await sio.emit("py4web_echo", data) - - class WSGIRefPySoketIOServer(ServerAdapter): - def run(self, app): - class PoolMixIn(ThreadingMixIn): - def process_request(self, request, client_address): - self.pool.submit( - self.process_request_thread, request, client_address - ) - - class ThreadingWSGIServer(PoolMixIn, WSGIServer): - daemon_threads = True - pool = ThreadPoolExecutor(max_workers=40) - - class Server: - def __init__( - self, server_address=("127.0.0.1", 8000), handler_cls=None - ): - self.sio = sio - self.wsgi_app = None - self.listen, self.port = server_address - self.handler_cls = handler_cls - - def set_app(self, app): - self.wsgi_app = socketio.WSGIApp(self.sio, app) - - def get_app(self): - return self.wsgi_app - - def serve_forever(self): - self.server = make_server( - self.listen, - self.port, - self.wsgi_app, - ThreadingWSGIServer, - self.handler_cls, - ) - self.server.serve_forever() - - class FixedHandler(WSGIRequestHandler): - def address_string(self): # Prevent reverse DNS lookups please. - return self.client_address[0] - - def log_request(*args, **kw): - # self.quiet = True - if not self.quiet: - return WSGIRequestHandler.log_request(*args, **kw) - - handler_cls = self.options.get("handler_class", FixedHandler) - server_cls = Server - - if ":" in self.host: # Fix wsgiref for IPv6 addresses. - if getattr(server_cls, "address_family") == socket.AF_INET: - - class server_cls(server_cls): - address_family = socket.AF_INET6 - - srv = make_server(self.host, self.port, app, server_cls, handler_cls) - srv.serve_forever() - - return WSGIRefPySoketIOServer - - -def geventSioWsServer(): - # _websocket work with this geventSioWsServer - # ./py4web.py --usegevent run -s geventSioWsServer apps - - # tested with - # pip install gevent==20.9.0 - # pip install greenlet==0.4.17 - # pip install gevent-websocket - - from gevent import pywsgi - from geventwebsocket.handler import WebSocketHandler - from geventwebsocket.logging import create_logger - import sys - sio_debug = False - sio = socketio.Server(async_mode="gevent") - - @sio.event - def connect(sid, environ): - sio_debug and print("connect ", sid) - - @sio.event - def disconnect(sid): - sio_debug and print("disconnect ", sid) - - @sio.on("to_py4web") - async def echo(sid, data): - sio_debug and print("from client: ", data) - await sio.emit("py4web_echo", data) - - class GeventPySocketIOServer(ServerAdapter): - def run(self, handler): - - handler = socketio.WSGIApp(sio, handler) - server = pywsgi.WSGIServer( - (self.host, self.port), - handler, - handler_class=WebSocketHandler, - **self.options, - ) - # self.quiet = True - if not self.quiet: - server.logger = create_logger("geventsocketio.logging") - server.logger.setLevel(logging.INFO) - server.logger.addHandler(logging.StreamHandler()) - - server.serve_forever() - - return GeventPySocketIOServer +# END aiohttp +# --------------------------------------- tornado + websocket + socketio-------------------------------- +# pip install tornado def tornadoSioWsServer(): # py4web.py run -s tornadoSioWsServer apps import tornado.websocket - import time, urllib from tornado.httputil import url_concat import tornado.httpclient @@ -280,9 +233,9 @@ def tornadoSioWsServer(): class web_socket_handler(tornado.websocket.WebSocketHandler): # This class handles the websocket channel - @classmethod - def route_urls(cls): - return (r"/", cls, {}) + #@classmethod + #def route_urls(cls): + # return (r"/", cls, {}) def simple_init(self): self.last = time.time() @@ -350,7 +303,7 @@ def tornadoSioWsServer(): def run(self, handler): # pragma: no cover if not self.quiet: log = logging.getLogger("tornadoSioWs") - log.setLevel(logging.INFO) + log.setLevel(logging.DEBUG) log.addHandler(logging.StreamHandler()) import tornado.wsgi, tornado.httpserver, tornado.web, tornado.ioloop @@ -358,7 +311,7 @@ def tornadoSioWsServer(): container = tornado.wsgi.WSGIContainer(handler) app = tornado.web.Application( [ - web_socket_handler.route_urls(), + (r"/", web_socket_handler), (r"/socket.io/", socketio.get_tornado_handler(sio)), (r".*", tornado.web.FallbackHandler, dict(fallback=container)), ] @@ -370,92 +323,6 @@ def tornadoSioWsServer(): return TornadoSioWsServer +# END TORNADO -# ------------------------------------------------------------------------------------------------ -# pip install autobahn -# pip install Twisted - - -from autobahn.twisted.websocket import WebSocketServerFactory, WebSocketServerProtocol -from autobahn.twisted.resource import WebSocketResource, WSGIRootResource - -from twisted.web.resource import Resource - - -class Hello(Resource): - isLeaf = True - - def getChild(self, name, request): - if name == "": - return self - return Resource.getChild(self, name, request) - - def render_GET(self, request): - request.setHeader("Content-Type", "text/html; charset=utf-8") - return "its my-favicon-robots".encode("utf-8") - - -ws_debug = False - -class WsEcho(WebSocketServerProtocol): - def onMessage(self, payload, isBinary): - self.sendMessage(payload, isBinary) - - def onClose(self, wasClean, code, reason): - ws_debug and print("WebSocket connection closed: ") - - def onConnect(self, request): - ws_debug and print("Client connecting: {0}".format(request.peer)) - - def onOpen(self): - ws_debug and print("WebSocket connection open.") - - def connectionLost(self, reason): - """ - Client lost connection, either disconnected or some error. - Remove client from list of tracked connections. - """ - pass - - -def wsgirefWsTwistedServer(): - - from twisted.python import log - import sys - - class TwistedServer(ServerAdapter): - """ - tested with py4web apps from https://github.com/ali96343/facep4w - and 10 threads https://github.com/linkchecker/linkchecker - pydal tested with p4wform (scan url, find forms and insert value) - """ - - def run(self, handler): - from twisted.web import server, wsgi - from twisted.python.threadpool import ThreadPool - from twisted.internet import reactor - - # log.startLogging(sys.stdout) - - wsFactory = WebSocketServerFactory(f"ws://{self.host}:{self.port}/") - wsFactory.protocol = WsEcho - wsResource = WebSocketResource(wsFactory) - - myfavi = Hello() - - thread_pool = ThreadPool() - thread_pool.start() - reactor.addSystemEventTrigger("after", "shutdown", thread_pool.stop) - - wsgiResource = wsgi.WSGIResource(reactor, thread_pool, handler) - rootResource = WSGIRootResource( - wsgiResource, - {b"": wsResource, b"favicon.ico": myfavi, b"robots.txt": myfavi}, - ) - - factory = server.Site(rootResource) - - reactor.listenTCP(self.port, factory, interface=self.host) - reactor.run() - - return TwistedServer +#------------------------------------------------------------------- diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..6282cbcbe --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,46 @@ +[tool.poetry] +name = "your-project-name" +version = "0.1.0" +description = "" +authors = ["Your Name "] +package-mode = false + +[tool.poetry.dependencies] +python = "^3.11" +py4web = "^1.20250125.1" + + +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "py4web" +version = "1.20250215.1" +authors = [{ name="Massimo Di Pierro", email="massimo.dipierro@gmail.com" },] +description = "A fast, stable, comprehensive web framework" +readme = "README.rst" +requires-python = ">=3.7" +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", +] +dynamic = ["dependencies"] + +[tool.setuptools.dynamic] +dependencies = {file = "requirements.txt"} + +[tool.setuptools] +packages = ["py4web", "py4web.server_adapters", "py4web.utils", "py4web.utils.auth_plugins"] + +[tool.setuptools.package-data] +py4web = ["assets/*"] + +[project.scripts] +py4web = "py4web.core:cli" + +[project.urls] +"Homepage" = "https://github.com/web2py/py4web" +"Bug Tracker" = "https://github.com/web2py/py4web/issues" +"Documentation" = "https://py4web.com" diff --git a/requirements.txt b/requirements.txt index 4c1daf76b..c597c57cc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,16 +1,19 @@ wheel -bottle >= 0.12 +ombott>=2.3 click colorama cryptography +portalocker tornado renoir >= 1.4.0 requests -threadsafevariable >= 1.1 +threadsafevariable >= 20230507.1 pyjwt >= 2.0.1 -pluralize >= 0.1.7 -yatl >= 20210326.1 -pydal >= 20210626.3 +pycryptodome +pluralize >= 20240515.1 +rocket3 >= 20241225.1 +yatl >= 20230507.3 +pydal >= 20250215.2 watchgod >= 0.6 # optional modules: diff --git a/setup.py b/setup.py deleted file mode 100644 index 1e4db26b1..000000000 --- a/setup.py +++ /dev/null @@ -1,57 +0,0 @@ -""" -The future of web2py -""" -import subprocess -import re -from setuptools import setup - - -def get_version(): - regex = re.compile("__version__\s*\=\s*['\"](?P.+?)['\"]") - return regex.findall(open("py4web/__init__.py").read())[0] - - -setup( - name="py4web", - version=get_version(), - url="https://github.com/web2py/py4web", - license="BSD", - author="Massimo Di Pierro", - author_email="massimo.dipierro@gmail.com", - maintainer="Massimo Di Pierro", - maintainer_email="massimo.dipierro@gmail.com", - description="Experimental py4web (a better web2py)", - packages=["py4web", "py4web.utils", "py4web.utils.auth_plugins"], - package_data={"py4web": ["assets/*"],}, - install_requires=[ - "wheel", - "bottle >= 0.12", - "click", - "colorama", - "cryptography", - "tornado", - "renoir >= 1.4.0", - "requests", - "threadsafevariable >= 1.1", - "pyjwt >= 2.0.1", - "pluralize >= 0.1.7", - "yatl >= 20210326.1", - "pydal >= 20210626.3", - "watchgod >= 0.6", - ], - entry_points={"console_scripts": ["py4web=py4web.core:cli"],}, - zip_safe=False, - platforms="any", - classifiers=[ - "Development Status :: 1 - Planning", - "Environment :: Web Environment", - "Intended Audience :: Developers", - "License :: OSI Approved :: BSD License", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Programming Language :: Python :: 2", - "Programming Language :: Python :: 3", - "Topic :: Database :: Front-Ends", - "Topic :: Software Development :: Libraries :: Python Modules", - ], -) diff --git a/test-requirements.txt b/test-requirements.txt index ff6c77c91..3669ace2f 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,4 +1,4 @@ pytest pytest-cov -mechanize==0.4.5 +mechanize==0.4.6 python-memcached diff --git a/tests/test_action.py b/tests/test_action.py index c1208ae57..34917fef2 100644 --- a/tests/test_action.py +++ b/tests/test_action.py @@ -1,22 +1,38 @@ +# pylint: disable=assignment-from-none import copy import multiprocessing import os +import sys +import threading import time import unittest import uuid import mechanize +import requests -from py4web import action, DAL, Field, Session, Cache -from py4web.core import bottle, request, error404 +from py4web import DAL, HTTP, Cache, Condition, Field, Session, abort, action +from py4web.core import Fixture, bottle, error404, request os.environ["PY4WEB_APPS_FOLDER"] = os.path.sep.join( os.path.normpath(__file__).split(os.path.sep)[:-2] ) -db = DAL("sqlite://storage_%s" % uuid.uuid4(), folder="/tmp/") +SECRET = str(uuid.uuid4()) +if sys.platform == "win32": + path = "./tmp/" +else: + path = "/tmp/" + +try: + os.mkdir(path) +except Exception: + pass +with open(path + "sql.log", "w"): + pass +db = DAL("sqlite://storage_%s" % uuid.uuid4(), folder=path) db.define_table("thing", Field("name")) -session = Session(secret="my secret") +session = Session(secret=SECRET) cache = Cache() action.app_name = "tests" @@ -25,22 +41,75 @@ @action("index") @cache.memoize(expiration=1) @action.uses(db, session) -@action.requires(lambda: True) +@action.uses(Condition(lambda: True)) def index(): - db.thing.insert(name="test") + new_id = db.thing.insert(name="test") session["number"] = session.get("number", 0) + 1 # test copying Field ThreadSafe attr db.thing.name.default = "test_clone" - field_clone = copy.copy(db.thing.name) - clone_ok = 1 if field_clone.default == db.thing.name.default == "test_clone" else 0 - return "ok %s %s %s" % (session["number"], db(db.thing).count(), clone_ok) + return "ok %s %s %s" % (session["number"], db(db.thing).count(), new_id) + + +def fail(): + raise HTTP(404) + + +@action("conditional") +@action.uses(Condition(lambda: False, on_false=fail)) +def conditional(): + return "OK" + + +@action("raise300") +def raise300(): + raise HTTP(300) + + +@action("bottle_httpresponse") +def bottle_httpresponse(): + return bottle.HTTPResponse(status=200, body="ok") + + +@action("abort") +def abort_response(): + abort(400) + + +class Corrector(Fixture): + def on_error(self, context): + print(context) + context["exception"] = None + context["output"] = "caught" + + +corrector = Corrector() + + +@action("abort_caught") +@action.uses(corrector) +def abort_response_corrected(): + abort(400) def run_server(): bottle.run(host="localhost", port=8001) +class FieldTest(unittest.TestCase): + """Check that we chat we can safely clone Field(s)""" + + def test_fiel_clone(self): + def test(): + db.thing.name.default = "test" + field_clone = copy.copy(db.thing.name) + assert field_clone.default == db.thing.name.default == "test" + + thread = threading.Thread(target=test) + thread.start() + thread.join() + + class CacheAction(unittest.TestCase): def setUp(self): self.server = multiprocessing.Process(target=run_server) @@ -61,11 +130,29 @@ def test_action(self): time.sleep(2) res = self.browser.open("http://127.0.0.1:8001/tests/index") - self.assertEqual(res.read(), b"ok 2 2 1") + self.assertEqual(res.read(), b"ok 2 2 2") + + def test_error(self): + res = requests.get("http://127.0.0.1:8001/tests/conditional", timeout=5) + self.assertEqual(res.status_code, 404) + + res = requests.get("http://127.0.0.1:8001/tests/raise300", timeout=5) + self.assertEqual(res.status_code, 300) + + res = requests.get("http://127.0.0.1:8001/tests/abort", timeout=5) + self.assertEqual(res.status_code, 400) + + res = requests.get("http://127.0.0.1:8001/tests/abort_caught", timeout=5) + self.assertEqual(res.status_code, 200) + self.assertEqual(res.content, b"caught") + + res = requests.get("http://127.0.0.1:8001/tests/bottle_httpresponse", timeout=5) + self.assertEqual(res.status_code, 200) + self.assertEqual(res.content, b"ok") def test_local(self): # for test coverage - Session.__init_request_ctx__() # mimic before_request-hook + request.app_name = "example" index() def test_error_page(self): diff --git a/tests/test_auth.py b/tests/test_auth.py index fb0165f90..8b956f769 100644 --- a/tests/test_auth.py +++ b/tests/test_auth.py @@ -1,63 +1,80 @@ +import io import os import unittest -import bottle -from py4web.core import Session, DAL, request, HTTP, Field, _before_request -from py4web.utils.auth import Auth, AuthAPI, DefaultAuthForms +import uuid + +from py4web.core import (DAL, HTTP, Field, Fixture, Session, bottle, request, + safely) +from py4web.utils.auth import Auth, AuthAPI + +SECRET = str(uuid.uuid4()) class TestAuth(unittest.TestCase): def setUp(self): os.environ["PY4WEB_APPS_FOLDER"] = "apps" - _before_request() # mimic before_request bottle-hook self.db = DAL("sqlite:memory") - self.session = Session(secret="a", expiration=10) - self.session.initialize() - self.auth = Auth(self.session, self.db, define_tables=True, password_complexity=None) + self.session = Session(secret=SECRET, expiration=10) + self.auth = Auth( + self.session, self.db, define_tables=True, password_complexity=None + ) self.auth.enable() self.auth.action = self.action request.app_name = "_scaffold" + def tearDown(self): + # this is normally done by @action + safely(lambda: Fixture.local_delete(self.session)) + bottle.app.router.remove("/*") + def action(self, name, method, query, data): - request.environ['REQUEST_METHOD'] = method - request.environ['bottle.request.query'] = query - request.environ['bottle.request.json'] = data + request.environ["REQUEST_METHOD"] = method + request.environ["ombott.request.query"] = query + request.environ["ombott.request.json"] = data + request.environ["wsgi.input"] = io.BytesIO() # we break a symmetry below. should fix in auth.py - if name.startswith('api/'): + if name.startswith("api/"): return getattr(AuthAPI, name[4:])(self.auth) - else: - return getattr(self.auth.form_source, name)() + return getattr(self.auth.form_source, name)() - def on_request(self, keep_session=False): - storage = self.session._safe_local - - # mimic before_request bottle-hook - _before_request() - - # mimic action.uses() - self.session.initialize() - self.auth.flash.on_request() - self.auth.on_request() - if keep_session: - self.session._safe_local = storage + def on_request(self, context=None, keep_session=False): + # store the current session + context = context or {} + try: + storage = self.session.local.__dict__ + except RuntimeError: + storage = None + # reinitialize everything + safely(lambda: Fixture.local_delete(self.session)) + safely(lambda: Fixture.local_delete(self.auth.flash)) + self.session.on_request(context) + self.auth.flash.on_request(context) + self.auth.on_request(context) + # restore the previous session + if keep_session and storage: + self.session.local.__dict__.update(storage) def test_extra_fields(self): db = DAL("sqlite:memory") - self.auth = Auth(self.session, db, define_tables=True, extra_fields=[Field('favorite_color')]) + self.auth = Auth( + self.session, db, define_tables=True, extra_fields=[Field("favorite_color")] + ) self.on_request() self.assertEqual(type(db.auth_user.favorite_color), Field) def test_register_invalid(self): self.on_request() body = {"email": "pinco.pallino@example.com"} + res = self.auth.action("api/register", "POST", {}, body) self.assertEqual( - self.auth.action("api/register", "POST", {}, body), + res, { "id": None, "errors": { - "username": "Enter a value", - "password": "Too short", - "first_name": "Enter a value", - "last_name": "Enter a value", + "username": "required", + "password": "required", + "first_name": "required", + "last_name": "required", }, "status": "error", "message": "validation errors", @@ -84,6 +101,13 @@ def test_register(self): self.on_request() body = {"email": "pinco.pallino@example.com", "password": "1234567"} + self.assertEqual( + self.auth.action("api/login", "POST", {}, body), + {"status": "error", "message": "Invalid Credentials", "code": 400}, + ) + + self.on_request() + body = {"email": "pinco.pallino@example.com", "password": "123456789"} self.assertEqual( self.auth.action("api/login", "POST", {}, body), {"status": "error", "message": "Registration is pending", "code": 400}, @@ -100,6 +124,7 @@ def test_register(self): self.assertTrue(user.action_token is None) self.on_request() + body = {"email": "pinco.pallino@example.com", "password": "1234567"} self.assertEqual( self.auth.action("api/login", "POST", {}, body), {"status": "error", "message": "Invalid Credentials", "code": 400}, @@ -188,7 +213,7 @@ def test_register(self): self.assertEqual( self.auth.action("api/change_password", "POST", {}, body), { - 'errors': {'old_password': 'invalid current password'}, + "errors": {"old_password": "invalid current password"}, "status": "error", "message": "validation errors", "code": 401, @@ -209,18 +234,6 @@ def test_register(self): {"updated": 1, "status": "success", "code": 200}, ) - self.on_request(keep_session=True) - body = {"first_name": "Max", "last_name": "Powers", "password": "xyz"} - self.assertEqual( - self.auth.action("api/profile", "POST", {}, body), - { - "errors": {"password": "invalid"}, - "status": "error", - "message": "validation errors", - "code": 401, - }, - ) - self.on_request(keep_session=True) body = {"first_name": "Max", "last_name": "Powers"} self.assertEqual( diff --git a/tests/test_cache.py b/tests/test_cache.py index f9fd065a8..e5d910836 100644 --- a/tests/test_cache.py +++ b/tests/test_cache.py @@ -18,7 +18,7 @@ def test_logic(self): def test_different_keys(self): cache = py4web.Cache() results = set() - for k in range(100): + for _ in range(100): results.add(cache.get("a", random.random)) results.add(cache.get("b", random.random)) results.add(cache.get("c", random.random)) @@ -29,7 +29,9 @@ def test_change_detection(self): results = set() for k in range(30): results.add( - cache.get("a", random.random, expiration=0, monitor=lambda: int(k / 10)) + cache.get( + "a", random.random, expiration=0, monitor=lambda k=k: int(k / 10) + ) ) self.assertEqual(len(results), 3) time.sleep(0.02) @@ -42,7 +44,7 @@ def test_timing(self): for k in range(M): cache.get(k, random.random) t0 = time.time() - for k in range(N): + for _ in range(N): cache.get("new", random.random) self.assertTrue((time.time() - t0) / N, 1 - 5) self.assertTrue(cache.free == 0) @@ -55,11 +57,11 @@ def f(x): return x + random.random() results = set() - for k in range(10): + for _ in range(10): results.add(f(1)) results.add(f(2)) time.sleep(0.2) - for k in range(10): + for _ in range(10): results.add(f(1)) results.add(f(2)) self.assertEqual(len(results), 4) diff --git a/tests/test_fixture.py b/tests/test_fixture.py index ccf83380f..3314b1936 100644 --- a/tests/test_fixture.py +++ b/tests/test_fixture.py @@ -1,9 +1,8 @@ -from types import SimpleNamespace -import pytest import threading -from py4web.core import Fixture -result = {'seq': []} +import pytest + +from py4web.core import Fixture def run_thread(func, *a): @@ -12,61 +11,56 @@ def run_thread(func, *a): class Foo(Fixture): - def on_request(self): - self._safe_local = SimpleNamespace() + def on_request(self, context): + Fixture.local_initialize(self) @property def bar(self): - return self._safe_local.a + return self.local.a @bar.setter def bar(self, a): - self._safe_local.a = a + self.local.a = a +results = {} foo = Foo() -def before_request(): - Fixture.__init_request_ctx__() - - @pytest.fixture def init_foo(): def init(key, a, evnt_done=None, evnt_play=None): - result['seq'].append(key) - before_request() - foo.on_request() + Fixture.local_initialize(foo) foo.bar = a evnt_done and evnt_done.set() evnt_play and evnt_play.wait() - result[key] = foo.bar + results[key] = foo.bar + Fixture.local_delete(foo) return foo + return init -def test_fixtute_local_storage(init_foo): - assert init_foo('t1', 'a1') is foo +def test_fixture_local_storage(init_foo): + assert init_foo("t1", "a1") is foo evnt_done = threading.Event() evnt_play = threading.Event() - t2 = run_thread(init_foo, 't2', 'a2', evnt_done, evnt_play) - t3 = run_thread(init_foo, 't3', 'a3', None, None) + t2 = run_thread(init_foo, "t2", "a2", evnt_done, evnt_play) + t3 = run_thread(init_foo, "t3", "a3", None, None) t2.start() evnt_done.wait() t3.start() t3.join() evnt_play.set() t2.join() - assert foo.bar == 'a1' - assert result['t2'] == 'a2' - assert result['t3'] == 'a3' - assert ','.join(result['seq']) == 't1,t2,t3' + assert results["t1"] == "a1" + assert results["t2"] == "a2" + assert results["t3"] == "a3" -def test_fixtute_error(): - before_request() +def test_fixture_error(): # attempt to access _safe_local prop without on_request-call with pytest.raises(RuntimeError) as err: foo.bar - assert 'py4web hint' in err.value.args[0] - assert 'Foo object' in err.value.args[0] + assert "not initialized" in err.value.args[0] + assert "Foo object" in err.value.args[0] diff --git a/tests/test_form.py b/tests/test_form.py index 40e31eaf0..56876c301 100644 --- a/tests/test_form.py +++ b/tests/test_form.py @@ -1,22 +1,26 @@ import io -import os import unittest -from py4web import request, response, Field, Session +import uuid + +from py4web import Field, Session, request, response from py4web.utils.form import Form +SECRET = str(uuid.uuid4()) + class FormTest(unittest.TestCase): def setUp(self): - request.environ['wsgi.input'] = io.BytesIO() + request.environ["wsgi.input"] = io.BytesIO() request.cookies.clear() response._cookies = "" def test_form(self): - session = Session() - session.initialize() + session = Session(secret=SECRET) + session.on_request({}) table = [Field("name")] - form_name = 'testing_form' - f = Form(table,form_name=form_name,csrf_session=session) + form_name = "testing_form" + f = Form(table, form_name=form_name, csrf_session=session) value = f.formkey post_vars = dict(_formname=form_name, _formkey=value) self.assertTrue(f._verify_form(post_vars)) + session.on_success({}) diff --git a/tests/test_get_error_snapshot.py b/tests/test_get_error_snapshot.py index 41a42a2ef..9c6b9afcc 100644 --- a/tests/test_get_error_snapshot.py +++ b/tests/test_get_error_snapshot.py @@ -1,5 +1,5 @@ -import os import unittest + from py4web.core import get_error_snapshot @@ -10,16 +10,16 @@ def test_get_error_snapshot(self): except Exception: snapshot = get_error_snapshot() keys = list(sorted(snapshot.keys())) - self.assertEqual( - keys, - [ - "exception_type", - "exception_value", - "os_environ", - "platform_info", - "python_version", - "stackframes", - "timestamp", - "traceback", - ], - ) + self.assertEqual( + keys, + [ + "exception_type", + "exception_value", + "os_environ", + "platform_info", + "python_version", + "stackframes", + "timestamp", + "traceback", + ], + ) diff --git a/tests/test_json.py b/tests/test_json.py index 10a1a4bcd..ddc5b45bb 100644 --- a/tests/test_json.py +++ b/tests/test_json.py @@ -1,7 +1,7 @@ import datetime +import fractions import json import unittest -import fractions from py4web.core import dumps, objectify @@ -10,7 +10,7 @@ class TestJson(unittest.TestCase): def test_objectify(self): """Check if we can serialize objects, generators, and dates""" - class A(object): + class A: def __init__(self, x): self.x = x diff --git a/tests/test_main.py b/tests/test_main.py index df3d766ee..61a613576 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -1,18 +1,20 @@ import os -import unittest -import tempfile import signal -from py4web.core import cli +import tempfile +import unittest + from click.testing import CliRunner +from py4web.core import cli + def run_cli(): dirpath = tempfile.mkdtemp() dir = os.path.join(dirpath, "apps") runner = CliRunner() - testargs = ['setup', dir] - res = runner.invoke(cli, testargs, input='y') + testargs = ["setup", dir] + res = runner.invoke(cli, testargs, input="y") if res.exception: raise res.exception @@ -24,15 +26,12 @@ def run_cli(): class MainTest(unittest.TestCase): def test_main(self): - class MyException(Exception): - pass - def handler(signum, frame): - raise MyException + raise KeyboardInterrupt signal.signal(signal.SIGALRM, handler) signal.alarm(10) try: run_cli() - except MyException: + except KeyboardInterrupt: pass diff --git a/tests/test_session.py b/tests/test_session.py index caa599967..bd5777537 100644 --- a/tests/test_session.py +++ b/tests/test_session.py @@ -1,111 +1,158 @@ +import contextlib import io -import unittest +import subprocess import time +import unittest +import uuid + import memcache -import subprocess import pytest -from py4web import request, response, Session, DAL -from py4web.core import _before_request +from py4web import DAL, Session, request, response +from py4web.core import Fixture from py4web.utils.dbstore import DBStore -class TestSession(unittest.TestCase): - def setUp(self): +def unquote(text): + print(repr(text)) + if text[:1] + text[-1:] == '""': + text = text[1:-1] + return text + + +secret1 = str(uuid.uuid4()) +secret2 = str(uuid.uuid4()) + + +@contextlib.contextmanager +def request_context(session, context={}): + try: request.environ["wsgi.input"] = io.StringIO() - _before_request() # mimic before_request bottle-hook - request.cookies.clear() response._cookies = "" + yield session.on_request(context) + session.on_success(context) + finally: + session.on_error(context) + Fixture.local_delete(session) + +class TestSession(unittest.TestCase): def test_session(self): request.app_name = "myapp" - session = Session(secret="a", expiration=10) - session.on_request() - session["key"] = "value" - cookie_name = session.local.session_cookie_name - session.on_success(200) + session = Session(secret=secret1, expiration=10) + + with request_context(session): + session["key"] = "value" + assert "key" in session.local.data + a, b = str(response._cookies)[len("Set-Cookie: ") :].split(";")[0].split("=", 1) + b = unquote(b) request.cookies[a] = b - _before_request() - with pytest.raises(RuntimeError) as err: - session.local - self.assertTrue('py4web hint' in str(err.value)) + session = Session(secret=secret2, expiration=10) + request.cookies[a] = b + with request_context(session): + self.assertEqual(session.get("key"), None) - session = Session(secret="b", expiration=10) + session = Session(secret=secret1, expiration=10) request.cookies[a] = b - session.on_request() - self.assertEqual(session.get("key"), None) + with request_context(session): + self.assertEqual(session.get("key"), "value") - session = Session(secret="a", expiration=10) + def test_session_as_attributes(self): + request.app_name = "myapp" + session = Session(secret=secret1, expiration=10) + + with request_context(session): + session.key = "value" + assert "key" in session.local.data + + a, b = str(response._cookies)[len("Set-Cookie: ") :].split(";")[0].split("=", 1) + b = unquote(b) + request.cookies[a] = b + + session = Session(secret=secret2, expiration=10) request.cookies[a] = b - session.on_request() - self.assertEqual(session.get("key"), "value") + with request_context(session): + self.assertEqual(session.key, None) + + session = Session(secret=secret1, expiration=10) + request.cookies[a] = b + with request_context(session): + self.assertEqual(session.key, "value") + + def test_session_not_initialized(self): + request.app_name = "myapp" + session = Session(secret=secret1, expiration=10) + + with pytest.raises(RuntimeError) as err: + session.local + self.assertTrue("not initialized" in str(err.value)) def test_session_in_db(self): request.app_name = "myapp" db = DAL("sqlite:memory") - session = Session(secret="a", expiration=10, storage=DBStore(db)) - request.cookies.clear() - session.on_request() - session["key"] = "value" - cookie_name = session.local.session_cookie_name - session.on_success(200) + session = Session(secret=secret1, expiration=10, storage=DBStore(db)) + with request_context(session): + session["key"] = "value" a, b = str(response._cookies)[len("Set-Cookie: ") :].split(";")[0].split("=", 1) + b = unquote(b) request.cookies[a] = b - _before_request() with pytest.raises(RuntimeError) as err: session.local - self.assertTrue('py4web hint' in str(err.value)) + self.assertTrue("not initialized" in str(err.value)) session = Session(expiration=10, storage=DBStore(db)) request.cookies[a] = b - session.on_request() - self.assertEqual(session.get("key"), "value") + with request_context(session): + self.assertEqual(session.get("key"), "value") session = Session(expiration=10, storage=DBStore(db)) request.cookies[a] = "wrong_cookie" - session.on_request() - self.assertEqual(session.get("key"), None) + with request_context(session): + self.assertEqual(session.get("key"), None) def test_session_in_memcache(self): memcache_process = None try: memcache_process = subprocess.Popen(["memcached", "-p", "11211"]) + except: + print("No memcached") + return + try: time.sleep(1) request.app_name = "myapp" conn = memcache.Client(["127.0.0.1:11211"], debug=0) - session = Session(secret="a", expiration=10, storage=conn) + session = Session(secret=secret1, expiration=10, storage=conn) request.cookies.clear() - session.on_request() - session["key"] = "value" - cookie_name = session.local.session_cookie_name - session.on_success(200) + with request_context(session): + session["key"] = "value" a, b = ( str(response._cookies)[len("Set-Cookie: ") :] .split(";")[0] .split("=", 1) ) + b = unquote(b) request.cookies[a] = b - _before_request() with pytest.raises(RuntimeError) as err: session.local - self.assertTrue('py4web hint' in str(err.value)) + self.assertTrue("not initialized" in str(err.value)) conn = memcache.Client(["127.0.0.1:11211"], debug=0) session = Session(expiration=10, storage=conn) request.cookies[a] = b - session.on_request() - self.assertEqual(session.get("key"), "value") + with request_context(session): + self.assertEqual(session.get("key"), "value") conn = memcache.Client(["127.0.0.1:11211"], debug=0) session = Session(expiration=10, storage=conn) request.cookies[a] = "wrong_cookie" - session.on_request() - self.assertEqual(session.get("key"), None) + + with request_context(session): + self.assertEqual(session.get("key"), None) finally: if memcache_process is None: print("memcached not availabl, test skipped") diff --git a/tests/test_tags.py b/tests/test_tags.py index be685cbb6..9f17d0c81 100644 --- a/tests/test_tags.py +++ b/tests/test_tags.py @@ -1,4 +1,5 @@ import unittest + from pydal import DAL, Field from pydal.tools.tags import Tags diff --git a/tests/test_template.py b/tests/test_template.py index e788689a3..025608ed7 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -1,6 +1,7 @@ import os import unittest -from py4web.core import Template, request + +from py4web.core import Template PATH = os.path.join(os.path.dirname(__file__), "templates") @@ -8,5 +9,7 @@ class TemplateTest(unittest.TestCase): def test_template(self): t = Template("index.html", path=PATH) - output = t.transform(dict(n=3), {}) + context = dict(output=dict(n=3), template_inject={}) + t.on_success(context) + output = context["output"] self.assertEqual(output, "0,1,2.\n") diff --git a/tests/test_url.py b/tests/test_url.py index 68d40a2cf..993bf848c 100644 --- a/tests/test_url.py +++ b/tests/test_url.py @@ -1,8 +1,6 @@ -import random -import time import unittest -from py4web import request, URL +from py4web import URL, request class TestURL(unittest.TestCase): @@ -12,3 +10,7 @@ def test_url(self): request.app_name = "app" self.assertEqual(URL("index"), "/app/index") self.assertEqual(URL("a", "b", vars=dict(x=1), hash="y"), "/app/a/b?x=1#y") + + +if __name__ == "__main__": + unittest.main()